PageSourceSearch

https://public.tockify.com//app/admin.bdfb8d23a9637d36d1c8.js

js tockify.com collected 2026-10-01 08:41:26 UTC 1,273,053 bytes, 2 lines download raw bytes

1/*! For license information please see admin.bdfb8d23a9637d36d1c8.js.LICENSE.txt */
2(()=>{var e={4487(e,n,t){"use strict";var a=()=>t(7991),i=()=>t(4309),o=()=>t(5015),r=()=>t(3045),s=t.cw(function(e,n){o(),Nt(),Ct(),It(),Et(),Dt(),dn(),To(),zt(),window.UPLOADCARE_PUBLIC_KEY="e14168cd40d42bd3b36c",window.UPLOADCARE_MANUAL_START=!0,window.UPLOADCARE_DO_NOT_STORE=!0,window.UPLOADCARE_LIVE=!1,window.UPLOADCARE_LOCALE="en",window.UPLOADCARE_CDN_BASE="https://up.tockify.com";var t=i(),a=window!==window.top;Eo()().module("tkfngViewer",["mgcrea.ngStrap","ngResource","ngSanitize","ui.router","ngAnimate","tmh.dynamicLocale","pascalprecht.translate"]),Eo()().module("tkfngApp",["tkfngViewer",t(Eo()()),"ngResource","ngSanitize","ui.router","mgcrea.ngStrap","ui.select","tmh.dynamicLocale","pascalprecht.translate","angularSpectrumColorpicker","ngTagsInput","checklist-model","tkfngViewer"]).config(["$locationProvider",function(e){return e.html5Mode(!0)}]).config(["$compileProvider",function(e){return e.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel|webcal):/)}]).config(["tmhDynamicLocaleProvider","$translateProvider","LocaleUtilsProvider","EventFormatterProvider",function(e,n,t,a){var i=Ct().T.get("cdnroot","/");e.localeLocationPattern(i+"assets/angular183-i18n/angular-locale_{{locale}}.js"),n.useLoader("Translation",{prefix:i+"assets/languages/",suffix:".json"});var o=Ct().T.get("transMap"),r=Ct().T.get("transLocale");r=t.toCanonicalLocale(r),n.useSanitizeValueStrategy(null),n.translations(r,o),n.preferredLanguage(r),a.setDefaultLocaleInfo(o.localeInfo)}
2]).config(["$httpProvider","$urlServiceProvider",function(e,n){n.deferIntercept();var t=n.rules;n.config.strictMode(!1),t.when(new RegExp("^/(.*)/$"),"/$1"),t.otherwise(function(e,n,t){var i=window.location.href,o=a?"siteform.embedded404":"siteform.standalone404";return t.stateService.target(o,{url:i},{location:!1})}),e.interceptors.push("authInterceptor")}]).factory("authInterceptor",["$rootScope","$q",function(e,n){return{request:function(e){return e.headers=e.headers||{},To().A.get("token")&&(e.headers.Authorization="Bearer "+To().A.get("token")),e},responseError:function(e){return 401===e.status?(window.location.assign("/i/site/login"),To().A.remove("token"),n.reject(e)):n.reject(e)}}}]).filter("encodeURIComponent",function(){return window.encodeURIComponent}).filter("formatBytes",function(){return function(e,n,t,a,i){return(n=Math,t=n.log,i=t(e)/t(1e3)|0,e/n.pow(1e3,i)).toFixed(0)+" "+(i?"kMGTPEZY"[--i]+"B":"Bytes")}}).filter("decodeURIComponent",function(){return window.decodeURIComponent}).run(["$rootScope","$location","Auth","StatusCodeHandler","CrossDomainWrapper","$urlService","NavHistory","LocaleCentral","tkfNotify","$templateCache","$q","$transitions",function(e,n,t,a,i,o,r,s,l,c,d,u){(0,Dt().r7)(d),c.put("app/common/tkfDatePicker.html",Rt()),c.put("app/directives/addressPicker/typeahead-template.html",Jt()),c.put("app/viewers/base/listStatus.html",Ji()),c.put("app/viewers/base/emptyEditor.html",Ki()),c.put("app/viewers/directives/eventDetail/bs-detail-navbar.html",Zi()),c.put("app/viewers/directives/eventDetail/saveShareBar.html",Qi()),s.updateLocale(Et().hV.locale),It().v.startAnalytics("admin"),r.setInitialState(),u.onBefore({},function(e){var n=e.to(),i=e.params(),o=e.router.stateService;function r(){var e=i.calname;if("edit.inter.redirect"===n.name)return o.target("edit.inter",{calname:e});if(0===n.name.indexOf("edit")){var t=dn().B.calnames;if(!(-1!==t.indexOf(e)||-1!==t.indexOf("robert")))return o.target("viewers.inter",{calname:e})}return 404===(0,Nt().vd)(window,"tkf.status")&&-1===n.name.indexOf("404")?(window.tkf.status=200,a.pageNotFound()):"viewers.inter"!==n.name||i.calname?void 0:o.target("site")}return n.authenticate?d(function(e){t.isLoggedInAsync(function(t){if(t)e(r());else{var a=o.href(n.name,i);e(o.target("siteform.login",{next:a}))}})}):r()}),u.onSuccess({},function(e){var n=e.to(),t=e.params(),a=e.from(),o=e.params("from");if(!e.router.stateService.is(a,o)){r.previousState(a,o),r.updatePath();var s={name:a.name,url:a.url},c={name:n.name,url:n.url};if(l.popup.close(),l.status.onNavigate(),"viewers.inter"!==n.name&&i.stateChange({toState:c,toParams:t,fromState:s,fromParams:o}),n.data&&n.data.recorder||It().v.trackPage(),"edit.inter.groupeditor"===n.name&&t&&"new"===t.uid&&It().v.reportCreateEventOpened(),n.data&&n.data.scrollToTop){window.scrollTo(0,0);var d=document.querySelector(".js-scrolltotop");d&&(d.scrollTop=0)}}}),o.listen(),o.sync(),zt().W.init()}])}),l=t.cw(function(e,n){o(),r(),yt();var t=window===window.top,a=0===window.name.indexOf("tkf-"),i=!1;window._tkfg.bootTockify=function(){if(!i){i=!0,window._tkfg.version=yt().A,yt().A;var e=window.location,n=e.protocol,o=e.hostname,s=e.port;window._tkf=window._tkf||{},window._tkf.rootPath=window.location.origin||n+"//"+o+(s?":"+s:"");var l=document.querySelector("html");-1===window.name.indexOf("embed")&&(l.style["overflow-y"]="auto");var c=function(){return Eo()().bootstrap(document.body,["tkfngApp"])};t||!a?c():(r().A.addHandler("host-info",function(e){var n=!!_tkfg.hostInfo;_tkfg.hostInfo=e,n||c()}),r().A.postMessage({type:"client-listening"}))}}}),c=t.cw(function(e,n){function a(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var a,i,o,r,s=[],l=!0,c=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=o.call(t)).done)&&(s.push(a.value),s.length!==n);l=!0);}catch(e){c=!0,i=e}finally{try{if(!l&&null!=t.return&&(r=t.return(),Object(r)!==r))return}finally{if(c)throw i}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return i(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?i(e,n):void 0}}
2(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}t.d(n,{A8:()=>d,DN:()=>r,PQ:()=>p,US:()=>s,_T:()=>c,vZ:()=>l,wp:()=>u});var o={youtube:{long:/(?:https?:)?(?:\/\/)?www\.youtube\.com\/watch\?v=([^&]*).*/,short:/(?:https?:)?(?:\/\/)?youtu\.be\/([^&?]*).*/,embed:/(?:https?:)?(?:\/\/)?www\.youtube\.com\/embed\/([^&?]*).*/},vimeo:{embed:/(?:https?:)?(?:\/\/)?player\.vimeo\.com\/video\/([^&?]*).*/,standard:/^(?:https?:)?(?:\/\/)?vimeo\.com\/([^&?]*).*/},facebook:{long:/^(?:https?:)?(?:\/\/)?(?:www\.)?facebook\.com\/[^\/]+\/videos\/([^\/]*).*/,embed:/^(?:https?:)?(?:\/\/)?(?:www\.)?facebook\.com\/video\/embed\?video_id=([^&]*).*/},general:{dns:/(https?:)?(\/\/)?([\w\d][\w\d.-]*\.\w[\w\d-]+(?:[\/?].*|$))/,ip:/(https?:)?(\/\/)?(\d+\.\d+\.\d+\.\d+.*)/,localhost:/(https?:)?(\/\/)?(localhost.*)/}},r=["image","youtube","facebook","vimeo","html"];function s(e){if(!e)return null;var n=e.trim(),t=o.youtube.long.exec(n)||o.youtube.short.exec(n)||o.youtube.embed.exec(n);if(t)return{id:t[1],type:"youtube"};var a=o.facebook.long.exec(n)||o.facebook.embed.exec(n);if(a)return{id:a[1],type:"facebook"};var i=o.vimeo.embed.exec(n);if(i)return{id:i[1],type:"vimeo"};var r=o.vimeo.standard.exec(n);return r?{id:r[1],type:"vimeo_resolvable",originalUrl:n}:null}function l(e){if(!e)return null;var n=e.trim(),t=o.general.dns.exec(n)||o.general.ip.exec(n)||o.general.localhost.exec(n);return t?{id:(t[1]||"http:")+"//"+t[3],type:"embed"}:null}function c(e){if(!e||"string"!=typeof e)return{};var n={};return e.split(";").forEach(function(e){if(e.trim()){var t=a(e.split(":"),2),i=t[0],o=t[1];i&&o&&(n[i.trim()]=o.trim())}}),n}function d(e){var n=[];return e.width&&n.push("width:".concat(e.width)),e.height&&n.push("height:".concat(e.height)),n.join(";")}function u(e,n){var t=n?"&#13;":"\n";return(""+e).replace(/&/g,"&amp;").replace(/'/g,"&apos;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r\n/g,t).replace(/[\r\n]/g,t)}function p(e){return e.type&&r.includes(e.type)&&e.id&&e.id.trim().length>0}}),d=t.cw(function(e,n){o(),Dt(),_t();var t=ao();Eo()().module("tkfngApp").service("ThemeEditor",function(){var e=this,n="/api/ngthemes",a="/api/ngthemesummaries";this.setDefault=function(e){return(0,Dt().mI)("".concat(a,"/").concat(e))},this.fetchSummaries=function(e){return(0,Dt().hm)(a,e)},this.delete=function(e){return(0,Dt().Un)("".concat(n,"/").concat(e.id),e)},this.get=function(e){return(0,Dt().hm)("".concat(n,"/").concat(e.id),e)},this.save=function(e,t){var a=e&&e.settings&&e.settings.views&&e.settings.views.agenda;return a&&(a.imageShape=(0,_t().XA)(a)),(0,Dt().TB)("".concat(n),e,{use:t})},this.reset=function(){e.currentTheme=void 0,e.themeSummaries=[],e.builtInThemes=[],e.customThemes=[],e.customThemeMenu=[],e.themeVersions={},e.currentSummary=void 0,e.activeSummary=void 0,e.selected={},e.unmodifiedSettings=void 0,e.hasChanges=!1,e.showUseTheme=!1,e.currentIsActiveTheme=void 0},this.reset();this.describeTheme=function(e){if(!e)return"";var n=e.name;return i(e)?n+=" [built-in]":n+=" [custom]",n};var i=function(e){return"built-in"===e.category};this.isBuiltIn=i,this.fetchThemeSummaries=function(n,a){var s=e.currentTheme.id;return e.fetchSummaries({uid:n,active:s,shared:a}).then(function(n){e.themeSummaries=n.map(function(e){var n;return e.vtime=function(e){return e?t.unix(e.created).fromNow():"unknown time"}(e),e.vstr="version: "+e.version,n=i(e)?"built-in":"shared"===e.category?"shared custom":"custom",e.cstr="("+n+")",e}),o(),r()})};var o=function(){e.builtInThemes=e.themeSummaries.filter(function(e){return i(e)&&-1===e.name.indexOf("transparent")})};this.hasCustomThemes=function(){return e.customThemes&&e.customThemes.length>0},this.hasCustomTheme=function(n){return!!(e.customThemes||[]).find(function(e){return e.name===n})};var r=function(){var n=e.themeSummaries.filter(function(e){return!i(e)}),t=n.filter(function(e){return e.isDefault}),a={};t.forEach(function(e){var t=n.filter(function(n){return n.themeId===e.themeId});a[e.themeId]=t}),e.customThemes=n,t.length,e.customThemeMenu=t,e.themeVersions=a};this.findThemeSummaryForThemeId=function(n){var t=n.themeId,a=n.version,i=void 0!==a,o=e.themeSummaries.filter(function(e){return e.themeId===t}),r=i?o.find(function(e){return e.version===a}):o.find(function(e){return!!e.isDefault});return r||(r=o.find(function(e){return!!e.isDefault})),r};var s=function(n){return e.themeSummaries.find(function(e){return e.id===n||e.themeId===n})},l=function(){e.showUseTheme=!1===e.currentIsActive&&!e.hasChanges};this.showVersions=function(){return e.showVersionPicker=!0},this.hideVersions=function(){return e.showVersionPicker=!1},this.setSummaries=function(n){var t=n.activeId,a=n.currentId;t&&(e.activeSummary=s(t)),a&&(e.currentSummary=s(a),i(e.currentSummary)?(delete e.selected.themeId,delete e.selected.version,e.hideVersions()):(e.selected.themeId=e.currentSummary.themeId,e.selected.version=e.currentSummary.version)),e.currentIsActiveTheme=e.currentSummary&&e.activeSummary&&e.currentSummary.themeId===e.activeSummary.themeId,e.currentIsActive=e.currentSummary&&e.activeSummary&&e.currentSummary.id===e.activeSummary.id,l(),e.currentIsActive,e.currentIsActiveTheme},this.setCurrentSummary=function(n){return e.setSummaries({currentId:n})},this.setActiveSummary=function(n){return e.setSummaries({activeId:n}
2)},this.updateUnmodified=function(){e.unmodifiedSettings=Eo()().copy(e.currentTheme.settings),e.hasChanges=!1,l()},this.checkForChanges=function(n){e.hasChanges=!Eo()().equals(n,e.unmodifiedSettings),l()};var c=t().month(8).date(1),d=[{key:"dayOfWeek",value:"dd",text:"Tu"},{key:"dayOfWeek",value:"ddd",text:"Tue"},{key:"dayOfWeek",value:"dddd",text:"Tuesday"},{key:"dayOfMonth",value:"Do",text:"1st"},{key:"dayOfMonth",value:"D",text:"1"},{key:"dayOfMonth",value:"DD",text:"01"},{key:"month",value:"MMM",text:"Sep"},{key:"month",value:"MMMM",text:"September"},{key:"month",value:"M",text:"9"},{key:"month",value:"MM",text:"09"}].map(function(e){return e.text=c.format(e.value),e});this.validDateTags=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return d.filter(function(n){return-1===e.findIndex(function(e){return e.key===n.key})})};var u=["longDateFormat","eventsFromDateFormat"];this.saveCustomDateFormat=function(e){e&&u.forEach(function(n){var t=e[n];if(t&&(3===t.length||2===t.length&&-1===t.findIndex(function(e){return"dayOfWeek"===e.key}))){var a=Eo()().copy(e[n]);a.forEach(function(e){return delete e.text}),e[n]=a}else delete e[n]})},this.unsaveCustomDateFormat=function(e){e&&u.forEach(function(n){var t=e[n];t&&(e[n]=t.map(function(e){return d.find(function(n){return n.value===e.value})}))})}})}),u=t.cw(function(e,n){o(),Lt(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){var n=navigator.platform.indexOf("Win")>-1,t="WebkitAppearance"in document.documentElement.style,a=n&&t;e.state("customizer",{abstract:!0,views:{"main@":{template:"<div ui-view></div>"}},onEnter:function(){return a&&Lt().s.hideScrollBars(),!0},onExit:function(){return a&&Lt().s.showScrollBars(),!0}})}])}),p=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function a(e,n,a){return(n=function(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,n||"default");if("object"!=t(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}(n))in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function i(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return r(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?r(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),Bt(),Nt(),Ct(),dn(),Mt(),Ft(),jn(),_t(),wt();var s=ao(),l=Xi(),c=window.self!==window.top;Eo()().module("tkfngApp").controller("MainCustomizerCtrl",["$scope","$state","$document","tkfNotify","$timeout","$q","TagOptions","TKFCollections","LocaleCentral","CustomFont","MonthViewStyler","EmbedCode","Dialog","ThemeEditor","Auth","Calendar","Styler","$transitions",function(e,n,t,o,r,d,u,p,m,f,g,v,h,b,y,w,_,k){var S,x,C,T,A=n.params.tab?1:0,E=!1,P="YYYYMMDD",z=b;e.ted=z,z.reset(),e.todayMidnightUTC=function(){var e=s(),n=e.valueOf()+60*e.utcOffset()*1e3;return s.utc(n).startOf("day").valueOf()},e.separatorWidthOptions=p.labelledRange(0,10),e.separatorWidthOptions[0].label="None",e.maxEventsOptions=p.labelledRange(1,20),e.agendaImageSizes=[{label:_t().rl,value:_t().I7}].concat(_t().yH.map(function(e){var n=e.label,t=e.key;return{label:n,value:t,breakBefore:"xlarge"===t}})),e.agendaImageAspectRatios=(S=[{label:"Original",value:_t().VL},{label:_t().ry,value:_t().ry}]).concat.apply(S,i([_t().Mb,_t().IR].map(function(e){return e.map(function(e,n){return{label:e,value:e,breakBefore:0===n}})}))),e.agendaImageSize=function(n){var t=e.settings.views.agenda;return arguments.length&&(t.imageSize=n),t.imageSize||_t().I7}
2,e.isDetailsButtonAvailable=wt().u,e.detailsButtonColors={},["color","background","border"].forEach(function(n){Object.defineProperty(e.detailsButtonColors,n,{enumerable:!0,get:function(){return(0,wt().Rh)(e.settings)[n]},set:function(t){var i=e.settings.views.agenda;i.detailsButton=Object.assign({},i.detailsButton,a({},n,t))}})}),e.useCtaColorsForDetailsButton=function(){delete e.settings.views.agenda.detailsButton},e.agendaImageShape=function(n){var t=e.settings.views.agenda;return arguments.length&&(t.imageFrame=n),(0,_t().zd)(t)},e.agendaImageAspectRatio=function(n){var t=e.settings.views.agenda;return arguments.length&&(t.imageAspectRatio=n),(0,_t().dd)(t)},e.calnames=dn().B.onlineCalnames,e.alerts=dn().B.alerts;var D=n.params.calname;D||(D=e.calnames&&e.calnames.length>0?e.calnames[0]:"spirited"),e.calname=D;var I=(0,Nt().sg)(function(e,n,t){return window._tkf.updateSettings(e,n,t)},75),L=function(){var n;u.get({id:e.calendar.name}).$promise.then(function(e){(n=e).tags.sort(function(e,n){return e.text>n.text?1:e.text<n.text?-1:0})}).catch(function(){return n=new u({tags:[]})}).finally(function(){e.tagOptions?e.setTheme(e.calendar.ngthemeid).then(function(){e.tagOptions=n,M()}):(e.tagOptions=n,M())})},$=_.tagToKey,F=function(e){return 0===e.indexOf("__$")?e.substring(2):e};e.tagToKey=$;var M=function(){e.settings;var n=e.tagOptions.tags.map(function(e){return e.text}),t=e.settings.tagcolors||{},a=e.settings.views.monthly.tagcolors||{},i=Bt().Ay.map(t,function(e,n){return F(n)}),o=Bt().Ay.map(a,function(e,n){return F(n)}),r=e.calendar.submittedEventsTag?[e.calendar.submittedEventsTag]:[],s=Bt().Ay.uniq(i.concat(o).concat(n).concat(r));e.tagKeys=s.sort()},O=w.getPromise(e.calname).then(function(n){e.calendar=n,e.passcode=n.viewPasscode;var t=n.expFeatures||[];return e.hasHideDateFeature=-1!==t.indexOf("hide-date"),b.get({id:n.ngthemeid,calendarname:n.name})});O.then(function(n){e.calendar.ngthemeid!==n.id&&(e.calendar.ngthemeid=n.id)}),e.$watch("calname",function(e,t){e&&e!==t&&n.go("customizer.main",{calname:e})}),e.canChooseDemoEvents=dn().B.isDefined&&"spirited"!==D,e.viewState={useDemoCalendar:!e.canChooseDemoEvents||"false"!==n.params.demo,fourDigitYearChanged:!1},e.onTagOptionsPicked=function(n){return e.calendar.$save().then(function(){e.tagOptions=n,M()})};var N=null;e.openTagManager=function(){N||(N=h.open(e,{template:'<div tag-manager\n                   cal-name="calendar.name"\n                   on-tag-options-picked="onTagOptionsPicked(tagOptions)"\n                  do-close="closePopup()" ></div>',animation:"rotateIn",externalCloser:!1,includeInHistory:!0,"z-index":10,onClose:function(){L(),N=null}}))},e.embedCalName=e.viewState.useDemoCalendar?"spirited":D,e.resetDirectionsButton=function(){var n=e.settings;n.directionsButton.border="#ccc",n.directionsButton.background="#fff",n.directionsButton.color="333"},e.resetMapButton=function(){var n=e.settings;n.mapButton.border="#ccc",n.mapButton.background="#fff",n.mapButton.color="333"},e.syncWithMapButton=function(){var n=e.settings;n.directionsButton.border=n.mapButton.border,n.directionsButton.background=n.mapButton.background,n.directionsButton.color=n.mapButton.color};var U=Ct().T.get("embedScript");(0,Nt().kG)(U).then(function(){return O.then(function(t){return function(t){window._tkf.loadDeclaredCalendars(),r(function(){return function(t){var a=l(".customizer__calendar iframe")[0].name;0===e.calendar.effectiveFeatureLevel&&o.popup.open({view:jt(),tparams:{isDudaUser:e.isDudaUser,dudaUpgrade:jn().Nd}});function i(t){function a(n,t){t=t||n,Q(),X();var a={pinboard:{name:"pinboard",show:n.views.pinboard.show},agenda:{name:"agenda",show:n.views.agenda.show},monthly:{name:"monthly",show:n.views.monthly.show},detail:{name:"detail",show:!0}};t.views;var i=Object.keys(t.views).map(function(e){return t.views[e]}).filter(function(e){return e.show}).length;if(e.viewCount=Object.keys(a).map(function(e){return a[e]}).filter(function(e){return e.show}).length,1===e.viewCount)return n.views.pinboard.show=!(i>1)||t.views.pinboard.show,n.views.agenda.show=t.views.agenda.show,void(n.views.monthly.show=t.views.monthly.show);var o=n.defaultView;if(!a[o].show){var r=Object.keys(a).find(function(e){return a[e].show});n.defaultView=r}T||(T=n.defaultView),j(n,t);var s=T&&a[T].show;I(l(".customizer__calendar iframe")[0],n,{exclude:"views.upcoming"}),s||ee(n.defaultView)}z.currentTheme=t,z.fetchThemeSummaries(x,C).then(function(){z.setCurrentSummary(z.currentTheme.id),z.setActiveSummary(z.currentTheme.id)}),z.currentTheme;var i=function(){e.$watch("ted.selected",function(n,t){if(n&&!Eo()().equals(n,t)&&n.themeId&&(n.themeId!==t.themeId||!n.version||void 0!==t.version)){var a=z.findThemeSummaryForThemeId(n);e.setTheme(a.id)}},!0)};e.$watch("settings",function(e,n){e&&!Eo()().equals(e,n)&&(z.checkForChanges(e),a(e,n))},!0),e.$watch("viewState.pageFooter",function(e,n){e&&n&&e!==n&&(z.hasChanges=!0)}),e.$watch("viewState.usePageFooter",function(e,n){void 0!==n&&e!==n&&(z.hasChanges=!0)}),e.$watch("viewState.useDemoCalendar",function(t,a){if(void 0!==t&&(t!==a||!1!==a)&&(t!==a&&ee(),t!==a||e.canChooseDemoEvents)){var i={demo:""+t};n.go(".",i,t===a?G:void 0)}}),i(),z.currentTheme.settings=_.applyDefaults(z.currentTheme.settings),z.currentTheme.settings.defaultStartDate||(z.currentTheme.settings.defaultStartDate=!1),z.updateUnmodified(),e.settings=z.currentTheme.settings,e.ms=e.settings.views.monthly,e.settings,L(),z.unsaveCustomDateFormat(e.settings.customDateFormat),m.updateLocale(e.calendar.locale,e.settings.useClientDateFormat);var o=m.getDateTimeFormats({picker:!0}).dateFormat;e.dateFormat=o,e.wkstart=s().weekday(0).day(),X(),V("headerFont"),V("textFont"),V("dateFont"),J("navbarFont","navbar.font",e.settings.navbar.font),J("monthlyGridFont","views.monthly.gridFont",e.settings.views.monthly.gridFont),J("monthlyEventFont","views.monthly.eventFont",e.settings.views.monthly.eventFont),r(function(){zo.K.loadBuiltIn()},3e3),a(e.settings)}e.$on("$destroy",function(){window._tkf.onCalendarStateChange(a,function(){})}),window._tkf.onCalendarStateChange(a,function(n){E&&(E=!1,I(l(".customizer__calendar iframe")[0],e.settings)),A>0?A--:r(function(){e.switchTab(n.toState.name,void 0,!0)},0)}),i(t)}(t)},80)}(t)})}).catch(function(){return console.warn("customizer: embed script did not load, preview will be absent")});var B={row1:["basics","style","navbar","themes"],row2:["viewers.inter.agenda","viewers.inter.pinboard","viewers.inter.monthly","viewers.inter.detail"],row2ShortNames:["agenda","pinboard","monthly","detail"]},R={style:["common","tag"],agenda:["styles","layout"],pinboard:["styles","layout"],monthly:["grid","events","tags"]},G={location:"replace"};
2e.switchTab=function(t,a,i){t||(A=1),t=t||"basics";var o={controlPane:"basics",activeRow:1},r=B.row1.find(function(e){return t===e});r?(o.controlPane=r,o.activeRow=1):((r=B.row2.find(function(e){return t===e}))||(r=B.row2ShortNames.find(function(e){return t===e}))&&(r="viewers.inter."+r),r&&(o.controlPane=r,o.activeRow=2)),e.viewState.controlPane=o.controlPane;var s=e.viewState.controlPane.replace("viewers.inter.","");a=function(e,n){var t=R[e];if(t)return-1===t.indexOf(n)?t[0]:n}(s,a),e.viewState.subPane=a,e.viewState.activeRow=o.activeRow,n.go(".",{tab:s,sub:a},i?G:void 0)},e.switchSubPane=function(t){e.viewState.subPane=t,n.go(".",{sub:t})},e.switchTab(n.params.tab,n.params.sub),e.proxy={},e.baseFontSizes=p.range(10,24),e.headerFontSizes=p.range(16,48),e.visibleStripOptions=p.labelledRange(1,20),e.visibleStripOptions.unshift({label:"all",value:!1}),e.weightToName={100:"thin",200:"extra-light",300:"light",400:"normal",500:"medium",600:"demi-bold",700:"bold",800:"heavy",900:"black"};var q=Ct().T.get("prefix","");e.loginLink=q+"/i/site/login?next="+encodeURIComponent(q+"/i/customizer");var j=function(n,t){Object.keys(K).forEach(function(a){var o=e.settings,r=(0,Nt().vd)(n,a);if(r!==(0,Nt().vd)(t,a)){var s=K[a],l=Mt().Z.familyToMeta(r),c=a.split(".");c.pop();var d=c.join("."),u=c.pop(),p=c.join("."),m=(0,Nt().vd)(o,d),f={};-1===l.weights.indexOf(m.weight)&&(f.weight=function(e,n){var t=i(e).reverse(),a=400;if(-1!==e.indexOf(n))a=n;else if(400===n&&-1!==e.indexOf(500))a=500;else if(500===n&&-1!==e.indexOf(400))a=400;else if(n>=500)(a=e.find(function(e){return e>n}))||(a=t.find(function(e){return e<n}));else if(n<=400)return(a=t.find(function(e){return e<n}))||(a=e.find(function(e){return e>n})),a;return a}(l.weights,m.weight)),f.provider=l.provider,delete f.source,f.args=l.args,(0,Nt().vd)(o,p)[u]=Object.assign(m,f),e.fonts[s]=l}})};e.fonts={},e.availableFonts=Mt().Z.availableFonts;var W=[];function V(n){J(n,n,e.settings[n])}e.$watch("availableFonts",function(){W.map(function(e){Z(e.fontRole,e.setting)})},!0);var H,Y,K={};function J(e,n,t){K[n+".family"]=e,Z(e,t)}function Z(n,t){if(t){var a=Mt().Z.familyToMeta(t.family);W=W.filter(function(){return W.fontRole!==n}),a?e.fonts[n]=a:W.push({fontRole:n,setting:t})}}function Q(){l(".customizer").css({"background-color":e.settings.background,color:e.settings.textColor}),l(".customizer__homelink a.l-change").css({color:e.settings.textColor}),l(".customizer__homelink a.l-change:hover").css({color:e.settings.textColor}),l(".customizer__homelink a.l-change:active").css({color:e.settings.textColor}),l(".customizer__homelink a.l-change:focus").css({color:e.settings.textColor})}function X(){e.settings.defaultStartDate?e.proxy.defaultStartDate=s.utc(e.settings.defaultStartDate,P).valueOf():e.proxy.defaultStartDate=!1,!1===e.settings.eventsFromText?e.proxy.hideEventsFromText=!0:e.settings.eventsFromText&&(e.proxy.useEventsFromText=!0,e.proxy.eventsFromText=e.settings.eventsFromText),e.settings.noMoreText&&(e.proxy.useNoMoreText=!0,e.proxy.noMoreText=e.settings.noMoreText),e.settings.noEventsFoundText&&(e.proxy.useNoEventsFoundText=!0,e.proxy.noEventsFoundText=e.settings.noEventsFoundText)}function ee(n){var t=e.viewState.useDemoCalendar?"spirited":e.calname;e.useCalendar(t,n)}e.fixBorders=function(n){n&&n.preventDefault(),e.settings.navbar.borderColor=(0,Do.Ay)(e.settings.navbar.background).darken(.8).hex(),e.settings.navbar.buttonBorderColor=(0,Do.Ay)(e.settings.navbar.buttonBackground).darken(.5).hex()},e.setTheme=function(n){var t=d.defer();return b.get({id:n,calendarname:e.calendar.name}).then(function(n){var t=z.currentTheme?z.currentTheme.name:void 0,a=z.currentTheme.settings;z.currentTheme=n,n.name,t!==n.name&&z.hideVersions(),z.setCurrentSummary(n.id),z.currentTheme.settings=_.applyDefaults(z.currentTheme.settings),z.currentTheme.settings.defaultStartDate||(z.currentTheme.settings.defaultStartDate=!1),e.settings=z.currentTheme.settings;var i=e.settings.views.detail.pageFooter;""!==(i||"").trim()&&(e.viewState.pageFooter=i,e.viewState.usePageFooter=!0),z.unsaveCustomDateFormat(e.settings.customDateFormat),e.ms=e.settings.views.monthly,e.ms.gridView=e.ms.gridView||"month",j(e.settings,a),z.updateUnmodified(),X(),_.applyDefaults(e.settings),Q()}).catch(function(e){}).finally(function(){t.resolve(!0)}),t.promise},e.revertTheme=function(){e.setTheme(e.calendar.ngthemeid)},e.toggleHideEventsFromText=function(){e.proxy.hideEventsFromText?e.settings.eventsFromText=!1:(e.settings.eventsFromText=e.proxy.eventsFromText||void 0,e.proxy.useEventsFromText=!!e.proxy.eventsFromText)},e.$watch("proxy.defaultStartDate",function(n){!1===n?e.settings.defaultStartDate=!1:n&&(e.settings.defaultStartDate=s.utc(n).format(P))}),(Y=e.calname)&&y.getCurrentUser().then(function(n){return H=n,e.isLoggedIn=!0,e.isDudaUser=n.isDudaUser,e.isDudaEmbed=n.isDudaUser&&c,x=n._id,w.getPromise(Y)}).then(function(n){return e.isOwnCalendar=-1!==H.calendars.indexOf(n._id),C=n.subscriber,w.query({users:H._id}).$promise}).then(function(t){e.calendars=t,e.targetCalendar=t.find(function(e){return e.isManageable}),e.isLoggedIn&&!e.isOwnCalendar&&n.go("customizer",{calname:e.targetCalendar.name})}).then(function(){f.loadUserFonts(H)}).catch(function(e){}),e.useCalendar=function(n,t){var a;t?a="^."+t:(E=!0,a="^"),A=1;var i=l(".customizer__calendar iframe")[0];I(i,e.settings,{exclude:"views.upcoming"}),window._tkf.updateState(i,{state:a,stateparams:{calname:n},reload:!0})},e.initMonthEventFont=function(){return e.settings.views.monthly.eventFont=Eo()().copy(e.settings.textFont)},e.initMonthGridFont=function(){return e.settings.views.monthly.gridFont=Eo()().copy(e.settings.textFont)},e.autoNavBorderColor=function(){return(0,Do.Ay)(e.settings.navbar.background).darken(.5).css()},e.autoNavButtonBorderColor=function(){return(0,Do.Ay)(e.settings.navbar.buttonBackgroun
2d).darken(.8).css()},e.autoAgendaEventTitleSize=function(){return Math.floor(1.75*e.settings.fontSize)},e.autoPinboardEventTitleSize=function(){return Math.floor(1.4*e.settings.fontSize)},e.autoAgendaSeparatorColor=function(){var n=e.settings.views.agenda,t=n.itemBackground||e.settings.background,a=n.linkColor||e.settings.linkColor;return Ft().ZH.mix(a,t,.3).css()},e.autoImageBorderColor=function(){var n=e.settings,t=n.views.agenda,a=t.linkColor||n.linkColor,i=t.itemBackground||n.background;return Ft().ZH.mix(a,i,.5).css()},e.autoMonthlyGridColor=function(){return g.changeSettings(e.settings),g.defaultGridColor()},e.autoStripColors=function(n){var t=n.background,a=n.borderColor,i=e.ms;t&&delete i.stripBackground,a&&delete i.stripBorderColor,g.changeSettings(e.settings);var o=g.defaultStripColors;i.stripBackground=i.stripBackground||o.background,i.stripBorderColor=i.stripBorderColor||o.borderColor},e.autoStripBackground=function(){return g.changeSettings(e.settings),g.defaultStripBackground()},e.autoStripBorderColor=function(){return g.changeSettings(e.settings),g.defaultStripBorder()},e.autoEventFontSize=function(){return g.changeSettings(e.settings),g.defaultEventFontSize()},e.autoPinboardBorderColor=function(){var n=e.settings.views.pinboard,t=n.cardBackground||e.settings.background,a=n.linkColor||e.settings.linkColor,i=Ft().ZH.mix(a,t,.3).css();return i},e.startDeleteTheme=function(){o.popup.open({view:qt(),kind:"newerror",animation:"message",tparams:{title:"Delete Theme",main:"Remove this theme completely",cancelLabel:"Cancel",actionLabel:"Delete Theme",action:function(){e.deleteTheme(),o.popup.close()}}})};var ne=function(n,t){var a=t?"full":"no";z.currentTheme.userid=C||x,delete z.currentTheme.id,n&&(z.currentTheme.name=n),z.currentTheme.calid=e.calendar._id,z.saveCustomDateFormat(e.settings.customDateFormat),e.viewState.usePageFooter&&""!==(e.viewState.pageFooter||"").trim()?z.currentTheme.settings.views.detail.pageFooter=e.viewState.pageFooter:delete z.currentTheme.settings.views.detail.pageFooter,o.spinner.open(),z.save(z.currentTheme,a).then(function(a){return o.status.open("Theme Saved","success",1500),e.calendar.ngthemeid,e.calendar.ngthemeid=a.id,z.currentTheme.id=a.id,z.fetchThemeSummaries(x,C).then(function(){var i,o=a.id;(n&&t||!n)&&(i=a.id),z.currentIsActiveTheme,e.setTheme(a.id).then(function(){z.updateUnmodified(),z.setSummaries({activeId:i,currentId:o}),z.hideVersions()})})}).catch(function(e){o.status.open("Problem Saving Theme","error",8e3)}).finally(function(){o.spinner.close()})};e.saveTheme=function(n){var t,a=e.calendar.name+"-default",i=z.hasCustomTheme(a);i&&(n||z.isBuiltIn(z.currentSummary))?(t={name:"",saveOnly:!1},o.popup.open({tparams:{model:t,save:function(){ne(t.name,!t.saveOnly),o.popup.close()},cancel:o.popup.close},view:Wt()})):ne(i?null:a,!0)},e.useTheme=function(){var n=z.currentSummary.id,t=z.currentSummary.themeId;o.spinner.open(),b.setDefault(n).then(function(){z.fetchThemeSummaries(x,C).then(function(){return z.setActiveSummary(n)})}).catch(function(e){o.status.open("Failed to set default theme","error",5e3)}).finally(function(){o.spinner.close()}),e.calendar.ngthemeid!==n&&(o.spinner.open(),e.calendar.ngthemeid=t,e.calendar.$update().then(function(){z.fetchThemeSummaries(x,C).then(function(){return z.setActiveSummary(n)})}).catch(function(e){o.status.open("Failed to switch theme","error",5e3)}).finally(function(){o.spinner.close()}))},e.deleteTheme=function(){o.spinner.open(),b.delete({id:z.currentSummary.id}).then(function(){o.status.open("Theme Deleted","success",1500),e.setTheme(z.activeSummary.id).then(function(){return z.fetchThemeSummaries(x,C).then(function(){z.setCurrentSummary(z.activeSummary.id)})})}).catch(function(e){var n=e.data.includes("in use")?"Can't delete: theme in use":"Problem deleting theme";o.status.open(n,"error",5e3)}).finally(function(){o.spinner.close()})};k.onBefore({exiting:["customizer.main","customizer.anonmain"]},function(n){var t;if(n.to().name!==n.from().name)return z.hasChanges&&e.isLoggedIn?(t=d.defer(),o.popup.open({view:Vt(),animation:"message",tparams:{action:function(){t.resolve(!0),o.popup.close()}}}),t.promise).then(function(){return z.hasChanges=!1,!0}):void 0}),e.showEmbedCode=function(){return v.openEmbedCodePopup({calendar:e.calendar,component:"
2calendar",isDudaUser:e.isDudaUser})},e.getDefaultFontSize=function(){var n=e.settings.fontSize;return Math.floor(1.2*n)},e.getDefaultTitleFontSize=function(){var n=e.settings.fontSize;return Math.floor(2.3*n),Math.floor(2.3*n)},e.toggleCalendarMenu=function(n){n.stopPropagation(),n.preventDefault(),e.viewState.calendarMenuOpen=!e.viewState.calendarMenuOpen},e.removeTagColors=function(n){var t=$(n);delete e.ms.tagcolors[t]},e.removeTagColor=function(n){var t=$(n);delete e.settings.tagcolors[t]},e.initTagColors=function(n){var t=$(n);g.changeSettings(e.settings),e.ms.tagcolors=e.ms.tagcolors||{},e.settings.tagcolors=e.settings.tagcolors||{};var a=e.settings.tagcolors[t],i=a?g.stripColors({color:a}):g.defaultStripColors;e.ms.tagcolors[t]={color:i.color},JSON.stringify(i)},e.initTagColor=function(n){var t=$(n);g.changeSettings(e.settings),e.settings.tagcolors=e.settings.tagcolors||{},e.settings.tagcolors[t]=e.settings.tagColor||e.settings.linkColor},e.initTagPart=function(n,t){var a=$(n),i=e.settings.views.monthly.tagcolors[a];g.changeSettings(e.settings);var o=e.settings.tagcolors[n]||g.defaultStripColors.color,r=g.stripColors({color:i.color||o,background:i.background,borderColor:i.borderColor});i[t]=r[t]},e.defaultPreviewBackground=function(){var n=e.settings;n.background;var t=n.views.monthly;return(0,Do.Ay)(t.gridBackground||n.background).alpha(255).css()},e.clearTag=function(n,t){var a=$(n);delete e.settings.views.monthly.tagcolors[a][t],g.changeSettings(e.settings)},e.validDateTags=z.validDateTags,e.setDefaultDateFormat=function(n){delete e.settings.customDateFormat[n]}}])}),m=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("customizer.main",{url:"/i/customizer/:calname?demo&tab&sub",params:{tab:{dynamic:!0},sub:{dynamic:!0},demo:{dynamic:!0}},views:{"main@":{template:Gt(),controller:"MainCustomizerCtrl"}}}).state("customizer.anonmain",{url:"/i/customizer?demo&tab&sub",params:{tab:{dynamic:!0},sub:{dynamic:!0},demo:{dynamic:!0}},views:{"main@":{template:Gt(),controller:"MainCustomizerCtrl"}}})}])}),f=t.cw(function(e,n){o();var t={embed:"This is a generic embed code that will work anywhere. Add it to your site where you want the calendar to appear.",wordpress:"Wordpress Instructions: Install our Wordpress Plugin First",wix:"Wix Instructions: Install as a Custom Element",squarespace:"Squarespace Instructions: Install using a Code block"};Eo()().module("tkfngApp").controller("SnippetMakerCtrl",["$scope","$timeout",function(e,n){e.dudaWidgetIcon=uo(),e.wordpressLogo=wo(),e.wixLogo=ho(),e.squarespaceLogo=fo();var a=e.popup.tparams,i=a.component,o=a.calname,r=a.title,s=a.isDudaUser;e.args={component:"mini"===i?"mini":"calendar",calname:o,title:r,href:"https://tockify.com/"+o,isDudaUser:s},e.viewState={target:"embed",notesOpen:!1,copied:!1},e.selectTarget=function(n){e.viewState.target=n,e.viewState.copied=!1},e.selectComponent=function(n){e.args.component=n,e.viewState.copied=!1},e.code=function(){var n=e.args,t=n.component,a=n.calname;return"wordpress"===e.viewState.target?'[tockify component="'+t+'" calendar="'+a+'"]':"wix"===e.viewState.target?"https://public.tockify.com/browser/wixembed.js":'<div data-tockify-component="'+t+'" data-tockify-calendar="'+a+'"></div>\n<script data-cfasync="false" data-tockify-script="embed" src="https://public.tockify.com/browser/embed.js"><\/script>'},e.prismLanguage=function(){return"wordpress"===e.viewState.target?"css":"markup"},e.codeKind=function(){return"wordpress"===e.viewState.target?"Shortcode":"wix"===e.viewState.target?"Server URL":"HTML"},e.lede=function(){return t[e.viewState.target]},e.sizeNote=function(){return"calendar"===e.args.component?"Best for wide spaces":"Best for narrow spaces"},e.copyLabel=function(){return e.viewState.copied?"Copied":"Copy code"};var l=null;e.copy=function(){navigator.clipboard&&navigator.clipboard.writeText(e.code()),e.viewState.copied=!0,l&&n.cancel(l),l=n(function(){e.viewState.copied=!1},1800)},e.toggleNotes=function(){e.viewState.notesOpen=!e.viewState.notesOpen},e.$on("$destroy",function(){l&&n.cancel(l)})}])}),g=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),Nt(),Ct(),dn(),Mt(),Ft(),jn();var i=ao(),r=Xi(),s=window.self!==window.top;Eo()().module("tkfngApp").controller("UpcomingCustomizerCtrl",["$scope","$state","$document","tkfNotify","$timeout","TKFCollections","CustomFont","Auth","Calendar","ThemeEditor","Styler","EmbedCode","LocaleCentral","$q","$transitions",function(e,n,a,o,l,c,d,u,p,m,f,g,v,h,b){var y,w,_=!!n.params.tab,k=!1,S={location:"replace"},x=m;e.ted=x,x.reset();
2var C="YYYYMMDD",T=function(n,a){Object.keys(M).forEach(function(i){var o=e.settings,r=(0,Nt().vd)(n,i);if(r!==(0,Nt().vd)(a,i)){var s=M[i],l=Mt().Z.familyToMeta(r),c=i.split(".");c.pop();var d=c.join("."),u=c.pop(),p=c.join("."),m=(0,Nt().vd)(o,d),f={};-1===l.weights.indexOf(m.weight)&&(f.weight=function(e,n){var a=t(e).reverse(),i=400;if(-1!==e.indexOf(n))i=n;else if(400===n&&-1!==e.indexOf(500))i=500;else if(500===n&&-1!==e.indexOf(400))i=400;else if(n>=500)(i=e.find(function(e){return e>n}))||(i=a.find(function(e){return e<n}));else if(n<=400)return(i=a.find(function(e){return e<n}))||(i=e.find(function(e){return e>n})),i;return i}(l.weights,m.weight)),JSON.stringify(l),f.provider=l.provider,delete f.source,f.args=l.args,(0,Nt().vd)(o,p)[u]=Object.assign(m,f),e.fonts[s]=l}})};e.todayMidnightUTC=function(){var e=i(),n=e.valueOf()+60*e.utcOffset()*1e3;return i.utc(n).startOf("day").valueOf()},e.maxEventsOptions=c.range(1,30),e.calnames=dn().B.onlineCalnames;var A=n.params.calname;A||(A=e.calnames&&e.calnames.length>0?e.calnames[0]:"spirited"),e.calname=A,e.canChooseDemoEvents=dn().B.isDefined&&"spirited"!==A,e.viewState={useDemoCalendar:!e.canChooseDemoEvents||"false"!==n.params.demo,calendarMenuOpen:!1,controlPane:"about",wrapperWidth:"500px",background:"#fff"},e.embedCalName=e.viewState.useDemoCalendar?"spirited":A;var E=(0,Nt().sg)(function(e,n,t){window._tkf.updateSettings(e,n,t)},75),P=p.getPromise(e.calname).then(function(n){e.calendar=n,e.passcode=n.viewPasscode;var t=n.expFeatures||[];return e.hasHideDateFeature=-1!==t.indexOf("hide-date"),m.get({id:n.minithemeid||n.ngthemeid})});e.$watch("calname",function(e,t){e&&e!==t&&n.go("customizer.upcoming",{calname:e})}),e.revertTheme=function(){e.setTheme(e.calendar.ngthemeid)};var z=Ct().T.get("embedScript");(0,Nt().kG)(z).then(function(){return P.then(function(t){return function(t){window._tkf.loadDeclaredCalendars(),l(function(){return function(t){var a=r(".customizer__calendar iframe")[0],s=a.name;0===e.calendar.effectiveFeatureLevel&&o.popup.open({view:jt(),tparams:{isDudaUser:e.isDudaUser,dudaUpgrade:jn().Nd}});window._tkf.onCalendarStateChange(s,function(n){_?_=!1:(e.$apply(function(){var e=n.toState.name.split(".");e[e.length-1]}),k&&(k=!1,E(r(".customizer__calendar iframe")[0],e.settings,{include:"views.upcoming"})))});var c=function(){e.$watch("ted.selected",function(n,t){if(n&&!Eo()().equals(n,t)&&n.themeId){var a=x.findThemeSummaryForThemeId(n);e.setTheme(a.id)}},!0)};function d(t){x.currentTheme=t,x.fetchThemeSummaries(y,w).then(function(){x.setCurrentSummary(x.currentTheme.id),x.setActiveSummary(x.currentTheme.id)}),e.settings=f.applyDefaults(x.currentTheme.settings),e.us=e.settings.views.upcoming,x.unsaveCustomDateFormat(e.settings.customDateFormat),x.currentTheme.settings.defaultStartDate||(x.currentTheme.settings.defaultStartDate=!1);var o,s,d,u,p=v.getDateTimeFormats({picker:!0}).dateFormat;function m(e,n){T(e,n),E(r(".customizer__calendar iframe")[0],e,{include:"views.upcoming"}),L()}e.dateFormat=p,e.wkstart=e.calendar.getWkStart(),e.settings.defaultStartDate,e.settings.defaultStartDate?e.proxy.defaultStartDate=i.utc(e.settings.defaultStartDate,C).valueOf():e.proxy.defaultStartDate=!1,s=o="textFont",d="views.upcoming."+o,u=e.settings.views.upcoming[o],M[d+".family"]=s,O(s,u),e.$watch("viewState.wrapperWidth",function(n,t){n&&n!==t&&(E(a,e.settings,{include:"views.upcoming"}),L())}),e.$watch("settings",function(e,n){e&&!Eo()().equals(e,n)&&(x.checkForChanges(e),m(e,n))},!0),e.$watch("viewState.useDemoCalendar",function(t,a){var i,o;void 0===t||t===a&&!1===a||(o=e.viewState.useDemoCalendar?"spirited":e.calname,e.useCalendar(o,i),(t!==a||e.canChooseDemoEvents)&&n.go(".",{demo:""+t},t===a?S:void 0))}),c(),x.updateUnmodified(),l(function(){return zo.K.loadBuiltIn()},3e3),m(e.settings)}d(t)}(t)},80)}(t)})}).catch(function(){return console.warn("customizer: embed script did not load, preview will be absent")}),e.proxy={};var D={row1:["about","basics","themes"],row2:["styles","monthly","agenda"]};e.switchUpTab=function(t){t||(_=1),t=t||"basics";var a={controlPane:"basics",activeRow:1},i=D.row1.find(function(e){return t===e});i?(a.controlPane=i,a.activeRow=1):((i=D.row2.find(function(e){return t===e}))||(i=D.row2ShortNames.find(function(e){return t===e}))&&(i="viewers.inter."+i),i&&(a.controlPane=i,a.activeRow=2)),e.viewState.controlPane=a.controlPane;var o=e.viewState.controlPane.replace("viewers.inter.","");e.viewState.activeRow=a.activeRow,n.go(".",{tab:o})},e.switchUpTab(n.params.tab),e.baseFontSizes=[10,11,12,13,14,15,16,18,19,20,21,22,23,24],e.weightToName={100:"thin",200:"extra-light",300:"light",400:"normal",500:"medium",600:"demi-bold",700:"bold",800:"heavy",900:"black"};var I=Ct().T.get("prefix","");function L(){e.settings&&(e.viewState.background=e.settings.views.upcoming.backgroundColor)}e.loginLink=I+"/i/site/login?next="+encodeURIComponent(I+"/i/customizer"),e.fixBorders=function(n){n&&n.preventDefault(),e.settings.navbar.borderColor=(0,Do.Ay)(e.settings.navbar.background).darken(.8).hex(),e.settings.navbar.buttonBorderColor=(0,Do.Ay)(e.settings.navbar.buttonBackgroun
2d).darken(.5).hex()},e.startDeleteTheme=function(){o.popup.open({view:qt(),kind:"newerror",animation:"message",tparams:{title:"Delete Theme",main:"Remove this theme completely",cancelLabel:"Cancel",actionLabel:"Delete Theme",action:function(){e.deleteTheme(),o.popup.close()}}})},e.setTheme=function(n){var t=h.defer();if(null!==n)return m.get({id:n}).then(function(n){var t=x.currentTheme?x.currentTheme.themeId:void 0,a=x.currentTheme;x.currentTheme=n,t!==n.themeId&&x.hideVersions(),x.setCurrentSummary(n.id),x.currentTheme.settings=f.applyDefaults(x.currentTheme.settings),x.currentTheme.settings.defaultStartDate||(x.currentTheme.settings.defaultStartDate=!1),e.settings=x.currentTheme.settings,x.unsaveCustomDateFormat(e.settings.customDateFormat),T(e.settings,a),x.updateUnmodified(),f.applyDefaults(e.settings),e.us=e.settings.views.upcoming,L()}).catch(function(e){}).finally(function(){t.resolve(!0)}),t.promise},e.$watch("proxy.defaultStartDate",function(n){!1===n?e.settings.defaultStartDate=!1:n&&(e.settings.defaultStartDate=i.utc(n).format(C))}),e.fonts={},e.availableFonts=Mt().Z.availableFonts;var $=[];e.$watch("availableFonts",function(){$.map(function(e){O(e.fontRole,e.setting)})},!0);var F,M={};function O(n,t){var a=Mt().Z.familyToMeta(t.family);$=$.filter(function(){return $.fontRole!==n}),a?e.fonts[n]=a:$.push({fontRole:n,setting:t})}u.getCurrentUser().then(function(n){return F=n,e.isDudaUser=n.isDudaUser,e.isDudaEmbed=n.isDudaUser&&s,e.isLoggedIn=!0,y=n._id,p.getPromise(e.calname)}
2).then(function(n){return e.isOwnCalendar=-1!==F.calendars.indexOf(n._id),w=e.calendar.subscriber,p.query({users:F._id}).$promise}).then(function(t){e.calendars=t,e.targetCalendar=t.find(function(e){return e.isManageable}),e.isLoggedIn&&!e.isOwnCalendar&&n.go("customizer.upcoming",{calname:e.targetCalendar.name})}).then(function(){d.loadUserFonts(F)}).catch(function(){}),e.useCalendar=function(n){var t=r(".customizer__calendar iframe")[0];E(t,e.settings,{include:"views.upcoming"}),window._tkf.updateState(t,{state:"viewers.inter.upcoming",stateparams:{calname:n}})};var N=function(n,t){var a=t?"mini":"no";x.currentTheme.userid=w||y,delete x.currentTheme.id,n&&(x.currentTheme.name=n),x.currentTheme.calid=e.calendar._id,x.saveCustomDateFormat(e.settings.customDateFormat),o.spinner.open(),x.save(x.currentTheme,a).then(function(a){return o.status.open("Theme Saved","success",1500),e.calendar.minithemeid,e.calendar.minithemeid=a.id,x.currentTheme.id=a.id,x.fetchThemeSummaries(y,w).then(function(){var i,o=a.id;(n&&t||!n)&&(i=a.id),e.setTheme(a.id).then(function(){x.updateUnmodified(),x.setSummaries({activeId:i,currentId:o}),x.hideVersions()})})}).then(function(){o.status.open("Theme Saved","success",1500),x.updateUnmodified()}).catch(function(e){o.status.open("Problem Saving Theme","error",8e3)}).finally(function(){o.spinner.close()})};e.saveTheme=function(n){var t,a=e.calendar.name+"-default",i=x.hasCustomTheme(a);i&&(n||x.isBuiltIn(x.currentSummary))?(t={name:"",saveOnly:!1},o.popup.open({tparams:{model:t,save:function(){N(t.name,!t.saveOnly),o.popup.close()},cancel:o.popup.close},view:Wt()})):N(i?null:a,!0)},e.useTheme=function(){var n=x.currentSummary.id,t=x.currentSummary.themeId;o.spinner.open(),m.setDefault(n).then(function(){x.fetchThemeSummaries(y,w).then(function(){return x.setActiveSummary(n)})}).catch(function(e){o.status.open("Failed to set default theme","error",5e3)}).finally(function(){o.spinner.close()}),e.calendar.minithemeid!==t&&(o.spinner.open(),e.calendar.minithemeid=t,e.calendar.$update().then(function(){x.fetchThemeSummaries(y,w).then(function(){return x.setActiveSummary(n)})}).catch(function(e){o.status.open("Failed to switch theme","error",5e3)}).finally(function(){o.spinner.close()}))},e.deleteTheme=function(){o.spinner.open(),m.delete({id:x.currentSummary.id}).then(function(){o.status.open("Theme Deleted","success",1500),e.setTheme(x.activeSummary.id).then(function(){return x.fetchThemeSummaries(y,w).then(function(){x.setCurrentSummary(x.activeSummary.id)})})}).catch(function(n){e.themeModel.delete=!1;var t=n.data.includes("in use")?"Can't delete: theme in use":"Problem deleting theme";o.status.open(t,"error",5e3)}).finally(function(){o.spinner.close()})};b.onBefore({exiting:["customizer.upcoming","customizer.anonupcoming"]},function(n){var t;if(n.to().name!==n.from().name)return x.hasChanges&&e.isLoggedIn?(t=h.defer(),o.popup.open({view:Vt(),animation:"message",tparams:{action:function(){t.resolve(!0),o.popup.close()}}}),t.promise).then(function(){return x.hasChanges=!1,!0}):void 0}),e.showEmbedCode=function(){return g.openEmbedCodePopup({calendar:e.calendar,component:"mini",isDudaUser:e.isDudaUser})},e.getDefaultFontSize=function(){var n=e.settings.fontSize;return Math.floor(1.2*n)},e.getDefaultActiveBackgroundColor=function(){var n=e.settings.views.upcoming,t=n.backgroundColor,a=n.textColor;n.backgroundColor;var i=(0,Do.Ay)(t).luminance()>.3?.05:.15;return Ft().ZH.mix(a,t,i).css()},e.getDefaultTodayTextColor=function(){var n=e.settings.views.upcoming.backgroundColor;return(0,Do.Ay)(n).alpha(1).css()},e.getDefaultLineColor=function(){var n=e.settings.views.upcoming,t=n.backgroundColor,a=n.textColor,i=(0,Do.Ay)(t).luminance()>.3?.15:.3;return Ft().ZH.mix(a,t,i).css()},e.toggleCalendarMenu=function(n){n.stopPropagation(),n.preventDefault(),e.viewState.calendarMenuOpen=!e.viewState.calendarMenuOpen},e.validDateTags=x.validDateTags,e.setDefaultDateFormat=function(n){delete e.settings.customDateFormat[n]}}])}),v=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("customizer.upcoming",{url:"/i/upcomingCustomizer/:calname?demo&tab",params:{tab:{dynamic:!0},sub:{dynamic:!0},demo:{dynamic:!0}},views:{"main@":{template:Yt(),controller:"UpcomingCustomizerCtrl"}}}).state("customizer.anonupcoming",{url:"/i/upcomingCustomizer?demo&open&tab",params:{tab:{dynamic:!0},sub:{dynamic:!0},demo:{dynamic:!0}},views:{"main@":{template:Yt(),controller:"UpcomingCustomizerCtrl"}}})}])}),h=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,s(a.key),a)}}function o(e,n,t){return n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function r(e,n,t){return(n=s(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{N:()=>p});var l="http://www.w3.org/2000/svg",c=["M16.667,62.167c3.109,5.55,7.217,10.591,10.926,15.75 c2.614,3.636,5.149,7.519,8.161,10.853c-0.046-0.051,1.959,2.414,2.692,2.343c0.895-0.088,6.958-8.511,6.014-7.3 c5.997-7.695,11.68-15.463,16.931-23.696c6.393-10.025,12.235-20.373,18.104-30.707C82.004,24.988,84.802,20.601,87,16"],d=.1,u="ease-in-out",p=o(function e(n){var t=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"boxEl",null),r(this,"pathEl",null),r(this,"svgEl",null),r(this,"updateCheckbox",function(e){return e?t.draw():t.reset()}),r(this,"draw",function(){var e=document.createElementNS(l,"path");t.svgEl.appendChild(e),e.setAttributeNS(null,"d",c);var n=e.getTotalLength();
2e.style.strokeDasharray=n+" "+n,e.style.strokeDashoffset=Math.floor(n)-1,e.getBoundingClientRect(),e.style.transition=e.style.WebkitTransition=e.style.MozTransition="stroke-dashoffset "+d+"s "+u+" 0s",e.style.strokeDashoffset=0,t.pathEl=e}),r(this,"reset",function(){t.svgEl&&t.pathEl&&(t.svgEl.removeChild(t.pathEl),delete t.pathEl)});var a=document.createElementNS(l,"svg");a.setAttributeNS(null,"viewBox","0 0 100 100"),a.setAttribute("xmlns",l),n.parentNode.appendChild(a),this.boxEl=n,this.svgEl=a})}),b=t.cw(function(e,n){o(),pe(),te(),ae(),ee(),ne(),se(),J(),c(),to();var t=["P","DIV","SPAN","BR","UL","LI","OL","B","H1","H2","H3","STRONG","EM","A","IMG","IFRAME"],a=["class","style"],i=/^data-tkf-/,r={A:["href","title","target"],IMG:["src"]};function s(e){for(var n=(new DOMParser).parseFromString(e,"text/html"),o=function(e){for(var n=0,s=Array.from(e.childNodes);n<s.length;n++){var l=s[n];o(l)}!function(e){if(1===e.nodeType){var n=e.tagName;if(t.includes(n))for(var o=0,s=Array.from(e.attributes);o<s.length;o++){var l=s[o],c=l.name.toLowerCase(),d=!1;a.includes(c)&&(d=!0),i.test(c)&&(d=!0),d||("IFRAME"===n||(r[n]||[]).includes(c))&&(d=!0),d||e.removeAttribute(l.name)}else{if(["SCRIPT","STYLE","META","OBJECT","APPLET","LINK"].includes(n))return void e.remove();for(;e.firstChild;)e.parentNode.insertBefore(e.firstChild,e);e.remove()}}}(e)},s=0,l=Array.from(n.body.childNodes);s<l.length;s++){var c=l[s];o(c)}return n.body.innerHTML}Eo()().module("tkfngApp").directive("tkfLexicalEditor",["$timeout","EditorEmbedTools",function(e,n){return{restrict:"E",require:"ngModel",scope:{bridge:"<",imageSets:"<",isDisabled:"<?ngDisabled"},template:'<div class="editor-container" ng-style="containerStyle"><tkf-lexical-toolbar editor="lexicalEditor" bridge="bridge" is-disabled="isDisabled"></tkf-lexical-toolbar><div class="editor-inner"><div class="editor-input"></div><div class="editor-placeholder" ng-if="showPlaceholder && !isDisabled">Enter some text...</div></div></div>',link:function(t,a,i,o){a[0].style.visibility="hidden";var r=!1,l=!1,d=null,u="load-content",p={namespace:"TkfEditor",theme:pe().w,onError:function(e){console.error(e)},nodes:[Fo.jL,xo().v5,xo().YW,So().Db,So().k_,te().K1,ae().Ep,ee().is,ne().$o],editable:!t.isDisabled},m=(0,Ao().ieJ)(p);t.lexicalEditor=m,t.showPlaceholder=!0,t.containerStyle=t.isDisabled?{background:"#faf7e0",color:"#846d5d"}:{},o.$formatters.unshift(function(e){return n.toEmbedCodeFilter(e,"subscription.editor",{imageSets:t.imageSets})}),o.$parsers.unshift(function(e){return n.toEmbedTagFilter(e)}),e(function(){var n=a[0].querySelector(".editor-input");if(n){n.setAttribute("contenteditable","true"),m.setRootElement(n);var i=(0,Co().Sd)((0,Fo.ZI)(m),(0,_o()._M)(m,(0,_o().ht)(),300),(0,xo().cz)(m)),p=new(se().H)(m,t.imageSets);p.start();var f=m.registerUpdateListener(function(n){var t=n.editorState,a=n.tags,i=n.dirtyElements,s=n.dirtyLeaves;a.has("history-merge")||a.has(u)||l&&(0===i.size&&0===s.size||(t.read(function(){var n=(0,ko().g)(m);r=!0,d&&e.cancel(d),d=e(function(){o.$setViewValue(n),d=e(function(){r=!1,d=null})})}),y()))}),g=m.registerCommand(J().o,function(){return t.bridge&&t.bridge.openImageLibrary&&t.bridge.openImageLibrary().then(function(e){e&&m.update(function(){var n=(0,te().qx)({src:e.url,alt:e.alt||"",id:e.id,width:300,alignment:"left"});(0,Ao().H2A)([n])})}),!0},0),v=m.registerCommand(J().q,function(){if(t.bridge&&t.bridge.openVideoPicker){var e=null,n="";m.getEditorState().read(function(){var t=(0,Ao().vJq)(),a=null;if((0,Ao().RTZ)(t)){var i=t.getNodes();1===i.length&&i[0]instanceof ae().Ep&&(a=i[0])}else if((0,Ao().I2P)(t)){var o=t.getNodes();1===o.length&&o[0]instanceof ae().Ep&&(a=o[0])}a&&(e=a.getKey(),n=a.getUrl?a.getUrl():a.__url)});t.bridge.openVideoPicker(function(){},function(n){var t="",a="youtube",i="",o=/src=["']([^"']+)["']/.exec(n);if(o){t=o[1];var r=(0,c().US)(t);
2r&&(i=r.id,a=r.type)}m.update(function(){if(e){var n=(0,Ao().nsf)(e);if(n&&n instanceof ae().Ep){var o=n.__alignment||"center",r=n.__width||"100%",s=(0,ae().Qr)({url:t||"https://www.youtube.com/embed/placeholder",width:r,alignment:o,videoType:a,id:i||"video"});n.replace(s)}}else{var l=(0,ae().Qr)({url:t||"https://www.youtube.com/embed/placeholder",width:"100%",alignment:"center",videoType:a,id:i||"video"}),c=(0,Ao().lJ7)();(0,Ao().H2A)([l,c]),c.select()}})},n)}return!0},0),h=m.registerCommand(Ao().waI,function(e){var n=(e.clipboardData||window.clipboardData).getData("text/html");if(n){e.preventDefault();var t=s(n);return m.update(function(){var e=(new DOMParser).parseFromString(t,"text/html"),n=(0,ko().d)(m,e);(0,Ao().H2A)(n)}),!0}return!1},4),b=function(e){if(e.target===n){var t=window.getSelection();if(!t||t.isCollapsed){var a=n.lastElementChild;if(a){var i=a.getBoundingClientRect();if(e.clientY<=i.bottom)return}m.update(function(){var e=(0,Ao().NiT)(),n=e.getLastChild();if(n&&(0,Ao().bSg)(n))n.selectEnd();else{var t=(0,Ao().lJ7)();e.append(t),t.selectEnd()}})}}};n.addEventListener("click",b),o.$render=function(){r||w(o.$viewValue||"")},w(o.$viewValue||""),t.$watch("isDisabled",function(e,n){e!==n&&(m.setEditable(!e),t.containerStyle=e?{background:"#faf7e0",color:"#846d5d"}:{})}),t.$watch("imageSets",function(e){e&&p.updateImageSets(e)}),t.$on("$destroy",function(){d&&e.cancel(d),n.removeEventListener("click",b),i(),f(),g(),v(),h(),p.destroy(),m.setRootElement(null)})}else console.error("TkfLexicalEditor: .editor-input element not found");function y(){m.getEditorState().read(function(){var n=(0,Ao().NiT)(),a=0===n.getChildrenSize()||1===n.getChildrenSize()&&(0,Ao().bSg)(n.getFirstChild())&&n.getFirstChild().isEmpty();t.showPlaceholder!==a&&(t.showPlaceholder=a,e(function(){}))})}function w(e){m.update(function(){if((0,ko().g)(m)!==e){var n=(new DOMParser).parseFromString(e,"text/html");n.querySelectorAll("li").forEach(function(e){for(var t=!1,a=0;a<e.childNodes.length;a++){var i=e.childNodes[a];if(1===i.nodeType&&["P","DIV","UL","OL"].includes(i.nodeName)){t=!0;break}}if(!t&&e.childNodes.length>0){for(var o=n.createElement("p");e.firstChild;)o.appendChild(e.firstChild);e.appendChild(o)}});var t=(0,ko().d)(m,n),a=(0,Ao().NiT)();a.clear();var i=[],o=null;t.forEach(function(e){var n=(0,Ao().kFe)(e),t="linebreak"===e.getType(),a=n||t;if(!a&&e.isInline&&(a=e.isInline()),a){if(n&&0===e.getTextContent().trim().length&&!o)return;o||(o=(0,Ao().lJ7)(),i.push(o)),o.append(e)}else o=null,i.push(e)}),a.append.apply(a,i),(0,Ao().n1P)(null)}},{tag:u,discrete:!0}),l||(l=!0,a[0].style.visibility="",m.getEditorState().read(function(){o.$setViewValue((0,ko().g)(m))}),setTimeout(function(){m.dispatchCommand(Ao().t5V,void 0)},0)),y()}})}}}])}),y=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),je(),kt(),Eo()().module("tkfngApp").service("AddressLookup",["$q",function(e){var n=this,a=void 0,i=void 0,o=void 0,r=void 0,s=function(){if(!o)return kt().i.log("places","newMatchSession",{client:"angular"}),o=new r.places.AutocompleteSessionToken};(0,je().D)().then(function(e){r=e,a=new e.places.AutocompleteService;var n=document.createElement("div");i=new e.places.PlacesService(n)});var l={},c=function(e){var n=e.address,t=e.region;return"".concat(n,"££[").concat(t,"]")},d=function(e,n){var t=e.address,a=e.region;return l[c({address:t,region:a})]=n};this.getMatches=function(n){var i=n.address.replace(/\s+/g," "),r=(n.region||"us").toLowerCase();return"en"===r&&(r="us"),"gb"===r&&(r="uk"),n.global&&(r=void 0),function(e){var n=e.address,t=e.region;return l[c({address:n,region:t})]}({address:i,region:r})||function(n){var i=n.address,r=n.region,l=e.defer(),c=l.promise;if(a){s();var u={input:i,sessionToken:o};r&&(u.componentRestrictions={country:[r]}),kt().i.log("places","getPlacePredictions",{client:"angular"}),a.getPlacePredictions(u,function(e,n){if("OK"===n)l.resolve([].concat(t(e),[{description:""}])),d({address:i,region:r},c);else{var a=r?[{description:""}]:[];l.resolve(a)}})}else l.resolve([]);return c}({address:i,region:r})};var u={},p=function(e,n){return[e].concat(t(n||[])).join("££")};this.lookupPlace=function(e,t){return function(e,n){return u[p(e,n)]}(e,t)||n.lookupPlaceWithAPI(e,t)},this.lookupPlaceWithAPI=function(n,t){var a=e.defer(),r=a.promise;if(i){var l=s();o=void 0,kt().i.log("places","getDetails",{client:"angular"}),i.getDetails({placeId:n,fields:t,sessionToken:l},function(e,i){"OK"===i?(a.resolve(e),function(e,n,t){u[p(e,n)]=t}(n,t,r)):a.reject(i)})}else a.resolve("");return r}}])}),w=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,a)}return t}function i(e,n,a){return(n=function(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,n||"default");if("object"!=t(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}(n))in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}o();Eo()().module("tkfngApp").filter("trusted",["$sce",function(e){return function(n){return e.trustAsResourceUrl(n)}}]).directive("addressPicker",["AddressLookup","$timeout","EventLoc","CalendarSearch",function(e,n,t,o){return{replace:!0,scope:{where:"=where",region:"=region",ccode:"=ccode"},template:Kt(),restrict:"EA",controller:["$scope",function(r){var s=t.CHOOSE_LABEL;r.isNarrow=!1,r.isWide=!1,r.loc={selected:s},r.CalendarSearch=o;var l=function(){var e=window.matchMedia("(max-width: 1200px)").matches;r.isNarrow=r.isNarrow||e,r.isWide=r.isWide||!e},c=function(){return n(l,0)};document.addEventListener("restyle",c),r.$on("$destroy",function(){document.removeEventListener("restyle",c),r.isDestroyed=!0}),l(),r.addresses=[],r.addressPredictions=[],r.isTypeaheadMatch=function(){return!0};var d=void 0;function u(e){return e&&e.place_id?(r.map.place_url=(n=e.place_id,"https://www.google.com/maps/embed/v1/place?key=".concat("AIzaSyAB3qpj1XGaz3irSfwuPz1OILaLAErMWTc","&q=place_id:").concat(n)),r.addressPredictions=[],r.showMap=!0,!0):(r.showMap=!1,!1);var n}function p(n,t,a){if(!(n.length<14)){var i={address:n,region:r.ccode||r.region,global:r.search.global};return r.showMap=!1,e.getMatches(i).then(function(n){r.addressPredictions=n,t&&(n.length>1?r.onSelect(n[0].description):a&&(i.address=a,e.getMatches(i).then(function(e){r.addressPredictions=e,e.length>1&&r.onSelect(e[0].description)})))}).catch(function(e){})}}r.onSelect=function(n){var t=r.addressPredictions.find(function(e){return e.description===n});if(t&&t.place_id){var o=t.place_id;return e.lookupPlace(o,["formatted_address","geometry","name","address_components"]).then(function(e){d=e.formatted_address,r.where.address=d,!r.where.place&&function(){return!/\d/.test(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"")}(e.name)&&(r.where.place=e.name);var n=e.address_components||[],t={};
2n.forEach(function(e){e.types.forEach(function(n){return t[n]=e.short_name})});var s=t.street_number,l={c_street:s?s+" "+t.route:t.route,c_locality:t.locality||t.sublocality||t.postal_town,c_region:t.administrative_area_level_1,c_country:t.country,c_postcode:t.postal_code},c=e.geometry.location;r.where.location=function(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach(function(n){i(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}({place_id:o,name:e.name,latitude:c.lat(),longitude:c.lng()},l),r.where.location,u(r.where.location)}).catch(function(e){})}},r.search={global:!1},r.map={center:{latitude:45,longitude:-73},zoom:15,options:{}},r.where&&u(r.where.location);var m;r.$on("reloadEventLocs",function(){t.getEventLocs(r.CalendarSearch.calendar._id,r)}),r.saveLocation=function(){var e=r.loc.current;e.address=r.where.address,e.place=r.where.place,e.directions=r.where.directions,e.location=r.where.location,r.loc.isSaving=!0,t.saveEventLoc(e,r).then(function(e){r.loc.isSaving=!1;var n=r.loc;n.selected=e.name,n.isDirty=!1,n.canEditName=!1}).finally(function(){r.loc.isSaving=!1})},r.forgetLocation=function(){var e=r.loc,n=e.current;e.isSaved&&t.deleteLoc(n,r).then(function(){e.selected=s}).then(function(){})},r.stopTrackingLocName=function(){var e=r.loc;e.isDirty=!0,e.current,e.current&&(e.current.trackedName=!1)};r.addNewLocation=function(){var e=r.loc;e.isEditing=!0,e.isNew=!0,r.saveLocation()};var f,g=function(e){var n=e.place,t=e.address;if("string"==typeof t)if(" "===n&&e.location&&e.location.name)e.place=e.location.name;else{t=(t||"").trim(),n=(n||"").trim();var a=r.loc;a.current&&(a.current.name=[n,t].filter(function(e){return!!e}).join(", ").substring(0,50),a.current.name)}},v=function(){f&&f(),f=r.$watch("where",function(e,n){if(e&&(n&&n.use!==e.use&&(n.use=e.use),!Eo()().equals(e,n))){var t=r.loc;t.isDirty=!0,t.current&&!t.current.trackedName||g(e)}},!0)},h=function(){f&&(f(),f=null)},b=!1;r.$watch("CalendarSearch.loaded",function(e,n){"boolean"!=typeof e||b&&e===n||(b=!0,e&&(m&&m(),m=r.$watch("loc.selected",function(e){if(e){h();var n=r.loc;e!==s?(n.isNew=!1,n.isEditing=!0):n.isEditing=n.isNew,n.canEditName=!1,n.current=t.findEventLoc(e),n.isSaved=e!==s,n.isSaved?(r.where,t.useEventLoc(r.where,e),n.isDirty=!1):(n.current={calId:o.calendar._id,name:"",trackedName:!0,place:"",address:"",directions:""},r.where&&g(r.where),n.isDirty=!0),v()}}),y()))});var y=function(){t.getEventLocs(r.CalendarSearch.calendar._id,r).then(function(){if(r.where.address){var e=r.where.address,n=[r.where.place,e].filter(function(e){return!!e}).join(", ").substring(0,50).trim();t.findEventLoc(n)?r.loc.selected=n:'no saved location for: "'.concat(n,'"')}})};r.locSelect=function(e){if(r.loc.selected=e,!t.eventLocs.some(function(n){return n.name===e})){var n=r.matchLocs.find(function(n){return n.name===e});n?t.eventLocs.push(n):'failed to find "'.concat(e," in matchLocs")}r.loc.search=""},r.selectedAddress="",r.$watch("where.address",function(e,n){var t;if("string"!=typeof e?t="not string":e===n?t="unchanged":e===d&&(t="same as Selected"),!t){var a,i=r.where,o=i.use;if(delete i.use,i.location=(a=i.location)&&0!==Object.keys(a).length?i.location:void 0,i.location){if(o&&u(i.location))return;i.place===i.location.name&&(i.place="",delete i.location,r.showMap=!1)}p(e,o,i.place)}}),r.$watch("loc.search",function(e,n){"string"==typeof e&&e!==n&&e&&(r.loc.search,t.searchEventLocs(e,o.calendar._id).then(function(e){r.matchLocs=e}))}),r.$watch("search.global",function(e,n){return e!==n&&p(r.where.address)})}]}}])}),_=t.cw(function(e,n){o();Eo()().module("tkfngApp").directive("tkfAdminnav",["$document","$transitions",function(e,n){return{restrict:"A",link:function(t,a){var i=a[0],o=Array.prototype.slice.call(i.querySelectorAll(".navbar-nav.navbar-left, .navbar-nav.tkf-adminnav__center"));if(o.length){var r=o.map(function(e){return{group:e,parent:e.parentNode,before:e.nextSibling}}),s=e[0].createElement("div");s.className="tkf-adminnav__spacer";var l=i.querySelector(".navbar-nav.navbar-right"),c=o[0];l?l.parentNode.insertBefore(s,l):c.parentNode.appendChild(s);
2var d=Eo()().element('<div class="tkf-adminnav__menu-container"><button type="button" class="tkf-adminnav__burger" aria-label="Menu" aria-expanded="false" aria-controls="tkf-adminnav-menu"></button><div class="tkf-adminnav__menu" id="tkf-adminnav-menu"></div></div>')[0];c.parentNode.insertBefore(d,c);var u=d.querySelector(".tkf-adminnav__burger"),p=d.querySelector(".tkf-adminnav__menu"),m=!1,f=!1,g=0,v=function(e){f=e&&m,u.setAttribute("aria-expanded",f?"true":"false"),u.classList.toggle("active",f),p.classList.toggle("l-open",f)},h=function(){var e=!m;e&&(g=o.reduce(function(e,n){return e+n.scrollWidth},0));var n,t=s.clientWidth+(e?o.reduce(function(e,n){return e+n.clientWidth},0):0)+d.offsetWidth;n=function(e,n,t){return t?e+16>n:e>n}(g,t,m),n!==m&&(m=n,r.forEach(function(e){var n=e.group,t=e.parent,a=e.before;return m?p.appendChild(n):t.insertBefore(n,a)}),i.classList.toggle("l-collapsed",m),m||v(!1))},b=!1,y=function(){b||(b=!0,window.requestAnimationFrame(function(){b=!1,h()}))};u.addEventListener("click",function(e){e.stopPropagation(),v(!f)});var w=function(e){f&&!d.contains(e.target)&&v(!1)},_=function(e){f&&"Escape"===e.key&&v(!1)};e[0].addEventListener("mousedown",w),e[0].addEventListener("keydown",_),window.addEventListener("resize",y);var k=window.ResizeObserver?new window.ResizeObserver(y):null;k&&o.forEach(function(e){return k.observe(e)});var S=n.onSuccess({},function(){return v(!1)});t.$on("$destroy",function(){e[0].removeEventListener("mousedown",w),e[0].removeEventListener("keydown",_),window.removeEventListener("resize",y),k&&k.disconnect(),S()}),h()}}}}])}),k=t.cw(function(e,n){o(),h(),Eo()().module("tkfngApp").directive("animatedCheckbox",function(){return{restrict:"A",require:"ngModel",link:function(e,n,t){n.ready(function(){var a=new(h().N)(n[0]);e.$watch(t.ngModel,function(e){return a.updateCheckbox(e)},!0)})}}})}),S=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("buttonSpinner",function(){return{restrict:"A",scope:{spinning:"=buttonSpinner",spinningIcon:"@?",buttonPrepend:"@?",buttonAppend:"@?"},transclude:!0,template:'<span ng-if="!!buttonPrepend" ng-hide="spinning"><i class="{{ buttonPrepend }}"></i>&nbsp;</span><span ng-if="!!buttonPrepend" ng-show="spinning"><i class="{{ !!spinningIcon ? spinningIcon : \'tkf-icon-spin flaticon-circle-3\' }}"></i>&nbsp;</span><ng-transclude></ng-transclude><span ng-if="!!buttonAppend" ng-hide="spinning">&nbsp;<i class="{{ buttonAppend }}"></i></span><span ng-if="!buttonPrepend" ng-show="spinning">&nbsp;<i class="{{ !!spinningIcon ? spinningIcon : \'tkf-icon-spin flaticon-circle-3\' }}"></i></span>'}})}),x=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("customHtml",["EditorEmbedTools",function(e){return{template:Zt(),restrict:"EA",replace:!0,scope:{data:"=",onEmbedPicked:"&",doClose:"&"},controller:["$scope",function(n){var t=n.data.width,a=(t=t||"60%").endsWith("%")?"%":"px",i=t.replace(/%/g,"").replace(/px/g,"");n.viewState={units:a,manualWidth:i,code:n.data.code||""};var o=n.viewState;n.selectEmbed=function(t){if(t.stopPropagation(),o.code=(o.code||"").trim(),o.code){var a=e.contentToGenericData(o.code),i=o.manualWidth||60;a.width=i+o.units;var r=e.makeEmbedCode(a,"subscription.editor");a.width,n.onEmbedPicked({embedCode:r}).then(function(){return n.doClose()})}else n.doClose()},n.$watch("viewState.manualWidth",function(e,n){e!==n&&"%"===o.units&&e>100&&(o.manualWidth=100)}),n.$watch("viewState.units",function(e,n){e!==n&&"%"===e&&o.manualWidth>100&&(o.manualWidth=100)})}]}}])}),C=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}o(),Ct(),At(),rn(),Ue(),jn(),ue();var r=ao(),s=Xi();Eo()().module("tkfngViewer").filter("formatAttachmentCount",function(){return function(e){return e+" attachment"+(1===e?"":"s")}}).filter("namedItems",function(){return function(e){return(e||[]).filter(function(e){return e&&e.name&&(""+e.name).trim().length})}}).directive("eventGroupEditorMain",["$state","WatchHeight","LocaleCentral","TKFCollections","tkfNotify","StatusCodeHandler","$t
2imeout","CalendarSearch","Viewer","EventGroup","Forms","EventGroupEditor","TagOptions","RSVPLibrary","RSVPLinker","RSVPLinkAPI","NavHistory","$location","Editor","$q","Dialog","SubscribeAPI","LexicalBridgeService",function(e,n,a,o,l,c,d,u,p,m,f,g,v,h,b,y,w,_,k,S,x,C,T){var A=o.labelledRange(1,20);return A.unshift({label:"all",value:void 0}),{template:Qt(),restrict:"EA",scope:{},link:function(){if(p.showView(!0),At().O.isMobile.any){var e=s(".editor__main");e.hide(),setTimeout(function(){return e.show()},100)}},controller:["$scope",function(o){o.maxFutureEventsOptions=A,o.EventGroupEditor=g,o.parentIsIFrame=Ct().T.getHostProperty("inIFrame",!1),o.isWeeblyEditor=Ct().T.getHostProperty("isWeeblyEditor",!1),o.isTouchDevice=At().O.isMobile.any,o.useOverlay=!o.parentIsIFrame||o.isWeeblyEditor,o.CalendarSearch=u;var c;o.forms={},o.proxy={},o.viewState={showCustomPreview:!1,showPrivateNotes:!1,showPromotionButtonEditor:!1,locationType:"address"},o.priorityOptions=Ue().A.priorityOptions,o.statusOptions=Ue().A.statusOptions,o.statusLabel="",o.previousStartDate="",o.$watch("egs.status",function(e){var n=e||void 0;if(n&&n.name){var t=o.statusOptions.find(function(e){return e.v===n.name});o.statusLabel=t.shortLabel,o.isRescheduled=n.name.startsWith("rescheduled"),o.isOnline=n.name.endsWith("Online")}else o.statusLabel="",o.isRescheduled=!1,o.isOnline=!1;if(n){var a=n.previousStartDate;a||(a=c,o.egs.status.previousStartDate=a);var i=r.tz(a.start.millis,a.start.tzid),s=a.allDay?o.dateFormat:o.dateTimeFormat;o.previousStartDate=i.format(s)}},!0);var p=function(e){var n=e.when?e.when:e.rrule,t=n.start,a=n.allDay;o.rdateSeed={start:{millis:t.millis,tzid:t.tzid},allDay:a}};o.$on("group_invalidate",function(){f.makeFormDirty(o.forms.fEditEGS),l.status.open("Please check what you typed","error",3e3)}),o.$watch("egs.recurrence",function(e){e&&p(e)},!0),o.$watch("egs.imageSets",function(e){o.imageSets=e||[]}),o.$watch("proxy.when",function(e){e&&(o.egs.recurrence.when={start:{millis:e.start,tzid:e.tzid},allDay:e.allDay},e.end&&e.end!==e.start&&(o.egs.recurrence.when.end={millis:e.end,tzid:e.tzid}))},!0);var _,E,P=function(e,n){var t=e.tid-n.tid,a=e.rid-n.rid,i=0!==t?t:a;return i},z=function(){var e=o.egs.mods,n=o.egs.rdates.map(function(n){var t=e.find(function(e){return+e.tid===+n.tid&&e.rid===n.rid}),a=t?t.when:o.rdateSeed,i=t?t.when.start.millis:n.tid,s=t?"yes":"no",l=a.allDay?o.dateFormat:o.dateTimeFormat,c=a.start.tzid,d=r.tz(i,c);return{modified:s,allDay:a.allDay,formatted:d.format(l),tzid:c,tid:n.tid,rid:n.rid}});n.sort(P),o.rdateTable=n,g.setExtraDates(n.length>0)};function D(){var e=o.egs.recurrence.when;if(e){var n=e.start.millis,t=e.end?e.end.millis:n;o.proxy.when={start:n,end:t,allDay:e.allDay,tzid:e.start.tzid}}}o.$watch("egs.rdates",function(e){"object"===i(e)&&z()},!0),o.$watch("proxy.tags",function(e){void 0!==e&&(o.egs.tags=e.map(function(e){return e.text}))},!0);var I=null;function L(e){if(!e)return null;var n=Eo()().copy(e);return delete n.rdates,delete n.mods,delete n.exdates,n}var $=document.createElement("textarea");function F(e){return $.innerHTML=e,$.value}function M(e){if(!e)return"";var n=e.replace(/&[a-zA-Z]+;/g,function(e){return F(e)});return!(n=(n=(n=n.replace(/&#\d+;/g,function(e){return F(e)})).replace(/&#x[a-fA-F0-9]+;/g,function(e){return F(e)})).replace(/>\s+</g,"><").replace(/\s*class="[^"]*"/gi,"").replace(/<p><br\s*\/?><\/p>/gi,"").replace(/<br\s*\/?>\s*<\/(p|div|li|span)>/gi,"</$1>").replace(/<br\s*\/?>/gi,"").replace(/<span><\/span>/gi,"").replace(/<p><\/p>/gi,"").replace(/<div><\/div>/gi,"").trim())||/^\s*$/.test(n)?"":n}o.$watch("EventGroupEditor.currentGroup",function(e,t){e&&e!==t&&function(e){_&&_();_=null,E=!0,g.hasUnsavedChanges=!1,f.makeFormClean(o.forms.fEditEGS),e.imageSets=e.imageSets||[],o.egs=e,o.disableVLoc=o.hasExternalSource&&e.externalVLoc,o.imageSets=e.imageSets,e.maxFuturePublic&&(o.viewState.showMaxPublicVisible=!0);o.egs.customButton&&o.egs.customButton.noDetail&&(o.viewState.showPromotionButtonEditor=!0);if(!(p(e.recurrence),z(),c||(c=o.egs.recurrence.when))){var t=o.egs.recurrence.rrule;c={start:t.start,allDay:t.allDay}}D(),o.proxy.tags=e.tags?e.tags.map(function(e){return{text:e}}):[];var a=m.findImageSet(e,e.imageIdNg);a&&(o.imageURL=a.getPinUrl(),o.smallImageURL=a.getThumbUrl());n.heightChanged(),o.$evalAsync(function(){var e;null===(e=I=L(o.egs))||void 0===e||null===(e=e.description)||void 0===e||e.length,d(function(){E=!1,I=L(o.egs)},150),_=o.$watch("egs",function(e){if(e&&(o.disableVLoc=o.hasExternalSource&&e.externalVLoc,!E)){var n=!function(e,n){if(!e||!n)return e===n;var t=Eo()().copy(e),a=Eo()().copy(n);return void 0!==t.description&&(t.description=M(t.description)),void 0!==a.description&&(a.description=M(a.description)),JSON.stringify(t)===JSON.stringify(a)}(L(e),I);g.hasUnsavedChanges=n}},!0)})}(e)}),o.$watch("EventGroupEditor.hasUnsavedChanges",function(e,n){!1===e&&!0===n&&o.egs&&null!==I&&(I=L(o.egs))}),o.tagOptionsLoaded=!0;var O;o.matchedTagOptions=function(e){e=(e||"").trim().toLowerCase();var n=o.tagOptions.tags||[];return e?n.filter(function(n){return-1!==n.text.toLowerCase().indexOf(e)}):n}
2,o.$watch("CalendarSearch.loaded",function(n,t){var i;if("boolean"==typeof n&&n){var r=u.snapshot(),s=r.calendar,c=r.settings;if(!s)return;o.settings=c,o.calendar=s;var d=s.expFeatures||[];o.maxRepeatsFeature=-1!==d.indexOf("max-repeats"),o.isFree=s.effectiveFeatureLevel<=0,o.isFree&&C.getSubscriptionStatus().then(function(e){o.source=e.source}),o.dudaUpgrade=jn().Nd;var p=s.locale.replace(/_/g,"-").split("-");o.region=p[p.length-1],o.region,o.calTzid=s.tzid,o.ccode=rn().T[s.tzid],o.ccode,function(){var n=u.snapshot(),t=n.calendar;if(n.settings){var i=a.getDateTimeFormats({editor:!0}).dateFormat;o.dateFormat=i;var r=t.locale,s=t.use24Clock||0===r.indexOf("ru")||0===r.indexOf("zh");o.timeFormat=s?"HH:mm":"h:mm a",o.dateTimeFormat=o.dateFormat+" "+o.timeFormat,o.defaultBackUrl=e.href("edit.inter.agenda",{calname:t.name})}}(),u.uid&&"new"!==u.uid?(delete o.egs,delete o.fe,l.spinner.open(),g.loadGroup(u.calendar._id,u.uid).then(function(e){o.hasExternalSource=u.calendar.hasExternalSource()&&!!e.externalId,l.spinner.close();var n=function(e){return(e||"").trim()},t=e.where;if(t){var a=n(t.address)||n(t.place)||n(t.directions),i=t.virtualLoc,r=i&&(n(i.name)||n(i.url));o.viewState.locationType=a&&r?"both":r?"online":"address"}o.viewState.showPrivateNotes=!!e.privateNotes,o.viewState.showCustomPreview=!!e.customPreview}).catch(function(n){var t=n.status;l.spinner.close(),404===t&&(o.viewState.missingEvent=!0,e.transitionTo("edit.inter.editor404",{calname:u.calendar.name},{location:!1}))})):(e.params.template,function(e){delete o.egs,delete o.fe,o.hasExternalSource=!1;var n=!!u.calendar.allDayDefault;g.createGroup(u.calendar._id,u.calendar.tzid,n,e),e&&l.status.open("Copied Event","success",1500)}(e.params.template)),g.hasUnsavedChanges=!1,s.effectiveFeatureLevel>0&&(i=s.name,o.tagOptionsLoaded=!1,v.get({id:i}).$promise.then(function(e){e.tags.sort(function(e,n){var t=e.text.toLowerCase(),a=n.text.toLowerCase();return t>a?1:t<a?-1:0}),o.tagOptions=e}).finally(function(){return o.tagOptionsLoaded=!0})),o.$watch("EventGroupEditor.currentGroup.uid",function(n){if(n&&e.params.uid!==n){var t={calname:e.params.calname,uid:n},a=e.href(".",t);w.updatePath({params:t}),e.params.uid=n,window.history.replaceState(null,"",a)}})}}),o.$on("$destroy",function(){s(".tkfSelect__options__wrap").remove()}),o.removeRepeats=function(){var e=o.egs.recurrence.rrule;if(e){var n={millis:e.start.millis+e.duration,tzid:e.start.tzid},t={start:e.start,allDay:e.allDay,end:n};delete o.egs.recurrence.rrule,o.egs.recurrence.when=t,D()}},o.addRepeats=function(){if(o.egs.recurrence.when){var e=o.egs.recurrence.when,n=e.start.millis,t=e.start.tzid,a=(e.end?e.end.millis:n)-n,i=r.localeData().firstDayOfWeek(),s=0===i?7:i,l=r.tz(n,t).day(),c=0===l?7:l,d={start:{millis:n,tzid:t},fixedLength:!0,allDay:e.allDay,freq:"weekly",interval:1,bymonth:[],byweekno:[],bymonthday:[],byyearday:[],byday:{},byhour:[],byminute:[],bysecond:[],bysetpos:[],wkst:s,duration:a};d.byday[c]=[],delete o.egs.recurrence.when,o.egs.recurrence.rrule=d}},o.lexicalBridge=T.create(o);var N=function(e){return s("<div>"+e+"</div>")},U=function(e){return e.html()};o.addAttachment=function(e){e&&(e.preventDefault(),e.stopPropagation()),function(){if(!O){var e=S.defer(),n=e.promise,t=!1,a=o.$new();a.$on("$destroy",function(){t||e.resolve()}),a.onFilePicked=function(a){return t=!0,e.resolve(a._id),n},O=x.open(a,{template:'<div do-close="closePopup()" file-manager attachments="egs.attachments" has-rsvp="!!egs.rsvpLink" on-file-picked="onFilePicked(file)" ></div>',mode:"fullscreen",animation:"slideUp",includeInHistory:!0,onClose:function(){O=null,a.$destroy()}})}}()},o.removeImage=function(){delete o.egs.imageIdNg,o.egs.imageId="",delete o.imageURL,delete o.smallImageURL;var e=o.egs.description||"",n=N(e);n.find("[data-tkf-featured]").remove(),o.egs.description=U(n)},o.editImage=function(e){e&&(e.preventDefault(),e.stopPropagation()),k.openImagePicker(g.currentGroup.calid).then(function(e){var n=e.imageSet,a=e.addToDescription;return n?(o.egs.imageIdNg=n.id,o.imageURL=n.getPinUrl(),o.smallImageURL=n.getThumbUrl(),a&&function(e){var n=o.egs.description||"",a=N(n),i=a.find("[data-tkf-featured]");if(i.length>0)s(i[0]).attr("data-tkf-id",e.id),o.egs.description=U(a);else{var r=m.makeFeaturedImageEmbedCode(e.id);o.egs.description=r+n}o.egs.imageSets=[].concat(t(o.egs.imageSets),[e.setData]),o.imageSets=o.egs.imageSets,o.egs.imageSets}(n),S.resolve("ok")):S.resolve("ok")}
2).catch(function(e){"ALREADY_OPEN"!==e&&l.status.open("Image Update Failed","error",6e3)})},o.manageRSVP=function(){o.egs.rsvpLink?b.open(o,{rsvpLink:o.egs.rsvpLink}):h.open(o)},o.onLinked=function(e){var n=g.currentGroup,t=n.calid,a=n.uid;e?(o.egs.rsvpLink=e,a&&(l.spinner.open(),y.updateLink({calid:t,uid:a,rsvpLink:e}).then(function(){l.status.open("attached Form To Event","success",3e3)}).catch(function(){return l.status.open("Unable To Attach Form","error",6e3)}).finally(function(){return l.spinner.close()}))):(delete o.egs.rsvpLink,delete o.egs.rsvp,a&&(l.spinner.open(),y.deleteLink({calid:t,uid:a}).then(function(){l.status.open("Form Removed","success",3e3)}).catch(function(){return l.status.open("Form Remove Failed","error",6e3)}).finally(function(){return l.spinner.close()})))},o.onTagOptionsPicked=function(e){return o.tagOptionsLoaded=!1,o.calendar.$save().then(function(){o.tagOptions=e}).finally(function(){return o.tagOptionsLoaded=!0})};var B=null;o.openTagManager=function(){B||(B=x.open(o,{template:'<div tag-manager\n                   cal-name="calendar.name"\n                   on-tag-options-picked="onTagOptionsPicked(tagOptions)"\n                  do-close="closePopup()" ></div>',animation:"rotateIn",externalCloser:!1,includeInHistory:!0,"z-index":10,onClose:function(){B=null}}))}}]}}])}),T=t.cw(function(e,n){o(),a(),Eo()().module("tkfngApp").service("EventGroupEditor",["EventGroup","tkfNotify","$q","$rootScope","$timeout","$state",function(e,n,t,a,i,o){var r=this;this.hasUnsavedChanges=!1,this.repeatInvalid=!1,this.hasExtraDates=!1,this.extraDateWatcher=function(){},this.setExtraDateWatcher=function(e){r.extraDateWatcher=e,e(r.hasExtraDates)},this.setExtraDates=function(e){r.hasExtraDates=e,r.extraDateWatcher(r.hasExtraDates)},this.createGroup=function(n,t,a,i){return r.currentGroup=null,r.hasUnsavedChanges=!1,r.tzid=t,r.currentGroup=e.createWithDefaults(n,t,a,i),r.currentGroup},this.loadGroup=function(n,a){return r.currentGroup=null,r.hasUnsavedChanges=!1,e.get({calid:n,uid:a}).$promise.then(function(n){return r.currentGroup=new e(n),t.when(r.currentGroup)})},this.deleteGroup=function(){var e=t.defer(),a=!!r.currentGroup.recurrence.when;return n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:a?"Delete Event":"Delete Repeating Events",main:a?"Remove this event from your calendar":"Delete all events in this repeating group",actionLabel:a?"Delete Event":"Delete Event Group",action:function(){return e.resolve(r.doDeleteGroup())}}}),e.promise},this.doDeleteGroup=function(){return r.currentGroup?r.currentGroup.uid?(n.spinner.open(),r.currentGroup.$remove().then(function(){delete r.currentGroup}).finally(function(){return n.spinner.close()})):(delete r.currentGroup,t.resolve(!0)):(n.status.open("Nothing To Delete","error",1e4),t.reject("Nothing To Delete"))},this.saveGroup=function(){var e=r.currentGroup;if(e.customButton&&(e.customButton.label=(e.customButton.label||"").trim(),e.customButton.url=(e.customButton.url||"").trim(),e.customButton.label||e.customButton.url?e.customButton.label=e.customButton.label||"Click Here":delete e.customButton),e.organizer&&(e.organizer.name=(e.organizer.name||"").trim(),e.organizer.url&&(e.organizer.url=e.organizer.url.trim()),e.organizer.name?e.organizer.url||delete e.organizer.url:delete e.organizer),e.performers&&(e.performers=e.performers.map(function(e){var n=(e.name||"").trim(),t=(e.url||"").trim();return t?{name:n,url:t}:{name:n}}).filter(function(e){return e.name.length>0}),e.performers.length||delete e.performers),(e.priority||void 0!==e.absPriority)&&(e.priority=e.absPriority||0,e.pinned&&!e.recurrence.rrule&&(e.priority*=-1)),e.status&&(e.status.name?e.status.name.startsWith("rescheduled")||delete e.status.previousStartDate:delete e.status),e.where&&e.where.virtualLoc){var o=e.where.virtualLoc;o.url&&(o.url=o.url.trim()),o.name&&(o.name=o.name.trim()),o.info?o.infoHTML=Io()()({input:o.info,options:{attributes:{target:"_blank"}}}).replace(/\r\n/g,"<br>").replace(/\r/g,"<br>").replace(/\n/g,"<br>"):(delete o.infoHTML,delete o.info)}return e?e.title&&""!==e.title.trim()?e.uid?(n.spinner.open(),e.$update(
2).then(function(){n.status.open("Saved","success",3e3),a.$broadcast("reloadEventLocs")}).catch(function(){n.status.open("Save Failed","error",1e4)}).finally(function(){i(function(){return r.hasUnsavedChanges=!1},100),n.spinner.close()})):(n.spinner.open(),e.$save().then(function(){n.status.open("Created","success",3e3)}).catch(function(){n.status.open("Create Failed","error",1e4)}).finally(function(){i(function(){return r.hasUnsavedChanges=!1},100),n.spinner.close()})):(a.$broadcast("group_invalidate"),t.reject("invalid")):(n.status.open("Nothing To Save","error",1e4),t.reject("Nothing To Save"))},this.copyGroup=function(){var e=t.defer();return r.hasUnsavedChanges?n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"There are unsaved changes",main:"Please save your changes before copying the event",cancelLabel:"Stay Here",actionLabel:"Copy Without Saving",action:function(){r.doCopyGroup()}}}):(r.doCopyGroup(),e.resolve(!0)),e.promise},this.doCopyGroup=function(){r.hasUnsavedChanges=!1;var e=Eo()().toJson(r.currentGroup);o.go("edit.inter.groupeditor",{calname:o.params.calname,uid:"new",template:e,isCopy:!0})},this.copyGroupToCalendar=function(t){var a=JSON.parse(Eo()().toJson(r.currentGroup));delete a.uid,delete a.tid,delete a.calid,a.mods=[],a.exdates=[],a.rdates=[];var i=new e(Object.assign(a,{calid:t._id}));return n.spinner.open(),i.$save().then(function(){n.status.open("Copied to "+(t.displayName||t.name),"success",3e3)}).catch(function(){n.status.open("Copy Failed","error",1e4)}).finally(function(){return n.spinner.close()})},this.unsavedChoice=function(){var e=t.defer();return r.currentGroup&&r.hasUnsavedChanges?n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"There are unsaved changes",main:"Please save or cancel your changes before leaving the editor",cancelLabel:"Stay Here",actionLabel:"Cancel Unsaved Changes!",action:function(){r.hasUnsavedChanges=!1,e.resolve(!0)}}}):e.resolve(!0),e.promise}}])}),A=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("eventGroupEditorLeftController",["$scope","CalendarSearch","EventGroupEditor","$timeout","NavHistory","$state","tkfNotify","SupportPopup","$transitions","Auth","Calendar","SimpleSelectModel",function(e,n,t,a,i,o,r,s,l,c,d,u){var p=!1;e.isCopy=o.params.isCopy&&"new"===o.params.uid,e.otherCalendars=[],e.copyTarget={selected:null},c.getCurrentUser().then(function(e){return d.query({users:e._id}).$promise}).then(function(n){e.otherCalendars=n.filter(function(e){return"deleted"!==e.status.name&&e.name!==o.params.calname}),e.otherCalendars.length>0&&(e.calendarSelectModel=new u([{label:"Copy to calendar...",value:null}].concat(e.otherCalendars.map(function(e){return{label:e.displayName||e.name,value:e}}))))}),e.copyToCalendar=function(){e.copyTarget.selected&&t.copyGroupToCalendar(e.copyTarget.selected)},e.EventGroupEditor=t,e.NavHistory=i,e.copyGroup=function(){return t.copyGroup()},e.isSingleton=function(){var e;return!(null===(e=t.currentGroup)||void 0===e||!e.recurrence.when)},e.isSingleton,e.deleteGroup=function(){var n=f(),a=e.isSingleton?"Deleted Event":"Deleted All Repeats";t.deleteGroup().then(function(){r.status.open(a,"success",2e3),e.goBack(null,n,!0)}).catch(function(){r.status.open("Delete Failed","error",6e3)})},e.saveGroup=function(e){e.preventDefault(),e.stopPropagation(),t.saveGroup()};var m=function(n){83===n.keyCode&&(navigator.platform.match("Mac")?n.metaKey:n.ctrlKey)&&e.saveGroup(n)};function f(){var e=t.currentGroup.recurrence;return e.when?e.when.start.millis:e.rrule.start.millis}document.addEventListener("keydown",m,!1),e.$on("$destroy",function(){return document.removeEventListener("keydown",m,!1)}),e.showSupport=function(){s.open(e)},e.goBack=function(n,a,r,s){if(!s&&t.hasUnsavedChanges)return n&&n.preventDefault(),void t.unsavedChoice().then(function(){return e.goBack(n,a,r,!0)});if(t.hasUnsavedChanges=!1,!i.popPath(r)){a||(a=f());var l=o.href("edit.inter.agenda",{startms:a});window.location.assign(l)}},e.$watch("CalendarSearch.loaded",function(t,a){if(!("boolean"!=typeof t||p&&t===a)&&t){var i=n.snapshot().calendar;if(!i)return;e.isFree=i.effectiveFeatureLevel<=0,p=!0}}),l.onBefore({exiting:["edit.inter.groupeditor"]},function(e){if("edit.inter.groupeditor"!==e.to().name)return t.hasUnsavedChanges?t.unsavedChoice().then(function(){return!0}):void 0})}])}),E=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),Ct(),At(),rn(),Ue(),ue();var i=ao(),r=Xi();Eo()().module("tkfngViewer").directive("eventModEditorMain",["$state","WatchHeight","LocaleCentral","tkfNotify","StatusCodeHandler","Viewer","RSVPLinkAPI","Forms","Dialog","TagOptions","RSVPLibrary","RSVPLinker","CalendarSearch","FullScreen","EventGroup","EventModEditor","NavHistory","$location","Editor","$q","$timeout","LexicalBridgeService",function(e,n,a,o,s,l,c,d,u,p,m,f,g,v,h,b,y,w,_,k,S,x){return{template:ea(),restrict:"EA",scope:{},link:function(){if(l.showView(!0),At().O.isMobile.any){var e=r(".editor__main");e.hide(),setTimeout(function(){return e.show()},100)}},controller:["$scope",function(l){g.selectEvent(e.params),l.parentIsIFrame=Ct().T.getHostProperty("inIFrame",!1),l.isWeeblyEditor=Ct().T.getHostProperty("isWeeblyEditor",!1),l.isTouchDevice=At().O.isMobile.any,l.useOverlay=!l.parentIsIFrame||l.isWeeblyEditor,l.CalendarSearch=g,l.EventModEditor=b,l.defaultBackUrl=e.href("^",{});var v,y;l.forms={},l.proxy={},l.viewState={showCustomPreview:!1,showPrivateNotes:!1,showPromotionButtonEditor:!1,locationType:"address"},l.priorityOptions=Ue().A.priorityOptions,l.statusOptions=Ue().A.statusOptions,l.statusLabel="",l.previousStartDate="",l.$watch("mod.status",function(e){var n=e||void 0;if(n&&n.name){var t=l.statusOptions.find(function(e){return e.v===n.name});
2l.statusLabel=t.shortLabel,l.isRescheduled=n.name.startsWith("rescheduled"),l.isOnline=n.name.endsWith("Online")}else l.statusLabel="",l.isRescheduled=!1,l.isOnline=!1;if(n){var a=n.previousStartDate;a||(a=v,l.mod.status.previousStartDate=a);var o=i.tz(a.start.millis,a.start.tzid),r=a.allDay?l.dateFormat:l.dateTimeFormat;l.previousStartDate=o.format(r)}},!0),l.$on("mod_invalidate",function(){d.makeFormDirty(l.forms.fEditMod),o.status.open("Please check what you typed","error",3e3)}),l.$watch("mod.imageSets",function(e){l.imageSets=e||[]}),l.$watch("proxy.when",function(e){e&&(l.mod.when={start:{millis:e.start,tzid:e.tzid},allDay:e.allDay},e.end&&e.end!==e.start&&(l.mod.when.end={millis:e.end,tzid:e.tzid}))},!0),l.$watch("proxy.tags",function(e){void 0!==e&&(l.mod.tags=e.map(function(e){return e.text}))},!0);var w=null;function C(e){if(!e)return null;var n=Eo()().copy(e);return delete n.imageSets,delete n.imageId,n}var T=document.createElement("textarea");function A(e){return T.innerHTML=e,T.value}function E(e){if(!e)return"";var n=e.replace(/&[a-zA-Z]+;/g,function(e){return A(e)});return!(n=(n=(n=n.replace(/&#\d+;/g,function(e){return A(e)})).replace(/&#x[a-fA-F0-9]+;/g,function(e){return A(e)})).replace(/>\s+</g,"><").replace(/\s*class="[^"]*"/gi,"").replace(/<p><br\s*\/?><\/p>/gi,"").replace(/<br\s*\/?>\s*<\/(p|div|li|span)>/gi,"</$1>").replace(/<br\s*\/?>/gi,"").replace(/<span><\/span>/gi,"").replace(/<p><\/p>/gi,"").replace(/<div><\/div>/gi,"").trim())||/^\s*$/.test(n)?"":n}function P(){g.eid?(delete l.egs,delete l.mod,delete l.fe,o.spinner.open(),b.loadMod(g.calendar._id,g.eid.uid,g.eid.tid,g.eid.rid).then(function(e){o.spinner.close();var t=e.egs,a=e.mod;if(l.hasExternalSource=g.calendar.hasExternalSource()&&!!t.externalId,l.disableVLoc=l.hasExternalSource&&a.externalVLoc,a.description=a.description||t.description,a.customPreview=a.customPreview||t.customPreview,a.privateNotes=a.privateNotes||t.privateNotes,l.viewState.showPrivateNotes=!!a.privateNotes,l.viewState.showCustomPreview=!!a.customPreview,a.version=1,a.title=a.title||t.title,a.where=a.where||t.where,a.imageId=a.imageId||t.imageId,a.imageIdNg=a.imageIdNg||t.imageIdNg,a.imageSets=a.imageSets||t.imageSets,a.attachments=a.attachments||t.attachments,a.customButton=a.customButton||t.customButton,a.priority=a.priority||t.priority,!a.status&&(a.status=t.status,t.recurrence&&t.recurrence.rrule&&t.status&&t.status.previousStartDate)){var i=t.status.previousStartDate,r=t.recurrence.rrule.start.millis-i.start.millis,s=Eo()().copy(i);s.start.millis=a.when.start.millis-r,a.status={name:t.status.name,previousStartDate:s}}var c=function(e){return(e||"").trim()},d=a.where;if(d){var u=c(d.address)||c(d.place)||c(d.directions),p=d.virtualLoc,m=p&&(c(p.name)||c(p.url));l.viewState.locationType=u&&m?"both":m?"online":"address"}a.priority&&(a.absPriority=Math.abs(a.priority),a.pinned=a.priority<0),l.egs=t,l.mod=a,l.mod.customButton&&l.mod.customButton.noDetail&&(l.viewState.showPromotionButtonEditor=!0),l.imageSets=a.imageSets,y=!0;var f=h.findImageSet(a,a.imageIdNg);f&&(l.imageURL=f.getPinUrl(),l.smallImageURL=f.getThumbUrl());var _=a.when;v=v||_;var k=_.start.millis,x=_.end?_.end.millis:k;l.proxy.when={start:k,end:x,allDay:_.allDay,tzid:_.start.tzid};var T=a.tags||t.tags;l.proxy.tags=T?T.map(function(e){return{text:e}}):[],n.heightChanged(),l.$evalAsync(function(){w=C(l.mod),S(function(){y=!1,w=C(l.mod)},150),l.$watch("mod",function(e){if(l.disableVLoc=l.hasExternalSource&&e.externalVLoc,!y){var n=!function(e,n){if(!e||!n)return e===n;var t=Eo()().copy(e),a=Eo()().copy(n);return void 0!==t.description&&(t.description=E(t.description)),void 0!==a.description&&(a.description=E(a.description)),JSON.stringify(t)===JSON.stringify(a)}(C(e),w);b.hasUnsavedChanges=n}},!0)})}).catch(function(e){var n=e.status;o.spinner.close(),404===n&&s.gotoPageNotFound()})):e.transitionTo("edit.inter.editor404",{calname:g.calendar.name},{location:!1})}l.$watch("EventModEditor.hasUnsavedChanges",function(e,n){!1===e&&!0===n&&l.mod&&null!==w&&(w=C(l.mod))}),l.$on("$destroy",function(){r(".tkfSelect__options__wrap").remove()}),l.tagOptionsLoaded=!0;var z;l.matchedTagOptions=function(e){e=(e||"").trim().toLowerCase();var n=l.tagOptions.tags||[];return e?n.filter(function(n){return-1!==n.text.toLowerCase().indexOf(e)}):n},l.$watch("CalendarSearch.loaded",function(n,t){var i;
2if("boolean"==typeof n&&n){var o=g.snapshot(),r=o.calendar,s=o.settings;if(!r)return;var c=a.getDateTimeFormats().dateFormat;l.dateFormat=c;var d=r.locale,u=r.use24Clock||0===d.indexOf("ru")||0===d.indexOf("zh");l.timeFormat=u?"HH:mm":"h:mm a",l.dateTimeFormat=l.dateFormat+" "+l.timeFormat,l.settings=s,l.calendar=r;var m=r.locale.replace(/_/g,"-").split("-");l.region=m[m.length-1],l.region,l.calTzid=r.tzid,l.ccode=rn().T[r.tzid],l.ccode,r.effectiveFeatureLevel>0&&(i=r.name,l.tagOptionsLoaded=!1,p.get({id:i}).$promise.then(function(e){e.tags.sort(function(e,n){var t=e.text.toLowerCase(),a=n.text.toLowerCase();return t>a?1:t<a?-1:0}),l.tagOptions=e}).finally(function(){return l.tagOptionsLoaded=!0})),P(),l.$watch("CalendarSearch.calendar",function(n,t){if(g.loaded&&!Eo()().equals(n,t)){l.calendar=n;var a=r.locale.replace(/_/g,"-").split("-");l.region=a[a.length-1],l.region,l.ccode=rn().T[r.tzid],l.ccode,"edit"===l.mode?l.defaultBackUrl=e.href("edit.inter.agenda",{calname:n.calendar.name}):l.defaultBackUrl=e.href("viewers.inter.agenda",{calname:n.calendar.name}),P()}}),l.$watch("Viewer.settings",function(e,n){g.loaded&&!Eo()().equals(e,n)&&(l.settings=e)},!0)}});l.addAttachment=function(e){e&&(e.preventDefault(),e.stopPropagation()),function(){if(!z){var e=k.defer(),n=e.promise,t=!1,a=l.$new();a.$on("$destroy",function(){t||e.resolve()}),a.onFilePicked=function(a){return t=!0,e.resolve(a._id),n},z=u.open(a,{template:'<div do-close="closePopup()" file-manager attachments="mod.attachments" has-rsvp="!!mod.rsvpLink" on-file-picked="onFilePicked(file)" ></div>',mode:"fullscreen",animation:"slideUp",includeInHistory:!0,onClose:function(){a.$destroy(),z=null}})}}()},l.lexicalBridge=x.create(l);var D=function(e){return r("<div>"+e+"</div>")},I=function(e){return e.html()};l.removeImage=function(){delete l.mod.imageIdNg,delete l.mod.imageId,delete l.imageURL,delete l.smallImageURL;var e=l.mod.description||"",n=D(e);n.find("[data-tkf-featured]").remove(),l.mod.description=I(n)},l.manageRSVP=function(){l.mod.rsvpLink?f.open(l,{rsvpLink:l.mod.rsvpLink}):m.open(l)},l.onLinked=function(e){var n=g.eid,t=n.uid,a=n.tid,i=n.rid,r=b.currentGroup.calid;e?(l.mod.rsvpLink=e,c.updateLink({calid:r,uid:t,tid:a,rid:i,rsvpLink:e}).then(function(){o.status.open("Attached Form To Event","success",3e3)}).catch(function(){return o.status.open("Unable To Attach Form","error",6e3)}).finally(function(){return o.spinner.close()})):(delete l.mod.rsvpLink,delete l.mod.rsvp,c.deleteLink({calid:r,uid:t,tid:a,rid:i}).then(function(){o.status.open("Form Removed","success",3e3)}).catch(function(){return o.status.open("Form Remove Failed","error",6e3)}).finally(function(){return o.spinner.close()}))},l.onTagOptionsPicked=function(e){return l.tagOptionsLoaded=!1,l.calendar.$save().then(function(){l.tagOptions=e}).finally(function(){return l.tagOptionsLoaded=!0})};var L=null;l.openTagManager=function(){L||(L=u.open(l,{template:'<div tag-manager\n                   cal-name="calendar.name"\n                   on-tag-options-picked="onTagOptionsPicked(tagOptions)"\n                  do-close="closePopup()" ></div>',animation:"rotateIn",externalCloser:!1,includeInHistory:!0,"z-index":10,onClose:function(){L=null}}))},l.editImage=function(e){e&&(e.preventDefault(),e.stopPropagation()),_.openImagePicker(b.currentGroup.calid).then(function(e){var n=e.imageSet,a=e.addToDescription;if(!n)return k.resolve("ok");l.mod.imageIdNg=n.id,l.imageURL=n.getPinUrl(),l.smallImageURL=n.getThumbUrl(),a&&function(e){var n=l.mod.description||"",a=D(n),i=a.find("[data-tkf-featured]");if(i.length>0)r(i[0]).attr("data-tkf-id",e.id),l.mod.description=I(a);else{var o=h.makeFeaturedImageEmbedCode(e.id);l.mod.description=o+n}l.mod.imageSets=[].concat(t(l.mod.imageSets),[e.setData]),l.imageSets=l.mod.imageSets}(n)}).catch(function(e){"ALREADY_OPEN"!==e&&o.status.open("Image Update Failed","error",6e3)})}}]}}])}),P=t.cw(function(e,n){o(),Be(),a(),Eo()().module("tkfngApp").service("EventModEditor",["EventGroup","tkfNotify","$q","$rootScope","$timeout","$state",function(e,n,t,a,i,o){var r=this;this.hasUnsavedChanges=!1,this.currentGroup=void 0,this.loadMod=function(n,a,o,s){return r.hasUnsavedChanges=!1,r.currentGroup=void 0,e.get({calid:n,uid:a}).$promise.then(function(e){return r.currentGroup=e,r.currentMod=r.currentGroup.getMod(o,s),t.when({egs:r.currentGroup,mod:r.currentMod})}).finally(function(){return i(function(){return r.hasUnsavedChanges=!1},500)})},this.doDeleteMod=function(e,t){return n.spinner.open(),r.currentGroup.revertMod(e,t).then(function(){return i(function(){return r.hasUnsavedChanges=!1},100)}).catch(function(){return n.status.open("Nothing To Delete","error",1e4)}).finally(function(){return n.spinner.close()})},this.deleteMod=function(e,a){var i=t.defer();return n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Remove Invalid Repeat",main:"Remove this invali
2d repeat (it is not currently showing in your calendar)",actionLabel:"Remove Repeat",action:function(){return i.resolve(r.doDeleteMod(e,a))}}}),i.promise},this.copyMod=function(){var e=t.defer();return r.currentMod&&r.hasUnsavedChanges?n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"There are unsaved changes",main:"Please save your changes before copying the event",cancelLabel:"Stay Here",actionLabel:"Copy Without Saving",action:function(){r.doCopyMod()}}}):(r.doCopyMod(),e.resolve(!0)),e.promise},this.doCopyMod=function(){r.hasUnsavedChanges=!1;var e=Eo()().toJson(r.currentMod);o.go("edit.inter.groupeditor",{calname:o.params.calname,uid:"new",template:e,isCopy:!0})},this.copyModToCalendar=function(t){var a=JSON.parse(Eo()().toJson(r.currentMod));delete a.uid,delete a.tid,delete a.calid,delete a.rid,a.when&&(a.recurrence={when:a.when},delete a.when);var i=new e(Object.assign({version:2,tags:[],attachments:[],exdates:[],mods:[],rdates:[]},a,{calid:t._id}));return n.spinner.open(),i.$save().then(function(){n.status.open("Copied to "+(t.displayName||t.name),"success",3e3)}).catch(function(){n.status.open("Copy Failed","error",1e4)}).finally(function(){return n.spinner.close()})},this.saveMod=function(){r.currentMod;var e=r.currentMod;if(e.customButton&&(e.customButton.label=(e.customButton.label||"").trim(),e.customButton.url=(e.customButton.url||"").trim(),e.customButton.label||e.customButton.url?e.customButton.label=e.customButton.label||"Click Here":delete e.customButton),e.organizer&&(e.organizer.name=(e.organizer.name||"").trim(),e.organizer.url&&(e.organizer.url=e.organizer.url.trim()),e.organizer.name?e.organizer.url||delete e.organizer.url:delete e.organizer),e.performers&&(e.performers=e.performers.map(function(e){var n=(e.name||"").trim(),t=(e.url||"").trim();return t?{name:n,url:t}:{name:n}}).filter(function(e){return e.name.length>0}),e.performers.length||delete e.performers),(e.priority||void 0!==e.absPriority)&&(e.priority=e.absPriority||10,e.pinned&&(e.priority*=-1)),e.status&&(e.status.name?e.status.name.startsWith("rescheduled")||delete e.status.previousStartDate:delete e.status),e.where&&e.where.virtualLoc){var o=e.where.virtualLoc;o.url&&(o.url=o.url.trim()),o.name&&(o.name=o.name.trim()),o.info?o.infoHTML=Io()()({input:o.info,options:{attributes:{target:"_blank"}}}).replace(/\r\n/g,"<br>").replace(/\r/g,"<br>").replace(/\n/g,"<br>"):(delete o.infoHTML,delete o.info)}if(!e.title||""===e.title.trim())return a.$broadcast("mod_invalidate"),t.reject("invalid");var s=r.currentGroup.uid,l=r.currentGroup.calid;return n.spinner.open(),Be().f.update(l,s,r.currentMod).then(function(e){n.status.open("Saved","success",3e3),r.currentGroup.setMod(e),Eo()().copy(e,r.currentMod),a.$broadcast("reloadEventLocs")}).catch(function(){n.status.open("Save Failed","error",1e4)}).finally(function(){i(function(){return r.hasUnsavedChanges=!1},100),n.spinner.close()})},this.revertMod=function(){var e=t.defer();return n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Reset event to group defaults",main:"Discard modifications and revert to group defaults",actionLabel:"Revert To Group Defaults",action:function(){return e.resolve(r.doDeleteMod(r.currentMod.tid,r.currentMod.rid))}}}),e.promise},this.unsavedChoice=function(){var e=t.defer();return r.hasUnsavedChanges?n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"There are unsaved changes",main:"Please save or cancel your changes before leaving the editor",cancelLabel:"Stay Here",actionLabel:"Cancel Unsaved Changes!",action:function(){r.hasUnsavedChanges=!1,e.resolve(!0)}}}):e.resolve(!0),e.promise}}])}),z=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("eventModEditorLeftController",["$scope","EventModEditor","NavHistory","$state","CalendarSearch","tkfNotify","SupportPopup","$transitions","Auth","Calendar","SimpleSelectModel",function(e,n,t,a,i,o,r,s,l,c,d){e.EventModEditor=n,e.NavHistory=t,e.otherCalendars=[],e.copyTarget={selected:null},l.getCurrentUser().then(function(e){return c.query({users:e._id}).$promise}).then(function(n){e.otherCalendars=n.filter(function(e){return"deleted"!==e.status.name&&e.name!==a.params.calname}),e.otherCalendars.length>0&&(e.calendarSelectModel=new d([{label:"Copy to calendar...",value:null}].concat(e.otherCalendars.map(function(e){return{label:e.displayName||e.name,value:e}}))))}),e.copyToCalendar=function(){e.copyTarget.selected&&n.copyModToCalendar(e.copyTarget.selected)},e.copyMod=function(){n.copyMod()},e.revertMod=function(){var t=p();n.revertMod().then(function(){o.status.open("Reverted Event","success",2e3),e.goBack(null,t,!1)}).catch(function(){o.status.open("Revert Failed","error",6e3)})},e.deleteRDateMod=function(){var t=p(),a=n.currentMod.tid,i=n.currentMod.rid;n.currentGroup.deleteRDateMod(a,i).then(function(){n.hasUnsavedChanges=!1,o.status.open("Deleted 
2Event","success",2e3),e.goBack(null,t,!0)}).catch(function(){o.status.open("Delete Failed","error",6e3)})},e.showSupport=function(){r.open(e)},e.removeRepeat=function(){var t=p(),a=n.currentMod.tid;n.currentGroup.addExDate(a).then(function(){o.status.open("Deleted Event","success",2e3),n.hasUnsavedChanges=!1,e.goBack(null,t,!0)}).catch(function(){o.status.open("Delete Failed","error",6e3)})},e.reloadMod=function(){n.hasUnsavedChanges=!1,a.go(a.current,{},{reload:!0})},s.onBefore({exiting:["edit.inter.modeditor"]},function(e){if("edit.inter.modeditor"!==e.to().name)return n.hasUnsavedChanges?n.unsavedChoice().then(function(){return!0}):void 0}),e.saveMod=function(t){n.currentMod,t&&(t.preventDefault(),t.stopPropagation()),n.saveMod().then(function(){n.hasUnsavedChanges=!1,e.isCopy=!1})};var u=function(n){83===n.keyCode&&(navigator.platform.match("Mac")?n.metaKey:n.ctrlKey)&&e.saveMod(n)};function p(){return n.currentMod.when.start.millis}document.addEventListener("keydown",u,!1),e.$on("$destroy",function(){document.removeEventListener("keydown",u,!1)}),e.goBack=function(i,o,r,s){if(!s&&n.hasUnsavedChanges)return i&&i.preventDefault(),void n.unsavedChoice().then(function(){return e.goBack(i,o,r,!0)});if(n.hasUnsavedChanges=!1,!t.popPath(r)){o||(o=p());var l=a.href("^.agenda",{startms:o});window.location.assign(l)}}}])}),D=t.cw(function(e,n){o(),cn();var t=ao();Eo()().module("tkfngApp").filter("formatCreated",function(){return function(e){return t(e).format()}}).directive("fileManager",function(){return{template:ta(),restrict:"EA",scope:{onFilePicked:"&",attachments:"=",hasRsvp:"=",doClose
2:"&"},controller:["$scope","tkfNotify",function(e,n){var t=0;e.MAX_ATTACHMENTS=3,e.pageState={maybeHasNext:!0,search:""},e.clearSearch=function(){return e.pageState.search=""};var a=function(e){return function(n){return n.endsWith(e._id)}},i=function(n){return!!e.attachments.find(a(n))},o=e.attachments.map(function(e){return e.replace(/^rsvp:/,"")});e.hasRsvp||(e.attachments=o),cn().sN.findByIds(o).then(function(n){e.attachedFiles=n.map(function(n){return n.rsvpOnly=function(n){return!!e.attachments.find(function(e){return e==="rsvp:"+n._id})}(n),n})}).catch(function(){return console.error("problem fetching attachments")});var r=[];e.deleteFile=function(a,i){i&&(i.stopPropagation(),i.preventDefault());var o=function(n){return e.files.find(function(e){return e._id===n._id})}(a);o&&(n.spinner.open(),cn().sN.remove(o._id).then(function(){!function(n){(0,Lo.A)(e.files,function(e){return e._id===n._id}),(0,Lo.A)(e.fileProxies,function(e){return e._id===n._id}),t-=1}(a),n.status.open("Deleted File","success",3e3)}).catch(function(){n.status.open("Unable to delete file","error",6e3)}).finally(function(){n.spinner.close()}))};var s=function(){t=0;var n={},a=e.pageState.search.trim();a&&(n.name=a),cn().sN.findByCriteria(t,20,n).then(function(n){e.files=n,e.pageState.maybeHasNext=20===n.length,e.fileProxies=e.files.map(function(e){var n=Eo()().copy(e);return n.isAttached=i(e),n}),t+=n.length}).catch(function(){return console.error("problem fetching user files")})};e.loadMore=function(n){n&&n.preventDefault();var a={},o=e.pageState.search.trim();o&&(a.name=o),cn().sN.findByCriteria(t,20,a).then(function(n){n=n.filter(function(e){return-1===r.indexOf(e._id)}),Array.prototype.push.apply(e.files,n),e.pageState.maybeHasNext=20===n.length;var a=n.map(function(e){var n=Eo()().copy(e);return n.isAttached=i(e),n});Array.prototype.push.apply(e.fileProxies,a),t+=n.length}).catch(function(){return console.error("problem fetching user files")})},e.$watch("pageState.search",function(e,n){e!==n&&s()}),s(),e.toggleRsvp=function(n){var t=e.attachments.findIndex(a(n)),i=e.attachments[t].startsWith("rsvp:");e.attachments[t]=(i?"":"rsvp:")+n._id},e.toggleAttached=function(n){(0,Lo.A)(e.attachedFiles,function(e){return e._id===n._id});var t=0!==(0,Lo.A)(e.attachments,a(n)).length,i=function(n){return e.fileProxies.find(function(e){return e._id===n._id})}(n);if(i){var o=Eo()().copy(i);delete o.isAttached,e.attachments.length<e.MAX_ATTACHMENTS?(t||(e.attachments.push(o._id),e.attachedFiles.push(o)),i.isAttached=!i.isAttached):i.isAttached=!1}},e.newFileUploaded=function(a){JSON.stringify(a,null,2);var o={name:a.name,size:a.size,url:a.originalUrl,mime:a.mimeType,status:"unsaved"};cn().sN.save(o).then(function(a){!function(n){e.files.unshift(n);var a=Eo()().copy(n);a.isAttached=i(n),e.fileProxies.unshift(a),r.push(n._id),t+=1}(a),n.status.open("Added New File","success",3e3)}).catch(function(){n.status.open("File Upload Failed","error",6e3)}).finally(function(){return n.spinner.close()})}}]}})}),I=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("activeImageDialog",function(){return{template:aa(),restrict:"EA"}})}),L=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function a(e){return function(e){if(Array.isArray(e))return i(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return i(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?i(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,a)}return t}function s(e,n,a){return(n=function(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,n||"default");if("object"!=t(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}(n))in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}Pt(),o();var l=Xi();Eo()().module("tkfngApp").directive("imageLibrary",function(){return{template:ia(),restrict:"EA",scope:{dialog:"@",onImagePicked:"&",doClose
2:"&"},controller:["$scope","tkfNotify","$q","CalendarSearch","Dialog","Editor","$timeout",function(e,n,t,i,o,c,d){e.calendar=i.calendar;var u=0;e.sharedUsers=[{id:"",label:"Shared Images"}],Pt().W.querySharedUsers(e.calendar._id).then(function(n){n.forEach(function(n){e.sharedUsers.push({id:n.id,label:n.name})})}),e.pageState={maybeHasNext:!0,search:"",imageLibrary:"user",addToDescription:!0,loadedImages:!1,tags:[],tagOptions:[],selectedUser:{id:""}},e.clearSearch=function(){return e.pageState.search=""},e.dialog,e.loadMore=function(){return v(u,30,!0)},e.mode={dialog:e.dialog,select:!1},e.selectedImages=function(){return e.images.filter(function(e){return e.selected}).length};var p,m={},f=function(n){(n||[]).forEach(function(e){return m[e]=1}),e.pageState.tagOptions=Object.keys(m).sort().map(function(e){return{text:e}})},g=function(){e.pageState.selectedTags=[]};function v(i,o,c){c||(e.pageState.loadedImages=!1,e.images=[],l(".imageLibrary__imageBox").remove()),i=i||0,o=o||30,n.spinner.open();var p=t.defer(),g="builtin"===e.pageState.imageLibrary?Pt().W.queryBuiltInImageSets:"shared"===e.pageState.imageLibrary?function(n){var a=e.pageState.selectedUser.id;if(a)return Pt().W.queryImageSets(function(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?r(Object(t),!0).forEach(function(n){s(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}({ownerId:a},n));var i=t.defer(),o=i.promise,l=i.resolve;i.reject;return l([]),o}:Pt().W.queryImageSets,v={offset:i,limit:o},h=e.pageState.search.trim();return h&&(v.search=h),g(v,t).then(function(n){n.forEach(function(e){(e.tags||[]).forEach(function(e){m[e]=1})}),f(),d(function(){c?(e.images=[].concat(a(e.images),a(n)),u+=n.length,e.pageState.maybeHasNext=n.length===o):(e.images=n,u=n.length,e.pageState.maybeHasNext=n.length===o),p.resolve(n)})}).catch(function(e){n.status.open("Unexpected problem loading images","error",6e3),p.reject(e)}).finally(function(){d(function(){e.pageState.loadedImages=!0,n.spinner.close()})}),p.promise}e.tagsModified=function(){var n,t=p?Object.keys(p):[],a=(null!==(n=e.pageState.selectedTags)&&void 0!==n?n:[]).map(function(e){return e.text});return t.length!==a.length||t.length!==a.filter(function(e){return t.includes(e)}).length},e.upc={},e.toggleEdit=function(){var n=!!e.pageState.editImageName,t=e.pageState.activeImage;n&&e.changeImageDetails(t),e.pageState.editImageName=!n},e.setActiveImage=function(n){var t;if(n){e.pageState.activeImage=n;var a=null!==(t=n.setData)&&void 0!==t?t:n;e.pageState.tags=a.tags?a.tags.map(function(e){return{text:e}}):[];e.pageState.activeImageDialog=o.open(e,{template:"<active-image-dialog></active-image-dialog>",animation:"fadeIn",crossCloser:!0,"z-index":100,onClose:function(){e.pageState.editImageName=!1,e.changeImageDetails(n)}})}},e.selectMode=function(n){n&&"user"===e.pageState.imageLibrary?e.mode.select=!0:(e.mode.select=!1,e.images.forEach(function(e){return e.selected=!1}),g())},e.checkImage=function(n,t){if(e.mode.select){if(n.selected=!n.selected,t.shiftKey){var a,i,o=e.images.findIndex(function(e){return e.id===n.id});if(e.images.forEach(function(e,n){!i&&e.selected&&(n<o?a=n:n>o&&(i=n))}),i)for(var r=o+1;r<=i;r++)e.images[r].selected=!0;else if(void 0!==a)for(var s=a;s<o;s++)e.images[s].selected=!0}var l=e.images.some(function(e){return e.selected});l?(p=void 0,e.images.filter(function(e){return e.selected}).forEach(function(e){var n,t,a=null!==(t=(null!==(n=e.setData)&&void 0!==n?n:e).tags)&&void 0!==t?t:[];void 0===p?(p={},a.forEach(function(e){return p[e]=1})):Object.keys(p).forEach(function(e){a.includes(e)||delete p[e]})}),e.pageState.selectedTags=Object.keys(p).sort().map(function(e){return{text:e}})):(e.mode.select=!1,g())}else e.setActiveImage(n)},e.free=e.calendar.effectiveFeatureLevel<=0,e.removeImage=function(t){Pt().W.deleteImageSet(t.id).then(function(){e.pageState.activeImage=null,e.pageState.activeImageDialog.close(),(0,Lo.A)(e.images,function(e){return e.id===t.id}),u>0&&u--,n.status.open("Image Removed","success",3e3)})},e.deleteSelected=function(){n.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Delete Images",main:"Delete ".concat(e.selectedImages()," selected images"),actionLabel:"Delete Images",action:function(){return h()}}})};var h=function(){var t=e.images.filter(function(e){return e.selected}).map(function(e){return e.id});return e.mode.select=!1,Pt().W.deleteImageSets(t).then(function(){(0,Lo.A)(e.images,function(e){return e.selected}),u>0&&u--,n.status.open(t.length+" Images Removed","success",3e3)}).finally(function(){n.popup.close()})};e.newImageUploaded=function(t){var a=function(e){var n,t=e.substr(0,e.lastIndexOf(".png"))||e.substr(0,e.lastIndexOf(".jpg"))||e.substr(0,e.lastIndexOf(".jpeg"))||e.substr(0,e.lastIndexOf(".gif"))||e.substr(0,e.lastIndexOf(".tiff"))||e.substr(0,e.lastIndexOf(".tif"))||e.substr(0,e.lastIndexOf(".bmp"))||e;if(t.length!==e.length){var a=e.lastIndexOf(".");n=e.substring(a+1,e.length)}else n="nosuffix";return{name:t,suffix:n}}(t.name),i=a.name,o=a.suffix;n.spinner.open(),Pt().W.addImageSet({url:t.cdnUrl,name:i,suffix:o}).then(function(){return n.status.open("Image Added","success",3e3),e.pageState.imageLibrary="user",e.clearSearch(),v().then(function(n){return d(function(){return e.setActiveImage((n||[])[0])})})}).catch(function(){n.status.open("Problem Adding Image","error",3e3)}).finally(function(){return n.spinner.close()})},e.close=function(){e.pageState.activeImageDialog&&(e.pageState.activeImageDialog.close(),delete e.pageState.activeImage),e.doClose()},e.selectImage=function(n){e.onImagePicked?e.onImagePicked({imageSet:n,addToDescription:e.pageState.addToDescription}).then(function(){return e.close()}):e.close()},e.maybeChangeImageName=function(n){var t=n.setData;t&&t.name!==n.name&&n.name.trim()&&e.changeImageDetails(n)},e.changeImageDetails=function(t){var a,i=t.setData?t.setData:t,o=(null!==(a=null==i?void 0:i.tags)&&void 0!==a?a:[]).join(":"),r=e.pageState.tags.map(function(e){return e.text}).join(":");return i.name===t.name&&i.altText===t.altText&&o===r?new Promise(function(e){e(!1)}):(i.name=t.name,i.altText=t.altText,i.tags=e.pageState.tags.map(function(e){return e.text}),Pt().W.updateImageSet(t).then(function(){return e.pageState.editImageName=!1,f(i.tags),n.status.open("Changed Image Details","success",2e3),!0}).catch(function(){return n.status.open("Image Details Change Failed","error",6e3),!0}))},e.changeTags=function(){var t,a,i=(a=p?Object.keys(p):[],(null!==(t=e.pageState.selectedTags)&&void 0!==t?t:[]).map(function(e){return e.text}).filter(function(e){return!a.includes(e)})),o=function(){var n,t=p?Object.keys(p):[],a=(null!==(n=e.pageState.selectedTags)&&void 0!==n?n:[]).map(function(e){return e.text});return t.filter(function(e){return!a.includes(e)})}(),r=e.images.filter(function(e){return e.selected}).map(function(e){var n,t=null!==(n=e.setData)&&void 0!==n?n:e;
2return e.selected=!1,i.forEach(function(e){t.tags.includes(e)||t.tags.push(e)}),o.forEach(function(e){t.tags=t.tags.filter(function(n){return n!==e})}),Pt().W.updateImageSet(t)});Promise.all(r).then(function(){n.status.open("Changed Image Tags","success",2e3),e.mode.select=!1,g(),f(i)}).catch(function(){n.status.open("Image Tags Change Failed","error",6e3)})},e.removeDefaultImage=function(){Pt().W.removeDefaultImage(e.calendar._id).then(function(){e.calendar.clearDefaultImage(),n.status.open("Removed Default Image","success",2e3)}).catch(function(){n.status.open("Default Image Removal Failed","error",6e3)})},e.setDefaultImage=function(t){Pt().W.updateDefaultImage(e.calendar._id,t).then(function(){e.calendar.setDefaultImage(t),n.status.open("Changed Default Image","success",2e3)}).catch(function(){n.status.open("Default Image Update Failed","error",6e3)})},e.$watch("pageState.imageLibrary",function(n,t){n&&n!==t&&(e.images=[],e.clearSearch(),v())}),e.$watch("pageState.selectedUser.id",function(n,t){n!==t&&(e.images=[],e.clearSearch(),v())}),e.$watch("pageState.search",function(e,n){e!==n&&v()}),e.displayTags=function(){return e.pageState.tags.map(function(e){return e.text}).join(" ")},e.matchedTagOptions=function(n){n=(n||"").trim().toLowerCase();var t=e.pageState.tagOptions||[];return n?t.filter(function(e){return-1!==e.text.toLowerCase().indexOf(n)}):t},v()}]}})}),$=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}o();var a=["http://","https://","//","tel:","mailto:"],i=function(e){return a.find(function(n){return 0===e.indexOf(n)})};Eo()().module("tkfngApp").directive("linkEditor",function(){return{template:oa(),restrict:"EA",replace:!0,scope:{data:"=",doClose
2:"&"},controller:["$scope",function(e){var n=Object.assign({},e.data);e.viewState=n,t(e.doClose),"_top"!==n.target&&(n.target="_blank"),n.href=(n.href||"").trim(),n.text=(n.text||"").trim(),!n.href&&i(n.text)&&(n.href=n.text),n.canUnlink=n.href.startsWith("https://x.com"),e.cancel=function(n){n.stopPropagation(),e.doClose()},e.saveEdit=function(t,a){t.stopPropagation();var o=n.href,r=n.text,s=n.title,l=n.target;a&&(o=""),(o=(o||"").trim())&&!i(o)&&(o=o.indexOf("@")>0?"mailto:"+o:"http://"+o),"_top"!==l&&(l="_blank");var c={href:o,text:r=(r||"").trim()||o,title:s=(s||"").trim(),target:l};e.data=Object.assign(e.data,c),e.doClose()},e.$watch("viewState.href",function(t){e.data.text||n.textTouched||!e.data.onlyText||(n.text=t),n.canUnlink=(n.href||"").startsWith("https://x.com")})}]}})}),F=t.cw(function(e,n){o(),Ot(),Eo()().module("tkfngViewer").directive("privacyNotice",["Auth",function(e){return{template:ra(),restrict:"EA",controller:["$scope",function(n){e.getCurrentUser().then(function(e){n.user=e}).catch(function(e){return console.warn("no user: ",e)}),n.markPPSeen=function(){n.user.seenPP=!0,Ot().K.save(n.user).then(function(e){return n.user=e})}}]}}])}),M=t.cw(function(e,n){o(),io();var t={markup:"html",javascript:"javascript",js:"javascript",css:"css"},a=function(e){var n=e.parentElement;if(n&&"PRE"===n.tagName&&n.closest(".docs")&&(!n.parentElement||!n.parentElement.classList.contains("docs__code"))){var a=document.createElement("div");a.className="docs__code";var i=document.createElement("div");i.className="docs__code__bar";var o=document.createElement("span");o.className="docs__code__lang",o.textContent=function(e){var n=/(?:^|\s)language-([\w-]+)/.exec(e.className||""),a=n?n[1]:"";return t[a]||a}(e);var r,s=document.createElement("button");s.type="button",s.className="docs__code__copy",s.textContent="Copy",s.addEventListener("click",function(){navigator.clipboard&&navigator.clipboard.writeText(e.textContent),s.textContent="Copied",clearTimeout(r),r=setTimeout(function(){s.textContent="Copy"},1600)}),i.appendChild(o),i.appendChild(s),a.appendChild(i),n.parentNode.insertBefore(a,n),a.appendChild(n)}};Eo()().module("tkfngApp").directive("prism",function(){return{restrict:"A",scope:!0,link:function(e,n){
2n.ready(function(){var e=n.html().trim();n.html(e),Po()().highlightElement(n[0]),a(n[0])})}}}),Eo()().module("tkfngApp").directive("prismCode",function(){return{restrict:"A",link:function(e,n,t){var a=function(){var a=e.$eval(t.prismCode),i=null==a?"":String(a),o=e.$eval(t.prismLanguage)||"markup",r=Po()().languages[o];n.attr("class","language-"+o),r?n[0].innerHTML=Po()().highlight(i,r,o):n[0].textContent=i};e.$watch(t.prismCode,a),e.$watch(t.prismLanguage,a)}}})}),O=t.cw(function(e,n){o();var t=ao();Eo()().module("tkfngApp").directive("rdatePicker",["TimeSelectModel",function(e){return{template:sa(),restrict:"EA",scope:{eventGroup:"=",rdateOuter:"=rdate",showTime:"=",timeFormat:"=",dateFormat:"=",pickerLabel:"="},link:function(e){},controller:["$scope",function(n){n.rdateOuter,n.showTime,n.wkstart=t().weekday(0).day(),n.ANGULAR_DATE_FORMAT=n.dateFormat.replace(/D/g,"d").replace(/Y/g,"y"),n.pageState={};var a,i=n.dateFormat+" "+n.timeFormat;function o(){n.rdate.millis=a.valueOf()}function r(){n.textDateTime={start:{date:a.format(n.dateFormat),time:a.format(n.timeFormat)}}}n.rdate=Eo()().copy(n.rdateOuter),n.showTime,a=n.showTime?t.tz(n.rdate.tzid).add(1,"hour").startOf("hour"):t.tz(n.rdate.millis,n.rdate.tzid).seconds(0).milliseconds(0),o(),r(),n.render=function(){return r()},n.$watch("rdateOuter",function(e){n.rdate=Eo()().copy(e),a=n.showTime?t.tz(n.rdate.tzid).add(1,"hour").startOf("hour"):t.tz(n.rdate.millis,n.rdate.tzid).seconds(0).milliseconds(0),r()},!0),n.addRepeat=function(){n.eventGroup.addRDate(n.rdate.millis)},n.$watch("textDateTime.start",function(e){var r,s;e&&(r=n.textDateTime.start.date+(n.showTime?" "+n.textDateTime.start.time:""),(s=t.tz(r,i,n.rdate.tzid)).isValid()&&((a=s).format(),o()))},!0),n.selectModel=new e(n.timeFormat)}]}}])}),N=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),Nt(),He();var i=ao(),r=ro(),s=Xi();Eo()().module("tkfngApp").directive("rruleEditor",["TimeSelectModel","EventFormatter","EventGroupEditor","EventGroup","SimpleSelectModel","tkfNotify","$timeout",function(e,n,a,o,l,c,d){var u=864e5;return{template:la(),restrict:"EA",scope:{eventGroup:"=",addRepeat:"&",removeRepeats:"&",rrule:"=",isDisabled:"=",rdates:"=",mods:"=",exdates:"=",timeFormat:"=",dateFormat:"="},link:function(e){var n;e.$on("$destroy",function(){e.hideEndPicker(),s(".rrule__ends-picker").remove()}),e.showEndPicker=function(){e.viewState.showEndPicker=!0,n&&(n.destroy(),n=null),d(function(){n=new r({element:".rrule__ends-picker",target:".rrule__ends",attachment:"top left",targetAttachment:"bottom left",constraints:[{to:"window",attachment:"together"}]}),window.endPickerTether=n},0)},e.hideEndPicker=function(t,a){e.viewState.cancelHide?e.viewState.cancelHide=!1:(e.viewState.showEndPicker=!1,n&&(n.destroy(),n=null),t&&a&&(0,Nt().NF)(t))}},controller:["$scope",function(e){e.wkstart=i().weekday(0).day();var n=[1,2,3,4,5,6,7].map(function(e){return i().day(e).format("dddd")}),r=[1,2,3,4,5,6,7].map(function(e){return i().day(e).format("ddd")}),s={daily:"day",weekly:"week",monthly:"month",yearly:"year"};e.ANGULAR_DATE_FORMAT=e.dateFormat.replace(/D/g,"d").replace(/Y/g,"y"),e.unset=void 0,e.weekdays=r,e.monthWeeks=[{label:"1st",value:1},{label:"2nd",value:2},{label:"3rd",value:3},{label:"4th",value:4},{label:"5th",value:5},{label:"last",value:-1}],e.monthDates=[];for(var p=1;p<=31;p++)e.monthDates.push({value:p,label:w(p)});function m(){var n=e.rrule.interval>1?"s":"";return new l([{label:"Day"+n,value:"daily"},{label:"Week"+n,value:"weekly"},{label:"Month"+n,value:"monthly"},{label:"Year"+n,value:"yearly"}])}function f(){var e=[];e.push({value:1,label:"Every"});for(var n=2;n<13;n++)e.push({value:n,label:"Every "+n});return new l(e)}function g(e){e.splice(0,e.length)}function v(){e.rrule.byweekno=[],e.rrule.byhour=[],e.rrule.byminute=[],e.rrule.bysecond=[],e.rrule.bysetpos=[],e.rrule.bymonthday?g(e.rrule.bymonthday):e.rrule.bymonthday=[],e.rrule.byyearday=[],e.rrule.byday={}}e.negativeMonthDates=[{label:"3rd last",value:-3},{label:"2nd last",value:-2},{label:"last day",value:-1}],e.selectAllMonthDays=function(n){e.rrule.byday[n]=[1,2,3,4,-1]},e.clearMonthDays=function(n){delete e.rrule.byday[n]},e.syncProxyUntil=function(){var n=i.tz(e.rrule.until,e.rrule.start.tzid).subtract(1,"day");e.proxy.until=n.format(e.dateFormat)};var h=!1;a.setExtraDateWatcher(function(e){h!==e&&a.repeatInvalid&&(h=e,b()),h=e});var b=function(){e.viewState.untilInvalid=!1,a.repeatInvalid=!1,o.checkUntil(e.rrule)||h||(e.viewState.untilInvalid=!0,a.repeatInvalid=!0)};e.updateChangeTable=function(){b();var n=He().u.convertRRule(e.rrule),a=!0,o=e.dateFormat,r=e.dateFormat+" "+e.timeFormat,s=e.rrule.start.tzid,l=e.rrule.allDay?o:r,c=((new Date).getTime(),t(e.mods).sort(function(e,n){return e.tid-n.tid})),d=c.length>0?+c[0].tid:0,p=c.length>
20?+c[c.length-1].tid:0,m=t(e.exdates).sort(function(e,n){return e-n});m.length>0&&(d=Math.min(d,m[0]),p=Math.max(p,m[m.length-1]));var f=He().u.getReps(n,d-u,p+u),g=c.filter(function(n){return!function(n){return n.tid,n.rid,e.rdates.find(function(e){return e.tid,e.rid,0!==n.rid||n.tid===e.tid&&n.rid===e.rid})}(n)}).map(function(e){var n=e.when.allDay?o:r,t=He().u.checkModAgainst(f,+e.tid);return a=a&&t,{type:t?"changed_ok":"changed_invalid",description:"modified",originalDateTime:i(e.tid).tz(s).format(l),formattedMod:i.tz(e.when.start.millis,e.when.start.tzid).format(n),tid:e.tid,rid:e.rid}});(new Date).getTime();m.forEach(function(n){var t=e.rrule.start.tzid,o=He().u.checkModAgainst(f,+n),r=o?"removed_ok":"removed_invalid";a=a&&o,g.push({type:r,description:"removed",originalDateTime:i.tz(n,t).format(l),tid:n})}),e.viewState.hasInvalidMods=!a,e.changeTable=g.sort(function(e,n){return e.tid-n.tid})},e.removeMod=function(n,t){c.spinner.open(),e.eventGroup.revertMod(n,t).then(function(){c.status.open("Removed Invalid Repeat","success",2e3)}).catch(function(){c.status.open("Removed Failed","error",6e3)}).finally(function(){c.spinner.close()})},e.revertMod=function(n,t){e.eventGroup.revertMod(n,t).then(function(){c.status.open("Reverted Event","success",2e3)}).catch(function(){c.status.open("Revert Failed","error",6e3)}).finally(function(){c.popup.close()})},e.removeExdate=function(n){e.exdates,e.eventGroup.removeExDate(n).then(function(){e.exdates=e.exdates.filter(function(e){return e!==n}),e.updateChangeTable()})};e.convertInvalidRepeat=function(n){e.eventGroup.addRDate(n,0).then(function(){e.updateChangeTable()}).catch(function(){}).finally(function(){})},e.syncProxyCount=function(){return e.proxy.count=e.rrule.count};var y="last";function w(e){return-1===e?y:e<0?i.localeData().ordinal(-e)+" "+y:i.localeData().ordinal(e)}var _=function(e,n){return e>0&&n>0||e<0&&n<0?e-n:e<n?1:-1};function k(){var t="";switch(e.rrule.freq){case"daily":default:t="";break;case"weekly":t=function(){for(var t=e.rrule.byday,a=0,i=Object.keys(t),o=i.length;a<o;a++)void 0===t[i[a]]&&delete t[i[a]];var r=Object.keys(t).map(function(e){return n[e-1]}),l=s[e.rrule.freq],c="Every",d=e.rrule.interval;return c=1===d?c+" "+l:c+" "+d+" "+l+"s",0===r.length?c:(c+=" on ",r.length>1&&(c+=r.slice(0,r.length-1).join(", "),c+=" and "),c+=r[r.length-1])}();break;case"monthly":t="date"===e.viewState.monthlyType?function(){var n=e.rrule.bymonthday.sort(_).map(function(e){return w(e)}),t=s[e.rrule.freq],a="Every",i=e.rrule.interval;if(a=1===i?a+" "+t:a+" "+i+" "+t+"s",0===n.length)return a;a+=" on the ",n.length>1&&(a+=n.slice(0,n.length-1).join(", "),a+=" and ");var o=n.length>1?"days":"day";return a+n[n.length-1]+" "+o+"."}():function(){for(var t=e.rrule.byday,a=0,i=Object.keys(t),o=i.length;a<o;a++)void 0!==t[i[a]]&&0!==t[i[a]].length||delete t[i[a]];var r=Object.keys(t),l=s[e.rrule.freq],c="Every",d=e.rrule.interval;if(c=1===d?c+" "+l:c+" "+d+" "+l+"s",0===r.length)return c;var u=r.map(function(e){var a=t[e].sort(_).map(function(e){return w(e)}),i="";return a.length>1&&(i+=a.slice(0,a.length-1).join(", "),i+=" and "),(i+=a[a.length-1])+" "+n[e-1]});return c+=" on the ",u.length>1&&(c+=u.slice(0,u.length-1).join(", "),c+=" and the "),c+u[u.length-1]+"."}()}e.viewState.description=t}var S=function(){return e.viewState.ends="For "+e.rrule.count+" events"},x=function(){var n=i(e.rrule.until).tz(e.rrule.start.tzid).subtract(1,"days");return e.viewState.ends="Until "+n.format(e.dateFormat)},C=function(){return e.viewState.ends="Forever"};function T(){v();var n=(new i).tz(e.rrule.start.tzid);e.rrule.bymonthday.push(n.date())}function A(n){var t,a,o=(new i).tz(e.rrule.start.tzid);switch(n){case"daily":v();break;case"weekly":v(),t=i.tz(e.rrule.start.millis,e.rrule.start.tzid),a=0===t.day()?7:t.day(),e.rrule.byday[a]=[];break;case"monthly":e.viewState.monthlyType="date",T();break;case"yearly":v(),e.rrule.byyearday=[o.dayOfYear()]}e.intervalSelectModel=f()}!function(){if(e.viewState={monthlyType:"date",cancelHide:!1,showEndPicker:!1},e.proxy={},e.uid=e.eventGroup.uid,e.freqSelectModel=m(),e.intervalSelectModel=f(e.rrule.freq),e.proxy.when={start:e.rrule.start.millis,tzid:e.rrule.start.tzid,end:e.rrule.start.millis+e.rrule.duration,allDay:e.rrule.allDay},e.proxy.count=e.rrule.count,function(){if("monthly"===e.rrule.freq){var n=void 0!==e.rrule.bymonthday&&0!==e.rrule.bymonthday.length;e.viewState.monthlyType=n?"date":"day"}}(),e.rrule.count)e.viewState.rruleEndPicker="count",S();else if(e.rrule.until){e.viewState.rruleEndPicker="until";var n=i.tz(e.rrule.until,e.rrule.start.tzid);0!==n.hour()&&(n.hour()>12&&n.add(1,"day"),n.hour(0),e.rrule.until=n.valueOf()),e.syncProxyUntil(),x()}else e.viewState.rruleEndPicker="never",C();e.updateChangeTable(),k()}(),e.$watch("proxy.when",function(n){e.rrule.start={millis:n.start,tzid:n.tzid},e.rrule.allDay=n.allDay,e.rrule.duration=void 0!==n.end?n.end-n.start:0},!0),e.$watch("proxy.count",function(n,t){"number"==typeof n&&n!==t&&n>0&&n%1==0&&(e.rrule.count=n)}),e.$watch("proxy.until",function(n,t){if(n&&n!==t){var a=i.tz(n,e.dateFormat,e.rrule.start.tzid).add(1,"day");a.isValid()&&(e.rrule.until=a.valueOf())}}
2),e.$watch("rrule.interval",function(n,t){"number"==typeof n&&n!==t&&(e.freqSelectModel=m())}),e.$watch("rrule.until",function(e,n){"number"==typeof e&&e!==n&&x()}),e.$watch("rrule.count",function(e,n){"number"==typeof e&&e!==n&&S()}),e.$watch("viewState.rruleEndPicker",function(n,t){if(n&&n!==t)switch(n){case"never":delete e.rrule.count,delete e.rrule.until,delete e.proxy.count,delete e.proxy.until,C();break;case"count":delete e.rrule.until,delete e.proxy.until,e.rrule.count=10,e.syncProxyCount();break;case"until":delete e.rrule.count,delete e.proxy.count,e.rrule.until=i.tz(e.rrule.start.tzid).startOf("day").add(1,"week").valueOf(),e.syncProxyUntil()}}),e.$watch("viewState.monthlyType",function(n,t){void 0!==n&&n!==t&&("date"===n?T():function(){v();var n=(new i).tz(e.rrule.start.tzid),t=n.date(),a=(0===n.day()?7:n.day())+"",o=1+Math.floor(t/7);5===o&&(o=-1),e.rrule.byday[a]=[o]}())}),e.$watch("mods",function(n,t){n!==t&&e.updateChangeTable()}),e.$watch("rrule",function(n,t){n&&t&&!Eo()().equals(n,t)&&(n.freq!==t.freq?(n.freq,A(n.freq),k(),e.updateChangeTable()):d(function(){var a,i,o,r=e.rrule.freq;"monthly"===r?Object.keys(e.rrule.byday).forEach(function(n){e.rrule.byday[n]&&0!==e.rrule.byday[n].length||delete e.rrule.byday[n]}):Object.keys(e.rrule.byday).forEach(function(n){e.rrule.byday[n]||delete e.rrule.byday[n]}),"monthly"!==r&&"weekly"!==r||1===(i=n,o=0,0!==Object.keys(i.byday).length&&o++,0!==Object.keys(i.bymonthday).length&&o++,0!==Object.keys(i.byyearday).length&&o++,i.byday,o)||(g(e.rrule.bymonthday),a=e.rrule.byday,Object.keys(a).forEach(function(e){delete a[e]}),Object.keys(t.byday).forEach(function(n){e.rrule.byday[n]=t.byday[n]}),t.bymonthday.forEach(function(n){return e.rrule.bymonthday.push(n)})),k(),e.updateChangeTable()},0))},!0)}]}}])}),U=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("SupportPopup",["Dialog",function(e){this.open=function(n){e.open(n,{template:"<div support-popup ></div>",animation:"rotateIn",includeInHistory:!1,crossCloser:!0,onClose:function(){0}})}}])}),B=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("supportPopup",["$timeout","Auth",function(e,n){return{template:ca(),restrict:"EA",scope:{dialog:"@",doClose:"&"},controller:["$scope",function(e){n.getCurrentUser().then(function(n){var t;e.currentUser=n,e.supportUrl=(t="#################### account: "+e.currentUser.email+", page: "+window.location.href+" ####\n\n\nHi Support,\n\n","mailTo:[email protected]?body="+window.encodeURIComponent(t)),e.dudaUser=e.currentUser.isDudaUser}).catch(function(e){return console.warn("no user: ",e)})}]}}])}),R=t.cw(function(e,n){function t(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var a,i,o,r,s=[],l=!0,c=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=o.call(t)).done)&&(s.push(a.value),s.length!==n);l=!0);}catch(e){c=!0,i=e}finally{try{if(!l&&null!=t.return&&(r=t.return(),Object(r)!==r))return}finally{if(c)throw i}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o();Eo()().module("tkfngApp").directive("tagsReorderable",["$parse",function(e){return{restrict:"A",require:"ngModel",link:function(n,a,i,o){var r=a[0],s=e(i.ngModel),l=null,c=null,d=null,u=null,p=null,m=null,f=function(e){e&&1===e.nodeType&&e.matches&&e.matches("li.tag-item")&&!e.hasAttribute("draggable")&&e.setAttribute("draggable","true")},g=function(e){var n=e.getBoundingClientRect(),t=function(e){if(!e||"none"===e)return{x:0,y:0};var n=/^matrix\(([^)]+)\)$/.exec(e);if(n){var t=n[1].split(",").map(parseFloat);return{x:t[4]||0,y:t[5]||0}}if(n=/^matrix3d\(([^)]+)\)$/.exec(e)){var a=n[1].split(",").map(parseFloat);return{x:a[12]||0,y:a[13]||0}}return{x:0,y:0}}(getComputedStyle(e).transform);return{left:n.left-t.x,top:n.top-t.y,right:n.right-t.x,bottom:n.bottom-t.y,width:n.width,height:n.height}},v=function(e){var t=e.target.closest&&e.target.closest("li.tag-item");if(t&&t.parentElement===l)if(e.target.closest(".remove-button"))e.preventDefault();else{p=t;var a=s(n);m=Array.isArray(a)?a.slice():[],e.dataTransfer&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain","")),setTimeout(function(){p&&p.classList.add("tag-item--dragging")},0)}},h=function(e){if(p){e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect="move");var n=function(e){if(p&&l){for(var n=e.clientX,t=e.clientY,a=0;a<l.children.length;a++){var i=l.children[a];if(i!==p){var o=g(i);if(t<o.top)return i;if(t<=o.bottom&&n<o.left+o.width/2)return i}}return null}}(e);if(void 0!==n&&n!==p&&n!==p.nextSibling){var a,i=Array.prototype.indexOf.call(l.children,p),o=(a=new Map,Array.prototype.forEach.call(l.children,function(e){a.set(e,e.getBoundingClientRect())}),a);l.insertBefore(p,n);var r,s=Array.prototype.indexOf.call(l.children,p);if(m&&-1!==i&&-1!==s&&i!==s){var c=t(m.splice(i,1),1)[0];m.splice(s,0,c)}r=o,Array.prototype.forEach.call(l.children,function(e){var n=r.get(e);if(n){e.style.transition="none",e.style.transform="",e.offsetWidth;var t=e.getBoundingClientRect(),a=n.left-t.left,i=n.top-t.top;0===a&&0===i||(e.style.transform="translate(".concat(a,"px, ").concat(i,"px)"),e.offsetWidth,e.style.transition="transform ".concat(150,"ms ease, opacity ").concat(120,"ms ease"),e.style.transform="")}})}}},b=function(){if(m){var e=s(n);if(!Array.isArray(e)||e.length!==m.length||m.some(function(n,t){return n!==e[t]})){var t=m.slice();n.$applyAsync(function(){s.assign(n,t),o.$setDirty()})}}},y=function(e){p&&(e.preventDefault(),b())},w=function(){b(),p&&p.classList.remove("tag-item--dragging"),u&&clearTimeout(u),u=setTimeout(function(){l&&Array.prototype.forEach.call(l.children,function(e){e.style.transition="",e.style.transform=""}),u=null},170),p=null,m=null};r.addEventListener("dragstart",v),r.addEventListener("dragover",h),r.addEventListener("drop",y),r.addEventListener("dragend",w);var _=function(){return!!(l=r.querySelector("ul.tag-list"))&&(l&&l.querySelectorAll("li.tag-item").forEach(f),(c=new MutationObserver(function(e){e.forEach(function(e){return e.addedNodes.forEac
2h(f)})})).observe(l,{childList:!0}),!0)};_()||(d=new MutationObserver(function(){_()&&(d.disconnect(),d=null)})).observe(r,{childList:!0,subtree:!0}),n.$on("$destroy",function(){d&&d.disconnect(),c&&c.disconnect(),u&&clearTimeout(u),r.removeEventListener("dragstart",v),r.removeEventListener("dragover",h),r.removeEventListener("drop",y),r.removeEventListener("dragend",w)})}}}])}),G=t.cw(function(e,n){o();var t=ro();Eo()().module("tkfngApp").directive("tkfTether",["$compile","$timeout",function(e,n){var a="tkfTether",i=["constraints"];return{restrict:"A",link:function(e,o,r){var s={};if(Object.getOwnPropertyNames(r).forEach(function(n){if(n!==a&&0===n.indexOf(a)){var t=r[n],o=n.replace(a,""),l=o[0].toLowerCase()+o.slice(1);-1!==i.indexOf(l)?s[l]=e.$eval(t):s[l]=t}}),s.options){var l=e.$eval(s.options)||{};delete s.options,Object.getOwnPropertyNames(l).forEach(function(e){return s[e]=l[e]})}s.element||(s.element=o[0]);var c=new t(s);e.$on("$destroy",function(){c.destroy(),o.remove()}),n(function(){c.position(),r[a]&&(e[r[a]]=c)},0),c.position(),r[a]&&(e[r[a]]=c)}}}])}),q=t.cw(function(e,n){o(),Nt();var t=ro(),a=Xi();Eo()().module("tkfngApp").directive("tkfSelect",["$timeout",function(e){var n=0;return{template:da(),restrict:"EA",require:"ngModel",scope:{selectModel:"=",isDisabled:"=",selectOnly:"@",classPrefix:"@"},link:function(n,i,o,r){var s;n.classPrefix=(n.classPrefix||"tkf")+"-tether",n.selectOnly="true"===n.selectOnly,n.classPrefix;function l(){var e=Eo()().element(n.optionsSelector),t=n.viewState.activeListIndex,a=Eo()().element(n.optionsSelector+" li:nth-child(0n + "+(t+1)+")");if(0!==a.length){var i=a.position().top,o=e.scrollTop();setTimeout(function(){return e.scrollTop(o+i-1*a.height())},0)}}n.enableClickPane=function(){return n.viewState.clickPane=!0},n.clickClickPane=function(e,t){n.viewState.clickPane=!1,e&&t&&(0,Nt().NF)(e),n.hideMenu(!0)},n.$watch("selectModel",function(e){e&&(n.viewState.selection=e.render(r.$modelValue))}),n.viewState={menuOpen:!1,activeListIndex:0,useListSelection:!1,typing:!1,selection:"",clickPane:!1},r.$formatters.push(function(e){return n.selectModel.render(e)}),r.$render=function(){n.viewState.selection=r.$viewValue},r.$parsers.push(function(e){var t=n.selectModel.parse(e),a=t||r.$modelValue;return n.viewState.selection=n.selectModel.render(a),a}),n.$watch("viewState.selection",function(e,n){e!==n&&r.$setViewValue(e)}),n.showMenu=function(){s&&(s.destroy(),s=null),n.options=n.selectModel.getOptions();var i=n.selectModel.getBestSelectionIndex(n.viewState.selection);n.viewState.activeListIndex=-1===i?0:i,n.viewState.menuOpen=!0,n.viewState.typing=!1,n.viewState.useListSelection=!0,n.inputWidth=a(n.pickerSelector).width(),n.inputWidthExtra=n.inputWidth,e(function(){l(),n.optionsWrapSelector,s=new t({element:n.optionsWrapSelector,target:n.pickerSelector,attachment:"top left",classPrefix:n.classPrefix,targetAttachment:"bottom left",constraints:[{to:"scrollParent",attachment:"together"}]}),e(function(){l()},0)},0),n.enableClickPane()},n.hideMenu=function(e){!e&&n.viewState.clickPane&&n.clickClickPane(),l(),n.viewState.menuOpen=!1,n.viewState.typing=!1,n.viewState.useListSelection=!1,s&&(s.destroy(),s=null)},n.toggleMenu=function(){s?n.hideMenu():n.showMenu()},n.select=function(e){n.viewState.selection=e,n.hideMenu(),n.options=n.selectModel.getOptions()},n.onKeyDown=function(e){var t=s;13===e.keyCode?(e.preventDefault(),e.stopPropagation(),n.viewState.useListSelection?n.select(n.options[n.viewState.activeListIndex]):(Eo()().element("input").trigger("returnKeyPressed"),t?n.hideMenu():n.viewState.typing||n.showMenu())):40===e.keyCode?(e.preventDefault(),e.stopPropagation(),t||n.showMenu(),n.viewState.activeListIndex<n.options.length-1&&(t&&n.viewState.activeListIndex++,function(){var e=Eo()().element(n.optionsSelector),t=n.viewState.activeListIndex,a=Eo()().element(n.optionsSelector+" li:nth-child(0n + "+(t+1)+")");if(0!==a.length){var i=a.position().top,o=e.scrollTop();i>r(6)&&e.scrollTop(o+i-r(6))}function r(e){return e*a.height()}}()),n.viewState.useListSelection=!0):38===e.keyCode?(e.preventDefault(),e.stopPropagation(),n.viewState.activeListIndex>0&&(n.viewState.activeListIndex--,function(){var e=Eo()().element
2(n.optionsSelector),t=n.viewState.activeListIndex,a=Eo()().element(n.optionsSelector+" li:nth-child(0n + "+(t+1)+")");if(0!==a.length){var i=a.position().top,o=e.scrollTop();i<r(1)&&e.scrollTop(o+i-r(1))}function r(e){return e*a.height()}}()),n.viewState.useListSelection=!0):n.viewState.useListSelection=!1},n.onKeyUp=function(e){if(13===e.keyCode||40===e.keyCode||38===e.keyCode)return e.preventDefault(),e.stopPropagation(),void(n.viewState.typing=!1);n.viewState.typing=!0;var t=a(n.pickerSelector+" input");n.options=n.selectModel.getOptions(t.val());var i=n.selectModel.getBestSelectionIndex(t.val());n.viewState.activeListIndex=-1===i?0:i}},controller:["$scope",function(e){e.pickerQualifier="picker-no"+n++,e.optionsWrapSelector="."+e.pickerQualifier+".tkfSelect__options__wrap",e.optionsSelector="."+e.pickerQualifier+" .tkfSelect__options",e.pickerSelector="."+e.pickerQualifier+".tkfSelect"}]}}])}),j=t.cw(function(e,n){o(),so(),kt(),St();var t={skydrive:"onedrive","url-tab":"url"},a=function(e){var n=e&&e.sourceInfo&&e.sourceInfo.source||"unknown";return t[n]||n},i=function(e){return e.catch(function(){})},r=function(e,n){return{source:a(n),client:"angular",uploader:e,mime:n&&n.mimeType||"unknown",browser:(0,St().C)(),platform:(0,St().$)()}},s=function(e,n){return i(kt().i.log("Uploadcare","file-source",r(e,n)))},l=function(e,n,t){return function(a,o,s){!function(e,n,t,a){i(kt().i.log("Uploadcare","file-source-failed",Object.assign(r(e,t),{error:a&&a.code||n||"unknown"})))}(t,a,o,s);var l=s&&s.code,c="ProjectPublicKeyRequiredError"===l||"ProjectPublicKeyInvalidError"===l;n(function(){e.spinner.close(),c&&e.status.open("Something on this device blocked the upload. Please try again in a private window, or with ad blockers and privacy extensions disabled.","error",1e4)})}};Eo()().module("tkfngApp").directive("imageUploadButton",["tkfNotify","$timeout",function(e,n){return{restrict:"EA",scope:{onUploadComplete:"&"},link:function(t,a){a.on("click",function(){Oo()().openDialog(null,"file",{crop:"free, 16:9, 4:3, 3:4, 9:16, 1:1",tabs:"file url facebook gdrive dropbox instagram evernote flickr skydrive",imagesOnly:!0,previewStep:!0,multiple:!1,clearable:!0}).done(function(a){var i=!1;a.progress(function(t){return!i&&"uploading"===t.state&&n(function(){e.spinner.open(),i=!0},0)}).done(function(a){s("editor-image",a),n(function(){t.onUploadComplete?t.onUploadComplete({info:a}):e.spinner.close()})}).fail(l(e,n,"editor-image"))})})}}}]).directive("fileUploadButton",["tkfNotify","$timeout",function(e,n){return{restrict:"EA",scope:{onUploadComplete:"&"},link:function(t,a){a.on("click",function(){Oo()().openDialog(null,"file",{tabs:"file url facebook gdrive dropbox instagram evernote flickr skydrive",imagesOnly:!1,previewStep:!1,multiple:!1,clearable:!0}).done(function(a){var i=!1;a.progress(function(t){return!i&&"uploading"===t.state&&n(function(){e.spinner.open(),i=!0},0)}).done(function(a){s("editor-file",a),n(function(){t.onUploadComplete?t.onUploadComplete({info:a}):e.spinner.close()})}).fail(l(e,n,"editor-file"))})})}}}]).directive("icsUploadButton",["tkfNotify","$timeout",function(e,n){return{restrict:"EA",scope:{onUploadComplete:"&"},link:function(t,a){a.on("click",function(){Oo()().openDialog(null,"file",{tabs:"file url gdrive dropbox",imagesOnly:!1,previewStep:!1,multiple:!1,clearable:!0,inputAcceptTypes:["text/calendar"]}).done(function(a){var i=!1;a.progress(function(t){return!i&&"uploading"===t.state&&n(function(){e.spinner.open(),i=!0},0)}).done(function(a){s("ics-import",a),n(function(){t.onUploadComplete?t.onUploadComplete({info:a}):e.spinner.close()})}).fail(l(e,n,"ics-import"))})})}}}])}),W=t.cw(function(e,n){o(),Nt(),Eo()().module("tkfngApp").directive("validateEmail",function(){return{require:"ngModel",link:function(e,n,t,a){a&&(a.$validators.email=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return a.$isEmpty(e)||Nt().TB.test(e)})}}})}),V=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("validateSubdomain",function(){function e(e){return((e=e.trim()).match(/\./g)||[]).length>=2}
2return{require:"ngModel",link:function(n,t,a,i){i&&(i.$validators.notSubdomain=function(n){return i.$isEmpty(n)||e(n)},i.$validators.notWebDomain=function(n){return i.$isEmpty(n)||!(e(t=(t=n).trim())&&0===t.toLowerCase().indexOf("www"));var t})}}})}),H=t.cw(function(e,n){o(),pn(),Eo()().module("tkfngApp").directive("vatValidator",function(){return{require:"ngModel",link:function(e,n,t,a){a.$parsers.unshift(function(n){var t=function(e,n){if(!n)return a.$setValidity("badNumber",!0),void a.$setValidity("wrongCountry",!0);var t=pn().o.validateAndCanonicaliseVatNo(e,n,!0);if("badNumber"===t.invalid)a.$setValidity("badNumber",!1),a.$setValidity("wrongCountry",!0);else{if("wrongCountry"!==t.invalid)return a.$setValidity("badNumber",!0),a.$setValidity("wrongCountry",!0),t.canonical;a.$setValidity("wrongCountry",!1),a.$setValidity("badNumber",!0)}}(e.countryCode,n);return t||n}),e.$watch("countryCode",function(e,n){if(e&&e!==n){var t=a.$viewValue;a.$setViewValue(t+" "),a.$setViewValue(t)}})}}})}),Y=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("videoPicker",["EditorEmbedTools",function(e){return{template:ua(),restrict:"EA",replace:!0,scope:{onVideoPicked:"&",doClose:"&",url:"<"},controller:["$scope","$q","CalendarSearch","$sce",function(n,t,a,i){n.viewState={url:n.url||""},n.selectVideo=function(t){t.stopPropagation();var a=e.makeEmbedCode(n.embedData,"subscription.editor");n.onVideoPicked({embedCode:a}).then(function(){return n.doClose()})},n.$watch("viewState.url",function(t){if(!t)return n.viewState.hasMatch=!1,n.embedCode="",void(n.rawEmbedCode="");e.urlToEmbedData(t).then(function(t){n.embedData=t,n.rawEmbedCode=e.makeEmbedCode(t,"subscription.editor"),n.rawEmbedCode;var a='<div class="tkf__video__content--loading">\n                      <div>Loading Preview ...</div>\n                  </div>'+n.rawEmbedCode;n.embedCode=i.trustAsHtml(a),n.viewState.hasMatch=!0}).catch(function(){n.viewState.hasMatch=!1,n.embedCode="",n.rawEmbedCode=""})})}]}}])}),K=t.cw(function(e,n){o(),sn();var t=ao();Eo()().module("tkfngApp").directive("whenPicker",["TimeSelectModel","SimpleSelectModel",function(e,n){return{template:pa(),restrict:"EA",scope:{when:"=",isDisabled:"=",timeFormat:"=",dateFormat:"=",pickerLabel:"="},controller:["$scope",function(a){var i,o;!function(e){if(e.allDay){var n=!1,a=t.tz(e.start,e.tzid),i=a.get("hours");if(0!==i){var o=a.utcOffset();(o+1440)%1440==60*i&&(n=!0,e.start-=60*o*1e3)}if("number"==typeof e.end){var r=t.tz(e.end,e.tzid),s=r.get("hours");if(0!==r.get("hours")){var l=r.utcOffset();(l+1440)%1440==60*s&&(n=!0,e.end-=60*l*1e3)}}n&&JSON.stringify(e)}}(a.when),a.dateFormat,a.timeFormat,a.disabled,a.ANGULAR_DATE_FORMAT=a.dateFormat.replace(/D/g,"d").replace(/Y/g,"y"),a.ANGULAR_DATE_FORMAT,a.pageState={editTimezone:!1};var r=a.dateFormat+" "+a.timeFormat;function s(){a.when.start=i.valueOf(),a.when.end=o.valueOf(),a.wkstart=t.tz(a.when.tzid).weekday(0).day()}function l(){var e=a.when.allDay?t(o).subtract(1,"days"):o;a.dateFormat,i.format(a.dateFormat),a.textWhen={start:{date:i.format(a.dateFormat),time:i.format(a.timeFormat)},end:{date:e.format(a.dateFormat),time:e.format(a.timeFormat)}}}function c(){var e=a.when.allDay,n=a.textWhen.start.date+(e?"":" "+a.textWhen.start.time),l=a.textWhen.end.date+(e?"":" "+a.textWhen.end.time),c=t.tz(n,r,a.when.tzid),d=t.tz(l,r,a.when.tzid);return!(!c.isValid()||!d.isValid())&&((i=c).format(),o=d,a.when.allDay&&o.add(1,"days"),s(),!0)}function d(){return(a.when.allDay?t(o).subtract(1,"days"):o).isBefore(i)}function u(){d()&&(a.when.allDay?o=t(i).add(1,"days"):(o.year(i.year()).month(i.month()).date(i.date()),d()&&(o=i))),s(),l()}a.when.end||(a.when.end=a.when.start),i=t.tz(a.when.start,a.when.tzid).seconds(0).milliseconds(0),o=t.tz(a.when.end,a.when.tzid).seconds(0).milliseconds(0),a.wkstart=t.tz(a.when.tzid).weekday(0).day(),u(),l(),a.render=function(){return l()},a.$watch("when.tzid",function(e,n){"string"==typeof e&&e!==n&&c()}),a.$watch("when.allDay",function(e,n){"boolean"==typeof e&&e!==n&&(e?(i.hours(0).minutes(0).seconds(0).milliseconds(0),o.hours(0).minutes(0).seconds(0).milliseconds(0).add(1,"day")):(i.hours(8).minutes(0).seconds(0).milliseconds(0),o.hours(9).minutes(0).seconds(0).milliseconds(0).subtract(1,"day")),s(),l())}),a.$watch("textWhen.start",function(e){e&&c()&&u()},!0),a.$watch("textWhen.end",function(e){e&&c()&&(d()&&(a.when.allDay?i=t(o).subtract(1,"days"):(i.year(o.year()).month(o.month()).date(o.date()),d()&&(i=o)
2)),s(),l())},!0),a.selectModel=new e(a.timeFormat),a.tzSelectModel=new n(sn().H)}]}}])}),J=t.cw(function(e,n){function a(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return i(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?i(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){t&&(e=t);var a=0,o=function(){};return{s:o,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,s=!0,l=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return s=e.done,e},e:function(e){l=!0,r=e},f:function(){try{s||null==t.return||t.return()}finally{if(l)throw r}}}}function i(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}t.d(n,{o:()=>r,q:()=>s}),o(),me(),te(),ae(),ee(),ne(),c();var r=(0,Ao().guI)("INSERT_IMAGE_COMMAND"),s=(0,Ao().guI)("INSERT_VIDEO_COMMAND");Eo()().module("tkfngApp").directive("tkfLexicalToolbar",["$sce","$timeout",function(e,n){return{restrict:"E",scope:{editor:"<",bridge:"<",isDisabled:"<?"},template:ma(),link:function(t){t.icons={},Object.keys(me().Z).forEach(function(n){t.icons[n]=e.trustAsHtml(me().Z[n])}),t.canUndo=!1,t.canRedo=!1,t.isBold=!1,t.isItalic=!1,t.isUnderline=!1,t.isStrikethrough=!1,t.isCode=!1,t.isLink=!1,t.blockType="paragraph",t.isImage=!1,t.isVideo=!1,t.isCustomHtml=!1,t.isClearFloat=!1;var i=null,o=null;function l(){if(i){var e=(0,Ao().vJq)();if((0,Ao().I2P)(e)){t.isBold=e.hasFormat("bold"),t.isItalic=e.hasFormat("italic"),t.isUnderline=e.hasFormat("underline"),t.isStrikethrough=e.hasFormat("strikethrough"),t.isCode=e.hasFormat("code");var n=e.anchor.getNode(),a=n.getParent();t.isLink=(0,So().FJ)(a)||(0,So().FJ)(n);var o=e.anchor.getNode(),r="root"===o.getKey()?o:o.getTopLevelElementOrThrow();if(null!==i.getElementByKey(r.getKey()))if((0,xo().HY)(r))t.blockType=r.getTag();else{var s=r.getType();["heading","quote"].includes(s)?t.blockType=r.getTag():t.blockType=s}t.isImage=!1,t.isVideo=!1,t.isCustomHtml=!1,t.isClearFloat=!1}else if((0,Ao().RTZ)(e)){var l=e.getNodes()[0];t.isImage=!!l&&(0,te().A8)(l),t.isVideo=!!l&&(0,ae().yG)(l),t.isCustomHtml=!!l&&(0,ne().NR)(l),t.isClearFloat=!!l&&(0,ee().QN)(l),t.isBold=!1,t.isItalic=!1,t.isUnderline=!1,t.isStrikethrough=!1,t.isCode=!1,t.isLink=!1}}}t.$watch("editor",function(e){var a;o&&o(),e&&(i=e,(a=t.editor)&&(o=(0,Co().Sd)(a.registerUpdateListener(function(e){e.editorState.read(function(){l(),n(function(){})})}),a.registerCommand(Ao().MvL,function(e,t){return l(),i=t,n(function(){}),!1},1),a.registerCommand(Ao().KfJ,function(e){return t.canUndo=e,n(function(){}),!1},1),a.registerCommand(Ao().WWb,function(e){return t.canRedo=e,n(function(){}),!1},1))))}),t.undo=function(){i&&i.dispatchCommand(Ao().ZKf,void 0)},t.redo=function(){i&&i.dispatchCommand(Ao().V30,void 0)},t.formatText=function(e){i&&i.dispatchCommand(Ao().mB,e)},t.formatElement=function(e){i&&i.dispatchCommand(Ao().fUS,e)},t.formatHeading=function(e){i&&i.update(function(){var n=(0,Ao().vJq)();if((0,Ao().I2P)(n)){var a=n.anchor.getNode(),i="root"===a.getKey()?null:a.getTopLevelElement();if(i&&((0,Ao().bSg)(i)||(0,Fo.Pi)(i))){var o=t.blockType===e?(0,Ao().lJ7)():(0,Fo.fi)(e);o.setFormat(i.getFormatType()),i.replace(o,!0)}}})},t.toggleList=function(e){i&&("ul"===e?"ul"!==t.blockType?i.dispatchCommand(xo().q7,void 0):i.dispatchCommand(xo().uS,void 0):"ol"!==t.blockType?i.dispatchCommand(xo().x,void 0):i.dispatchCommand(xo().uS,void 0))},t.insertImage=function(){i&&i.dispatchCommand(r,void 0)},t.insertVideo=function(){i&&i.dispatchCommand(s,void 0)},t.insertClearFloat=function(){i&&i.update(function(){var e=(0,ee().wH)(),n=(0,Ao().vJq)();if((0,Ao().I2P)(n)){n.insertNodes([e]);var t=e.getNextSibling();if(t)if((0,Ao().bSg)(t)&&t.isEmpty()){var a=t.getNextSibling();a?(t.remove(),a.selectStart()):t.select()}else t.selectStart();else{var i=(0,Ao().lJ7)();e.insertAfter(i),i.select()}}})},t.insertLink=function(){var e=t.editor,n=t.bridge;if(n&&n.openLinkEditor){var i={href:"",text:"",title:"",target:"_blank"},o=null;e.getEditorState().read(function(){var e=(0,Ao().vJq)(),n=null;if((0,Ao().RTZ)(e)){var t=e.getNodes();1===t.length&&(0,te().A8)(t[0])&&(n=t[0])}else if((0,Ao().I2P)(e)){var a=e.getNodes();1===a.length&&(0,te().A8)(a[0])&&(n=a[0])}if(n){o=n.getKey();var r=n.getLink();i=r?{href:r.url,title:r.title||"",target:r.target||"_blank",text:"",isImage:!0}:{href:"",text:"",title:"",target:"_blank",isImage:!0}}else if((0,Ao().I2P)(e)){var s=e.anchor.getNode(),l=s.getParent(),c=null;(0,So().FJ)(l)?c=l:(0,So().FJ)(s)&&(c=s),c?(i={href:c.getURL(),title:c.getTitle(),target:c.getTarget()||"_blank",text:c.getTextContent()},e.isCollapsed()?o=c.getKey():i.text=e.getTextContent()):i.text=e.getTextContent()}}),o&&(e.focus(),e.update(function(){var e=(0,Ao().nsf)(o);(0,So().FJ)(e)&&e.select()}
2)),setTimeout(function(){Promise.resolve(n.openLinkEditor(i)).then(function(n){n&&(e.focus(),e.update(function(){if(o){var e=(0,Ao().nsf)(o);if((0,So().FJ)(e)){if(n.href)if(i.isImage)e.setURL(n.href),e.setTarget(n.target),e.setTitle(n.title);else if(n.text&&n.text!==i.text){var t=(0,Ao().sTu)(n.text);e.replace(t),t.select(),(0,So().hx)(n.href,{target:n.target,title:n.title})}else e.setURL(n.href),e.setTarget(n.target),e.setTitle(n.title),e.select();else if(i.isImage){var r,s=a(e.getChildren());try{for(s.s();!(r=s.n()).done;){var l=r.value;e.insertBefore(l)}}catch(e){s.e(e)}finally{s.f()}e.remove()}else e.select(),(0,So().hx)(null);return}if((0,te().A8)(e))return void e.setLink(n.href||null,n.target,n.title)}var c=(0,Ao().vJq)();if((0,Ao().I2P)(c))if(n.text&&n.text!==i.text){var d=(0,So().zA)(n.href,{target:n.target,title:n.title}),u=(0,Ao().sTu)(n.text);d.append(u),c.insertNodes([d])}else n.href?(0,So().hx)(n.href,{target:n.target,title:n.title}):(0,So().hx)(null)}))})},50)}else{var r=prompt("Enter URL");r&&e.dispatchCommand(So().yW,r)}},t.insertEmbed=function(){var e=t.editor,n=t.bridge;if(n&&n.openEmbedPicker){var a=null,i={};e.getEditorState().read(function(){var e=(0,Ao().vJq)();if(e){for(var n=e.getNodes(),t=null,o=0;o<n.length;o++)if((0,ne().NR)(n[o])){t=n[o];break}t&&(a=t.getKey(),i=t.getEmbedData?t.getEmbedData():{code:t.getHtml(),type:"html"})}});var o=n.newScope();o.data=i,o.onEmbedPicked=function(n){return e.update(function(){if(a){var e=(0,Ao().nsf)(a);if(e&&(0,ne().NR)(e)){var t=(0,ne().Lk)(n);e.replace(t);try{t.select()}catch(e){}}}else{var i=(0,ne().Lk)(n),o=(0,Ao().vJq)();(0,Ao().I2P)(o)?o.insertNodes([i,(0,Ao().lJ7)()]):(0,Ao().NiT)().append(i,(0,Ao().lJ7)())}}),Promise.resolve(n)},n.openEmbedPicker(o,function(){o.$destroy()})}else console.warn("Bridge or openEmbedPicker not available")},t.$on("$destroy",function(){o&&o()})}}}])}),Z=t.cw(function(e,n){o();var t=ao();Eo()().module("tkfngApp").controller("editorNavLeftController",["$scope","CalendarSearch","SubmittedEvent","$state","NavHistory","Editor","tkfNotify","GoogleSync","SupportPopup","LocaleCentral","RSVPLibrary","Dialog",function(e,n,a,i,o,r,s,l,c,d,u,p){e.CalendarSearch=n,e.$state=i,e.NavHistory=o,e.goBack=function(){return o.popPath()};var m=window.self!==window.top;e.reviewTarget=m?"_self":"_blank";var f=d.getDateTimeFormats({editor:!0}).dateFormat;e.ANGULAR_DATE_FORMAT=f.replace(/D/g,"d").replace(/Y/g,"y"),e.textWhen={start:t.tz().subtract(1,"weeks").format(f)},e.startms=function(){return t.tz(e.textWhen.start,f,"UTC").valueOf()},a.totalForUser().then(function(n){e.submittedEventCount=n.count,e.eventsText=1===n.count?"Event":"Events"}).catch(function(e){return console.error("error fetching subscriptions:",e)}),e.forceSync=function(){s.spinner.open(),r.sync(n.snapshot().calendar).then(function(){s.status.open("Refreshed","success",6e3),window.location.reload(!0)}).catch(function(){return s.status.open("Refresh Failed","error",6e3)}).finally(function(){return s.spinner.close()})},e.showSupport=function(){c.open(e)},e.checkMissingCalendar=function(){s.spinner.open(),l.resetMissing(e.calname).then(function(){s.status.open("Re-enable Sync","success",6e3),e.missing_calendar=!1,window.location.reload(!0)}).catch(function(){return s.status.open("Reset Failed","error",6e3)}).finally(function(){return s.spinner.close()})},e.$watch("CalendarSearch.loaded",function(t){if(t){var a=n.snapshot().calendar;e.calname=a.name,e.showSubscriptionFeatures=a.effectiveFeatureLevel>0,a.hasEnabledGoogleSync()&&l.checkSync(a.name).then(function(n){n.valid||n.auth?e.googleSyncOk=!0:n.not_authorized?(e.googleAccountId=n.googleAccountId,s.popup.open({view:wa(),tparams:{googleAccountId:n.googleAccountId}})):n.missing_calendar&&(e.missing_calendar=!0)})}}),e.manageImages=function(){r.openImagePicker(void 0,"manage").catch(function(e){})},e.manageRSVPs=function(){u.open(e,"manage")};var g=null;e.manageTags=function(){g||(g=p.open(e,{template:'<div tag-manager\n                   cal-name="calname"\n                   do-close="closePopup()" ></div>',animation:"rotateIn",externalCloser:!1,includeInHistory:!0,"z-index":10,onClose:function(){g=null}}))}}])}),Q=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("edit",{abstract:!0,authenticate:!0,views:{"main@":{template:ha(),controller:"NewViewCtrl"}}}).state("edit.inter",{url:"/e/:calname?tags&search&startms",params:{tags:{dynamic:!0},search:{dynamic:!0},startms:{dynamic:!0}}
2,views:{"mainNav@edit":{template:va(),controller:"NavbarController"},"main@edit":{template:"<ui-view>"},"nav@edit":{template:ya(),controller:"eventEditorTopNavController"},"leftbar@edit":{template:ga(),controller:"editorNavLeftController"}}}).state("edit.inter.editor404",{url:"/missingevent?:calname",views:{"main@edit":{template:ba(),controller:["$scope","$state","NavHistory",function(e,n,t){e.goBack=function(e){e&&e.preventDefault(),t.popPath()||n.go("edit.inter.agenda",{calname:n.params.calname})}}]},"mainNav@edit":{},"nav@edit":{}}}).state("edit.inter.pinboard",{url:"/pinboard",data:{recorder:!0},template:'<div pinboard-view mode="edit" class="editor__view tkfSizeDetector"></div>',authenticate:!0}).state("edit.inter.agenda",{url:"/agenda",data:{recorder:!0},template:'<div agenda-view mode="edit" class="editor__view tkfSizeDetector"></div>',authenticate:!0}).state("edit.inter.monthly",{url:"/monthly",data:{recorder:!0},template:'<div month-view mode="edit" class="editor__view tkfSizeDetector"></div>',authenticate:!0}).state("edit.inter.upcoming",{url:"/upcoming",data:{recorder:!0},views:{"nav@edit":{template:""},"":{template:'<div upcoming-view mode="edit" class="editor__view tkfSizeDetector"></div>'}},authenticate:!0}).state("edit.inter.rsvpresponses",{url:"/rsvp-response/:uid/:tid/:rid",data:{scrollToTop:!0,recorder:!0},views:{"navbar@edit":{template:""},"":{template:'<div rsvp-report class="editor__view tkfSizeDetector"></div>'},"mainNav@edit":{}},authenticate:!0}).state("edit.inter.repeatdetail",{url:"/detail/:uid/:tid/:rid",data:{scrollToTop:!0,recorder:!0},views:{"navbar@edit":{template:""},"":{template:'<div event-detail mode="edit" class="editor__view l-detail tkfSizeDetector"></div>'},"mainNav@edit":{}},authenticate:!0}).state("edit.inter.redirect",{url:"/detail/:uid"}).state("edit.inter.detail",{url:"/detail/:uid/:tid",data:{scrollToTop:!0,recorder:!0},views:{"navbar@edit":{template:""},"":{template:'<div event-detail mode="edit" class="editor__view l-detail tkfSizeDetector"></div>'},"mainNav@edit":{}},authenticate:!0}).state("edit.inter.groupeditor",{url:"/:uid",params:{template:!1,isCopy:!1},data:{scrollToTop:!0},views:{"leftbar@edit":{template:Xt(),controller:"eventGroupEditorLeftController"},"mainNav@edit":{},"main@edit":{template:"<div event-group-editor-main></div>",controller:["$scope","$state","CalendarSearch",function(e,n,t){t.selectGroup(n.params.uid)}]}},authenticate:!0}).state("edit.inter.modeditor",{url:"/:uid/:tid/:rid",params:{isCopy:!1},data:{scrollToTop:!0},views:{"mainNav@edit":{},"leftbar@edit":{template:na(),controller:"eventModEditorLeftController"},"main@edit":{template:"<div event-mod-editor-main></div>"}},authenticate:!0})}])}),X=t.cw(function(e,n){o(),dn();var t=window.self!==window.top;Eo()().module("tkfngApp").controller("eventEditorTopNavController",["$scope","$timeout","EmbedCode",function(e,n,a){e.viewState={menu:{}},e.openMenu=function(n){e.viewState.activeMenu=n},e.closeMenu=function(t){n(function(){e.viewState.activeMenu===t&&delete e.viewState.activeMenu},300)},e.calnames=dn().B.onlineCalnames,e.isDudaEmbed=t&&dn().B.usermeta.isDudaUser,e.alerts=dn().B.alerts,e.$watch("$parent.calendar",function(n){n&&(e.callink=n.name)}),e.showEmbedCode=function(){return a.openEmbedCodePopup({calendar:e.calendar,component:"calendar",isDudaUser:dn().B.usermeta.isDudaUser})}}])}),ee=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}function r(e,n,t){return n=l(n),function(e,n){if(n&&("object"==a(n)||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,s()?Reflect.construct(n,t||[],l(e).constructor):n.apply(e,t))}function s(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(s=function(){return!!e})()}function l(e){return l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},l(e)}
2function c(e,n){return c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,n){return e.__proto__=n,e},c(e,n)}t.d(n,{QN:()=>p,is:()=>d,wH:()=>u});var d=function(e){function n(){return function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,n),r(this,n,arguments)}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),n&&c(e,n)}(n,e),t=n,o=[{key:"getType",value:function(){return"clear-float"}},{key:"clone",value:function(e){return new n(e.__key)}},{key:"importJSON",value:function(e){return u()}},{key:"importDOM",value:function(){return{div:function(e){return e.classList.contains("tkf-clear-float")?{conversion:function(){return{node:u()}},priority:2}:null}}}}],(a=[{key:"exportJSON",value:function(){return{type:"clear-float",version:1}}},{key:"createDOM",value:function(e){var n=document.createElement("div");return n.className="tkf-clear-float",n}},{key:"updateDOM",value:function(){return!1}},{key:"isInline",value:function(){return!1}},{key:"decorate",value:function(){return{type:"clear-float",nodeKey:this.__key}}},{key:"exportDOM",value:function(){var e=document.createElement("div");return e.className="tkf-clear-float",{element:e}}}])&&i(t.prototype,a),o&&i(t,o),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,a,o}(Ao().Kp7);function u(){return new d}function p(e){return e instanceof d}}),ne=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}function r(e,n,t){return n=l(n),function(e,n){if(n&&("object"==a(n)||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,s()?Reflect.construct(n,t||[],l(e).constructor):n.apply(e,t))}function s(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(s=function(){return!!e})()}function l(e){return l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},l(e)}function c(e,n){return c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,n){return e.__proto__=n,e},c(e,n)}t.d(n,{$o:()=>d,Lk:()=>u,NR:()=>p});var d=function(e){function n(e,t,a,i){var o;return function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,n),(o=r(this,n,[i])).__html=e,o.__alignment=t,o.__width=a,o}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),n&&c(e,n)}(n,e),t=n,o=[{key:"getType",value:function(){return"custom-html"}},{key:"clone",value:function(e){return new n(e.__html,e.__alignment,e.__width,e.__key)}},{key:"importJSON",value:function(e){return u(e.html,e.alignment,e.width)}},{key:"importDOM",value:function(){return{div:function(e){if(!e.classList.contains("tkf-custom-embed"))return null;var n="left";e.classList.contains("tkf__align__center")&&(n="center"),e.classList.contains("tkf__align__right")&&(n="right");var t=null;return e.style.width&&(t=e.style.width).endsWith("px")&&(t=parseInt(t,10)),{conversion:function(e){return{node:u(e.outerHTML,n,t)}},priority:2}}}}}],(a=[{key:"exportJSON",value:function(){return{type:"custom-html",html:this.__html,alignment:this.__alignment,width:this.__width,version:1}}},{key:"createDOM",value:function(e){var n=document.createElement("div");return n.className="tkf-custom-html-wrapper",n}},{key:"updateDOM",value:function(){return!1}},{key:"getHtml",value:function(){return this.__html}},{key:"setHtml",value:function(e){this.getWritable().__html=e}},{key:"setAlignment",value:function(e){this.getWritable().__alignment=e}},{key:"getEmbedData",value:function(){var e=(new DOMParser).parseFromString(this.__html,"text/html").querySelector(".tkf-custom-embed");return e?{code:e.getAttribute("data-tkf-code")||"",id:e.getAttribute("data-tkf-id")||"",width:e.getAttribute("data-tkf-width")||""}:{code:this.__html,id:"",width:""}}},{key:"isInline",value:function(){return!1}},{key:"decorate",value:function(){return{type:"custom-html",html:this.__html,alignment:this.__alignment,width:this.__width,nodeKey:this.getKey()}}},{key:"exportDOM",value:function(){var e=(new DOMParser).parseFromString(this.__html||'<div class="tkf-custom-embed"></div>',"text/html").body.firstElementChild;if(e||((e=document.createElement("div")).className="tkf-custom-embed"),e.classList.contains("tkf-custom-embed")){e.classList.remove("tkf__align__left","tkf__align__center","tkf__align__right");var n=this.__alignment||"left";e.classList.add("tkf__align__".concat(n)),this.__width&&("number"==typeof this.__width?e.style.width=this.__width+"px":e.style.width=this.__width)}return{element:e}}}])&&i(t.prototype,a),o&&i(t,o),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,a,o}(Ao().Kp7);function u(e,n,t){return new d(e,n,t)}function p(e){return e instanceof d}}),te=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,d(a.key),a)}}function o(e,n,t){return n=s(n),function(e,n){if(n&&("object"==a(n)||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,r()?Reflect.construct(n,t||[],s(e).constructor):n.apply(e,t))}function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(r=function(){return!!e})()}
2function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function l(e,n){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,n){return e.__proto__=n,e},l(e,n)}function c(e,n,t){return(n=d(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function d(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{A8:()=>m,K1:()=>u,qx:()=>p});var u=function(e){function n(e,t,a,i,r,s,l,d,u,p){var m;return function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,n),c(m=o(this,n,[s]),"__src",void 0),c(m,"__alt",void 0),c(m,"__width",void 0),c(m,"__alignment",void 0),c(m,"__id",void 0),c(m,"__featured",void 0),c(m,"__linkUrl",void 0),c(m,"__linkTarget",void 0),c(m,"__linkTitle",void 0),m.__src=e,m.__alt=t,m.__width=a,m.__alignment=i,m.__id=r,m.__featured=l,m.__linkUrl=d||null,m.__linkTarget=u||null,m.__linkTitle=p||null,m}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),n&&l(e,n)}(n,e),t=n,r=[{key:"getType",value:function(){return"tkf-image"}},{key:"clone",value:function(e){return new n(e.__src,e.__alt,e.__width,e.__alignment,e.__id,e.__key,e.__featured,e.__linkUrl,e.__linkTarget,e.__linkTitle)}},{key:"importJSON",value:function(e){return new n(e.src,e.alt,e.width,e.alignment,e.id,null,e.featured,e.linkUrl,e.linkTarget,e.linkTitle)}},{key:"importDOM",value:function(){return{a:function(e){for(var t=e.childNodes,a=null,i=0;i<t.length;i++){var o=t[i];if(1===o.nodeType&&"IMG"===o.tagName){if(a)return null;a=o}else if(3!==o.nodeType||""!==o.textContent.trim())return null}return a?{conversion:function(e){var t=e.querySelector("img");if(!t)return{node:null};var a=t.getAttribute("src"),i=t.getAttribute("alt"),o=t.getAttribute("data-tkf-id")||null,r="true"===t.getAttribute("data-tkf-featured"),s="left";t.classList.contains("tkf__align__center")&&(s="center"),t.classList.contains("tkf__align__right")&&(s="right"),t.classList.contains("tkf__align__none")&&(s="none");var l=null;return t.style.width&&(l=parseInt(t.style.width,10)),{after:function(){return[]},node:new n(a,i,l,s,o,null,r,e.getAttribute("href"),e.getAttribute("target"),e.getAttribute("title"))}},priority:2}:null},img:function(e){var t=e.getAttribute("src"),a=e.getAttribute("alt"),i=e.getAttribute("data-tkf-id")||null,o="true"===e.getAttribute("data-tkf-featured"),r="left";e.classList.contains("tkf__align__center")&&(r="center"),e.classList.contains("tkf__align__right")&&(r="right"),e.classList.contains("tkf__align__none")&&(r="none");var s=null;return e.style.width&&(s=parseInt(e.style.width,10)),{conversion:function(){return{node:new n(t,a,s,r,i,null,o)}},priority:1}}}}}],(a=[{key:"exportJSON",value:function(){return{src:this.__src,alt:this.__alt,width:this.__width,alignment:this.__alignment,id:this.__id,featured:this.__featured,linkUrl:this.__linkUrl,linkTarget:this.__linkTarget,linkTitle:this.__linkTitle,type:"tkf-image",version:1}}},{key:"createDOM",value:function(e){var n=document.createElement("span"),t=e.theme.image;return t&&(n.className=t),n}},{key:"isInline",value:function(){return!1}},{key:"updateDOM",value:function(){return!1}},{key:"exportDOM",value:function(){var e=document.createElement("img");e.setAttribute("src",this.__src),e.setAttribute("alt",this.__alt||""),null!=this.__id&&e.setAttribute("data-tkf-id",this.__id),e.setAttribute("data-tkf-mediatype","image");var n=this.__alignment||"left";e.classList.add("tkf__align__".concat(n));var t=[];if(t.push("align:".concat(n)),this.__width&&(e.style.width="".concat(this.__width,"px"),t.push("width:".concat(this.__width,"px"))),e.setAttribute("data-tkf-style",t.join(";")),this.__featured&&e.setAttribute("data-tkf-featured","true"),this.__linkUrl){var a=document.createElement("a");return a.setAttribute("href",this.__linkUrl),this.__linkTarget&&a.setAttribute("target",this.__linkTarget),this.__linkTitle&&a.setAttribute("title",this.__linkTitle),a.appendChild(e),{element:a}}return{element:e}}}
2,{key:"setWidth",value:function(e){this.getWritable().__width=e}},{key:"setSrc",value:function(e){this.getWritable().__src=e}},{key:"setAlignment",value:function(e){this.getWritable().__alignment=e}},{key:"setLink",value:function(e,n,t){var a=this.getWritable();a.__linkUrl=e||null,a.__linkTarget=n||null,a.__linkTitle=t||null}},{key:"getLink",value:function(){return this.__linkUrl?{url:this.__linkUrl,target:this.__linkTarget,title:this.__linkTitle}:null}},{key:"decorate",value:function(){return{type:"tkf-image",src:this.__src,alt:this.__alt,width:this.__width,alignment:this.__alignment,id:this.__id,nodeKey:this.getKey(),linkUrl:this.__linkUrl}}}])&&i(t.prototype,a),r&&i(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,a,r}(Ao().Kp7);function p(e){var n=e.src,t=e.alt,a=e.width,i=e.alignment,o=e.id,r=e.featured,s=e.linkUrl,l=e.linkTarget,c=e.linkTitle;return new u(n,t,a,i,o,null,r,s,l,c)}function m(e){return e instanceof u}}),ae=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,d(a.key),a)}}function o(e,n,t){return n=s(n),function(e,n){if(n&&("object"==a(n)||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,r()?Reflect.construct(n,t||[],s(e).constructor):n.apply(e,t))}function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(r=function(){return!!e})()}
2function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function l(e,n){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,n){return e.__proto__=n,e},l(e,n)}function c(e,n,t){return(n=d(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function d(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{Ep:()=>u,Qr:()=>p,yG:()=>m});var u=function(e){function n(e,t,a,i,r,s){var l;return function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,n),c(l=o(this,n,[s]),"__url",void 0),c(l,"__width",void 0),c(l,"__alignment",void 0),c(l,"__videoType",void 0),c(l,"__id",void 0),l.__url=e,l.__width=t,l.__alignment=a,l.__videoType=i,l.__id=r,l}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),n&&l(e,n)}(n,e),t=n,r=[{key:"getType",value:function(){return"tkf-video"}},{key:"clone",value:function(e){return new n(e.__url,e.__width,e.__alignment,e.__videoType,e.__id,e.__key)}},{key:"importJSON",value:function(e){return new n(e.url,e.width,e.alignment,e.videoType,e.id)}},{key:"importDOM",value:function(){return{div:function(e){if(!e.classList.contains("tkf-video"))return null;var t=e.getAttribute("data-tkf-mediatype")||"youtube",a=e.getAttribute("data-tkf-id"),i="left";e.classList.contains("tkf__align__center")&&(i="center"),e.classList.contains("tkf__align__right")&&(i="right");var o=e.querySelector("iframe"),r=o?o.getAttribute("src"):"";return r?{conversion:function(){return{node:new n(r,null,i,t,a)}},priority:1}:null}}}}],(a=[{key:"exportJSON",value:function(){return{url:this.__url,width:this.__width,alignment:this.__alignment,videoType:this.__videoType,id:this.__id,type:"tkf-video",version:1}}},{key:"createDOM",value:function(e){var n=document.createElement("div");return n.className="tkf-video-container",n}},{key:"updateDOM",value:function(){return!1}},{key:"exportDOM",value:function(){var e=document.createElement("div"),n="tkf__align__".concat(this.__alignment||"left");e.className="tkf-video ".concat(n),null!=this.__id&&e.setAttribute("data-tkf-id",this.__id),e.setAttribute("data-tkf-mediatype",this.__videoType);var t=[];this.__alignment&&t.push("align:".concat(this.__alignment)),e.setAttribute("data-tkf-style",t.join(";"));var a=document.createElement("span");a.className="tkf-video__container";var i=document.createElement("iframe");return i.src=this.__url,i.className="tkf-video__content",i.setAttribute("frameborder","0"),i.setAttribute("webkitallowfullscreen",""),i.setAttribute("mozallowfullscreen",""),i.setAttribute("allowfullscreen",""),a.appendChild(i),e.appendChild(a),{element:e}}},{key:"setAlignment",value:function(e){this.getWritable().__alignment=e}},{key:"getUrl",value:function(){return this.__url}},{key:"setUrl",value:function(e){this.getWritable().__url=e}},{key:"isInline",value:function(){return!1}},{key:"decorate",value:function(){return{type:"tkf-video",url:this.__url,width:this.__width,alignment:this.__alignment,videoType:this.__videoType,nodeKey:this.getKey()}}}])&&i(t.prototype,a),r&&i(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,a,r}(Ao().Kp7);function p(e){var n=e.url,t=e.width,a=e.alignment,i=e.videoType,o=e.id;return new u(n,t,a,i,o)}function m(e){return e instanceof u}}),ie=t.cw(function(e,n){function a(e,n,t){var a=document.createElement("div");return a.className="alignment-controls",Object.assign(a.style,{position:"absolute",bottom:"-40px",left:"50%",transform:"translateX(-50%)",backgroundColor:"white",border:"1px solid #ccc",borderRadius:"4px",padding:"0",zIndex:"100",display:"flex",gap:"0",boxShadow:"0 2px 5px rgba(0,0,0,0.2)",overflow:"hidden",
2whiteSpace:"nowrap"}),e.forEach(function(i,o){var r=i.value,s=i.label,l=document.createElement("button");l.type="button",l.textContent=s,Object.assign(l.style,{backgroundColor:n===r?"#e0e0e0":"white",border:"none",borderRight:o<e.length-1?"1px solid #ccc":"none",padding:"6px 12px",cursor:"pointer",fontSize:"12px",fontWeight:n===r?"bold":"normal",color:"#333"}),l.addEventListener("click",function(e){e.stopPropagation(),t(r)}),a.appendChild(l)}),a}t.d(n,{B8:()=>r,H8:()=>o,H9:()=>i,OO:()=>a});var i=[{value:"left",label:"Left"},{value:"center",label:"Center"},{value:"none",label:"Inline"},{value:"right",label:"Right"}],o=[{value:"left",label:"Left"},{value:"center",label:"Center"},{value:"right",label:"Right"}],r=o}),oe=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{T:()=>r}),ce();var r=function(){return e=function e(n,t){var a=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this._editor=n,this._nodeKey=t,this._data={type:"clear-float"},this._el=null,this._selectionHelper=new(ce().Z)(n,t),this._commandCleanup=(0,Co().Sd)(n.registerCommand(Ao().w$Z,function(e){return a._onDelete(e)},1),n.registerCommand(Ao().gCZ,function(e){return a._onDelete(e)},1)),this._selectionHelper.onChange(function(e){a._el&&(a._el.className="tkf-clear-float-component".concat(e?" selected":""))})},n=[{key:"render",value:function(e){var n=this;this._container=e,e.innerHTML="";var t=this._selectionHelper.isSelected(),a=document.createElement("div");a.className="tkf-clear-float-component".concat(t?" selected":""),a.addEventListener("click",function(e){e.stopPropagation(),n._selectionHelper.select()}),this._el=a,e.appendChild(a)}},{key:"update",value:function(){}},{key:"_onDelete",value:function(e){if(!this._selectionHelper.isSelected())return!1;var n=(0,Ao().nsf)(this._nodeKey);return!!n&&(e&&"function"==typeof e.preventDefault&&e.preventDefault(),n.remove(),!0)}},{key:"destroy",value:function(){this._commandCleanup&&this._commandCleanup(),this._selectionHelper&&this._selectionHelper.destroy()}}],n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}()}),re=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{q:()=>r}),ce(),ie();var r=function(){return e=function e(n,t,a){var i=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this._editor=n,this._nodeKey=t,this._data=a,this._wrapperEl=null,this._alignmentControlsEl=null,this._selectionHelper=new(ce().Z)(n,t),this._commandCleanup=(0,Co().Sd)(n.registerCommand(Ao().w$Z,function(e){return i._onDelete(e)},1),n.registerCommand(Ao().gCZ,function(e){return i._onDelete(e)},1)),this._selectionHelper.onChange(function(e){i._updateSelectionUI(e)})},n=[{key:"render",value:function(e){var n=this;this._container=e,e.innerHTML="";var t,a=this._data,i=a.alignment||"left",o="tkf__align__".concat(i),r="center"===i?"block":"inl
2ine-block",s=this._selectionHelper.isSelected();t=a.width?"number"==typeof a.width?"".concat(a.width,"px"):a.width:"100%";var l=document.createElement("div");l.className="tkf-custom-embed l-edit-mode ".concat(o).concat(s?" selected":""),Object.assign(l.style,{display:r,position:"relative",width:t,maxWidth:"100%"}),l.addEventListener("click",function(e){e.stopPropagation(),n._selectionHelper.select()});var c=document.createElement("div");c.className="tkf-custom-embed-clickBlocker";var d=document.createElement("span");d.className="l-info",d.textContent="Embed Will Appear Here",c.appendChild(d),l.appendChild(c),this._wrapperEl=l,e.appendChild(l),this._updateSelectionUI(s)}},{key:"update",value:function(e){var n=this._data;if(this._data=e,this._wrapperEl){if(e.alignment!==n.alignment){var t=e.alignment||"left",a=this._selectionHelper.isSelected();this._wrapperEl.className="tkf-custom-embed l-edit-mode tkf__align__".concat(t).concat(a?" selected":""),this._wrapperEl.style.display="center"===t?"block":"inline-block"}e.width!==n.width&&e.width&&(this._wrapperEl.style.width="number"==typeof e.width?"".concat(e.width,"px"):e.width)}}},{key:"_updateSelectionUI",value:function(e){var n=this;if(this._wrapperEl){var t=this._data.alignment||"left",a="tkf__align__".concat(t);this._wrapperEl.className="tkf-custom-embed l-edit-mode ".concat(a).concat(e?" selected":""),this._alignmentControlsEl&&(this._alignmentControlsEl.remove(),this._alignmentControlsEl=null),e&&(this._alignmentControlsEl=(0,ie().OO)(ie().B8,t,function(e){n._editor.update(function(){var t=(0,Ao().nsf)(n._nodeKey);t&&t.setAlignment(e)})}),this._alignmentControlsEl.className="custom-html-alignment-controls",this._wrapperEl.appendChild(this._alignmentControlsEl))}}},{key:"_onDelete",value:function(e){if(!this._selectionHelper.isSelected())return!1;var n=(0,Ao().nsf)(this._nodeKey);return!!n&&(e&&"function"==typeof e.preventDefault&&e.preventDefault(),n.remove(),!0)}},{key:"destroy",value:function(){this._alignmentControlsEl&&this._alignmentControlsEl.remove(),this._commandCleanup&&this._commandCleanup(),this._selectionHelper&&this._selectionHelper.destroy()}}],n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}()}),se=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var a,i,o,r,s=[],l=!0,c=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=o.call(t)).done)&&(s.push(a.value),s.length!==n);l=!0);}catch(e){c=!0,i=e}finally{try{if(!l&&null!=t.return&&(r=t.return(),Object(r)!==r))return}finally{if(c)throw i}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return o(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}function r(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,s(a.key),a)}}function s(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{H:()=>l}),le(),de(),oe(),re();var l=function(){return e=function e(n,t){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this._editor=n,this._imageSets=t,this._renderers={},this._cleanup=null},(n=[{key:"start",value:function(){var e=this,n=this._editor.registerDecoratorListener(function(n){for(var t=new Set(Object.keys(n)),o=0,r=Object.keys(e._renderers);o<r.length;o++){var s=r[o];t.has(s)||(e._renderers[s].destroy(),delete e._renderers[s])}for(var l=0,c=Object.entries(n);l<c.length;l++){var d,u=i(c[l],2),p=u[0],m=u[1];if(m&&"object"===a(m)&&m.type){var f=e._editor.getElementByKey(p);if(f){var g=e._renderers[p];if(g&&(null===(d=g._data)||void 0===d?void 0:d.type)===m.type)g.update(m);else{g&&g.destroy();var v=e._createRenderer(m.type,p,m);v&&(e._renderers[p]=v,v.render(f))}}}}}),t=this._editor.registerUpdateListener(function(n){var t=n.dirtyElements;if(t&&0!==t.size)for(var a=0,o=Object.entries(e._renderers);a<o.length;a++){var r=i(o[a],2),s=r[0],l=r[1],c=e._editor.getElementByKey(s);c&&c!==l._container&&l.render(c)}});this._cleanup=function(){n(),t()}}},{key:"_createRenderer",value:function(e,n,t){switch(e){case"tkf-image":return new(le().d)(this._editor,n,t,this._imageSets);case"tkf-video":return new(de().R)(this._editor,n,t);case"clear-float":return new(oe().T)(this._editor,n);case"custom-html":return new(re().q)(this._editor,n,t);default:return console.warn("DecoratorManager: Unknown decorator type:",e),null}}},{key:"updateImageSets",value:function(e){this._imageSets=e;for(var n=0,t=Object.values(this._renderers);n<t.length;n++){var a=t[n];a instanceof le().d&&(a._imageSets=e)}}},{key:"destroy",value:function(){for(var e=0,n=Object.values(this._renderers);e<n.length;e++)n[e].destroy();this._renderers={},this._cleanup&&(this._cleanup(),this._cleanup=null)}}])&&r(e.prototype,n),t&&r(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}()}),le=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{d:()=>r}),Pt(),ce(),ie();var r=function(){return e=function e(n,t,a,i){var o=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this._editor=n,this._nodeKey=t,this._data=a,this._imageSets=i,this._container=null,this._imgEl=null,this._isResizing=!1,this._currentWidth=a.width||"100%",this._startX=0,this._startWidth=0,this._activeHandle=null,this._maxWidth=1/0,this._alignmentControlsEl=null,this._overlayEl=null,this._handles=[],this._selectionHelper=new(ce().Z)(n,t),this._onMouseMove=this._handleMouseMove.bind(this),this._onMouseUp=this._handleMouseUp.bind(this),this._debouncedUpdateSrc=(0,Mo.A)(this._updateSrcForWidth.bind(this),200),this._commandCleanup=(0,Co().Sd)(n.registerCommand(Ao().w$Z,function(e){return o._onDelete(e)},1),n.registerCommand(Ao().gCZ,function(e){return o._onDelete(e)},1)),this._selectionHelper.onChange(function(e){o._updateSelectionUI(e)})},n=[{key:"render",value:function(e){var n=this;this._container=e,e.innerHTML="";var t=this._data,a=t.alignment||"left",i="tkf__align__".concat(a),o="center"===a?"block":"inl
2ine-block",r=document.createElement("span");r.className="tkf-image-wrapper ".concat(i);var s="number"==typeof this._currentWidth?"".concat(this._currentWidth,"px"):"100%";Object.assign(r.style,{width:s,position:"relative",display:o}),r.addEventListener("click",function(e){n._isResizing||(e.stopPropagation(),"IMG"!==e.target.tagName&&e.target!==r||n._selectionHelper.select())});var l=document.createElement("img");l.src=t.src,l.alt=t.alt||"",Object.assign(l.style,{width:"100%",display:"block"}),r.appendChild(l),this._imgEl=l,this._wrapperEl=r,e.appendChild(r),this._updateSelectionUI(this._selectionHelper.isSelected())}},{key:"update",value:function(e){if(this._data=e,this._wrapperEl){this._imgEl&&this._imgEl.src!==e.src&&(this._imgEl.src=e.src);var n=e.alignment||"left";this._wrapperEl.className="tkf-image-wrapper tkf__align__".concat(n).concat(this._selectionHelper.isSelected()?" selected":""),this._wrapperEl.style.display="center"===n?"block":"inline-block",void 0===e.width||null===e.width||this._isResizing||(this._currentWidth=e.width,this._wrapperEl.style.width="number"==typeof e.width?"".concat(e.width,"px"):"100%")}}},{key:"_updateSelectionUI",value:function(e){var n=this;if(this._wrapperEl){var t=this._data.alignment||"left";if(this._wrapperEl.className="tkf-image-wrapper tkf__align__".concat(t).concat(e?" selected":""),this._removeSelectionElements(),e){this._overlayEl=document.createElement("div"),Object.assign(this._overlayEl.style,{position:"absolute",top:"0",left:"0",right:"0",bottom:"0",border:"2px solid #2196f3",pointerEvents:"none"}),this._wrapperEl.appendChild(this._overlayEl);var a={position:"absolute",width:"12px",height:"12px",backgroundColor:"#2196f3",border:"1px solid white",borderRadius:"2px",zIndex:"10",boxShadow:"0 1px 3px rgba(0,0,0,0.2)"};[{handle:"nw",left:"-6px",top:"-6px",cursor:"nw-resize"},{handle:"ne",right:"-6px",top:"-6px",cursor:"ne-resize"},{handle:"sw",left:"-6px",bottom:"-6px",cursor:"sw-resize"},{handle:"se",right:"-6px",bottom:"-6px",cursor:"se-resize"}].forEach(function(e){var t=document.createElement("div");Object.assign(t.style,a,{cursor:e.cursor}),e.left&&(t.style.left=e.left),e.right&&(t.style.right=e.right),e.top&&(t.style.top=e.top),e.bottom&&(t.style.bottom=e.bottom),t.addEventListener("mousedown",function(t){return n._startResize(t,e.handle)}),n._wrapperEl.appendChild(t),n._handles.push(t)}),this._alignmentControlsEl=(0,ie().OO)(ie().H9,t,function(e){n._editor.update(function(){var t=(0,Ao().nsf)(n._nodeKey);t&&t.setAlignment(e)})}),this._alignmentControlsEl.className="image-alignment-controls",this._wrapperEl.appendChild(this._alignmentControlsEl)}}}},{key:"_removeSelectionElements",value:function(){this._overlayEl&&(this._overlayEl.remove(),this._overlayEl=null),this._handles.forEach(function(e){return e.remove()}),this._handles=[],this._alignmentControlsEl&&(this._alignmentControlsEl.remove(),this._alignmentControlsEl=null)}},{key:"_startResize",value:function(e,n){e.preventDefault(),e.stopPropagation(),this._isResizing=!0,this._activeHandle=n,this._startX=e.clientX,this._startWidth=this._wrapperEl.offsetWidth;var t=this._wrapperEl.closest(".editor-input");if(t){var a=window.getComputedStyle(t),i=parseFloat(a.paddingLeft)||0,o=parseFloat(a.paddingRight)||0,r=t.clientWidth-i-o;if("center"===(this._data.alignment||"left"))this._maxWidth=r-2;else{var s=window.getComputedStyle(this._wrapperEl),l=parseFloat(s.marginLeft)||0,c=parseFloat(s.marginRight)||0;this._maxWidth=r-l-c-2}}else this._maxWidth=1/0;document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp)}},{key:"_handleMouseMove",value:function(e){var n=e.clientX-this._startX,t="nw"===this._activeHandle||"sw"===this._activeHandle?-1:1,a=this._startWidth+n*t;a<50&&(a=50),a>this._maxWidth&&(a=this._maxWidth),this._currentWidth=a,this._wrapperEl.style.width="".concat(a,"px"),this._debouncedUpdateSrc(a)}},{key:"_handleMouseUp",value:function(){var e=this;this._isResizing=!1,this._activeHandle=null,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp);var n=this._currentWidth;this._editor.update(function(){var t=(0,Ao().nsf)(e._nodeKey);t&&t.setWidth(n)}),this._updateSrcForWidth(n)}},{key:"_updateSrcForWidth",value:function(e){var n=this;if(this._imageSets&&this._data.id){var t=this._imageSets.find(function(e){return e.id===n._data.id});if(t){var a=new(Pt().W)(t),i=a.findBestVariant("scaled",e),o=a.getVariantUrl(i);o&&o!==this._data.src&&this._editor.update(function(){var e=(0,Ao().nsf)(n._nodeKey);e&&e.setSrc(o)})}}}},{key:"_onDelete",value:function(e){if(!this._selectionHelper.isSelected())return!1;var n=(0,Ao().nsf)(this._nodeKey);return!!n&&(e&&"function"==typeof e.preventDefault&&e.preventDefault(),n.remove(),!0)}},{key:"destroy",value:function(){this._removeSelectionElements(),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),this._commandCleanup&&this._commandCleanup(),this._selectionHelper&&this._selectionHelper.destroy(),this._debouncedUpdateSrc&&this._debouncedUpdateSrc.cancel()}}],n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}()}),ce=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return o(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){t&&(e=t);var a=0,i=function(){};return{s:i,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:i}
2}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,s=!0,l=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return s=e.done,e},e:function(e){l=!0,r=e},f:function(){try{s||null==t.return||t.return()}finally{if(l)throw r}}}}function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}function r(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,s(a.key),a)}}function s(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{Z:()=>l});var l=function(){return e=function e(n,t){var a=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this._editor=n,this._nodeKey=t,this._isSelected=!1,this._onChangeCallbacks=[],this._cleanup=n.registerUpdateListener(function(e){e.editorState.read(function(){var e=(0,Ao().vJq)(),n=!1;(0,Ao().RTZ)(e)&&(n=e.has(a._nodeKey)),n!==a._isSelected&&(a._isSelected=n,a._notifyChange())})})},(n=[{key:"isSelected",value:function(){return this._isSelected}},{key:"setSelected",value:function(e){var n=this;this._editor.update(function(){if(e){var t=(0,Ao().rUs)();t.add(n._nodeKey),(0,Ao().n1P)(t)}else{var a=(0,Ao().vJq)();if((0,Ao().RTZ)(a)){var i=a.clone();i.delete(n._nodeKey),(0,Ao().n1P)(i)}}})}},{key:"clearSelection",value:function(){this._editor.update(function(){(0,Ao().n1P)(null)})}},{key:"select",value:function(){var e=this;this._editor.update(function(){var n=(0,Ao().rUs)();n.add(e._nodeKey),(0,Ao().n1P)(n)})}},{key:"onChange",value:function(e){this._onChangeCallbacks.push(e)}},{key:"_notifyChange",value:function(){var e,n=i(this._onChangeCallbacks);try{for(n.s();!(e=n.n()).done;)(0,e.value)(this._isSelected)}catch(e){n.e(e)}finally{n.f()}}},{key:"destroy",value:function(){this._cleanup&&(this._cleanup(),this._cleanup=null),this._onChangeCallbacks=[]}}])&&r(e.prototype,n),t&&r(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}()}),de=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{R:()=>r}),ce(),ie();var r=function(){return e=function e(n,t,a){var i=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this._editor=n,this._nodeKey=t,this._data=a,this._wrapperEl=null,this._overlayEl=null,this._alignmentControlsEl=null,this._selectionHelper=new(ce().Z)(n,t),this._commandCleanup=(0,Co().Sd)(n.registerCommand(Ao().w$Z,function(e){return i._onDelete(e)},1),n.registerCommand(Ao().gCZ,function(e){return i._onDelete(e)},1)),this._selectionHelper.onChange(function(e){i._updateSelectionUI(e)})},n=[{key:"render",value:function(e){var n=this;this._container=e,e.innerHTML="";var t=this._data,a=t.alignment||"left",i="tkf__align__".concat(a),o=this._selectionHelper.isSelected(),r=document.createElement("div");r.className="tkf-video tkf-video-wrapper ".concat(i).concat(o?" selected":"");var s=t.width?"".concat(t.width,"px"):"";Object.assign(r.style,{width:s,position:"relative",display:"block"}),r.contentEditable="false",r.addEventListener("click",function(e){e.target.closest(".tkf-video-wrapper")&&(e.stopPropagation(),n._selectionHelper.select())});var l=document.createElement("div");l.className="tkf-video__container",Object.assign(l.style,{display:"block",position:"relative",width:"100%",paddingBottom:"56.25%",height:"0",overflow:"hidden"});var c=document.createElement("iframe");c.src=t.url,c.className="tkf-video__content",c.setAttribute("frameborder","0"),c.allowFullscreen=!0,Object.assign(c.style,{width:"100%",height:"100%",display:"block",position:"absolute",top:"0",left:"0"}),l.appendChild(c);var d=document.createElement("div");d.className="video-overlay",Object.assign(d.style,{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",zIndex:"10",cursor:"pointer",border:o?"2px solid #2196f3":"none",backgroundColor:"transparent"}),l.appendChild(d),r.appendChild(l),this._wrapperEl=r,this._overlayEl=d,e.appendChild(r),this._updateSelectionUI(o)}},{key:"update",value:function(e){var n=this._data;if(this._data=e,this._wrapperEl){if(e.alignment!==n.alignment){var t=e.alignment||"left",a=this._selectionHelper.isSelected();this._wrapperEl.className="tkf-video tkf-video-wrapper tkf__align__".concat(t).concat(a?" selected":"")}
2if(e.url!==n.url){var i=this._wrapperEl.querySelector("iframe");i&&(i.src=e.url)}}}},{key:"_updateSelectionUI",value:function(e){var n=this;if(this._wrapperEl){var t=this._data.alignment||"left";this._wrapperEl.className="tkf-video tkf-video-wrapper tkf__align__".concat(t).concat(e?" selected":""),this._overlayEl&&(this._overlayEl.style.border=e?"2px solid #2196f3":"none"),this._alignmentControlsEl&&(this._alignmentControlsEl.remove(),this._alignmentControlsEl=null),e&&(this._alignmentControlsEl=(0,ie().OO)(ie().H8,t,function(e){n._editor.update(function(){var t=(0,Ao().nsf)(n._nodeKey);t&&t.setAlignment(e)})}),this._alignmentControlsEl.className="video-alignment-controls",this._wrapperEl.appendChild(this._alignmentControlsEl))}}},{key:"_onDelete",value:function(e){if(!this._selectionHelper.isSelected())return!1;var n=(0,Ao().nsf)(this._nodeKey);return!!n&&(e&&"function"==typeof e.preventDefault&&e.preventDefault(),n.remove(),!0)}},{key:"destroy",value:function(){this._alignmentControlsEl&&this._alignmentControlsEl.remove(),this._commandCleanup&&this._commandCleanup(),this._selectionHelper&&this._selectionHelper.destroy()}}],n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}()}),ue=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("LexicalBridgeService",["Dialog","$rootScope",function(e,n){this.create=function(t){return{openImageLibrary:function(){return new Promise(function(n){var a=t.$new();e.open(a,{template:'<div image-library on-image-picked="onImagePicked(imageSet)" do-close="closePopup()"  ></div>',mode:"fullscreen",animation:"slideUp",includeInHistory:!0,onClose:function(){n(null),a.$destroy()}}),a.onImagePicked=function(e){return n({url:e.getPinUrl(),alt:"",id:e.id,width:300}),Promise.resolve()}})},openVideoPicker:function(t,a,i){var o=n.$new();o.onVideoPicked=function(e){return a&&a(e),Promise.resolve()},o.url=i,e.open(o,{template:'<div video-picker url="url" on-video-picked="onVideoPicked(embedCode)" do-close="closePopup()"></div>',animation:"rotateIn",includeInHistory:!0,crossCloser:!0,externalCloser:!1,onClose:function(){o.$destroy(),t&&t()}})},openLinkEditor:function(n){return new Promise(function(a){var i=t.$new();i.linkData=Eo()().copy(n||{}),e.open(i,{template:'<div link-editor data="linkData" do-close="closePopup()"></div>',animation:"rotateIn",includeInHistory:!0,crossCloser:!0,externalCloser:!1,onClose:function(){a(i.linkData),i.$destroy()}})})},openEmbedPicker:function(n,t){e.open(n,{template:'<div custom-html data="data" on-embed-picked="onEmbedPicked(embedCode)" do-close="closePopup()"></div>',animation:"rotateIn",includeInHistory:!0,crossCloser:!0,externalCloser:!1,onClose:t})},newScope:function(){return t.$new()}}}}])}),pe=t.cw(function(e,n){t.d(n,{w:()=>a});var a={ltr:"ltr",rtl:"rtl",placeholder:"editor-placeholder",paragraph:"editor-paragraph",quote:"editor-quote",heading:{h1:"editor-heading-h1",h2:"editor-heading-h2",h3:"editor-heading-h3"},list:{nested:{listitem:"editor-nested-listitem"},ol:"editor-list-ol",ul:"editor-list-ul",listitem:"editor-listitem"},image:"editor-image",link:"editor-link",text:{bold:"editor-text-bold",italic:"editor-text-italic",overflowed:"editor-text-overflowed",hashtag:"editor-text-hashtag",underline:"editor-text-underline",strikethrough:"editor-text-strikethrough",underlineStrikethrough:"editor-text-underlineStrikethrough",code:"editor-text-code"}}}),me=t.cw(function(e,n){t.d(n,{Z:()=>i});var a='xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"',i={undo:"<svg ".concat(a,'><path d="M3 7v6h6"/><path d="M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13"/></svg>'),redo:"<svg ".concat(a,'><path d="M21 7v6h-6"/><path d="M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13"/></svg>'),heading1:"<svg ".concat(a,'><path d="M4 12h8"/><path d="M4 18V6"/><path d="M12 18V6"/><path d="m17 12 3-2v8"/></svg>'),heading2:"<svg ".concat(a,'><path d="M4 12h8"/><path d="M4 18V6"/><path d="M12 18V6"/><path d="M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1"/></svg>'),bold:"<svg ".concat(a,'><path d="M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8"/></svg>'),italic:"<svg ".concat(a,'><line x1="19" x2="10" y1="4" y2="4"/><line x1="14" x2="5" y1="20" y2="20"/><line x1="15" x2="9" y1="4" y2="20"/></svg>'),underline:"<svg ".concat(a,'><path d="M6 4v6a6 6 0 0 0 12 0V4"/><line x1="4" x2="20" y1="20" y2="20"/></svg>'),strikethrough:"<svg ".concat(a,'><path d="M16 4H9a3 3 0 0 0-2.83 4"/><path d="M14 12a4 4 0 0 1 0 8H6"/><line x1="4" x2="20" y1="12" y2="12"/></svg>'),list:"<svg ".concat(a,'><line x1="8" x2="21" y1="6" y2="6"/><line x1="8" x2="21" y1="12" y2="12"/><line x1="8" x2="21" y1="18" y2="18"/><line x1="3" x2="3.01" y1="6" y2="6"/><line x1="3" x2="3.01" y1="12" y2="12"/><line x1="3" x2="3.01" y1="18" y2="18"/></svg>'),listOrdered:"<svg ".concat(a,'><line x1="10" x2="21" y1="6" y2="6"/><line x1="10" x2="21" y1="12" y2="12"/><line x1="10" x2="21" y1="18" y2="18"/><path d="M4 6h1v4"/><path d="M4 10h2"/><path d="M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"/></svg>'),alignLeft:"<svg ".concat(a,'><line x1="21" x2="3" y1="6" y2="6"/><line x1="15" x2="3" y1="12" y2="12"/><line x1="17" x2="3" y1="18" y2="18"/></svg>'),alignCenter:"<svg ".concat(a,'><line x1="21" x2="3" y1="6" y2="6"/><line x1="17" x2="7" y1="12" y2="12"/><line x1="19" x2="5" y1="18" y2="18"/></svg>'),alignRight:"<svg ".concat(a,'><line x1="21" x2="3" y1="6" y2="6"/><line x1="21" x2="9" y1="12" y2="12"/><line x1="21" x2="7" y1="18" y2="18"/></svg>'),link:"<svg ".concat(a,'><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>'),image:"<svg ".concat(a,'><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>'),video:"<svg ".concat(a,'><path d="m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5"/><rect x="2" y="6" width="14" height="12" rx="2"/></svg>'),code:"<svg ".concat(a,'><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>'),minus:"<svg ".concat(a,'><path d="M5 12h14"/></svg>')}}),fe=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("EmbedCode",["tkfNotify",function(e){this.openEmbedCodePopup=function(n){var t=n.calendar,a=n.component,i=n.isDudaUser;e.popup.open({view:Ht(),tparams:{calname:t.name,component:a,title:t.displayName,isDudaUser:i}})}}])}),ge=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("EmbedCodePopupCtrl",["$scope",function(e){e.viewState={target:"html"};var n=e.popup.tparams,t=n.component,a=n.calname,i=n.title;
2e.args={component:t,calname:a,title:i,href:"https://tockify.com/"+a,view:"pinboard"}}])}),ve=t.cw(function(e,n){t.d(n,{I:()=>r}),Dt();var a="/api/eventresponse2",i=0,o=function(e,n,t,o){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};r.offset||(i=0,!0);var s=Object.assign({max:50},r);return!1===s.includeDeleted?delete s.includeDeleted:!0===s.includeDeleted&&(s.includeDeleted="true"),(0,Dt().hm)([a,e,n,t,o].join("/"),s).then(function(e){return e.hasNext,i+=e.responses.length,e})},r={query:o,getMore:function(e,n,t,a){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};return o(e,n,t,a,Object.assign({},r,{offset:i}))},deleteFormResponse:function(e){return(0,Dt().Un)([a,e].join("/"))},modifyFormResponse:function(e,n){return(0,Dt().mI)([a,e,n].join("/"))}}}),he=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("FormTestData",function(){this.data={title:"new form",fieldCounter:2,fields:[{id:1,title:"Contact Email Address",ftype:"shortText",stype:"email",flags:{fixed:!0,contactAddress:!0},config:{}},{id:2,title:"Are You Attending",ftype:"attendee",flags:{fixed:!0,attendeeCount:!0},config:{}}]}})}),be=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("RSVPLinkAPI",["$http",function(e){this.updateLink=function(n){var t=n.calid,a=n.uid,i=n.tid,o=n.rid,r=n.rsvpLink,s=t+"/"+a;return void 0!==i&&(s+="/"+i+"/"+(o=o||0)),e.put("/api/rsvpLink/"+s,r)},this.deleteLink=function(n){var t=n.calid,a=n.uid,i=n.tid,o=n.rid,r=t+"/"+a;return void 0!==i&&(r+="/"+i+"/"+(o=o||0)),e.delete("/api/rsvpLink/"+r)}}]).service("RSVPLibrary",["Dialog",function(e){this.open=function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"list";n.calTzid,n.dateFormat,n.timeFormat;e.open(n,{template:'<div rsvp-library do-close="closePopup()"\n          cal-tzid="calTzid" date-format="dateFormat" time-format="timeFormat"\n          on-linked="onLinked(rsvpLink)" mode="'.concat(t,'"></div>'),mode:"fullscreen",animation:"slideUp",includeInHistory:!0,"z-index":10,onClose:function(){0}})}}])}),ye=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("RSVPLinker",["Dialog","FormDef","tkfNotify",function(e,n,t){var a=function(n,t){var a=t.formDef,i=t.rsvpLink,o=t.parentCloser,r=(n.calTzid,n.dateFormat,n.timeFormat,a.formId),s=a.title,l=a.rsvpButtonText||"RSVP",c=n.$new(!1);c.rsvpLink=i;var d="";o&&(c.parentCloser=o,d='close-parent="parentCloser()"'),e.open(c,{template:'<div rsvp-linker form-id="'.concat(r,'" \n              on-linked="onLinked(rsvpLink)" rsvp-link="rsvpLink" ').concat(d,'\n              form-name="').concat(s,'" rsvp-button-text="').concat(l,'"\n              cal-tzid="calTzid" date-format="dateFormat" time-format="timeFormat"\n              do-close="closePopup()" ></div>'),animation:"fadeIn",includeInHistory:!1,externalCloser:!1,crossCloser:!0,"z-index":100,onClose:function(){c.$destroy()}})};this.open=function(e,i){var o=i.formDef,r=i.rsvpLink,s=i.parentCloser;o?a(e,{formDef:o,rsvpLink:r,parentCloser:s}):(t.spinner.open(),n.get({formId:r.formId}).$promise.then(function(n){a(e,{formDef:n,rsvpLink:r,parentCloser:s})}).finally(function(){t.spinner.close()}))}}])}),we=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("attendeeFieldPreview",function(){return{template:_a(),restrict:"EA",scope:{field:"="},controller:["$scope",function(e){e.field.config=e.field.config||{};var n=e.field,t=n.config,a=n.flags.hidden,i=void 0===t.min;i&&(t.min=1,t.max=10),isNaN(t.initial)||(t.initial=t.min),t.min>t.max&&(t.min=t.max),e.checkInitialBounds=function(n){n=+(n||e.viewState.initial),isNaN(n)?t.initial=t.min:n>t.max?t.initial=t.max:n<t.min?t.initial=t.min:t.initial=n,e.viewState.initial=t.initial};var o="nothing";i||a||(o=1===t.max?"yesno":"howmany"),e.viewState={max:t.max,min:t.min,responseKind:o},e.field.flags=e.field.flags||{},e.checkInitialBounds();var r=function(n){switch(n=n||e.viewState.responseKind){case"nothing":e.field.flags.hidden=!0,t.max=1,t.min=1,t.initial=1,e.viewState.max=1,e.viewState.min=1,e.viewState.initial=1;break;case"yesno":delete e.field.flags.hidden,t.max=1,t.min=0,t.initial=1,e.viewState.max=1,e.viewState.min=0,e.viewState.initial=1;break;case"howmany":delete e.field.flags.hidden,t.max=10,t.min=1,t.initial=1,e.viewState.max=10,e.viewState.min=1,e.viewState.initial=1}};i&&r(o),e.$watch("viewState.responseKind",function(e,n){e!==n&&r(e)}),e.minChanged=function(n){n=+(n||e.viewState.min),isNaN(n)||(t.min=+n),t.min>t.max&&(t.max=n,e.viewState.max=t.max),e.viewState.min=t.min,e.checkInitialBounds()},e.maxChanged=function(n){n=+(n||e.viewState.max),isNaN(+n)||(t.max=+n),t.max<t.min&&(t.min=n,e.viewState.min=t.min),e.viewState.max=t.max,e.checkInitialBounds()}}]}})}),_e=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("booleanFieldPreview",function(){return{template:ka(),restrict:"EA",scope:{field:"="}}})}),ke=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("infoFieldPreview",function(){return{template:Sa(),restrict:"EA",scope:{field:"="},controller:["$scope",function(e){e.field.config&&void 0!==e.field.config.message||(e.field.config=e.field.config||{},e.field.config.message="")}]}})}),Se=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("longTextFieldPreview",function(){return{template:xa(),restrict:"EA",scope:{field:"="}}})}),xe=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("numberFieldPreview",function(){return{template:Ca(),restrict:"EA",scope:{field:"="},link:function(e,n){e.el=n[0]},controller:["$scope",function(e){var n=e.field.config;void 0===n.min&&(n.min=1,n.max=10),isNaN(n.initial)&&(n.initial=n.min),n.min>n.max&&(n.min=n.max),e.checkInitialBounds=function(t){t=+(t||e.viewState.initial),isNaN(t)?n.initial=n.min:t>n.max?n.initial=n.max:t<n.min?n.initial=n.min:n.initial=t,e.viewState.initial=n.initial},e.viewState={max:n.max,min:n.min,initial:n.initial},e.checkInitialBounds(),e.minChanged=function(t){t=+(t||e.viewState.min),isNaN(t)||(n.min=+t),n.min>n.max&&(n.max=t,e.viewState.max=n.max),e.viewState.min=n.min,e.checkInitialBounds()},e.maxChanged=function(t){t=+(t||e.viewState.max),isNaN(+t)||(n.max=+t),n.max<n.min&&(n.min=t,e.viewState.min=n.min),e.viewState.max=n.max,e.checkInitialBounds()}}]}})}),Ce=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("optionsFieldPreview",["$timeout","SimpleSelectModel","TKFCollections",function(e,n,t){return{template:Ta(),restrict:"EA",scope:{field:"="},link:function(e,n){e.el=n[0]},controller:["$scope",function(a){a.minModel=new n([1,2,3,4,5]),a.maxModel=new n([1,2,3,4,5]),a.field;var i=a.field.config;void 0===i.options&&(i.options=[],i.max=1,i.min=1),i.min>i.max&&(i.min=i.max),a.setMinOptions=function(){return a.minModel=new n(t.range(1,i.max))}
2,a.setMaxOptions=function(){return a.maxModel=new n(t.range(i.min,i.options.length))},a.setMinOptions(),a.setMaxOptions(),a.newOption={text:"",selected:!1},a.$watch("field.config.min",function(e){e>i.max&&(i.max=e),a.setMaxOptions()}),a.$watch("field.config.max",function(e){e<i.min&&(i.min=e),a.checkSelectedMax(),a.setMinOptions()}),a.atMaxOpts=function(){return i.options.map(function(e){return e.selected}).filter(function(e){return e}).length===i.max},a.checkSelectedMax=function(e){var n=i.options.map(function(e){return e.selected}).filter(function(e){return e}).length-i.max;if(n>0)for(var t=0,a=0;t<i.options.length&&a<n;t++)t!==e&&i.options[t].selected&&(i.options[t].selected=!1,a++)},a.addOption=function(){var n=a.field.config.options,t=a.newOption,i=t.text,o=t.selected;if(0!==(i=(i||"").trim()).length){var r,s=n.map(function(e){return e.text}).indexOf(i);if(-1===s)n.push({text:i,selected:o}),a.newOption={text:"",selected:!1},a.setMaxOptions();else e(function(){(r=a.el.querySelector("li:nth-of-type("+(s+1)+")")).classList.add("l-flash"),e(function(){return r.classList.remove("l-flash")},300)},0)}},a.onKeyDown=function(e){13===e.keyCode&&a.addOption()},a.removeOption=function(e){i.options.splice(e,1),a.setMaxOptions(),a.setMinOptions();var n=i.options.length;i.max>n&&(i.max=n),i.min>n&&(i.min=n),a.checkSelectedMax()}}]}}])}),Te=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),we(),_e(),Se(),ke(),xe(),Ce(),Ee();var i=Xi();Eo()().module("tkfngApp").directive("rsvpLibrary",["$timeout","FormTestData","tkfNotify","$translate","dragulaService","FormDef","$state","RSVPLinker",function(e,n,a,o,r,s,l,c){return{template:Aa(),restrict:"EA",scope:{formId:"@",mode:"@",doClose:"&",onLinked:"&",calTzid:"=",dateFormat:"=",timeFormat:"="},controller:["$scope","tkfNotify","$q",function(a,l,d){a.DEFAULT_FORMID="58cfb7a67c8fd268688544e3";var u=a.onLinked;a.onLinked=function(e){u({rsvpLink:e})},a.hideDeleted=function(e){return!e.flags.deleted},a.mode;var p=!1,m=a.mode;"manage"===m&&(p=!0,m="list"),a.viewState={editedField:null,mode:m,formLibrary:"user",search:"",manage:p},a.clearSearch=function(){return a.viewState.search=""};var f={boolean:"Yes/No",shortText:"Short Text",longText:"Long Text",options:"Multi Choice",number:"Number",attendee:"Attendee",email:"Email Address",info:"Information Block"};a.fieldPalette=[{ftype:"shortText",_paletteStub:!0},{ftype:"longText",_paletteStub:!0},{ftype:"boolean",_paletteStub:!0},{ftype:"options",_paletteStub:!0},{ftype:"number",_paletteStub:!0},{ftype:"info",_paletteStub:!0}];var g,v=function(e){return e&&e.classList&&e.classList.contains("rsvpLibrary__fieldList")},h=function(e){var n=a.formDef.fields.filter(function(e){return"number"==typeof e.id}).map(function(e){return e.id}),i=a.formDef.fieldCounter,o=Math.max.apply(Math,t(n).concat([i]))+1;return a.formDef.fieldCounter=o,{id:o,title:"untitled",ftype:e,flags:{optional:!0},config:{}}};r.options(a,"rsvp-field-bag",{moves:function(e,n,t){return v(n)||t.classList.contains("u-dragHandle")},copy:function(e,n){return v(n)},accepts:function(e,n){return!v(n)},mirrorContainer:document.querySelector(".rsvpLibrary__mirrorContainer")}),a.$on("rsvp-field-bag.drop-model",function(e,n,t,i){if(v(i&&i[0])){var o=a.formDef.fields.findIndex(function(e){return e&&e._paletteStub});o<0||(a.formDef.fields[o]=h(a.formDef.fields[o].ftype))}});var b=function(e){return l.spinner.open(),s.get({formId:e}).$promise.then(function(e){e.fields=e.fields.filter(function(e){return!e.flags.deleted}),a.formDef=e,a.hasUnsavedChanges=!1,a.showCustomSubmit=!!e.submitText,a.showCustomRsvp=!!e.rsvpButtonText,g&&g(),g=a.$watch("formDef",function(e,n){e&&n&&!Eo()().equals(e.fields,n.fields)&&(n.fields,e.fields,a.hasUnsavedChanges=!0)},!0)}
2).finally(function(){l.spinner.close()})};a.backToList=function(){return a.viewState.mode="list"},a.newForm=function(){var e=JSON.parse(JSON.stringify(n.data));a.formDef=new s(e),a.viewState.mode="edit",a.viewState.canEdit=!0},a.dupForm=function(e){l.spinner.open(),s.get({formId:e}).$promise.then(function(n){var t=e===a.DEFAULT_FORMID?"Default Form":n.name,i=n.fields.filter(function(e){return!e.flags.deleted}),o={name:"".concat(t," (Copy)"),title:n.title,fieldCounter:n.fieldCounter,fields:JSON.parse(JSON.stringify(i))};a.formDef=new s(o),a.saveForm(!0),l.status.open("Duplicated Form","success",3e3)}).finally(function(){l.spinner.close()})},a.close=function(){return a.doClose()},a.editField=function(){},a.removeField=function(e){a.formDef.fields=a.formDef.fields.filter(function(n){return n.id!==e.id})},a.addField=function(n){var t=h(n);a.formDef.fields.push(t),e(function(){var e=document.querySelector("#field_"+t.id);if(e.scrollIntoView)e.scrollIntoView({behavior:"smooth"});else{var n=i("#field_"+t.id).offset().top;i(".rsvpLibrary__builder__wrap").scrollTop(n)}},10)},a.getTypeLabel=function(e,n){return f[n?"email":e]||"unknown"};var y=["shortText","longText","number"];a.showRequired=function(e){var n=-1!==y.indexOf(e.ftype),t=e.flags.fixed,a="email"===e.stype;return a&&!e.flags.optional&&(e.flags.optional=!1),a||!t&&n},a.saveForm=function(e){l.spinner.open();var n=(a.formDef.name||"").trim();return a.formDef.name=n||a.formDef.title,a.formDef.$save().then(function(){a.formDef.fields=a.formDef.fields.filter(function(e){return!e.flags.deleted}),e||l.status.open("Saved","success",3e3),k(),a.hasUnsavedChanges=!1}).catch(function(){return l.status.open("Form Save Failed","error",6e3)}).finally(function(){return l.spinner.close()})},a.editForm=function(e,n,t){return b(e).then(function(){a.viewState.canEdit=n,a.viewState.mode=t||"preview"})};var w=50,_=0;function k(e,n,t){t||(a.viewState.loadedForms=!1,a.formDefIndex=[]),e=e||0,n=n||w,l.spinner.open();var i=d.defer(),o="user"===a.viewState.formLibrary?s.pageQuery:s.pageQueryBuiltIn,r={offset:e,limit:n},c=a.viewState.search.trim();return c&&(r.search=c),o(r).then(function(e){t?(Array.prototype.push.apply(a.formDefIndex,e),_+=e.length,a.viewState.maybeHasNext=e.length===n):(a.formDefIndex=e,_=e.length,a.viewState.maybeHasNext=e.length===n),i.resolve(e)}).catch(function(e){l.status.open("Unexpected problem loading formSummaries","error",6e3),i.reject(e)}).finally(function(){a.viewState.loadedForms=!0,l.spinner.close()}),i.promise}a.hasUnsavedChanges=!1,a.loadMore=function(){return k(_,w,!0)},a.$watch("viewState.formLibrary",function(e,n){e&&e!==n&&(a.formDefIndex=[],a.clearSearch(),k())}),a.$watch("viewState.search",function(e,n){e!==n&&k()}),a.useCustomSubmit=function(){o("sendRSVP").then(function(e){var n;a.formDef.submitText=(n=(n=e)||"").charAt(0).toUpperCase()+n.slice(1),a.showCustomSubmit=!0})},a.useStandardSubmit=function(){delete a.formDef.submitText,a.showCustomSubmit=!1},a.useCustomRsvp=function(){a.formDef.rsvpButtonText="RSVP",a.showCustomRsvp=!0},a.useDefaultRsvp=function(){delete a.formDef.rsvpButtonText,a.showCustomRsvp=!1},a.useForm=function(e){a.formDef&&a.hasUnsavedChanges?a.saveForm().then(function(){return a.startAttach(e)}):a.startAttach(e)},a.startAttach=function(e){return b(e).then(function(){c.open(a,{formDef:a.formDef,parentCloser:function(){return a.doClose()}})})},a.removeForm=function(e){s.markDeleted(e),_-=1,a.formDefIndex=a.formDefIndex.filter(function(n){return n.formId!==e})},"edit"===a.viewState.mode?a.formId?b(a.formId).catch(function(){return a.newForm()}):a.newForm():k()}]}}])}),Ae=t.cw(function(e,n){o(),kt();var t=ao();Eo()().module("tkfngApp").directive("rsvpLinker",["RSVPLibrary","TimeSelectModel","$rootScope","$timeout",function(e,n,a,i){return{template:Ea(),restrict:"EA",scope:{rsvpLink:"=",formId:"@",formName:"@",rsvpButtonText:"@",mode:"@",onLinked:"&",closeParent:"&",doClose:"&",calTzid:"=",dateFormat:"=",timeFormat:"="},controller:["$scope",function(o){try{o.calTzid,o.dateFormat;var r=o.timeFormat;o.viewState={};var s=o.viewState;o.selectModel=new n(r);var l=function(){o.doClose(),o.closeParent&&o.closeParent()};o.hasLink=!!o.rsvpLink,o.hasMaxAttendees=function(){return"number"==typeof o.rsvpLink.maxAttendees},o.hasLink?(o.rsvpLink=Eo()().copy(o.rsvpLink),o.rsvpLink,o.hasMaxAttendees(),o.hasMaxAttendees()&&o.rsvpLink.maxAttendees<0&&(o.rsvpLink.maxAttendees=10)):o.rsvpLink={formId:o.formId,buttonLabel:o.rsvpButtonText||"RSVP",markedAsFull:!1,closeHours:0,offerReminders:!0},s.maxAttendees=o.rsvpLink.maxAttendees,o.updateMaxAttendees=function(){isNaN(s.maxAttendees)?delete o.rsvpLink.maxAttendees:o.rsvpLink.maxAttendees=+s.maxAttendees},s.closeHours=o.rsvpLink.closeHours,s.autoClose=void 0!==s.closeHours,s.autoOpen=!o.rsvpLink.openD
2ays;var c=o.rsvpLink.openDays||30,d=o.rsvpLink.openMinutes||600,u=t().hours(d/60).minutes(d%60).seconds(0).milliseconds(0);s.openTime={days:c,time:u.format(r)},s.emailNotes=void 0!==o.rsvpLink.emailNotes,o.updateCloseHours=function(){isNaN(s.closeHours)?delete o.rsvpLink.closeHours:o.rsvpLink.closeHours=+s.closeHours},o.setUnlimited=function(){delete s.maxAttendees,delete o.rsvpLink.maxAttendees},o.setLimited=function(){o.rsvpLink.maxAttendees=10,s.maxAttendees=10};var p=function(){if(s.emailNotes&&0!==(o.rsvpLink.emailNotes||"").trim().length||delete o.rsvpLink.emailNotes,s.autoClose?void 0===o.rsvpLink.closeHours&&(o.rsvpLink.closeHours=0):delete o.rsvpLink.closeHours,s.autoOpen)delete o.rsvpLink.openDays,delete o.rsvpLink.openMinutes;else{var e=t(s.openTime.time,r),n=60*e.hours()+e.minutes();o.rsvpLink.openMinutes=n,o.rsvpLink.openDays=s.openTime.days}};o.attach=function(){p(),o.onLinked({rsvpLink:o.rsvpLink}),l()},o.saveChanges=function(){p(),o.onLinked({rsvpLink:o.rsvpLink}),l()},o.detach=function(){o.onLinked({rsvpLink:!1}),l()},o.$watch("viewState.autoClose",function(e,n){e&&!n&&(o.viewState.closeHours=0)}),o.editForms=function(){e.open(a,"manage"),i(function(){return l()},100)}}catch(e){console.error("XXX eek! code fault",e),kt().i.log("fault","rsvpLinker",{message:e.message,stack:e.stack})}}]}}])}),Ee=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("shortTextFieldPreview",function(){return{template:Pa(),restrict:"EA",scope:{field:"="}}})}),Pe=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("rsvpLibrary",{views:{"main@":{template:function(e){var n=e.params.formId;return'<div rsvp-library do-close="closePopup()" form-id="'.concat(n,'"\n                        on-rsvp-picked="onRSVPPicked(rsvp)" ></div>')}}},url:"/i/site/rsvpLibrary?:formId"}).state("rsvpFiller",{views:{"main@":{template:function(e){var n=e.params,t=n.formId,a=n.calid,i=n.uid,o=n.tid,r=n.rid;return'<div rsvp-filler do-close="closePopup()"\n                        form-id="'.concat(t,'" calid="').concat(a,'" uid="').concat(i,'" tid="').concat(o,'" rid="').concat(r,'"></div>')}}},url:"/i/site/rsvpFiller?:formId&:calid&:uid&:tid&:rid"})}])}),ze=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),ve();var i=ao();Eo()().module("tkfngApp").directive("rsvpReport",["Auth","CalendarSearch","tkfNotify","$state","$q","EventFormatter",function(e,n,a,o,r,s){return{template:za(),restrict:"EA",scope:{calid:"&",eid:"&"},controller:["$scope",function(e){var l=" (no limit)",c="",d=!1,u={},p=function(e,n){return e.fields.find(function(e){return e.id===n})||{id:n}},m=function(e,n){return e.fieldValues.find(function(e){return e.id===n})||{id:n}},f=function(n,t){var a=t.headers.map(function(e){return p(n,e)}),i=t.body.map(function(e){return p(n,e)}),o=n.fields,r=o.find(function(e){return e.flags.contactAddress}),s=o.filter(function(e){return e!==r}),l=Array.prototype.concat([r],s),c=l.map(function(e){return e.id}),d=function(e){var n=function(e){var n=Eo()().copy(e.fieldValues).filter(function(e){return!!e});return e.fieldValues=c.map(function(e){return n.find(function(n){return n.id===e})}).filter(function(e){return!!e}),e}(e);return n.fieldValues,n.fieldValues.forEach(function(e){"boolean"==typeof e.value&&(e.value=e.value?"yes":"no")}),n},u=function(e){return Array.isArray(e)?e.join(","):e};return{headers:a,body:i,headerLabels:a.map(function(e){return(e.flags||{}).attendeeCount?"Attending":e.title}),formatResponse:function(n){var t=d(n),o=[],r=[];return a.forEach(function(n){n.flags;var a=u(m(t,n.id).value);"attendee"===n.ftype?(e.viewState.attendeeCount[t.responseId]=a,e.viewState.originalAttendeeCount[t.responseId]=a):o.push({title:"foo",ftype:n.ftype,v:a})}
2),i.forEach(function(e){e.v=u(m(t,e.id).value),r.push({title:e.title,v:u(m(t,e.id).value)})}),{id:n.responseId,headers:o,body:r,isOpen:false,isDeleted:!!n.isDeleted}}}};e.viewState={search:"",includeDeleted:!1,edit:{},attendeeCount:{},originalAttendeeCount:{}},n.selectEvent(o.params),e.groupedResponses=[];var g=function(n){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1]?[]:t(e.groupedResponses),i=a.length,o=i>0?a[i-1]:{},r=o.formId,s=o.formattedResponses||[],l=r?u[r]:null;r&&a.pop();var c=function(){r&&l&&a.push({formId:r,headers:l.headers,formattedResponses:s,headerLabels:l.headerLabels,openDefault:!1,isChange:a.length>0})};n.forEach(function(e){e.formId!==r&&(c(),r=e.formId,s=[],l=u[e.formId]),l?s.push(l.formatResponse(e)):console.warn("rsvpReport: skipping response with missing form definition",e.responseId,e.formId)}),c(),e.groupedResponses=a};e.loadFirst=function(){var n=e.calendar._id,t=e.eid.uid,a=e.eid.tid,o=e.eid.rid;delete e.fields,delete e.responses,delete e.hasNext,ve().I.query(n,t,a,o,{search:e.viewState.search,includeDeleted:e.viewState.includeDeleted}).then(function(n){for(var t=0;t<n.forms.length;t++)u[n.forms[t].formId]=f(n.forms[t],n.reports[t]);g(n.responses,!0),e.hasNext=n.hasNext,e.stats=n.stats;var a=n.rsvpLink,o=!1;if(!a.markedAsFull&&void 0!==a.closeHours){var r=a.closeHours||0,d=i(+n.when.start.millis).subtract(r,"hours");o=i().isAfter(d)}l=a.maxAttendees?"/"+a.maxAttendees:" (no limit)",c=a.markedAsFull||o?" Submissions closed":"",e.attendeeSummary=e.stats.attendeeCount+l+c,e.eventSummary=n.summary.text;var p={};s.formatWhen(p,{},n.when),e.eventDate=p.fullWhen}).catch(function(e){return console.error("error: "+e)})},e.loadMore=function(){var n=e.calendar._id,t=e.eid.uid,a=e.eid.tid,i=e.eid.rid;ve().I.getMore(n,t,a,i,{search:e.viewState.search,includeDeleted:e.viewState.includeDeleted}).then(function(n){for(var t=0;t<n.forms.length;t++)u[n.forms[t].formId]=f(n.forms[t],n.reports[t]);g(n.responses),e.hasNext=n.hasNext})},e.$watch("viewState.search",function(n,t){n!==t&&e.loadFirst()}),e.$watch("viewState.includeDeleted",function(n,t){n!==t&&e.loadFirst()}),e.toggleDetails=function(e){return e.isOpen=!e.isOpen},e.startDeleteResponse=function(n){var t=r.defer();return a.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Delete This Response",main:"Remove all record of this response",actionLabel:"Delete Response",action:function(){a.popup.close(),t.resolve(e.deleteResponse(n))}}}),t.promise},e.deleteResponse=function(n){a.spinner.open(),ve().I.deleteFormResponse(n.id).then(function(){var t;t=n.id,e.groupedResponses=e.groupedResponses.map(function(e){return{formId:e.formId,headers:e.headers,formattedResponses:e.formattedResponses.filter(function(e){return e.id!==t}),headerLabels:e.headerLabels,openDefault:e.openDefault,isChange:e.isChange}}),e.stats.attendeeCount-=1,e.attendeeSummary=e.stats.attendeeCount+l+c,a.status.open("Deleted","success",3e3)}).catch(function(e){a.status.open("Delete Failed","error",6e3)}).finally(function(){return a.spinner.close()})};e.formatAttendeeCount=function(n){var t=e.viewState.attendeeCount[n.id];return 0!==t?"Yes: &nbsp;"+t:"No: &nbsp;0"},e.toggleEditMode=function(n){e.viewState.edit[n.id]=!!e.viewState.edit[n.id],Object.keys(e.viewState.edit).forEach(function(t){t===n.id?e.viewState.edit[t]=!e.viewState.edit[t]:e.viewState.edit[t]=!1})},e.updateAttendeeCount=function(n){var t=n.id,i=e.viewState.attendeeCount[t],o=e.viewState.originalAttendeeCount[t];Number.isNaN(i)?e.viewState.attendeeCount[t]=o:function(n,t,i){a.spinner.open(),ve().I.modifyFormResponse(n.id,t).then(function(o){o===t?a.status.open("Changed Attending","success",3e3):a.status.open("Reduced Attending to avoid exceeding max","success",3e3);var r=o-i;e.viewState.attendeeCount[n.id]=o,e.viewState.originalAttendeeCount[n.id]=o,e.stats.attendeeCount+=r,e.attendeeSummary=e.stats.attendeeCount+l+c}).catch(function(e){a.status.open("Modify Attending Failed","error",6e3)}).finally(function(){return a.spinner.close()})}(n,i,o),e.viewState.edit[t]=!1},e.openAllDetails=function(e){e.openDefault=!0,e.formattedResponses.forEac
2h(function(e){return e.isOpen=!0})},e.closeAllDetails=function(e){e.openDefault=!1,e.formattedResponses.forEach(function(e){return e.isOpen=!1})},e.$watch("CalendarSearch.loaded",function(t,a){if(!("boolean"!=typeof t||d&&t===a)&&(d=!0,t)){var i=n.snapshot(),r=i.calendar,s=i.eid;if(!r)return;if(!s)return void o.transitionTo("edit.inter.editor404",{calname:r.name},{location:!1});e.calendar=r,e.eid=s,e.loadFirst()}})}],link:function(e){e.CalendarSearch=n}}}])}),De=()=>t(9774),Ie=t.cw(function(e,n){t.d(n,{$:()=>a});var a={card1:{name:"Robert Dunne",number:"5555555555554444",cvc:"456",exp_month:"12",exp_year:"2020",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},organization1:{organization_name:"Tockify Ltd",vat_number:"GB111198543"},card2:{name:"Robert Dunne",number:"4242424242424242",cvc:"123",exp_month:"11",exp_year:"2020",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},badCVC:{name:"Robert Dunne",number:"4000000000000127",cvc:"123",exp_month:"11",exp_year:"2020",address_line1:"bad cvc street",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},declinedCard:{name:"Robert Declined Generic",number:"4000000000000002",cvc:"456",exp_month:"12",exp_year:"2020",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},badZip:{name:"Robert Declined Generic",number:"4000000000000036",cvc:"456",exp_month:"12",exp_year:"2020",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},fraudulentCard:{name:"Robert Fraudulent ",number:"4100000000000019",cvc:"456",exp_month:"12",exp_year:"2020",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},expiredCard:{name:"Robert Expired Card  ",number:"4000000000000069",cvc:"456",exp_month:"12",exp_year:"2017",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"},processingErrorCard:{name:"Robert Expired Card  ",number:"4000000000000119",cvc:"456",exp_month:"12",exp_year:"2020",address_line1:"my house",address_line2:"my street",address_city:"london",address_state:"surrey",address_zip:"tw9 5ab",address_country:"US"}}}),Le=t.cw(function(e,n){o(),Eo()().module("tkfngApp").factory("CustomFont",["$resource",function(e){var n=e("/api/fonts/:userId/:id",{id:"@_id",userId:"@userId"},{update:{method:"PUT"}});return n.loadUserFonts=function(e){return n.query({userId:e._id}).$promise.then(function(e){e.forEach(function(e){return zo.K.loadCustomFont(e)})}).catch(function(e){return console.error("CustomFont: load error",e)})},n}])}),$e=t.cw(function(e,n){t.d(n,{X:()=>i});var a=["0-00.usa.cc","0-mail.com","001.igg.biz","027168.com","0815.ru","0815.ry","0815.su","0845.ru","0box.eu","0clickemail.com","0n0ff.net","0nelce.com","0v.ro","0w.ro","0wnd.net","0wnd.org","0x207.info","1-8.biz","1000rebates.stream","100likers.com","10mail.com","10mail.org","10minut.com.pl","10minut.xyz","10minutemail.be","10minutemail.cf","10minutemail.co.uk","10minutemail.co.za","10minutemail.com","10minutemail.de","10minutemail.ga","10minutemail.gq","10minutemail.ml","10minutemail.net","10minutemail.nl","10minutemail.pro","10minutemail.us","10minutemailbox.com","10minutemails.in","10minutenemail.de","10minutesmail.com","10minutesmail.fr","10minutmail.pl","10x9.com","11163.com","123-m.com","12hosting.net","12houremail.com","12minutemail.com","12minutemail.net","12storage.com","140unichars.com","147.cl","14n.co.uk","15qm.com","1blackmoon.com","1ce.us","1chuan.com","1clck2.com","1fsdfdsfsdf.tk","1mail.ml","1pad.de","1st-forms.com","1to1mail.org","1usemail.com","1webmail.info","1zhuan.com","2.0-00.usa.cc","20email.eu","20email.it","20mail.eu","20mail.in","20mail.it","20minutemail.com","20mm.eu","2120001.net","21cn.com","24hourmail.com","24hourmail.net","2anom.com","2ether.net","2fdgdfgdfgdf.tk","2odem.com","2prong.com","2wc.info","300book.info","30mail.ir","30minutemail.com","30wave.com","3202.com","333.igg.biz","33mail.com","36ru.com","3d-painting.com","3l6.com","3mail.ga","3trtretgfrfe.tk","4-n.us","4057.com","418.dk","42o.org","4gfdsgfdgfd.tk","4mail.cf","4mail.ga","4tb.host","4warding.com","4warding.net","4warding.org","55hosting.net","5ghgfhfghfgh.tk","5gramos.com","5july.org","5mail.cf","5mail.ga","5oz.ru","5x25.com","5ymail.com","60minutemail.com","672643.net","675hosting.com","675hosting.net","675hosting.org","6hjgjhgkilkj.tk","6ip.us","6mail.cf","6mail.ga","6mail.ml","6paq.com","6url.com","75hosting.com","75hosting.net","75hosting.org","7days-printing.com","7mail.ga","7mail.ml","7tags.com","80665.com","8127ep.com","8mail.cf","8mail.ga","8mail.ml","99.com","99experts.com","9mail.cf","9me.site","9ox.net","9q.ro","a-bc.net","a45.in","a7996.com","aa5zy64.com","ab0.igg.biz","abacuswe.us","abakiss.com","abcmail.email","abilitywe.us","abnamro.usa.cc","abovewe.us","absolutewe.us","abundantwe.us","abusemail.de","abuser.eu","abyssmail.com","ac20mail.in","academiccommunity.com","academywe.us","acceleratewe.us","accentwe.us","acceptwe.us","acclaimwe.us","accordwe.us","accreditedwe.us","acentri.com","achievementwe.us","achievewe.us","acornwe.us","acrylicwe.us","activatewe.us","activitywe.us","acucre.com","acuitywe.us","acumenwe.us","adaptivewe.us","adaptwe.us","add3000.pp.ua","addictingtrailers.com","adeptwe.us","adiq.eu","aditus.info","admiral
2we.us","ado888.biz","adobeccepdm.com","adoniswe.us","adpugh.org","adsd.org","adubiz.info","advantagewe.us","advantimo.com","adventurewe.us","adventwe.us","advisorwe.us","advocatewe.us","adwaterandstir.com","aegde.com","aegia.net","aegiscorp.net","aegiswe.us","aelo.es","aeonpsi.com","affiliate-nebenjob.info","affiliatedwe.us","affilikingz.de","affinitywe.us","affluentwe.us","affordablewe.us","afrobacon.com","afterhourswe.us","agedmail.com","agendawe.us","agger.ro","agilewe.us","agorawe.us","agtx.net","aheadwe.us","ahk.jp","air2token.com","airsi.de","ajaxapp.net","akapost.com","akerd.com","akgq701.com","al-qaeda.us","albionwe.us","alchemywe.us","alfaromeo.igg.biz","aliaswe.us","alienware13.com","aligamel.com","alisongamel.com","alivance.com","alivewe.us","allaccesswe.us","allamericanwe.us","allaroundwe.us","alldirectbuy.com","allegiancewe.us","allegrowe.us","allgoodwe.us","alliancewe.us","allinonewe.us","allofthem.net","alloutwe.us","allowed.org","alloywe.us","allprowe.us","allseasonswe.us","allstarwe.us","allthegoodnamesaretaken.org","allurewe.us","almondwe.us","alph.wtf","alphaomegawe.us","alpinewe.us","altairwe.us","altitudewe.us","altuswe.us","ama-trade.de","ama-trans.de","amadeuswe.us","amail.club","amail.com","amail4.me","amazon-aws.org","amberwe.us","ambiancewe.us","ambitiouswe.us","amelabs.com","americanawe.us","americasbestwe.us","americaswe.us","amicuswe.us","amilegit.com","amiri.net","amiriindustries.com","amplewe.us","amplifiedwe.us","amplifywe.us","ampsylike.com","analogwe.us","analysiswe.us","analyticalwe.us","analyticswe.us","analyticwe.us","anappfor.com","anappthat.com","andreihusanu.ro","andthen.us","animesos.com","anit.ro","ano-mail.net","anon-mail.de","anonbox.net","anonmails.de","anonymail.dk","anonymbox.com","anonymized.org","anonymousness.com","anotherdomaincyka.tk","ansibleemail.com","anthony-junkmail.com","antireg.com","antireg.ru","antispam.de","antispam24.de","antispammail.de","anyalias.com","aoeuhtns.com","apfelkorps.de","aphlog.com","apkmd.com","appc.se","appinventor.nl","appixie.com","apps.dj","arduino.hk","ariaz.jetzt","armyspy.com","aron.us","arroisijewellery.com","art-en-ligne.pro","artman-conception.com","arur01.tk","arurgitu.gq","arvato-community.de","aschenbrandt.net","asdasd.nl","asdasd.ru","ashleyandrew.com","asiarap.usa.cc","asorent.com","ass.pp.ua","astonut.tk","astroempires.info","asu.mx","asu.su","at0mik.org","attnetwork.com","audi.igg.biz","augmentationtechnology.com","ausgefallen.info","auti.st","autorobotica.com","autotwollow.com","autowb.com","aver.com","averdov.com","avia-tonic.fr","avls.pt","awatum.de","awiki.org","awsoo.com","axiz.org","axon7zte.com","axsup.net","azazazatashkent.tk","azcomputerworks.com","azmeil.tk","b1of96u.com","b2bx.net","b2cmail.de","badgerland.eu","badoop.com","badpotato.tk","banit.club","banit.me","bareed.ws","barryogorman.com","bartdevos.be","basscode.org","bauwerke-online.com","baxomale.ht.cx","bazaaboom.com","bbbbyyzz.info","bbhost.us","bcast.ws","bcb.ro","bccto.me","bdmuzic.pw","bearsarefuzzy.com","beddly.com","beefmilk.com","belamail.org","belljonestax.com","benipaula.org","bestchoiceusedcar.com","bestoption25.club","betr.co","bgtmail.com","bgx.ro","bidourlnks.com","big1.us","bigprofessor.so","bigstring.com","bigwhoop.co.za","bij.pl","binka.me","binkmail.com","binnary.com","bio-muesli.info","bio-muesli.net","bione.co","bitwhites.top","bitymails.us","blackmarket.to","bladesmail.net","blip.ch","blnkt.net","blogmyway.org","blogspam.ro","blow-job.nut.cc","bluedumpling.info","bluewerks.com","bnote.com","boatmail.us","bobmail.info","bobmurchison.com","bofthew.com","bonobo.email","bookthemmore.com","bootybay.de","borged.com","borged.net","borged.org","bot.nu","boun.cr","bouncr.com","boxformail.in","boximail.com","boxtemp.com.br","brandallday.net","brasx.org","breakthru.com","brefmail.com","brennendesreich.de","briggsmarcus.com","broadbandninja.com","bsnow.net","bspamfree.org","bspooky.com","bst-72.com","btb-notes.com","btc.email","btcmail.pw","btizet.pl","budaya-tionghoa.com","budayationghoa.com","buffemail.com","bugmenever.com","bugmenot.com","bulrushpress.com","bum.net","bumpymail.com","bunchofidiots.com","bund.us","bundes-li.ga","bunsenhoneydew.com","burnthespam.info","burstmail.info","businessbackend.com","businesssuccessislifesuccess.com","buspad.org","bussitussi.com","buymoreplays.com","buyordie.info","buyusedlibrarybooks.org","buzzcluby.com","byebyemail.com","byespm.com","byom.de","c51vsgq.com","cachedot.net","californiafitnessdeals.com","cam4you.cc","camping-grill.info","candymail.de","cane.pw","car101.pro","carbtc.net","cars2.club","carsencyclo
2pedia.com","caseedu.tk","casualdx.com","cavi.mx","cbair.com","cc-cc.usa.cc","cc.liamria","cdpa.cc","ceed.se","cek.pm","cellurl.com","centermail.com","centermail.net","cetpass.com","cfo2go.ro","ch.tc","chacuo.net","chaichuang.com","chalupaurybnicku.cz","chammy.info","cheaphub.net","cheatmail.de","chechnya.conf.work","chibakenma.ml","chickenkiller.com","chielo.com","childsavetrust.org","chilkat.com","chithinh.com","chogmail.com","choicemail1.com","chong-mail.com","chong-mail.net","chong-mail.org","chumpstakingdumps.com","cigar-auctions.com","civx.org","ckaazaza.tk","ckiso.com","cl-cl.org","cl0ne.net","clandest.in","clearwatermail.info","clickdeal.co","clipmail.eu","clixser.com","clrmail.com","cmail.club","cmail.com","cmail.net","cmail.org","cnamed.com","cnew.ir","cnmsg.net","cnsds.de","cobarekyo1.ml","cocovpn.com","codeandscotch.com","codivide.com","coieo.com","coldemail.info","compareshippingrates.org","completegolfswing.com","comwest.de","consumerriot.com","contbay.com","cool.fr.nf","coolandwacky.us","coolimpool.org","coreclip.com","correo.blogos.net","cosmorph.com","courriel.fr.nf","courrieltemporaire.com","coza.ro","crankhole.com","crapmail.org","crastination.de","crazespaces.pw","crazymailing.com","cross-law.ga","cross-law.gq","crossroadsmail.com","crusthost.com","csh.ro","cszbl.com","ctmailing.us","ctos.ch","cu.cc","cubiclink.com","cuirushi.org","curlhph.tk","curryworld.de","cust.in","cutout.club","cuvox.de","cyber-innovation.club","cyber-phone.eu","cylab.org","d1yun.com","d3p.dk","daabox.com","dab.ro","dacoolest.com","daemsteam.com","daibond.info","daintly.com","damai.webcam","dammexe.net","damnthespam.com","dandikmail.com","darkharvestfilms.com","daryxfox.net","dasdasdascyka.tk","dash-pads.com","dataarca.com","datarca.com","datazo.ca","datum2.com","davidkoh.net","davidlcreative.com","dawin.com","dayrep.com","dbunker.com","dcemail.com","ddcrew.com","de-a.org","deadaddress.com","deadchildren.org","deadfake.cf","deadfake.ga","deadfake.ml","deadfake.tk","deadspam.com","deagot.com","dealja.com","dealrek.com","deekayen.us","defomail.com","degradedfun.net","delayload.com","delayload.net","delikkt.de","demen.ml","dengekibunko.ga","dengekibunko.gq","dengekibunko.ml","der-kombi.de","derkombi.de","derluxuswagen.de","despam.it","despammed.com","dev-null.cf","dev-null.ga","dev-null.gq","dev-null.ml","devnullmail.com","deyom.com","dharmatel.net","dhm.ro","dhy.cc","dialogus.com","diapaulpainting.com","digitalesbusiness.info","digitalmariachis.com","digitalsanctuary.com","dildosfromspace.com","dim-coin.com","dingbone.com","disaq.com","disbox.net","disbox.org","discard.cf","discard.email","discard.ga","discard.gq","discard.ml","discard.tk","discardmail.com","discardmail.de","discos4.com","disign-concept.eu","disign-revelation.com","dispo.in","dispomail.eu","disposable-email.ml","disposable.cf","disposable.ga","disposable.ml","disposableaddress.com","disposableemailaddresses.com","disposableinbox.com","disposablemails.com","dispose.it","disposeamail.com","disposemail.com","dispostable.com","divad.ga","divermail.com","divismail.ru","diwaq.com","dlemail.ru","dm.w3internet.co.uk","dma.in-ulm.de","dmarc.ro","dndent.com","dnses.ro","doanart.com","dob.jp","dodgeit.com","dodgemail.de","dodgit.com","dodgit.org","dodsi.com","doiea.com","dolphinnet.net","domforfb1.tk","domforfb18.tk","domforfb19.tk","domforfb2.tk","domforfb23.tk","domforfb27.tk","domforfb29.tk","domforfb3.tk","domforfb4.tk","domforfb5.tk","domforfb6.tk","domforfb7.tk","domforfb8.tk","domforfb9.tk","domozmail.com","donemail.ru","dongqing365.com","dontreg.com","dontsendmespam.de","doquier.tk","dotman.de","dotmsg.com","dotslashrage.com","douchelounge.com","dozvon-spb.ru","dp76.com","dr69.site","drdrb.com","drdrb.net","dred.ru","drevo.si","drivetagdev.com","droolingfanboy.de","dropcake.de","droplar.com","dropmail.me","dsiay.com","dspwebservices.com","duam.net","duck2.club","dudmail.com","duk33.com","dukedish.com","dump-email.info","dumpandjunk.com","dumpmail.de","dumpyemail.com","durandinterstellar.com","duskmail.com","dwse.edu.pl","dyceroprojects.com","dz17.net","e-mail.com","e-mail.igg.biz","e-mail.org","e-tomarigi.com","e3z.de","e4ward.com","easy-trash-mail.com","easynetwork.info","easytras
2hmail.com","eatmea2z.club","ebbob.com","ebeschlussbuch.de","ecallheandi.com","ecolo-online.fr","edgex.ru","edinburgh-airporthotels.com","edv.to","ee1.pl","ee2.pl","eelmail.com","efxs.ca","einmalmail.de","einrot.com","einrot.de","eintagsmail.de","elearningjournal.org","electro.mn","elitevipatlantamodels.com","email-fake.cf","email-fake.com","email-fake.ga","email-fake.gq","email-fake.ml","email-fake.tk","email-jetable.fr","email-temp.com","email.cbes.net","email.net","email60.com","emailage.cf","emailage.ga","emailage.gq","emailage.ml","emailage.tk","emaildienst.de","emailfake.ml","emailfake.nut.cc","emailfreedom.ml","emailgo.de","emailias.com","emailigo.de","emailinfive.com","emailisvalid.com","emaillime.com","emailmiser.com","emailo.pro","emailproxsy.com","emailresort.com","emails.ga","emailsecurer.com","emailsensei.com","emailsingularity.net","emailspam.cf","emailspam.ga","emailspam.gq","emailspam.ml","emailspam.tk","emailsy.info","emailtech.info","emailtemporanea.com","emailtemporanea.net","emailtemporar.ro","emailtemporario.com.br","emailthe.net","emailtmp.com","emailto.de","emailure.net","emailwarden.com","emailx.at.hm","emailxfer.com","emailz.cf","emailz.ga","emailz.gq","emailz.ml","emeil.in","emeil.ir","emeraldwebmail.com","emil.com","emkei.cf","emkei.ga","emkei.gq","emkei.ml","emkei.tk","eml.pp.ua","emlhub.com","emlpro.com","emltmp.com","empireanime.ga","emz.net","enterto.com","envy17.com","epb.ro","ephemail.net","ephemeral.email","eqiluxspam.ga","ericjohnson.ml","ero-tube.org","esc.la","escapehatchapp.com","esemay.com","esgeneri.com","esprity.com","estate-invest.fr","eth2btc.info","ether123.net","ethereum1.top","ethersports.org","ethersportz.info","etranquil.com","etranquil.net","etranquil.org","euaqa.com","evanfox.info","evilcomputer.com","evopo.com","evyush.com","exitstageleft.net","explodemail.com","express.net.ua","extremail.ru","eyepaste.com","ez.lv","ezehe.com","ezfill.com","ezstest.com","f4k.es","facebook-email.cf","facebook-email.ga","facebook-email.ml","facebookmail.gq","facebookmail.ml","fackme.gq","fadingemail.com","faecesmail.me","fag.wf","failbone.com","faithkills.com","fake-email.pp.ua","fake-mail.cf","fake-mail.ga","fake-mail.ml","fakedemail.com","fakeinbox.cf","fakeinbox.com","fakeinbox.ga","fakeinbox.info","fakeinbox.ml","fakeinbox.tk","fakeinformation.com","fakemail.fr","fakemailgenerator.com","fakemailz.com","fammix.com","fangoh.com","fansworldwide.de","fantasymail.de","farrse.co.uk","fast-mail.fr","fastacura.com","fastchevy.com","fastchrysler.com","fasternet.biz","fastkawasaki.com","fastmazda.com","fastmitsubishi.com","fastnissan.com","fastsubaru.com","fastsuzuki.com","fasttoyota.com","fastyamaha.com","fatflap.com","fbma.tk","fbmail.usa.cc","fddns.ml","fdfdsfds.com","fer-gabon.org","fettometern.com","ficken.de","fictionsite.com","fightallspam.com","figjs.com","figshot.com","fiifke.de","filbert4u.com","filberts4u.com","film-blog.biz","filzmail.com","findu.pl","fir.hk","fivemail.de","fixmail.tk","fizmail.com","flashbox.5july.org","fleckens.hu","flemail.ru","flowu.com","flu-cc.flu.cc","flucc.flu.cc","fluidsoft.us","flurred.com","fly-ts.de","flyinggeek.net","flyspam.com","foobarbot.net","footard.com","forecastertests.com","foreskin.cf","foreskin.ga","foreskin.gq","foreskin.ml","foreskin.tk","forgetmail.com","fornow.eu","forspam.net","forward.cat","foxja.com","foxtrotter.info","fr.nf","fr33mail.info","fragolina2.tk","frapmail.com","frappina.tk","free-email.cf","free-email.ga","freebabysittercam.com","freeblackbootytube.com","freecat.net","freedom4you.info","freedompop.us","freefattymovies.com","freelance-france.eu","freeletter.me","freemail.ms","freemail.tweakly.net","freemails.cf","freemails.ga","freemails.ml","freemeil.ga","freemeil.gq","freemeil.ml","freeplumpervideos.com","freeschoolgirlvids.com","freesistercam.com","freeteenbums.com","freundin.ru","friendlymail.co.uk","front14.org","ftp.sh","ftpinc.ca","fuckedupload.com","fuckingduh.com","fuckme69.club","fucknloveme.top","fuckxxme.top","fudgerub.com","fuirio.com","fulvie.com","fun64.com","funnycodesnippets.com","funnymail.de","furzauflunge.de","fux0ringduh.com","fxnxs.com","fyii.de","g14l71lb.com","g1xmail.top","g2xmail.top","g3xmail.top","g4hdrop.us","gafy.net","gaggle.net","galaxy.tv","gally.jp","gamail.top","gamegregious.com","gamgling.com","garasikita.pw","garbagecollector.org","garbagemail.org","gardenscape.ca","garizo.com","garliclife.com","garrymccooey.com","gav0.com","gawab.com","gbcmail.win","gbmail.top","gcmail.top","gdmail.top","gedmail.win","geekforex.com","geew.ru","gehensiemirnichtaufdensack.de","geldwaschmaschine.de","gelitik.in","gen.uu.gl","genderfuck.net","geronra.com","geschent.biz","get-mail.cf","get-mail.ga","get-mail.ml","get-mail.tk","get.pp.ua","get1mail.com","get2mail.fr","getairmail.cf","getairmail.com","getairmail.ga","getairmail.gq","getairmail.ml","getairmail.tk","geteit.com","getfun.men","getmails.eu","getnada.com","getnowtoday.cf","getonemail.com","getonemail.net","ghosttexter.de","giacmosuaviet.info","giaiphapmuasam.com","giantmail.de","gifto12.com","ginzi.be","ginzi.co.uk","ginzi.es","ginzi.net","ginzy.c
2o.uk","ginzy.eu","girlmail.win","girlsindetention.com","girlsundertheinfluence.com","gishpuppy.com","giveh2o.info","givmail.com","glitch.sx","globaltouron.com","glubex.com","glucosegrin.com","gmal.com","gmatch.org","gmial.com","gmx.fr.nf","gmx1mail.top","gmxmail.top","gmxmail.win","gnctr-calgary.com","go2usa.info","go2vpn.net","goemailgo.com","golemico.com","gomail.in","gorillaswithdirtyarmpits.com","goround.info","gothere.biz","gotmail.com","gotmail.net","gotmail.org","gotti.otherinbox.com","gowikibooks.com","gowikicampus.com","gowikicars.com","gowikifilms.com","gowikigames.com","gowikimusic.com","gowikinetwork.com","gowikitravel.com","gowikitv.com","grandmamail.com","grandmasmail.com","great-host.in","greenhousemail.com","greensloth.com","greggamel.com","greggamel.net","gregorsky.zone","gregorygamel.com","gregorygamel.net","grish.de","griuc.schule","grr.la","gs-arc.org","gsredcross.org","gsrv.co.uk","gsxstring.ga","gudanglowongan.com","guerillamail.biz","guerillamail.com","guerillamail.de","guerillamail.info","guerillamail.net","guerillamail.org","guerillamailblock.com","guerrillamail.biz","guerrillamail.com","guerrillamail.de","guerrillamail.info","guerrillamail.net","guerrillamail.org","guerrillamailblock.com","gustr.com","gxemail.men","gynzi.co.uk","gynzi.es","gynzy.at","gynzy.es","gynzy.eu","gynzy.gr","gynzy.info","gynzy.lt","gynzy.mobi","gynzy.pl","gynzy.ro","gynzy.sk","gzb.ro","h8s.org","habitue.net","hacccc.com","hackersquad.tk","hackthatbit.ch","hahawrong.com","haida-edu.cn","haltospam.com","hangxomcuatoilatotoro.ml","harakirimail.com","haribu.com","hartbot.de","hasanmail.ml","hat-geld.de","hatespam.org","hawrong.com","haydoo.com","hazelnut4u.com","hazelnuts4u.com","hazmatshipping.org","hccmail.win","headstrong.de","heathenhammer.com","heathenhero.com","hecat.es","hellodream.mobi","helloricky.com","helpinghandtaxcenter.org","heros3.com","herp.in","herpderp.nl","hezll.com","hi5.si","hiddentragedy.com","hidebox.org","hidemail.de","hidemail.pro","hidemail.us","hidzz.com","highbros.org","hiltonvr.com","hmail.us","hmamail.com","hmh.ro","hoanggiaanh.com","hoanglong.tech","hochsitze.com","hola.org","holl.ga","honor-8.com","hopemail.biz","hornyalwary.top","hostcalls.com","hostlaba.com","hot-mail.cf","hot-mail.ga","hot-mail.gq","hot-mail.ml","hot-mail.tk","hotmai.com","hotmailproduct.com","hotmial.com","hotpop.com","hotprice.co","housat.com","hpc.tw","hs.vc","ht.cx","huangniu8.com","hukkmu.tk","hulapla.de","humaility.com","humn.ws.gy","hungpackage.com","hushmail.cf","huskion.net","hvastudiesucces.nl","hwsye.net","i-phone.nut.cc","i2pmail.org","i6.cloudns.cc","i6.cloudns.cx","iaoss.com","ibnuh.bz","icantbelieveineedtoexplainthisshit.com","icx.in","icx.ro","idx4.com","ieatspam.eu","ieatspam.info","ieh-mail.de","iencm.com","ige.es","ignoremail.com","ihateyoualot.info","ihazspam.ca","iheartspam.org","ikbenspamvrij.nl","illistnoise.com","ilovespam.com","imails.info","imgof.com","imgv.de","immo-gerance.info","imstations.com","imul.info","inbax.tk","inbound.plus","inbox.si","inbox2.info","inboxalias.com","inboxbear.com","inboxclean.com","inboxclean.org","inboxdesign.me","inboxed.im","inboxed.pw","inboxproxy.com","inboxstore.me","inclusiveprogress.com","incognitomail.com","incognitomail.net","incognitomail.org","incq.com","ind.st","indieclad.com","indirect.ws","indomaed.pw","indomina.cf","indoserver.stream","indosukses.press","ineec.net","infocom.zp.ua","inggo.org","inmynetwork.tk","inoutmail.de","inoutmail.eu","inoutmail.info","inoutmail.net","insanumingeniumhomebrew.com","insorg-mail.info","instant-mail.de","instantblingmail.info","instantemailaddress.com","instantmail.fr","internetoftags.com","interstats.org","intersteller.com","investore.co","iozak.com","ip4.pp.ua","ip6.li","ip6.pp.ua","ipoo.org","ippandansei.tk","ipsur.org","irabops.com","irc.so","irish2me.com","iroid.com","ironiebehindert.de","irssi.tv","is.af","isdaq.com","isosq.com","istii.ro","isukrainestillacountry.com","it7.ovh","italy-mail.com","itunesgiftcodegenerator.com","iuemail.men","iwi.net","ixx.io","j-p.us","j8k2.usa.cc","jafps.com","jajxz.com","jamesbond.flu.cc","jamesbond.igg.biz","jamesbond.nut.cc","jamesbond.usa.cc","
2janproz.com","jdmadventures.com","jdz.ro","je-recycle.info","jeie.igg.biz","jellow.ml","jellyrolls.com","jet-renovation.fr","jetable.com","jetable.fr.nf","jetable.net","jetable.org","jetable.pp.ua","jmail.ovh","jmail.ro","jnxjn.com","jobbikszimpatizans.hu","jobposts.net","jobs-to-be-done.net","joelpet.com","joetestalot.com","jopho.com","joseihorumon.info","josse.ltd","jourrapide.com","jpco.org","jsrsolutions.com","jumonji.tk","jungkamushukum.com","junk.to","junk1e.com","junkmail.ga","junkmail.gq","justemail.ml","juyouxi.com","jwork.ru","kademen.com","kadokawa.cf","kadokawa.ga","kadokawa.gq","kadokawa.ml","kadokawa.tk","kakadua.net","kalapi.org","kamsg.com","kaovo.com","kappala.info","karatraman.ml","kariplan.com","kartvelo.com","kasmail.com","kaspop.com","katztube.com","kazelink.ml","kcrw.de","keepmymail.com","keinhirn.de","keipino.de","kekita.com","kemptvillebaseball.com","kennedy808.com","kiani.com","killmail.com","killmail.net","kimsdisk.com","kingsq.ga","kiois.com","kir.ch.tc","kiryubox.cu.cc","kismail.ru","kisstwink.com","kitnastar.com","klassmaster.com","klassmaster.net","klick-tipp.us","klipschx12.com","kloap.com","kludgemush.com","klzlk.com","kmhow.com","knol-power.nl","kommunity.biz","kon42.com","kook.ml","kopagas.com","kopaka.net","kosmetik-obatkuat.com","kostenlosemailadresse.de","koszmail.pl","kpooa.com","krd.ag","krsw.tk","krypton.tk","ks87.igg.biz","ks87.usa.cc","ksmtrck.tk","kuhrap.com","kulmeo.com","kulturbetrieb.info","kurzepost.de","kwift.net","kwilco.net","kyal.pl","kyois.com","l-c-a.us","l33r.eu","l6factors.com","labetteraverouge.at","lacedmail.com","lackmail.net","lackmail.ru","lacto.info","lags.us","lain.ch","lajoska.pe.hu","lak.pp.ua","lakelivingstonrealestate.com","lakqs.com","landmail.co","laoeq.com","larisia.com","last-chance.pro","lastmail.co","lastmail.com","lawlita.com","lazyinbox.com","lazyinbox.us","ldop.com","ldtp.com","lee.mx","leeching.net","legalrc.loan","lellno.gq","lenovog4.com","letmeinonthis.com","letthemeatspam.com","lez.se","lgxscreen.com","lhsdv.com","liamcyrus.com","lifebyfood.com","lifetimefriends.info","lifetotech.com","ligsb.com","lillemap.net","lilo.me","lindenbaumjapan.com","link2mail.net","linkedintuts2016.pw","linuxmail.so","litedrop.com","liveradio.tk","lkgn.se","llogin.ru","loadby.us","loan101.pro","loaoa.com","loapq.com","locanto1.club","locantofuck.top","locantowsite.club","locomodev.net","login-email.cf","login-email.ga","login-email.ml","login-email.tk","logular.com","loh.pp.ua","loin.in","lol.ovpn.to","lolfreak.net","lolmail.biz","lookugly.com","lopl.co.cc","lordsofts.com","lortemail.dk","losemymail.com","lovemeet.faith","lovemeleaveme.com","lpfmgmtltd.com","lr7.us","lr78.com","lroid.com","lru.me","luckymail.org","lukecarriere.com","lukemail.info","lukop.dk","luv2.us","lyfestylecreditsolutions.com","lzoaq.com","m21.cc","m4ilweb.info","maboard.com","macromaid.com","macromice.info","magamail.com","maggotymeat.ga","magicbox.ro","maidlow.info","mail-easy.fr","mail-filter.com","mail-owl.com","mail-temporaire.com","mail-temporaire.fr","mail-tester.com","mail.by","mail.mezimages.net","mail.wtf","mail0.ga","mail114.net","mail1a.de","mail21.cc","mail22.club","mail2rss.org","mail333.com","mail4trash.com","mail666.ru","mail707.com","mail72.com","mailback.com","mailbidon.com","mailbiz.biz","mailblocks.com","mailbox80.biz","mailbox82.biz","mailbox92.biz","mailbucket.org","mailcat.biz","mailcatch.com","mailchop.com","mailcker.com","mailde.de","mailde.info","maildrop.cc","maildrop.cf","maildrop.ga","maildrop.gq","maildrop.ml","maildu.de","maildx.com","maileater.com","mailed.in","mailed.ro","maileimer.de","maileme101.com","mailexpire.com","mailf5.com","mailfa.tk","mailfall.com","mailforspam.com","mailfree.ga","mailfree.gq","mailfree.ml","mailfreeonline.com","mailfs.com","mailguard.me","mailgutter.com","mailhazard.com","mailhazard.us","mailhex.com","mailhz.me","mailimate.com","mailin8r.com","mailinatar.com","mailinater.com","mailinator.co.uk","mailinator.com","mailinator.gq","mailinator.info","mailinator.net","mailinator.org","mailinator.us","mailinator.usa.cc","mailinator0.com","mailinator1.com","mailinator2.com","mailinator2.net","mailinator3.com","mailinator4.com","mailinator5.com","mailinator6.com","mailinator7.com","mailinator8.com","mailinator9.com","mailincubator.com","mailismagic.com","mailita.tk","mailjunk.cf","mailjunk.ga","mailjunk.gq","mailjunk.ml","mailjunk.tk","mailmate.com","mailme.gq","mailme.ir","mailme.lv","mailme24.com","mailmetrash.com","mailmoat.com","mailmoth.com","mailms.com","mailna.biz","mailna.co","mailna.in","mailna.me","mailnator.com","mailnesia.com","mailnull.com","mailonaut.com","mailorc.com","mailorg.org","mailpick.biz","mailpooch.com","mailpress.gq","mailproxsy.com","mailquack.com","mailrock.biz","mailsac.com","mailscrap.com","mailseal.de","mailshell.com","mailsiphon.com","mailslapping.com","mailslite.com","mailsucker.net","mailtechx.com","mailtemp.info","mailtemporaire.com","mailtemporaire.fr","mailtome.de","mailtothis.com","mailtraps.com","mailtrash.net","mailtrix.net","mailtv.net","mailtv.tv","mailzi.ru","mailzilla.com","mailzilla.org","mailzilla.orgmbx.cc","mainerfolg.info","makemenaughty.club","makemetheking.com","malahov.de","malayalamdtp.com","mandraghen.cf","manifestgenerator.com","mansiondev.com","manybrain.com","markmurfin.com","masonline.info","maswae.world","matamuasu.ga","matchpol.net","matra.site","mbx.cc","mcache.net","mciek.com","mdhc.tk","mebelnu.info","mechanicalresumes.com","meepsheep.eu","mega.zik.dj","meinspamschutz.de","meltedbrownies.com","meltmail.com","memsg.site","messagebeamer.de","messwiththebestdielikethe.rest","mezimages.net","mfsa.info","mfs
2a.ru","miaferrari.com","miauj.com","midcoastcustoms.com","midcoastcustoms.net","midcoastsolutions.com","midcoastsolutions.net","midlertidig.com","midlertidig.net","midlertidig.org","mierdamail.com","migmail.net","migmail.pl","migumail.com","mihep.com","mijnhva.nl","milk.gage.ga","ministry-of-silly-walks.de","minsmail.com","mintemail.com","misterpinball.de","mji.ro","mjukglass.nu","mkpfilm.com","ml8.ca","mm.my","mm5.se","mnode.me","moakt.co","moakt.com","moakt.ws","mobileninja.co.uk","mobilevpn.top","moburl.com","mockmyid.com","moeri.org","mohmal.com","mohmal.im","mohmal.in","mohmal.tech","molms.com","momentics.ru","monachat.tk","monadi.ml","moncourrier.fr.nf","monemail.fr.nf","moneypipe.net","monmail.fr.nf","monumentmail.com","moonwake.com","moot.es","mor19.uu.gl","moreawesomethanyou.com","moreorcs.com","morriesworld.ml","morsin.com","moruzza.com","motique.de","mountainregionallibrary.net","mox.pp.ua","moza.pl","mozej.com","mp-j.ga","mp-j.igg.biz","mp.igg.biz","mr24.co","msgos.com","mspeciosa.com","msrc.ml","mswork.ru","msxd.com","mt2009.com","mt2014.com","mt2015.com","mtmdev.com","muathegame.com","muchomail.com","mucincanon.com","muehlacker.tk","munoubengoshi.gq","mutant.me","mvrht.com","mvrht.net","mwarner.org","mxfuel.com","my10minutemail.com","mybitti.de","mycleaninbox.net","mycorneroftheinter.net","myde.ml","mydemo.equipment","myecho.es","myemailboxy.com","myindohome.services","myinterserver.ml","mykickassideas.com","mymail-in.net","mymail90.com","mymailoasis.com","mynetstore.de","myopang.com","mypacks.net","mypartyclip.de","myphantomemail.com","mysamp.de","myspaceinc.com","myspaceinc.net","myspaceinc.org","myspacepimpedup.com","myspamless.com","mystvpn.com","mytemp.email","mytempemail.com","mytempmail.com","mytrashmail.com","mywarnernet.net","myzx.com","n1nja.org","nabuma.com","nada.email","nada.ltd","nakedtruth.biz","nanonym.ch","nationalgardeningclub.com","nawmin.info","nbox.notif.me","nbzmr.com","negated.com","neomailbox.com","nepwk.com","nervmich.net","nervtmich.net","netmails.com","netmails.net","netricity.nl","netris.net","netviewer-france.com","netzidiot.de","nevermail.de","newbpotato.tk","newideasfornewpeople.info","next.ovh","nextstopvalhalla.com","nezdiro.org","nezzart.com","nfast.net","nguyenusedcars.com","nh3.ro","nice-4u.com","nicknassar.com","nincsmail.com","nincsmail.hu","niwl.net","nm7.cc","nmail.cf","nnh.com","nnot.net","nnoway.ru","no-spam.ws","no-ux.com","noblepioneer.com","nobugmail.com","nobulk.com","nobuma.com","noclickemail.com","nodezine.com","nogmailspam.info","noicd.com","nokiamail.com","nolemail.ga","nomail.cf","nomail.ga","nomail.pw","nomail.xl.cx","nomail2me.com","nomorespamemails.com","nonspam.eu","nonspammer.de","nonze.ro","noref.in","norseforce.com","nospam.ze.tc","nospam4.us","nospamfor.us","nospamthanks.info","nothingtoseehere.ca","notmailinator.com","notrnailinator.com","notsharingmy.info","now.im","nowhere.org","nowmymail.com","ntlhelp.net","nubescontrol.com","nullbox.info","nurfuerspam.de","nut-cc.nut.cc","nutcc.nut.cc","nutpa.net","nuts2trade.com","nwldx.com","nwytg.com","nwytg.net","ny7.me","nypato.com","nyrmusic.com","o2stk.org","o7i.net","oalsp.com","obfusko.com","objectmail.com","obobbo.com","obxpestcontrol.com","odaymail.com","odem.com","odnorazovoe.ru","oepia.com","oerpub.org","offshore-proxies.net","ohaaa.de","ohi.tw","oing.cf","okclprojects.com","okrent.us","okzk.com","olypmall.ru","omail.pro","omnievents.org","one-time.email","one2mail.info","oneoffemail.com","oneoffmail.com","onewaymail.com","onlatedotcom.info","online.ms","onlineidea.info","onqin.com","ontyne.biz","oolus.com","oopi.org","opayq.com","opendns.ro","opmmedia.ga","opp24.com","oranek.com","ordinaryamerican.net","oreidresume.com","oroki.de","oshietechan.link","otherinbox.com","ourklips.com","ourpreviewdomain.com","outlawspam.com","outmail.win","ovi.usa.cc","ovpn.to","owlpic.com","ownsyou.de","oxopoha.com","ozyl.de","p33.org","p71ce1m.com","pa9e.com","pachilly.com","pagamenti.tk","pakadebu.ga","pancakemail.com","paplease.com","parlimentpetitioner.tk","pastebitch.com","patonce.com","pavilionx2.com","payperex2.com","pcusers.otherinbox.com","pecinan.com","pecinan.net","pecinan.org","penisgoes.in","penoto.tk","pepbot.com","peterdethier.com","petrzilka.net","pfui.ru","photo-impact.eu","photomark.net","phpbb.uu.gl","pi.vu","piaa.me","pig.pp.ua","pii.at","piki.si","pimpedupmyspace.com","pinehill-seattle.org","pingir.com","pisls.com","pjjkp.com","plexolan.de","plhk.ru","ploae.com","plw.me","pojok.ml","pokemail.net","pokiemobile.com","polarkingxx.ml","politikerclub.de","pooae.com","poofy.org","pookmail.com","poopiebutt.club","popesodom
2y.com","popgx.com","porsh.net","posdz.com","posta.store","postacin.com","postonline.me","poutineyourface.com","powered.name","powlearn.com","ppetw.com","pqoia.com","predatorrat.cf","predatorrat.ga","predatorrat.gq","predatorrat.ml","predatorrat.tk","premium-mail.fr","primabananen.net","privacy.net","privatdemail.net","privy-mail.com","privy-mail.de","privymail.de","pro-tag.org","procrackers.com","projectcl.com","proprietativalcea.ro","propscore.com","protempmail.com","proxymail.eu","proxyparking.com","prtnx.com","prtz.eu","psh.me","psles.com","psoxs.com","puglieisi.com","puji.pro","punkass.com","purcell.email","purelogistics.org","put2.net","puttanamaiala.tk","putthisinyourspamdatabase.com","pwrby.com","qasti.com","qbfree.us","qc.to","qibl.at","qipmail.net","qiq.us","qisdo.com","qisoa.com","qoika.com","qq.my","qsl.ro","qtum-ico.com","quadrafit.com","quickinbox.com","quickmail.nl","ququb.com","qvy.me","qwickmail.com","r4nd0m.de","ra3.us","rabin.ca","rabiot.reisen","radiku.ye.vc","raetp9.com","rainbowly.ml","raketenmann.de","rancidhome.net","randomail.net","raqid.com","rax.la","raxtest.com","razemail.com","rbb.org","rcasd.com","rcpt.at","rdklcrv.xyz","re-gister.com","reality-concept.club","reallymymail.com","realtyalerts.ca","rebates.stream","receiveee.com","recipeforfailure.com","recode.me","reconmail.com","recyclemail.dk","reddit.usa.cc","redfeathercrow.com","reftoken.net","regbypass.com","regspaces.tk","rejectmail.com","rejo.technology","reliable-mail.com","remail.cf","remail.ga","remarkable.rocks","remote.li","reptilegenetics.com","resgedvgfed.tk","revolvingdoorhoax.org","rhyta.com","richfinances.pw","riddermark.de","risingsuntouch.com","riski.cf","rklips.com","rkomo.com","rma.ec","rmqkr.net","rnailinator.com","ro.lt","robertspcrepair.com","rollindo.agency","ronnierage.net","rootfest.net","rotaniliam.com","rowe-solutions.com","royal.net","royaldoodles.org","rppkn.com","rsvhr.com","rtrtr.com","rtskiya.xyz","rudymail.ml","ruffrey.com","rumgel.com","runi.ca","rupayamail.com","rustydoor.com","rvb.ro","s0ny.net","s33db0x.com","sabrestlouis.com","sackboii.com","safaat.cf","safermail.info","safersignup.de","safetymail.info","safetypost.de","saharanightstempe.com","salmeow.tk","samsclass.info","sandcars.net","sandelf.de","sandwhichvideo.com","sanfinder.com","sanim.net","sanstr.com","sast.ro","satisfyme.club","satukosong.com","sausen.com","saynotospams.com","scatmail.com","scay.net","schachrol.com","schafmail.de","schmeissweg.tk","schrott-email.de","sd3.in","secmail.pw","secretemail.de","secure-mail.biz","secure-mail.cc","secured-link.net","securehost.com.es","securemail.flu.cc","securemail.igg.biz","securemail.nut.cc","securemail.usa.cc","seekapps.com","seekjobs4u.com","sejaa.lv","selfdestructingmail.com","selfdestructingmail.org","send22u.info","sendfree.org","sendingspecialflyers.com","sendspamhere.com","senseless-entertainment.com","server.ms","services391.com","sexforswingers.com","sexical.com","sexyalwasmi.top","shalar.net","sharedmailbox.org","sharklasers.com","shhmail.com","shhuut.org","shieldedmail.com","shieldemail.com","shiftmail.com","shipfromto.com","shiphazmat.org","shipping-regulations.com","shippingterms.org","shitaway.tk","shitmail.de","shitmail.me","shitmail.org","shitware.nl","shmeriously.com","shortmail.net","shotmail.ru","showslow.de","shrib.com","shut.name","shut.ws","sify.com","sikux.com","siliwangi.ga","simpleitsecurity.info","sin.cl","sinfiltro.cl","singlespride.com","sinnlos-mail.de","sino.tw","siteposter.net","sizzlemctwizzle.com","sjuaq.com","skeefmail.com","skrx.tk","sky-inbox.com","sky-ts.de","slapsfromlastnight.com","slaskpost.se","slave-auctions.net","slippery.email","slipry.net","slopsbox.com","slothmail.net","slushmail.com","sluteen.com","sly.io","smallker.tk","smap.4nmv.ru","smapfree24.com","smapfree24.de","smapfree24.eu","smapfree24.info","smapfree24.org","smarttalent.pw","smashmail.de","smellfear.com","smellrear.com","smellypotato.tk","smtp99.com","smwg.info","snakemail.com","snapwet.com","sneakmail.de","social-mailer.tk","socialfurry.org","sofimail.com","sofort-mail.de","sofortmail.de","softpls.asia","sogetthis.com","sohai.ml","sohus.cn","soioa.com","soisz.com","solar-impact.pro","solvemail.info","solventtrap.wiki","sonshi.cf","soodmail.com","soodomail.com","soodonims.com","soon.it","spam-be-gone.com","spam.2012-2016.ru","spam.la","spam.org.es","spam.su","spam4.me","spamail.de","spamarrest.com","spamavert.com","spambob.com","spambob.net","spambob.org","spambog.com","spambog.de","spambog.net","spambog.ru","spambooger.com","spambox.info","spambox.irishspringrealty.com","spambox.org","spambox.us","spamcero.com","spamcon.org","spamcorptastic.com","spamcowboy.com","spamcowboy.net","spamcowboy.org","spamday.com","spamdecoy.net","spamex.com","spamfighter.cf","spamfighter.ga","spamfighter.gq","spamfighter.ml","spamfighter.tk","spamfree.eu","spamfree24.com","spamfree24.de","spamfree24.eu","spamfree24.info","spamfree24.net","spamfree24.org","spamgoes.in","spamherelots.com","spamhereplease.com","spamhole.com","spamify.com","spaminator.de","spamkill.info","spaml.com","spaml.de","spamlot.net","spammotel.com","spamobox.com","spamoff.de","spamsalad.in","spamslicer.com","spamsphere.com","spamspot.com","spamstack.net","spamthis.co.uk","spamthisplease.com","spamtrail.com","spamtrap.ro","spamtroll.net","spamwc.cf","spamwc.ga","spamwc.gq","spamwc.ml","speed.1s.fr","speedgaus.net","sperma.cf","spikio.com","spindl-e.com","spoofmail.de","spr.io","spritzzone.de","spybox.de","squizzy.de","squizzy.net","sroff.com","sry.li","ssoia.com","stanfordujjain.com","starlight-breaker.net","starpower.space","startfu.com","startkeys.com","statdvr.com","stathost.net","statiix.com","steambot.net","stexsy.com","stinkefinger.net","stop-my-spam.cf","stop-my-spam.com","stop-my-spam.ga","stop-my-spam.ml","stop-my-spam.pp.ua","stop-my-spam.tk","storiqax.top","storj99.com","storj99.top","streetwisemail.com","stromox.com","stuckmail.com","stuffmail.de","stumpfwerk.com","suburbanthug.com","suckmyd.com","sudolife.me","sudolife.net","sudomail.biz","sudomail.com","sudomail.net","sudoverse.com","sudoverse.net","sudoweb.net","sudoworld.com","sudoworld.net","suioe.com","super-auswahl.de","supergreatmail.com","supermailer.jp","superplatyna.com","superrito.com","superstachel.de","suremail.info","svip520.cn","svk.jp","svxr.org","sweetpotato.ml","sweetxxx.de","swift10minutemail.com","sylvannet.com","symphonyresume.com","syosetu.gq","syujob.accountants","szerz.com","t.psh.me","tafmail.com","tafoi.gr","taglead.com","tagmymedia.com","tagyourself.com","talkinator.com","tanukis.org","tapchicuoihoi.com","taphear.com","tarzanmail.cf","tb-on-line.net","tech69.com","techemail.com","techgroup.me","teerest.com","teewars.org","tefl.ro","telecomix.pl","teleworm.com","teleworm.us","tellos.xyz","temp-mail.com","temp-mail.de","temp-mail.org","temp-mail.pp.ua","temp-mail.ru","temp-mails.com","temp.headstrong.de","tempail.com","tempalias.com","tempe-mail.com","tempemail.biz","tempemail.co.za","tempemail.com","tempemail.net","tempinbox.co.uk","tempinbox.com","tempmail.co","tempmail.de","tempmail.eu","tempmail.it","tempmail.pp.ua","tempmail.us","tempmail.ws","tempmail2.com","tempmaildemo.com","tempmailer.com","tempmailer.de","tempomail.fr","temporarily.de","temporarioemail.com.br","temporaryemail.net","temporaryemail.us","temporaryforwarding.com","temporaryinbox.com","temporarymailaddress.com","tempr.email","tempsky.com","tempthe.net","tempymail.com","ternaklele.ga","testore.co","testudine.com","thanksnospam.info","thankyou2010.com","thatim.info","thc.st","theaviors.com","thebearshark.com","thecity.biz","thecloudindex.com","thediamants.org","thedirhq.info","thelightningmail.net","thelimestones.com","thembones.com.au","themostemail.com","thereddoors.online","thescrappermovie.com","theteastory.info","thex.ro","thietbivanphong.asia","thisisnotmyrealemail.com","thismail.net","thisurl.website","thnikka.com","thraml.com","thrma.com","throam.com","thrott.com","throwam.com","throwawayemailaddress.com","throwawaymail.com","throwawaymail.pp.ua","throya.com","thunderbolt.science","thunkinator.org","thxmate.com","tiapz.com","tic.ec","tilien.com","timgiarevn.com","timkassouf.com","tinoza.org","tinyurl24.com","tipsb.com","tittbit.in","tiv.cc","tizi.c
2om","tkitc.de","tlpn.org","tmail.com","tmail.ws","tmailinator.com","tmails.net","tmpeml.info","tmpjr.me","tmpmail.net","tmpmail.org","toddsbighug.com","toiea.com","tokem.co","tokenmail.de","tonymanso.com","toomail.biz","toon.ml","top101.de","top1mail.ru","top1post.ru","topinrock.cf","topofertasdehoy.com","topranklist.de","toprumours.com","tormail.org","toss.pw","tosunkaya.com","totalvista.com","totesmail.com","totoan.info","tp-qa-mail.com","tqoai.com","tqosi.com","tradermail.info","tranceversal.com","trash-amil.com","trash-mail.at","trash-mail.cf","trash-mail.com","trash-mail.de","trash-mail.ga","trash-mail.gq","trash-mail.ml","trash-mail.tk","trash-me.com","trash2009.com","trash2010.com","trash2011.com","trashcanmail.com","trashdevil.com","trashdevil.de","trashemail.de","trashemails.de","trashinbox.com","trashmail.at","trashmail.com","trashmail.de","trashmail.gq","trashmail.io","trashmail.me","trashmail.net","trashmail.org","trashmail.ws","trashmailer.com","trashmails.com","trashymail.com","trashymail.net","trasz.com","trayna.com","trbvm.com","trbvn.com","trbvo.com","trgovinanaveliko.info","trialmail.de","trickmail.net","trillianpro.com","trollproject.com","tropicalbass.info","trungtamtoeic.com","tryalert.com","tryzoe.com","ttszuo.xyz","tualias.com","turoid.com","turual.com","tvchd.com","tverya.com","twinmail.de","twkly.ml","twocowmail.net","twoweirdtricks.com","txtadvertise.com","tyhe.ro","tyldd.com","uacro.com","ubismail.net","ubm.md","ucche.us","ucupdong.ml","uemail99.com","ufacturing.com","uggsrock.com","uguuchantele.com","uhhu.ru","uiu.us","ujijima1129.gq","uk.to","umail.net","undo.it","unids.com","unimark.org","unit7lahaina.com","unmail.ru","upliftnow.com","uplipht.com","uploadnolimit.com","upozowac.info","urfunktion.se","uroid.com","us.af","us.to","usa-cc.usa.cc","used-product.fr","username.e4ward.com","ushijima1129.cf","ushijima1129.ga","ushijima1129.gq","ushijima1129.ml","ushijima1129.tk","utiket.us","uu.gl","uu2.ovh","uwork4.us","uyhip.com","vaasfc4.tk","vaati.org","valemail.net","valhalladev.com","vankin.de","vctel.com","vda.ro","vdig.com","veanlo.com","vemomail.win","venompen.com","veo.kr","ver0.cf","ver0.ga","ver0.gq","ver0.ml","ver0.tk","vercelli.cf","vercelli.ga","vercelli.gq","vercelli.ml","verdejo.com","veryday.ch","veryday.eu","veryday.info","veryrealemail.com","vesa.pw","vfemail.net","vickaentb.tk","victime.ninja","victoriantwins.com","vidchart.com","viditag.com","viewcastmedia.com","viewcastmedia.net","viewcastmedia.org","vikingsonly.com","vinernet.com","vipepe.com","vipmail.name","vipmail.pw","vipxm.net","viralplays.com","visal007.tk","visal168.cf","visal168.ga","visal168.gq","visal168.ml","visal168.tk","vixletdev.com","vkcode.ru","vmailing.info","vmani.com","vmpanda.com","vnedu.me","voidbay.com","voltaer.com","vomoto.com","vorga.org","votiputox.org","voxelcore.com","vpn.st","vps30.com","vps911.net","vrmtr.com","vsimcard.com","vssms.com","vtxmail.us","vubby.com","vuiy.pw","vztc.com","w3internet.co.uk","wakingupesther.com","walala.org","walkmail.net","walkmail.ru","wallm.com","wasteland.rfc822.org","watch-harry-potter.com","watchever.biz","watchfull.net","watchironman3onlinefreefullmovie.com","wazabi.club","wbml.net","web-contact.info","web-ideal.fr","web-mail.pp.ua","web2mailco.com","webcontact-france.eu","webemail.me","
2webm4il.info","webmail.igg.biz","webtrip.ch","webuser.in","wee.my","wef.gr","wefjo.grn.cc","weg-werf-email.de","wegwerf-email-addressen.de","wegwerf-email-adressen.de","wegwerf-email.at","wegwerf-email.de","wegwerf-email.net","wegwerf-emails.de","wegwerfadresse.de","wegwerfemail.com","wegwerfemail.de","wegwerfemail.info","wegwerfemail.net","wegwerfemail.org","wegwerfemailadresse.com","wegwerfmail.de","wegwerfmail.info","wegwerfmail.net","wegwerfmail.org","wegwerpmailadres.nl","wegwrfmail.de","wegwrfmail.net","wegwrfmail.org","welikecookies.com","wemel.top","wetrainbayarea.com","wetrainbayarea.org","wfgdfhj.tk","wg0.com","wh4f.org","whatiaas.com","whatifanalytics.com","whatpaas.com","whatsaas.com","whiffles.org","whopy.com","whtjddn.33mail.com","whyspam.me","wibblesmith.com","wickmail.net","widaryanto.info","widget.gg","wierie.tk","wikidocuslava.ru","wilemail.com","willhackforfood.biz","willselfdestruct.com","wimsg.com","winemaven.info","wins.com.br","wlist.ro","wmail.cf","wmail.club","wokcy.com","wolfmail.ml","wolfsmail.tk","wollan.info","worldspace.link","wpg.im","wralawfirm.com","writeme.us","wronghead.com","wudet.men","wuespdj.xyz","wupics.com","wuzup.net","wuzupmail.net","www.e4ward.com","wwwnew.eu","
2wxnw.net","x24.com","xagloo.co","xagloo.com","xbaby69.top","xcode.ro","xcodes.net","xcompress.com","xcpy.com","xemaps.com","xemne.com","xents.com","xing886.uu.gl","xjoi.com","xl.cx","xmail.com","xmaily.com","xn--9kq967o.com","xn--d-bga.net","xost.us","xoxox.cc","xperiae5.com","xrho.com","xvx.us","xwaretech.com","xwaretech.info","xwaretech.net","xww.ro","xxhamsterxx.ga","xxi2.com","xxlocanto.us","xxolocanto.us","xxqx3802.com","xy9ce.tk","xyzfree.net","xzsok.com","yabai-oppai.tk","yahmail.top","yahooproduct.net","yamail.win","yanet.me","yannmail.win","yapped.net","yaqp.com","ycare.de","ycn.ro","ye.vc","yedi.org","yep.it","yert.ye.vc","yhg.biz","ynmrealty.com","yodx.ro","yogamaven.com","yomail.info","yoo.ro","yopmail.com","yopmail.fr","yopmail.gq","yopmail.net","yopmail.pp.ua","yopmail.usa.cc","yordanmail.cf","you-spam.com","yougotgoated.com","youmail.ga","youmailr.com","youneedmore.info","youpymail.com","yourdomain.com","youremail.cf","yourewronghereswhy.com","yourlms.biz","yourtube.ml","yroid.com","yspend.com","ytpayy.com","yugasandrika.com","yui.it","yuoia.com","yuurok.com","yxzx.net","yyolf.net","z0d.eu","z1p.biz","z86.ru","zain.site","zainmax.net","zaktouni.fr","zasod.com","zdenka.net","zebins.com","zebins.eu","zehnminuten.de","zehnminutenmail.de","zepp.dk","zetmail.com","zfymail.com","zhaoyuanedu.cn","zhcne.com","zhewei88.com","zhorachu.com","zik.dj","zipcad.com","zippymail.info","zipsendtest.com","zoaxe.com","zoemail.com","zoemail.net","zoemail.org","zoetropes.org","zombie-hive.com","zomg.info","zsero.com","zumpul.com","zv68.com","zxcv.com","zxcvbnm.com","zymuying.com","zzi.us","zzz.com","getnada.com","maildim.com","tcwlm.com"],i=function(e){var n=(e=(e||"").toLowerCase().trim()).split("@"),t=n[n.length-1];return-1!==a.indexOf(t)}}),Fe=t.cw(function(e,n){o(),At(),Eo()().module("tkfngApp").service("Editor",["Dialog","$q","GoogleSync","SubscriptionStatus","FullScreen","$rootScope",function(e,n,t,a,i,o){var r;this.isReal=i.isStandalone,a.load(),this.plan=a.plan,this.openImagePicker=function(t,a){if(r)return n.reject("ALREADY_OPEN");var i,s=n.defer(),l=s.promise,c=!1,d=o.$new();return d.$on("$destroy",function(){c||s.resolve()}),d.onImagePicked=function(e,n){return c=!0,s.resolve({imageSet:e,addToDescription:n}),l},i=a?!0===a?"description":a:"featured",r=e.open(d,{template:'<div image-library do-close="closePopup()" dialog="'.concat(i,'"\n                        on-image-picked="onImagePicked(imageSet, addToDescription)" ></div>'),mode:"fullscreen",animation:"slideUp",includeInHistory:!0,"z-index":10,onClose:function(){r=null}}),l},this.sync=function(e){return e.externalSource,"google-calendars"===e.externalSource?t.forceResync(e.name):n.reject("Sync failed: nothing to sync")}}])}),Me=t.cw(function(e,n){o(),Nt(),Ut(),c();var t=Xi(),a=t,i=function(e){return e instanceof t?e:a("<div>"+e+"</div>")};Eo()().module("tkfngApp").service("EditorEmbedTools",["$q","ViewerEmbedTools","$sce","EventGroup",function(e,n,o,r){var s=this,l=this;this.toEmbedCode=n.toEmbedCode,this.readEmbedAttrs=n.readEmbedAttrs,this.toEmbedCodeFilter=n.toEmbedCodeFilter,this.makeEmbedCode=function(e,t,a,i){return a&&a.imageSets&&r.addImageSets(i,a.imageSets),n.makeEmbedCode(e,t,a)},this.updateImageURL=function(e,n){var t=a(e),i=s.readEmbedAttrs(t);if(i){var o=i.id,l=i.style,d=r.findImageSet(n,o);if(d){var u=(0,c()._T)(l),p=u.width?+u.width.replace("px",""):256,m=d.findBestVariant("scaled",p),f=d.getVariantUrl(m);t.attr("src",f)}}};this.readVimeoHeader=function(n){var t="/oemiv"+n.trim().replace("https://vimeo.com","").replace("http://vimeo.com","").replace("vimeo.com",""),a=e.defer(),i=new XMLHttpRequest;i.open("HEAD",t),i.onreadystatechange=function(){if(this.readyState===this.DONE){var e=this.responseURL;if(e){var n=e.replace("http://localhost/","").replace("https://tockify.com/","").replace("oemiv/","");a.resolve(n)}else a.reject("No response URL from Vimeo proxy")}};try{i.send()}catch(e){console.error("Vimeo proxy error: ",e)}return a.promise},this.urlToEmbedData=function(n){n=n.trim();var t=(0,c().US)(n);return t?"vimeo_resolvable"===t.type?s.readVimeoHeader(n).then(function(n){return e.resolve({id:n,type:"vimeo"})}).catch(function(n){return e.reject(n)}):e.resolve(t):e.reject("Unknown URL type")},this.contentToGenericData=function(e){return{code:e,type:"html",id:"em-"+(0,Nt().up)()}},this.urlToIEmbedData=function(n){var t=(0,c().vZ)(n);return t?e.resolve(t):e.reject("Invalid iframe URL")},this.createEmbedTag=function(e){return(0,Ut().k)("<tkfmedia></tkfmedia>",e)},this.toEmbedTag=function(e){var n=e instanceof t,a=i(e),o=s.readEmbedAttrs(a);if(!o)return e;
2var r=l.createEmbedTag(o);return n?i(r):r},this.toEmbedTagFilter=function(e,n){if(void 0===e)return e;var r,s=(e=o.valueOf(e))instanceof t,c=i(e);return c.find("[data-tkf-mediatype]").each(function(){var e=a(this),t=l.toEmbedTag(e,n);e.replaceWith(t.html())}),s?c:(r=c)instanceof t?r.html():r}}])}),Oe=t.cw(function(e,n){t.d(n,{g:()=>i}),Dt();var a="/api/eventex",i={exclude:function(e,n,t){return(0,Dt().TB)("".concat(a,"/").concat(e,"/").concat(n,"/").concat(t))},unexclude:function(e,n,t){return(0,Dt().Un)("".concat(a,"/").concat(e,"/").concat(n,"/").concat(t))}}}),Ne=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o(),Pt(),Oe(),Re(),Be(),Ut(),He(),Et();var i=ao(),r=function(e){e&&e.tzid&&(e.tzid=Et().hV.fixTZ(e.tzid))},s=Xi(),l=function(e){var n=s("<tkfmedia></tkfmedia>"),t={featured:!0,type:"image",id:e,style:"align:left"};(0,Ut().k)(n,t);var a=n[0].outerHTML;return a},c=function(e){var n,t,a;if(e.recurrence.rrule){var i=e.recurrence.rrule;n=i.start.tzid,a=i.allDay,t=i.duration}else{var o=e.recurrence.when;n=o.start.tzid,a=o.allDay,t=o.end?o.end.millis-o.start.millis:0}return{tzid:n,allDay:a,duration:t}};Eo()().module("tkfngApp").factory("EventGroup",["$resource","ViewerEmbedTools","$q","tkfNotify",function(e,n,a,o){function s(e){var n=Eo()().fromJson(e);if(!n.recurrence)return n;if(0===n.version&&n.imageIdNg&&(n.description=l(n.imageIdNg)+n.description),n.version=1,n.recurrence.when){var t=n.recurrence.when;delete t.start.ltz,delete t.start.offset,r(t.start),t.end&&(delete t.end.ltz,delete t.end.offset,r(t.end))}if(n.recurrence.rrule){var a=n.recurrence.rrule.start;delete a.ltz,delete a.offset,r(a),r(n.recurrence.rrule.until)}return n.mods&&n.mods.forEach(function(e){return function(e,n){var t=c(n),a=t.tzid,i=t.duration,o=t.allDay;if(e.when){var s=e.when;delete s.start.ltz,delete s.start.offset,r(s.start),s.end&&(delete s.end.ltz,delete s.end.offset,r(s.end))}return e.when=e.when||{},e.when.start=e.when.start||{},e.when.start.millis=e.when.start.millis||e.tid,e.when.start.tzid=e.when.start.tzid||a,e.when.allDay=e.when.allDay||o,(e.when.end||i)&&(e.when.end=e.when.end||{},e.when.end.millis=e.when.end.millis||e.tid+i,e.when.end.tzid=e.when.end.tzid||a),e.when.end,e.description&&!e.version&&e.imageIdNg&&(e.description=l(e.imageIdNg)+e.description),e.version=1,e.description=e.description||n.description,e.customPreview=e.customPreview||n.customPreview,e.privateNotes=e.privateNotes||n.privateNotes,e.title=e.title||n.title,e.where=e.where||n.where,e.when=e.when||n.where,e.imageId=e.imageId||n.imageId,e.attachments=e.attachments||n.attachments,e.customButton=e.customButton||n.customButton,e.organizer=e.organizer||n.organizer,e.performers=e.performers||n.performers,e.priority&&(e.priority<0?(e.pinned=!0,e.absPriority=-e.priority):e.absPriority=e.priority),e}(e,n)}),n.rdates&&(n.rdates,n.rdates.sort(u)),n.priority&&(n.priority<0?(n.pinned=!0,n.absPriority=-n.priority):n.absPriority=n.priority),n}var d=e("/api/eventgroup/:calid/:uid",{uid:"@uid",calid:"@calid"},{update:{method:"PUT",transformResponse:s},save:{method:"POST",transformResponse:s},get:{method:"GET",transformResponse:s}});d.createWithDefaults=function(e,n,t,a){"string"==typeof a&&(delete(a=JSON.parse(a)).tid,delete a.uid,delete a.calid);var o,r=(a=a||{}).when;(r&&(delete a.when,a.recurrence={when:r}),t)?o={start:{millis:i.tz({hour:0},n).valueOf(),tzid:n},allDay:!0}:o={start:{millis:i.tz(n).startOf("day").hours(8).valueOf(),tzid:n},allDay:!1};var s={version:2,title:"",description:"",rsvp:!1,tags:[],attachments:[],where:{},status:{name:"scheduled"},priority:10,absPriority:10,recurrence:{when:o},exdates:[],mods:[],rdates:[]},l=Object.assign(s,a,{calid:e});return l.mods=[],l.exdates=[],l.rdates=[],new d(l)},d.prototype.setMod=function(e){this.mods,e.tid,e.rid;var n=this.mods.find(function(n){return+n.tid===+e.tid&&n.rid===e.rid});if(n){var t=this.mods.indexOf(n);-1!==t&&this.mods.splice(t,1)}this.mods.push(e),this.mods},d.prototype.getMod=function(e,n){var t=this.mods.find(function(t){return+t.tid===+e&&t.rid===n});if(t)return t;var a=c(this),i=a.tzid,o=a.duration,r=a.allDay;return{tid:e,rid:n,when:{start:{millis:e,tzid:i},end:{millis:e+o,tzid:i},allDay:r}
2,priority:this.priority,where:this.where,title:this.title,description:this.description,rsvp:this.rsvp,rsvpLink:this.rsvpLink,tags:this.tags,externalVLoc:this.externalVLoc}};var u=function(e,n){var t=e.tid-n.tid,a=e.rid-n.rid,i=0!==t?t:a;return i};return d.prototype.doAddRDate=function(e){this.rdates.push(e),this.rdates.sort(u)},d.prototype.doRemoveRDate=function(e,n){this.rdates=this.rdates.filter(function(t){return!(t.tid===e&&t.rid===n)}),this.mods=this.mods.filter(function(t){return!(t.tid===e&&t.rid===n)})},d.prototype.removeMod=function(e,n){this.mods=this.mods.filter(function(t){return t.tid,t.rid,!(t.tid===e&&t.rid===n)})},d.prototype.deleteRDateMod=function(e,n){var t=this,i=a.defer();return o.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Delete Event",main:"Remove this event from your calendar",actionLabel:"Delete Event",action:function(){return i.resolve(t.removeRDate({tid:e,rid:n}))}}}),i.promise},d.prototype.removeRDate=function(e){var n=this,t=e.tid,a=e.rid,i=this.calid,r=this.uid;if(1===this.rdates.length&&!d.checkUntil(this.recurrence.rrule))throw o.status.open("Can't remove as repeating event group would have no events","error",1e4),"removeRDate vetoed";return Re().P.remove(i,r,t,a).then(function(){n.doRemoveRDate(t,a),o.status.open("Event Removed","success",3e3)}).catch(function(){o.status.open("Couldn't remove event","error",1e4)}).finally(function(){o.spinner.close()})},d.prototype.addRDate=function(e,n){var t=this,a=this.calid,i=this.uid;return this.uid,Re().P.add(a,i,e,n).then(function(e){o.status.open("Added Repeat","success",3e3),t.doAddRDate(e)}).catch(function(){o.status.open("Add Repeat Failed","error",1e4)}).finally(function(){o.spinner.close()})},d.prototype.addExDate=function(e){var n=this,t=a.defer();return o.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Delete Event",main:"Delete this event from the repeating event group",actionLabel:"Delete this event",action:function(){return t.resolve(n.doAddExDate(e))}}}),t.promise},d.prototype.doAddExDate=function(e){return Oe().g.exclude(this.calid,this.uid,e).then(function(){o.status.open("Removed","success",3e3)}).catch(function(){o.status.open("Remove Failed","error",1e4)}).finally(function(){o.spinner.close()})},d.findImageSet=function(e,n){var t=e.imageSets.find(function(e){return e.id===n});return!!t&&(t.setData?t:new(Pt().W)(t))}
2,d.addImageSets=function(e,n){n=(n||[]).map(function(e){return e.setData?e.setData:e}),e.imageSets=[].concat(t(e.imageSets||[]),t(n)),e.imageSets},d.prototype.revertMod=function(e,n){var t=this;return this.getMod(e,n)?Be().f.revert(this.calid,this.uid,e,n).then(function(){t.removeMod(e,n)}):a.reject()},d.prototype.removeExDate=function(e){return Oe().g.unexclude(this.calid,this.uid,e).then(function(){o.status.open("Repeat Enabled","success",3e3)}).catch(function(){o.status.open("Couldn't enable repeat","error",1e4)}).finally(function(){o.spinner.close()})},d.makeFeaturedImageEmbedCode=l,d.checkUntil=function(e){if(!e)return!0;var n=e.until;if(n){var t=e.start.millis-1e3,a=i.tz.zone(e.start.tzid).utcOffset(t),o=He().u.convertRRule(e);return He().u.getReps(o,t,n-60*a*1e3).length>0}return!0},d}])}),Ue=t.cw(function(e,n){const a={priorityOptions:[{v:0,label:"0 (lowest)"},{v:1,label:1},{v:2,label:2},{v:3,label:3},{v:4,label:4},{v:5,label:5},{v:6,label:6},{v:7,label:7},{v:8,label:8},{v:9,label:9},{v:10,label:"10 (default)"},{v:11,label:11},{v:12,label:12},{v:13,label:13},{v:14,label:14},{v:15,label:15},{v:16,label:16},{v:17,label:17},{v:18,label:18},{v:19,label:19},{v:20,label:"20 (highest)"}].reverse(),statusOptions:[{v:"scheduled",label:"Published - shown in calendar (this is the default)",shortLabel:""},{v:"provisional",label:"Provisional - date to be confirmed",shortLabel:"Provisional"},{v:"cancelled",label:"Cancelled",shortLabel:"Cancelled"},{v:"postponed",label:"Postponed - date to be announced",shortLabel:"Postponed"},{v:"rescheduled",label:"Rescheduled - previous date included in label",shortLabel:"Rescheduled"},{v:"movedOnline",label:"Moved Online (from physical location)",shortLabel:"Moved Online"},{v:"rescheduledOnline",label:"Rescheduled & Moved Online",shortLabel:"Rescheduled & Moved Online"},{v:"notice",label:"Notice - prominent notice with your custom text",shortLabel:"Notice"},{v:"busy",label:"Busy - Show as busy with event details hidden",shortLabel:"Busy"},{v:"hidden",label:"Unpublished - does not appear in public calendar",shortLabel:"Unpublished"},{v:"unlisted",label:"Unlisted - only visible by sharing link to event",shortLabel:"Unlisted"}]};t.d(n,["A",0,a])}),Be=t.cw(function(e,n){t.d(n,{f:()=>o}),Dt();var a="/api/eventmod",i=function(e){if(e.when){var n=e.when;delete n.start.ltz,delete n.start.offset,n.end&&(delete n.end.ltz,delete n.end.offset)}return e.priority&&(e.priority<0?(e.pinned=!0,e.absPriority=-e.priority):e.absPriority=e.priority),e},o={update:function(e,n,t){var o=t.tid,r=t.rid;return(0,Dt().mI)("".concat(a,"/").concat(e,"/").concat(n,"/").concat(o,"/").concat(r),t).then(function(e){return i(e)})},revert:function(e,n,t,i){return(0,Dt().Un)("".concat(a,"/").concat(e,"/").concat(n,"/").concat(t,"/").concat(i))}}}),Re=t.cw(function(e,n){t.d(n,{P:()=>i}),Dt();var a="/api/eventrdate",i={add:function(e,n,t,i){var o="number"==typeof i?"/"+i:"";return(0,Dt().TB)("".concat(a,"/").concat(e,"/").concat(n,"/").concat(t)+o)},remove:function(e,n,t,i){return(0,Dt().Un)("".concat(a,"/").concat(e,"/").concat(n,"/").concat(t,"/").concat(i))}}}),Ge=t.cw(function(e,n){function t(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}o();Eo()().module("tkfngApp").service("EventLoc",["$resource","SimpleSelectModel",function(e,n){var a=this;this.CHOOSE_LABEL="Choose Saved Location";var i=e("/api/caleventlocs/:calid",{},{query:{method:"GET",isArray:!0}}),o=e("/api/eventloc/:id",{id:"@id"},{update:{method:"PUT"}}),r=e("/api/toucheventloc/:id",{id:"@id"},{query:{method:"GET",isArray:!1}}),s=e("/api/caleventlocs/:calid",{},{query:{method:"GET",params:{search:""},isArray:!0}});this.touchEventLoc=function(e){return r.query({id:e})};var l=[];this.deleteLoc=function(e,n){if(e.id){var t=e.id;return new o(e).$delete().then(function(){l=l.filter(function(e){return e.id!==t}),n&&c(n)})}},this.saveEventLoc=function(e,n){if(e.name=(e.name||"").trim(),e.name){var t=new o(e);
2return t.$save().then(function(e){return(l=l.filter(function(e){return e.id!==t.id})).unshift(e),n&&c(n),e})}};var c=function(e){if(e){e.eventLocs=t(l);var i=l.map(function(e){return e.name});0===i.length?delete e.eventLocNames:e.eventLocNames=new n([a.CHOOSE_LABEL].concat(t(i)))}};this.eventLocs=l,this.findEventLoc=function(e){var n=l.filter(function(n){return 0===n.name.indexOf(e)});if(0===n.length)return!1;for(var t=0,a=0,i=0;i<n.length;i++)n[i].length>a&&(t=i,a=n[i].length);return n[t]},this.getEventLocs=function(e,n){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:20;return i.query({calid:e,search:a}).$promise.then(function(e){var a;(a=l).splice.apply(a,[0,l.length].concat(t(e))),n&&c(n)})},this.useEventLoc=function(e,n){l.map(function(e){return e.name});var t,i=l.find(function(e){return e.name===n});if(i){e.place=i.place,e.address=i.address,e.directions=i.directions;var o=i.location&&(t=i.location,!(0===Object.keys(t).length));e.location=o?i.location:void 0,e.use=!0,a.touchEventLoc(i.id)}},this.searchEventLocs=function(e,n){return s.query({calid:n,search:e}).$promise}}])}),qe=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}o(),Eo()().module("tkfngApp").service("Forms",function(){var e=function(e,n){Eo()().forEac
2h(e,function(a,i){if("object"===t(a)&&a.hasOwnProperty("$dirty")&&0!==i.indexOf("$"))try{e[i].$dirty=n,e[i].$pristine=!n}catch(n){e[i]}})};this.makeFormDirty=function(n){return e(n,!0)},this.makeFormClean=function(n){return e(n,!1)}})}),je=t.cw(function(e,n){t.d(n,{D:()=>s}),Nt();var a="__googleMapsApiOnLoadCallback",i=["channel","client","key","language","region","v","libraries","loading"],o={key:"AIzaSyAB3qpj1XGaz3irSfwuPz1OILaLAErMWTc",v:"quarterly",libraries:"geometry,visualization,places",loading:"async"},r=null,s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e4;return r||(r=new Promise(function(n,t){var s=null,l=!1,c=function(e){l||(l=!0,s&&clearTimeout(s),delete window[a],e())};window[a]=function(){c(function(){return n(window.google.maps)})},e>0&&(s=setTimeout(function(){c(function(){r=null,t(new Error("Google Maps API load timed out"))})},e));var d=i.filter(function(e){return o[e]}).map(function(e){return"".concat(e,"=").concat(encodeURIComponent(o[e]))});d.unshift("callback=".concat(a));var u="https://maps.googleapis.com/maps/api/js?".concat(d.join("&"));(0,Nt().kG)(u,e).catch(function(){c(function(){r=null,t(new Error("Google Maps API script failed to load"))})})}))}}),We=t.cw(function(e,n){o(),Nt(),Dt(),Eo()().module("tkfngApp").service("GoogleSync",["$state","$resource","tkfNotify","$q",function(e,n,t,a){var i,o=this;this.CreateSync=n("/api/google/createSyncedCalendar",{},{}),this.ConnectSync=n("/api/google/connectGoogleSync",{},{change:{method:"PUT"}}),this.DisconnectSync=n("/api/google/disconnectGoogleSync",{},{disconnect:{method:"PUT"}}),this.GoogleCalendars=n("/api/google/calendars/:id",{id:"@id"},{isArray:!0}),this.GoogleCalSync=n("/api/google/calsync/:id",{id:"@id"},{}),this.GoogleAccounts=n("/api/google/accounts",{},{isArray:!0}),this.GoogleCalendarsResync=n("/api/google/resync/:id"),this.GoogleCalendarsRefreshWatch=n("/api/google/refreshwatch/:id"),this.GoogleCalendarsCheckSync=n("/api/google/checkSync/:calkey"),this.GoogleCalendarsResetMissing=n("/api/google/resetMissing/:calkey"),this.getTimeBasedToken=n("/api/sited/token");var r,s=0;this.checkSync=function(e){var n=(new Date).getTime();return i&&n-s<18e6?a.resolve({auth:!0}
2):(s=n,o.GoogleCalendarsCheckSync.get({calkey:e}).$promise.then(function(e){if("missing.calendar"===(0,Nt().vd)(e,"errors.auth.type"))return i=!1,a.resolve({valid:!1,missing_calendar:!0});if("invalid"===(0,Nt().vd)(e,"errors.auth.type")){var n=(0,Nt().vd)(e,"info.accountId");return i=!1,a.resolve({valid:!1,not_authorized:!0,googleAccountId:n})}return i=!0,a.resolve({valid:!0})}))},this.resetMissing=function(e){return o.GoogleCalendarsResetMissing.get({calkey:e}).$promise},this.forceResync=function(e){return r||((r=a.all([o.GoogleCalendarsResync.get({id:e}).$promise,o.GoogleCalendarsRefreshWatch.get({id:e}).$promise])).finally(function(){return r=!1}),r)},this.showSyncPopup=function(n){return t.popup.open({view:Ga(),animation:"message",kind:"info",tparams:{title:"Calendar Sync Has Started",main:"<p>We are now synchronizing with your Google Calendar. If it's large this might take a few minutes to complete - just refresh the page if it's not there already.</p>"},afterClose:function(){window.location=e.href("edit.inter",{calname:n.toLowerCase()})}})},this.startOAuth=function(){window.top===window.self?window.location="/api/google/oauth/initialize":(0,Dt().hm)("/api/sited/token").then(function(e){var n="/api/fwd".concat("/api/google/oauth/initialize","?stk=").concat(e);"Launch Google OAuth: ".concat(n),window.open(n,"oauthWindow").focus()})}}])}),Ve=t.cw(function(e,n){t.d(n,{Bd:()=>i}),Dt();var a="/api/icsImport",i={get:function(e,n){return(0,Dt().hm)("".concat(a,"/").concat(e,"?abort=").concat(n))},upload:function(e,n){return(0,Dt().TB)("".concat(a,"/").concat(e),n)},remove:function(e,n){return(0,Dt().Un)("".concat(a,"/").concat(e,"?removeAll=").concat(n))}}}),He=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,s(a.key),a)}}function o(e,n,t){return n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function r(e,n,t){return(n=s(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{u:()=>d}),oo();var l=ao(),c=[oo().p3.MO,oo().p3.TU,oo().p3.WE,oo().p3.TH,oo().p3.FR,oo().p3.SA,oo().p3.SU],d=new(o(function e(){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"convertRRule",function(e){var n=l(e.start.millis).tz(e.start.tzid),t=n.valueOf()+60*(n.utcOffset()||0)*1e3,a={freq:oo().p3[e.freq.toUpperCase()],interval:e.interval,dtstart:l.utc(t).toDate(),tzid:e.start.tzid};if(e.wkst&&(a.wkst=c[+e.wkst-1]),e.count&&(a.count=e.count),e.until){var i=l.tz.zone(e.start.tzid).utcOffset(n);a.until=l(e.until-1-60*i*1e3).toDate()}if(e.bymonthday&&(a.bymonthday=e.bymonthday),"weekly"===e.freq&&e.byday){for(var o=0,r=Object.keys(e.byday),s=r.length;o<s;o++)void 0===e.byday[r[o]]&&delete e.byday[r[o]];var d=Object.keys(e.byday).map(function(e){return+e});a.byweekday=d.map(function(e){return c[e-1]})}if("monthly"===e.freq&&e.byday){var u=[];(0,$o.A)(e.byday,function(e,n){var t=c[+n-1];e.forEach(function(e){return u.push(t.nth(e))})}),a.byweekday=u}var p=new(oo().p3)(a);return p.toString(),p}),r(this,"getReps",function(e,n,t){var a=new Date(t),i=e.between(new Date(n),a).map(function(e){return e.getTime()});return new Date(n),i}),r(this,"checkModAgainst",function(e,n){var t=l(n),a=t.valueOf()+60*(t.utcOffset()||0)*1e3;return e.find(function(e){return e===a})})}))}),Ye=t.cw(function(e,n){t.d(n,{E:()=>i,v:()=>a});var a=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=n.defaultUrl,a=n.defaultState,i=e.params,o=i.next,r=i.nextState;return o&&(o=decodeURIComponent(o)),r&&(r=decodeURIComponent(r)),r?e.href(r):o||(a?e.href(a):t)},i=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=n.defaultUrl,i=n.defaultState,o=a(e,{defaultUrl:t,defaultState:i});o&&(window.location.href=o)}}),Ke=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,r(a.
2key),a)}}function o(e,n,t){return(n=r(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{p:()=>s});var s=new(function(){return e=function e(){var n=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),o(this,"ctr",0),o(this,"idToOrder",{}),o(this,"getOrder",function(e){return n.idToOrder[e]})},(n=[{key:"createOrder",value:function(e){return e=e||++this.ctr,this.idToOrder[e]={id:e},this.idToOrder[e]}},{key:"deleteOrder",value:function(e){delete this.idToOrder[e]}}])&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}())}),Je=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,s(a.key),a)}}function o(e,n,t){return n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function r(e,n,t){return(n=s(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{N:()=>c}),Dt();var l="api/sessions2",c=o(function e(){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e)});r(c,"login",function(e){return(0,Dt().TB)("".concat(l),e)}),r(c,"logout",function(){return(0,Dt().Un)("".concat(l,"/unused"))}),r(c,"mfaRecover",function(e){return(0,Dt().mI)("".concat("api/user/mfaRecovery"),e)})}),Ze=t.cw(function(e,n){o(),Eo()().module("tkfngApp").factory("SimpleSelectModel",function(){return function(e){var n,t,a;this.updateOptions=function(e){e.length>0&&("string"==typeof e[0]||"number"==typeof e[0])&&(e=e.map(function(e){return{label:""+e,value:e}})),n=e.map(function(e){return e.label}),t={},e.forEach(function(e){return t[e.label]=e.value})},this.updateOptions(e),this.getOptions=function(e){var t;return e?e!==a&&(t=n.filter(function(n){return 0===n.indexOf(e)})):t=n,a=e,t},this.render=function(n){var t=e.find(function(e){return e.value===n});return t?t.label:n},this.parse=function(e){return t[e]},this.getBestSelectionIndex=function(e){return n.indexOf(e)}}})}),Qe=t.cw(function(e,n){t.d(n,{U:()=>i,u:()=>a}),ln();var a=function(e,n){return(0,ln().C)().then(function(t){return t.createToken(e,n)})},i=function(e,n){var t=e.create(n,{style:o,classes:r});return t.mount("#stripe-".concat(n)),t.addEventListener("change",function(e){var t=e.error,a=document.getElementById("stripe-".concat(n,"-errors"));a.textContent=t?t.message:""}),t},o={base:{color:"#555",fontWeight:400,fontFamily:"Helvetica Neue,Helvetica,Arial,sans-serif",fontSize:"14px",":focus":{color:"#555"},"::placeholder":{color:"#999"},":focus::placeholder":{color:"#999"}},invalid:{color:"#a94442",":focus":{color:"#a94442"},"::placeholder":{color:"#999"}}}
2,r={focus:"focus",empty:"empty",invalid:"invalid"}}),Xe=t.cw(function(e,n){o(),Dt(),Eo()().module("tkfngApp").service("SubmittedEvent",function(){this.totalForUser=function(){return(0,Dt().hm)("/api/interim/submitCount")}})}),en=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,a)}return t}function i(e,n,a){return(n=function(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,n||"default");if("object"!=t(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}(n))in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}o(),pn(),Dt(),Eo()().module("tkfngApp").service("SubscribeAPI",function(){var e={premium:"Premium","white.label":"White Label"};this.getPlanName=function(n){return e[n]||"Unknown"},this.formatPlanName=function(n,t,a,i){return e[n]+" for "+pn().o.formatPrice(a,i)+"/"+t},this.formatMultiPlanSummary=function(n,t,a,i,o){return o+" "+e[n]+" calendar"+(1===o?"":"s")+" for "+pn().o.formatPrice(a,i*o)+"/"+t},this.subscribeToPlan=function(e,n,t,a,i,o){var r={plan:e,quantity:n};return i&&(r.tokenId=i),o&&(r.coupon=o),t&&(r.vat_number=t),a&&(r.organization_name=a),(0,Dt().TB)("/api/subscriptions",r)},this.startTrial=function(e){return(0,Dt().mI)("/api/subscriptions/startTrial",{kind:e})},this.updateSubscription=function(e,n){var t={plan:e,quantity:n};return(0,Dt().mI)("/api/subscriptions",t)},this.startChangeCard=function(){return(0,Dt().hm)("/api/subscriptions/startcard")},this.attachCard=function(e,n){return(0,Dt().mI)("/api/subscriptions/attachcard",function(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach(function(n){i(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}({intentId:e},n))},this.changeCard=function(e,n){var t={token:e,vat_number:(n=n||{}).vat_number,organization_name:n.organization_name};return(0,Dt().mI)("/api/subscriptions/card",t)},this.getCurrentCard=function(){return(0,Dt().hm)("/api/subscriptions/card")},this.getCurrentSubscription=function(){return(0,Dt().hm)("/api/subscriptions")},this.getSubscriptionStatus=function(){return(0,Dt().hm)("/api/subscription-status")},this.cancelSubscription=function(){return(0,Dt().Un)("/api/subscriptions")},this.closeAccount=function(){return(0,Dt().Un)("/api/user/deactivate")},this.getInvoiceStubs=function(){return(0,Dt().hm)("/api/subscriptions/invoicestubs")},this.getInvoice=function(e){return(0,Dt().hm)("/api/subscriptions/invoices/"+e)},this.retryPayment=function(e){return(0,Dt().hm)("/api/subscriptions/retryPayInvoice/"+e)}})}),nn=t.cw(function(e,n){o();var t=ao();Eo()().module("tkfngApp").service("SubscriptionStatus",["SubscribeAPI","Auth",function(e,n){var a=this,i=this;this.plan={};var o=!1;this.load=function(){o||a.update()},this.update=function(){n.getCurrentUser().then(function(){o=!0,e.getSubscriptionStatus().then(function(n){var a=n;a.paid||"editor"===a.kind||"unpaid"===a.kind||"invoiced"===a.kind?i.plan.category="paid":i.plan.category="free"===a.kind?"free":"trial",i.plan.kind=a.kind,i.plan.source=a.source,i.plan.upgradeUrl=a.upgradeUrl,"free"===i.plan.category||("tri
2al"===i.plan.category?(i.plan.daysLeft=t(a.trialEndDate).diff(t(),"days"),i.plan.name=e.getPlanName(a.kind),i.plan.daysLeft<0&&(i.plan.daysLeft=0)):"paid"===i.plan.category&&(i.plan.name=e.getPlanName(a.kind)))}).catch(function(){o=!1})}).catch(function(){return console.warn("no user")})}}])}),tn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").service("TKFCollections",function(){this.range=function(e,n,t){t=t||1;for(var a=[],i=e;i<=n;i+=t)a.push(i);return a},this.labelledRange=function(e,n,t){t=t||1;for(var a=[],i=e;i<=n;i+=t)a.push({label:""+i,value:i});return a}})}),an=t.cw(function(e,n){o(),Eo()().module("tkfngApp").factory("TagOptions",["$resource",function(e){return e("/api/tagoptions/:id",{id:"@_id"},{update:{method:"PUT"}})}])}),on=t.cw(function(e,n){o();var t=ao(),a=["h mm a","h mma","hh mm a","hh mma","hhmm a","hhmma","H mm","HH mm","HHmm"];Eo()().module("tkfngApp").factory("TimeSelectModel",function(){return function(e){for(var n=[],i=0;i<48;i++)n.push(t.utc(18e5*i).format(e));var o,r=n;this.getOptions=function(e){return e?e!==o&&(r=n.filter(function(n){return 0===n.indexOf(e)})):r=n,o=e,r},this.render=function(e){return e},this.parse=function(n){var i=(n||"").toLowerCase().replace(/[^0-9apm]/g," ").replace(/\s+/g," ").trim(),o=t(i,a,!0);return!!o.isValid()&&o.format(e)},this.getBestSelectionIndex=function(n){var a=r.indexOf(n);if(-1===a){var i=t(n,e);if(i.isValid()){i.minute(0);var o=i.format(e);a=r.indexOf(o)}}return a}}})}),rn=t.cw(function(e,n){t.d(n,{T:()=>a});var a={"Africa/Abidjan":"CI","Africa/Accra":"GH","Africa/Addis_Ababa":"ET","Africa/Algiers":"DZ","Africa/Asmara":"ER","Africa/Bamako":"ML","Africa/Bangui":"CF","Africa/Banjul":"GM","Africa/Bissau":"GW","Africa/Blantyre":"TZ","Africa/Brazzaville":"CG","Africa/Bujumbura":"BI","Africa/Cairo":"EG","Africa/Casablanca":"MA","Africa/Ceuta":"ES","Africa/Conakry":"GN","Africa/Dakar":"SM","Africa/Dar_es_Salaam":"TZ","Africa/Djibouti":"DJ","Africa/Douala":"CM","Africa/El_Aaiun":"EH","Africa/Freetown":"SL","Africa/Gaborone":"BW","Africa/Harare":"ZW","Africa/Johannesburg":"ZA","Africa/Juba":"SS","Africa/Kampala":"UG","Africa/Khartoum":"SD","Africa/Kigali":"RW","Africa/Kinshasa":"CD","Africa/Lagos":"NG","Africa/Libreville":"GA","Africa/Lome":"TG","Africa/Luanda":"NA","Africa/Lubumbashi":"CD","Africa/Lusaka":"ZM","Africa/Malabo":"GA","Africa/Maputo":"MZ","Africa/Maseru":"ZA","Africa/Mbabane":"SZ","Africa/Mogadishu":"-99","Africa/Monrovia":"LR","Africa/Nairobi":"SO","Africa/Ndjamena":"TD","Africa/Niamey":"NE","Africa/Nouakchott":"SM","Africa/Ouagadougou":"BF","Africa/Porto-Novo":"BJ","Africa/Sao_Tome":"ST","Africa/Tripoli":"LY","Africa/Tunis":"TN","Africa/Windhoek":"NA","America/Adak":"US","America/Anchorage":"US","America/Antigua":"AG","America/Araguaina":"BR","America/Argentina/Buenos_Aires":"AR","America/Argentina/Catamarca":"AR","America/Argentina/Cordoba":"AR","America/Argentina/Jujuy":"AR","America/Argentina/La_Rioja":"AR","America/Argentina/Mendoza":"AR","America/Argentina/Rio_Gallegos":"AR","America/Argentina/Salta":"AR","America/Argentina/San_Juan":"AR","America/Argentina/San_Luis":"AR","America/Argentina/Tucuman":"AR","America/Argentina/Ushuaia":"AR","America/Aruba":"AW","America/Asuncion":"PY","America/Atikokan":"CA","America/Bahia":"BR","America/Barbados":"BB","America/Belem":"BR","America/Belize":"BZ","America/Blanc-Sablon":"CA","America/Boa_Vista":"BR","America/Bogota":"CO","America/Boise":"US","America/Cambridge_Bay":"CA","America/Campo_Grande":"BR","America/Cancun":"MX","America/Caracas":"VE","America/Cayenne":"GF","America/Cayman":"KY","America/Chicago":"US","America/Chihuahua":"MX","America/Coral_Harbour":"CA","America/Costa_Rica":"CR","America/Creston":"CA","America/Cuiaba":"BR","America/Curacao":"CW","America/Danmarkshavn":"GL","America/Dawson":"CA","America/Dawson_Creek":"CA","America/Denver":"US","America/Detroit":"US","America/Dominica":"DM","America/Edmonton":"CA","America/Eirunepe":"BR","America/El_Salvador":"SV","America/Fort_Nelson":"CA","America/Fortaleza":"BR","America/Glace_Bay":"CA","America/Godthab":"GL","America/Goose_Bay":"CA","America/Grand_Turk":"TC","America/Grenada":"GD","America/Guadeloupe":"GP","America/Guatemala":"GT","America/Guayaquil":"PE","America/Guyana":"GY","America/Halifax":"CA","America/Havana":"CU","America/Hermosillo":"MX","America/Indiana/Indianapolis":"US","America/Inuvik":"CA","America/Iqaluit":"CA","America/Jamaica":"JM","America/Juneau":"US","America/Kentucky/Louisville":"US","America/La_Paz":"BR","America/Lima":"PE","America/Los_Angeles":"US","America/Maceio":"BR","America/Managua":"NI","America/Manaus":"BR","America/Martinique":"MQ","America/Matamoros":"MX","America/Mazatlan":"MX","America/Menominee":"US","America/Merida":"MX","America/Mexico_City":"MX","America/Moncton":"CA","America/Monterrey":"MX","America/Montevideo":"UY","America/Montreal":"CA","America/Nassau":"BS","America/Ne
2w_York":"US","America/Nipigon":"CA","America/Nome":"US","America/Ojinaga":"MX","America/Panama":"PA","America/Pangnirtung":"CA","America/Paramaribo":"SR","America/Phoenix":"US","America/Port-au-Prince":"HT","America/Port_of_Spain":"TT","America/Porto_Velho":"BR","America/Puerto_Rico":"PR","America/Rankin_Inlet":"CA","America/Recife":"BR","America/Regina":"CA","America/Resolute":"CA","America/Rio_Branco":"BR","America/Santarem":"BR","America/Santiago":"CL","America/Santo_Domingo":"DO","America/Sao_Paulo":"BR","America/Sitka":"US","America/St_Johns":"CA","America/St_Kitts":"KN","America/St_Lucia":"LC","America/St_Thomas":"VI","America/St_Vincent":"VC","America/Tegucigalpa":"HN","America/Thule":"GL","America/Thunder_Bay":"CA","America/Tijuana":"MX","America/Toronto":"CA","America/Vancouver":"CA","America/Whitehorse":"CA","America/Winnipeg":"CA","America/Yakutat":"US","America/Yellowknife":"CA","Arctic/Longyearbyen":"SJ","Asia/Aden":"YE","Asia/Almaty":"KZ","Asia/Amman":"JO","Asia/Anadyr":"RU","Asia/Aqtau":"KZ","Asia/Aqtobe":"KZ","Asia/Ashgabat":"TM","Asia/Atyrau":"KZ","Asia/Baghdad":"IQ","Asia/Bahrain":"BH","Asia/Baku":"AZ","Asia/Bangkok":"TH","Asia/Barnaul":"RU","Asia/Beirut":"LB","Asia/Bishkek":"KG","Asia/Brunei":"BN","Asia/Chita":"RU","Asia/Choibalsan":"MN","Asia/Chongqing":"CN","Asia/Colombo":"LK","Asia/Damascus":"SY","Asia/Dhaka":"BD","Asia/Dili":"TL","Asia/Dubai":"AE","Asia/Dushanbe":"TJ","Asia/Famagusta":"-99","Asia/Gaza":"PS","Asia/Harbin":"CN","Asia/Hebron":"PS","Asia/Ho_Chi_Minh":"VN","Asia/Hong_Kong":"HK","Asia/Hovd":"MN","Asia/Irkutsk":"RU","Asia/Jakarta":"ID","Asia/Jayapura":"ID","Asia/Jerusalem":"IL","Asia/Kabul":"AF","Asia/Kamchatka":"RU","Asia/Karachi":"PK","Asia/Kashgar":"CN","Asia/Kathmandu":"NP","Asia/Khandyga":"RU","Asia/Kolkata":"IN","Asia/Krasnoyarsk":"RU","Asia/Kuala_Lumpur":"MY","Asia/Kuching":"MY","Asia/Kuwait":"KW","Asia/Macau":"MO","Asia/Magadan":"RU","Asia/Makassar":"ID","Asia/Manila":"PH","Asia/Muscat":"OM","Asia/Nicosia":"CY","Asia/Novokuznetsk":"RU","Asia/Novosibirsk":"RU","Asia/Omsk":"RU","Asia/Oral":"KZ","Asia/Phnom_Penh":"KH","Asia/Pontianak":"ID","Asia/Pyongyang":"KP","Asia/Qatar":"QA","Asia/Qyzylorda":"KZ","Asia/Rangoon":"MM","Asia/Riyadh":"SA","Asia/Sakhalin":"RU","Asia/Samarkand":"UZ","Asia/Seoul":"KR","Asia/Shanghai":"CN","Asia/Singapore":"SG","Asia/Srednekolymsk":"RU","Asia/Taipei":"TW","Asia/Tashkent":"UZ","Asia/Tbilisi":"GE","Asia/Tehran":"IR","Asia/Thimphu":"BT","Asia/Tokyo":"JP","Asia/Tomsk":"RU","Asia/Ulaanbaatar":"MN","Asia/Urumqi":"CN","Asia/Ust-Nera":"RU","Asia/Vientiane":"LA","Asia/Vladivostok":"RU","Asia/Yakutsk":"RU","Asia/Yekaterinburg":"RU","Asia/Yerevan":"AZ","Atlantic/Azores":"PT","Atlantic/Bermuda":"BM","Atlantic/Canary":"ES","Atlantic/Cape_Verde":"CV","Atlantic/Faroe":"FO","Atlantic/Madeira":"PT","Atlantic/Reykjavik":"IS","Atlantic/South_Georgia":"GS","Atlantic/Stanley":"FK","Australia/Adelaide":"AU","Australia/Brisbane":"AU","Australia/Broken_Hill":"AU","Australia/Darwin":"AU","Australia/Hobart":"AU","Australia/Melbourne":"AU","Australia/Perth":"AU","Australia/Sydney":"AU","Europe/Amsterdam":"NL","Europe/Andorra":"AD","Europe/Astrakhan":"RU","Europe/Athens":"GR","Europe/Belgrade":"RS","Europe/Berlin":"DE","Europe/Bratislava":"SK","Europe/Brussels":"BE","Europe/Bucharest":"RO","Europe/Budapest":"HU","Europe/Chisinau":"MD","Europe/Copenhagen":"DK","Europe/Dublin":"IE","Europe/Gibraltar":"GI","Europe/Helsinki":"FI","Europe/Isle_of_Man":"IM","Europe/Istanbul":"TR","Europe/Kaliningrad":"RU","Europe/Kiev":"UA","Europe/Kirov":"RU","Europe/Lisbon":"PT","Europe/Ljubljana":"SI","Europe/London":"GB","Europe/Luxembourg":"LU","Europe/Madrid":"ES","Europe/Malta":"MT","Europe/Mariehamn":"AX","Europe/Minsk":"BY","Europe/Moscow":"RU","Europe/Oslo":"NO","Europe/Paris":"MC","Europe/Podgorica":"ME","Europe/Prague":"CZ","Europe/Riga":"LV","Europe/Rome":"VA","Europe/Samara":"RU","Europe/San_Marino":"SM","Europe/Sarajevo":"BA","Europe/Saratov":"RU","Europe/Simferopol":"UA","Europe/Skopje":"MK","Europe/Sofia":"BG","Europe/Stockholm":"SE","Europe/Tallinn":"EE","Europe/Tirane":"AL","Europe/Ulyanovsk":"RU","Europe/Uzhgorod":"UA","Europe/Vaduz":"LI","Europe/Vienna":"AT","Europe/Vilnius":"LT","Europe/Volgograd":"RU","Europe/Warsaw":"PL","Europe/Zagreb":"HR","Europe/Zaporozhye":"UA","
2Europe/Zurich":"CH","Indian/Antananarivo":"MG","Indian/Comoro":"KM","Indian/Mahe":"SC","Indian/Maldives":"MV","Indian/Mauritius":"MU","Indian/Mayotte":"YT","Indian/Reunion":"RE","Pacific/Apia":"WS","Pacific/Auckland":"NZ","Pacific/Bougainville":"PG","Pacific/Efate":"VU","Pacific/Fiji":"FJ","Pacific/Funafuti":"TV","Pacific/Galapagos":"EC","Pacific/Guadalcanal":"SB","Pacific/Guam":"GU","Pacific/Honolulu":"US","Pacific/Majuro":"MH","Pacific/Noumea":"NC","Pacific/Pago_Pago":"AS","Pacific/Palau":"PW","Pacific/Pohnpei":"FM","Pacific/Port_Moresby":"PG","Pacific/Rarotonga":"CK","Pacific/Saipan":"MP","Pacific/Tahiti":"PF","Pacific/Tarawa":"KI","Pacific/Tongatapu":"TO"}}),sn=t.cw(function(e,n){t.d(n,{H:()=>a});var a=["Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fortaleza","America/Glace_Bay","America/Godthab","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montreal","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santa_Isabel","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Vostok","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Choibalsan","Asia/Chongqing","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Helsinki","Europe/Istanbul","Europe/Kaliningrad","Europe/Kiev","Europe/Lisbon","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/Simferopol","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Uzhgorod","Europe/Vaduz","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis","UTC"]}),ln=t.cw(function(e,n){var a;t.d(n,{C:()=>i}),Ct(),Nt();var i=function(){return a||(a=(0,Nt().kG)("https://js.stripe.com/v3/").then(function(){var e=Ct().T.get("stripeKey","dev");return window.Stripe(e)}).catch(function(e){throw a=void 0,e})),a}}),cn=()=>t(6325),dn=()=>t(4746),un=t.cw(function(e,n){t.d(n,{I:()=>a});var a=[{c:"sq-al",n:"Albanian (Albania)"},{c:"ar-dz",n:"Arabic (Algeria)"},{c:"ar-bh",n:"Arabic (Bahrain)"},{c:"ar-eg",n:"Arabic (Egypt)"},{c:"ar-iq",n:"Arabic (Iraq)"},{c:"ar-jo",n:"Arabic (Jordan)"},{c:"ar-kw",n:"Arabic (Kuwait)"},{c:"ar-lb",n:"Arabic (Lebanon)"},{c:"ar-ly",n:"Arabic (Libya)"},{c:"ar-ma",n:"Arabic (Morocco)"},{c:"ar-om",n:"Arabic (Oman)"},{c:"ar-qa",n:"Arabic (Qatar)"},{c:"ar-sa",n:"Arabic (Saudi Arabia)"},{c:"ar-sd",n:"Arabic (Sudan)"},{c:"ar-sy",n:"Arabic (Syria)"},{c:"ar-tn",n:"Arabic (Tunisia)"},{c:"ar-ae",n:"Arabic (United Arab Emirates)"},{c:"ar-ye",n:"Arabic (Yemen)"},{c:"be-by",n:"Belarusian (Belarus)"},{c:"bg-bg",n:"Bulgarian (Bulgaria)"},{c:"ca-es",n:"Catalan (Spain)"},{c:"zh-cn",n:"Chinese (China, Singapore)"},{c:"zh-hk",n:"Chinese (Hong Kong)"},{c:"zh-mo",n:"Chinese (Macau)"},{c:"zh-tw",n:"Chinese (Taiwan)"},{c:"hr-hr",n:"Croatian (Croatia)"},{c:"cs-cz",n:"Czech (Czech Republic)"}
2,{c:"da-dk",n:"Danish (Denmark)"},{c:"nl-be",n:"Dutch (Belgium)"},{c:"nl-nl",n:"Dutch (Netherlands)"},{c:"en-au",n:"English (Australia)"},{c:"en-ca",n:"English (Canada)"},{c:"en-in",n:"English (India)"},{c:"en-ie",n:"English (Ireland)"},{c:"en-mt",n:"English (Malta)"},{c:"en-nz",n:"English (New Zealand)"},{c:"en-ph",n:"English (Philippines)"},{c:"en-sg",n:"English (Singapore)"},{c:"en-za",n:"English (South Africa)"},{c:"en-gb",n:"English (United Kingdom)"},{c:"en-us",n:"English (United States)"},{c:"et-ee",n:"Estonian (Estonia)"},{c:"fa",n:"Farsi (Iran)"},{c:"fi-fi",n:"Finnish (Finland)"},{c:"fo-fo",n:"Faroese (Faroe Islands)"},{c:"fr-be",n:"French (Belgium)"},{c:"fr-ca",n:"French (Canada)"},{c:"fr-fr",n:"French (France)"},{c:"fr-lu",n:"French (Luxembourg)"},{c:"fr-ch",n:"French (Switzerland)"},{c:"gl-es",n:"Galacian (Spain)"},{c:"de-at",n:"German (Austria)"},{c:"de-de",n:"German (Germany)"},{c:"de-lu",n:"German (Luxembourg)"},{c:"de-ch",n:"German (Switzerland)"},{c:"el-cy",n:"Greek (Cyprus)"},{c:"el-gr",n:"Greek (Greece)"},{c:"he",n:"Hebrew (Israel)"},{c:"hi-in",n:"Hindi (India)"},{c:"hu-hu",n:"Hungarian (Hungary)"},{c:"is-is",n:"Icelandic (Iceland)"},{c:"id",n:"Indonesian (Indonesia)"},{c:"ga-ie",n:"Irish (Ireland)"},{c:"it-it",n:"Italian (Italy)"},{c:"it-ch",n:"Italian (Switzerland)"},{c:"ja-jp",n:"Japanese (Japan)"},{c:"ja-jp-jp",n:"Japanese (Japan,JP)"},{c:"ko-kr",n:"Korean (South Korea)"},{c:"lv-lv",n:"Latvian (Latvia)"},{c:"lt-lt",n:"Lithuanian (Lithuania)"},{c:"mk-mk",n:"Macedonian (Macedonia)"},{c:"ms-my",n:"Malay (Malaysia)"},{c:"mt-mt",n:"Maltese (Malta)"},{c:"nb",n:"Norwegian (Norway)"},{c:"nn",n:"Norwegian (Norway,Nynorsk)"},{c:"pl-pl",n:"Polish (Poland)"},{c:"pt-br",n:"Portuguese (Brazil)"},{c:"pt-pt",n:"Portuguese (Portugal)"},{c:"ro-ro",n:"Romanian (Romania)"},{c:"ru-ru",n:"Russian (Russia)"},{c:"sr-cyrl",n:"Serbian (Cyrillic)"},{c:"sr-latn",n:"Serbian (Latin)"},{c:"sk-sk",n:"Slovak (Slovakia)"},{c:"sl-si",n:"Slovenian (Slovenia)"},{c:"es-ar",n:"Spanish (Argentina)"},{c:"es-bo",n:"Spanish (Bolivia)"},{c:"es-cl",n:"Spanish (Chile)"},{c:"es-co",n:"Spanish (Colombia)"},{c:"es-cr",n:"Spanish (Costa Rica)"},{c:"es-do",n:"Spanish (Dominican Republic)"},{c:"es-ec",n:"Spanish (Ecuador)"},{c:"es-sv",n:"Spanish (El Salvador)"},{c:"es-gt",n:"Spanish (Guatemala)"},{c:"es-hn",n:"Spanish (Honduras)"},{c:"es-mx",n:"Spanish (Mexico)"},{c:"es-ni",n:"Spanish (Nicaragua)"},{c:"es-pa",n:"Spanish (Panama)"},{c:"es-py",n:"Spanish (Paraguay)"},{c:"es-pe",n:"Spanish (Peru)"},{c:"es-pr",n:"Spanish (Puerto Rico)"},{c:"es-es",n:"Spanish (Spain)"},{c:"es-us",n:"Spanish (United States)"},{c:"es-uy",n:"Spanish (Uruguay)"},{c:"es-ve",n:"Spanish (Venezuela)"},{c:"sv-se",n:"Swedish (Sweden)"},{c:"th-th",n:"Thai (Thailand)"},{c:"tr-tr",n:"Turkish (Turkey)"},{c:"uk-ua",n:"Ukrainian (Ukraine)"},{c:"vi-vn",n:"Vietnamese (Vietnam)"},{c:"cy",n:"Welsh (Wales)"}]}),pn=t.cw(function(e,n){t.d(n,{o:()=>m}),Et(),Dt();var a=/([A-Za-z]{2})(.*)/,i={code:"gbp",major:"£",minor:"p"},o={code:"usd",major:"$",minor:"c"},r={code:"eur",major:"€",minor:"¢"},s=["BE","EL","LT","PT","BG","ES","LU","RO","CZ","FR","HU","SI","DK","HR","MT","SK","DE","IT","NL","FI","EE","CY","AT","SE","IE","LV","PL","GB"],l={GBP:i,USD:o,EUR:r,gbp:i,usd:o,eur:r},c={GR:"EL",UK:"GB"},d=function(e){return c[e]||e},u=function(e){switch(e){case"EU":return r;case"GB":default:return i;case"US":return o}},p=function(e){var n,t="GB"===(n=d(n=e))?"GB":-1!==s.indexOf(n)?"EU":"US"===n||"CA"===n?"US":"NON_EU";return u(t)},m={formatPrice:function(e,n){"string"==typeof e&&(e=l[e]);var t="";return n<0&&(t="-",n=-n),t+e.major+Number(n/100).toFixed(2)},euVatRatePromise:function(){return(0,Dt().hm)("/api/euvatrates")},countryCodesMatch:function(e,n){return n=n||"",e=(e=e||"").trim().toUpperCase(),n=n.trim().toUpperCase(),d(e),d(n),d(e)===d(n)},guessCurrencyForLocale:function(e){var n=Et().hV.guessCountryCodeFromLocale(e);return p(n)},taxRegionToCurrency:u,codeToCurrency:p,currencyCodeToCurrency:l,toVatCountryCode:d,isEUCountry:function(e){return e=d(e),-1!==s.indexOf(e)},validateAndCanonicaliseVatNo:function(e,n){if(e=d(e),!n)return{invali
2d:"missing"};var t,i,o,r=a.exec(n);r?(t=r[1].toUpperCase(),i=r[0].toUpperCase(),e!==t&&(o={invalid:"wrongCountry"})):i=e+n;var s=(0,No.mP)(i,No.Xr),l=s.isValid,c=s.value;return l||(o={invalid:"badNumber"}),o||{canonical:c}}}}),mn=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}o(),Ot(),dn(),Dt();Eo()().module("tkfngApp").controller("AccountSettingsCtrl",["Auth","$scope","tkfNotify","tkfErrors","Forms",function(e,n,a,i,o){var r;"#show-mfa-notice"===location.hash&&(a.status.open("Multi Factor Authentication is Enabled","success",3e3),location.hash=""),e.getCurrentUser().then(function(e){n.user=e}).catch(function(e){return console.warn("no user: ",e)}),n.changePassword={old:"",new:""},n.changeEmail={password:"",email:""},n.serverErrors={},n.alerts=dn().B.alerts,n.alerts.length>0&&(n.alerts[0].reason=n.alerts[0].reason||"unknown"),n.forms={};var s=window.self!==window.top;n.hideMFA=(null===(r=n.user)||void 0===r?void 0:r.isDudaUser)&&s;var l=function(e){var t=n.forms.changeEmailForm;if(!t.$valid)return o.makeFormDirty(t),void a.status.open("Please check what you've typed","error",3e3);if(!e){var r=n.fChangeEmail.email;r.$setViewValue(r.$viewValue)}if(!n.user.isDudaUser){var s=n.fChangeEmail.password;s.$setViewValue(s.$viewValue)}var l,c,d=n.user._id;void 0===d?i.notifyError("Not Logged In","<p>You don't seem to be logged in. Please log in then try again.</p>"):(a.spinner.open(),e?(l=(0,Dt().mI)("/api/user/mfaEnable",{enabled:e.enable,password:n.changeEmail.password}),e.enable?c=n.user.email:(c="",l.then(function(){n.user.mfaEnabled=!1,a.status.open("Disabled Multi Factor Authentication ","success",3e3)}))):(c="your new address",l=(0,Dt().mI)("/api/emailupdate2/"+d,{email:n.changeEmail.email,password:n.changeEmail.password})),l.then(function(e){c&&a.status.open("We've sent a validation email to ".concat(c),"success",6e3),a.popup.close()}).catch(function(e){a.status.open("Please check the values you entered","error",6e3),n.serverErrors={}
2,Eo()().forEach(e.data.errors,function(e,t){n.fChangeEmail[t].$setValidity("serverError",!1),n.serverErrors[t]=e.message})}).finally(function(){a.spinner.close()}))};n.emailUpdate=function(){return l()},n.mfaChange=function(e){return l({enable:e})},n.recovery={},n.showRecoverMFA=function(){a.spinner.open(),(0,Dt().hm)("/api/user/mfaRecovery").then(function(e){n.recovery.codes=e.join(" "),a.popup.open({view:Ja(),tparams:{recovery:n.recovery},focus:1})}).catch(function(e){console.error(e),a.status.open("Failed to get recovery codes","error",3e3)}).finally(function(){a.spinner.close()})},n.regenRecoverMFA=function(){a.spinner.open(),(0,Dt().TB)("/api/user/mfaRecovery").then(function(e){n.recovery.codes=e.join(" ")}).catch(function(e){console.error(e),a.status.open("Failed to generate recovery codes","error",3e3)}).finally(function(){a.spinner.close()})},n.passwordUpdate=function(){var e=n.fChangePassword.old;e.$setViewValue(e.$viewValue);var t=n.fChangePassword.new;t.$setViewValue(t.$viewValue);var o=n.user._id;void 0===o?i.notifyError("Not Logged In","<p>You don't seem to be logged in. Please log in then try again.</p>"):(a.spinner.open(),(0,Dt().mI)("/api/passwordupdate2/"+o,{old:n.changePassword.old,new:n.changePassword.new}).then(function(e){a.status.open("Your password has been updated","success",3e3),a.popup.close()}).catch(function(e){a.status.open("Please check the values you entered","error",3e3),n.serverErrors={}
2,Eo()().forEach(e.data.errors,function(e,t){n.fChangePassword[t].$setValidity("serverError",!1),n.serverErrors[t]=e.message})}).finally(function(){a.spinner.close()}))},n.updateUser=function(){void 0===n.user._id?i.notifyError("Not Logged In","<p>You don't seem to be logged in. Please log in then try again.</p>"):(a.spinner.open(),Ot().K.save(n.user).then(function(e){n.user=e,a.status.open("Saved Changes","success",1500)}).catch(function(e){t(e.status),400!==e.status?i.handleResponseError(e):(a.status.open("Invalid Change","error",3e3),n.serverErrors={},Eo()().forEach(e.data.errors,function(e,t){n.fUser.$setPristine(),n.fUser[t].$setValidity("serverError",!1),n.serverErrors[t]=e.message}))}).finally(function(){a.spinner.close()}))},n.refreshUser=function(){void 0===n.user._id?i.notifyError("Not Logged In","<p>You don't seem to be logged in. Please log in then try again.</p>"):(a.spinner.open(),Ot().K.getUser("me").then(function(e){n.user=e,a.status.open("Cancelled Changes","success",1500)}).catch(function(e){t(e.status),i.handleResponseError(e)}).finally(function(){a.spinner.close()}))},n.showChangePassword=function(){a.popup.open({view:Va()})},n.passwordCancel=function(){a.popup.close()},n.showChangeEmailAddress=function(){a.popup.open({view:ja()})},n.emailCancel=function(){a.popup.close()},n.showChangeMFA=function(e){a.popup.open({view:Wa(),tparams:{enable:e}})},n.showPopup=function(){a.popup.open({view:Ka(),animation:"message",kind:"error",tparams:{title:"Network Problem",main:"<p>You don't seem to be online. Please check your connection.</p>"}})}}])}),fn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.account",{url:"/account",views:{main:{template:Da(),controller:"AccountSettingsCtrl"},popup:{template:""}},authenticate:!0})}])}),gn=t.cw(function(e,n){o(),un(),Nt(),sn(),Et(),Dt(),Ct(),Eo()().module("tkfngApp").controller("CalendarSettingsCtrl",["$scope","tkfNotify","Calendar","tkfErrors","LocaleUtils","$state","Auth","Forms",function(e,n,t,a,i,o,r,s){r.getCurrentUser().then(function(n){return e.user=n}).catch(function(e){return console.warn("no user: ",e)});Ct().T.get("cdnroot","");e.googleFavicon=lo(),e.days=[{v:-1,label:"Use Default For Language/Location"},{v:0,label:"Sunday"},{v:1,label:"Monday"},{v:2,label:"Tuesday"},{v:3,label:"Wednesday"},{v:4,label:"Thursday"},{v:5,label:"Friday"},{v:6,label:"Saturday"}],e.weekOptions=[{v:-1,label:"Always show"},{v:1,label:1},{v:2,label:2},{v:3,label:3},{v:4,label:4},{v:5,label:5},{v:6,label:6},{v:7,label:7},{v:8,label:8},{v:9,label:9},{v:10,label:10},{v:11,label:11},{v:12,label:12},{v:13,label:13},{v:14,label:14},{v:15,label:15},{v:16,label:16}],e.pastWeekOptions=[{v:-1,label:"Always show"},{v:0,label:"Hide as soon as it's over"},{v:1,label:1},{v:2,label:2},{v:3,label:3},{v:4,label:4},{v:5,label:5},{v:6,label:6},{v:7,label:7},{v:8,label:8},{v:9,label:9},{v:10,label:10},{v:11,label:11},{v:12,label:12},{v:13,label:13},{v:14,label:14},{v:15,label:15},{v:16,label:16}],e.rsvpMonthOptions=[{v:1,label:1},{v:2,label:2},{v:3,label:3},{v:4,label:4},{v:5,label:5},{v:6,label:6},{v:7,label:7},{v:8,label:8},{v:9,label:9},{v:10,label:10},{v:11,label:11},{v:12,label:12},{v:13,label:13},{v:18,label:18},{v:24,label:24},{v:36,label:36},{v:-1,label:"until deleted"}],e.forms={},e.viewState={},e.genPasscode=function(){e.calendar.viewPasscode=(0,Nt().up)()};var l=o.params.id;"new"!==l?t.get({id:l,ownerView:!0}).$promise.then(function(n){"tockify.com"===n.canonicalHost&&(n.canonicalHost=""),n.locale=i.toCanonicalLocale(n.locale),n.cardinalDay||(n.cardinalDay=!1),n.spamCheckSubmittedEvents||(n.spamCheckSubmittedEvents="no"),e.calendar=n;var t=n.expFeatures||[];e.hasCustomHeadCodeFeature=t.includes("custom-head-code"),e.hasCustomBodyCodeFeature=t.includes("custom-body-code"),e.hasPasscodeFeature=t.includes("view-passcode"),e.viewState.submitterNotes=n.submitterNotes&&""!==n.submitterNotes,e.viewState.useSubmitPassword=!!n.submitPassword,e.viewState.hidePassword=!!n.submitPassword,e.istate&&(e.istate.calendar=e.calendar);var a=(n.canonicalHost||"").trim();n.canonicalHost,n.submitURL=a&&"tockify.com"!==a?"https://"+a+"/tkf2/submitEvent/"+n.submitKey:window.location.origin+"/tkf2/submitEvent/"+n.submitKey}).catch(function(e){404===e.status&&o.transitionTo("settings.calendar404",{},{location:!1})}):(e.calendar=new t({name:"",displayName:"",tzid:Et().hV.timezone,locale:Et().hV.locale,showTimeZone:!0,use24Clock:!Et().hV.hour12,publicWeeksBefore:-1,publicWeeksAfter:-1,rsvpRetainMonths:13,channelMode:!1,spamCheckSubmittedEvents:"no"}),e.istate&&(e.istate.calendar=e.calendar)),e.changeCalendarName={password:"",name:""},e.tzs=sn().H,e.locales=un().I,e.updateCalendar=function(){if(!e.forms.fCalendar.$valid)return s.makeFormDirty(e.forms.fCalendar),void n.status.open("Please check what you've typed","error",8e3);var t=!e.calendar._id;n.spinner.open();var i=e.calendar;t||delete(i=Eo()().copy(e.calendar)).ngthemeid,i.$save().then(function(){var a=t?"Created Calendar":"Saved Changes";n.status.open(a,"success",1500),t&&o.go("settings.calendar.main",{id:e.calendar._id})}).catch(function(t){400!==t.status?a.handleResponseError(t):(n.status.open("Please check the values you entered","error",8e3),e.serverErrors={}
2,s.makeFormDirty(e.forms.fCalendar),Eo()().forEach(t.data.errors,function(n,t){e.forms.fCalendar[t].$setViewValue(e.forms.fCalendar[t].$viewValue),e.forms.fCalendar[t].$setValidity("serverError",!1),e.serverErrors[t]=n.message}))}).finally(function(){n.spinner.close()})},e.cancelChanges=function(n){e.calendar._id?e.refreshCalendar(n):o.go("settings.calendars")},e.refreshCalendar=function(t){var i=e.calendar._id;n.spinner.open(),e.calendar.$get({id:i}).then(function(){t||n.status.open("Cancelled Changes","success",1500)}).catch(function(e){a.handleResponseError(e)}).finally(function(){n.spinner.close()})},e.showChangeName=function(){n.popup.open({view:qa(),afterClose:function(){e.refreshCalendar(!0)}})},e.calendarNameCancel=function(){n.popup.close()},e.calendarNameUpdate=function(){var t=e.fChangeCalendarName.password;t.$setViewValue(t.$viewValue);var a=e.fChangeCalendarName.name;a.$setViewValue(a.$viewValue),n.spinner.open(),(0,Dt().mI)("/api/calnameupdate2/"+e.calendar._id,e.changeCalendarName).then(function(){n.status.open("The calendar name has been updated","success",3e3,!0),n.popup.close(),e.calendar.name=e.changeCalendarName.name,o.go("settings.calendar.main",{id:e.calendar.name},{reload:!1}),e.refreshCalendar(!0)}).catch(function(t){n.status.open("Please check what you've typed","error",3e3),e.serverErrors={}
2,Eo()().forEach(t.errors,function(n,t){e.fChangeCalendarName[t].$setValidity("serverError",!1),e.serverErrors[t]=n.message})}).finally(function(){n.spinner.close()})},e.setOffline=function(){n.spinner.open(),(0,Dt().mI)("/api/calstatusupdate/"+e.calendar._id,{name:"offline"}).then(function(){n.status.open("Calendar Taken Offline","success",3e3),n.popup.close(),window.location.reload(!0)}).catch(function(){n.status.open("We couldn't take this calendar offline","error",3e3)}).finally(function(){n.spinner.close()})},e.setOnline=function(){n.spinner.open(),(0,Dt().mI)("/api/calstatusupdate/"+e.calendar._id,{name:"online"}).then(function(){n.status.open("Calendar Now Online","success",3e3),n.popup.close(),window.location.reload(!0)}).catch(function(){n.status.open("We couldn't bring this calendar online","error",3e3)}).finally(function(){n.spinner.close()})},e.undoDelete=function(){(0,Dt().mI)("/api/calstatusupdate/"+e.calendar._id,{name:"offline"}).then(function(){n.status.open("Calendar Deletion Cancelled","success",3e3),n.popup.close(),window.location.reload(!0)}).catch(function(){n.status.open("We couldn't restore that calendar","error",3e3)}).finally(function(){n.spinner.close()})},e.deleteCalendar=function(){(0,Dt().mI)("/api/calstatusupdate/"+e.calendar._id,{name:"pending.deletion"}).then(function(){n.status.open("This calendar will be deleted","success",3e3),n.popup.close(),window.location.reload(!0)}).catch(function(){n.status.open("We couldn't delete that calendar","error",3e3)}).finally(function(){n.spinner.close()})},e.openCalendar=function(e){o.go("settings.calendar.main",{id:e._id})},e.showDeleteCalendarModal=function(){n.popup.open({view:Ha(),animation:"message",kind:"newerror",tparams:{title:"Delete Calendar",main:'<p>Warning! Deleting a calendar is irreversible. Press "Delete Forever" below if that\'s really what you want to do.</p>',action:function(){n.popup.closeIfCloseable(),e.deleteCalendar()}}})},e.updateProfile=function(){var i;if(void 0===(null===(i=e.user)||void 0===i?void 0:i._id))a.notifyError("Not Logged In","<p>You don't seem to be logged in. Please log in then try again.</p>");else{n.spinner.open();var o=e.calendar,r=e.calendar._id;o.where=o.where||{},o.submitterNotes=e.viewState.submitterNotes?(o.submitterNotes||"").trim():"",o.submitPassword=o.submitPassword&&e.viewState.useSubmitPassword?o.submitPassword.trim():"",(0,Dt().mI)("/api/calupdate2/"+r,{address:o.where.address,place:o.where.place,directions:o.where.directions,description:o.description,url:o.url,email:o.email,facebook:o.facebook,linkedin:o.linkedin,phone:o.phone,pinterest:o.pinterest,twitter:o.twitter,showSubmitEvent:o.showSubmitEvent,autoApproveSubmittedEvents:o.autoApproveSubmittedEvents,spamCheckSubmittedEvents:o.spamCheckSubmittedEvents,priorCheckSubmittedEvents:o.priorCheckSubmittedEvents,addRSVPToSubmittedEvents:o.addRSVPToSubmittedEvents,submittedEventEmail:o.submittedEventEmail,submittedEventContactEmail:o.submittedEventContactEmail,useRequireEventLink:o.useRequireEventLink,submittedEventsTag:o.submittedEventsTag,restrictTagsToManaged:o.restrictTagsToManaged,submitterNotes:o.submitterNotes,sendUSESubmitterEmails:o.sendUSESubmitterEmails,submitPassword:o.submitPassword}).then(function(a){n.status.open("Your profile has been updated","success",3e3),n.popup.close(),t.updated(),e.viewState.hidePassword=!0}).catch(function(t){n.status.open("Please check the values you entered","error",3e3),e.serverErrors={}
2,Eo()().forEach(t.errors,function(n,t){e.fSocial[t].$setValidity("serverError",!1),e.serverErrors[t]=n.message})}).finally(function(){n.spinner.close()})}},e.sanitizeEmailFrom=function(){var n=e.calendar.emailFrom;if(n){var t=n.replace(/[<>\r\n\t]/g,"");t=(t=t.replace(/[^\x20-\x7E]/g,"")).replace(/\s+/g," "),e.calendar.emailFrom=t.trim()}},e.clearMailCheck=function(n,t){e.forms[n][t].$setValidity("email",!0)},e.doSingleMailCheck=function(n,t){var a=(e.calendar[t]||"").replace(/,/g," ").trim().toLowerCase();e.calendar[t]=a,0!==a.length&&(Nt().TB.test(a)||e.forms[n][t].$setValidity("email",!1))},e.doMailCheck=function(n,t){var a=(e.calendar[t]||"").replace(/,/g," ").trim().toLowerCase();if(e.calendar[t]=a,0!==a.length){var i=a.split(/\s+/);i.forEach(function(a){Nt().TB.test(a)||e.forms[n][t].$setValidity("email",!1)})}},e.clearGaIdCheck=function(n,t){e.forms[n][t].$setValidity("gaid",!0)},e.doGaIdCheck=function(n,t){var a=(e.calendar[t]||"").trim().toUpperCase();if(e.calendar[t]=a,0!==a.length){/(^(G|AW)-[A-Z0-9]+$)|(^UA-\d+-\d+$)/.test(a)||e.forms[n][t].$setValidity("gaid",!1)}},e.tagCheck=function(){var n=e.calendar.submittedEventsTag;e.calendar.submittedEventsTag=n.trim().replace(/ +/g,"-")}}])}),vn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendar",{url:"/calendar/:id",abstract:!0,authenticate:!0,views:{main:{template:'<div ng-controller="CalendarSettingsCtrl" ><div ui-view="" ng-cloak></div></div>'}}}).state("settings.calendar404",{url:"/missingcalendar",views:{main:{template:Ia(),controller:["$scope","$state","NavHistory",function(e,n,t){e.calname=n.params.calname,e.goBack=function(e){e&&e.preventDefault(),t.popPath()||n.go("settings.calendars")}}]}}})}])}),hn=t.cw(function(e,n){o();var t=ao();Eo()().module("tkfngApp").controller("ExportSettingsCtrl",["$scope","$state","Calendar","$window","TagOptions",function(e,n,a,i,o){e.ANGULAR_DATE_FORMAT||(e.ANGULAR_DATE_FORMAT="dd/MM/yyyy");var r=e.calName=n.params.id;e.export={html:!1,private:!1,tagsArray:[],enableStart:!1,enableEnd:!1,startString:null,endString:null},e.tagOptions={tags:[]},e.tagOptionsLoaded=!1,a.get({id:r,ownerView:!0}).$promise.then(function(n){e.calendar=n,o.get({id:r}).$promise.then(function(n){e.tagOptions=n}).catch(function(e){}).finally(function(){e.tagOptionsLoaded=!0})}),e.matchedTagOptions=function(n){if(!e.tagOptions||!e.tagOptions.tags)return[];var t=n.toLowerCase();return e.tagOptions.tags.filter(function(e){return e.text.toLowerCase().indexOf(t)>=0})};var s=function(n){if(!n)return null;var a=t(n,e.ANGULAR_DATE_FORMAT.toUpperCase());return a.isValid()?a.valueOf():null};e.exportEvents=function(){var n="/api/icsExport/"+r,t=!0,a=function(e,a){n+=(t?"?":"&")+e+"="+a,t=!1};if(e.export.html&&a("html","true"),e.export.private&&a("private","true"),e.export.tagsArray&&e.export.tagsArray.length>0){var o=e.export.tagsArray.map(function(e){return e.text}).join(",");a("tags",encodeURIComponent(o))}if(e.export.enableStart&&e.export.startString){var l=s(e.export.startString);l&&a("startms",l)}if(e.export.enableEnd&&e.export.endString){var c=s(e.export.endString);c&&a("endms",c)}i.location.href=n}}])}),bn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendar.export",{url:"/export",template:La(),controller:"ExportSettingsCtrl"})}])}),yn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("GooglesyncCtrl",["$scope","$resource","tkfNotify","$timeout","$state","Forms","GoogleSync","Auth","Calendar",function(e,n,t,a,i,o,r,s,l){e.pageState={},e.selection={},e.forms={},e.calendar={},e.$watch("selection.account",function(e,n){void 0===e&&d(),e&&e!==n&&u()});var c=!1,d=function(){if(!c)if(c=!0,i.params.id){var n=e.calendar.name=i.params.id;r.GoogleCalSync.get({id:n}).$promise.then(function(n){n.info&&n.info.nosync?e.calendar.hasSync=!1:(e.calendar.hasSync=!0,e.selection.id=n.googleId,n.summary?(e.selection.name=n.summary,e.selection.email=n.accountEmail):e.calendars&&(e.selection.calendar=e.calendars.find(function(n){return n.id===e.selection.id}),e.selection.calendar&&(e.selection.name=e.selection.calendar.summary,e.selection.email="Unknown"),e.selection)),e.pageState.ready=!0}).catch(function(n){e.calendar.hasSync=!1,e.pageState.ready=!0})}else e.pageState.ready=!0};r.GoogleAccounts.query().$promise.then(function(n){e.accounts=n,n.length>0?e.selection.account=n[0]:delete e.selection.account}).catch(function(){return console.error("failed to load calendars for "+account.email)});var u=function(){var n=e.selection.account;r.GoogleCalendars.query({id:n.id}).$promise.then(function(n){n.sort(function(e,n){return e.summary.localeCompare(n.summary)}),e.calendars=n,e.selection.calendar=null,e.selection.id&&(e.selection.calendar=e.calendars.find(function(n){return n.id===e.selection.id}),e.selection.calendar&&!e.selection.name&&(e.selection.name=e.selection.calendar.summary)),d()}).catch(function(){return console.error("failed to load calendars for "+n.email)})},p=!1;e.createSyncedCalendar=function(){if(!e.forms.fGoogleSync.$valid)return o.makeFormDirty(e.forms.fGoogleSync),void t.status.open("Please check what you've typed","error",8e3);var n=e.selection.calendar,a=e.calendar.name.toLowerCase(),i=new r.CreateSync({name:a,id:n.id,accountId:n.accountId});t.status.open("Please wait a moment while we synchronize","success",6e4),t.spinner.open(),p||(p=!0,i.$save().then(function(){t.status.open("Created Synced Calendar","success",3e3),r.showSyncPopup(a)}).catch(function(n){var a=n.data;400===n.status?(t.status.open("Please check the values you entered","error",3e3),e.serverErrors={}
2,Eo()().forEach(a.errors,function(n,t){e.forms.fGoogleSync[t].$setValidity("serverError",!1),e.serverErrors[t]=n.message})):t.status.open("Unexpected problem syncing calendar","error",6e3)}).finally(function(){p=!1,t.spinner.close()}))},e.startOAuth=r.startOAuth,e.cancelChanges=function(){i.go("settings.calendars")},e.connectSync=function(){var n=e.selection.calendar,a=e.calendar.name,i=new r.ConnectSync({accountId:n.accountId,id:n.id,name:a});t.status.open("Please wait a moment while we synchronize","success",6e4),t.spinner.open(),p||(p=!0,i.$change().then(function(e){t.status.open("Changed Synced Calendar","success",3e3),r.showSyncPopup(a)}).catch(function(e){t.status.open("Unexpected problem with Google sync","error",6e3)}).finally(function(){p=!1,t.spinner.close()}))},e.disconnectSync=function(e){t.popup.open({view:fa(),kind:"newerror",animation:"message",tparams:{title:"Disconnect From Google Calendar",main:"This is a major irreversible step. Make sure you understand what you are doing before you proceed",cancelLabel:"Cancel Disconnect",actionLabel:"Disconnect Now",action:function(){return m(e)}}})};var m=function(n){var a=e.calendar.name;e.calendar.keep,new r.DisconnectSync({calName:a,keepSyncedEvents:n}).$disconnect().then(function(e){t.status.open("Disconnected Synced Calendar","success",3e3)}).catch(function(e){t.status.open("Unexpected problem disconnecting sync","error",6e3)}).finally(function(){i.go("settings.calendars")})};e.changeSyncedCalendar=function(){var n=e.selection.calendar,a=e.calendar.name;if("disconnect"===e.calendar.action)return e.calendar.keep,void new r.DisconnectSync({calName:a,keepSyncedEvents:!!e.calendar.keep}).$disconnect().then(function(e){t.status.open("Disconnected Synced Calendar","success",3e3)}).catch(function(e){t.status.open("Unexpected problem disconnecting sync","error",6e3)}).finally(function(){i.go("settings.calendars")});var o=new r.ConnectSync({accountId:n.accountId,id:n.id,name:a});t.status.open("Please wait a moment while we synchronize","success",6e4),t.spinner.open(),p||(p=!0,o.$change().then(function(e){t.status.open("Changed Synced Calendar","success",3e3),r.showSyncPopup(a)}).catch(function(e){t.status.open("Unexpected problem with Google sync","error",6e3)}).finally(function(){p=!1,t.spinner.close()}))}}])}),wn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("GoogleReauthCtrl",["$scope","$resource","tkfNotify","$timeout","$state","Forms","GoogleSync",function(e,n,t,a,i,o,r){e.pageState={},e.forms={},e.calendar={},e.startOAuth=r.startOAuth,r.GoogleAccounts.query().$promise.then(function(n){e.account=n.find(function(e){return e.id===i.params.id}),e.pageState.ready=!0}).catch(function(){return console.error("failed toload calendars for "+account.email)})}])}),_n=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.google",{url:"/google",abstract:!0,views:{main:{template:'<div ><div ui-view="" ng-cloak></div></div>'}}}),e.state("settings.google.pickGoogleCalendar",{url:"/googleGetStarted",template:$a(),controller:"GooglesyncCtrl"}),e.state("settings.google.manageGoogleCalendar",{url:"/googleManageSync/:id",template:Fa(),controller:"GooglesyncCtrl"}),e.state("settings.google.reauthorizeGoogleCalendar",{url:"/googleReauthorize/:id",template:Ma(),controller:"GoogleReauthCtrl"})}])}),kn=t.cw(function(e,n){o(),Ve(),xt(),kt(),Eo()().module("tkfngApp").controller("ImportSettingsCtrl",["$scope","$state","tkfNotify","$timeout","Calendar","EventFormatter","$transitions",function(e,n,t,a,i,o,r){var s,l,c,d,u=e.calName=n.params.id;e.editorURL="/e/"+u;var p=!1;e.loxi={show:!1,calName:""},r.onBefore({exiting:["settings.calendar.import"]}
2,function(e){d&&a.cancel(d)}),e.abort=function(){p=!1,e.loxi.calName="",e.loxi.show=!1,f(!0)};var m=function(e){d&&a.cancel(d),d=a(function(){return f()},e)},f=function(n,t){s=e.icsImport={convertTZ:!1,futureEventsOnly:!1,deleteAllEvents:!1,loxiExport:p},delete e.previewItems,l=c=void 0,Ve().Bd.get(u,n).then(function(n){switch(e.ics=n,n.state){case"none":t?m(5e3):n.fileName&&(e.loxi.calName=n.fileName,e.loxi.show=0===e.ics.importedCount);break;case"pending":m(2e3);break;case"success":if(n.dryRun)e.previewItems=l=n.preview.map(function(n){return o.format(n,e.calendar,!1,!1)}),s.url=n.url,s.fileName=n.fileName,n.futureEvents>0&&(e.icsImport.futureEventsOnly=!0);else{if(n.state="none",0===n.futureEvents){var a=n.preview.pop().when.start.millis;e.editorURL+="?startms="+a}e.loxi.show=0===e.ics.importedCount}}})};i.get({id:u,ownerView:!0}).$promise.then(function(n){e.calendar=n,f()}),e.icsFileUploaded=function(n){s.url=n.originalUrl,s.fileName=n.name,e.importEvents(!0)},e.loxiExport=function(n){p=s.loxiExport=!0,s.fileName=n,s.url="dummy",e.importEvents(!0)},e.importEvents=function(e){s.dryRun=e,e||(p=!1,kt().i.log("ics","import-added",{calendar:u,feed:s.url,date:(new Date).toISOString()})),Ve().Bd.upload(u,s).then(function(){f(!1,!0)}).catch(function(e){console.error("ICS async import failed",e);var n="Failed to import "+s.fileName;e.errors&&e.errors.global&&e.errors.global.message&&(n+=" - "+e.errors.global.message),t.status.open(n,"error",1e4)}).finally(function(){t.spinner.close()})},e.deleteEvents=function(n){kt().i.log("ics","import-deleted",{calendar:u,feed:s.url,date:(new Date).toISOString()}),Ve().Bd.remove(u,n).then(function(a){t.status.open("Events Deleted","success",3e3),e.ics.importedCount=0,n&&(e.ics.otherCount=0),e.loxi.show=!!e.loxi.calName})},e.showDeleteImportedEventsModal=function(){t.popup.open({view:Ya(),animation:"message",kind:"newerror",tparams:{title:"Delete All Imported Events",main:'<p>Warning! Deleting all events is irreversible. Press "Delete All Events" below if that\'s really what you want to do.</p>',action:function(){t.popup.closeIfCloseable(),e.deleteEvents(!1)}},afterClose:function(){e.icsImport.deleteAllEvents=!1}})},e.convertTZ=function(){e.ics.preview&&!c&&(e.ics.preview.forEach(function(n){n.when.start.tzid===e.ics.timezone&&(n.when.start.tzid=e.calendar.tzid),n.when.end&&n.when.end.tzid===e.ics.timezone&&(n.when.end.tzid=e.calendar.tzid)}),c=e.ics.preview.map(function(n){return o.format(n,e.calendar,!1,!1)})),e.previewItems=e.previewItems===l?c:l};var g=Date.now();e.filter=function(n){return!e.icsImport.futureEventsOnly||("repeat"===n.event.kind||n.event.when.end&&n.event.when.end.millis>g||n.event.when.start.millis>g)}}])}),Sn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendar.import",{url:"/import",template:Oa(),controller:"ImportSettingsCtrl"})}])}),xn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendar.main",{url:"",template:Na()})}])}),Cn=t.cw(function(e,n){o();var t=ao();Eo()().module("tkfngApp").controller("USESettingsCtrl",["$scope","LocaleCentral",function(e,n){var a=n.getDateTimeFormats({editor:!0}).dateFormat;e.ANGULAR_DATE_FORMAT=a.replace(/D/g,"d").replace(/Y/g,"y"),e.textWhen={start:t.tz().format(a)},e.startms=function(){return t.tz(e.textWhen.start,a,"UTC").valueOf()}}])}),Tn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendar.userSubmitted",{url:"/userSubmitted",template:Ua(),controller:"USESettingsCtrl"})}])}),An=t.cw(function(e,n){o(),Ct(),jn(),Eo()().module("tkfngApp").controller("CalendarsSettingsCtrl",["$scope","tkfNotify","Calendar","tkfErrors","$state","Auth","$timeout",function(e,n,t,a,i,o,r){e.cdnroot=Ct().T.get("cdnroot",""),e.dudaUpgrade=jn().Nd,o.refreshCurrentUser().then(function(n){return e.user=n,t.query({users:e.user._id}).$promise}).then(function(n){return r(function(){n.sort(function(e,n){var t=e.name,a=n.name;return t>a?1:t<a?-1:0}),e.calendars=n,e.undeletedCalendars=n.filter(function(e){return"deleted"!==e.status.name}
2),e.undeletedCalendars.forEach(function(e){e.viewerURL="\\"+e.name,e.viewPasscode&&(e.viewerURL+="?passcode="+e.viewPasscode)})},0)}).catch(function(){}),e.openCalendar=function(e){i.go("settings.calendar.main",{id:e.name})},e.hasAvailableCalendars=function(){return e.user.onlineCalendars<e.user.maxOnlineCalendars}}])}),En=t.cw(function(e,n){o(),Ct(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendars",{url:"/calendars",views:{"main@settings":{template:Ba(),controller:["$scope",function(e){Ct().T.get("cdnroot","");e.googleFavicon=lo()}]}},authenticate:!0})}])}),Pn=t.cw(function(e,n){o(),Mt(),Eo()().module("tkfngApp").controller("CustomFontsSettingsCtrl",["$scope","CustomFont","Auth","tkfNotify",function(e,n,t,a){var i;e.viewState={},e.fontDisplayName=Mt().Z.idToFamily,e.removeCustomFont=function(n){var t=n.provider,a=n.args;"fontface"===t&&!a.url&&a.id&&(t="gfont"),r(n).then(function(){return e.fontGroups[t]=e.fontGroups[t].filter(function(e){return n._id!==e._id})})},e.addGFont=function(){var n=(e.viewState.gFontInput||"").trim();n?o("fontface",{id:n}).then(function(n){e.fontGroups.gfont=e.fontGroups.gfont||[],e.fontGroups.gfont.push(n),e.viewState.gFontInput=""}):a.status.open("Nothing to add","error",1e3)},e.addTypekit=function(){var n=(e.viewState.typekitInput||"").trim();n?o("typekit",{id:n}).then(function(n){e.fontGroups.typekit=e.fontGroups.typekit||[],e.fontGroups.typekit.push(n),e.viewState.typekitInput=""}):a.status.open("Nothing to add","error",1e3)},e.addFontFace=function(){var n=(e.viewState.fontFaceInput||"").trim();n=n.replace("http://","https://"),/https?:\/\/.*/.exec(n)||(n="https://"+n),n?o("fontface",{url:n}).then(function(n){e.fontGroups.fontface=e.fontGroups.fontface||[],e.fontGroups.fontface.push(n),e.viewState.fontFaceInput=""}):a.status.open("Nothing to add","error",1e3)},e.addFontsDotCom=function(){var n=(e.viewState.fontsDotComInput||"").trim(),t=(e.viewState.fontsDotComVersionInput||"").trim();n?o("fontsdotcom",{projectId:n,version:t}).then(function(n){e.fontGroups.fontsdotcom=e.fontGroups.fontsdotcom||[],e.fontGroups.fontsdotcom.push(n),e.viewState.fontsDotComInput="",e.viewState.fontsDotComVersionInput=""}):a.status.open("Nothing to add","error",1e3)},t.getCurrentUser().then(function(e){return i=e,n.query({userId:e._id}).$promise}).then(function(n){var t,a;e.cfs=n,t=n,a=(0,Uo.A)(t,function(e){return e.provider+JSON.stringify(e.args)}),e.fontGroups=(0,Bo.A)(a,function(e){return e.provider}),e.fontGroups.gfont=e.fontGroups.fontface.filter(function(e){return e.args.id}),e.fontGroups.fontface=e.fontGroups.fontface.filter(function(e){return e.args.url}),e.fontGroups}).catch(function(){});
2var o=function(e,t){var o=i._id,r=new n({userId:o,provider:e,args:t});a.spinner.open();var s=r.$save();return s.then(function(){a.status.open("Added new font","success",3e3)}).catch(function(){a.status.open("Unable To Add Font - check name","error",6e3)}).finally(function(){a.spinner.close()}),s},r=function(e){a.spinner.open();var n=e.$remove();return n.then(function(){a.status.open("Removed font","success",3e3)}).catch(function(){a.status.open("Unable To Remove Font","error",6e3)}).finally(function(){a.spinner.close()}),n}}])}),zn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.customFonts",{url:"/customFonts",views:{main:{template:Ra(),controller:"CustomFontsSettingsCtrl"},popup:{template:""}},authenticate:!0})}])}),Dn=t.cw(function(e,n){o(),dn(),Eo()().module("tkfngApp").controller("SettingsCtrl",["$scope",function(e){e.errors={},e.calendar=null,e.alerts=dn().B.alerts,e.istate={},e.isDudaUser=dn().B.usermeta.isDudaUser,e.hideHome=function(){return window.top!==window.self&&e.isDudaUser};var n=dn().B.onlineCalmetas,t=n.length>0?n[0].name:"";e.editorLink=function(){var n=e.istate.calendar,a=null!=n&&n.name?n.name:t;return a?"/e/".concat(a):"/i/settings/calendars"}}])}),In=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings",{url:"/i/settings",redirectTo:"settings.account",views:{main:{template:Za(),controller:"SettingsCtrl"},popup:{template:""}},authenticate:!0})}])}),Ln=t.cw(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,a)}return t}function i(e,n,a){return(n=function(e){var n=function(e,n){if("object"!=t(e)||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,n||"default");if("object"!=t(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==t(n)?n:n+""}(n))in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}o(),pn(),jn();var r=ao();Eo()().module("tkfngApp").controller("SubscriptionSettingsCtrl",["$scope","SubscribeAPI","tkfNotify",function(e,n,t){t.spinner.open(),n.getSubscriptionStatus().then(function(t){var o=t;if(o.subscription&&"incomplete"===o.subscription.status?e.planCategory="incomplete":o.paid?e.planCategory="paid":["invoiced","editor","unpaid"].includes(o.kind)?e.planCategory="other":e.planCategory="free"===o.kind?"free":"trial",e.kind=o.kind,e.source=o.source,"duda"===o.source){e.dudaUpgrade=function(e){(0,jn().Nd)([o.planUuid,e])};var s=n.getPlanName(o.kind);e.planDescription="".concat(o.quantity," ").concat(s," calendar").concat(1===o.quantity?"":"s");var l="premium",c="white.label";e.planKinds=[{name:"Premium",value:l},{name:"White Label",value:c}];var d=o.premiumPlans.map(function(e,n){var t=1+n;return{name:"".concat(t," calendar").concat(1===t?"":"s"),value:t,uuid:e}}),u=o.whiteLabelPlans.map(function(e,n){var t=1+n;return{name:"".concat(t," calendar").concat(1===t?"":"s"),value:t,uuid:e}}),p={kind:o.kind,quantity:o.quantity};e.dudaChange=function(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach(function(n){i(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}({},p);var m=function(){var n=e.dudaChange,t=p,a=n.quantity;e.dudaChanged=n.kind!==t.kind||n.quantity!==t.quantity,"free"===n.kind&&(n.kind=l),n.kind===l?(n.planUuid=o.premiumPlans[a-1],e.quantities=d):n.kind===c&&(n.planUuid=o.whiteLabelPlans[a-1],e.quantities=u)};e.$watch("dudaChange",function(){return m()}
2,!0),m()}if("free"===e.planCategory)e.offerTrial=r().diff(r(o.trialEndDate),"years")>=1;else if("trial"===e.planCategory)e.daysLeft=r(o.trialEndDate).diff(r(),"days"),e.planKindName=n.getPlanName(o.kind),e.daysLeft<0&&(e.daysLeft=0);else if(o.subscription){e.subscription=o.subscription,e.plan=o.subscription.plan;var f=e.plan,g=e.subscription;if(o.card){e.card=o.card;var v=o.card.exp_month-1,h=r({date:1,month:v,year:o.card.exp_year}).add(1,"month");e.cardExpired=r().isAfter(h),e.hiddenNumber="••••••••••••"+e.card.last4}e.calendarsInUse=o.calendarsInUse,e.planDescription=n.formatMultiPlanSummary(f.kind,f.interval,f.currency,f.amount,g.quantity),e.notice=!1;var b=o.subscription.cancel_at_period_end;switch(o.subscription.status){case"active":b&&(e.notice="You have cancelled your subscription. You will still receive all of the benefits of your plan until the end of this billing period. ");break;case"past_due":e.notice="Our attempts to take payment are being declined by your bank. We will try again.";break;case"unpaid":e.notice="Multiple attempts to take payment have been declined by your bank. We will cancel your subscription shortly."}e.nextInvoiceDate=b?"none":r(g.current_period_end).format("Do MMMM YYYY")}}).catch(function(){t.status.open("Oh dear - something went wrong ","error",6e3)}).finally(function(){t.spinner.close()}),n.getInvoiceStubs().then(function(n){var t=n;e.hasMoreInvoices=t.has_more,e.formattedInvoices=t.stubs.map(function(e){return{id:e.id,date:r(1e3*e.date).format("L"),status:e.status,grossTotal:pn().o.formatPrice(e.currency,e.grossTotal)}})}).catch(function(){e.formattedInvoices=[]})}])}),$n=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.subscriptions",{url:"/subscriptions",views:{"main@settings":{template:Qa(),controller:"SubscriptionSettingsCtrl"}},authenticate:!0})}])}),Fn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("userSubmitted",{url:"/userSubmitted",template:Xa()})}])}),Mn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("CancelSubscriptionCtrl",["$scope","tkfNotify","SubscribeAPI","$state","Forms",function(e,n,t,a,i){e.page={agree:!1},e.forms={},n.spinner.open(),t.getSubscriptionStatus().then(function(n){var a=n;if(e.paid=a.paid,a.paid){var i=a.subscription;e.subscription=a.subscription;var o=i.plan;e.willCancel=e.subscription.cancel_at_period_end,e.planDescription=t.formatMultiPlanSummary(o.kind,o.interval,o.currency,o.amount,i.quantity)}}).catch(function(){n.status.open("We couldn't get your subscription details. Contact [email protected] if this problem persists","error",6e3)}).finally(function(){n.spinner.close()}),e.cancelSubscription=function(){i.makeFormDirty(e.forms.fCancel),e.forms.fCancel.$invalid||(n.spinner.open(),t.cancelSubscription().then(function(e){n.status.open("Your Subscription Has Been Cancelled","success",3e3),a.go("siteform.cancelThankyou")}).catch(function(){n.status.open("We couldn't get your subscription details. Contact [email protected] if this problem persists","error",6e3)}).finally(function(){n.spinner.close()}))}}])}),On=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.cancelSubscription",{url:"/cancelSubscription",template:ei(),controller:"CancelSubscriptionCtrl"})}])}),Nn=t.cw(function(e,n){o(),Ct(),Tt(),Ie(),pn(),ln(),Ye(),Qe(),xt(),Eo()().module("tkfngApp").controller("ChangeCardCtrl",["$scope","$timeout","Forms","$state","SubscribeAPI","tkfNotify",function(e,n,t,a,i,o){var r,s;e.showTestControls=Ct().T.get("showTestControls",!1),e.page={isOrganization:!1},e.foundCard=!1;var l=function(){return(0,ln().C)().then(function(e){var t=(s=e).elements();n(function(){r=(0,Qe().U)(t,"cardNumber"),(0,Qe().U)(t,"cardExpiry"),(0,Qe().U)(t,"cardCvc")})})};o.spinner.open(),i.getCurrentCard().then(function(n){e.foundCard=!0,e.card={address_country:n.address_country},e.countryCode=e.card.address_country,e.organization={organization_name:n.organization_name,vat_number:n.vat_number},e.page.isOrganization=!(!n.organization_name&&!n.vat_number),e.isEUCountry=pn().o.isEUCountry(e.card.address_country),l()}).catch(function(n){404===n.status?(e.card={},l()):o.status.open("Oh dear - something went wrong ","error",6e3)}).finally(function(){o.spinner.close(),e.loaded=!0}),e.codeToCountry=Tt().d.codeToCountry,e.forms={},e.serverErrors={},e.$watch("page.isOrganization",function(n,t){n===t||n||(e.organization={})},!0);e.changeCard=function(){if(xt().C.trace("changecard:start"),t.makeFormDirty(e.forms.fCredit
2Card),e.forms.fCreditCard.$invalid||e.forms.fCreditCard.$invalid)o.status.open("Please check the values you entered","error",6e3);else{var n=e.card,l=n.name,c=n.address_line1,d=n.address_line2,u=n.address_city,p=n.address_state,m=n.address_zip,f=n.address_country,g=function(e){return(e||"").trim()},v={name:g(l),address:{line1:g(c),line2:g(d),city:g(u),state:g(p),postal_code:g(m),country:g(f)}};xt().C.trace("startChangeCard:pre"),o.spinner.open(),i.startChangeCard().then(function(n){xt().C.trace("startChangeCard:then"),s.confirmCardSetup(n,{payment_method:{card:r,billing_details:v}}).then(function(n){xt().C.trace("handleCardSetup:then");var t=n.error,r=n.setupIntent;t?(o.spinner.close(),xt().C.error(t),"payment_intent_authentication_failure"===t.code?o.status.open("You manually refused to let us use this card","error",1e4):t.message?o.status.open(t.message,"error",1e4):o.status.open("card setup problem","error",1e4)):(xt().C.trace("handleCardSetup:noError: ",r),i.attachCard(r.id,e.organization).then(function(e){xt().C.trace("attachCard:then"),o.status.open("Card Update Succeeded","success",3e3),(0,Ye().E)(a,{defaultState:"siteform.cardChangeConfirm"})}).catch(function(e){xt().C.trace("attachCard:catch"),xt().C.error(e),e.message?o.status.open(e.message,"error",3e4):o.status.open("problem attaching card ","error",3e4)}).finally(function(){return o.spinner.close()}))})}).catch(function(e){o.spinner.close(),xt().C.trace("startChangeCard:catch"),xt().C.error(e),o.status.open("problem preparing card ","error",3e4)})}},e.oldChangeCard=function(){t.makeFormDirty(e.forms.fCreditCard),e.forms.fCreditCard.$invalid||e.forms.fCreditCard.$invalid?o.status.open("Please check the values you entered","error",6e3):(e.card.address_zip=e.card.address_zip.trim(),o.spinner.open(),(0,Qe().u)(r,e.card).then(function(n){var t=n.error,r=n.token;if(t)throw n;var s=r,l=s.card.country,c=s.card.address_country;pn().o.isEUCountry(c)&&!pn().o.countryCodesMatch(l,c)?(o.spinner.close(),e.forms.fCreditCard.address_country.$setValidity("serverError",!1),e.serverErrors.address_country="In the EU this needs to match the credit card country (you may need to change card)",o.status.open("In the EU credit card country and billing address country need to match","error",1e4)):i.changeCard(s.id,e.organization).then(function(){o.status.open("Card Update Succeeded","success",3e3),(0,Ye().E)(a,{defaultState:"siteform.cardChangeConfirm"})}).catch(function(e){var n=e.data;400===e.status&&"rejected"===n.problem?"card_declined"===n.args.code?o.popup.open({view:Ui()}):"incorrect_zip"===n.args.code?o.popup.open({view:Bi()}):o.status.open(n.args.message,"error",1e4):o.status.open("Oh dear - something went wrong ","error",3e4)}).finally(function(){o.spinner.close()})}).catch(function(n){o.status.open("unexpected error","error",6e3),o.spinner.close();var t=n.error;t.param&&(!!e.forms.fCreditCard[t.param]&&(e.forms.fCreditCard[t.param].$setValidity("serverError",!1),e.serverErrors[t.param]=t.message));o.status.open(t.message,"error",6e3)}))},e.loadDummyData1=function(){c(Ie().$.card1),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadDummyData2=function(){c(Ie().$.card2),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadDummyData3=function(){c(Ie().$.badCVC),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadBadZip=function(){c(Ie().$.badZip),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0};var c=function(n){var t=Eo()().copy(n);delete t.number,delete t.cvc,delete t.exp_month,delete t.exp_year,e.card=t}}])}),Un=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.changeCard",{url:"/changeCard?next&nextState",template:ni(),controller:"ChangeCardCtrl",authenticate:!0})}])}),Bn=t.cw(function(e,n){o(),Ct(),Tt(),xt(),Ke(),Ie(),pn(),ln(),Qe();var t=Array.from(Array(100),function(e,n){return{name:n+1+" Calendar"+(n+1===1?"":"s"),value:n+1}});Eo()().module("tkfngApp").controller("CheckoutCtrl",["$scope","$state","$timeout","SubscribeAPI","Forms","$location","tkfNotify",function(e,n,a,i,o,r,s){var l,c;function d(){l=(0,Qe().U)(c,"cardNumber"),(0,Qe().U)(c,"cardExpiry"),(0,Qe().U)(c,"cardCvc")}
2function u(){var n=e.checkout;delete e.serverErrors.address_country,e.forms.fCreditCard&&e.forms.fCreditCard.address_country.$setValidity("serverError",!0),e.countryCode=e.card.address_country;var t,a,o=e.countryCode;function r(e){n.vatRate=e;var t=n.price*n.quantity*n.vatRate/100;n.vatCost=pn().o.formatPrice(n.currency,t),n.formattedCostIncVat=pn().o.formatPrice(n.currency,n.price*n.quantity+t)}e.checkout.currency=pn().o.codeToCurrency(o),t=e.checkout,(a=[t.kind+".v1",t.interval,t.currency.code]).map(function(e){return e.toLowerCase()}),t.planId=a.join("_"),t.planId,n.price=("premium"===n.kind?800:4e3)*("month"===n.interval?1:10),n.formattedCostExVat=pn().o.formatPrice(n.currency,n.price*n.quantity),n.isEUCountry=pn().o.isEUCountry(o);var s=!1;if(e.organization.vat_number){e.organization.vat_number;var l=pn().o.validateAndCanonicaliseVatNo(e.countryCode,e.organization.vat_number);s=!!l.canonical}var c=n.isEUCountry&&!s;n.shouldApplyVAT="GB"===o||c,n.inEUWithoutVATNo=c,n.shouldApplyVAT?pn().o.euVatRatePromise().then(function(e){r(e[o]||0)}):r(0);var d=o.toUpperCase();n.unsupportedGBP="US"!==d&&"CA"!==d&&!n.isEUCountry,n.unsupportedUSD="CA"===d,n.orderDisplayDescription=i.formatMultiPlanSummary(n.kind,n.interval,n.currency,n.price,n.quantity),n.planDisplayName=i.formatPlanName(n.kind,n.interval,n.currency,n.price)}e.quantities=t,e.showTestControls=Ct().T.get("showTestControls",!1),e.codeToCountry=Tt().d.codeToCountry,e.forms={},e.serverErrors={},(0,ln().C)().then(function(n){c=n.elements(),e.stripeCard||a(function(){return d()})}),function(){switch(e.page={isOrganization:!1},e.checkout={quantity:1},e.card={},e.organization={},n.params.kind){case"premium":case"white.label":e.checkout.kind=n.params.kind;break;default:e.checkout.kind="premium"}switch(n.params.interval){case"month":case"year":e.checkout.interval=n.params.interval;break;default:e.checkout.interval="month"}e.card.address_country=n.params.ccode,e.checkout.currency=pn().o.codeToCurrency(e.card.address_country),a=r.state(),a&&a.orderId&&(t=Ke().p.getOrder(a.orderId))&&(e.organization=t.organization||{},e.page.isOrganization=!Eo()().equals(e.organization,{}),e.stripeCard=t.stripeCard,e.card=t.card,e.checkout=t.checkout),e.checkout;var t,a}(),u(),e.$watch("checkout",function(){return u()},!0),e.$watch("organization",function(){return u()},!0),e.$watch("page.isOrganization",function(n,t){n===t||n||(e.organization={})}),e.$watch("card.address_country",function(t){if(t&&e.countryCode!==t){var a=t.toUpperCase();n.go(".",{ccode:a}),u()}}),e.changeCard=function(){delete e.stripeCard,delete e.card.cvc,a(function(){return d()})},e.submitOrder=function(){function t(){var t,a,i=((a=r.state())&&a.orderId&&(t=Ke().p.getOrder(a.orderId)),t||(t=Ke().p.createOrder(),r.state({orderId:t.id})),t.checkout=Eo()().copy(e.checkout),t.stripeCard=Eo()().copy(e.stripeCard),t.organization=Eo()().copy(e.organization),t.card=Eo()().copy(e.card),t.id);n.go("siteform.confirmOrder",{orderId:i})}if(u(),o.makeFormDirty(e.forms.fCreditCard),o.makeFormDirty(e.forms.fCheckout),e.forms.fCreditCard.$invalid||e.forms.fCheckout.$invalid)s.status.open("Please check the values you entered","error",6e3);else{e.card;e.card.address_zip=(e.card.address_zip||"").trim(),e.card,s.spinner.open(),(0,Qe().u)(l,e.card).then(function(n){if(JSON.stringify(n.token,null,2),n.error)throw n;var a=n.token,i=pn().o.toVatCountryCode(a.card.country),o=a.card.address_country;e.checkout.inEUWithoutVATNo&&pn().o.isEUCountry(o)&&!pn().o.countryCodesMatch(i,o)?(xt().C.log({source:"checkout.controller::createCardTokenPromise:ok",body:n}),e.forms.fCreditCard.address_country.$setValidity("serverError",!1),e.serverErrors.address_country="In the EU this needs to match the credit card country (you may need to change card)",s.status.open("In the EU credit card country and billing address country need to match","error",1e4)):(e.stripeCard=a,t())}).catch(function(n){var t=n.error;if(xt().C.log({source:"checkout.controller::createCardTokenPromise:error",body:n}),t.param){var a=e.forms.fCreditCard[t.param];a&&(a.$setValidity("serverError",!1),e.serverErrors[t.param]=t.message)}s.status.open(t.message,"error",6e3)}).finally(function(){s.spinner.close()})}},e.loadDummyData1=function(){p(Ie().$.card1),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadDummyData2=function(){p(Ie().$.card2),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadDummyDeclined=function(){p(Ie().$.declinedCard),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadBadZip=function(){p(Ie().$.badZip),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadBadCVC=function(){p(Ie().$.badCVC),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadFraudulent=function(){p(Ie().$.fraudulentCard),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadProcessingError=function(){p(Ie().$.processingErrorCard),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0},e.loadExpired=function(){p(Ie().$.expiredCard),e.organization=Eo()().copy(Ie().$.organization1),e.page.isOrganization=!0};var p=function(n){var t=Eo()().copy(n);delete t.number,delete t.cvc,delete t.exp_month,delete t.exp_year,e.card=t}}])}),Rn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("CloseAccountCtrl",["$scope","tkfNotify","SubscribeAPI","$state","Forms",function(e,n,t,a,i){e.page={agree:!1},e.forms={},n.spinner.open(),t.getSubscriptionStatus().then(function(n){var a=n;if(e.paid=a.paid,e.planSource=a.source,a.paid&&"duda"!==a.source){var i=a.subscription;e.subscription=a.subscription;var o=i.plan;e.willCancel=e.subscription.cancel_at_period_end,e.planDescription=t.formatMultiPlanSummary(o.kind,o.interval,o.currency,o.amount,i.quantity)}e.paid&&e.willCancel?e.planStatus="willCancel":e.paid?e.planStatus="active":e.planStatus="none"}).catch(function(){n.status.open("We couldn't get your subscription details. Contact [email protected] if this problem persists","error",6e3)}).finally(function(){n.spinner.close()}),e.closeAccount=function(){i.makeFormDirty(e.forms.fClose),e.forms.fClose.$invali
2d||(n.spinner.open(),t.closeAccount().then(function(){n.status.open("Your Account has been closed","success",3e3),a.go("siteform.closedAccountBye")}).catch(function(){n.status.open("We couldn't close your account. Contact [email protected] if this problem persists","error",6e3)}).finally(function(){n.spinner.close()}))}}])}),Gn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.closeAccount",{url:"/closeAccount",template:ai(),controller:"CloseAccountCtrl"})}])}),qn=t.cw(function(e,n){o(),xt(),Ke(),ln(),Eo()().module("tkfngApp").controller("ConfirmOrderCtrl",["$scope","$state","SubscribeAPI","tkfNotify","Forms","Dialog",function(e,n,t,a,i,o){e.page={agree:!1,stripeTokenUsed:!1},e.forms={},e.orderId=n.params.orderId;var r=Ke().p.getOrder(n.params.orderId);r&&(e.checkout=r.checkout,e.stripeCard=r.stripeCard,e.card=r.card,e.organization=r.organization),e.editOrder=function(){window.history.back()};var s=function(){a.status.open("Subscription Succeeded","success",3e3);var t=n.href("siteform.subscribeThankyou",{kind:e.checkout.kind,quantity:e.checkout.quantity});window.location=t};e.subscribe=function(){i.makeFormDirty(e.forms.fConfirm),e.forms.fConfirm.$invalid||(a.spinner.open(),t.subscribeToPlan(e.checkout.planId,e.checkout.quantity,e.organization.vat_number,e.organization.organization_name,e.stripeCard.id).then(function(n){var t=n.status,i=n.message,r=n.key;if("succeeded"===t)s();else if("requires_payment_method"===t)a.popup.open({view:Ui()});else{if("requires_action"===t)return(0,ln().C)().then(function(n){return n.confirmCardPayment(r).then(function(n){var t=n.error;t?"payment_intent_authentication_failure"===t.code?(a.status.open("You manually declined this payment","error",1e4),o.open(e,{template:oi(),animation:"rotateIn",externalCloser:!1,includeInHistory:!1,"z-index":100})):(a.status.open("Payment Authorization failed","error",1e4),o.open(e,{template:"<div>invoice notice</div>",animation:"rotateIn",includeInHistory:!1,onClose:function(){}})):n.paymentIntent&&"succeeded"===n.paymentIntent.status?(s(),n.paymentIntent):n.paymentIntent&&n.paymentIntent})});i?a.status.open(i,"error",1e4):(a.status.open("Unexpected Status","error",3e4),xt().C.log({source:"confirmOrder.controller::subscribeToPlan",data,status:t}))}}).catch(function(e){var n=e.data,t=e.status;a.status.open("Oh dear - something went wrong ","error",3e4),xt().C.log({source:"confirmOrder.controller::subscribeToPlan",data:n,status:t})}).finally(function(){e.page.stripeTokenUsed=!0,a.spinner.close()}))}}])}),jn=()=>t(962),Wn=t.cw(function(e,n){o(),un(),sn(),Et(),Ct(),jn(),Eo()().module("tkfngApp").controller("DudaGetStartedCtrl",["$scope","$location","tkfNotify","tkfErrors","Forms",function(e,n,t,a,i){var o=n.search().name,r=Ct().T.get("stk"),s=encodeURIComponent(r),l="/api/sited/finish?stk=".concat(s);e.forms={},e.serverErrors={},e.tzs=sn().H,e.locales=un().I;var c=o?o.trim().replace(/\s+/g," ").replace(/['"]/g,"").replace(/ /g,".").toLowerCase():"",d=o?o+"'s events":"";e.calendar={name:c,displayName:d,tzid:Et().hV.timezone,locale:Et().hV.locale,use24Clock:!Et().hV.hour12,showTimeZone:!0,channelMode:!1,changePlan:!1},e.tryCreateCalendar=function(){if(!e.forms.fDudaGetStarted.$valid)return i.makeFormDirty(e.forms.fDudaGetStarted),void t.status.open("Please check what you've typed","error",8e3);t.spinner.open(),(0,jn().tP)(s,e.calendar).then(function(){t.status.open("Created Calendar","success",1500),document.location=l}).catch(function(n){400!==n.status?a.handleResponseError(n):(t.status.open("Please check what you've typed","error",8e3),e.serverErrors={}
2,i.makeFormDirty(e.forms.fDudaGetStarted),Eo()().forEach(n.data.errors,function(n,t){var a;a="name"===t?"ff"+t:t,e.forms.fDudaGetStarted[a].$setViewValue(e.forms.fDudaGetStarted[a].$viewValue),e.forms.fDudaGetStarted[a].$setValidity("serverError",!1),e.serverErrors[t]=n.message}))}).finally(function(){t.spinner.close()})}}])}),Vn=t.cw(function(e,n){o(),Ct(),jn();var t=ao();Eo()().module("tkfngApp").controller("DudaLaunchpadCtrl",["$scope","$location","$state","SubscribeAPI",function(e,n,a,i){var o=n.search().calname;e.dudaUpgrade=jn().Nd;var r=Ct().T.get("stk"),s=encodeURIComponent(r),l=function(e){return"/api/fwd/".concat(e,"?stk=").concat(s)};e.customizeUrl=l("i/customizer"),e.editUrl=l("e/".concat(o)),e.manageUrl=l("i/settings/calendars");var c=Ct().T.getSubStatus();c.paid?(e.planCategory="paid",e.planKindName=i.getPlanName(c.kind)):e.planCategory="free"===c.kind?"free":"trial","trial"===e.planCategory&&(e.daysLeft=t(c.trialEndDate).diff(t(),"days"),e.daysLeft<0&&(e.daysLeft=0))}])}),Hn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.dudaGettingStarted",{url:"/sitedGetStarted",template:ri(),controller:"DudaGetStartedCtrl"}).state("siteform.dudaLaunchpad",{url:"/sitedLaunchpad",template:si(),controller:"DudaLaunchpadCtrl"})}])}),Yn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("EmailChangeCtrl",["$scope",function(e){var n=new URLSearchParams(location.search),t=n.get("token");e.newEmail=n.get("newEmail"),e.performAction=function(){window.location="/api/action-token/".concat(t,"?preprocess=false")}}])}),Kn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("EmailUnsubscribeCtrl",["$scope",function(e){var n=new URLSearchParams(location.search);e.category=n.get("category"),e.email=n.get("email");var t=n.get("encodedEmail");e.performAction=function(){window.location="/api/unsubscribe/".concat(e.category,"/").concat(t,"?preprocess=false")}}])}),Jn=t.cw(function(e,n){o(),Dt(),Eo()().module("tkfngApp").controller("ForgotPasswordCtrl",["$scope","Forms","tkfNotify","$state",function(e,n,t,a){e.forms={},e.serverErrors={};var i=a.params.email;i&&(i=decodeURIComponent(i).replaceAll(" ","+")),e.forgotPassword={email:i},e.trySendResetEmail=function(){if(!e.forms.fForgotPassword.$valid)return n.makeFormDirty(e.forms.fForgotPassword),void t.status.open("Please check what you've typed","error",6e3);t.spinner.open(),(0,Dt().TB)("/api/sendPasswordResetEmail",e.forgotPassword).then(function(){a.go("siteform.sentreset",{email:e.forgotPassword.email})}).catch(function(a){t.status.open("Please check what you've typed","error",6e3),n.makeFormDirty(e.forms.fForgotPassword),e.serverErrors={}
2,Eo()().forEach(a.errors,function(n,t){e.fForgotPassword[t].$setValidity("serverError",!1),e.serverErrors[t]=n.message})}).finally(function(){return t.spinner.close()})}}])}),Zn=t.cw(function(e,n){o(),un(),sn(),Et(),Eo()().module("tkfngApp").controller("GetstartedCtrl",["$scope","$location","Auth","tkfNotify","Calendar","tkfErrors","Forms",function(e,n,t,a,i,o,r){e.forms={},e.serverErrors={},e.tzs=sn().H,e.locales=un().I,t.refreshCurrentUser().then(function(n){e.trialPlanKind=n.trialPlanKind||"premium",e.calendar=new i({name:n.name.trim().replace(/\s+/g," ").replace(/\ /g,".").toLowerCase(),displayName:n.name+"'s events",tzid:Et().hV.timezone,locale:Et().hV.locale,use24Clock:!Et().hV.hour12,showTimeZone:!0,channelMode:!1})}).catch(function(e){document.location="/"}),e.tryCreateCalendar=function(){if(!e.forms.fGetStarted.$valid)return r.makeFormDirty(e.forms.fGetStarted),void a.status.open("Please check what you've typed","error",8e3);var n=e.calendar.name;0===(n=n.trim()).indexOf("@")&&(n=(n=n.substring(1)).trim()),e.calendar.name=n,a.spinner.open(),e.calendar.$save().then(function(){a.status.open("Created Calendar","success",1500),window.location="/e/"+e.calendar.name}).catch(function(n){400!==n.status?o.handleResponseError(n):(a.status.open("Please check what you've typed","error",8e3),e.serverErrors={}
2,r.makeFormDirty(e.forms.fGetStarted),Eo()().forEach(n.data.errors,function(n,t){var a,i;a="name"===t?"ff"+t:t,i=n.properties&&n.properties.msg?n.properties.msg:n.message,e.fGetStarted[a].$setViewValue(e.fGetStarted[a].$viewValue),e.fGetStarted[a].$setValidity("serverError",!1),e.serverErrors[t]=i}))}).finally(function(){a.spinner.close()})}}])}),Qn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").controller("GoogleGetStartedCtrl",["$scope","$resource","tkfNotify","$timeout","$state","Forms","GoogleSync",function(e,n,t,a,i,o,r){e.pageState={},e.selection={},e.forms={},e.calendar={},e.startOAuth=r.startOAuth,r.GoogleAccounts.query().$promise.then(function(n){e.accounts=n,n.length>0?(e.selection.account=n[0],s()):delete e.selection.account,e.pageState.ready=!0}).catch(function(e){e&&401===e.status||(console.error("failed to load google accounts",e),t.status.open("Unable to load your Google accounts - please try again later","error",6e3))});var s=function(){var n=e.selection.account;r.GoogleCalendars.query({id:n.id}).$promise.then(function(n){e.calendars=n,e.selection.calendar=n.length>0?n[0]:null}).catch(function(){return console.error("failed to load calendars for "+n.email)})},l=!1;e.createSyncedCalendar=function(){if(!e.forms.fGoogleSync.$valid)return o.makeFormDirty(e.forms.fGoogleSync),void t.status.open("Please check what you've typed","error",8e3);var n=e.selection.calendar;if(n){if(!l){l=!0;var a=new r.CreateSync({name:e.calendar.name.toLowerCase(),id:n.id,accountId:n.accountId});t.status.open("Please wait a moment while we synchronize","success",6e4),t.spinner.open(),a.$save().then(function(){t.status.open("Created Synced Calendar","success",3e3),r.showSyncPopup(e.calendar.name)}).catch(function(n){var a=n.data;400===n.status?(t.status.open("Please check the values you entered","error",3e3),e.serverErrors={}
2,Eo()().forEach(a.errors,function(n,t){var a=e.forms.fGoogleSync[t];a&&a.$setValidity("serverError",!1),e.serverErrors[t]=n.message})):t.status.open("Unexpected problem syncing calendar","error",6e3)}).finally(function(){l=!1,t.spinner.close()})}}else t.status.open("Please choose a Google calendar to sync with","error",6e3)}}])}),Xn=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.googleGetStarted",{url:"/googleGetStarted",template:pi(),controller:"GoogleGetStartedCtrl"})}])}),et=t.cw(function(e,n){o(),Ct(),Nt(),Je(),dn(),De(),jn();var t=Xi(),a=window!==window.top;Eo()().module("tkfngApp").controller("HomepageCtrl",["$scope","$state","tkfNotify","SubscribeAPI","Auth","ThemeEditor","$templateCache",function(e,n,i,o,r,s,l){var c;Ct().T.get("cdnroot","");lo(),e.googleFavicon=lo(),e.peopleImage=mo(),e.wordpressLogoLight=yo(),e.wordpressLogo=wo(),e.squarespaceLogo=fo(),e.museLogo=po(),e.weeblyLogo=vo(),e.wixLogo=bo(),l.put("app/site/homepage/sections/demo.html",gi()),l.put("app/site/homepage/sections/workswith.html",hi()),l.put("app/site/homepage/sections/features.html",vi()),l.put("app/site/homepage/sections/bottom.html",fi()),e.pageState={customizerMenuOpen:!1,isLoggedIn:dn().B.isDefined},e.showLogout=!(a&&null!==dn().B&&void 0!==dn().B&&null!==(c=dn().B.usermeta)&&void 0!==c&&c.isDudaUser),e.isCollapsed=!0,e.dudaUpgrade=jn().Nd,dn().B.isDefined?o.getSubscriptionStatus().then(function(n){var t=n;t.paid?e.subscriptionStatus="paid":t.eligibleForTrial?e.subscriptionStatus="none":e.subscriptionStatus="unpaid",e.planSource=t.source}).catch(function(n){e.subscriptionStatus="none"}).finally(function(){}):e.subscriptionStatus="none",(0,De().N)();var d=Ct().T.get("embedScript");e.alerts=dn().B.alerts;var u=dn().B.onlineCalmetas;if(u.length>0){var p=u[0];e.editorURL="/e/"+p.name}else e.editorURL=!1;(0,Nt().kG)(d).then(function(){window._tkf.loadDeclaredCalendars(),e.demoLoaded=function(){window._tkf.loadDeclaredCalendars()}}).catch(function(){return console.warn("homepage: embed script did not load, demo calendar will be absent")});var m=!1;function f(n,a){n=n||"spirited",e.calname=n,window._tkf.updateState(t(".homepage__demo__calendar iframe")[0],{state:"viewers.inter.pinboard",stateparams:{calname:n},reload:a})}e.doLogout=function(e){e.preventDefault(),i.spinner.open(),Je().N.logout().then(function(){var e=n.href("siteform.logoutBye");window.location.assign(e)}).catch(function(){}).finally(function(){i.spinner.close()})},e.calname="spirited";var g=[];s.fetchSummaries({}).then(function(e){g=e});var v=!1;e.setBaseTheme=(0,Mo.A)(function(n){if(e.baseTheme!==n){e.baseTheme=n;var a,i,o,r="dark-transparent"===n,l=v!==r;v=r,"dark-transparent"===n?(a=co(),f("dittytv.live",l)):"light-transparent"===n?(a=go(),f("spirited",l)):(a="",f("spirited",l)),(i=n,o=g.find(function(e){return e.name===i}),s.get({id:o.id,calendarname:"spirited"})).then(function(n){e.settings=n.settings,e.settings.background,e.settings.textColor,window._tkf.updateSettings(t(".homepage__demo__calendar iframe")[0],e.settings),c(a)})}function c(n){var a={"background-color":e.settings.background,color:e.settings.textColor};n&&(a["background-image"]="url("+n+")");var i=t(".homepage__demo");i.removeAttr("style"),i.css(a),window.chrome&&requestAnimationFrame(function(){t("iframe").hide(),setTimeout(function(){t("iframe").show()},0)})}},300,{leading:!0}),e.activeView="pinboard",e.setCalendarView=(0,Mo.A)(function(n){e.activeView!==n&&(window._tkf.updateState(t(".homepage__demo__calendar iframe")[0],{state:"^."+n,stateparams:{}}),e.activeView=n)},300,{leading:!0}),e.openFullScreen=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"pinboard",a=t(".homepage__demo__calendar iframe")[0].name;window._tkf.openFullScreen({name:e.calname,view:n,guid:a})},function n(){if(!m){var a=t(".homepage__demo__calendar iframe");if(0!==a.length){m=!0;var i=a[0].name;window._tkf.onCalendarStateChange(i,function(n){var t=n.toState.name.split(".");e.activeView=t[t.length-1],e.$apply()})}else setTimeout(n,100)}}()}])}),nt=t.cw(function(e,n){pn(),o();var t=ao();Eo()().module("tkfngApp").service("InvoiceService",["SubscribeAPI","tkfNotify",function(e,n){var a=t.utc("12-07-2016","DD-MM-YYYY"),i={organization:"Tockify Ltd",address_line1:"38 West Park Avenue",address_line2:"",address_city:"Richmond",address_state:"Surrey",address_zip:"TW9 4AL",address_country:"UK",vatNumber:"GB111198543"},o={organization:"Tockify Ltd",address_line1:"Lytchett House, 13 Freeland Park",address_line2:"Wareham Road, Lytchett Matravers",address_city:"Poole",address_state:"Dorset",address_zip:"BH16 6FA",address_country:"UK",vatNumber:"GB111198543"};this.fetchInvoice=function(r){return n.spinner.open(),e.getInvoice(r).then(function(e){return function(e){var n=e.currency,r=function(e){switch(e=(e||"").trim().toUpperCase()){case"USD":return"US Dollars (USD)";
2case"GBP":return"British Pounds (GBP)";case"EUR":return"Euros (EUR)";default:return""}}(n),s=e.invoiceItems.map(function(e){return{description:e.description,taxRate:(t=e.taxPercent,t+"%"),netAmount:pn().o.formatPrice(n,e.netAmount),taxAmount:pn().o.formatPrice(n,e.taxAmount),grossAmount:pn().o.formatPrice(n,e.grossAmount)};var t}),l=t(1e3*e.createdTS),c=l.isBefore(a)?i:o,d={id:e.id,dateOfIssue:l.format("L"),number:e.invoiceNumber,status:e.status,currency:n,currencyDesc:r,supplier:c,address:e.paymentAddress,customer:{name:e.name,organization:e.organizationName,vatNumber:e.vatNumber},items:s,netTotal:pn().o.formatPrice(n,e.netTotal),discount:pn().o.formatPrice(n,e.discount),taxTotal:pn().o.formatPrice(n,e.taxTotal),hasBalance:0!==e.startBalance,usedBalance:-e.startBalance+e.endBalance,startBalance:pn().o.formatPrice(n,-e.startBalance),endBalance:pn().o.formatPrice(n,-e.endBalance),balanceCredit:pn().o.formatPrice(n,e.startBalance-e.endBalance),grossTotal:pn().o.formatPrice(n,e.amountDue),paid:e.paid,hasDiscount:0!==e.discount,billingReason:e.billingReason};if(e.payment&&e.paid){var u=e.payment;d.payment={dateOfPayment:t(1e3*u.paymentTS).format("L"),brand:u.brand,last4:u.last4,exp_year:u.exp_year,exp_month:u.exp_month,amount:pn().o.formatPrice(n,u.amount)}}return d}(e)}).catch(function(){n.status.open("Oh dear - something went wrong ","error",6e3)}).finally(function(){n.spinner.close()})}}])}),tt=t.cw(function(e,n){o(),ln(),xt();ao();Eo()().module("tkfngApp").controller("InvoiceCtrl",["$scope","$state","SubscribeAPI","tkfNotify","InvoiceService","$timeout",function(e,n,t,a,i,o){e.id=n.params.id,e.next=window.location.href,e.viewState={receipt:!1,tryStarted:!1};var r=function(){e.id=e.id?e.id:n.params.id,i.fetchInvoice(e.id).then(function(n){n.billingReason,"unpaid"===n.status&&"subscription_create"===n.billingReason&&(n.incompleteCreate=!0),e.invoice=n,e.id=n.id}).catch(function(e){return console.error(e)})};r();e.retryPayment=function(){e.viewState.tryStarted||(o(function(){return e.viewState.tryStarted=!0}),a.spinner.open(),t.retryPayment(e.id).then(function(e){var n=e.status,t=(e.message,e.key);if("succeeded"===n)a.status.open("Invoice Payment Succeeded","success",3e3);else if("requires_payment_method"===n)a.popup.open({view:Ui()});else{if("requires_action"===n)return(0,ln().C)().then(function(e){return e.confirmCardPayment(t).then(function(e){var n=e.error,t=e.paymentIntent;n?"payment_intent_authentication_failure"===n.code&&(a.status.open("You manually declined this payment","error",1e4),r()):t&&"succeeded"===t.status&&(a.status.open("Invoice Payment Succeeded","success",3e3),r())})});a.status.open("Unexpected Status","error",3e4),xt().C.log({source:"confirmOrder.controller::payInvoice",data,status:n})}}).catch(function(e){var n=e.data,t=e.status;a.status.open("Oh dear - something went wrong ","error",3e4),xt().C.log({source:"invoice.controller::retryPayment",data:n,status:t})}).finally(function(){r(),a.spinner.close()}))},e.printInvoice=function(){window.print()}}])}),at=t.cw(function(e,n){o();ao();Eo()().module("tkfngApp").controller("PaymentCtrl",["$scope","SubscribeAPI","tkfNotify","InvoiceService",function(e,n,t,a){}])}),it=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.invoice",{url:"/invoice?id",template:bi(),controller:"InvoiceCtrl",authenticate:!0}).state("siteform.payment",{url:"/payment?id",template:yi(),controller:"PaymentCtrl",authenticate:!0})}])}),ot=t.cw(function(e,n){o(),Je(),Ye(),Eo()().module("tkfngApp").controller("LoginCtrl",["$scope","tkfNotify","$state","Auth","Forms",function(e,n,t,a,i){var o=(0,Ye().v)(t,{defaultState:"site"});a.refreshCurrentUser().then(function(){return(0,Ye().E)(t,{defaultState:"site"})}).catch(function(e){var n=e.errors;return console.warn("no user: ",n)}),e.forms={},e.serverErrors={},e.login={stayLoggedIn:!0,email:"",password:"",nextUri:o},e.tryLogin=function(){if(!e.forms.fLogin.$valid)return i.makeFormDirty(e.forms.fLogin),void n.status.open("Please check what you've typed","error",6e3);n.spinner.open(),Je().N.login(e.login).then(function(e){e.mfaRedirectUri?window.location.replace(e.mfaRedirectUri):a.refreshCurrentUser().then(function(){(0,Ye().E)(t,{defaultState:"site"})}).catch(function(e){})}).catch(function(n){i.makeFormDirty(e.forms.fLogin),n.errors&&n.errors.form&&(e.serverErrors.form=n.errors.form)}).finally(function(){return n.spinner.close()})}}])}),rt=t.cw(function(e,n){o(),Je(),Eo()().module("tkfngApp").controller("MFALoginCtrl",["$scope","tkfNotify","$state","Auth","Forms",function(e,n,t,a,i){var o;e.params=t.params,e.mfaLogin={email:t.params.email,code:""},e.serverErrors={},e.setForm=function(e){o=e},e.performAction=function(){window.location="/api/action-token/".concat(e.params.token,"?preprocess=false")},e.tryRecover=function(){if(!o.$valid)return i.makeFormDirty(o),void n.status.open("Please check what you've typed","error",3e3);n.spinner.open(),Je().N.mfaRecover(e.mfaLogin).then(function(){a.refreshCurrentUser().then(function(){var e;window.location.replace(null!==(e=t.params.next)&&void 0!==e?e:"/")}
2).catch(function(e){return console.log("error:",e)})}).catch(function(n){var t,a;(e.mfaLogin.code="",i.makeFormClean(o),n.errors&&n.errors.form)?e.serverErrors.form=n.errors.form:e.serverErrors.form={message:"Error: ".concat(null!==(t=null==n||null===(a=n.data)||void 0===a?void 0:a.text)&&void 0!==t?t:n.status),type:"credentials"}}).finally(function(){return n.spinner.close()})}}])}),st=t.cw(function(e,n){o(),Tt(),Et(),pn(),Eo()().module("tkfngApp").controller("PaidPlanPickerCtrl",["$scope","$state","Auth",function(e,n,t){e.paid="unset",t.getCurrentUser().then(function(t){e.user=t,t.openCreateSubInvoiceId?n.go("siteform.invoice",{id:t.openCreateSubInvoiceId}):e.paid="paid"===t.subscriptionStatus}).catch(function(){return console.warn("no user")});var a=Et().hV.locale;e.currency=pn().o.guessCurrencyForLocale(a),e.plan={interval:"month",ccode:Et().hV.countryCode},e.$watch("plan.ccode",function(n){n&&(e.currency=pn().o.codeToCurrency(n))}),e.ccs=Tt().d.codeToCountry}])}),lt=t.cw(function(e,n){o(),It(),$e(),Nt(),Ot(),Et();var t=eo();Eo()().module("tkfngApp").controller("RegisterCtrl",["$scope","tkfNotify","Auth","Forms","$state",function(e,n,a,i,o){a.refreshCurrentUser().then(function(){document.location="/"}).catch(function(e){return console.warn("no user: ",e)}),e.forms={},e.serverErrors={},e.viewState={},e.register={name:"",email:"",password:"",stayLoggedIn:!0,acceptLicense:!1,acceptMail:!1,website:""},e.register.variant=o.params.variant;var r,s,l,c=[];switch(o.params.plan){case"free":case"premium":case"white.label":r=o.params.plan,e.userPickedPlan=!0;break;default:e.userPickedPlan=!1,r="premium"}switch(c.push(r),o.params.interval){case"month":case"year":s=o.params.interval;break;default:s="month"}switch(c.push(s),o.params.ccode){case"GB":case"US":l=o.params.ccode}l=l||Et().hV.countryCode,c.push(l.toLowerCase()),e.register.plan=r,e.mailCheckSuggestion=!1,e.clearMailValidation=function(){e.forms.fRegister.ffemail.$setValidity("email",!0)},e.clearMailCheck=function(){e.mailCheckSuggestion=!1,e.forms.fRegister.ffemail.$setValidity("email",!0),delete e.viewState.emailErrorMessage},e.doMailCheck=function(){e.register.email=e.register.email.trim().toLowerCase();var n=0===e.register.email.length||Nt().TB.test(e.register.email);if(e.forms.fRegister.ffemail.$setValidity("email",n),n||(e.viewState.emailErrorMessage="That doesn't look like an email address"),(0,$e().X)(e.register.email))return e.forms.fRegister.ffemail.$setValidity("email",!1),void(e.viewState.emailErrorMessage="Sorry - no disposable email addresses");t.run({email:e.register.email,suggested:function(n){e.mailCheckSuggestion=n.full},empty:function(){e.mailCheckSuggestion=!1;var n=0===e.register.email.length||Nt().TB.test(e.register.email);e.forms.fRegister.ffemail.$setValidity("email",n),n||(e.viewState.emailErrorMessage="That doesn't look like an email address")}})};var d=!1;e.tryRegister=function(){if(!d){if(!e.forms.fRegister.$valid)return i.makeFormDirty(e.forms.fRegister),void n.status.open("Please check what you've typed","error",8e3);var t=Eo()().copy(e.register);d=!0,n.spinner.open(),Ot().K.register(t).then(function(){d=!1,o.go("siteform.sentconfirm",{email:e.register.email})}).catch(function(n){i.makeFormDirty(e.forms.fRegister),e.serverErrors={}
2,n.errors&&Eo()().forEach(n.errors,function(n,t){var a;It().v.registrationError(t,n.message),a="email"===t||"name"===t||"password"===t?"ff"+t:t;var i=e.forms.fRegister[a];i?(i.$setViewValue(i.$viewValue),"required"!==n.type&&(i.$setValidity("serverError",!1),e.serverErrors[t]=n.message)):"required"!==n.type&&(e.serverErrors[t]=n.message)})}).finally(function(){d=!1,n.spinner.close()})}}}])}),ct=t.cw(function(e,n){o(),Dt(),Eo()().module("tkfngApp").controller("ResetForgottenPasswordCtrl",["$scope","Forms","tkfNotify","$state",function(e,n,t,a){var i;e.forms={},e.serverErrors={},e.resetPassword={password1:"",password2:""};var o=new URLSearchParams(location.search);e.token=null!==(i=o.get("token"))&&void 0!==i&&i,e.tryResetPassword=function(){var i=!1;if(e.resetPassword.password1!==e.resetPassword.password2&&(e.serverErrors.form={message:"The passwords don't match"},i=!0),i||!e.forms.fResetPassword.$valid)return n.makeFormDirty(e.forms.fResetPassword),void t.status.open("Please check what you've typed","error",6e3);t.spinner.open(),(0,Dt().TB)("/api/resetPassword",{password:e.resetPassword.password1}).then(function(){a.go("siteform.passwordResetComplete")}).catch(function(a){t.status.open("Please check what you've typed","error",6e3),n.makeFormDirty(e.forms.fResetPassword),e.serverErrors={}
2,Eo()().forEach(a.errors,function(n,t){"form"!==t&&e.fResetPassword[t].$setValidity("serverError",!1),e.serverErrors[t]=n})}).finally(function(){return t.spinner.close()})},e.performAction=function(){window.location="/api/action-token/".concat(e.token,"?preprocess=false")}}])}),dt=t.cw(function(e,n){o(),ln(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("site",{url:"/",views:{"main@":{template:mi(),controller:"HomepageCtrl"}},onEnter:function(){return(0,ln().C)().catch(function(){}),!0}}).state("siteform.login",{url:"/login?next&nextState",template:wi(),controller:"LoginCtrl"}).state("siteform.mfalogin",{url:"/mfaLogin?email&token&enable&next",template:_i(),controller:"MFALoginCtrl"}).state("siteform.register",{url:"/register?plan&interval&ccode&variant",template:Gi(),controller:"RegisterCtrl"}).state("siteform.forgotPassword",{url:"/forgotPassword?email",template:di(),controller:"ForgotPasswordCtrl"}).state("siteform.resetForgottenPassword",{url:"/resetForgottenPassword",template:qi(),controller:"ResetForgottenPasswordCtrl"}).state("siteform.getstarted",{url:"/getstarted",template:ui(),controller:"GetstartedCtrl"}).state("siteform.badtoken",{url:"/badtoken",template:ki()}).state("siteform.unknownUser",{url:"/unknownUser",template:$i()}).state("siteform.sentconfirm",{url:"/sentconfirm?email",template:zi(),controller:["$scope","$state",function(e,n){e.email=n.params.email}]}).state("siteform.emailUnsubscribe",{url:"/emailUnsubscribe",template:ci(),controller:"EmailUnsubscribeCtrl"}).state("siteform.emailChange",{url:"/emailChange",template:li(),controller:"EmailChangeCtrl"}).state("siteform.emailChangeSuccess",{url:"/emailChangeSuccess",template:Ti()}).state("siteform.emailVerifySuccess",{url:"/emailVerifySuccess",template:Ai()}).state("siteform.passwordResetComplete",{url:"/passwordResetComplete",template:Pi()}).state("siteform.sentreset",{url:"/sentreset?email",template:Di(),controller:["$scope","$state",function(e,n){e.email=n.params.email}]}).state("siteform.trialPlanPicker",{url:"/trialPlanPicker",template:ji(),controller:"TrialPlanPickerCtrl"}).state("siteform.paidPlanPicker",{url:"/paidPlanPicker",template:Ni(),controller:"PaidPlanPickerCtrl",authenticate:!0}).state("siteform.checkout",{url:"/checkout?kind&interval&ccode",params:{ccode:{dynamic:!0}},template:ti(),authenticate:!0,controller:"CheckoutCtrl"}).state("siteform.confirmOrder",{url:"/confirmOrder",template:ii(),controller:"ConfirmOrderCtrl",params:{orderId:!1},authenticate:!0}).state("siteform.updateThankyou",{url:"/updateThankyou",template:Oi()}).state("siteform.subscribeThankyou",{url:"/subscribeThankyou?kind&quantity",template:Ii(),controller:["$scope","$state","SubscribeAPI",function(e,n,t){e.quantity=n.params.quantity,e.kindName=t.getPlanName(n.params.kind)}]}).state("siteform.trialThankyou",{url:"/trialThankyou?kind",template:Li(),controller:["$scope","$state","SubscribeAPI",function(e,n,t){e.kindName=t.getPlanName(n.params.kind)}]}).state("siteform.cancelThankyou",{url:"/cancelThankyou",template:Si()}).state("siteform.unsubscribe",{url:"/unsubscribe",template:Fi()}).state("siteform.unsubscribeTrial",{url:"/unsubscribeTrial",template:Mi()}).state("siteform.cardChangeConfirm",{url:"/cardChangeConfirm",template:xi()}).state("siteform.logoutBye",{url:"/logoutBye",template:Ei()}).state("siteform.closedAccountBye",{url:"/closedAccountBye",template:Ci()})}])}),ut=t.cw(function(e,n){o(),It(),Tt(),Et(),pn(),De(),Eo()().module("tkfngApp").controller("TrialPlanPickerCtrl",["$scope","$state","tkfNotify","Auth","SubscribeAPI",function(e,n,t,a,i){a.refreshCurrentUser().then(function(t){e.user=t,t.openCreateSubInvoiceId?n.go("siteform.invoice",{id:t.openCreateSubInvoiceId}):"paid"===t.subscriptionStatus?n.go("siteform.updateSubscription"):t.isEligibleForTrial||n.go("siteform.paidPlanPicker")}).catch(function(e){return console.warn("no user: ",e)});var o=Et().hV.locale;e.currency=pn().o.guessCurrencyForLocale(o),e.plan={interval:"month",ccode:Et().hV.countryCode},e.$watch("plan.ccode",function(n){n&&(e.currency=pn().o.codeToCurrency(n))}),e.ccs=Tt().d.codeToCountry,(0,De().N)(),e.startTrial=function(a){if
2(e.user)t.spinner.open(),i.startTrial(a).then(function(){t.status.open("Trial Started","success",3e3),n.go("siteform.trialThankyou",{kind:a})}).catch(function(){t.status.open("Oh dear - something went wrong ","error",6e3)}).finally(function(){t.spinner.close()});else{var o=e.plan;n.go("siteform.register",{plan:a,interval:o.interval,ccode:o.ccode})}},e.noFreeStart=function(){It().v.trackTockifyEvent("registration","click.free"),t.popup.open({view:Ka(),kind:"info",animation:"message",tparams:{title:"Start With A Trial Plan",main:"We ask you to start with a trial plan. When it ends we'll automatically move you over to the free one if you don't subscribe."}})}}])}),pt=t.cw(function(e,n){o(),pn();var t=Array.from(Array(200),function(e,n){return{name:n+1+" Calendar"+(n+1===1?"":"s"),value:n+1}});Eo()().module("tkfngApp").controller("UpdateSubscriptionCtrl",["$scope","tkfNotify","SubscribeAPI","$state","Forms","Auth","Dialog",function(e,n,a,i,o,r,s){r.refreshCurrentUser().then(function(n){e.user=n,n.isEligibleForTrial?i.go("siteform.trialPlanPicker"):n.openCreateSubInvoiceId?i.go("siteform.invoice",{id:n.openCreateSubInvoiceId}):"paid"!==n.subscriptionStatus&&i.go("siteform.paidPlanPicker")}).catch(function(e){i.go("siteform.trialPlanPicker")});var l={};function c(){var n=e.update,t=l,i="month"===n.interval?1:10;"premium"===n.kind?n.amount=800*i:"white.label"===n.kind&&(n.amount=4e3*i),e.hasChange=n.kind!==t.kind||n.interval!==t.interval||n.quantity!==t.quantity,n.pricePerCalendar=pn().o.formatPrice(n.currency,n.amount);var o=n.amount*n.quantity*n.vatRate/100;n.formattedVatCost=pn().o.formatPrice(n.currency,o),n.formattedCostIncVat=pn().o.formatPrice(n.currency,n.amount*n.quantity+o),n.newSubDisplayDescription=a.formatMultiPlanSummary(n.kind,n.interval,n.currency,n.amount,n.quantity);var r,s,c=n.country.toUpperCase();n.unsupportedGBP="US"!==c&&"CA"!==c&&!pn().o.isEUCountry(n.country),n.unsupportedUSD="CA"===c,r=e.update,(s=[r.kind+".v1",r.interval,r.currency.code]).map(function(e){return e.toLowerCase()}),r.planId=s.join("_"),r.planId}e.forms={},e.serverErrors={},e.page={agree:!1},e.quantities=t,e.planKinds=[{name:"Premium",value:"premium"},{name:"White Label",value:"white.label"}],e.planIntervals=[{name:"Monthly",value:"month"},{name:"Annual",value:"year"}],n.spinner.open(),a.getSubscriptionStatus().then(function(n){var t=n;if(t.card){if(e.paid=t.paid,t.paid){var i=t.subscription;e.subscription=t.subscription;var o=i.plan;e.willCancel=e.subscription.cancel_at_period_end,e.planDescription=a.formatMultiPlanSummary(o.kind,o.interval,o.currency,o.amount,i.quantity),l={kind:o.kind,quantity:i.quantity,interval:o.interval,amount:o.amount,currency:pn().o.currencyCodeToCurrency[o.currency],vatRate:i.tax_percent,country:t.card.countryCode},e.update=Eo()().copy(l);var r=e.update;r.oldSubDisplayDescription=a.formatMultiPlanSummary(r.kind,r.interval,r.currency,r.amount,r.quantity),e.$watch("update",function(){c()},!0),c()}}else s.open(e,{template:Wi(),animation:"rotateIn",externalCloser:!1,includeInHistory:!1,"z-index":100})}).catch(function(e){n.status.open("We couldn't get your subscription details. Contact [email protected] if this problem persists","error",6e3)}).finally(function(){n.spinner.close()}),e.updateSubscription=function(){o.makeFormDirty(e.forms.fUpdate),e.forms.fUpdate.$invalid||(n.spinner.open(),a.updateSubscription(e.update.planId,e.update.quantity).then(function(e){"Payment_Failed"===e.status&&e.key?n.popup.open({view:Ri(),kind:"info",animation:"message",tparams:{invoiceId:e.key}}):"success"===e.status?(n.status.open("Subscription Update Succeeded","success",3e3),i.go("siteform.updateThankyou",{})):n.status.open("Oh dear - something went wrong ","error",3e4)}).catch(function(e){var t=e.data;e.status;n.status.open("Oh dear - something went wrong ","error",3e4),"Payment_Failed"===t.status&&t.key?n.popup.open({view:Ri(),kind:"info",animation:"message",tparams:{invoiceId:t.key}}):n.status.open("Oh dear - something went wrong ","error",3e4)}).finally(function(){n.spinner.close()}))}}])}),mt=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("siteform.updateSubscription",{url:"/updateSubscription",template:Vi(),controller:"UpdateSubscriptionCtrl"})}])}),ft=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("tagEditor",["$timeout","dragulaService",function(e,n){return{template:Hi(),restrict:"EA",scope:{tags:"=",tagEditorId:"="},link:function(e,n){e.el=n[0]},controller:["$scope",function(t){t.viewState={newTag:""};var a=t.viewState;n.options(t,"tag-field-bag",{mirrorContainer:document.querySelector(".tagManager__mirrorContainer")}),e(function(){var e;(e=t.el.querySelector("input"))&&e.focus()},10),t.addTag=function(){var n=a.newTag.trim().replace(/\s+/g,"-");if(0!==n.length){var i,o=t.tags.map(function(e){return e.text}).indexOf(n);if(-1===o)t.tags.push({text:n}),o=t.tags.length-1,a.newTag="";else e(function(){(i=t.el.querySelector(".tag__"+o)).classList.add("l-flash"),e(function(){return i.classList.remove("l-flash")},300)},0)}else a.newTag=n},t.removeTag=function(e){t.tags=t.tags.filter(function(n){return e!==n})};t.onDelete=function(e,n){if(8===e.which){var a=t.el.querySelector("input");a&&0===a.selectionStart&&(n?t.removeTag(n):a&&0===a.selectionStart&&t.tags.pop())}}}]}}])}),gt=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("tagEscape",function(){return function(e,n,t){n.bind("keydown",function(n){27===n.keyCode&&e.$apply(t.tagEscape)}
2),e.$on("$destroy",function(){n.unbind("keydown")})}})}),vt=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("tagFocus",["$timeout",function(e){return function(n,t,a){n.$watch(a.tagFocus,function(n){n&&e(function(){var e=t[0];!function(e){if("number"==typeof e.selectionStart)e.selectionStart=e.selectionEnd=e.value.length;else if(void 0!==e.createTextRange){e.focus();var n=e.createTextRange();n.collapse(!1),n.select()}}(e),e.focus()},0,!1)})}}])}),ht=t.cw(function(e,n){o(),Eo()().module("tkfngApp").config(["$stateProvider",function(e){e.state("tagManager",{views:{"main@":{template:'<div tag-manager do-close="closePopup()" has-subscription="true"\n                        tag-options-picked="onTagOptionsPicked(tagOptions)" ></div>'}},url:"/i/site/tagManager"})}])}),bt=t.cw(function(e,n){o(),Eo()().module("tkfngApp").directive("tagManager",function(){return{template:Yi(),restrict:"EA",scope:{onTagOptionsPicked:"&",hasSubscription:"=",calName:"=",doClose:"&"},link:function(e,n){e.el=n[0]},controller:["$scope","$rootScope","tkfNotify","$q","$http","TagOptions",function(e,n,t,a,i,o){var r,s=!0;o.get({id:e.calName}).$promise.then(function(e){r=e,s=!e||!e.tags||0===e.tags.length}).catch(function(){return r=new o({tags:[]})}).finally(function(){e.tagOptions=r}),e.editTag=function(n){e.editedTag=n,e.originalTag=Object.assign({},n)},e.removeTag=function(e){r.tags=r.tags.filter(function(n){return n.text!==e.text}),r.tags},e.revertEdits=function(n){r.tags[r.tags.indexOf(n)]=e.originalTag,e.editedTag=null,e.originalTag=null},e.close=function(){e.doClose()},e.syncTopTags=function(){if(e.calName){var n=r.tags?r.tags.length:0;t.spinner.open(),i.post("/api/tagoptions/sync-top-tags/"+e.calName+"?n=20").then(function(a){var i=a.data;if(i&&i.tags){r.tags=i.tags,e.tagOptions=r;var o=i.tags.length-n;o>0?t.status.open(o+" tag"+(1===o?"":"s")+" added","success",6e3):t.status.open("No new tags found","success",6e3)}}).catch(function(){t.status.open("Failed to load top tags","error",6e3)}).finally(function(){t.spinner.close()})}},e.sortAlphabetically=function(){r&&r.tags&&r.tags.sort(function(e,n){var t=e.text.toUpperCase(),a=n.text.toUpperCase();return t>a?1:t<a?-1:0})},e.saveTags=function(){var t=e.tagOptions;(!t||!t.tags||0===t.tags.length)&&s?e.doClose():e.tagOptions.$save({calname:e.calName}).then(function(){if(n.$broadcast("tagOptionsSaved"),e.onTagOptionsPicked)return e.onTagOptionsPicked({tagOptions:r})}).finally(function(){return e.doClose()})}}]}})}),yt=t.cw(function(e,n){const a={versionDescriptor:"r1406-817-g7867c279",buildDate:"2026-09-27T11:33:12Z"};t.d(n,["A",0,a])}),wt=()=>t(394),_t=()=>t(555),kt=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,r(a.key),a)}}function o(e,n,t){return n&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function r(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}function s(){var e,n,t="function"==typeof Symbol?Symbol:{},a=t.iterator||"@@iterator",i=t.toStringTag||"@@toStringTag";function o(t,a,i,o){var s=a&&a.prototype instanceof c?a:c,d=Object.create(s.prototype);return l(d,"_invoke",function(t,a,i){var o,s,l,c=0,d=i||[],u=!1,p={p:0,n:0,v:e,a:m,f:m.bind(e,4),d:function(n,t){return o=n,s=0,l=e,p.n=t,r}};function m(t,a){for(s=t,l=a,n=0;!u&&c&&!i&&n<d.length;n++){var i,o=d[n],m=p.p,f=o[2];t>3?(i=f===a)&&(l=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=m&&((i=t<2&&m<o[1])?(s=0,p.v=a,p.n=o[1]):m<f&&(i=t<3||o[0]>a||a>f)&&(o[4]=t,o[5]=a,p.n=f,s=0))}if(i||t>1)return r;throw u=!0,a}return function(i,d,f){if(c>1)throw TypeError("Generator is already running");for(u&&1===d&&m(d,f),s=d,l=f;(n=s<2?e:l)||!u;){o||(s?s<3?(s>1&&(p.n=-1),m(s,l)):p.n=l:p.v=l);try{if(c=2,o){if(s||(i="next"),n=o[i]){if(!(n=n.call(o,l)))throw TypeError("iterator result is not an object");
2if(!n.done)return n;l=n.value,s<2&&(s=0)}else 1===s&&(n=o.return)&&n.call(o),s<2&&(l=TypeError("The iterator does not provide a '"+i+"' method"),s=1);o=e}else if((n=(u=p.n<0)?l:t.call(a,p))!==r)break}catch(n){o=e,s=1,l=n}finally{c=1}}return{value:n,done:u}}}(t,i,o),!0),d}var r={};function c(){}function d(){}function u(){}n=Object.getPrototypeOf;var p=[][a]?n(n([][a]())):(l(n={},a,function(){return this}),n),m=u.prototype=c.prototype=Object.create(p);function f(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,l(e,i,"GeneratorFunction")),e.prototype=Object.create(m),e}return d.prototype=u,l(m,"constructor",u),l(u,"constructor",d),d.displayName="GeneratorFunction",l(u,i,"GeneratorFunction"),l(m),l(m,i,"Generator"),l(m,a,function(){return this}),l(m,"toString",function(){return"[object Generator]"}),(s=function(){return{w:o,m:f}})()}function l(e,n,t,a){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}l=function(e,n,t,a){function o(n,t){l(e,n,function(e){return this._invoke(n,t,e)})}n?i?i(e,n,{value:t,enumerable:!a,configurable:!a,writable:!a}):e[n]=t:(o("next",0),o("throw",1),o("return",2))},l(e,n,t,a)}function c(e,n,t,a,i,o,r){try{var s=e[o](r),l=s.value}catch(e){return void t(e)}s.done?n(l):Promise.resolve(l).then(a,i)}t.d(n,{i:()=>f}),Dt();var d,u,p,m=function(){var e,n=(e=s().m(function e(n){return s().w(function(e){for(;;)switch(e.n){case 0:return n.data.hostname=location.hostname,e.n=1,(0,Dt().TB)("/api/app/log",n);case 1:return e.a(2)}},e)}),function(){var n=this,t=arguments;return new Promise(function(a,i){var o=e.apply(n,t);function r(e){c(o,a,i,r,s,"next",e)}function s(e){c(o,a,i,r,s,"throw",e)}r(void 0)})});return function(e){return n.apply(this,arguments)}}(),f=o(function e(){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e)});d=f,p=function(e,n){return m({category:e,event:n,data:arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}}).then(function(){})},(u=r(u="log"))in d?Object.defineProperty(d,u,{value:p,enumerable:!0,configurable:!0,writable:!0}):d[u]=p}),St=t.cw(function(e,n){function a(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var a,i,o,r,s=[],l=!0,c=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=o.call(t)).done)&&(s.push(a.value),s.length!==n);l=!0);}catch(e){c=!0,i=e}finally{try{if(!l&&null!=t.return&&(r=t.return(),Object(r)!==r))return}finally{if(c)throw i}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return i(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?i(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}t.d(n,{$:()=>c,C:()=>l});var o=[["edge",/\bEdge?[A-Z]?\//],["opera",/\bOPR\/|\bOpera\b/],["samsung",/\bSamsungBrowser\//],["firefox",/\bFirefox\/|\bFxiOS\//],["chrome",/\bCriOS\/|\bChrome\/|\bChromium\//],["safari",/\bSafari\//]],r=[["ios",/\b(iPhone|iPad|iPod)\b/],["android",/\bAndroid\b/],["windows",/\bWindows\b/],["mac",/\bMac OS X\b|\bMacintosh\b/],["linux",/\bLinux\b|\bX11\b/]],s=function(e,n){var t=e.find(function(e){return a(e,2)[1].test(n)});return t?t[0]:"other"},l=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:navigator.userAgent;return s(o,e)},c=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:navigator.userAgent,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:navigator.maxTouchPoints,t=s(r,e);return"mac"===t&&n>1?"ios":t}}),xt=t.cw(function(e,n){function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,o(a.key),a)}}function o(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}t.d(n,{C:()=>c}),Dt();var r,s,l,c=function(){function e(){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e)}return n=e,a=[{key:"trace",value:function(n){e.log({trace:n})}},{key:"error",value:function(n){e.log({error:n})}}],(t=null)&&i(n.prototype,t),a&&i(n,a),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,t,a}();r=c,l=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,Dt().TB)("/api/browser/log",e)},(s=o(s="log"))in r?Object.defineProperty(r,s,{value:l,enumerable:!0,configurable:!0,writable:!0}):r[s]=l}),Ct=()=>t(3558),Tt=()=>t(468),At=()=>t(7743),Et=()=>t(5902),Pt=()=>
2t(2147),zt=()=>t(6903),Dt=()=>t(919),It=()=>t(8194),Lt=t.cw(function(e,n){t.d(n,{s:()=>a}),$t();var a={showScrollBars:function(){return $t().l.removeStyler("scrollbars")},hideScrollBars:function(){$t().l.getStyler("scrollbars",!0).addMediaRule({selector:"html::-webkit-scrollbar",properties:{display:"none"}})}}}),$t=()=>t(224),Ft=()=>t(2706),Mt=()=>t(508),Ot=()=>t(9899),Nt=()=>t(3871),Ut=t.cw(function(e,n){t.d(n,{k:()=>s}),o(),$t(),Pt(),At(),c();var a=window!==window.top,i=function(e){return Eo()().isElement(e)?e:Eo()().element(e)},r=function(e){var n=Eo()().isElement(e);return n&&0===e.length?"":n?e[0].outerHTML:e},s=function(e,n){var t=Eo()().isElement(e),a=i(e);return a.attr("data-tkf-mediatype",n.type),a.attr("data-tkf-id",n.id),a.attr("data-tkf-code",n.code),a.attr("data-tkf-ism",n.ism),a.attr("data-tkf-style",n.style),a.attr("data-tkf-width",n.width),n.featured&&a.attr("data-tkf-featured","true"),t?a:r(a)};Eo()().module("tkfngViewer").service("ViewerEmbedTools",function(){var e=this,n=this,t=$t().l.getStyler("vet",!0),o=function(e,n,t){n=n||{};var a=t&&-1!==t.indexOf("editor"),i=n.align||"left",o=a?'<span class="tkf-video__preview"></span>':"";return'\n        <div class="tkf-video '.concat(a?"mceNonEditable":""," tkf__align__").concat(i,'">\n          <span class="tkf-video__container">\n            ').concat(o,'\n            <iframe src="').concat(e,'" class="tkf-video__content"\n              frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen>\n            </iframe>\n          </span>\n        </div>').trim()},l=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];var a=0;setInterval(function(){var e=document.documentElement,t=e.getBoundingClientRect().height||e.scrollHeight;if(t&&t>0&&t!==a){var i={iframeId:n[0],newHeight:t,type:"custom-html-resize"};window.parent.postMessage(i,"*"),a=t}},200)}.toString(),d=(l.match(/\([a-zA-Z,]*\)\s*=>\s*(\{[^}]*\})$/)||l.match(/function[^{]+\{([\s\S]*)\}$/))[1];this.readStyle=c()._T,this.styleToCSS=c().A8,this.toEmbedTagStyle=function(e){if("TKFMEDIA"!==e[0].nodeName){var n,t=[];if(e.hasClass("tkf__align__left")?n="left":e.hasClass("tkf__align__right")?n="right":e.hasClass("tkf__align__center")?n="center":e.hasClass("tkf__align__none")&&(n="none"),n&&t.push("align:".concat(n)),e.attr("style")){var a=e.css("width")||"",i=e.css("height")||"";"0px"===a&&(a=""),"0px"===i&&(i=""),a&&t.push("width:".concat(a)),i&&t.push("height:".concat(i))}return t.length>0&&t.join(";")}},this.readEmbedAttrs=function(n){window.$tag=n;var t=n.attr("data-tkf-mediatype"),a=n.attr("data-tkf-width"),i=n.attr("data-tkf-code"),o=n.attr("data-tkf-featured"),r=n.attr("data-tkf-id"),s=e.toEmbedTagStyle(n),l=n.attr("data-tkf-style"),d=s||l;if(!t||-1===c().DN.indexOf(t)||!r||0===r.trim().length)return!1;var u={type:t,featured:o,code:i,width:a,style:d,id:r};return!!(0,c().PQ)(u)&&u};this.makeImageEmbedCode=function(n,a,i){var o=document.querySelector(".tkfSizeDetector"),r=o?Math.floor(o.clientWidth):0,s=n.id,l=n.style,d=function(e,n){if(!n)return!1;var t=n.find(function(n){return n.id===e});return!!t&&(t.setData?t:new(Pt().W)(t))}(s,i&&i.imageSets);if(!d)return'<span tkf-error="no imageset for '.concat(s,'"></span>');var u=(0,c()._T)(l)||{},p=u.align||"left",m=u.width?+u.width.replace("px",""):256,f=("subscription.viewer"===a||"free.viewer"===a)&&r>0,g=Math.min(m+200,Math.floor(1.8*m)),v=f?g:void 0,h=f?g:m,b=d.findBestVariant("scaled",h);u.width=u.width||h+"px";var y=d.getVariantUrl(b),w=d.altText;"string"!=typeof w&&(w=d.name||"");var _=d.findBestVariant("scaled",768),k=d.getVariantUrl(_),S=window.location.href,x=i&&i.description||"";switch(a){case"free.editor":case"subscription.editor":var C=e.styleToCSS(u),T=C?'style="'.concat(C,'"'):"",A=n.featured?'data-tkf-featured="true"':"";return'<img class="tkf__align__'.concat(p,' mceNonEditable" data-pin-url="').concat(S,'"\n                  data-pin-description="').concat(x,'" alt="').concat(w,'"\n                  onerror="_tkfg.imagefn.onFailOver(this)"\n                  ').concat(A,'\n                  data-pin-media="').concat(k,'" src="').concat(y,'" ').concat(T,">");case"subscription.viewer":var E=m?function(e,n,a){var i="tkf-embed__width-"+(e=""+e),o=+e.replace("px",""),r=a||Math.floor(Math.max(414,1.5*o));t=$t().l.getStyler("vet"),n?t.queueRule("."+i,{width:o+"px"}):(t.queueMediaRule("@media (min-width : ".concat(r,"px)"),"."+i,{width:o+"px"}),t.queueMediaRule("@media (max-width : ".concat(r-1,"px)"),"."+i,{width:"100%"}));return t.applyRules(),i}(m,"none"===p,v):"";return'<img  class="tkf__align__'.concat(p," ").concat(E,'" data-pin-url="').concat(S,'"\n            data-pin-description="').concat(x,'" alt="').concat(w,'"\n            onerror="_tkfg.imagefn.onFailOver(this)"\n            data-pin-media="').concat(k,'" src="').concat(y,'">');case"free.viewer":return'<span tkf-image="'.concat(n.id,'"></span>');default:return'<span tkf-error-mode="'.concat(a,'"></span>')}},this.makeYouTubeEmbedCode=function(e,n){var t=e.id,a=e.style,i=(0,c()._T)(a),r
2=t;if("free.viewer"===n){var s="https://youtu.be/".concat(r);return'<p><a href="'.concat(s,'" target="_blank">').concat(s,"</a></p>")}var l="https://www.youtube.com/embed/".concat(r);return o(l,i,n)},this.makeFacebookEmbedCode=function(e,n){var t=e.id,a=e.style,i=(0,c()._T)(a);if("free.viewer"===n){var r="https://www.facebook.com/video/embed?video_id=".concat(t);return'<p><a href="'.concat(r,'" target="_blank">').concat(r,"</a></p>")}var s="https://www.facebook.com/video/embed?video_id=".concat(t);return o(s,i,n)},this.makeVimeoEmbedCode=function(e,n){var t=e.id,a=e.style,i=(0,c()._T)(a);if("free.viewer"===n){var r="https://vimeo.com/".concat(t);return'<a href="'.concat(r,'" target="_blank">').concat(r,"</a>")}var s="https://player.vimeo.com/video/".concat(t);return o(s,i,n)},this.makeCustomHTMLEmbedCode=function(e,n){var t=e.style,a=(0,c()._T)(t)||{};return"free.viewer"===n?'<div mode="'.concat(n,'"></div>'):function(e,n,t){e=e||{};var a=t&&-1!==t.indexOf("editor"),i=n.align||"left",o=e.width||"60%",r=(e.code||"empty").trim(),s=e.id=e.id||"em-"+Math.random(),l=(0,c().wp)("<html><head><style>".concat("*{padding:0;margin:0}","</style><script>!(function(id){").concat(d,"})('").concat(s,"')<\/script></head><body>").concat(r,"</body></html>")),u='javascript: setTimeout(function(){document.write(window.frameElement.getAttribute("srcdoc"))},0)';if(a){var p=window.chrome?"sandbox":"";return'\n          <div class="tkf-custom-embed l-edit-mode tkf__align__'.concat(i,' mceNonEditable" style="width:').concat(o,';max-width:99%">\n            <div class="tkf-custom-embed-clickBlocker"><span class="l-info">Embed Will Appear Here</span></div>\n            <iframe tabindex="-1" style="border:0" id="').concat(s,'" ').concat(p," src='").concat(u,"' srcdoc='").concat(l,"'></iframe>\n          </div>")}return'\n          <div class="tkf-custom-embed tkf__align__'.concat(i,'" style="width:').concat(o,'">\n            <iframe style="height:0;border:0" id="').concat(s,"\" src='").concat(u,"' srcdoc='").concat(l,"'></iframe>\n          </div>")}(e,a,n)},this.makeEmbedCode=function(n,t,a){var i,o=n.type;switch(o){case"image":i=e.makeImageEmbedCode(n,t,a);break;case"youtube":i=e.makeYouTubeEmbedCode(n,t);break;case"facebook":i=e.makeFacebookEmbedCode(n,t);break;case"vimeo":i=e.makeVimeoEmbedCode(n,t);break;case"html":i=e.makeCustomHTMLEmbedCode(n,t)}return i||(i='<span note="embed type error '.concat(o,'"></span>')),s(i,n)},this.toEmbedCode=function(n,t,a){var o=Eo()().isElement(n),r=i(n),s=e.readEmbedAttrs(r);if(!s)return n;var l=e.makeEmbedCode(s,t,a);return o?i(l):l},this.toEmbedCodeFilter=function(e,i,o){if(void 0===e)return e;var s,l=Eo()().isElement(e),c=(s=e,Eo()().isElement(s)?s:Eo()().element("<div>"+s+"</div>")),d=c[0].querySelectorAll("tkfmedia");("subscription.viewer"!==i&&"free.viewer"!==i||(t=$t().l.getStyler("vet",!0)),d.forEach(function(e){var t=Eo()().element(e),a=n.toEmbedCode(t,i,o);e.outerHTML=r(a)}),a&&At().O.isIOS)&&c[0].querySelectorAll('a[href^="mailto:"]').forEach(function(e){return e.setAttribute("target","_parent")});return l?c:c.html()}})}),Bt=()=>t(710),Rt=()=>t(7658),Gt=()=>t(5623),qt=()=>t(9131),jt=()=>t(6875),Wt=()=>t(4118),Vt=()=>t(3640),Ht=()=>t(3722),Yt=()=>t(5117),Kt=()=>t(4781),Jt=()=>t(949),Zt=()=>t(6363),Qt=()=>t(4495),Xt=()=>t(2614),ea=()=>t(5365),na=()=>t(7880),ta=()=>t(9541),aa=()=>t(320),ia=()=>t(8007),oa=()=>t(9085),ra=()=>t(3411),sa=()=>t(2641),la=()=>t(2965),ca=()=>t(6793),da=()=>t(1317),ua=()=>t(2889),pa=()=>t(8863),ma=()=>t(251),fa=()=>t(3126),ga=()=>t(5777),va=()=>t(9105),ha=()=>t(8047),ba=()=>t(7565),ya=()=>t(1290),wa=()=>t(1225),_a=()=>t(7320),ka=()=>t(6386),Sa=()=>t(9234),xa=()=>t(8257),Ca=()=>t(821),Ta=()=>t(8008),Aa=()=>t(1369),Ea=()=>t(6735),Pa=()=>t(1085),za=()=>t(6470),Da=()=>t(1206),Ia=()=>t(6578),La=()=>t(4441),$a=()=>t(9648),Fa=()=>t(5053),Ma=()=>t(3497),Oa=()=>t(7203),Na=()=>t(6731),Ua=()=>t(1531),Ba=()=>t(2054),Ra=()=>t(3446),Ga=()=>t(5348),qa=()=>t(5668),ja=()=>t(5941),Wa=()=>t(5839),Va=()=>t(9352),Ha=()=>t(6896),Ya=()=>t(1447),Ka=()=>t(5874),Ja=()=>t(4435),Za=()=>t(7e3),Qa=()=>
2t(6806),Xa=()=>t(8974),ei=()=>t(5252),ni=()=>t(5058),ti=()=>t(1798),ai=()=>t(1204),ii=()=>t(5810),oi=()=>t(818),ri=()=>t(4855),si=()=>t(280),li=()=>t(5600),ci=()=>t(2340),di=()=>t(3342),ui=()=>t(3836),pi=()=>t(1218),mi=()=>t(7242),fi=()=>t(2146),gi=()=>t(942),vi=()=>t(5766),hi=()=>t(5051),bi=()=>t(5028),yi=()=>t(8732),wi=()=>t(3520),_i=()=>t(2588),ki=()=>t(8054),Si=()=>t(2907),xi=()=>t(3018),Ci=()=>t(9584),Ti=()=>t(8753),Ai=()=>t(4910),Ei=()=>t(870),Pi=()=>t(4043),zi=()=>t(7794),Di=()=>t(9946),Ii=()=>t(3299),Li=()=>t(9119),$i=()=>t(4893),Fi=()=>t(1857),Mi=()=>t(6229),Oi=()=>t(9192),Ni=()=>t(8660),Ui=()=>t(8667),Bi=()=>t(9697),Ri=()=>t(5087),Gi=()=>t(1696),qi=()=>t(4462),ji=()=>t(1736),Wi=()=>t(2053),Vi=()=>t(5798),Hi=()=>t(3330),Yi=()=>t(7132),Ki=()=>t(7485),Ji=()=>t(3367),Zi=()=>t(6130),Qi=()=>t(419),Xi=()=>t(7569),eo=()=>t(1938),no=t.cw(function(e,n){}),to=t.cw(function(e,n){}),ao=()=>t(9363),io=()=>t(5904),oo=()=>t(9512),ro=()=>t(2940),so=()=>t(2646),lo=t.cw(function(e,n){const a=t.p+"assets/images/GoogleFavicon-cf91595471d2167f58a4.svg";e.exports=a}),co=t.cw(function(e,n){const a=t.p+"assets/images/ditty-a49cd7132a9196b2c917.jpg";e.exports=a}),uo=t.cw(function(e,n){const a=t.p+"assets/images/duda-widget-icon-4161f73bafa172e3232a.png";e.exports=a}),po=t.cw(function(e,n){const a=t.p+"assets/images/muse-logo-3213e8f8a85a798c41ad.png";e.exports=a}),mo=t.cw(function(e,n){const a=t.p+"assets/images/people-rsvp-a81af6d3d44026fe196b.svg";e.exports=a}),fo=t.cw(function(e,n){const a=t.p+"assets/images/squarespace-logo-8f1733fd1dd5d7ed00c1.png";e.exports=a}),go=t.cw(function(e,n){const a=t.p+"assets/images/strawberries-319cb5a79fd1d4e9e91d.jpg";e.exports=a}),vo=t.cw(function(e,n){const a=t.p+"assets/images/weebly-logo-defb451ca9613a6dca46.png";e.exports=a}),ho=t.cw(function(e,n){const a=t.p+"assets/images/wix-logo-6049564fcc1dbe364c1e.png";e.exports=a}),bo=t.cw(function(e,n){const a=t.p+"assets/images/wix_logo_light-a0438c437a9b9903fc52.svg";e.exports=a}),yo=t.cw(function(e,n){const a=t.p+"assets/images/wordpress-logo-lbg-0c89935c57a2c5c1158c.svg";e.exports=a}),wo=t.cw(function(e,n){const a=t.p+"assets/images/wordpress-logo-f9eb1fbc0fc5e07b8654.png";e.exports=a}),_o=()=>t(9520),ko=()=>t(9177),So=()=>t(4052),xo=()=>t(4080),Co=()=>t(1675),To=()=>t(5236),Ao=()=>t(7920);t(8622),t(9008),t(5655),t(9586),t(2655),t(1343),t(6638),t(3316),t(954),t(790),t(9719),t(1905),t(1329),t(6941),t(7521),t(4854),t(2865),t(1227),t(4364),t(3960),t(9860),t(1152),t(1476),t(7094),t(3687),t(789),t(5985),t(6160),t(2008),t(9372),t(111);function Eo(){return Eo.c||(Eo.c=t.n(o()))}function Po(){return Po.c||(Po.c=t.n(io()))}var zo=t(9221),Do=t(1502);function Io(){return Io.c||(Io.c=t.n(a()))}var Lo=t(7105),$o=t(5788),Fo=t(6705),Mo=t(421);function Oo(){return Oo.c||(Oo.c=t.n(so()))}var No=t(4464),Uo=t(8859),Bo=t(356);window.jQuery=window.$=Xi(),t(7098),oo(),o(),t(6563),t(6628),t(8540),t(3608),t(5507),t(7682),t(6061),t(6093),t(9378),t(4308),t(6027),t(8085).default,t(9577),io(),t(8023),no(),t(3349),t(3052),i(),ao(),t(5133),t(7201),s(),t(5294),d(),u(),p(),m(),f(),g(),v(),y(),w(),_(),k(),S(),x(),C(),T(),A(),E(),P(),z(),D(),R(),I(),L(),$(),F(),M(),O(),N(),U(),B(),G(),q(),b(),J(),j(),W(),V(),H(),Y(),K(),Z(),Q(),X(),fe(),ge(),he(),be(),ye(),we(),_e(),Se(),ke(),xe(),Ce(),Ee(),Te(),Ae(),Pe(),ze(),ue(),Le(),Fe(),Me(),Ne(),Be(),Ge(),qe(),We(),Ve(),Ye(),Ze(),Xe(),en(),nn(),tn(),an(),on(),mn(),fn(),gn(),vn(),yn(),wn(),_n(),xn(),t(6677),Tn(),Sn(),kn(),bn(),hn(),Cn(),An(),En(),Pn(),zn(),Dn(),In(),Ln(),$n(),Fn(),Mn(),On(),Nn(),Un(),Bn(),Rn(),Gn(),qn(),t(2606),t(2891),Jn(),Zn(),Qn(),Xn(),et(),nt(),tt(),at(),it(),ot(),rt(),st(),lt(),ct(),Yn(),Kn(),dt(),ut(),pt(),mt(),Wn(),Vn(),Hn(),gt(),vt(),ht(),bt(),ft(),t(6111),t(4648),t(2441),t(6359),t(8626),t(2833),t(5832),t(1700),t(9132),t(1762),t(1484),t(2035),t(252),t(7219),t(8816),t(4554),t(2828),t(6187),t(5159),t(4787),t(9253),t(552),t(9397),t(20),t(1043),t(3044),t(2700),t(2141),t(4415),t(9824),t(3716),t(9550),t(9542),t(9324),t(6022),t(4243),Ct(),t(6202),t(9839),t(5174),t(2471),t(3744),t(8202),t(3993),t(8021),t(7226),t(9419),t(2462),t(4335),t(5528),t(1518),t(4039),t(1546),t(5504),t(3333),Ut(),t(1635),t(9631),t(4803),t(6613),Ot(),l()},9774(e,n,t){"use strict";t.d(n,{N:()=>s});var a=t(9221),i=t(508),o="Source Sans 3",r=[200,900],s=function(){i.Z.addVariableFont(o,r,true,"google"),a.K.loadFonts(i.Z.familyToMeta(o))}},6677(e,n,t){angular.module("tkfngApp").config(["$stateProvider",function(e){e.state("settings.calendar.social",{url:"/social",template:t(7035)})}])},2891(e,n,t){"use strict";t.r(n);var a=t(5015);t.n(a)().module("tkfngApp").constant("docinfo",[{state:"install",title:"Installing Tockify",path:"pages/install/index.html",children:[{state:"squarespace",title:"SquareSpace",path:"pages/install/squarespace.html"},{state:"wordpress",title:"WordPress",path:"pages/install/wordpress.html"},{state:"weebly",title:"Weebly",path:"pages/install/weebly.html"},{state:"duda",title:"Duda",path:"pages/install/duda.html"},{state:"wix",title:"Wix",path:"pages/install/wix.html"},{state:"tumblr",title:"Tumblr",path:"pages/install/tumblr.html"},{state:"muse",title:"Adobe Muse",path:"pages/install/muse.html"},{state:"anywhere",title:"Other Sites",path:"pages/install/anywhere.html"}]},{state:"faq",title:"Questions & Answers",path:"pages/faq/index.html",children:[{state:"general",title:"General Questions",path:"pages/faq/generalFAQ.html"},{state:"technical",title:"Technical Questions",path:"pages/faq/technicalFAQ.html"},{state:"subscription",title:"Subscription Questions",path:"pages/faq/subscriptionFAQ.html"}]},{state:"api",title:"API     ",path:"pages/api/index.html",children:[{state:"embed",title:"Embedding API",path:"pages/api/embedding.html"}]},{state:"howto",title:"How To Guides",path:"pages/howto/index.html",children:[{state:"googlesync",title:"Google Calendar Sync",path:"pages/howto/googlesync.html"},{state:"usersubmit",title:"User Submitted Events",path:"pages/howto/usersubmit.html"},{state:"customize",title:"Calendar Customization Guide",path:"pages/howto/customize.html"},{state:"whitelabel",title:"White Label Guide",path:"pages/howto/whitelabel.html"},{state:"addcalendars",title:"How To Add More Calendars",path:"pages/howto/addcalendars.html"},{state:"tagpicker",title:"The Tag Picker",path:"pages/howto/tagpicker.html"}]},{state:"company",title:"Company",path:"pages/company/index.html",children:[{state:"gdpr",title:"GDPR Compliance",path:"pages/company/gdpr.html"},{state:"privacy",title:"Privacy Policy",path:"pages/company/privacy-gdpr.html"},{state:"tos",title:"Terms Of Service",path:"pages/company/tos.html"}]}]).config(["$stateProvider","docinfo",function(e,n){function a(n,a){var i="docs.inter."+(a=a?a+".":"")+n.state,o="/"+n.state,r=t(3562)("./"+n.path),s=n.controller;e.state(i,{url:o,views:{"docpage@docs":{template:r,controller:s}}})}e.state("docs",{abstract:!0,views:{"main@":{template:t(3612),controller:"DocsCtrl"}}}).state("docs.inter",{url:"/i/docs",views:{"menu@docs":{template:t(2212)},"docpage@docs":{template:t(6712)}}}
2),n.forEach(function(e){a(e),e.children&&e.children.forEach(function(n){return a(n,e.state)})})}])},2606(e,n,t){"use strict";t.r(n);var a=t(5015),i=t.n(a),o=t(3558),r=t(4746),s=t(9221),l=t(9774),c=t(7569),d="docs.inter.";i().module("tkfngApp").controller("DocsCtrl",["$scope","docinfo","$state",function(e,n,t){e.viewState={menuOpen:!1},(0,l.N)(),s.K.loadFontsByName("Roboto"),e.museLibraryLink=o.T.get("prefix","")+"/assets/pluginsForWebTools/muse/TockifyMuseLibrary.mulib",e.wordpressPluginLink=o.T.get("prefix","")+"/assets/pluginsForWebTools/wordpress/tockify-calendar-wordpress-plugin.zip",e.docinfo=n,e.calendarName="your-calendar-name-goes-here",e.calmetas=r.B.onlineCalmetas,e.calmetas.length>0&&(e.calendarName=e.calmetas[0].name),e.isDudaUser=r.B.usermeta.isDudaUser,e.isDudaEmbed=e.isDudaUser&&window.top!==window.self,e.editorLink=function(){var n=e.calmetas.length>0?e.calmetas[0].name:"";return n?"/e/".concat(n):"/i/settings/calendars"};var a=function(){var e=t.current.name;return 0===e.indexOf(d)?e.substring(11):""};e.isActive=function(e){return 0===a().indexOf(e)},e.isExactly=function(e){return a()===e};var i=[{state:"",title:"Documentation",section:""}];n.forEach(function(e){var n=e.title.trim();i.push({state:e.state,title:"Overview",section:n}),(e.children||[]).forEach(function(t){i.push({state:e.state+"."+t.state,title:t.title,section:n})})});e.currentPage=function(){var e=function(){for(var e=a(),n=0;n<i.length;n++)if(i[n].state===e)return n;return-1}();return-1===e?null:i[e]},e.sectionSref=function(){return d+a().split(".")[0]},e.atDocsRoot=function(){return""===a()},e.resetScroll=function(){setTimeout(function(){return c("body").scrollTop(0)})},e.pageState={}}])},962(e,n,t){"use strict";t.d(n,{Nd:()=>r,tP:()=>i});var a=t(9794),i=function(e,n){return(0,a.TB)("/api2/dudaCalendar?stk=".concat(e),n)},o=function(e){window.parent.postMessage(JSON.stringify(e),"*")},r=function(e){if("XXX dudaUpgrade ".concat(e),window.top===window.self)(0,a.hm)("/api/subscription-status").then(function(n){var t=n.upgradeUrl;if(t){if(e){var a=Array.isArray(e)?e.at(-1):e;t+="&planId=".concat(a)}window.open(t,"duda")}});else{var n={type:"upgradeApp",appId:"94128bda-2518-4678-9c22-1b2af6eba7ee"};Array.isArray(e)?n.plansList=e:n.planId=e,o(n)}}},394(e,n,t){"use strict";t.d(n,{OD:()=>o,Rh:()=>r,u:()=>i});var a=t(555),i=function(e){return void 0!==(0,a.Le)(e.imageSize)},o=function(e){return!!e.showDetailsButton&&i(e)}
2,r=function(e){var n=e.views.agenda.detailsButton||{},t=e.ctaButton;return{color:n.color||t.color,background:n.background||t.background,border:n.border||t.border}}},555(e,n,t){"use strict";function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,a=Array(n);t<n;t++)a[t]=e[t];return a}t.d(n,{Es:()=>h,I7:()=>r,IR:()=>m,Le:()=>g,Mb:()=>p,VL:()=>c,XA:()=>y,_U:()=>k,dd:()=>b,ek:()=>_,fp:()=>w,kh:()=>v,rl:()=>s,ry:()=>d,xN:()=>l,yH:()=>o,zd:()=>u});var i,o=[{key:"medium",label:"Medium",width:200,maxShare:"35%"},{key:"large",label:"Large",width:250,maxShare:"37.5%"},{key:"xlarge",label:"Very Large",width:300,maxShare:"40%"},{key:"huge",label:"Huge",width:420,maxShare:"45%"}],r="default",s="Small",l=20,c="original",d="1:1",u=function(e){return e.imageFrame||("circle"===e.imageShape?"circle":"rectangle")},p=["9:8","8:7","7:6","6:5","5:4","4:3"],m=p.map(function(e){return e.split(":").reverse().join(":")}),f=([d].concat(p,function(e){if(Array.isArray(e))return a(e)}(i=m)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(i)||function(e,n){if(e){if("string"==typeof e)return a(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?a(e,n):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),/^\s*(\d+(?:\.\d+)?)\s*:\s*(\d+(?:\.\d+)?)\s*$/),g=function(e){var n=o.find(function(n){return n.key===e});return n?n.width:void 0},v=function(e){var n=o.find(function(n){return n.key===e});return n?n.maxShare:void 0},h=function(e){var n,t=g(e.imageSize),a=b(e),i=1===(n="circle"===u(e)?1:a===c?void 0:function(e){if("string"==typeof e){var n=f.exec(e);if(n){var t=parseFloat(n[1]),a=parseFloat(n[2]);return t>0&&a>0?t/a:void 0}}}(a)||1)&&void 0===t;return{width:t,ratio:n,useThumb:i,crop:void 0!==n&&!i}},b=function(e){return e.imageAspectRatio||("rectangle"===e.imageShape?c:d)},y=function(e){return function(e){if("circle"===u(e))return"circle";var n=b(e);return n===d?"square":n===c?"rectangle":void 0}(e)||e.imageShape},w=function(e,n){return e.useThumb?n.thumbURL:void 0!==e.ratio?n.getBestCoverUrl(e.width||140,e.ratio):void 0!==e.width?n.getBestScaledUrl(e.width):n.imageURL},_=function(e){return"circle"===u(e)?1e3:e.imageRoundedCorners?10:0},k=function(e){return"circle"===u(e)?1e3:e.imageRoundedCorners?12:0}},919(e,n,t){"use strict";t.d(n,{TB:()=>l,Un:()=>u,hm:()=>d,mI:()=>c,r7:()=>o,wV:()=>s});var a=t(9794),i=null,o=function(e){return i=e},r=function(e){var n=i.defer(),t=n.promise,a=n.resolve,o=n.reject;return e.then(function(e){return a(e)}).catch(function(e){return o(e)}),t},s=function(e){return i.resolve(e)},l=function(e,n,t){return r(a.Ay.postJSON(e,n,t))},c=function(e,n,t){return r(a.Ay.putJSON(e,n,t))},d=function(e,n){return r(a.Ay.getJSON(e,n))},u=function(e,n){return r(a.Ay.deleteJSON(e,n))}},9794(e,n,t){"use strict";t.d(n,{TB:()=>f,hm:()=>g});var a=t(5236);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,a)}return t}function r(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach(function(n){s(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function s(e,n,t){return(n=function(e){var n=function(e,n){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,n||"default");if("object"!=i(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==i(n)?n:n+""}(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}var l={Accept:"application/json","Content-Type":"application/json"},c=function(e,n){try{return e()}catch(e){return void console.warn("tryRun (".concat(n,") failed: ").concat(e))}},d=function(e){var n=c(function(){return a.A.get("token")},e);if(n){var t={Authorization:"Bearer "+n};return r(r({},l),{},{bearerHeader:t})}return l},u="same-origin",p=function(e){return e.then(function(e){if(401===e.status)throw c(function(){return a.A.remove("token")},"remove token cookie on 401 response"),window.location.assign("/i/site/login"),"not logged in";return e.text().then(function(n){var t={text:n};try{t=JSON.parse(n)}catch(e){}return Promise.resolve({jsonObject:t,fetchResponse:e})})}).then(function(e){var n=e.jsonObject,t=e.fetchResponse;if(+t.status>=400){var a=n.errors||{},i=t.headers;throw{data:n,status:t.status,errors:a,headers:i,fetchResponse:t}}return n})},m=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=Object.keys(n);if(0===t.length)return e;var a=t.filter(function(e){return void 0!==n[e]}).map(function(e){var t=n[e];return(Array.isArray(t)?t:[t]).map(function(e){return encodeURIComponent(e)}).map(function(n){return"".concat(e,"=").concat(n)}).join("&")}).join("&"),i=-1!==e.indexOf("?"),o=e[e.length-1],r="";return i?"&"!==o&&"?"!==o&&(r="&"):r="?",e+r+a},f=function(e,n){var t=m(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:{});return p(fetch(t,{method:"POST",headers:d("POST ".concat(t)),credentials:u,body:JSON.stringify(n)}))},g=function(e){var n=m(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{});return p(fetch(n,{headers:d("GET ".concat(n)),credentials:u}))};const v={postJSON:f,putJSON:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=m(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:{});return p(fetch(t,{method:"PUT",headers:d("PUT ".concat(t)),credentials:u,body:JSON.stringify(n)}))},getJSON:g,deleteJSON:function(e){var n=m(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{});return p(fetch(n,{method:"DELETE",headers:d("DELETE ".concat(n)),credentials:u}))},resolvePromise:function(e){return Promise.reject(e)},rejectPromise:function(e){return Promise.resolve(e)},makePromise:function(e){return new Promise(e)}};t.d(n,["Ay",0,v])},3871(e,n,t){"use strict";t.d(n,{$R:()=>u,Et:()=>c,Fl:()=>h,NF:()=>m,TB:()=>s,TJ:()=>v,aB:()=>f,kG:()=>g,sg:()=>d,up:()=>l,vd:()=>p});t(710);function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,n){for(var t=0;t<n.length;t++){var a=n[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,r(a.
2key),a)}}function o(e,n,t){return(n=r(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e){var n=function(e,n){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,n||"default");if("object"!=a(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}(e,"string");return"symbol"==a(n)?n:n+""}var s=/^[\+-_a-z0-9]+(\.[\+-_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,12})$/,l=function(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()},c=function(e){return!isNaN(parseFloat(e))&&isFinite(e)},d=function(e,n){var t=null;return function(){for(var a=arguments.length,i=new Array(a),o=0;o<a;o++)i[o]=arguments[o];var r=this;clearTimeout(t),t=setTimeout(function(){e.call.apply(e,[r].concat(i)),t=null},n)}},u=function(e,n){var t=null,a=0;return function(){a++;var i=this;clearTimeout(t),t=setTimeout(function(){e.call(i,a),a=0,t=null},n)}},p=function(e,n,t){if(null===n||0===n.length)return e;for(var a=n.split("."),i=e;null!=i&&0!==a.length;)i=i[a.shift()];return i||t},m=function(e){return setTimeout(function(){var n={pageX:e.pageX,pageY:e.pageY,clientX:e.pageX,clientY:e.pageY},t=document.elementFromPoint(n.pageX,n.pageY);t=3===t.nodeType?t.parentNode:t;var a=new MouseEvent("click",n);t.dispatchEvent(a)},0)},f=function(e,n,t,a){(new Date).getTime();var i=0;return e(function(e,o){!function r(){var s=document.querySelector(n);s?((new Date).getTime(),e(s)):i>a?o():setTimeout(function(){return r()},t),i+=t}()})},g=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2e4;return new Promise(function(t,a){var i,o=!1,r=function(e,n){o||(o=!0,i&&clearTimeout(i),e(n))};n&&(i=setTimeout(function(){return r(a,new Error("timed out loading "+e))},n));var s=document.createElement("script");s.type="application/javascript",s.src=e,s.async=!0,s.defer=!0,s.onload=function(){return r(t)},s.onerror=function(){return r(a,new Error("failed to load "+e))},document.body.appendChild(s)})},v=function(){return e=function e(n){var t=this;!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),o(this,"queue",[]),o(this,"running",!1),o(this,"isEmpty",function(){return 0===t.queue.length}),o(this,"runAfterPromise",function(){return t.$q.when(0)}),o(this,"add",function(e){t.queue.push(e),t.trigger()}),this.$q=n},(n=[{key:"afterPromise",value:function(e){this.runAfterPromise=e}},{key:"trigger",value:function(){var e=this;if(!this.running&&this.queue.length>=1){var n=this.queue.shift();this.running=!0,n().then(function(){return e.runAfterPromise()}).finally(function(){e.running=!1,e.trigger()})}}}])&&i(e.prototype,n),t&&i(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t}(),h=function(e,n){var t=function(e,n){var t;return"function"==typeof Event?t=new CustomEvent(e):(t=document.createEvent("CustomEvent")).initCustomEvent(e,!0,!0,n),t}(e,n);document.dispatchEvent(t)}},5623(e){e.exports='<div class="customizer__main" ng-click="viewState.calendarMenuOpen = false">\n  <nav class="navbar navbar-default navbar-fixed-top tkf-adminnav" tkf-adminnav>\n    <div class="container-fluid">\n      \x3c!-- Collect the nav links, forms, and other content for toggling --\x3e\n      <div class="collapse navbar-collapse">\n        <ul class="nav navbar-nav navbar-left">\n          <li ng-if="!isDudaEmbed"><a class="l-change" ui-sref="site">Home</a></li>\n          <li class="l-dropifnarrow"><a class="l-change" ng-if="isLoggedIn && isOwnCalendar" target="_self"\n                                        ui-sref="edit.inter.agenda({calname:calendar.name})">Edit\n            Events</a></li>\n          <li class="l-dropifnarrow"><a class="l-change" ng-if="isLoggedIn"\n                                        ui-sref="settings.calendar.main({id:calendar._id})">Settings<sup\n              class="label label-danger"\n              ng-if="alerts.length>0">!</sup></a></li>\n        </ul>\n        <ul class="nav navbar-nav tkf-adminnav__center">\n\n          <li><a class="l-change l-active">Full Calendar</a></li>\n          <li><a class="l-change" ui-sref="customizer.upcoming({calname:calname, demo:viewState.useDemoCalendar})">Mini\n            Calendar</a></li>\n          \x3c!--<li><label>Switch Calendar</label></li>--\x3e\n        </ul>\n        <ul class="nav navbar-nav navbar-right ">\n          \x3c!--<p class="navbar-text l-navlabel">Design with events from</p>--\x3e\n          <li class="tkf-adminnav__actions">\n            <button class="btn tkf-adminnav__cta" type="button" ng-click="showEmbedCode()">Add to your site</button>\n          </li>\n          <li class="tkf-adminnav__account" ng-class="{dropdown:true, open:viewState.calendarMenuOpen}"\n              ng-if="isLoggedIn && isOwnCalendar && calnames.length > 1">\n            \x3c!--\n            <select class="form-control" ng-options="calname for calname in caln
2ames"\n                    ng-model="calname"></select><span>&nbsp;{{\'Change Calendar\' | translate}}</span>\n                    --\x3e\n            <a class="dropdown-toggle" ng-click="toggleCalendarMenu($event)"\n               role="button">{{calname}}<span class="caret"></span></a>\n            <ul class="dropdown-menu">\n              <li ng-repeat="name in calnames"><a\n                  ui-sref="customizer.main({calname:name, demo:viewState.useDemoCalendar})">{{name}}</a></li>\n            </ul>\n          </li>\n        </ul>\n\n      </div>\n    </div>\n  </nav>\n\n  <div class="customizer">\n    <div class="container-fluid">\n      <div class="row">\n\n        <div class="col-md-8">\n          <div class="customizer__calendar" ng-if="calendar">\n            \x3c!-- The demo/your-events switch. Kept in step with react-client\'s\n                 customizers/DemoEventsNotice.tsx and with its twin in upcomingCustomizer.html. --\x3e\n            <div class="demoEventsNotice" ng-if="canChooseDemoEvents">\n              <div class="demoEventsNotice__card" ng-class="{\'is-own\': !viewState.useDemoCalendar}">\n                <div class="demoEventsNotice__text">\n                  <p class="demoEventsNotice__title" ng-if="viewState.useDemoCalendar">You\'re previewing with demo events</p>\n                  <p class="demoEventsNotice__title" ng-if="!viewState.useDemoCalendar">You\'re previewing with your events</p>\n                  <p class="demoEventsNotice__hint" ng-if="viewState.useDemoCalendar">Sample events that show off every style.</p>\n                  <p class="demoEventsNotice__hint" ng-if="!viewState.useDemoCalendar">The events visitors see on your calendar.</p>\n                </div>\n                <div class="demoEventsNotice__switch" role="radiogroup" aria-label="Events to preview">\n                  <input type="radio" class="demoEventsNotice__input" id="demoEventsNotice-demo" name="demoEventsNotice"\n                         ng-model="viewState.useDemoCalendar" ng-value="true">\n                  <label class="demoEventsNotice__option" for="demoEventsNotice-demo">Demo events</label>\n                  <input type="radio" class="demoEventsNotice__input" id="demoEventsNotice-own" name="demoEventsNotice"\n                         ng-model="viewState.useDemoCalendar" ng-value="false">\n                  <label class="demoEventsNotice__option" for="demoEventsNotice-own">Your events</label>\n                </div>\n              </div>\n            </div>\n            <div data-tockify-calendar="{{embedCalName}}" data-tockify-component="calendar" data-tockify-demo="theme"\n                 data-tockify-passcode="{{passcode}}">\n            </div>\n          </div>\n        </div>\n        <div class="col-md-4 customizer__column">\n          <div class="customizer__wrap">\n            <div class="customizer__area customizer__area--bs l-main" ng-if="settings">\n              \x3c!--<div class="customizer__externalClose" ng-click="viewState.showControls = false"><i--\x3e\n              \x3c!--class="flaticon-close-197"></i></div>--\x3e\n              \x3c!--<div class="w-resize"></div>--\x3e\n              <div ng-class="{\'customizer__nav--right\':true, \'l-activeRow\':(viewState.activeRow===1)}">\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'basics\')}"\n                        ng-click="switchTab(\'basics\')" type="button">\n                  Basics\n                </button>\n\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'style\')}"\n                        ng-click="switchTab(\'style\')" type="button">\n                  Styles\n                </button>\n\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'navbar\')}"\n                        ng-click="switchTab(\'navbar\')" type="button">\n                  Navbar\n                </button>\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'themes\')}"\n                        ng-click="switchTab(\'themes\')" type="button">\n                  Themes\n                </button>\n\n              </div>\n              <div ng-class="{\'customizer__nav--right l-row2\':true, \'l-activeRow\':(viewState.activeRow===2)}">\n\n                <button\n                    ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'viewers.inter.pinboard\')}"\n                    ng-click="switchTab(\'viewers.inter.pinboard\')" type="button">\n                  Pinboard\n                </button>\n                <button\n                    ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'viewers.inter.agenda\')}"\n                    ng-click="switchTab(\'viewers.inter.agenda\')" type="button">\n                  Agenda\n                </button>\n                <button\n                    ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'viewers.inter.monthly\')}"\n                    ng-click="switchTab(\'viewers.inter.monthly\')" type="button">\n                  Monthly\n                </button>\n                <button\n                    ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'viewers.inter.detail\')}"\n                    ng-click="switchTab(\'viewers.inter.detail\')" type="button">\n                  Detail\n                </button>\n              </div>\n              <div ng-class="{\'customizer__scrollparent\':true, \'with-controls\':true}">
2\n\n                <div class="customizer__controls">\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'basics\'">\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Default calendar layout\' | translate}}</label>\n                      <label class="radio-inline" ng-if="settings.views.pinboard.show">\n                        <input name="defaultLayout" ng-model="settings.defaultView" type="radio"\n                               value="pinboard">{{\'Pinboard\' | translate}}</label>\n                      <label class="radio-inline" ng-if="settings.views.agenda.show">\n                        <input name="defaultLayout" ng-model="settings.defaultView" type="radio"\n                               value="agenda">{{\'Agenda\' | translate}}\n                      </label>\n                      <label class="radio-inline" ng-if="ms.show">\n                        <input name="defaultLayout" ng-model="settings.defaultView" type="radio"\n                               value="monthly">{{\'Monthly\' | translate}}\n                      </label>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Show these calendar layouts\' | translate}}</label>\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.views.pinboard.show" type="checkbox"> Pinboard</label>\n                        <label><input ng-model="settings.views.agenda.show" type="checkbox"> Agenda</label>\n                        <label><input ng-model="ms.show" type="checkbox"> Monthly</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm" ng-if="!settings.defaultViewNarrow">Using same layout on\n                      narrow devices\n                      <a href="" ng-click="settings.defaultViewNarrow = settings.defaultView">change</a>\n                    </div>\n                    <div class="form-group form-group-sm" ng-if="settings.defaultViewNarrow">\n                      <label class="customizer__controls_section">{{\'Default calendar layout when narrow\' |\n                      translate}}</label>\n\n                      <label class="radio-inline" ng-if="settings.views.pinboard.show">\n                        <input name="defaultLayoutNarrow" ng-model="settings.defaultViewNarrow" type="radio"\n                               value="pinboard">{{\'Pinboard\' | translate}}</label>\n                      <label class="radio-inline" ng-if="settings.views.agenda.show">\n                        <input name="defaultLayoutNarrow" ng-model="settings.defaultViewNarrow" type="radio"\n                               value="agenda">{{\'Agenda\' | translate}}\n                      </label>\n                      <label class="radio-inline" ng-if="ms.show">\n                        <input name="defaultLayoutNarrow" ng-model="settings.defaultViewNarrow" type="radio"\n                               value="monthly">{{\'Monthly\' | translate}}\n                      </label>\n                      <label class="radio-inline">\n                        <input name="defaultLayoutNarrow" ng-model="settings.defaultViewNarrow" type="radio"\n                               value="upcoming">{{\'Mini\' | translate}}\n                      </label>\n                      <div class="customizer__link-subscript">\n                        <a href="" ng-click="settings.defaultViewNarrow = false">use same layout for all widths</a>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label><input ng-model="settings.showContinuingEvents" type="checkbox"> {{\'Show Continuing Events\'\n                      | translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label><input ng-model="settings.randomizeSameDateEvents" type="checkbox"> {{\'Randomize order of\n                      events\n                      with\n                      same\n                      date & time\n                      \' | translate}}\n                      </label>\n                      <div style="margin-top:0" class="customizer__settings__note">If unchecked events with the same\n                        date and time are sorted alphabetically\n                      </div>\n                    </div>\n\n                    <div class="form-group">\n\n                      \x3c!-- default start date picker --\x3e\n                      <div class="form-group form-group-sm">\n                        <label> {{\'Default Start Date\' | translate}}</label>\n                        <div ng-if="settings.defaultStartDate">\n                          <input bs-datepicker class="form-control customizer__datepicker" data-autoclose="1"\n                                 data-date-format="{{dateFormat}}" data-date-type="number" data-min-view="0"\n                                 data-placement="top-left" data-start-view="0" data-start-week="{{wkstart}}"\n                                 data-timezone="UTC" data-use-native="false" name="date"\n                                 ng-model="proxy.defaultStartDate"\n                                 size="10" type="text">\n                          <a href="" ng-click="proxy.defaultStartDate = false">use current day</a>\n                        </div>\n\n                        <div ng-if="!settings.defaultStartDate">Using Current Day:\n                          <a href="" ng-click="proxy.defaultStartDate = todayMidnightUTC()">pick a date</a>\n                        </div>\n\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_section">{{\'Language Choice\' | translate}}</label>\n                      <div>\n                        <label class="radio-inline">\n                          <input name="useClientDateFormat" ng-model="settings.useClientDateFormat" ng-value="{{false}}"\n                                 type="radio">{{\'use the calendar\\\'s default language\' |\n                        translate}}</label>\n                      </div>\n                      <div>\n                        <label class="radio-inline">\n                          <input name="useClientDateFormat" ng-model="settings.useClientDateFormat" ng-value="{{true}}"\n                                 type="radio">{{\'use the visitors\\\'s language\' | translate}}</label>\n                      </div>\n\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Show timezone\' | translate}}</label>\n                      <div class="customizer__checkboxes">\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay" ng-model="settings.showTimezone"\n                                                             type="radio" value="never">\n                            never</label>\n                        </div>\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay" ng-model="settings.showTimezone"\n                                                             type="radio" value="always"> always</label>\n                        </div>\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay" ng-model="settings.showTimezone"\n                                                             type="radio" value="different"> when\n                            it differs from the visitor\'s timezone</label>\n                        </div>\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay" ng-model="settings.showTimezone"\n                                                             type="radio" value="visitor"> show date\n                            in the visitor\'s timezone</label>\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label>Date format</label>\n                      <div ng-if="!settings.customDateFormat.longDateFormat">Using default for language:\n                        <a href="" ng-click="settings.customDateFormat.longDateFormat = []">use custom format</a>\n                      </div>\n\n                      <div ng-if="settings.customDateFormat.longDateFormat">\n                        <tags-input ng-model="settings.customDateFormat.longDateFormat"\n                                    add-from-autocomplete-only="true" allow-leftover-text="false" min-length="1"\n                                    placeholder="add/remove date element">\n                          <auto-complete load-on-empty="true" load-on-focus="true" load-on-down-arrow="true"\n                                         min-length="0"\n                                         source="validDateTags(settings.customDateFormat.longDateFormat)">\n                          </auto-complete>\n                        </tags-input>\n                        <a href="" ng-click="setDefaultDateFormat(\'longDateFormat\')">use default for language</a>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label>"Events From" Date format</label>\n                      <div ng-if="!settings.customDateFormat.eventsFromDateFormat">Using default for language:\n                        <a href="" ng-click="settings.customDateFormat.eventsFromDateFormat = []">use custom format</a>\n                      </div>\n\n                      <div ng-if="settings.customDateFormat.eventsFromDateFormat">\n                        <tags-input ng-model="settings.customDateFormat.eventsFromDateFormat"\n                                    add-from-autocomplete-only="true" allow-leftover-text="false" min-length="1"\n                                    placeholder="add/remove date element">\n                          <auto-complete load-on-empty="true" load-on-focus="true" load-on-down-arrow="true"\n                                         min-length="0"\n                                         source="validDateTags(settings.customDateFormat.eventsFromDateFormat)">\n                          </auto-complete>\n                        </tags-input>\n                        <a href="" ng-click="setDefaultDateFormat(\'eventsFromDateFormat\')">use default for language</a>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label>"Events From" text</label>\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="proxy.hideEventsFromText" type="checkbox"\n                               ng-change="toggleHideEventsFromText()"> Hide "Events From" text</label>\n                      </div>\n\n                      <div ng-if="!proxy.hideEventsFromText">\n                        <div ng-if="!proxy.useEventsFromText">Using default for language:\n                          <a href="" ng-click="proxy.useEventsFromText = true">use custom text</a>\n                        </div>\n\n                        <div ng-if="proxy.useEventsFromText">\n                          <input ng-model="proxy.eventsFromText" type="text" class="form-control"\n                                 placeholder="for example: Events From {date}"\n                                 ng-blur="settings.eventsFromText = proxy.eventsFromText">\n                          <div class="customizer__settings__note">Type <b>{date}</b> anywhere in the text and the\n                            calendar\'s current \'Events From\' date will appear there.\n                          </div>\n                          <a href=""\n                             ng-click="proxy.useEventsFromText = false; proxy.eventsFromText = settings.eventsFromText = undefined;">use\n                            default for language</a>\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <input ng-model="settings.showNoMoreEvents" type="checkbox"> <label>Show "No More Events"\n                        indicator</label> <a ng-if="!proxy.useNoMoreText && settings.showNoMoreEvents" href=""\n                                             ng-click="proxy.useNoMoreText = true">use custom text</a>\n                        <div ng-if="proxy.useNoMoreText && settings.showNoMoreEvents">\n                          <input ng-model="proxy.noMoreText" type="text" class="form-control"\n                                 placeholder="for example: More Events Coming Soon"\n                                 ng-blur="settings.noM
2oreText = proxy.noMoreText">\n                          <a href=""\n                             ng-click="proxy.useNoMoreText = false; proxy.noMoreText = settings.noMoreText = undefined;">use\n                            default for language</a>\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <input ng-model="settings.showNoEventsFound" type="checkbox"> <label>Show "No Events Found"\n                        indicator</label> <a ng-if="!proxy.useNoEventsFoundText && settings.showNoEventsFound" href=""\n                                             ng-click="proxy.useNoEventsFoundText = true">use custom text</a>\n                        <div ng-if="proxy.useNoEventsFoundText && settings.showNoEventsFound">\n                          <input ng-model="proxy.noEventsFoundText" type="text" class="form-control"\n                                 placeholder="for example: More Events Coming Soon"\n                                 ng-blur="settings.noEventsFoundText = proxy.noEventsFoundText">\n                          <a href=""\n                             ng-click="proxy.useNoEventsFoundText = false; proxy.noEventsFoundText = settings.noEventsFoundText = undefined;">use\n                            default for language</a>\n                        </div>\n                      </div>\n                    </div>\n\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.showLoadMoreEvents" type="checkbox"> Show "Load More Events"\n                          button</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.showSubscribeToCalendar" type="checkbox"> Show "Subscribe" link\n                          on calendar</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.padEmbedded" type="checkbox"> Use padding around embedded\n                          calendar</label>\n                      </div>\n                      <div ng-if="!settings.padEmbedded"><span class="label label-danger">Warning</span>\n                        Unless you are adding padding yourself removing this padding\n                        could make your calendar look wrong\n                      </div>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Focus indicator\' |\n                      translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="focusIndicator" ng-model="settings.a11y.focusIndicator" value="none"\n                               type="radio">{{\'disable\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="focusIndicator" ng-model="settings.a11y.focusIndicator" value="normal"\n                               type="radio">{{\'normal\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="focusIndicator" ng-model="settings.a11y.focusIndicator" value="strong"\n                               type="radio">{{\'strong (most accessible)\' | translate}}</label>\n\n                    </div>\n\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Focus Indicator Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="settings.focusColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      use this to make focus more prominent\n                    </div>\n\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_section">{{\'When showing start year put it at the\' |\n                      translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="startYearAtEnd" ng-model="settings.startYearAtEnd" ng-value="{{false}}"\n                               type="radio">{{\'start of the date\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="startYearAtEnd" ng-model="settings.startYearAtEnd" ng-value="{{true}}"\n                               type="radio">{{\'end of the date\' | translate}}</label>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Show prominent year indicator\' |\n                      translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="alwaysShowYear" ng-model="settings.alwaysShowYear" ng-value="{{false}}"\n                               type="radio">{{\'only when needed for clarity\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="alwaysShowYear" ng-model="settings.alwaysShowYear" ng-value="{{true}}"\n                               type="radio">{{\'always\' | translate}}</label>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Open embedded calendar event details \' |\n                      translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="openDetails" ng-model="settings.openDetails" type="radio" value="inline">{{\'inline\n                      (default)\n                      \' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="openDetails" ng-model="settings.openDetails" type="radio" value="fullscreen">{{\'as\n                      fullscreen\n                      overlay\n                      \' | translate}}</label>\n\n                      <div class="customizer__settings__note" ng-if="settings.openDetails === \'fullscreen\'">\n                        Fullscreen overlay is on but we disable it in this customizer tool because\n                        it would interfere with customization of the details page.\n                      </div>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.useStandaloneForMobilePopups" type="checkbox"> Use standalone\n                          calendar instead of fullscreen overlay on\n                          mobile devices.</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.noCopy" type="checkbox"> Disable copy and paste for event\n                          descriptions </label>\n                        <div ng-if="settings.noCopy"><span class="label label-danger">Warning</span>\n                          Disabling copy and paste is a security feature that can make your calendar less usable.\n                        </div>\n\n                      </div>\n                    </div>\n\n                  </div>\n\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'style\'">\n                    <div class="customizer__controls__subPaneSwitcher">\n                      <a class="customizer__controls__subPaneOption l-two"\n                         ng-class="{\'l-active\':viewState.subPane===\'common\'}"\n                         ng-click="switchSubPane(\'common\')">Shared</a><a\n                        class="customizer__controls__subPaneOption l-two"\n                        ng-class="{\'l-active\':viewState.subPane===\'tag\'}" ng-click="switchSubPane(\'tag\')">Per Tag</a>\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'common\'">\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Text\' | translate}}</label>\n                        <label>{{\'Text Size\' | translate}}</label><select\n                          class="form-control customizer__fontSizePicker" ng-model="settings.fontSize"\n                          ng-options="fontSize for fontSize in baseFontSizes"></select>\n                        &nbsp;<label>{{\'Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="settings.textColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}">\n                        </spectrum-colorpicker>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Text Font\' | translate}}</label>\n                        <ui-select class="customizer__fontFamilyPicker" ng-model="settings.textFont.family">\n                          <ui-select-match class="ui-select-match"><span\n                              style="font-family:\'{{settings.textFont.family}}\'">{{settings.textFont.family}}</span>\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="item.family as item in availableFonts | filter: $select.search">\n                            <div ng-bind-html="item.family | highlight: $select.search"\n                                 style="font-family:{{item.family}}"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <ui-select class="customizer__fontWeightPicker" ng-model="settings.textFont.weight">\n                          <ui-select-match class="ui-select-match">{{weightToName[settings.textFont.weight]}}\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="weight in fonts.textFont.weights | filter: $select.search">\n                            <div ng-bind-html="weightToName[weight] | highlight: $select.search"\n                                 style="font-weight:{{weight}}"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <label class="customizer__fontStylePicker checkbox-inline">\n                          <input ng-false-value="\'normal\'" ng-model="settings.textFont.style" ng-true-value="\'italic\'"\n                                 type="checkbox"> {{\'italic\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Heading Font\' | translate}}</label>\n                        <ui-select class="customizer__fontFamilyPicker" ng-model="settings.headerFont.family">\n                          <ui-select-match class="ui-select-match"><span\n                              style="font-family:{{settings.headerFont.family}}">{{settings.headerFont.family}}</span>\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="item.family as item in availableFonts | filter: $select.search">\n                            <div ng-bind-html="item.family | highlight: $select.search"\n                                 style="font-family:{{item.family}}"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <ui-select class="customizer__fontWeightPicker" ng-model="settings.headerFont.weight">\n                          <ui-select-match class="ui-select-match">{{weightToName[settings.headerFont.weight]}}\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="weight in fonts.headerFont.weights | filter: $select.search">\n                            <div ng-bind-html="weightToName[weight] | highlight: $select.search"\n                                 style="font-weight:{{weight}}"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <label class="customizer__fontStylePicker checkbox-inline">\n                          <input ng-false-value="\'normal\'" ng-model="settings.headerFont.style" ng-true-value="\'italic\'"\n                                 type="checkbox"> {{\'italic\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Date Font\' | translate}}</label>\n                        <ui-select class="customizer__fontFamilyPicker" ng-model="settings.dateFont.family">\n                          <ui-select-match class="ui-select-match"><span\n                              style="font-family:{{settings.dateFont.family}}">{{settings.dateFont.family}}</span>\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="item.family as item in availableFonts | filter: $select.search">\n                            <div ng-bind-html="item.family | highlight: $select.search"\n                                 style="font-family:{{item.family}}"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <ui-select class="customizer__fontWeightPicker" ng-model="settings.dateFont.weight">\n                          <ui-select-match class="ui-select-match">{{weightToName[settings.dateFont.weight]}}\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="weight in fonts.dateFont.weights | filter: $select.search">\n                            <div ng-bind-html="weightToName[weight] | highlight: $select.search"\n                                 style="font-weight:{{weight}}"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <label class="customizer__fontStylePicker checkbox-inline">\n                          <input ng-false-value="\'normal\'" ng-model="settings.dateFont.style" ng-true-value="\'italic\'"\n                                 type="checkbox"> {{\'italic\' | translate}}\n                        </label>\n                      </div>\n\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Link Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="settings.linkColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Default Tag Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="settings.tagColor"\n                                              ng-model="settings.tagColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.tagColor"><a href="" ng-click="settings.tagColor = false"> use link\n                            color</a></span>\n                        <span ng-if="!settings.tagColor">Same as Link Color:\n                          <a href="" ng-click="settings.tagColor = settings.linkColor">change</a></span>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Background Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="settings.background"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Embedded Background Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.embeddedBackgroun
2d" ng-model="settings.embeddedBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.embeddedBackground"><a href=""\n                                                                     ng-click="settings.embeddedBackground = false"> use\n                            default (same as background)</a></span>\n                        <span ng-if="!settings.embeddedBackground">Same as Background Color: <br>\n                          <a href="" ng-click="settings.embeddedBackground = settings.background">change</a> (e.g. make\n                          transparent)</span>\n\n                      </div>\n\n                      <label class="customizer__controls_section">{{\'Status Label Colors\' | translate}}</label>\n\n                      <div class="form-group form-group-sm">\n                        <label>{{\'cancelled\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.cancelled"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <label>{{\'movedOnline\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.movedOnline"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label>{{\'postponed\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.postponed"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <label>{{\'rescheduled\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.rescheduled"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label>{{\'notice\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.notice"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <label>{{\'busy\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.busy"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label>{{\'provisional\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.statusBackground.provisional"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n\n\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'tag\'">\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Tag Style\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="tagStyle" ng-model="settings.tagStyle" type="radio" value="full">{{\'full\' |\n                        translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="tagStyle" ng-model="settings.tagStyle" type="radio" value="hollow">{{\'hollow\' |\n                        translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="tagStyle" ng-model="settings.tagStyle" type="radio" value="minimal">{{\'minimal\' |\n                        translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="tagStyle" ng-model="settings.tagStyle" type="radio" value="hashtag">{{\'hashtag\' |\n                        translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n\n                        <a ng-click="openTagManager()" href>Set up allowed tags</a>\n                        <span>\n                          Before you can assign colors to tags you must create an allowed tags list\n                        </span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <div class="customizer__checkboxes">\n                          <label><input ng-model="settings.linkTagColors" type="checkbox"> Use tag colors for\n                            links</label>\n                        </div>\n                      </div>\n\n                      <h4 class="customizer__controls_header">{{\'Per Tag Colors\' | translate}}</h4>\n                      <div class="form-group form-group-sm" ng-repeat="tag in tagKeys">\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.tagcolors[tagToKey(tag)]"\n                                              ng-model="settings.tagcolors[tagToKey(tag)]"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n                        <label class="">{{tag}}</label>\n                        <span><a href="" ng-click="removeTagColor(tag)" ng-if="settings.tagcolors[tagToKey(tag)]"> use\n                            default</a></span>\n                        <span ng-if="settings.tagcolors[tagToKey(tag)]">\n                          <span class="customizer__tagColorPicker">\n\n                          </span>\n\n                        </span>\n                        <span ng-if="!settings.tagcolors[tagToKey(tag)]"><a href="" ng-click="initTagColor(tag)"> set\n                            tag color</a></span>\n\n                      </div>\n\n                    </div>\n\n\n                  </div>\n                  \x3c!-- NAVBAR settings --\x3e\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'navbar\'">\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Background Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.navbar.background"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label class="customizer__fontStylePicker checkbox-inline">\n                        <input ng-false-value="true" ng-model="settings.navbar.gradient" ng-true-value="false"\n                               type="checkbox"> {{\'Flat\' | translate}}\n                      </label>\n                    </div>\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_section">{{\'Text Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="settings.navbar.color"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Font\' | translate}}</label>\n                      <ui-select class="customizer__fontFamilyPicker" ng-model="settings.navbar.font.family">\n                        <ui-select-match class="ui-select-match"><span\n                            style="font-family:\'{{settings.navbar.font.family}}\'">{{settings.navbar.font.family}}</span>\n                        </ui-select-match>\n                        <ui-select-choices class="ui-select-choices"\n                                           repeat="item.family as item in availableFonts | filter: $select.search">\n                          <div ng-bind-html="item.family | highlight: $select.search"\n                               style="font-family:{{item.family}}"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                      <ui-select class="customizer__fontWeightPicker" ng-model="settings.navbar.font.weight">\n                        <ui-select-match class="ui-select-match">{{weightToName[settings.navbar.font.weight]}}\n                        </ui-select-match>\n                        <ui-select-choices class="ui-select-choices"\n                                           repeat="weight in fonts.navbarFont.weights | filter: $select.search">\n                          <div ng-bind-html="weightToName[weight] | highlight: $select.search"\n                               style="font-weight:{{weight}}"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                      <label class="customizer__fontStylePicker checkbox-inline">\n                        <input ng-false-value="\'normal\'" ng-model="settings.navbar.font.style" ng-true-value="\'italic\'"\n                               type="checkbox"> {{\'italic\' | translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Border Shape\' | translate}}</label>\n                      <label class="radio-inline">\n                        <input name="navbar_borderRadius" ng-model="settings.navbar.borderRadius" type="radio"\n                               value="0">{{\'square\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="navbar_borderRadius" ng-model="settings.navbar.borderRadius" type="radio"\n                               value="2">{{\'beveled\' | translate}}\n                      </label>\n                      <label class="radio-inline">\n                        <input name="navbar_borderRadius" ng-model="settings.navbar.borderRadius" type="radio"\n                               value="4">{{\'rounded\' | translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.showSearch" type="checkbox"> Show Search</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">Tag Picker</label>\n                      <label class="radio-inline">\n                        <input name="navbar_tagPicker" ng-model="settings.navbar.tagPicker" type="radio"\n                               value="none">None\n                      </label>\n                      <label class="radio-inline">\n                        <input name="navbar_tagPicker" ng-model="settings.navbar.tagPicker" type="radio"\n                               value="showWhenSearching">Show when searching\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.alwaysShowSubscribe" type="checkbox"> Keep Subscribe\n                          prominent when space is limited </label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.alwaysShowSubmit" type="checkbox"> Keep Submit Prominent\n                          when space is limited </label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.subscribeAsButton" type="checkbox"> Always show\n                          Subscribe as button (not link) </label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.showDateNav" type="checkbox"> Show Date\n                          Navigator</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.startOpen" type="checkbox"> Start with search visible on\n                          narrow screens</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.showFullScreen" type="checkbox"> Show Full Screen Option\n                          (when necessary)</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_section">{{\'Switcher button colors\' | translate}}</label>\n                      <label>{{\'Background\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.navbar.buttonBackground"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'Text\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.navbar.buttonColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Switcher button colors when pressed\' |\n                      translate}}</label>\n                      <label>{{\'Background\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.navbar.activeButtonBackground"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'Text\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.navbar.activeButtonColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.navbar.themeTextInput" type="checkbox"> Apply theme to search\n                          input text boxes </label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Border\' | translate}}</label>\n\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-if="settings.navbar.borderColor" ng-model="settings.navbar.borderColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n                      <span ng-if="settings.navbar.borderColor"><a href=""\n                                                                   ng-click="settings.navbar.borderColor = false"> use\n                          default</a></span>\n                      <span ng-if="!settings.navbar.borderColor">Using Default: <a href=""\n                                                                                   ng-click="settings.navbar.borderColor = autoNavBorderColor()">set\n                          manually</a></span>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Button Border\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-if="settings.navbar.buttonBorderColor"\n                                            ng-model="settings.navbar.buttonBorderColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="settings.navbar.buttonBorderColor"><a href=""\n                                                                         ng-click="settings.navbar.buttonBorderColor = false"> use\n                          default</a></span>
2\n                      <span ng-if="!settings.navbar.buttonBorderColor">Using Default: <a href=""\n                                                                                         ng-click="settings.navbar.buttonBorderColor = autoNavButtonBorderColor()">set\n                          manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Call To Action Button\' | translate}}</label>\n                      <label>{{\'Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.ctaButton.background"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'Text\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.ctaButton.color"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n\n                      <label>{{\'Border\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.ctaButton.border"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Attachment Button\' | translate}}</label>\n                      <label>{{\'Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.attachButton.background"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'Text\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.attachButton.color"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n\n                      <label>{{\'Border\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="settings.attachButton.border"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-false-value="\'_blank\'" ng-model="settings.ctaButton.target"\n                                      ng-true-value="\'_top\'" type="checkbox"> Open promotion button link in same\n                          tab</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label>\n                        <input ng-model="settings.navbar.fourDigitYear" type="checkbox"> {{\'Use 4 digit years in\n                      datepicker\n                      \' | translate}}\n                      </label>\n                      <div>\n                        Changes to year format will only take effect after saving the theme and reloading this page.\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label>\n                        <input ng-false-value="true" ng-model="settings.navbar.show" ng-true-value="false"\n                               type="checkbox"> {{\'Hide Navigation Bar\' | translate}}\n                      </label>\n                      <div ng-if="!settings.navbar.show"><span class="label label-danger">Warning</span>\n                        hiding the navigation bar removes search, social sharing, fullscreen and other features.\n                      </div>\n                    </div>\n                  </div>
2\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'themes\'">\n\n                    <div class="form-group form-inline customizer__theme__desc l-live" ng-if="isLoggedIn">\n                      <label class="customizer__controls_section">{{\'Live Theme for this calendar\' | translate}}</label>\n                      <div class="l-name">{{ted.activeSummary.name}}</div>&nbsp;<span\n                        class="l-category">{{ted.activeSummary.cstr}}</span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Switch to a built in theme\' | translate}}</label>\n                      <span ng-repeat="t in ted.builtInThemes track by t.id"><button\n                          class="btn btn-default customizer__themeButton"\n                          ng-class="{\'btn-siteform\':t.themeId === ted.currentSummary.themeId}" ng-click="setTheme(t.id)"\n                          type="button">{{t.name}}</button>&nbsp;</span>\n                    </div>\n                    <p>These are just starting points, you can customize them as much as you like.</p>\n\n                    <div ng-if="isLoggedIn">\n                      <label class="control-label">Switch to a custom theme</label>\n\n                      <div class="customizer__theme__picker">\n                        <ui-select class="l-select" ng-model="ted.selected.themeId" title="Pick a theme">\n                          <ui-select-match class="ui-select-match" placeholder="Select a custom theme">\n                            {{$select.selected.name}}\n                          </ui-select-match>\n\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="theme.themeId as theme in ted.customThemeMenu ">\n                            <div ng-bind-html="theme.name | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <a class="l-remove" ng-click="startDeleteTheme()"\n                           ng-if="!ted.currentIsActiveTheme && ted.selected.themeId" type="button">\n                          <i class="flaticon-delete"></i>\n                        </a>\n                      </div>\n                    </div>\n\n\n                    <a class="l-showVersions" href\n                       ng-if="!ted.showVersionPicker && ted.themeVersions[ted.selected.themeId].length > 1"\n                       ng-click="ted.showVersions()">change default version</a>\n                    <div ng-if="ted.showVersionPicker">\n                      <label class="control-label">Change default version for this theme</label>\n                      <div class="customizer__theme__picker">\n                        <ui-select class="l-select-version" ng-model="ted.selected.version" title="Pick a version">\n                          <ui-select-match class="ui-select-match " placeholder="Select a previous version">\n                            {{$select.selected.vstr}}\n                          </ui-select-match>\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="theme.version as theme in ted.themeVersions[ted.selected.themeId]">\n                            <div ng-bind-html="theme.vstr | highlight: $select.search"></div>\n                            <div ng-bind-html="theme.vtime | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>&nbsp;<a class="l-showVersions" href ng-click="ted.hideVersions()"\n                                             ng-if="ted.showVersionPicker">hide\n                        versions</a>\n                      </div>\n\n                    </div>\n\n                    <p></p>\n\n                    <div class="form-group form-inline customizer__theme__desc l-current" ng-if="isLoggedIn">
2\n                      <label class="customizer__controls_section">{{\'The theme you are editing is:\' |\n                      translate}}</label>\n                      <div class="l-name">{{ted.currentSummary.name}}</div>&nbsp;<span\n                        class="l-category">{{ted.currentSummary.cstr}}</span><a href\n                                                                                ng-click="saveTheme(true)">duplicate\n                      this theme</a>\n                    </div>\n                  </div>\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'viewers.inter.pinboard\'">\n\n                    <div class="customizer__controls__subPaneSwitcher">\n                      <a class="customizer__controls__subPaneOption l-two"\n                         ng-class="{\'l-active\':viewState.subPane===\'styles\'}" ng-click="switchSubPane(\'styles\')">Colors\n                        and Styles</a><a class="customizer__controls__subPaneOption l-two"\n                                         ng-class="{\'l-active\':viewState.subPane===\'layout\'}"\n                                         ng-click="switchSubPane(\'layout\')">Layout</a>\n                    </div>\n\n\n                    <div ng-show="viewState.subPane === \'layout\'">\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showImages" type="checkbox"> Show Images</label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.eventsFromText" type="checkbox"> {{\'Show "Events\n                        From\n                        " text\' | translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showPlace" type="checkbox"> {{\'Show Place/Room\n                        Name\n                        \' | translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showAddress" type="checkbox"> {{\'Show Address\' |\n                        translate}}\n                        </label>\n                      </div>\n\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showPreview" type="checkbox"> {{\'Show Preview\' |\n                        translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showTags" type="checkbox"> {{\'Show Tags\' |\n                        translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showPromoButton" type="checkbox"> {{\'Show\n                        Promotion\n                        Button\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showRSVP" type="checkbox"> {{\'Show RSVP Button\'\n                        | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm"\n                           ng-if="hasHideDateFeature || settings.views.pinboard.hideDate">\n                        <div class="customizer__checkboxes">\n                          <label><input ng-model="settings.views.pinboard.hideDate" type="checkbox"> {{\'Hide Date\' |\n                          translate}}\n                          </label>\n                        </div>\n                        <div ng-if="settings.views.pinboard.hideDate"><span class="label label-danger">Warning</span>\n                          hiding the date means nobody will be able to see when your events are! Don\'t do this unless\n                          you\'re very sure that\'s what you want.\n                        </div>\n                      </div>\n\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.scaleCards" type="checkbox"> {{\'Use larger cards\n                        on\n                        wide\n                        screens\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Maximum Events Shown\' | translate}}</label>\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-model="settings.views.pinboard.maxEventsPerQuery"\n                                ng-options="item.value as item.label for item in maxEventsOptions">\n                        </select>\n                      </div>\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'styles\'">\n\n                      <div class="form-group form-group-sm">\n                        <label>{{\'Event Title Size\' | translate}}</label>\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-if="settings.views.pinboard.eventTitleSize"\n                                ng-model="settings.views.pinboard.eventTitleSize"\n                                ng-options="fontSize for fontSize in headerFontSizes"></select>\n                        <span ng-if="settings.views.pinboard.eventTitleSize"><a href=""\n                                                                                ng-click="settings.views.pinboard.eventTitleSize = false">&nbsp;use default</a></span>\n                        <span ng-if="!settings.views.pinboard.eventTitleSize">Using Default:\n                          <a href=""\n                             ng-click="settings.views.pinboard.eventTitleSize = autoPinboardEventTitleSize()">set\n                            manually</a></span>\n\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.pinboard.showBorders" type="checkbox"> {{\'Show Borders\' |\n                        translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Border Shape\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="pinboard_borderRadius" ng-model="settings.views.pinboard.borderRadius"\n                                 type="radio" value="0">{{\'square\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="pinboard_borderRadius" ng-model="settings.views.pinboard.borderRadius"\n                                 type="radio" value="8">{{\'curved\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="pinboard_borderRadius" ng-model="settings.views.pinboard.borderRadius"\n                                 type="radio" value="16">{{\'rounded\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Border Color\' | translate}}</label>\n\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.pinboard.borderColor"\n                                              ng-model="settings.views.pinboard.borderColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n                        <span ng-if="settings.views.pinboard.borderColor"><a href=""\n                                                                             ng-click="settings.views.pinboard.borderColor = false"> use default</a></span>\n                        <span ng-if="!settings.views.pinboard.borderColor">Using Default: <a href=""\n                                                                                             ng-click="settings.views.pinboard.borderColor = autoPinboardBorderColor()">set\n                            manually</a></span>\n\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Image Style\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="pinboard_cardLayout" ng-model="settings.views.pinboard.cardLayout" type="radio"\n                                 value="fill">{{\'fill\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="pinboard_cardLayout" ng-model="settings.views.pinboard.cardLayout" type="radio"\n                                 value="inset">{{\'inset\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="pinboard_cardLayout" ng-model="settings.views.pinboard.cardLayout" type="radio"\n                                 value="boxed">{{\'boxed\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="pinboard_cardLayout" ng-model="settings.views.pinboard.cardLayout" type="radio"\n                                 value="underlined">{{\'underlined\' | translate}}\n                        </label>\n                      </div>\n\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Pincard Background Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.pinboard.cardBackground"\n                                              ng-model="settings.views.pinboard.cardBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.pinboard.cardBackground"><a href=""\n                                                                                ng-click="settings.views.pinboard.cardBackground = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.pinboard.cardBackground">Using Default: <a href=""\n                                                                                                ng-click="settings.views.pinboard.cardBackground = settings.background">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Pincard Text Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.pinboard.cardColor"\n                                              ng-model="settings.views.pinboard.cardColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.pinboard.cardColor"><a href=""\n                                                                           ng-click="settings.views.pinboard.cardColor = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.pinboard.cardColor">Using Default: <a href=""\n                                                                                           ng-click="settings.views.pinboard.cardColor = settings.textColor">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Pincard Link Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.pinboard.linkColor"\n                                              ng-model="settings.views.pinboard.linkColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>
2\n                        <span ng-if="settings.views.pinboard.linkColor"><a href=""\n                                                                           ng-click="settings.views.pinboard.linkColor = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.pinboard.linkColor">Using Default: <a href=""\n                                                                                           ng-click="settings.views.pinboard.linkColor = settings.linkColor">set\n                            manually</a></span>\n                      </div>\n\n                    </div>\n\n                  </div>\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'viewers.inter.agenda\'">\n\n                    <div class="customizer__controls__subPaneSwitcher">\n                      <a class="customizer__controls__subPaneOption l-two"\n                         ng-class="{\'l-active\':viewState.subPane===\'styles\'}" ng-click="switchSubPane(\'styles\')">Colors\n                        and Styles</a><a class="customizer__controls__subPaneOption l-two"\n                                         ng-class="{\'l-active\':viewState.subPane===\'layout\'}"\n                                         ng-click="switchSubPane(\'layout\')">Layout</a>\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'layout\'">\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showImages" type="checkbox"> Show Images</label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.eventsFromText" type="checkbox"> {{\'Show "Events\n                        From\n                        " text\' | translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showPlace" type="checkbox"> {{\'Show Place/Room\n                        Name\n                        \' | translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showAddress" type="checkbox"> {{\'Show Address\' |\n                        translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showTags" type="checkbox"> {{\'Show Tags\' |\n                        translate}}\n                        </label>\n                      </div>\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showTagBar" type="checkbox"> {{\'Show Tag Bar\' |\n                        translate}}\n                        </label> (if using colored tags)\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showPreview" type="checkbox"> {{\'Show Preview\' |\n                        translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showPromoButton" type="checkbox"> {{\'Show\n                        Promotion\n                        Button\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="settings.views.agenda.showRSVP" type="checkbox"> {{\'Show RSVP Button\' |\n                        translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm"\n                           ng-if="hasHideDateFeature || settings.views.agenda.hideDate">\n                        <div class="customizer__checkboxes">\n                          <label><input ng-model="settings.views.agenda.hideDate" type="checkbox"> {{\'Hide Date\' |\n                          translate}}\n                          </label>\n                        </div>\n                        <div ng-if="settings.views.agenda.hideDate"><span class="label label-danger">Warning</span>\n                          hiding the date means nobody will be able to see when your events are! Don\'t do this unless\n                          you\'re very sure that\'s what you want.\n                        </div>\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Maximum Events Shown\' | translate}}</label>\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-model="settings.views.agenda.maxEventsPerQuery"\n                                ng-options="item.value as item.label for item in maxEventsOptions">\n                        </select>\n                      </div>\n\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'styles\'">\n\n\n                      <div class="form-group form-group-sm">\n                        <label>{{\'Event Title Size\' | translate}}</label>\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-if="settings.views.agenda.eventTitleSize"\n                                ng-model="settings.views.agenda.eventTitleSize"\n                                ng-options="fontSize for fontSize in headerFontSizes"></select>\n                        <span ng-if="settings.views.agenda.eventTitleSize"><a href=""\n                                                                              ng-click="settings.views.agenda.eventTitleSize = false">&nbsp;use default</a></span>\n                        <span ng-if="!settings.views.agenda.eventTitleSize">Using Default:\n                          <a href="" ng-click="settings.views.agenda.eventTitleSize = autoAgendaEventTitleSize()">set\n                            manually</a></span>\n\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Image Position\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="agenda_imagePosition" ng-model="settings.views.agenda.imagePosition" type="radio"\n                                 value="left">{{\'left\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="agenda_imagePosition" ng-model="settings.views.agenda.imagePosition" type="radio"\n                                 value="right">{{\'right\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm customizer__radioWrap">\n                        <label class="customizer__controls_section">{{\'Image Size\' | translate}}</label>\n                        <br ng-repeat-start="size in agendaImageSizes" ng-show="size.breakBefore">\n                        <label class="radio-inline" ng-repeat-end>\n                          <input name="agenda_imageSize" ng-model="agendaImageSize"\n                                 ng-model-options="{getterSetter: true}" type="radio"\n                                 ng-value="size.value">{{size.label}}</label>\n                      </div>\n\n                      <div class="form-group form-group-sm" ng-if="isDetailsButtonAvailable(settings.views.agenda)">\n                        <label><input ng-model="settings.views.agenda.showDetailsButton" type="checkbox">\n                          {{\'Show View Details Button\' | translate}}</label>\n                        <div ng-if="settings.views.agenda.showDetailsButton">\n                          <label class="customizer__controls_section">{{\'View Details Button\' | translate}}</label>\n                          <label>{{\'Color\' | translate}}</label>\n                          <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                                ng-model="detailsButtonColors.background"\n                                                options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                          <label>{{\'Text\' | translate}}</label>\n                          <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                                ng-model="detailsButtonColors.color"\n                                                options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                          <label>{{\'Border\' | translate}}</label>\n                          <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                                ng-model="detailsButtonColors.border"\n                                                options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                          <div ng-if="settings.views.agenda.detailsButton">\n                            <a href="" ng-click="useCtaColorsForDetailsButton()">use Call To Action button colors</a>\n                          </div>\n                        </div>\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Image Shape\' | translate}}</label>\n                        \x3c!-- stored as imageFrame; imageShape follows only at save: see\n                             agendaImageShape in mainCustomizer.controller.js --\x3e\n                        <label class="radio-inline">\n                          <input name="agenda_imageShape" ng-model="agendaImageShape"\n                                 ng-model-options="{getterSetter: true}" type="radio"\n                                 value="rectangle">{{\'rectangle\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="agenda_imageShape" ng-model="agendaImageShape"\n                                 ng-model-options="{getterSetter: true}" type="radio"\n                                 value="circle">{{\'circle\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm customizer__radioWrap"\n                           ng-if="agendaImageShape() !== \'circle\'">\n                        <label class="customizer__controls_section">{{\'Image Aspect Ratio\' | translate}}</label>\n                        <br ng-repeat-start="aspect in agendaImageAspectRatios" ng-show="aspect.breakBefore">\n                        <label class="radio-inline" ng-repeat-end>\n                          <input name="agenda_imageAspectRatio" ng-model="agendaImageAspectRatio"\n                                 ng-model-options="{getterSetter: true}" type="radio"\n                                 ng-value="aspect.value">{{aspect.label}}</label>\n                      </div>\n\n                      <div class="form-group form-group-sm" ng-if="agendaImageShape() !== \'circle\'">\n                        <label><input ng-model="settings.views.agenda.imageRoundedCorners" type="checkbox">\n                          {{\'Rounded Image Corners\' | translate}}</label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Image Outline\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="agenda_imageOutline" ng-model="settings.views.agenda.imageOuterBorderWidth"\n                                 type="radio" value="2">{{\'yes\'}}</label>\n\n                        <label class="radio-inline">\n                          <input name="agenda_imageOutline" ng-model="settings.views.agenda.imageOuterBorderWidth"\n                                 type="radio" value="0">{{\'no\'}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Image Outline Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.agenda.imageBorderColor"\n                                              ng-model="settings.views.agenda.imageBorderColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.agenda.imageBorderColor"><a href=""\n                                                                                ng-click="settings.views.agenda.imageBorderColor = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.agenda.imageBorderColor">Using Default: <a href=""\n                                                                                                ng-click="settings.views.agenda.imageBorderColor = autoImageBorderColor()">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Separator Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.agenda.separatorColor"\n                                              ng-model="settings.views.agenda.separatorColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.agenda.separatorColor"><a href=""\n                                                                              ng-click="settings.views.agenda.separatorColor = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.agenda.separatorColor">Using Default: <a href=""\n                                                                                              ng-click="settings.views.agenda.separatorColor = autoAgendaSeparatorColor()">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Separator Width\' | translate}}</label>\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-model="settings.views.agenda.separatorWidth"\n                                ng-options="item.value as item.label for item in separatorWidthOptions">\n                        </select>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">
2{{\'Event Background Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.agenda.itemBackground"\n                                              ng-model="settings.views.agenda.itemBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.agenda.itemBackground"><a href=""\n                                                                              ng-click="settings.views.agenda.itemBackground = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.agenda.itemBackground">Using Default: <a href=""\n                                                                                              ng-click="settings.views.agenda.itemBackground = settings.embeddedBackground || settings.background">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Event Text Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.agenda.itemColor"\n                                              ng-model="settings.views.agenda.itemColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.agenda.itemColor"><a href=""\n                                                                         ng-click="settings.views.agenda.itemColor = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.agenda.itemColor">Using Default: <a href=""\n                                                                                         ng-click="settings.views.agenda.itemColor = settings.textColor">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Event Link Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="settings.views.agenda.linkColor"\n                                              ng-model="settings.views.agenda.linkColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="settings.views.agenda.linkColor"><a href=""\n                                                                         ng-click="settings.views.agenda.linkColor = false"> use\n                            default</a></span>\n                        <span ng-if="!settings.views.agenda.linkColor">Using Default: <a href=""\n                                                                                         ng-click="settings.views.agenda.linkColor = settings.linkColor">set\n                            manually</a></span>\n                      </div>\n\n                    </div>\n\n                  </div>\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'viewers.inter.monthly\'">\n\n\n                    <div class="form-group form-group-sm">\n                      <label>{{\'Text Size\' | translate}}</label><select class="form-control customizer__fontSizePicker"\n                                                                        ng-if="ms.eventFontSize"\n                                                                        ng-model="settings.views.monthly.eventFontSize"\n                                                                        ng-options="fontSize for fontSize in baseFontSizes"></select>
2\n                      <span ng-if="ms.eventFontSize"><a href="" ng-click="ms.eventFontSize = false">&nbsp;use\n                          default</a></span>\n                      <span ng-if="!ms.eventFontSize">Using Default:\n                        <a href="" ng-click="ms.eventFontSize = autoEventFontSize()">set manually</a></span>\n                    </div>\n\n                    <div class="customizer__controls__subPaneSwitcher">\n                      <a class="customizer__controls__subPaneOption l-three"\n                         ng-class="{\'l-active\':viewState.subPane===\'grid\'}" ng-click="switchSubPane(\'grid\')">Grid</a><a\n                        class="customizer__controls__subPaneOption l-three"\n                        ng-class="{\'l-active\':viewState.subPane===\'events\'}"\n                        ng-click="switchSubPane(\'events\')">Events</a><a\n                        class="customizer__controls__subPaneOption l-three"\n                        ng-class="{\'l-active\':viewState.subPane===\'tags\'}" ng-click="switchSubPane(\'tags\')">Tags</a>\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'grid\'">\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Grid View\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_gridView" ng-model="ms.gridView" type="radio" value="month">{{\'calendar\n                        month\n                        \' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="monthly_gridView" ng-model="ms.gridView" type="radio" value="4weeks">{{\'next 4\n                        weeks\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Grid Style\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_gridStyle" ng-model="ms.gridStyle" type="radio" value="full">{{\'full\' |\n                        translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="monthly_gridStyle" ng-model="ms.gridStyle" type="radio"\n                                 value="minimal">{{\'minimal\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label>{{\'Grid Text Font\' | translate}}</label>\n                        <span ng-if="settings.views.monthly.gridFont">\n                          <a href="" ng-click="settings.views.monthly.gridFont = false"> use default</a></span>\n                        <div ng-if="settings.views.monthly.gridFont">\n                          <ui-select class="customizer__fontFamilyPicker"\n                                     ng-model="settings.views.monthly.gridFont.family">\n                            <ui-select-match class="ui-select-match"><span\n                                style="font-family:\'{{settings.views.monthly.gridFont.family}}\'">{{settings.views.monthly.gridFont.family}}</span>\n                            </ui-select-match>\n                            <ui-select-choices class="ui-select-choices"\n                                               repeat="item.family as item in availableFonts | filter: $select.search">\n                              <div ng-bind-html="item.family | highlight: $select.search"\n                                   style="font-family:{{item.family}}"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                          <ui-select class="customizer__fontWeightPicker"\n                                     ng-model="settings.views.monthly.gridFont.weight">\n                            <ui-select-match class="ui-select-match">\n                              {{weightToName[settings.views.monthly.gridFont.weight]}}\n                            </ui-select-match>\n                            <ui-select-choices class="ui-select-choices"\n                                               repeat="weight in fonts.monthlyGridFont.weights | filter: $select.search">\n                              <div ng-bind-html="weightToName[weight] | highlight: $select.search"\n                                   style="font-weight:{{weight}}"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                          <label class="customizer__fontStylePicker checkbox-inline">\n                            <input ng-false-value="\'normal\'" ng-model="settings.views.monthly.gridFont.style"\n                                   ng-true-value="\'italic\'" type="checkbox"> {{\'italic\' | translate}}\n                          </label>\n                        </div>
2\n                        <span ng-if="!settings.views.monthly.gridFont">Using Default:\n                          <a href="" ng-click="initMonthGridFont()">set manually</a></span>\n                      </div>\n\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Grid Line Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.gridColor"\n                                              ng-model="ms.gridColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.gridColor"><a href="" ng-click="ms.gridColor = false"> use default</a></span>\n                        <span ng-if="!ms.gridColor">Using Default:\n                          <a href="" ng-click="ms.gridColor = autoMonthlyGridColor()">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Grid Background Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.gridBackground"\n                                              ng-model="ms.gridBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.gridBackground"><a href="" ng-click="ms.gridBackground = false"> use\n                            default</a></span>\n                        <span ng-if="!ms.gridBackground">Using Default: <a href=""\n                                                                           ng-click="ms.gridBackground = settings.embeddedBackground || settings.background">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Grid Text Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.gridTextColor"\n                                              ng-model="ms.gridTextColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.gridTextColor"><a href="" ng-click="ms.gridTextColor = false"> use\n                            default</a></span>\n                        <span ng-if="!ms.gridTextColor">Using Default: <a href=""\n                                                                          ng-click="ms.gridTextColor = settings.textColor">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Today Background\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.todayBackground"\n                                              ng-model="ms.todayBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.todayBackground"><a href="" ng-click="ms.todayBackground = false"> only show\n                            bar</a></span>\n                        <span ng-if="!ms.todayBackground">Using Default:\n                          <a href=""\n                             ng-click="ms.todayBackground = ms.gridBackground || settings.embeddedBackground || settings.background">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Today Text Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.todayColor"\n                                              ng-model="ms.todayColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.todayColor"><a href="" ng-click="ms.todayColor = false"> same as other\n                            days</a></span>\n                        <span ng-if="!ms.todayColor">Using Default:\n                          <a href="" ng-click="ms.todayColor = ms.stripColor || settings.linkColor">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="ms.otherMonthHide" ng-true-value="{{1}}" ng-false-value="{{0}}"\n                                      type="checkbox"> {{\'Hide Out of Month events\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Out of Month Background\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="ms.otherMonthBackground" ng-model="ms.otherMonthBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.otherMonthBackground"><a href="" ng-click="ms.otherMonthBackground = false">\n                            same as current month</a></span>\n                        <span ng-if="!ms.otherMonthBackground">Using Default:\n                          <a href=""\n                             ng-click="ms.otherMonthBackground = ms.gridBackground || settings.embeddedBackground || settings.background">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Out of Month Text Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.otherMonthColor"\n                                              ng-model="ms.otherMonthColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.otherMonthColor"><a href="" ng-click="ms.otherMonthColor = false"> same as\n                            current month</a></span>\n                        <span ng-if="!ms.otherMonthColor">Using Default:\n                          <a href="" ng-click="ms.otherMonthColor = ms.gridTextColor || settings.textColor">set\n                            manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label>\n                          <input type="checkbox" ng-model="ms.enableEarlyMorningCutoff"\n                                 ng-change="ms.earlyMorningEventCutoff = ms.enableEarlyMorningCutoff ? (ms.earlyMorningEventCutoff || 3) : 0">\n                          {{\'Show early morning events on previous day\' | translate}}\n                        </label>\n                        <div ng-if="ms.enableEarlyMorningCutoff" style="margin-left: 20px; margin-top: 5px;">\n                          <label class="customizer__controls_section">{{\'Cutoff time\' | translate}}</label>\n                          <select class="form-control" ng-model="ms.earlyMorningEventCutoff"\n                                  ng-options="h as (h + \'am\') for h in [1,2,3,4,5,6,7,8,9,10,11]"\n                                  ng-init="ms.enableEarlyMorningCutoff = (ms.earlyMorningEventCutoff > 0)">\n                          </select>\n                        </div>\n                      </div>\n\n                    </div>\n\n                    <div ng-show="viewState.subPane === \'events\'">\n\n                      <div class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'Event Strip Text Color\' |\n                        translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.stripColor"\n                                              ng-model="ms.stripColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.stripColor"><a href="" ng-click="ms.stripColor = false"> use default</a></span>\n                        <span ng-if="!ms.stripColor">Using Default: <a href=""\n                                                                       ng-click="ms.stripColor = settings.linkColor">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm" ng-if="ms.stripOutline !== \'none\'">\n                        <label class="customizer__controls_section">{{\'Event Strip Border Color\' |\n                        translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.stripBorderColor"\n                                              ng-model="ms.stripBorderColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.stripBorderColor"><a href="" ng-click="ms.stripBorderColor = false"> use\n                            default</a></span>\n                        <span ng-if="!ms.stripBorderColor">Using Default: <a href=""\n                                                                             ng-click="autoStripColors({borderColor:true})">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Event Strip Background Color\' |\n                        translate}}</label>\n                        <spectrum-colorpicker class="customiCzer__spectrum" format="\'rgb\'" ng-if="ms.stripBackground"\n                                              ng-model="ms.stripBackground"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.stripBackground"><a href="" ng-click="ms.stripBackground = false">&nbsp;use\n                            default</a></span>\n                        <span ng-if="!ms.stripBackground">Using Default: <a href=""\n                                                                            ng-click="autoStripColors({background:true})">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Preview Link Color\' |\n                        translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-if="ms.previewLinkColor"\n                                              ng-model="ms.previewLinkColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.previewLinkColor"><a href="" ng-click="ms.previewLinkColor = false"> use\n                            default</a></span>\n                        <span ng-if="!ms.previewLinkColor">Using Default: <a href=""\n                                                                             ng-click="ms.previewLinkColor = settings.linkColor">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Preview Background Color\' |\n                        translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-if="ms.previewBackgroun
2dColor" ng-model="ms.previewBackgroundColor"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <span ng-if="ms.previewBackgroundColor"><a href="" ng-click="ms.previewBackgroundColor = false">\n                            use default</a></span>\n                        <span ng-if="!ms.previewBackgroundColor">Using Default: <a href=""\n                                                                                   ng-click="ms.previewBackgroundColor = defaultPreviewBackground()">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Event Strip Border\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripOutline" ng-model="ms.stripOutline" type="radio"\n                                 value="full">{{\'full\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="monthly_stripOutline" ng-model="ms.stripOutline" type="radio"\n                                 value="minimal">{{\'minimal\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripOutline" ng-model="ms.stripOutline" type="radio"\n                                 value="none">{{\'none\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label>{{\'Event Text Font\' | translate}}</label>\n                        <span ng-if="settings.views.monthly.eventFont">\n                          <a href="" ng-click="settings.views.monthly.eventFont = false"> use default</a></span>\n                        <div ng-if="settings.views.monthly.eventFont">\n                          <ui-select class="customizer__fontFamilyPicker"\n                                     ng-model="settings.views.monthly.eventFont.family">\n                            <ui-select-match class="ui-select-match"><span\n                                style="font-family:\'{{settings.views.monthly.eventFont.family}}\'">{{settings.views.monthly.eventFont.family}}</span>\n                            </ui-select-match>\n                            <ui-select-choices class="ui-select-choices"\n                                               repeat="item.family as item in availableFonts | filter: $select.search">\n                              <div ng-bind-html="item.family | highlight: $select.search"\n                                   style="font-family:{{item.family}}"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                          <ui-select class="customizer__fontWeightPicker"\n                                     ng-model="settings.views.monthly.eventFont.
2weight">\n                            <ui-select-match class="ui-select-match">\n                              {{weightToName[settings.views.monthly.eventFont.weight]}}\n                            </ui-select-match>\n                            <ui-select-choices class="ui-select-choices"\n                                               repeat="weight in fonts.monthlyEventFont.weights | filter: $select.search">\n                              <div ng-bind-html="weightToName[weight] | highlight: $select.search"\n                                   style="font-weight:{{weight}}"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                          <label class="customizer__fontStylePicker checkbox-inline">\n                            <input ng-false-value="\'normal\'" ng-model="settings.views.monthly.eventFont.style"\n                                   ng-true-value="\'italic\'" type="checkbox"> {{\'italic\' | translate}}\n                          </label>\n                        </div>\n                        <span ng-if="!settings.views.monthly.eventFont">Using Default:\n                          <a href="" ng-click="initMonthEventFont()">set manually</a></span>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Show time in Event Strips\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripTime" ng-model="ms.stripTime" type="radio" value="before">{{\'before\n                        title\n                        \' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripTime" ng-model="ms.stripTime" type="radio" value="after">{{\'after\n                        title\n                        \' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripTime" ng-model="ms.stripTime" type="radio" value="never">{{\'not at\n                        all\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">Use one line per event (compact but shows\n                          less)</label>\n                        <label class="radio-inline">\n                          <input name="monthly_compact" ng-model="ms.compact" type="radio" ng-value={{false}}>{{\'never\'\n                        | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_compact" ng-model="ms.compact" type="radio" ng-value={{true}}>{{\'always\'\n                        | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="monthly_compact" ng-model="ms.compact" type="radio" value=\'narrow\'>{{\'only on\n                        phones\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label>{{\'Events visible before expanding\' | translate}}&nbsp;<select\n                            class="form-control customizer__visibleStripsPicker" ng-model="ms.visibleStrips"\n                            ng-options="num.value as num.label for num in visibleStripOptions"></select></label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'Event Strip Ends\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripEndRadius" ng-model="ms.stripEndRadius" type="radio"\n                                 value="
20">{{\'square\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="monthly_stripEndRadius" ng-model="ms.stripEndRadius" type="radio"\n                                 value="3">{{\'bevelled\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="monthly_stripEndRadius" ng-model="ms.stripEndRadius" type="radio"\n                                 value="12">{{\'rounded\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label class="customizer__controls_section">{{\'One day events\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_singleDayAsText" ng-model="ms.singleDayAsText" ng-value="{{true}}"\n                                 type="radio">{{\'text\' | translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="monthly_singleDayAsText" ng-model="ms.singleDayAsText" ng-value="{{false}}"\n                                 type="radio">{{\'strip\' | translate}}\n                        </label>\n                      </div>\n\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="ms.images.show" ng-true-value="{{1}}" ng-false-value="{{0}}"\n                                      type="checkbox"> {{\'Show images with events\' | translate}}\n                        </label>\n                      </div>\n\n                      <div class="form-group form-group-sm" ng-if="ms.images.show">\n                        <label class="customizer__controls_section">{{\'Max length in days for which images are shown\' |\n                        translate}}</label>\n\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{1}}">1\n                        </label>\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{2}}">2\n                        </label>\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{3}}">3\n                        </label>\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{4}}">4\n                        </label>\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{5}}">5\n                        </label>\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{6}}">6\n                        </label>\n                        <label class="radio-inline">\n                          <input name="showMonthImages" ng-model="ms.images.show" type="radio" ng-value="{{7}}">7\n                        </label>\n                      </div>\n\n                      <div ng-if="ms.images.show">\n                        <div class="form-group form-group-sm">\n                          <label><input ng-model="ms.images.outline" type="checkbox"> {{\'Show image outline\' |\n                          translate}}\n                          </label>\n                        </div>\n\n                        <div class="form-group form-group-sm">\n                          <label class="customizer__controls_section">{{\'Image Size\' | translate}}</label>\n                          <label class="radio-inline">\n                            <input ng-model="ms.images.size" ng-value="{{1}}" type="radio">{{\'Large\' |\n                          translate}}</label>\n\n                          <label class="radio-inline">\n                            <input ng-model="ms.images.size" ng-value="{{0.5}}" type="radio">{{\'Small\' | translate}}\n                          </label>\n                        </div>\n                      </div>\n\n                      <div ng-if="ms.singleDayAsText" class="form-group form-group-sm">
2\n                        <label class="customizer__controls_section">{{\'One Day Text Event Prefix\' | translate}}</label>\n                        <label class="radio-inline">\n                          <input name="monthly_singleDayPrefix" ng-model="ms.singleDayPrefix" value="●"\n                                 type="radio">{{\'bullet (●)\'}}</label>\n\n                        <label class="radio-inline">\n                          <input name="monthly_singleDayPrefix" ng-model="ms.singleDayPrefix" value=""\n                                 type="radio">{{\'none\'}}\n                        </label>\n\n                      </div>\n\n                      <div class="form-group form-group-sm">\n                        <label><input ng-model="ms.showPreview" type="checkbox"> {{\'Show popup preview when hovering\n                        over\n                        events\n                        \' | translate}}\n                        </label>\n                      </div>\n\n                      <div ng-if="ms.showPreview" class="form-group form-group-sm">\n                        <label><input ng-model="ms.hideTags" type="checkbox"> {{\'Hide tags in popup preview\' |\n                        translate}}\n                        </label>\n                      </div>\n                    </div>\n\n\n                    <div ng-show="viewState.subPane === \'tags\'">\n\n                      <div class="form-group form-group-sm">\n                        By default event colors in the month grid are based on the\n                        <a ui-sref=".({tab:\'style\',sub:\'tag\'})" ng-click="switchTab(\'style\',\'tag\')">global tag\n                          colors</a>\n                        You can override those here.\n                      </div>\n\n\n                      <div class="form-group form-group-sm" ng-repeat="tag in tagKeys">\n                        <label class="">{{tag}}</label>\n                        <span><a href="" ng-click="removeTagColors(tag)" ng-if="ms.tagcolors[tag]"> use default\n                            colors</a></span>\n                        <div ng-if="ms.tagcolors[tagToKey(tag)]">\n                          <div class="customizer__tagColorPicker">\n                            <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                                  ng-model="ms.tagcolors[tagToKey(tag)].color"\n                                                  options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                            \x3c!--<span ng-if="ms.tagcolors[tag].color"><a--\x3e\n                            \x3c!--href="" ng-click="clearTag(tag,\'color\')"> use default</a></span>--\x3e\n                            <span>text color</span>\n                          </div>\n                          <div class="customizer__tagColorPicker">\n                            <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                                  ng-if="ms.tagcolors[tagToKey(tag)].background"\n                                                  ng-model="ms.tagcolors[tagToKey(tag)].background"\n                                                  options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n                            <span ng-if="!ms.tagcolors[tagToKey(tagToKey(tag))].background"> <a href=""\n                                                                                                ng-click="initTagPart(tag,\'background\')"> set background color</a> (using\n                              default)</span>\n                            <span ng-if="ms.tagcolors[tagToKey(tag)].background"><span>background</span><a href=""\n                                                                                                           ng-click="clearTag(tag,\'background\')"> use default</a>\n                            </span>\n\n                          </div>\n                          <div class="customizer__tagColorPicker">\n                            <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                                  ng-if="ms.tagcolors[tagToKey(tag)].borderColor"\n                                                  ng-model="ms.tagcolors[tagToKey(tag)].borderColor"\n                                                  options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>
2\n                            <span ng-if="!ms.tagcolors[tagToKey(tag)].borderColor"> <a href=""\n                                                                                       ng-click="initTagPart(tag,\'borderColor\')"> set border color</a> (using default)</span>\n\n                            <span ng-if="ms.tagcolors[tagToKey(tag)].borderColor"><span>border</span><a href=""\n                                                                                                        ng-click="clearTag(tag,\'borderColor\')"> use default</a>\n                            </span>\n                          </div>\n                        </div>\n                        <span ng-if="!ms.tagcolors[tagToKey(tag)]"><a href="" ng-click="initTagColors(tag)">set\n                            colors</a></span>\n\n                      </div>\n                    </div>\n\n                  </div>\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'viewers.inter.detail\'">\n\n\n                    \x3c!--{{settings.views.agenda}}--\x3e\n\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Share bar style\' | translate}}</label>\n                      <label class="radio-inline">\n                        <input name="saveShareStyle" ng-model="settings.views.detail.saveShareStyle" type="radio"\n                               value="subtle">{{\'subtle\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="saveShareStyle" ng-model="settings.views.detail.saveShareStyle" type="radio"\n                               value="colorful">{{\'colorful\' | translate}}\n                      </label>\n                      <label class="radio-inline">\n                        <input name="saveShareStyle" ng-model="settings.views.detail.saveShareStyle" type="radio"\n                               value="circles">{{\'circles\' | translate}}\n                      </label>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Save and Share Options\' | translate}}</label>\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.views.detail.saveShare.twitter" type="checkbox">\n                          Twitter</label>\n                        <label><input ng-model="settings.views.detail.saveShare.facebook" type="checkbox">\n                          Facebook</label>\n                        <label><input ng-model="settings.views.detail.saveShare.pinterest" type="checkbox">\n                          Pinterest</label>\n                        <label><input ng-model="settings.views.detail.saveShare.linkedIn" type="checkbox">\n                          LinkedIn</label>\n                        <label><input ng-model="settings.views.detail.saveShare.saveToCalendar" type="checkbox"> Save To\n                          Calendar</label>\n                        <label><input ng-model="settings.views.detail.saveShare.copyLink" type="checkbox"> Copy\n                          Link</label>\n                        <label><input ng-model="settings.views.detail.saveShare.emailLink" type="checkbox"> Email\n                          Link</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Save To Calendar Icon\' | translate}}</label>\n                      <label class="radio-inline">\n                        <input name="saveIcon" ng-model="settings.views.detail.saveIcon" type="radio"\n                               value="bookmark">{{\'Bookmark\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="saveIcon" ng-model="settings.views.detail.saveIcon" type="radio"\n                               value="floppy">{{\'Floppy Disk\' | translate}}\n                      </label>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.views.detail.showTags" type="checkbox">&nbsp; Show\n                          tags/categories</label>\n                      </div>\n                    </div>\n\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.views.detail.showMapButton" type="checkbox"> Show Map\n                          Button</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div>
2\n                        <label class="customizer__controls_section">{{\'Map Button\' | translate}}</label>\n                        <label>{{\'Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.mapButton.background"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <label>{{\'Text\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.mapButton.color"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n\n                        <label>{{\'Border\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.mapButton.border"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div style="padding: 3px 0">\n                        <a href="" ng-click="resetMapButton()">use defaults</a>\n                      </div>\n\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div>\n                        <label class="customizer__controls_section">{{\'Directions Button\' | translate}}</label>\n                        <label>{{\'Color\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.directionsButton.background"\n                                              options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                        <label>{{\'Text\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.directionsButton.color"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n\n\n                        <label>{{\'Border\' | translate}}</label>\n                        <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                              ng-model="settings.directionsButton.border"\n                                              options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n                      <div style="padding: 3px 0">\n                        <a href="" ng-click="resetDirectionsButton()">use defaults</a>\n                      </div>\n                      <a href="" ng-click="syncWithMapButton()">use same colors as map button</a>\n                    </div>\n\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.views.detail.hideImages" type="checkbox"> Hide all\n                          images</label>\n                        <div ng-if="settings.views.detail.hideImages"><span class="label label-danger">Warning</span>\n                          You have hidden <b>ALL</b> images in your event descriptions.\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm" ng-if="hasHideDateFeature || settings.views.detail.hideDate">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="settings.views.detail.hideDate" type="checkbox"> {{\'Hide Date\' |\n                        translate}}\n                        </label>\n                      </div>\n                      <div ng-if="settings.views.detail.hideDate"><span class="label label-danger">Warning</span>\n                        hiding the date means nobody will be able to see when your events are! Don\'t do this unless\n                        you\'re very sure that\'s what you want.\n                      </div>\n                    </div>\n\n\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_sectioFontSizen">{{\'Event Title Text Size\' |\n                      translate}}</label>\n                      <div ng-if="settings.views.detail.titleFontSize">\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-model="settings.views.detail.titleFontSize"\n                                ng-options="fontSize for fontSize in headerFontSizes"></select>\n\n                        <a href="" ng-click="settings.views.detail.titleFontSize = false">&nbsp;use default</a>\n                      </div>\n                      <span ng-if="!settings.views.detail.titleFontSize">Using Default:\n                        <a href="" ng-click="settings.views.detail.titleFontSize = getDefaultTitleFontSize() ">set\n                          manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Text Size\' | translate}}</label>\n                      <div ng-if="settings.views.detail.fontSize">\n                        <select class="form-control customizer__fontSizePicker"\n                                ng-model="settings.views.detail.fontSize"\n                                ng-options="fontSize for fontSize in baseFontSizes"></select>\n\n                        <a href="" ng-click="settings.views.detail.fontSize = false">&nbsp;use default</a>\n                      </div>\n                      <span ng-if="!settings.views.detail.fontSize">Using Default:\n                        <a href="" ng-click="settings.views.detail.fontSize = getDefaultFontSize() ">set\n                          manually</a></span>\n                    </div>\n\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Detail Text Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-if="settings.views.detail.textColor"\n                                            ng-model="settings.views.detail.textColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="settings.views.detail.textColor"><a href=""\n                                                                       ng-click="settings.views.detail.textColor = false"> use\n                          default</a></span>\n                      <span ng-if="!settings.views.detail.textColor">Using Default:\n                        <a href="" ng-click="settings.views.detail.textColor = settings.textColor">set\n                          manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Detail Link Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-if="settings.views.detail.linkColor"\n                                            ng-model="settings.views.detail.linkColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="settings.views.detail.linkColor"><a href=""\n                                                                       ng-click="settings.views.detail.linkColor = false"> use\n                          default</a></span>\n                      <span ng-if="!settings.views.detail.linkColor">Using Default:\n                        <a href="" ng-click="settings.views.detail.linkColor = settings.linkColor">set\n                          manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_label"><input ng-model="settings.views.detail.columns"\n                                                                       type="checkbox">&nbsp;Show featured image in\n                        separate column</label>\n                      <span class="help-block l-small">This only affects Google Synced calendars</span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_label">\n                        <input type="checkbox" ng-model="viewState.usePageFooter">\n                        Add footer to event details page</label>\n                      <div ng-if="viewState.usePageFooter">\n                        <span class="help-block l-small">You can use only use HTML in the footer (not Javascript)</span>\n                        <textarea class="form-control" ng-model="viewState.pageFooter" rows="4"></textarea>\n                      </div>\n                    </div>\n\n                  </div>\n                </div>\n              </div>\n              <div class="customizer__savecontrols" ng-show="isLoggedIn && isOwnCalendar">\n                <button class="btn ui-vertical-center  btn-siteform--green" ng-click="saveTheme()"\n                        ng-disabled="!ted.hasChanges" ng-if="ted.currentIsActive || ted.hasChanges" type="button">Save\n                  Theme\n                </button>\n                <button class="btn ui-vertical-center btn-siteform--orange" ng-click="useTheme()"\n                        ng-if="ted.showUseTheme" type="button">Use This Theme\n                </button>\n                <button class="btn btn-default ui-vertical-center" ng-click="revertTheme()"\n                        ng-if="viewState.controlPane === \'themes\' && ted.hasChanges" type="button">Revert Unsaved\n                  Changes\n                </button>\n                <button class="btn btn-siteform ui-vertical-center" ng-click="switchTab(\'themes\')"\n                        ng-if="viewState.controlPane !== \'themes\'" type="button">Theme Library\n                </button>\n\n              </div>\n              <div class="customizer__savecontrols" ng-show="!isLoggedIn">\n                <a class="btn btn-siteform ui-vertical-center" target="_self" ui-sref="siteform.register">\n                  Sign up to get your own calendar\n                </a>&nbsp;<a class="btn btn-default ui-vertical-center" ng-href="{{loginLink}}">Sign in</a>\n\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n\n    </div>\n  </div>\n</div>\n'},9131(e){e.exports='<div class="tkf-body container-fluid tkf-popup message-popup">\n  <div class="popup-content {{popup.kind}}" ng-click="$event.stopPropagation()">\n    <h3>{{popup.tparams.title}}</h3>\n\n    <div class="popup-body">\n      <div class="popup-body-content l-centered" ng-bind-html="popup.tparams.main"></div>\n      <div class="popup-buttons">\n        <button class="l-safety" ng-click="popup.closeIfCloseable()" type="button">{{popup.tparams.cancelLabel ||\n        \'Cancel\'}}\n        </button>\n        <button class="l-danger" ng-click="popup.tparams.action()" type="button">{{popup.tparams.actionLabel}}</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n\n\n\n'},6875(e){e.exports='<div class="tkf-body tkf-popup big-popup">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Custom themes and free accounts</h3>\n\n    <form class="popup-body" name="fThemeNotice" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>Custom themes are not available with your free account</h4>\n        <p style="font-size: 1.1em">\n          Our theme customizer tool is still available to try with your calendar and the result can be saved,\n          but it will only be applied to your public calendar if you decide to upgrade.\n        </p>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="popup.closeIfCloseable()" type="button">Close</button>\n        <button ng-if="!popup.tparams.isDudaUser" class="btn btn-siteform" type="button" ui-sref="siteform.paidPlanPicker">Subscription Options</button>\n        <button ng-if="popup.tparams.isDudaUser" class="btn btn-siteform" type="button" ui-sref="settings.subscriptions">Upgrade</button>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n'},4118(e){e.exports='<div class="tkf-body tkf-popup big-popup">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Choose a theme name</h3>\n\n    <form class="popup-body" novalidate role="form">\n\n      <div class="form-group">\n        <label class="control-label">Pick a name for this custom theme</label>\n        <input class="form-control" ng-model="popup.tparams.model.name" placeholder="Enter name to save this theme as"\n               type="text">\n      </div>\n\n      <div class="form-group">\n        <label class="control-label">Save only&nbsp;</label>\n        <input ng-model="popup.tparams.model.saveOnly" type="checkbox">&nbsp;<span>(save but don\'t use theme with current calendar)</span>\n      </div>\n\n\n      <div class="popup-buttons">\n        <button class="btn btn-siteform" ng-click="popup.tparams.save()"\n                ng-disabled="popup.tparams.model.name.trim() === \'\'"\n                type="button">Save\n        </button>\n        <button class="btn btn-default" ng-click="popup.tparams.cancel()" type="button">Cancel</button>\n      </div>\n\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},3640(e){e.exports='<div class="tkf-body container-fluid tkf-popup message-popup">\n  <div class="popup-content newerror" ng-click="$event.stopPropagation()">\n    <h3>There are unsaved changes</h3>\n\n    <div class="popup-body">\n      <div class="popup-body-content l-centered">\n        <p>Please save or cancel your changes before leaving the customizer</p>\n      </div>\n      <div class="popup-buttons">\n        <button class="l-safety" ng-click="popup.closeIfCloseable()" type="button">Stay here</button>\n        <button class="l-danger" ng-click="popup.tparams.action()" type="button">Cancel unsaved changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n'},3722(e){e.exports='<div class="tkf-body tkf-popup card-popup" ng-controller="SnippetMakerCtrl">\n  \x3c!-- No `.close-bar` here: the X lives inside the card (`.popup-close`, popup.scss). --\x3e\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n\n    <button type="button" class="popup-close" aria-label="close add to your site"\n            ng-click="popup.closeIfCloseable($event)"><i class="flaticon-close-1"></i></button>\n\n    <div class="tk-embedcode-popup" ng-if="!args.isDudaUser">\n\n      <div class="tk-embedcode__header">\n        <div class="tk-embedcode__eyebrow">
2Add to your site</div>\n        <h2 class="tk-embedcode__title">Calendar <span class="tk-embedcode__calname">{{args.calname}}</span></h2>\n      </div>\n\n      <div class="tk-embedcode__tabs">\n        <button type="button" aria-label="Embed code" ng-click="selectTarget(\'embed\')"\n                aria-pressed="{{viewState.target === \'embed\'}}"\n                class="tk-embedcode__tab l-embed" ng-class="{\'l-active\': viewState.target === \'embed\'}">\n          <span class="tk-embedcode__tab__glyph">&lt;/&gt;</span>\n          <span class="tk-embedcode__tab__label">Embed code</span>\n        </button>\n        <button type="button" aria-label="WordPress" ng-click="selectTarget(\'wordpress\')"\n                aria-pressed="{{viewState.target === \'wordpress\'}}"\n                class="tk-embedcode__tab l-wordpress" ng-class="{\'l-active\': viewState.target === \'wordpress\'}">\n          <img alt="WordPress" ng-src="{{wordpressLogo}}"/>\n        </button>\n        <button type="button" aria-label="Wix" ng-click="selectTarget(\'wix\')"\n                aria-pressed="{{viewState.target === \'wix\'}}"\n                class="tk-embedcode__tab l-wix" ng-class="{\'l-active\': viewState.target === \'wix\'}">\n          <img alt="Wix" ng-src="{{wixLogo}}"/>\n        </button>\n        <button type="button" aria-label="Squarespace" ng-click="selectTarget(\'squarespace\')"\n                aria-pressed="{{viewState.target === \'squarespace\'}}"\n                class="tk-embedcode__tab l-squarespace" ng-class="{\'l-active\': viewState.target === \'squarespace\'}">\n          <img alt="Squarespace" ng-src="{{squarespaceLogo}}"/>\n        </button>\n      </div>\n\n      <div class="tk-embedcode__body">\n\n        \x3c!-- The lede introduces the tab as a whole, so it sits above the Full/Mini\n             switch rather than under the snippet. The text is per tab and lives in\n             the controller\'s LEDES map, as react\'s does. --\x3e\n        <p class="tk-embedcode__lede">{{lede()}}</p>\n\n        <div class="tk-embedcode__variant">\n          <div class="tk-embedcode__segments">\n            <button type="button" ng-click="selectComponent(\'calendar\')"\n                    aria-pressed="{{args.component === \'calendar\'}}"\n                    class="tk-embedcode__segment" ng-class="{\'l-active\': args.component === \'calendar\'}">Full calendar\n            </button>\n            <button type="button" ng-click="selectComponent(\'mini\')"\n                    aria-pressed="{{args.component === \'mini\'}}"\n                    class="tk-embedcode__segment" ng-class="{\'l-active\': args.component === \'mini\'}">Mini calendar\n            </button>\n          </div>\n          \x3c!-- kept on one line: a literal newline inside an Angular expression\'s\n               string literal survives into the rendered text --\x3e\n          <div class="tk-embedcode__sizenote">{{sizeNote()}}</div>\n        </div>\n\n        \x3c!-- WordPress leads with the plugin steps; every other tab leads with the code --\x3e\n        <div ng-if="viewState.target === \'wordpress\'">\n          <div class="tk-embedcode__intro">\n            <div class="tk-embedcode__intro__tick" aria-hidden="true">&#10003;</div>\n            <div>Our free plugin adds a Tockify block, widget and shortcode - no HTML editing needed.</div>\n          </div>\n          \x3c!-- written out rather than ng-repeated over a string array so the\n               emphasis matches react\'s WORDPRESS_STEPS --\x3e\n          <ol class="tk-embedcode__steps">\n            <li>\n              <div class="tk-embedcode__steps__n" aria-hidden="true">1</div>\n              <div>In your WordPress dashboard go to <b>Plugins &rarr; Add New</b>, search for <b>Tockify</b>, then\n                install and activate the plugin published <b>By Tockify</b>.\n              </div>\n            </li>\n            <li>\n              <div class="tk-embedcode__steps__n" aria-hidden="true">2</div>\n              <div>Edit the page or post where the calendar should appear.</div>\n            </li>\n            <li>\n              <div class="tk-embedcode__steps__n" aria-hidden="true">3</div>\n              <div>Add a <b>Tockify</b> block - or paste the shortcode below into any Shortcode block or widget\n                - then update the page.\n              </div>\n            </li>\n          </ol>\n        </div>\n\n        <div class="tk-embedcode__code">\n          <div class="tk-embedcode__code__bar">
2\n            <span class="tk-embedcode__code__kind">{{codeKind()}}</span>\n            <button type="button" class="tk-embedcode__code__copy" ng-class="{\'l-copied\': viewState.copied}"\n                    ng-click="copy()">{{copyLabel()}}\n            </button>\n          </div>\n          <div class="tk-embedcode__snippet"><pre><code prism-code="code()"\n                                                          prism-language="prismLanguage()"></code></pre></div>\n        </div>\n\n        <div ng-if="viewState.target === \'embed\'">\n          <a class="tk-embedcode__guide" target="_blank" rel="noopener" ui-sref="docs.inter.install">Install guides\n            for other platforms <span aria-hidden="true">&#8599;</span></a>\n        </div>\n\n        <div ng-if="viewState.target === \'wordpress\'">\n          <a class="tk-embedcode__guide" target="_blank" rel="noopener" ui-sref="docs.inter.install.wordpress">Full\n            details in the Wordpress guide <span aria-hidden="true">&#8599;</span></a>\n        </div>\n\n        <div class="tk-embedcode__card" ng-if="viewState.target === \'wix\'">\n          <div class="tk-embedcode__card__title">Wix adds the calendar with a Custom Element.</div>\n          <p>Drag a <b>Custom Element</b> onto your page, set its <b>Server URL</b> to the address above and its\n            <b>Tag Name</b> to <code>tockify-element</code>. Then add two attributes:\n            <code>calendar</code> = <code>{{args.calname}}</code> and <code>component</code> =\n            <code>{{args.component}}</code>. Custom Elements need a premium Wix plan on a site with its own domain\n            - on other plans use an <b>HTML iframe embed</b> with the generic embed code instead.</p>\n          <a class="tk-embedcode__guide" target="_blank" rel="noopener" ui-sref="docs.inter.install.wix">Full details\n            in the Wix guide <span aria-hidden="true">&#8599;</span></a>\n        </div>\n\n        <div class="tk-embedcode__card" ng-if="viewState.target === \'squarespace\'">\n          <div class="tk-embedcode__card__title">Squarespace adds the calendar through a Code block.</div>\n          <p>Copy the embed code above, add a <b>&lt;/&gt; Code</b> block where you want the calendar, set its mode to\n            <b>HTML</b> and paste the code in. Our guide covers the details, including which Squarespace plans support\n            Code blocks.</p>\n          <a class="tk-embedcode__guide" target="_blank" rel="noopener" ui-sref="docs.inter.install.squarespace">Full\n            details in the Squarespace guide <span aria-hidden="true">&#8599;</span></a>\n        </div>\n\n        \x3c!-- No notes on the WordPress tab: its numbered steps and its lede say what\n             the notes did, and the guide link carries the rest. --\x3e\n        <div class="tk-embedcode__notes" ng-if="viewState.target !== \'wordpress\'">\n          <button type="button" class="tk-embedcode__notes__toggle" ng-click="toggleNotes()"\n                  aria-expanded="{{viewState.notesOpen}}">\n            <span class="tk-embedcode__notes__chevron" ng-class="{\'l-open\': viewState.notesOpen}"\n                  aria-hidden="true">&#8250;</span> Extra notes\n          </button>\n          \x3c!-- Per tab. One fixed list written for the generic embed code left the Wix\n               tab describing a div/script pair rather than the Custom Element it\n               installs. Squarespace does paste the generic embed code, so it shares\n               the embed list. Kept in step with react\'s NOTES table. --\x3e\n          <ul ng-if="viewState.notesOpen && (viewState.target === \'embed\' || viewState.target === \'squarespace\')">\n            <li>The embed is a <code>&lt;div&gt;</code> plus a <code>&lt;script&gt;</code>. The\n              <code>&lt;div&gt;</code> marks the spot; the script can live in the head section instead if you prefer.\n            </li>\n            <li>The embed script is updated over time to fix problems and add enhancements, so load it from us each\n              time rather than concatenating or minifying it with your own JavaScript.\n            </li>\n            <li>The calendar fills 100% of the available space. To change that, wrap it in another\n              <code>&lt;div&gt;</code> and use CSS to control its size - there is an example in our\n              <a target="_blank" rel="noopener" ui-sref="docs.inter.faq.technical">Technical Frequently Asked\n                Questions</a>.\n            </li>\n          </ul>\n\n          <ul ng-if="viewState.notesOpen && viewState.target === \'wix\'">\n            <li>The Custom Element loads <code>wixembed.js</code> from us and we update it over time, so leave the\n              Server URL pointing at our copy rather than hosting your own.\n            </li>\n            <li>Tockify will not resize itself in the Wix editor or in preview mode, but it will on your published\n              site - Wix renders the element inside an iframe while you are editing.\n            </li>\n            <li>In a narrow space the calendar switches to the mini calendar by default. You can turn that off in the\n              customizer.\n            </li>\n          </ul>\n        </div>\n      </div>\n\n      <div class="tk-embedcode__footer">
2\n        <span>Works on any website - these are just the quick paths.</span>\n      </div>\n    </div>\n\n    <div class="tk-embedcode-popup" ng-if="args.isDudaUser">\n      <div class="tk-embedcode__header">\n        <div class="tk-embedcode__eyebrow">Add to your site</div>\n        <h2 class="tk-embedcode__title">Adding the calendar to your site</h2>\n      </div>\n      <div class="tk-embedcode__body">\n        <div class="tk-embedcode__duda">\n          <div>\n            <img alt="Duda Widget Icon" class="tk-embedcode__dudaWidget" ng-src="{{dudaWidgetIcon}}"\n                 title="Duda Widget Icon"/>\n            <p>Drag the Tockify Widget (shown on the right of this text) from the <b>+Widgets</b> section of the\n              control panel on the left of your website editor to the place in your site where you\'d like the\n              calendar to be displayed.</p>\n          </div>\n          <div>\n            <p>After you\'ve added the calendar clicking on it in the editor will bring up its control panel.</p>\n            <p>That\'s all there is to it!</p>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n\n</div>\n'},5117(e){e.exports='<div class="customizer__upcoming" ng-click="viewState.calendarMenuOpen = false">\n  <nav class="navbar navbar-default navbar-fixed-top tkf-adminnav" tkf-adminnav>\n    <div class="container-fluid">\n      \x3c!-- Collect the nav links, forms, and other content for toggling --\x3e\n      <div class="collapse navbar-collapse">\n        <ul class="nav navbar-nav navbar-left">\n          <li ng-if="!isDudaEmbed"><a class="l-change" ui-sref="site">Home</a></li>\n          <li class="l-dropifnarrow"><a\n              class="l-change" ng-if="isLoggedIn && isOwnCalendar" target="_self"\n              ui-sref="edit.inter.agenda({calname:calendar.name})">Edit Events</a></li>\n          <li class="l-dropifnarrow"><a class="l-change" ng-if="isLoggedIn"\n                                        ui-sref="settings.calendar.main({id:calendar._id})">Settings</a></li>\n        </ul>\n        <ul class="nav navbar-nav tkf-adminnav__center">\n\n          <li><a class="l-change" ui-sref="customizer.main({calname:calname,  demo:viewState.useDemoCalendar})">Full\n            Calendar</a></li>\n          <li><a class="l-change l-active">Mini Calendar</a></li>\n          \x3c!--<li><label>Switch Calendar</label></li>--\x3e\n        </ul>\n        <ul class="nav navbar-nav navbar-right ">\n          \x3c!--<p class="navbar-text l-navlabel">Design with events from</p>--\x3e\n          <li class="tkf-adminnav__actions">\n            <button class="btn tkf-adminnav__cta" type="button" ng-click="showEmbedCode()">Add to your site</button>\n          </li>\n          <li class="tkf-adminnav__account" ng-class="{dropdown:true, open:viewState.calendarMenuOpen}"\n              ng-if="isLoggedIn && isOwnCalendar && calnames.length > 1">\n            \x3c!--\n            <select class="form-control" ng-options="calname for calname in calnames"\n                    ng-model="calname"></select><span>&nbsp;{{\'Change Calendar\' | translate}}</span>\n                    --\x3e\n            <a class="dropdown-toggle" ng-click="toggleCalendarMenu($event)"\n               role="button">{{calname}}
2<span class="caret"></span></a>\n            <ul class="dropdown-menu">\n              <li ng-repeat="name in calnames"><a\n                  ui-sref="customizer.upcoming({calname:name,  demo:viewState.useDemoCalendar})">{{name}}</a></li>\n            </ul>\n          </li>\n        </ul>\n\n        \x3c!--<form class="navbar-form navbar-right" >--\x3e\n        \x3c!--<button type="submit" class="btn btn-siteform">Add to your site</button>--\x3e\n        \x3c!--<button type="submit" class="btn btn-siteform">Save Theme</button>--\x3e\n        \x3c!--</form>--\x3e\n\n      </div>\x3c!-- /.navbar-collapse --\x3e\n    </div>\n  </nav>\n\n  <div class="customizer" ng-click="viewState.calendarMenuOpen = false" ng-style="{background:viewState.background}">\n    <div class="container-fluid">\n      <div class="row">\n        \x3c!--<div ng-if="isLoggedIn && isOwnCalendar" class="customizer__homelink l-topleft">--\x3e\n        \x3c!--<a  class="l-change" ui-sref="site">Home</a>&nbsp;--\x3e\n        \x3c!--<a  class="l-change" ng-href="{{editorURL}}" target="_self">Editor</a>--\x3e\n        \x3c!--</div>--\x3e\n        <div class="col-md-8">\n          <div class="customizer__calendar">\n            \x3c!-- The demo/your-events switch. Kept in step with react-client\'s\n                 customizers/DemoEventsNotice.tsx and with its twin in mainCustomizer.html. --\x3e\n            <div class="demoEventsNotice" ng-if="canChooseDemoEvents">\n              <div class="demoEventsNotice__card" ng-class="{\'is-own\': !viewState.useDemoCalendar}">\n                <div class="demoEventsNotice__text">\n                  <p class="demoEventsNotice__title" ng-if="viewState.useDemoCalendar">You\'re previewing with demo events</p>\n                  <p class="demoEventsNotice__title" ng-if="!viewState.useDemoCalendar">You\'re previewing with your events</p>\n                  <p class="demoEventsNotice__hint" ng-if="viewState.useDemoCalendar">Sample events that show off every style.</p>\n                  <p class="demoEventsNotice__hint" ng-if="!viewState.useDemoCalendar">The events visitors see on your calendar.</p>\n                </div>\n                <div class="demoEventsNotice__switch" role="radiogroup" aria-label="Events to preview">\n                  <input type="radio" class="demoEventsNotice__input" id="demoEventsNotice-demo" name="demoEventsNotice"\n                         ng-model="viewState.useDemoCalendar" ng-value="true">\n                  <label class="demoEventsNotice__option" for="demoEventsNotice-demo">Demo events</label>\n                  <input type="radio" class="demoEventsNotice__input" id="demoEventsNotice-own" name="demoEventsNotice"\n                         ng-model="viewState.useDemoCalendar" ng-value="false">\n                  <label class="demoEventsNotice__option" for="demoEventsNotice-own">Your events</label>\n                </div>\n              </div>\n            </div>\n\n            <div class="upcoming__embed__wrapper" ng-style="{width: viewState.wrapperWidth}" ng-if="calendar">\n              <div\n                  data-tockify-calendar="{{embedCalName}}"\n                  data-tockify-component="upcoming"\n                  data-tockify-demo="theme"\n                  data-tockify-passcode="{{passcode}}"\n              ></div>\n            </div>\n          </div>\n        </div>\n\n        <div class="col-md-4 customizer__column">\n          <div class="customizer__wrap">\n            <div class="customizer__area customizer__area--bs l-upcoming" ng-if="settings">\n              \x3c!--<div class="customizer__externalClose" ng-click="viewState.showControls = false"><i--\x3e\n              \x3c!--class="flaticon-close-197"></i></div>--\x3e\n              \x3c!--<div class="w-resize"></div>--\x3e\n              <div ng-class="{\'customizer__nav--right\':true, \'l-activeRow\':(viewState.activeRow===1)}">\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'about\')}"\n                        ng-click="switchUpTab(\'about\')"\n                        type="button">About\n                </button>\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'basics\')}"\n                        ng-click="switchUpTab(\'basics\')"\n                        type="button">\n                  Basics\n                </button>\n\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'themes\')}"\n                        ng-click="switchUpTab(\'themes\')"\n                        type="button">\n                  Themes\n                </button>\n              </div>\n              <div ng-class="{\'customizer__nav--right l-row2\':true, \'l-activeRow\':(viewState.activeRow===2)}">\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'styles\')}"\n                        ng-click="switchUpTab(\'styles\')"\n                        type="button">\n                  Shared\n                </button>\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'monthly\')}"\n                        ng-click="switchUpTab(\'monthly\')"\n                        type="button">\n                  Month\n                </button>\n                <button ng-class="{customizer__nav__button:true, \'is-active\':(viewState.controlPane === \'agenda\')}"\n                        ng-click="switchUpTab(\'agenda\')"\n                        type="button">\n                  Agenda\n                </button>\n              </div>\n\n              <div ng-class="{\'customizer__scrollparent\':true, \'with-controls\':true}">
2\n                <div class="customizer__controls">\n                  <div class="customizer__controls__pane l-notice" ng-show="viewState.controlPane === \'about\'">\n                    <p>This Mini Calendar is designed to work well in small spaces.</p>\n                    <p>Use the tabs on this panel to customize it so it looks right for your site.</p>\n                    <p>\n                      When you click on an event (try it) it will launch the Full Calendar as an overlay using the theme\n                      you\'ve\n                      set up for the Full Calendar.\n                    </p>\n                    <p>To customize the theme for the Full Calendar switch to it using the link on the top bar</p>\n                    <p>The Mini Calendar is a <span class="label label-siteform">subscription</span> only feature.</p>\n\n\n                    <p>The mini events calendar is fully responsive, i.e. it will adjust its layout\n                      based on the available width. For convenience while designing you can fix the width below.</p>\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Width while designing\' | translate}}</label>\n                      <div class="customizer__checkboxes">\n                        <label>
2<input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="150px">&nbsp150</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="200px">&nbsp200</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="225px">&nbsp225</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="250px">&nbsp250</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="275px">&nbsp275</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="300px">&nbsp300</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="325px">&nbsp325</label>\n                        <label>
2<input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="350px">&nbsp350</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="375px">&nbsp375</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="400px">&nbsp;400</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="500px">&nbsp;500</label>\n                        <label><input ng-model="viewState.wrapperWidth" type="radio"\n                                      value="600px">&nbsp;600</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Page Background while designing\' |\n                      translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="viewState.background"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n\n                  </div>\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'themes\'">\n\n                    <div class="form-group form-inline customizer__theme__desc l-live" ng-if="isLoggedIn">\n                      <label class="customizer__controls_section">{{\'Live Theme for this calendar\' | translate}}</label>\n                      <div class="l-name">{{ted.activeSummary.name}}</div>&nbsp;<span\n                        class="l-category">{{ted.activeSummary.cstr}}</span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Built in themes\' | translate}}</label>\n                      <span\n                          ng-repeat="t in ted.builtInThemes track by t.id"><button\n                          class="btn btn-default customizer__themeButton"\n                          ng-class="{\'btn-siteform\':t.themeId === ted.currentSummary.themeId}"\n                          ng-click="setTheme(t.id)"\n                          type="button">{{t.name}}</button>&nbsp;</span>\n                    </div>\n\n                    <p>Some pre-defined themes to help you get started.\n                      You can modify them using the tabs on this panel.</p>\n\n                    <div ng-if="isLoggedIn">\n                      <label class="control-label">Your custom themes</label>\n\n                      <div class="customizer__theme__picker">\n                        <ui-select class="l-select"\n                                   ng-model="ted.selected.themeId" title="Pick a theme">\n                          <ui-select-match class="ui-select-match " placeholder="Select a custom theme">\n                            {{$select.selected.name}}\n                          </ui-select-match>\n\n                          <ui-select-choices class="ui-select-choices"\n                                             repeat="theme.themeId as theme in ted.customThemeMenu ">\n                            <div ng-bind-html="theme.name | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <a class="l-remove" ng-click="startDeleteTheme()"\n                           ng-if="!ted.currentIsActiveTheme && ted.selected.themeId"\n                           type="button">\n                          <i class="flaticon-delete"></i>\n                        </a>\n                      </div>\n\n\n                      <a class="l-showVersions"\n                         ng-click="ted.showVersions()"\n                         ng-if="!ted.showVersionPicker && ted.themeVersions[ted.selected.themeId].length > 1">change\n                        default version</a>\n                      <div ng-if="ted.showVersionPicker">\n                        <label class="control-label">Change default version for this theme</label>\n                        <div class="customizer__theme__picker">\n                          <ui-select class="l-select-version"\n                                     ng-model="ted.selected.version" title="Pick a version">\n                            <ui-select-match class="ui-select-match " placeholder="Select a previous version">\n                              {{$select.selected.vstr}}\n                            </ui-select-match>\n                            <ui-select-choices class="ui-select-choices"\n                                               repeat="theme.version as theme in ted.themeVersions[ted.selected.themeId]">\n                              <div ng-bind-html="theme.vstr | highlight: $select.search"></div>\n                              <div ng-bind-html="theme.vtime | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>&nbsp;<a\n                            class="l-showVersions" ng-click="ted.hideVersions()" ng-if="ted.showVersionPicker">hide\n                          versions</a>\n                        </div>\n\n\n                      </div>\n\n                      <p></p>\n                      <div class="form-group form-inline customizer__theme__desc l-current" ng-if="isLoggedIn">
2\n                        <label class="customizer__controls_section">{{\'The theme you are editing is:\' |\n                        translate}}</label>\n                        <div class="l-name">{{ted.currentSummary.name}}</div>&nbsp;<span\n                          class="l-category">{{ted.currentSummary.cstr}}</span><a\n                          href\n                          ng-click="saveTheme(true)">duplicate this theme</a>\n                      </div>\n\n                    </div>\n\n                  </div>\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'basics\'">\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Parts to show\' | translate}}</label>\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.show" type="radio"\n                                      value="month">&nbsp;Month Grid</label>\n                        <label><input ng-model="us.show" type="radio"\n                                      value="agenda">&nbsp;Agenda</label>\n                        <label><input ng-model="us.show" type="radio"\n                                      value="both">&nbsp;Both</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showBorder"\n                                      type="checkbox"> Show border</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showTopHighlightBar"\n                                      type="checkbox"> Show highlight bar at top</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showSubscribe"\n                                      type="checkbox"> Put "Subscribe" link at top</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showSubmit"\n                                      type="checkbox"> Put "Submit Event" button at top</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showFullCalendarLink"\n                                      type="checkbox"> Put "Open Full Calendar" link at bottom</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showMoreEventsLink"\n                                      type="checkbox"> Put "Show More Events" link at bottom</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showClearSearch"\n                                      type="checkbox"> Show "Clear Filter" when the view is filtered</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.openInline"\n                                      type="checkbox"> Show event details inline (no overlay popup)</label>\n                      </div>\n                    </div>\n\n\n                    <div class="form-group">\n\n                      \x3c!-- default start date picker --\x3e\n                      <div class="form-group form-group-sm">\n                        <label> {{\'Default Start Date\' | translate}}</label>\n                        <div ng-if="settings.defaultStartDate">\n                          <input bs-datepicker class="form-control customizer__datepicker"\n                                 data-autoclose="1"\n                                 data-date-format="{{dateFormat}}"\n                                 data-date-type="number"\n                                 data-min-view="0"\n                                 data-placement="top-left"\n                                 data-start-view="0"\n                                 data-start-week="{{wkstart}}"\n                                 data-timezone="UTC"\n                                 data-use-native="false"\n                                 name="date"\n                                 ng-model="proxy.defaultStartDate" size="10" type="text">\n                          <a href="" ng-click="proxy.defaultStartDate = false">use current day</a>\n                        </div>\n\n                        <div ng-if="!settings.defaultStartDate">Using Current Day:\n                          <a href="" ng-click="proxy.defaultStartDate = todayMidnightUTC()">pick a date</a></div>\n\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_section">{{\'Language Choice\' | translate}}</label>\n                      <div>\n                        <label class="radio-inline">\n                          <input name="useClientDateFormat" ng-model="settings.useClientDateFormat"\n                                 ng-value="{{false}}" type="radio">{{\'use the calendar\\\'s default language\' |\n                        translate}}</label>\n\n                      </div>\n                      <div>\n                        <label class="radio-inline">\n                          <input name="useClientDateFormat" ng-model="settings.useClientDateFormat"\n                                 ng-value="{{true}}" type="radio">{{\'use the visitors\\\'s language\' |\n                        translate}}</label>\n\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Show timezone\' | translate}}</label>\n                      <div class="customizer__checkboxes">\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay"\n                                                             ng-model="settings.showTimezone" type="radio"\n                                                             value="never">\n                            never</label>\n                        </div>\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay"\n                                                             ng-model="settings.showTimezone" type="radio"\n                                                             value="always">\n                            always</label>\n                        </div>\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay"\n                                                             ng-model="settings.showTimezone" type="radio"\n                                                             value="different"> when\n                            it differs from the visitor\'s timezone</label>\n                        </div>\n                        <div>\n                          <label class="radio-inline"><input name="timezoneDisplay"\n                                                             ng-model="settings.showTimezone" type="radio"\n                                                             value="visitor"> show\n                            date in the visitor\'s timezone</label>\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label>Date format</label>\n                      <div ng-if="!settings.customDateFormat.longDateFormat">Using default for language:\n                        <a href="" ng-click="settings.customDateFormat.longDateFormat = []">use custom format</a>\n                      </div>\n\n                      <div ng-if="settings.customDateFormat.longDateFormat">\n                        <tags-input ng-model="settings.customDateFormat.longDateFormat"\n                                    add-from-autocomplete-only="true"\n                                    allow-leftover-text="false"\n                                    min-length="1"\n                                    placeholder="add/remove date element"\n                        >\n                          <auto-complete\n                              load-on-empty="true"\n                              load-on-focus="true"\n                              load-on-down-arrow="true"\n                              min-length="0"\n                              source="validDateTags(settings.customDateFormat.longDateFormat)">\n                          </auto-complete>\n                        </tags-input>\n                        <a href="" ng-click="setDefaultDateFormat(\'longDateFormat\')">use default for language</a>\n                      </div>\n                    </div>\n\n                  </div>
2\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'styles\'">\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Background Color\' | translate}}</label>\n\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'" ng-model="us.backgroundColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Active Background Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.activeBackgroundColor"\n                                            ng-model="us.activeBackgroundColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.activeBackgroundColor"><a href=""\n                                                                ng-click="us.activeBackgroundColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.activeBackgroundColor">Using Default:\n                            <a href=""\n                               ng-click="us.activeBackgroundColor = getDefaultActiveBackgroundColor()">set\n                              manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Text Font\' | translate}}</label>\n                      <ui-select class="customizer__fontFamilyPicker"\n                                 ng-model="us.textFont.family">\n                        <ui-select-match class="ui-select-match"><span\n                            style="font-family:\'{{us.textFont.family}}\'">{{us.textFont.family}}</span>\n                        </ui-select-match>\n                        <ui-select-choices class="ui-select-choices"\n                                           repeat="item.family as item in availableFonts | filter: $select.search">\n                          <div ng-bind-html="item.family | highlight: $select.search"\n                               style="font-family:{{item.family}}"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                      <ui-select class="customizer__fontWeightPicker"\n                                 ng-model="us.textFont.weight">\n                        <ui-select-match class="ui-select-match">\n                          {{weightToName[us.textFont.weight]}}\n                        </ui-select-match>\n                        <ui-select-choices class="ui-select-choices"\n                                           repeat="weight in fonts.textFont.weights | filter: $select.search">\n                          <div ng-bind-html="weightToName[weight] | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                      <label class="customizer__fontStylePicker checkbox-inline">\n                        <input ng-false-value="\'normal\'" ng-model="us.textFont.style"\n                               ng-true-value="\'italic\'"\n                               type="checkbox"> {{\'italic\' | translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Text\' | translate}}</label>\n                      <label>{{\'Text Size\' | translate}}</label><select\n                        class="form-control customizer__fontSizePicker"\n                        ng-model="us.fontSize"\n                        ng-options="fontSize for fontSize in baseFontSizes"></select>\n                      &nbsp;<label>{{\'Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'" ng-model="us.textColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}">\n                      </spectrum-colorpicker>\n                    </div>\n\n\n\x3c!--                    <div class="form-group form-group-sm">--\x3e\n\x3c!--                      <label class="customizer__c
2ontrols_section">{{\'Text Color\' | translate}}</label>--\x3e\n\n\x3c!--                      <spectrum-colorpicker class="customizer__spectrum"--\x3e\n\x3c!--                                            format="\'rgb\'" ng-model="us.textColor"--\x3e\n\x3c!--                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>--\x3e\n\x3c!--                    </div>--\x3e\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Highlight Color\' | translate}}</label>\n\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'" ng-model="us.highlightColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Footer Link Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.footerLinkColor"\n                                            ng-model="us.footerLinkColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.footerLinkColor"><a href=""\n                                                          ng-click="us.footerLinkColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.footerLinkColor">Using Default:\n                            <a href=""\n                               ng-click="us.footerLinkColor = us.textColor">set\n                              manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Line Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-if="us.lineColor"\n                                            ng-model="us.lineColor"\n                                            options="{showInput: true, showAlpha: true, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.lineColor"><a href=""\n                                                    ng-click="us.lineColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.lineColor">Using Default:\n                            <a href="" ng-click="us.lineColor = getDefaultLineColor()">set\n                              manually</a></span>\n                    </div>\n\n                  </div>\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'agenda\'">\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'What to show\' | translate}}</label>\n                      <label class="radio">\n                        <input name="upcoming_agenda_listMode" ng-model="us.agenda.listMode"\n                               type="radio" value="all">{{\'all upcoming and ongoing events\' |\n                      translate}}</label>\n\n                      <label class="radio">\n                        <input name="upcoming_agenda_listMode" ng-model="us.agenda.listMode"\n                               type="radio" value="future">{{\'all upcoming events\' |\n                      translate}}</label>\n\n                      <label class="radio">\n                        <input name="upcoming_agenda_listMode" ng-model="us.agenda.listMode"\n                               type="radio" value="startDay">{{"events that start on the selected day" |\n                      translate}}\n                      </label>\n                      <label class="radio">\n                        <input name="upcoming_agenda_listMode" ng-model="us.agenda.listMode"\n                               type="radio" value="singleDay">{{"events that include the selected day" |\n                      translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group">
2\n                      <label class="customizer__controls_section">{{\'Maximum events to show when used on desktop browser\' |\n                      translate}}</label>\n                      <select class="form-control"\n                              ng-model="us.agenda.maxEvents"\n                              ng-options="v as v for v in maxEventsOptions"></select>\n                    </div>\n\n                    <div class="form-group">\n                      <label class="customizer__controls_section">{{\'Maximum events to show when used on mobile device\' |\n                      translate}}</label>\n                      <select class="form-control"\n                              ng-model="us.agenda.maxMobileEvents"\n                              ng-options="v as v for v in maxEventsOptions"></select>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.agenda.randomizeSameDateEvents"\n                                      type="checkbox"> {{\'Randomize order of events with same date & time\' | translate}}\n                        </label>\n                        <div style="margin-top:0" class="customizer__settings__note">If unchecked events with the same\n                          date and time are sorted alphabetically\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.useTagColorsInTitles"\n                                      type="checkbox"> Use tag colors in titles </label>(if using colored tags)\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.showTagBar"\n                                      type="checkbox"> Show tag bar </label>(if using colored tags)\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.agenda.showImages"\n                                      type="checkbox"> Show images (when there\'s enough space)</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Image Position\' | translate}}</label>\n                      <label class="radio-inline">\n                        <input name="upcoming_agenda_imagePosition"\n                               ng-model="us.agenda.imagePosition"\n                               type="radio" value="left">{{\'left\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="upcoming_agenda_imagePosition"\n                               ng-model="us.agenda.imagePosition"\n                               type="radio" value="right">{{\'right\' | translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Image Shape\' | translate}}</label>\n                      <label class="radio-inline">\n                        <input name="upcoming_agenda_imageShape" ng-model="us.agenda.imageShape"\n                               type="radio" value="square">{{\'square\' | translate}}</label>\n\n                      <label class="radio-inline">\n                        <input name="upcoming_agenda_imageShape" ng-model="us.agenda.imageShape"\n                               type="radio" value="circle">{{\'circle\' | translate}}\n                      </label>\n                      <label class="radio-inline">\n                        <input name="upcoming_agenda_imageShape" ng-model="us.agenda.imageShape"\n                               type="radio" value="rectangle">{{\'rectangle\' | translate}}\n                      </label>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.agenda.showPreview"\n                                      type="checkbox"> Show preview (when there\'s enough space)</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                      <label><input ng-model="us.agenda.showPlace"\n                                    type="checkbox"> {{\'Show Place/Room Name\' | translate}}\n                      </label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.agenda.showAddress"\n                                      type="checkbox"> Show address (when there\'s enough space)</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm" ng-if="hasHideDateFeature || us.agenda.hideDate">\n                      <div class="customizer__checkboxes">\n                      <label><input ng-model="us.agenda.hideDate"\n                                    type="checkbox"> {{\'Hide Date\' | translate}}\n                      </label>\n                      </div>\n                      <div ng-if="us.agenda.hideDate"><span class="label label-danger">Warning</span>\n                        hiding the date means nobody will be able to see when your events are! Don\'t do this unless\n                        you\'re very sure that\'s what you want.\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.agenda.showNoEvents"\n                                      type="checkbox"> Show "No Events Found" when there are no events to show</label>\n                      </div>\n                    </div>
2\n                    <label class="customizer__controls_section">{{\'Status Label Colors\' | translate}}</label>\n\n                    <div class="form-group form-group-sm">\n                      <label>{{\'cancelled\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.cancelled"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'movedOnline\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.movedOnline"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label>{{\'postponed\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.postponed"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'rescheduled\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.rescheduled"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label>{{\'notice\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.notice"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <label>{{\'busy\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.busy"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <label>{{\'provisional\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum" format="\'rgb\'"\n                                            ng-model="us.statusBackground.provisional"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      </div>\n\n                  </div>\n\n                  <div class="customizer__controls__pane" ng-show="viewState.controlPane === \'monthly\'">\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.monthly.useInset"\n                                      type="checkbox"> Use inset (when there\'s enough space)</label>\n                      </div>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.monthly.fadeOutOfMonth"\n                                      type="checkbox"> Fade days in other months</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.monthly.fadeWeekend"\n                                      type="checkbox"> Fade weekend days</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.monthly.showGrid"\n                                      type="checkbox"> Show grid lines</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm">\n                      <div class="customizer__checkboxes">\n                        <label><input ng-model="us.monthly.useFirstTagColor"\n                                      type="checkbox"> Color based on first tag of first event on the day</label>\n                      </div>\n                    </div>\n                    <div class="form-group form-group-sm">
2\n                      <label class="customizer__controls_section">{{\'Highlight For Days With Events\' |\n                      translate}}</label>\n                      <div>\n                        <label class="radio-inline">\n                          <input name="eventsIndicatorStyle"\n                                 ng-model="us.monthly.eventsIndicatorStyle"\n                                 type="radio" value="underline">{{\'Underline\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="eventsIndicatorStyle"\n                                 ng-model="us.monthly.eventsIndicatorStyle"\n                                 type="radio" value="outline">{{\'Outline\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="eventsIndicatorStyle"\n                                 ng-model="us.monthly.eventsIndicatorStyle"\n                                 type="radio" value="color">{{\'Color\' | translate}}\n                        </label>\n                      </div>\n                      <div>\n                        <label class="radio-inline">\n                          <input name="eventsIndicatorStyle"\n                                 ng-model="us.monthly.eventsIndicatorStyle"\n                                 type="radio" value="brTriangle">{{\'Triangle\' | translate}}\n                        </label>\n                        <label class="radio-inline">\n                          <input name="eventsIndicatorStyle"\n                                 ng-model="us.monthly.eventsIndicatorStyle"\n                                 type="radio" value="block">{{\'Block\' | translate}}\n                        </label>\n                      </div>\n                      <p class="customizer__info">When the calendar is very small we fall back to just coloring the day\n                        numbers</p>\n                    </div>\n\n\n                    <div class="form-group form-group-sm"\n                         ng-show="us.monthly.eventsIndicatorStyle !== \'block\'">\n                      <label class="customizer__controls_section">{{\'Today Background Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.monthly.todayBackgroundColor"\n                                            ng-model="us.monthly.todayBackgroundColor"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.monthly.todayBackgroundColor"><a href=""\n                                                                       ng-click="us.monthly.todayBackgroundColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.monthly.todayBackgroundColor">Using Default:\n                            <a href=""\n                               ng-click="us.monthly.todayBackgroundColor = us.highlightColor">set\n                              manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Today Text Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.monthly.todayTextColor"\n                                            ng-model="us.monthly.todayTextColor"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.monthly.todayTextColor"><a href=""\n                                                                 ng-click="us.monthly.todayTextColor = false">\n                          use\n                          default</a></span>
2\n                      <span ng-if="!us.monthly.todayTextColor">Using Default:\n                            <a href=""\n                               ng-click="us.monthly.todayTextColor = getDefaultTodayTextColor()">set\n                              manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Header Background Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.monthly.headerBGColor"\n                                            ng-model="us.monthly.headerBGColor"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.monthly.headerBGColor"><a href=""\n                                                                ng-click="us.monthly.headerBGColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.monthly.headerBGColor">Using Default:\n                            <a href=""\n                               ng-click="us.monthly.headerBGColor = getDefaultTodayTextColor()">set\n                              manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Header Date Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.monthly.headerDateColor"\n                                            ng-model="us.monthly.headerDateColor"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.monthly.headerDateColor"><a href=""\n                                                                  ng-click="us.monthly.headerDateColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.monthly.headerDateColor">Using Default:\n                            <a href=""\n                               ng-click="us.monthly.headerDateColor = us.textColor">set\n                              manually</a></span>\n                    </div>\n\n                    <div class="form-group form-group-sm">\n                      <label class="customizer__controls_section">{{\'Header Link Color\' | translate}}</label>\n                      <spectrum-colorpicker class="customizer__spectrum"\n                                            format="\'rgb\'"\n                                            ng-if="us.monthly.headerLinkColor"\n                                            ng-model="us.monthly.headerLinkColor"\n                                            options="{showInput: true, showAlpha: false, appendTo:\'.customizer__area\'}"></spectrum-colorpicker>\n                      <span ng-if="us.monthly.headerLinkColor"><a href=""\n                                                                  ng-click="us.monthly.headerLinkColor = false">\n                          use\n                          default</a></span>\n                      <span ng-if="!us.monthly.headerLinkColor">Using Default:\n                            <a href=""\n                               ng-click="us.monthly.headerLinkColor = us.highlightColor">set\n                              manually</a></span>\n                    </div>\n\n                  </div>\n                </div>\n              </div>\n\n              <div class="customizer__savecontrols" ng-show="isLoggedIn && isOwnCalendar">\n                <button class="btn ui-vertical-center  btn-siteform--green" ng-click="saveTheme(
2)"\n                        ng-disabled="!ted.hasChanges"\n                        ng-if="ted.currentIsActive || ted.hasChanges"\n                        type="button">Save Theme\n                </button>\n                <button\n                    class="btn ui-vertical-center btn-siteform--orange"\n                    ng-click="useTheme()"\n                    ng-if="ted.showUseTheme"\n                    type="button">Use This Theme\n                </button>\n                <button class="btn btn-default ui-vertical-center"\n                        ng-click="revertTheme()" ng-if="viewState.controlPane === \'themes\' && ted.hasChanges"\n                        type="button">Revert Unsaved Changes\n                </button>\n                <button class="btn btn-siteform ui-vertical-center"\n                        ng-click="switchUpTab(\'themes\')" ng-if="viewState.controlPane !== \'themes\'"\n                        type="button">Theme Library\n                </button>\n\n              </div>\n              <div class="customizer__savecontrols" ng-show="!isLoggedIn">\n                <a class="btn btn-siteform ui-vertical-center" target="_self" ui-sref="siteform.register">\n                  Sign up to get your own calendar\n                </a>&nbsp;<a class="btn btn-default ui-vertical-center" ng-href="{{loginLink}}">Sign in</a>\n              </div>\n            </div>\n          </div>\n        </div>\n\n      </div>\n\n    </div>\n  </div>\n</div>\n'},4781(e){e.exports='<div class="addressPicker">\n\n  <div class="form-group editor__savedPlaces">\n    <label ng-if="eventLocNames">Saved Locations</label>\n    <div>\n      <div class="form-group editor__savedPlaces__picker" ng-if="eventLocNames && eventLocs.length > 10">\n        <input class="form-control"\n               bs-typeahead\n               bs-on-select="locSelect"\n               bs-options="loc.name as loc.name for loc in matchLocs"\n               data-comparator="isTypeaheadMatch"\n               data-delay="300"\n               data-min-length="1"\n               data-trim-value="false"\n               data-watch-options="true"\n               ng-model="loc.search"\n               ng-model-options="{debounce: 300}"\n               ng-trim="false"\n               placeholder="Search Saved Locations" type="text">\n      </div>\n      <div>\n        <label ng-if="eventLocNames && eventLocs.length > 10">Recent Locations</label>\n      </div>\n      <div class="editor__savedPlaces__picker" ng-if="eventLocNames" ng-model="loc.selected"\n           on-open="showClickPane"\n           select-model="eventLocNames" select-only="true" tkf-select>\n      </div>\n      <a class="editor__link"\n         ng-click="addNewLocation()"\n         ng-if="!loc.isEditing && loc.current.name">&nbsp;+Save current location</a>\n      <span ng-if="loc.isEditing">\n                <button button-spinner="loc.isSaving"\n                        class="btn  btn-siteform--green"\n                        ng-click="saveLocation()" ng-disabled="!loc.current.name"\n                        ng-if="loc.current.name && !loc.isSaved && loc.isDirty"\n                >Save Location</button>\n                <button button-spinner="loc.isSaving"\n                        class="btn btn-default" disabled\n                        ng-if="loc.isSaved && !loc.isDirty">Saved</button>\n                <button button-spinner="loc.isSaving" class="btn btn-siteform--green"\n                        ng-click="saveLocation()" ng-disabled="!loc.current.name"\n                        ng-if="loc.isSaved && loc.isDirty">Update Saved Location</button>\n                <a class="editor__link" ng-click="forgetLocation()"\n                   ng-if="loc.isSaved">Forget this location</a>\n              </span>\n    </div>\n    <div ng-if="loc.isEditing">\n      <label ng-if="loc.canEditName">Saved Location Name</label>\n      <label class="editor__savedPlaces__locLabel" ng-if="!loc.canEditName">{{loc.current.name}}</label>\n      <a class="editor__link" ng-click="loc.canEditName=true"\n         ng-if="!loc.canEditName">&nbsp;Edit location name</a>\n\n      <div>\n        <input class="form-control editor__savedPlaces__locName" ng-if="loc.canEditName"\n               ng-keydown="stopTrackingLocName()" ng-model="loc.current.name"\n               placeholder="saved location name"\n               type="text">\n      </div>\n    </div>\n  </div>\n\n  <div class="addressPicker__new">\n\n    <div class="addressPicker__input">\n\n\n      <div class="form-group">\n        <label>Venue name/Room/Building (or other extra info)</label>\n        <input class="form-control" data-min-length="1" ng-model="where.place" ng-trim="false"\n               placeholder="Venue information"\n               type="text">\n      </div>\n\n      <div class="form-group">\n        <label>Street Address</label>\n        <input bs-on-select="onSelect"\n               bs-options="prediction.description as prediction.description for prediction in addressPredictions"\n               bs-typeahead class="form-control"\n               data-comparator="isTypeaheadMatch"\n               data-delay="300"\n               data-min-length="14"\n               data-template-url="app/directives/addressPicker/typeahead-template.html"\n               data-trim-value="false"\n               data-watch-options="true"\n               ng-model="where.address"\
2n               ng-model-options="{debounce: 300}"\n               ng-trim="false"\n               placeholder="Enter address" type="text">\n      </div>\n\n      <div class="addressPicker__map">\n        <div class="addressPicker__map__inner">\n          <div class="addressPicker__map__empty" ng-if=\'!showMap\'>\n            <div class="l-emptyText">Map Preview</div>\n          </div>\n          <div ng-if="showMap && isNarrow">\n            <iframe frameborder="0" ng-src="{{map.place_url | trusted}}"></iframe>\n          </div>\n        </div>\n      </div>\n\n      <div class="form-group l-noBottomMargin">\n        <label>Directions</label>\n        <textarea class="form-control addressPicker__directions" data-min-length="1" ng-model="where.directions"\n                  placeholder="Directions to help people find you"\n                  type="text"> </textarea>\n      </div>\n\n    </div>\n\n    <div class="addressPicker__map--side">\n      <div class="addressPicker__map--side__inner">\n        <div class="angular-google-map">\n          <div class="addressPicker__map__empty" ng-if=\'!showMap\'>\n            <div class="l-emptyText">Map Preview</div>\n          </div>\n          \x3c!--<ui-gmap-google-map ng-if=\'showMap\' options="map.options" center="map.center" zoom="map.zoom">--\x3e\n          \x3c!--<ui-gmap-marker idKey="idKey" coords="map.center"></ui-gmap-marker>--\x3e\n          \x3c!--</ui-gmap-google-map>--\x3e\n          <div ng-if="showMap && isWide">\n            <iframe frameborder="0" ng-src="{{map.place_url | trusted}}"></iframe>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</div>\n\n'},949(e){e.exports='<ul aria-hidden="true" class="typeahead dropdown-menu" ng-show="$isVisible()" role="select" tabindex="-1">\n  <li ng-class="{active: $index == $activeIndex}" ng-repeat="match in $matches" role="presentation">\n    <a ng-bind="match.label" ng-click="$select($index,$event)" ng-if="match.label" role="menuitem" tabindex="-1"></a>\n  </li>\n  <li class="addressPicker__searchScope" ng-class="{active: $index == $activeIndex}"><span\n      ng-click="search.global=false"><input ng-model="search.global"\n                                            ng-value="{{false}}" type="radio">Search Locally</span>&nbsp;&nbsp;&nbsp;&nbsp;<span\n      ng-click="search.global=true"><input ng-model="search.global"\n                                           ng-value="{{true}}" type="radio">Search Whole World</span>\n  </li>\n</ul>\n'},6363(e){e.exports='<div class="tkf__custom-html-box">\n  <legend>HTML / Embed Code</legend>\n\n  <div class="form-group">\n    <textarea class="form-control" data-min-length="1" ng-model="viewState.code" ng-model-options="{debounce: 200}"\n              placeholder="Add your embed code here"\n              rows="12"></textarea>\n  </div>\n  <div class="form-group">\n    <label>Embed Width&nbsp;&nbsp;<input\n        class="form-control tkf__custom-html-box__width" ng-model="viewState.manualWidth" only-digits\n        placeholder="width" type="text">&nbsp;&nbsp;<div class="btn-group">\n      <button class="btn btn-xs btn-default"\n              ng-class="{\'btn-default\':(viewState.units !==\'px\'),\n                   \'btn-siteform\':(viewState.units===\'px\')}"\n              ng-click="viewState.units = \'px\'">pixels\n      </button>\n      <button class="btn btn-xs btn-default"\n              ng-class="{\'btn-default\':(viewState.units !== \'%\'),\n                   \'btn-siteform\':(viewState.units===\'%\')}"\n              ng-click="viewState.units = \'%\';
2viewState.width = Math.max(viewState.width,100)">percentage\n      </button>\n    </div>\n    </label>\n  </div>\n\n  <div class="tkf__custom-html__buttons">\n    <button class="btn btn-large btn-siteform" ng-click="selectEmbed($event)">Use This Code</button>\n  </div>\n\n\n</div>\n'},4495(e){e.exports='<div class="eventGroupEditor" ng-show="egs" xmlns="http://www.w3.org/1999/html">\n  <div class="eventGroupEditor__main">\n    <form name="fEditEGS" novalidate role="form">\n      <div ng-init="forms.fEditEGS = fEditEGS"></div>\n      <div ng-init="forms.fEditEGS = fEditEGS"></div>\n      <div class="eventGroupEditor__formTop">\n\n        <div class="eventGroupEditor__basics-column">\n          <div class="editor__section">\n\n            <div class="l-textpart">\n              <div class="editor__top-notice" ng-if="hasExternalSource">This event is managed outside of Tockify so some\n                fields can\'t be changed here.\n              </div>\n              <div class="editor__sectionHeader">\n                <div class="l-title">Event Title</div>\n              </div>\n\n              <div\n                  ng-class="{\'form-group editor__titleField has-feedback l-clear\':true, \'has-error\':fEditEGS.title.$invalid && fEditEGS.title.$dirty}">\n\n                <input class="form-control" id="uTitle" name="title" ng-disabled="hasExternalSource"\n                       ng-model="egs.title"\n                       placeholder="event title" required server-error type="text">\n                <span class="help-block"\n                      ng-show="fEditEGS.title.$dirty && fEditEGS.title.$error.required">Please provide a title</span>\n                \x3c!-- use server error directive here to clear on edit --\x3e\n                <span class="help-block"\n                      ng-show="fEditEGS.title.$pristine && fEditEGS.title.$error.serverError">{{serverErrors.title}}</span>\n              </div>\n\n              <div class="eventGroupEditor__customButtons" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <div class="l-nosubscription">&#65291;RSVP</div>\n                <div class="l-nosubscription">&#65291;Promotion Button</div>\n                <div class="l-nosubscription">&#65291;Attachment</div>\n                <div class="l-nosubscription">&#65291;Priority</div>\n                <div class="l-nosubscription">&#65291;Status</div>\n                <div class="eventGroupEditor__subscription__warning">\n                  <span><span class="glyphicon glyphicon-lock"></span> subscription only</span>\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__customButtons" ng-if="calendar.effectiveFeatureLevel > 0">\n                \x3c!--<div class="button-shadow">Add Promotion Button</div>&nbsp;--\x3e\n\n\n                <div class="l-addButton" ng-if="!egs.rsvpLink"><a class="editor__link"\n                                                                  ng-click="manageRSVP()">&#65291;RSVP</a></div>\n                <div class="editor__customButton l-b l-manage-rsvp" ng-click="manageRSVP()" ng-if="egs.rsvpLink">Manage\n                  RSVP\n                </div>\n                <div class="l-addButton"\n                     ng-if="!egs.customButton.url.trim().length > 0 || !egs.customButton.label.trim().length>0"><a\n                    class="editor__link"\n                    ng-click="viewState.showButtonEditor = \'promotion\'">&#65291;Promotion\n                  Button</a></div>\n                <div class="editor__customButton"\n                     ng-if="egs.customButton.url.trim().length > 0 && egs.customButton.label.trim().length>0">\n                  <a class="l-pbe"\n                     ng-click="viewState.showButtonEditor=\'promotion\'">{{egs.customButton.label}}&nbsp;&nbsp; <i\n                      class="flaticon-draw"></i></a></div>\n                <div class="l-addButton" ng-if="egs.attachments.length === 0"><a class="editor__link"\n                                                                                 ng-click="addAttachment($event)">&#65291;Attachment</a>\n                </div>\n                <div class="editor__customButton"\n                     ng-if="egs.attachments && egs.attachments.length !== 0"><a class="l-cb"\n                                                                                ng-click="addAttachment($event)">{{egs.attachments.length\n                |\n                formatAttachmentCount}}&nbsp;&nbsp;<i class="flaticon-draw"></i></a></div>\n                <div class="l-addButton"><a class="editor__link"\n                                            ng-click="viewState.showButtonEditor = \'priority\'">&#65291;Priority&nbsp;({{egs.absPriority\n                + (egs.pinned ? \'📌\' : \'\') }})</a></div>\n                <div class="l-addButton"><a class="editor__link"\n                                            ng-click="viewState.showButtonEditor = \'status\'">&#65291;
2Status\n                  <span class="l-status l-status-{{egs.status.name}}">{{statusLabel}}</span></a>\n                </div>\n                <div class="l-addButton"\n                     ng-if="!egs.organizer.name.trim().length > 0"><a\n                    class="editor__link"\n                    ng-click="viewState.showButtonEditor = \'organizer\'">&#65291;Organizer</a></div>\n                <div class="editor__customButton"\n                     ng-if="egs.organizer.name.trim().length > 0">\n                  <a class="l-pbe"\n                     ng-click="viewState.showButtonEditor=\'organizer\'">{{egs.organizer.name}}&nbsp;&nbsp; <i class="flaticon-draw"></i></a></div>\n                <div class="l-addButton"\n                     ng-if="(egs.performers | namedItems).length === 0"><a\n                    class="editor__link"\n                    ng-click="viewState.showButtonEditor=\'performer\'; (egs.performers && egs.performers.length) || (egs.performers = [{ kind: \'Person\' }])">&#65291;Performer</a></div>\n                <div class="editor__customButton"\n                     ng-if="(egs.performers | namedItems).length">\n                  <a class="l-pbe"\n                     ng-click="viewState.showButtonEditor=\'performer\'">{{(egs.performers | namedItems).length}} Performer<span ng-if="(egs.performers | namedItems).length > 1">s</span>&nbsp;&nbsp; <i class="flaticon-draw"></i></a></div>\n              </div>\n\n              \x3c!--<div ng-if="!viewState.showPromotionButtonEditor && egs.customButton.noDetail"--\x3e\n              \x3c!--class="rrule__repeat-picker eventGroupEditor__promotionButtonForm">--\x3e\n\n              \x3c!--<div class="form-group">--\x3e\n              \x3c!--<label class="radio-inline editor__customButton__noDetailCheckbox">--\x3e\n              \x3c!--<input type="checkbox" ng-model="egs.customButton.noDetail" name="customButtonNoDetails"--\x3e\n              \x3c!--id="uCustomButtonNoDetailsSmall"> Skip details page completely--\x3e\n              \x3c!--</label>--\x3e\n              \x3c!--<span ng-if="!egs.customButton.noDetail" class="help-block"--\x3e\n              \x3c!--&gt;Warning: If this option is enabled the details page for your event will not be shown--\x3e\n              \x3c!--at all. Instead the pinboard, agenda, etc. will go link directly to the promoted link</span>--\x3e\n\n              \x3c!--<span ng-if="egs.customButton.noDetail" class="help-block editor__customButton__warning"--\x3e\n              \x3c!--&gt;<b>Warning:</b> This event is configured to link directly from the pinboard, agenda, etc. to the promoted link.--\x3e\n              \x3c!--The details page will never be shown. Uncheck this option to return to the normal behaviour.--\x3e\n              \x3c!--</span>--\x3e\n              \x3c!--</div>--\x3e\n\n\n              \x3c!--</div>--\x3e\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'promotion\'">\n                <h4>Add or edit a Promotion Button</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div\n                    ng-class="{\'form-group has-feedback l-label\':true, \'has-error\':fEditEGS.customButtonText.$invalid}">\n                  <label>Button Text</label>\n                  <input class="form-control" id="uCustomButtonText" name="customButtonText"\n                         ng-model="egs.customButton.label"\n                         placeholder="button text" type="text">\n                  <span class="help-block"\n                        ng-show="fEditEGS.customButtonText.$dirty && fEditEGS.customButtonText.$error.required">Please provide some button text</span>\n                </div>\n\n                <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fEditEGS.customButtonLink.$invalid}">\n                  <label>Button Link</label>\n                  <input class="form-control" id="uCustomButtonLink" name="customButtonLink"\n                         ng-model="egs.customButton.url"\n                         placeholder="promotion link" type="text">
2\n                  <span class="help-block"\n                        ng-show="fEditEGS.customButtonLink.$dirty && fEditEGS.customButtonLink.$error.required">Please provide a link for your button</span>\n                </div>\n\n                <div class="form-group">\n                  <label class="radio-inline editor__customButton__noDetailCheckbox">\n                    <input id="uCustomButtonNoDetails" name="customButtonNoDetails" ng-model="egs.customButton.noDetail"\n                           type="checkbox"> Skip details page completely\n                  </label>\n                  <span class="help-block" ng-if="!egs.customButton.noDetail"\n                  >Warning: If this option is enabled the details page for your event will not be shown\n                    at all. Instead the pinboard, agenda, etc. will go link directly to the promoted link</span>\n\n                  <span class="help-block editor__customButton__warning" ng-if="egs.customButton.noDetail"\n                  ><b>Warning:</b> This event is configured to link directly from the pinboard, agenda, etc. to the promoted link.\n                    The details page will never be shown. Uncheck this option to return to the normal behaviour.\n                  </span>\n                </div>\n\n              </div>\n\n              <div class="form-inline eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'priority\'">\n                <h4>Event priority</h4>\n                <p>When events occur at the same time, those with the highest priority are listed first.</p>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div class="form-group">\n                  <label>Priority</label>\n                  <select class="form-control" ng-model="egs.absPriority"\n                          ng-options="num.v as num.label for num in priorityOptions">\n                  </select>&nbsp;&nbsp;\n                  <label ng-if="!egs.recurrence.rrule" class="radio-inline editor__customButton__noDetailCheckbox">\n                    <input ng-if="!egs.recurrence.rrule" type="checkbox" id="uPinned" name="pinned"\n                           ng-model="egs.pinned"\n                    >Pinned event\n                  </label>\n                  <span ng-if="!egs.recurrence.rrule" class="help-block l-help">Pinned events are always listed first,\n                    regardless of their starting date, as long as they are in the future. If there are multiple pinned events they are ordered\n                  by priority.</span>\n                  <span ng-if="egs.recurrence.rrule" class="help-block l-help">Note: Whole repeating groups can\'t be pinned</span>\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'status\'">\n                <h4>Event Status</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n\n                <span class="help-block">This event status and the online location (below) helps people understand the status of your event and how they can attend.</span>\n                <div class="form-group">\n                  <label>Status</label>\n                  <select class="form-control" name="status" id="uStatus" ng-model="egs.status.name"\n                          ng-options="opt.v as opt.label for opt in statusOptions">\n                  </select>\n                </div>\n                <div class="form-group" ng-if="isRescheduled">\n                  <label>Previous start date</label>\n                  <span>{{previousStartDate}}</span>\n                  <span class="help-block l-help">Rescheduled events show a <i>place-holder</i> event\n                    at the original date, to help people find the new event date.</span>\n                  <label class="radio-inline editor__customButton__noDetailCheckbox">\n                    <input type="checkbox" id="uPrevious" name="previous"\n                           ng-model="egs.status.hidePreviousDate"\n                    >Don\'t show "Rescheduled From" place-holder\n                  </label>\n                </div>\n                <div class="form-group" ng-if="egs.status.name === \'notice\'">\n                  <label>Notice text</label>\n                  <input type="text" class="form-control" id="uText" name="text"\n                         ng-model="egs.status.text"\n                         placeholder="custom notice text">\n                </div>\n                <div class="form-group" ng-if="egs.status.name === \'busy\'">\n                  <label>Busy text</label>\n                  <input type="text" class="form-control" id="uBusy" name="text"\n                         ng-model="egs.status.text"\n                         placeholder="busy label text">\n                </div>\n                <div ng-if="isOnline && !egs.where.virtualLoc.url">
2\n                  <span\n                      class="help-block">Don\'t forget to set the online location in the Event Location section below.</span>\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'organizer\'"\n                   ng-init="egs.organizer = egs.organizer || {}; egs.organizer.kind = egs.organizer.kind || \'Organization\'">\n                <h4>Event Organizer</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div class="form-group l-label">\n                  <label>Type</label>\n                  <select class="form-control" ng-model="egs.organizer.kind">\n                    <option value="Person">Person</option>\n                    <option value="Organization">Organization</option>\n                    <option value="MusicGroup">MusicGroup</option>\n                    <option value="PerformingGroup">PerformingGroup</option>\n                    <option value="DanceGroup">DanceGroup</option>\n                    <option value="TheaterGroup">TheaterGroup</option>\n                  </select>\n                </div>\n                <div class="form-group l-label">\n                  <label>Name</label>\n                  <input class="form-control" name="organizerName" ng-model="egs.organizer.name" placeholder="organizer name" type="text">\n                </div>\n                <div class="form-group">\n                  <label>Link (optional)</label>\n                  <input class="form-control" name="organizerUrl" ng-model="egs.organizer.url" placeholder="https://…" type="text">\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'performer\'"\n                   ng-init="(egs.performers && egs.performers.length) || (egs.performers = [{ kind: \'Person\' }])">\n                <h4>Performers</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div class="eventGroupEditor__performerRow" ng-repeat="performer in egs.performers">\n                  <div class="form-group l-label">\n                    <label>Type</label>\n                    <select class="form-control" ng-model="performer.kind">\n                      <option value="Person">Person</option>\n                      <option value="Organization">Organization</option>\n                      <option value="MusicGroup">MusicGroup</option>\n                      <option value="PerformingGroup">PerformingGroup</option>\n                      <option value="DanceGroup">DanceGroup</option>\n                      <option value="TheaterGroup">TheaterGroup</option>\n                    </select>\n                  </div>\n                  <div class="form-group l-label">\n                    <label>Name</label>\n                    <input class="form-control" ng-model="performer.name" placeholder="performer name" type="text">\n                  </div>\n                  <div class="form-group">\n                    <label>Link (optional)</label>\n                    <input class="form-control" ng-model="performer.url" placeholder="https://… (optional)" type="text">\n                  </div>\n                  <a class="editor__link" ng-if="egs.performers.length > 1" ng-click="egs.performers.splice($index, 1)">remove</a>\n                </div>\n                <a class="editor__link" ng-click="egs.performers.push({ kind: \'Person\' })">&#65291;add performer</a>\n              </div>\n\n            </div>\n\n            <div class="l-imagepart">\n              <div class="eventGroupEditor__image__column__small">\n                <div class="eventGroupEditor__image__box__small">\n                  <div class="eventGroupEditor__image l-empty" ng-click="editImage($event)" ng-if="!egs.imageIdNg">\n                    <a class="l-emptyText"><i class="flaticon-plus-sign-button"></i>&nbsp;<span\n                        class="l-etext">Image</span></a>\n                  </div>\n                  <div class="eventGroupEditor__image" ng-if="egs.imageIdNg">\n                    <img alt="" image-failover ng-click="editImage($event)" ng-src="{{ smallImageURL }}">\n                    <div class="l-overlay" ng-click="editImage($event)">\n                      <button\n                          class="btn btn-siteform btn-sm" ng-click="editImage($event)"\n                          type="button">Change Image\n                      </button>\n                    </div>\n                  </div>\n                </div>\n                <div class="editor__sectionFooter" ng-if="imageURL"><a\n                    class="editor__link l-right" ng-click="removeImage()"><i class="flaticon-close47"></i> Remove</a>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class="editor__section eventGroupEditor__useLink" ng-if="egs.useId">\n            This is a user submitted event: <a ng-href="{{\'/tkf2/submitDecision/\' + egs.useId}}" target="_blank">View\n            Original Submission</a>\n          </div>\n\n          <div class="editor__section eventGroupEditor__recurrence">\n            <div class="form-group" ng-if="egs.recurrence.when">\n              <div class="editor__sectionHeader">\n                <div class="l-title">Event Date and Time</div>\n              </div>\n              <when-picker class="editor__whenPicker l-inline-block" date-format="dateFormat"\n                           is-disabled="hasExternalSource"\n                           time-format="timeFormat" when="proxy.when"></when-picker>\n              <div class="editor__addRepeats" ng-if="!hasExternalSource && calendar.effectiveFeatureLevel > 0">\n                <a class="editor__link" ng-click="addRepeats()">Add Regular Repeats</a>\n                \x3c!--<a  class="editor__link" ng-click="addRDate()" > Add Another Date</a>--\x3e\n              </div>\n              <div class="editor__addRepeats" ng-if="calendar.effectiveFeatureLevel <= 0">
2\n                <span class="editor__link">Add Regular Repeats</span>\n                <span class="eventGroupEditor__subscription__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n                  <span class="glyphicon glyphicon-lock"></span> subscription only</span>\n              </div>\n              <div class="editor__addRepeats" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <span class="editor__link">Add extra dates</span>\n                <span class="eventGroupEditor__subscription__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n                  <span class="glyphicon glyphicon-lock"></span> subscription only</span>\n              </div>\n            </div>\n\n            <div ng-if="egs.recurrence.rrule">\n              <div class="editor__sectionHeader">\n                <div class="l-title">Repeating Event Dates and Times</div>\n              </div>\n              <rrule-editor\n                  calendar="CalendarSearch.calendar"\n                  class="editor__rrule"\n                  date-format="dateFormat"\n                  event-group="egs"\n                  exdates="egs.exdates"\n                  is-disabled="hasExternalSource"\n                  mods="egs.mods"\n                  rdates="egs.rdates"\n                  remove-repeats="removeRepeats()"\n                  rrule="egs.recurrence.rrule"\n                  time-format="timeFormat"></rrule-editor>\n            </div>\n\n\n            <div class="rrule__changeTable" ng-if="rdateTable.length > 0">\n              <div class="l-header">Individually added extra dates</div>\n              <table>\n                <thead>\n                <tr>\n                  <th>Date/Time</th>\n                  <th>Type</th>\n                  <th>Status</th>\n                  <th>Change</th>\n                  <th>Remove</th>\n                </tr>\n                </thead>\n                <tr ng-repeat="rdate in rdateTable">\n                  <td>{{rdate.formatted}}</td>\n                  <td>Extra Date</td>\n                  <td>ok</td>\n                  <td class="l-centered">\n                    <a class="editor__link" ui-sref="^.modeditor({uid:egs.uid, tid:rdate.tid, rid:rdate.rid})">Edit</a>\n                  </td>\n                  <td class="l-centered">\n                    <a class="editor__link" ng-click="egs.removeRDate(rdate)">Remove</a>\n                  </td>\n                </tr>\n              </table>\n            </div>\n\n\n            <div ng-if="!isFree && !viewState.showAddRepeats && rdateTable.length !== 0">\n              <a class="editor__link" ng-click="viewState.showAddRepeats  = true">Add More Extra Dates</a>\n            </div>\n\n            <div\n                ng-if="!isFree && !hasExternalSource && !viewState.showAddRepeats && rdateTable.length === 0 && egs.uid">\n              <a class="editor__link" ng-click="viewState.showAddRepeats  = true"> &#65291;Add extra date</a>\n            </div>\n\n            <div ng-if="!isFree && viewState.showAddRepeats">\n              <div ng-if="egs.recurrence">\n                <rdate-picker class="editor__whenPicker l-inline-block"\n                              date-format="dateFormat"\n                              event-group="egs" rdate="rdateSeed.start"\n                              show-time="!rdateSeed.allDay"\n                              time-format="timeFormat"></rdate-picker>\n                \x3c!--<div ng-repeat="rdate in egs.rdates">Repeat at {{rdate}}</div>--\x3e\n              </div>\n            </div>\n\n            <div ng-if="maxRepeatsFeature">\n              <div ng-if="!isFree && (egs.recurrence.rrule ||(egs.rdates && egs.rdates.length))" style="margin:10px 0">\n                <div\n                    ng-if="!viewState.showMaxPublicVisible">\n                  <a class="editor__link"\n                     ng-click="viewState.showMaxPublicVisible  = true">\n                    Limit number of events from this group included in <b>public</b> calendar</a> (currently showing\n                  all)\n                  <sp
2an class="label label-siteform label-siteform--light">Experimental Feature</span>\n                </div>\n\n                <div ng-if="viewState.showMaxPublicVisible">\n                <span>include at most\n              <select class="form-control customizer__fontSizePicker"\n                      ng-model="egs.maxFuturePublic"\n                      ng-options="num.value as num.label for num in maxFutureEventsOptions"></select>\n                  events from this event group in views of the <b>public</b> calendar\n                  <a href="" ng-click="egs.maxFuturePublic=undefined;viewState.showMaxPublicVisible=false">use default (include all)</a>\n                   <span class="label label-siteform label-siteform--light">Experimental Feature</span>\n                </span>\n\n\n                </div>\n              </div>\n            </div>\n\n\n          </div>\n\n          <div class="editor__section editor__section__tags">\n            <div class="editor__sectionHeader">\n              <div class="l-title">Tags/Categories</div>\n            </div>\n            <tags-input add-from-autocomplete-only="false" allow-leftover-text="true"\n                        class="eventGroupEditor__tags"\n                        min-length="1"\n                        ng-if="tagOptionsLoaded"\n                        ng-model="proxy.tags"\n                        placeholder="add tags here"\n                        tags-reorderable\n            >\n              <auto-complete\n                  highlight-matched-text="false"\n                  load-on-empty="true"\n                  load-on-focus="true"\n                  max-results-to-show="100"\n                  min-length="0"\n                  ng-if="tagOptions"\n                  select-first-match="true"\n                  source="matchedTagOptions($query)">\n              </auto-complete>\n            </tags-input>\n            <div class="eventGroupEditor__managetagsLinkLeft">\n              <div ng-if="calendar.effectiveFeatureLevel <= 0">Manage Tags <span\n                  class="eventGroupEditor__subscription__warning"><span\n                  class="glyphicon glyphicon-lock"></span> subscription only</span></div>\n              <a ng-click="openTagManager()" ng-if="calendar.effectiveFeatureLevel > 0">Manage Tags</a>\n            </div>\n          </div>\n\n          <div class="editor__section" ng-if="egs.customPreview || viewState.showCustomPreview">\n            <div class="editor__sectionHeader">\n              <div class="l-title">Description Preview Text</div>\n              <a class="editor__link l-right" ng-click="egs.customPreview = \'\';viewState.showCustomPreview = false"><i\n                  class="flaticon-close47"></i> Remove</a></div>\n            <div>\n              <div class="eventGroupEditor__preview__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <div class="l-label">Subscription Only</div>\n              </div>\n              <textarea class="eventGroupEditor__preview form-control" ng-if="calendar.effectiveFeatureLevel > 0"\n                        ng-model="egs.customPreview"\n                        rows="4"></textarea>\n            </div>\n          </div>\n          <div class="editor__section">\n            <div class="editor__sectionHeader">\n              <div class="l-title">Event Description</div>\n              <a class="editor__link l-right"\n                 ng-click="viewState.showCustomPreview = true"\n                 ng-if="calendar.effectiveFeatureLevel > 0 && !egs.customPreview && !viewState.showCustomPreview">&#65291;Custom\n                Preview</a>\n\n              <span class="l-right" ng-if="calendar.effectiveFeatureLevel <= 0">\n                 &#65291;Custom Preview <span class="eventGroupEditor__subscription__warning"><span\n                  class="glyphicon glyphicon-lock"></span> subscription only</span></span></div>\n          </div>\n          <div>\n            <div class="eventGroupEditor__description__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n              <div ng-if="source !== \'duda\'">\n                This free version of Tockify will only show the featured image to the public. No other media. <a\n                  ui-sref="siteform.paidPlanPicker"><b>Upgrade Now</b></a>\n              </div>\n              <div ng-if="source === \'duda\'">\n                This trial-expired version of Tockify can\'t be customized.\n                <a ui-sref="settings.subscriptions"><b>Upgrade Now</b></a>\n              </div>\n            </div>\n            <tkf-lexical-editor class="eventGroupEditor__description" \n                  ng-model="egs.description" \n                  bridge="lexicalBridge"\n                  image-sets="imageSets"\n                  ng-disabled="hasExternalSource">\n            </tkf-lexical-editor>\n          </div>\n\n          <div class="editor__pnotes">
2\n          <span ng-if="calendar.effectiveFeatureLevel > 0 && !egs.privateNotes && !viewState.showPrivateNotes"><a\n              class="editor__link"\n              ng-click="viewState.showPrivateNotes = true"><span class="label label-newFeature l-new">NEW</span>&nbsp;&#65291;Add Private\n            Notes</a> (not shown on calendar)</span>\n            <span ng-if="calendar.effectiveFeatureLevel <= 0 && !egs.privateNotes ">\n                 &#65291;Add Private Notes <span class="eventGroupEditor__subscription__warning"><span\n                class="glyphicon glyphicon-lock"></span> subscription only</span></span>\n          </div>\n          <div class="editor__section" ng-if="egs.privateNotes || viewState.showPrivateNotes">\n            <div class="editor__sectionHeader">\n              <div class="l-title"><span>Private Notes (not shown on calendar)</div>\n              <a class="editor__link l-right" ng-click="egs.privateNotes = \'\';viewState.showPrivateNotes = false"><i\n                  class="flaticon-close47"></i> Remove</a></div>\n            <div>\n              <div class="eventGroupEditor__preview__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <div class="l-label">Subscription Only</div>\n                <div style="margin:30px 5px 0">\n                  {{egs.privateNotes}}\n                </div>\n              </div>\n              <textarea class="eventGroupEditor__preview form-control" ng-if="calendar.effectiveFeatureLevel > 0"\n                        ng-model="egs.privateNotes"\n                        rows="4"></textarea>\n            </div>\n          </div>\n\n          <div class="form-group eventGroupEditor__locationTypePicker">\n            <label>Event Location Type:</label>&nbsp;&nbsp;&nbsp;<div class="btn-group">\n            <button class="btn btn-default"\n                    ng-class="{\'btn-siteform\':viewState.locationType === \'address\'}"\n                    type="button"\n                    ng-click="viewState.locationType = \'address\'">Street Address\n            </button>\n            <button class="btn btn-default"\n                    ng-class="{\'btn-siteform\':viewState.locationType === \'online\'}"\n                    type="button"\n                    ng-click="viewState.locationType = \'online\'">Online Event (link)\n            </button>\n            <button class="btn btn-default"\n                    ng-class="{\'btn-siteform\':viewState.locationType === \'both\'}"\n                    type="button"\n                    ng-click="viewState.locationType = \'both\'">Both\n            </button>\n          </div>\n          </div>\n\n          \x3c!-- start vloc --\x3e\n          <div ng-class="{editor_onlinePadding:viewState.locationType === \'online\' }"\n               ng-if="viewState.locationType === \'online\' || viewState.locationType === \'both\'">\n            <div class="editor__sectionHeader l-onlineEvent">\n              <div class="l-title">Online Event Location</div>\n            </div>\n\n            <div class="form-group">\n              <span ng-if="egs.rsvpLink">\n                <input type="checkbox" ng-model="egs.where.virtualLoc.rsvpOnly"\n                       id="uVirtualRsvp" name="virtualRsvp">\n              </span>\n              \x3c!-- only want tooltip when element is disabled --\x3e\n              <span ng-if="!egs.rsvpLink" bs-tooltip data-title="Event doesn\'t use RSVP form">\n                <input type="checkbox" disabled>\n              </span>\n              Only reveal online location in RSVP confirmation message (not in calendar)\n            </div>\n\n            <div class="form-group" ng-if="hasExternalSource">\n              <span>\n                <input type="checkbox" ng-model="egs.externalVLoc"\n                       id="uExternalVLoc" name="externalVLoc">\n              </span>\n              Use Google Calendar Virtual Location (this will overwrite manual changes so they are disabled)\n            </div>\n\n            <div class="form-group">\n              <label>Online Event Location Title (friendy name)</label>\n              <input class="form-control" data-min-length="1" ng-model="egs.where.virtualLoc.name" ng-trim="false"\n                     id="uVirtualName" name="virtualName"\n                     placeholder="join the meeting"\n                     ng-disabled="disableVLoc"\n                     type="text">\n            </div>\n\n            <div class="form-group">\n              <label>Online Event Location Link (e.g. skype/zoom/hangouts link)</label>\n              <input class="form-control" data-min-length="1" ng-model="egs.where.virtualLoc.url" ng-trim="false"\n                     id="uVirtualURL" name="virtualURL"\n                     placeholder="Location Link, e.g. to Skype or Zoom"\n                     ng-disabled="disableVLoc"\n                     type="text">\n            </div>\n\n            <div class="form-group">\n              <label>Online Event Instructions (e.g. meeting id/key, alternative access)</label>\n              <textarea class="form-control"\n                        ng-model="egs.where.virtualLoc.info" rows="4"   ng-disabled="disableVLoc"></textarea>\n            </div>\n\n          </div>\n\n          <div ng-if="viewState.locationType === \'address\' || viewState.locationType === \'both\'">\n            <div class="editor__section">\n              <div class="editor__sectionHeader">\n                <div class="l-title">Event Location</div>\n              </div>\n\n              <div class="eventGroupEditor__where">\n                <div address-picker ng-if="egs.where" ccode="ccode" region="region" where="egs.where"></div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class="eventGroupEditor__image-column">\n          <div class="editor__sectionHeader">\n            <div class="l-title">
2Featured Image</div>\n          </div>\n          <div class="eventGroupEditor__image__box">\n            <div class="eventGroupEditor__image l-empty" ng-click="editImage($event)" ng-if="!egs.imageIdNg">\n              <a class="l-emptyText" ng-click="editImage($event)"><i class="flaticon-plus-sign-button"></i>&nbsp;<span\n                  class="l-etext">Image</span></a>\n            </div>\n            <div class="eventGroupEditor__image" ng-if="egs.imageIdNg">\n              <img alt="" image-failover ng-click="editImage($event)" ng-src="{{ imageURL }}">\n              <div class="l-overlay" ng-click="editImage($event)">\n                <button\n                    class="btn btn-siteform" ng-click="editImage($event)"\n                    type="button">Change Image\n                </button>\n              </div>\n            </div>\n          </div>\n          <div class="editor__sectionFooter" ng-if="imageURL"><a\n              class="editor__link l-right" ng-click="removeImage()"><i class="flaticon-close47"></i> Remove</a></div>\n          <div class="editor__sectionHeader">\n            <div class="l-title">Tags/Categories</div>\n          </div>\n          <tags-input add-from-autocomplete-only="false" allow-leftover-text="true"\n                      class="eventGroupEditor__tags l-side"\n                      min-length="1"\n                      ng-if="tagOptionsLoaded"\n                      ng-model="proxy.tags"\n                      placeholder="add tags here"\n                      select-first-match="true"\n                      tags-reorderable>\n            <auto-complete\n                highlight-matched-text="false"\n                load-on-empty="true"\n                load-on-focus="true"\n                max-results-to-show="100"\n                min-length="0"\n                ng-if="tagOptions"\n                select-first-match="true"\n                source="matchedTagOptions($query)"></auto-complete>\n          </tags-input>\n          <div class="eventGroupEditor__managetagsLinkLeft">\n            <div ng-if="calendar.effectiveFeatureLevel <= 0">Manage Tags <span\n                class="eventGroupEditor__subscription__warning"><span\n                class="glyphicon glyphicon-lock"></span> subscription only</span></div>\n            <a ng-click="openTagManager()" ng-if="calendar.effectiveFeatureLevel > 0">Manage Tags</a></div>\n        </div>\n      </div>\n    </form>\n\n  </div>\n</div>\n'},2614(e){e.exports='<div class="editor__leftbar__section editor__leftbar__fixedtop">\n  <div class="editor__leftbar__backbutton">\n    <a class="btn btn-default btn-xs btn-back" ng-click="goBack($event)"><i\n        class="flaticon-arrows-1"></i><span\n        class="l-full-width">{{NavHistory.parentButtonText()}}</span><span\n        class="l-medium-width">Back</span></a>\n  </div>\n  <div class="editor__left__narrow__item">\n    <button ng-class="{\'btn editor__save__button\':true,\n         \'btn-siteform--green\':(EventGroupEditor.hasUnsavedChanges && !EventGroupEditor.repeatInvalid),\n          \'btn-default\':!EventGroupEditor.hasUnsavedChanges ||EventGroupEditor.repeatInvalid }"\n            ng-disabled="EventGroupEditor.repeatInvalid"\n            ng-click="saveGroup($event)">Save Changes\n    </button>\n    <div ng-if="EventGroupEditor.repeatInvalid" class="rrule__invalid-mods-warning l-sidebar">\n      You can\'t save a repeating event group with no events\n    </div>\n  </div>\n  <div class="editor__left__narrow__item">\n    <div class="eventGroupEditor__copyNotice l-narrow-copy" ng-if="isCopy">Unsaved Copy</div>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted"\n       ng-if="EventGroupEditor.currentGroup">\n    <a class="editor__link" ng-click="deleteGroup()" ng-if="isSingleton()">Delete Event</a>\n    <a class="editor__link" ng-click="deleteGroup()" ng-if="!isSingleton()">Delete Group</a>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted" ng-if="EventGroupEditor.currentGroup">\n    <a class="editor__link" ng-click="copyGroup()" ng-if="isSingleton()">Copy Event</a>\n    <a class="editor__link" ng-click="copyGroup()" ng-if="!isSingleton() && !isFree">Copy Group</a>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted"\n       ng-if="EventGroupEditor.currentGroup.uid && otherCalendars.length > 0">\n    <div ng-model="copyTarget.selected" select-model="calendarSelectModel" select-only="true" tkf-select></div>
2\n    <a class="editor__link" ng-click="copyToCalendar()" ng-if="copyTarget.selected"\n       style="display:block; margin-top:4px;">Copy to {{copyTarget.selected.displayName || copyTarget.selected.name}}</a>\n  </div>\n\n  <div class="editor__block">\n    <div class="l-header">Update</div>\n\n    <div class="l-body l-center">\n      <button ng-class="{\'btn btn l-save\':true,\n         \'btn-siteform--green\':EventGroupEditor.hasUnsavedChanges,\n          \'btn-default\':!EventGroupEditor.hasUnsavedChanges}"\n              ng-disabled="EventGroupEditor.repeatInvalid"\n              ng-click="saveGroup($event)">Save Changes\n      </button>\n      <div ng-if="EventGroupEditor.repeatInvalid" class="rrule__invalid-mods-warning l-sidebar">\n        You can\'t save a repeating event group with no events\n      </div>\n      <div class="eventGroupEditor__copyNotice" ng-if="isCopy">This is an unsaved copy</div>\n    </div>\n    <div class="l-footer">\n      <div class="l-leftbox" ng-if="!EventGroupEditor.currentGroup.uid"><span class="l-disabledText">Copy</span></div>\n      <div class="l-leftbox" ng-if="!EventGroupEditor.currentGroup.uid"><span class="l-disabledText">Delete</span></div>\n\n      <div class="l-leftbox" ng-if="EventGroupEditor.currentGroup.uid && (isSingleton() || !isFree) "><a\n          class="editor__link" ng-click="copyGroup()">Copy</a></div>\n      <div class="l-rightbox" ng-if="EventGroupEditor.currentGroup.uid"><a class="editor__link"\n                                                                           ng-click="deleteGroup()">Delete</a>\n      </div>\n    </div>\n    <div class="l-footer" ng-if="EventGroupEditor.currentGroup.uid && otherCalendars.length > 0"\n         style="display:block; padding:6px;">\n      <div ng-model="copyTarget.selected" select-model="calendarSelectModel" select-only="true" tkf-select></div>\n      <a class="editor__link" ng-click="copyToCalendar()" ng-if="copyTarget.selected"\n         style="display:block; margin-top:4px;">Copy to {{copyTarget.selected.displayName || copyTarget.selected.name}}</a>\n    </div>\n  </div>\n\n</div>\n<div class="editor__left__narrow__item l-narrowSupport">\n  <a ng-click="showSupport()">Help and Support</a>\n</div>\n<div class="editor__leftbar__section editor__leftbar__main">\n\n  <div class="editor__block" ng-if="EventGroupEditor.currentGroup.recurrence.rrule">\n    <div class="l-header">Editing Repeating Group</div>\n    <div class="l-body">\n      <p>You are editing a repeating group of events.</p>\n      <p>To modify an individual repeat go back to the calendar and select "modify event".</p>\n    </div>\n    \x3c!--<div class="l-footer">--\x3e\n    \x3c!--<div class="l-rowbox">--\x3e\n\n    \x3c!--</div>--\x3e\n    \x3c!--</div>--\x3e\n  </div>\n\n  <div class="editor__block" ng-if="!EventGroupEditor.currentGroup.recurrence.rrule">\n    <div class="l-header">Editing Single Event</div>\n    <div class="l-body">\n      You are editing a non-repeating event.\n    </div>\n    \x3c!--<div class="l-footer">--\x3e\n    \x3c!--<div class="l-rowbox">--\x3e\n\n    \x3c!--</div>--\x3e\n    \x3c!--</div>--\x3e\n  </div>\n  <div class="editor__block">\n    <div class="l-body l-center">\n      <a ng-click="showSupport()">Help and Support</a>\n    </div>\n  </div>\n\n\n</div>\n'},5365(e){e.exports='<div class="eventGroupEditor" ng-if="mod">\n\n  <div class="eventGroupEditor__main">\n    <form name="fEditMod" novalidate role="form">\n      <div ng-init="forms.fEditMod = fEditMod"></div>\n\n      <div class="eventGroupEditor__formTop">\n\n        <div class="eventGroupEditor__basics-column">\n          <div class="editor__section">\n            <div class="l-textpart">\n              <div class="editor__top-notice" ng-if="hasExternalSource">This event is managed outside of Tockify so some\n                fields can\'t be changed here.\n              </div>\n              <div class="editor__sectionHeader">\n                <div class="l-title">Event Title</div>\n              </div>\n\n              <div ng-class="{\'form-group editor__titleField has-feedback\':true, \'has-error\':fEditMod.title.$invali
2d}">\n                <input class="form-control" id="uTitle" name="title" ng-disabled="hasExternalSource"\n                       ng-model="mod.title"\n                       placeholder="event title" required server-error type="text">\n                <span\n                    ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fEditMod.title.$invalid}"></span>\n                <span class="help-block"\n                      ng-show="fEditMod.title.$dirty && fEditMod.title.$error.required">Please provide a title</span>\n                \x3c!-- use server error directive here to clear on edit --\x3e\n                <span class="help-block"\n                      ng-show="fEditMod.title.$pristine && fEditMod.title.$error.serverError">{{serverErrors.title}}</span>\n              </div>\n\n\n              <div class="eventGroupEditor__customButtons" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <div class="l-nosubscription">&#65291;RSVP</div>\n                <div class="l-nosubscription">&#65291;Promotion Button</div>\n                <div class="l-nosubscription">&#65291;Attachment</div>\n                <div class="l-nosubscription">&#65291;Priority</div>\n                <div class="l-nosubscription">&#65291;Status</div>\n                <div class="eventGroupEditor__subscription__warning">\n                  <span><span class="glyphicon glyphicon-lock"></span> subscription only</span>\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__customButtons" ng-if="calendar.effectiveFeatureLevel > 0">\n                \x3c!--<div class="button-shadow">Add Promotion Button</div>&nbsp;--\x3e\n\n                <div class="l-addButton" ng-if="!mod.rsvpLink"><a class="editor__link"\n                                                                  ng-click="manageRSVP()">&#65291;RSVP</a></div>\n                <div class="l-addButton"\n                     ng-if="!mod.customButton.url.trim().length > 0 || !mod.customButton.label.trim().length>0"><a\n                    class="editor__link"\n                    ng-click="viewState.showButtonEditor = \'promotion\'">&#65291;Promotion\n                  Button</a></div>\n                <div class="editor__customButton l-b l-manage-rsvp" ng-click="manageRSVP()" ng-if="mod.rsvpLink">Manage\n                  RSVP\n                </div>\n                <div class="editor__customButton"\n                     ng-if="mod.customButton.url.trim().length > 0 && mod.customButton.label.trim().length>0">\n                  <a class="l-pbe"\n                     ng-click="viewState.showButtonEditor=\'promotion\'">{{mod.customButton.label}}&nbsp;&nbsp; <i\n                      class="flaticon-draw"></i></a></div>\n                <div class="l-addButton" ng-if="mod.attachments.length === 0"><a class="editor__link"\n                                                                                 ng-click="addAttachment($event)">&#65291;Attachment</a>\n                </div>\n                <div class="editor__customButton"\n                     ng-if="mod.attachments.length !== 0"><a class="l-cb"\n                                                             ng-click="addAttachment($event)">{{mod.attachments.length |\n                formatAttachmentCount}}&nbsp;&nbsp;<i class="flaticon-draw"></i></a></div>\n                <div class="l-addButton"><a class="editor__link"\n                                            ng-click="viewState.showButtonEditor = \'priority\'">&#65291;Priority&nbsp;({{mod.absPriority\n                + (mod.pinned ? \'📌\' : \'\') }})</a></div>\n                <div class="l-addButton"><a class="editor__link"\n                                            ng-click="viewState.showButtonEditor = \'status\'">&#65291;Status\n                  <span class="l-status l-status-{{mod.status.name}}">{{statusLabel}}</span></a>\n                </div>\n                <div class="l-addButton"\n                     ng-if="!mod.organizer.name.trim().length > 0"><a\n                    class="editor__link"\n                    ng-click="viewState.showButtonEditor = \'organizer\'">&#65291;Organizer</a></div>\n                <div class="editor__customButton"\n                     ng-if="mod.organizer.name.trim().length > 0">\n                  <a class="l-pbe"\n                     ng-click="viewState.showButtonEditor=\'organizer\'">{{mod.organizer.name}}&nbsp;&nbsp; <i class="flaticon-draw"></i></a></div>\n                <div class="l-addButton"\n                     ng-if="(mod.performers | namedItems).length === 0"><a\n                    class="editor__link"\n                    ng-click="viewState.showButtonEditor=\'performer\'; (mod.performers && mod.performers.length) || (mod.performers = [{ kind: \'Person\' }])">&#65291;Performer</a></div>\n                <div class="editor__customButton"\n                     ng-if="(mod.performers | namedItems).length">\n                  <a class="l-pbe"\n                     ng-click="viewState.showButtonEditor=\'performer\'">{{(mod.performers | namedItems).length}} Performer<span ng-if="(mod.performers | namedItems).length > 1">s</span>&nbsp;&nbsp; <i class="flaticon-draw"></i></a></div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'promotion\'">\n                <h4>Add or edit a Promotion Button</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div\n                    ng-class="{\'form-group has-feedback l-label\':true, \'has-error\':fEditMod.customButtonText.$invali
2d}">\n                  <label>Button Text</label>\n                  <input class="form-control" id="uCustomButtonText" name="customButtonText"\n                         ng-model="mod.customButton.label"\n                         placeholder="button text" type="text">\n                  <span class="help-block"\n                        ng-show="fEditMod.customButtonText.$dirty && fEditMod.customButtonText.$error.required">Please provide some button text</span>\n                </div>\n\n                <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fEditMod.customButtonLink.$invalid}">\n                  <label>Button Link</label>\n                  <input class="form-control" id="uCustomButtonLink" name="customButtonLink"\n                         ng-model="mod.customButton.url"\n                         placeholder="promotion link" type="text">\n                  <span class="help-block"\n                        ng-show="fEditMod.customButtonLink.$dirty && fEditMod.customButtonLink.$error.required">Please provide a link for your button</span>\n                </div>\n\n\n                <div class="form-group">\n                  <label class="radio-inline editor__customButton__noDetailCheckbox">\n                    <input id="uCustomButtonNoDetails" name="customButtonNoDetails" ng-model="mod.customButton.noDetail"\n                           type="checkbox"> Skip details page completely\n                  </label>\n                  <span class="help-block" ng-if="!mod.customButton.noDetail"\n                  >Warning: If this option is enabled the details page for your event will not be shown\n                    at all. Instead the pinboard, agenda, etc. will go link directly to the promoted link</span>\n\n                  <span class="help-block editor__customButton__warning" ng-if="mod.customButton.noDetail"\n                  ><b>Warning:</b> This event is configured to link directly from the pinboard, agenda, etc. to the promoted link.\n                    The details page will never be shown. Uncheck this option to return to the normal behaviour.\n                  </span>\n                </div>\n\n              </div>\n\n              <div class="form-inline eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'priority\'">\n                <h4>Event priority</h4>\n                <p>When events occur at the same time, those with the highest priority are listed first.</p>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div class="form-group">\n                  <label>Priority</label>\n                  <select class="l-prioritySelect form-control" ng-model="mod.absPriority"\n                          ng-options="num.v as num.label for num in priorityOptions">\n                  </select>&nbsp;&nbsp;\n                  <label class="radio-inline editor__customButton__noDetailCheckbox">\n                    <input type="checkbox" id="uPinned" name="pinned" ng-model="mod.pinned"\n                    >Pinned event\n                  </label>\n                  <span class="help-block">Pinned events are always listed first,\n                    regardless of their starting date, as long as they are in the future. If there are multiple pinned events they are ordered\n                  by priority.</span>\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'status\'">\n                <h4>Event Status</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n\n                <span class="help-block">This event status and the online location (below) helps people understand the status of your event and how they can attend.</span>\n                <div class="form-group">\n                  <label>Status</label>\n                  <select class="form-control" name="status" id="uStatus" ng-model="mod.status.name"\n                          ng-options="opt.v as opt.label for opt in statusOptions">\n                  </select>\n                </div>\n                <div class="form-group" ng-if="isRescheduled">\n                  <label>Previous start date</label>
2\n                  <span>{{previousStartDate}}</span>\n\n                  <span class="help-block l-help">Rescheduled events show a <i>place-holder</i> event\n                    at the original date, to help people find the new event date.</span>\n                  <label class="radio-inline editor__customButton__noDetailCheckbox">\n                    <input type="checkbox" id="uPrevious" name="previous"\n                           ng-model="mod.status.hidePreviousDate"\n                    >Don\'t show "Resceduled From" place-holder\n                  </label>\n                </div>\n                <div class="form-group" ng-if="mod.status.name === \'notice\'">\n                  <label>Notice text</label>\n                  <input type="text" class="form-control" id="uText" name="text"\n                         ng-model="mod.status.text"\n                         placeholder="custom notice text">\n                </div>\n                <div class="form-group" ng-if="mod.status.name === \'busy\'">\n                  <label>Busy text</label>\n                  <input type="text" class="form-control" id="uBusy" name="text"\n                         ng-model="mod.status.text"\n                         placeholder="busy label text">\n                </div>\n                <div ng-if="isOnline && !mod.where.virtualLoc.url">\n                  <span\n                      class="help-block">Don\'t forget to set the online location in the Event Location section below.</span>\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'organizer\'"\n                   ng-init="mod.organizer = mod.organizer || {}; mod.organizer.kind = mod.organizer.kind || \'Organization\'">\n                <h4>Event Organizer</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div class="form-group l-label">\n                  <label>Type</label>\n                  <select class="form-control" ng-model="mod.organizer.kind">\n                    <option value="Person">Person</option>\n                    <option value="Organization">Organization</option>\n                    <option value="MusicGroup">MusicGroup</option>\n                    <option value="PerformingGroup">PerformingGroup</option>\n                    <option value="DanceGroup">DanceGroup</option>\n                    <option value="TheaterGroup">TheaterGroup</option>\n                  </select>\n                </div>\n                <div class="form-group l-label">\n                  <label>Name</label>\n                  <input class="form-control" name="organizerName" ng-model="mod.organizer.name" placeholder="organizer name" type="text">\n                </div>\n                <div class="form-group">\n                  <label>Link (optional)</label>\n                  <input class="form-control" name="organizerUrl" ng-model="mod.organizer.url" placeholder="https://…" type="text">\n                </div>\n              </div>\n\n              <div class="eventGroupEditor__featureForm"\n                   ng-if="viewState.showButtonEditor === \'performer\'"\n                   ng-init="(mod.performers && mod.performers.length) || (mod.performers = [{ kind: \'Person\' }])">\n                <h4>Performers</h4>\n                <a class="l-close" ng-click="viewState.showButtonEditor=\'\'">hide</a>\n                <div class="eventGroupEditor__performerRow" ng-repeat="performer in mod.performers">\n                  <div class="form-group l-label">\n                    <label>Type</label>\n                    <select class="form-control" ng-model="performer.kind">\n                      <option value="Person">Person</option>\n                      <option value="Organization">Organization</option>\n                      <option value="MusicGroup">MusicGroup</option>\n                      <option value="PerformingGroup">PerformingGroup</option>\n                      <option value="DanceGroup">DanceGroup</option>\n                      <option value="TheaterGroup">TheaterGroup</option>\n                    </select>\n                  </div>\n                  <div class="form-group l-label">\n                    <label>Name</label>\n                    <input class="form-control" ng-model="performer.name" placeholder="performer name" type="text">\n                  </div>\n                  <div class="form-group">\n                    <label>Link (optional)</label>\n                    <input class="form-control" ng-model="performer.url" placeholder="https://… (optional)" type="text">\n                  </div>\n                  <a class="editor__link" ng-if="mod.performers.length > 1" ng-click="mod.performers.splice($index, 1)">remove</a>\n                </div>\n                <a class="editor__link" ng-click="mod.performers.push({ kind: \'Person\' })">&#65291;add performer</a>\n              </div>\n\n            </div>\n\n            <div class="l-imagepart">\n              <div class="eventGroupEditor__image__column__small">\n                <div class="eventGroupEditor__image__box__small">\n                  <div class="eventGroupEditor__image l-empty" ng-click="editImage($event)" ng-if="!mod.imageIdNg">\n                    <a class="l-emptyText"><i class="flaticon-plus-sign-button"></i>&nbsp;<span\n                        class="l-etext">Image</span></a>\n                  </div>\n                  <div class="eventGroupEditor__image" ng-if="mod.imageIdNg">\n                    <img alt="" image-failover ng-click="editImage($event)" ng-src="{{ smallImageURL }}">\n                    <div class="l-overlay" ng-click="editImage($event)">\n                      <button\n                          class="btn btn-siteform btn-sm" ng-click="editImage($event)"\n                          type="button">Change Image\n                      </button>\n                    </div>\n                  </div>\n                </div>\n                <div class="editor__sectionFooter" ng-if="imageURL"><a\n                    class="editor__link l-right" ng-click="removeImage()"><i class="flaticon-close47"></i> Remove</a>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div class="eventGroupEditor__recurrence">\n            <div class="form-group">\n              <div class="editor__sectionHeader">\n                <div class="l-title">Event Date and Time</div>\n              </div>\n              <when-picker class="editor__whenPicker l-inline-block" date-format="dateFormat"\n                           is-disabled="hasExternalSource"\n                           time-format="timeFormat" when="proxy.when"></when-picker>\n            </div>\n          </div>\n\n          <div class="editor__section editor__section__tags">\n            <div class="editor__sectionHeader">\n              <div class="l-title">Tags/Categories</div>\n            </div>\n            <tags-input add-from-autocomplete-only="false" allow-leftover-text="true"\n                        class="eventGroupEditor__tags"\n                        min-length="1"\n                        ng-if="tagOptionsLoaded"\n                        ng-model="proxy.tags"\n                        placeholder="add tags here"\n                        tags-reorderable\n            >\n              <auto-complete\n                  highlight-matched-text="false"\n                  load-on-empty="true"\n                  load-on-focus="true"\n                  max-results-to-show="100"\n                  min-length="0"\n                  ng-if="tagOptions"\n                  select-first-match="true"\n                  source="matchedTagOptions($query
2)">\n              </auto-complete>\n            </tags-input>\n            <div class="eventGroupEditor__managetagsLinkLeft">\n              <div ng-if="calendar.effectiveFeatureLevel <= 0">Manage Tags <span\n                  class="eventGroupEditor__subscription__warning"><span\n                  class="glyphicon glyphicon-lock"></span> subscription only</span></div>\n              <a ng-click="openTagManager()" ng-if="calendar.effectiveFeatureLevel > 0">Manage Tags</a></div>\n          </div>\n\n          <div ng-if="mod.customPreview || viewState.showCustomPreview">\n\n            <div class="editor__sectionHeader">\n              <div class="l-title">Description Preview Text</div>\n              <a class="editor__link l-right" ng-click="mod.customPreview = \'\';viewState.showCustomPreview = false"><i\n                  class="flaticon-close47"></i> Remove</a></div>\n            <div>\n              <div class="eventGroupEditor__preview__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <div class="l-label">Subscription Only</div>\n              </div>\n              <div ng-if="calendar.effectiveFeatureLevel > 0">\n                <textarea class="eventGroupEditor__preview form-control" ng-cloak ng-model="mod.customPreview"\n                          rows="4"></textarea>\n              </div>\n            </div>\n          </div>\n          <div class="editor__sectionHeader">\n            <div class="l-title">Event Description</div>\n\n            <a class="editor__link l-right"\n               ng-click="viewState.showCustomPreview = true"\n               ng-if="calendar.effectiveFeatureLevel > 0 && !mod.customPreview && !viewState.showCustomPreview">&#65291;Custom\n              Preview</a>\n\n            <span class="l-right" ng-if="calendar.effectiveFeatureLevel <= 0">\n                 &#65291;Custom Preview <span class="eventGroupEditor__subscription__warning">\n             <span class="glyphicon glyphicon-lock"></span> subscription only</span></span>\n\n\n          </div>\n\n\n          <div class="eventGroupEditor__description__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n            <div>\n              This free version of Tockify will only show the featured image to the public. No other media. <a\n                ui-sref="siteform.paidPlanPicker"><b>Upgrade Now</b></a>\n            </div>\n          </div>\n          <div>\n          <tkf-lexical-editor class="eventModEditor__description"\n                ng-model="mod.description"\n                bridge="lexicalBridge"\n                image-sets="imageSets"\n                ng-disabled="hasExternalSource">\n          </tkf-lexical-editor>\n          </div>\n          <div class="editor__pnotes">\n          <span ng-if="calendar.effectiveFeatureLevel > 0 && !mod.privateNotes && !viewState.showPrivateNotes"><a\n              class="editor__link"\n              ng-click="viewState.showPrivateNotes = true"><span class="label label-newFeature l-new">NEW</span>&nbsp;&#65291;Add Private\n            Notes</a> (not shown on calendar)</span>\n            <span ng-if="calendar .effectiveFeatureLevel <= 0 && !mod.privateNotes ">\n                 &#65291;Add Private Notes <span class="eventGroupEditor__subscription__warning"><span\n                class="glyphicon glyphicon-lock"></span> subscription only</span></span>\n          </div>\n          <div ng-if="mod.privateNotes || viewState.showPrivateNotes">\n\n            <div class="editor__sectionHeader">\n              <div class="l-title">Private Notes (not shown to end users)</div>\n              <a class="editor__link l-right" ng-click="mod.privateNotes = \'\';viewState.showPrivateNotes = false"><i\n                  class="flaticon-close47"></i> Remove</a></div>\n            <div>\n              <div class="eventGroupEditor__preview__warning" ng-if="calendar.effectiveFeatureLevel <= 0">\n                <div class="l-label">Subscription Only</div>\n                <div style="margin:30px 5px 0">\n                  {{mod.privateNotes}}\n                </div>\n              </div>\n              <div ng-if="calendar.effectiveFeatureLevel > 0">\n                <textarea class="eventGroupEditor__preview form-control" ng-cloak ng-model="mod.privateNotes"\n                          rows="4"></textarea>\n              </div>\n            </div>\n          </div>\n\n          <div class="form-group eventGroupEditor__locationTypePicker">\n            <label>Event Location Type:</label>&nbsp;&nbsp;&nbsp;<div class="btn-group">\n            <button class="btn btn-default"\n                    ng-class="{\'btn-siteform\':viewState.locationType === \'address\'}"\n                    type="button"\n                    ng-click="viewState.locationType = \'address\'">Street Address\n            </button>\n            <button class="btn btn-default"\n                    ng-class="{\'btn-siteform\':viewState.locationType === \'online\'}"\n                    type="button"\n                    ng-click="viewState.locationType = \'online\'">Online Event (link)\n            </button>\n            <button class="btn btn-default"\n                    ng-class="{\'btn-siteform\':viewState.locationType === \'both\'}"\n                    type="button"\n                    ng-click="viewState.locationType = \'both\'">Both\n            </button>\n          </div>\n          </div>\n\n          <div ng-class="{editor_onlinePadding:viewState.locationType === \'online\' }"\n               ng-if="viewState.locationType === \'online\' || viewState.locationType === \'both\'">\n            <div class="editor__sectionHeader l-onlineEvent">\n              <div class="l-title">Online Event Location</div>\n            </div>\n\n            <div class="form-group">
2\n              <span ng-if="mod.rsvpLink">\n                <input type="checkbox" ng-model="mod.where.virtualLoc.rsvpOnly"\n                       id="uVirtualRsvp" name="virtualRsvp">\n              </span>\n              \x3c!-- only want tooltip when element is disabled --\x3e\n              <span ng-if="!mod.rsvpLink" bs-tooltip data-title="Event doesn\'t use RSVP form">\n                <input type="checkbox" disabled>\n              </span>\n              Only reveal online location in RSVP confirmation message (not in calendar)\n            </div>\n\n            <div class="form-group" ng-if="hasExternalSource">\n              <span>\n                <input type="checkbox" ng-model="mod.externalVLoc"\n                       id="uExternalVLoc" name="externalVLoc">\n              </span>\n              Use Google Calendar Virtual Location (this will overwrite manual changes so they are disabled)\n            </div>\n\n\n            <div class="form-group">\n              <label>Online Event Location Title (friendy name)</label>\n              <input class="form-control" data-min-length="1" ng-model="mod.where.virtualLoc.name" ng-trim="false"\n                     id="uVirtualName" name="virtualName"\n                     placeholder="join the meeting"\n                     ng-disabled="disableVLoc"\n                     type="text">\n            </div>\n\n            <div class="form-group">\n              <label>Online Event Location Link (e.g. skype/zoom/hangouts link)</label>\n              <input class="form-control" data-min-length="1" ng-model="mod.where.virtualLoc.url" ng-trim="false"\n                     id="uVirtualURL" name="virtualURL"\n                     placeholder="Location Link, e.g. to Skype or Zoom"\n                     ng-disabled="disableVLoc"\n                     type="text">\n            </div>\n\n            <div class="form-group">\n              <label>Online Event Instructions (e.g. meeting id/key, alternative access)</label>\n              <textarea class="form-control"    ng-disabled="disableVLoc"\n                        ng-model="mod.where.virtualLoc.info" rows="4"></textarea>\n            </div>\n\n          </div>\n\n          <div ng-if="viewState.locationType === \'address\' || viewState.locationType === \'both\'">\n            <div class="editor__sectionHeader">\n              <div class="l-title">Event Location</div>\n            </div>\n\n            <div class="eventGroupEditor__where">\n              <div address-picker ng-if="mod.where" ccode="ccode" region="region" where="mod.where"></div>\n            </div>\n          </div>\n        </div>\n        <div class="eventGroupEditor__image-column">\n          <div class="editor__sectionHeader">\n            <div class="l-title">Featured Image</div>\n          </div>\n          <div class="eventGroupEditor__image__box">\n            <div class="eventGroupEditor__image l-empty" ng-click="editImage($event)" ng-if="!mod.imageIdNg">\n              <a class="l-emptyText" ng-click="editImage($event)"><i class="flaticon-plus-sign-button"></i>&nbsp;<span\n                  class="l-etext">Image</span></a>\n            </div>\n            <div class="eventGroupEditor__image" ng-if="mod.imageIdNg">\n              <div class="eventGroupEditor__image">\n                <img alt="" image-failover ng-click="editImage($event)" ng-src="{{ imageURL }}">\n                <div class="l-overlay" ng-click="editImage($event)">\n                  <button\n                      class="btn btn-siteform" ng-click="editImage($event)" type="button">Change Image\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class="editor__sectionFooter" ng-if="imageURL"><a\n              class="editor__link l-right" ng-click="removeImage()"><i class="flaticon-close47"></i> Remove</a></div>\n          <div class="editor__sectionHeader">\n            <div class="l-title">Tags/Categories</div>\n          </div>\n          <tags-input add-from-autocomplete-only="false" allow-leftover-text="true"\n                      class="eventGroupEditor__tags l-side"\n                      max-results-to-show="100"\n                      min-length="1"\n                      ng-if="tagOptionsLoaded"\n                      ng-model="proxy.tags"\n                      placeholder="add tags here"\n                      tags-reorderable\n          >\n            <auto-complete\n                highlight-matched-text="false"\n                load-on-empty="true"\n                load-on-focus="true"\n                min-length="0"\n                ng-if="tagOptions"\n                select-first-match="true"\n                source="matchedTagOptions($query
2)"></auto-complete>\n          </tags-input>\n          <div class="eventGroupEditor__managetagsLinkLeft">\n            <div ng-if="calendar.effectiveFeatureLevel <= 0">Manage Tags <span\n                class="eventGroupEditor__subscription__warning"><span\n                class="glyphicon glyphicon-lock"></span> subscription only</span></div>\n            <a ng-click="openTagManager()" ng-if="calendar.effectiveFeatureLevel > 0">Manage Tags</a></div>\n        </div>\n      </div>\n\n    </form>\n\n  </div>\n</div>\n'},7880(e){e.exports='<div class="editor__leftbar__section editor__leftbar__fixedtop">\n  <div class="editor__leftbar__backbutton">\n    <a class="btn btn-default btn-xs btn-back" ng-click="goBack($event)"><i\n        class="flaticon-arrows-1"></i><span\n        class="l-full-width">{{NavHistory.parentButtonText()}}</span><span\n        class="l-medium-width">Back</span></a>\n  </div>\n\n  <div class="editor__left__narrow__item">\n    <button ng-class="{\'btn editor__save__button\':true,\n         \'btn-siteform--green\':EventModEditor.hasUnsavedChanges,\n          \'btn-default\':!EventModEditor.hasUnsavedChanges}"\n            ng-click="saveMod($event)">Save Changes\n    </button>\n  </div>\n  <div class="editor__block">\n    <div class="l-header">Update</div>\n    <div class="l-body">\n      <button ng-class="{\'btn btn l-save\':true,\n         \'btn-siteform--green\':EventModEditor.hasUnsavedChanges,\n          \'btn-default\':!EventModEditor.hasUnsavedChanges}"\n              ng-click="saveMod($event)">Save Changes\n      </button>\n    </div>\n    <div class="l-footer">\n      <div class="l-leftbox"><a class="editor__link" ng-click="copyMod()">Copy</a></div>\n      <div class="l-rightbox" ng-if="!EventModEditor.currentMod.rid"><a class="editor__link" ng-click="removeRepeat()">Delete</a>\n      </div>\n      <div class="l-rightbox" ng-if="EventModEditor.currentMod.rid"><a class="editor__link"\n                                                                       ng-click="deleteRDateMod()">Delete</a></div>\n    </div>\n    <div class="l-footer">\n      <div class="l-rowbox"><a class="editor__link" ng-click="revertMod()">Revert to Group Defaults</a></div>\n    </div>\n    <div class="l-footer" ng-if="EventModEditor.currentMod && otherCalendars.length > 0"\n         style="display:block; padding:6px;">\n      <div ng-model="copyTarget.selected" select-model="calendarSelectModel" select-only="true" tkf-select></div>\n      <a class="editor__link" ng-click="copyToCalendar()" ng-if="copyTarget.selected"\n         style="display:block; margin-top:4px;">Copy to {{copyTarget.selected.displayName || copyTarget.selected.name}}</a>\n    </div>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted">\n    <a class="editor__link" ng-click="removeRepeat()" ng-if="!EventModEditor.currentMod.rid">Delete Event</a>\n    <a class="editor__link" ng-click="deleteRDateMod()" ng-if="EventModEditor.currentMod.rid">Delete Event</a>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted">\n    <a class="editor__link" ng-click="copyMod()">Copy Event</a>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted"\n       ng-if="EventModEditor.currentMod && otherCalendars.length > 0">\n    <div ng-model="copyTarget.selected" select-model="calendarSelectModel" select-only="true" tkf-select></div>\n    <a class="editor__link" ng-click="copyToCalendar()" ng-if="copyTarget.selected"\n       style="display:block; margin-top:4px;">Copy to {{copyTarget.selected.displayName || copyTarget.selected.name}}</a>\n  </div>\n\n  <div class="editor__left__narrow__item l-unlisted">\n    <a class="editor__link" ng-click="revertMod()">Revert to Group</a>\n  </div>\n\n</div>\n\n<div class="editor__left__narrow__item l-narrowSupport">\n  <a ng-click="showSupport()">Help and Support</a>\n</div>\n<div class="editor__leftbar__section editor__leftbar__main">\n\n  <div class="editor__block">\n    <div class="l-header">Editing one repeating event</div>\n    <div class="l-body">\n      You are editing a single event in a repeating group.\n    </div>\n    <div class="l-footer">\n      <div class="l-rowbox">\n        <a class="editor__link" ui-sref="^.groupeditor({uid:EventModEditor.currentGroup.uid})">Edit Group Instead</a>\n      </div>\n    </div>\n  </div>\n  <div class="editor__block">\n    <div class="l-body l-center">\n      <a ng-click="showSupport()">
2Help and Support</a>\n    </div>\n  </div>\n\n\n</div>\n\n'},9541(e){e.exports='<div class="fileManager">\n  <div class="fileManager__top">\n\n    <div class="fileManager__close"><a href="" ng-click="doClose()"><i\n        class="flaticon-close-1"></i></a></div>\n    <span class="fileManager__uploadText">Upload files then attach them to your events</span>\n    <button class="btn btn-siteform fileManager__newFileButton" file-upload-button\n            on-upload-complete="newFileUploaded(info)">Upload A File\n    </button>\n    <div class="input-group search-box"><input aria-label="search" class="form-control" name="search"\n                                               ng-model="pageState.search"\n                                               ng-model-options="{ updateOn: \'blur default\', debounce: {\'default\':500, \'blur\': 0}}"\n                                               placeholder="{{\'search attachments\' | translate}}"\n                                               type="text"\n    ><span class="input-group-btn"><a\n        class="btn btn-default viewer__navbar__button" ng-click="clearSearch()"><i\n        class="flaticon-close-1 l-search"></i></a></span></div>\n\n  </div>\n  <div class="fileManager__top--spacer"></div>\n\n  <div class="fileManager__attachments">\n    <h4>Attached Files (Up to {{MAX_ATTACHMENTS}})</h4>\n    \x3c!-- show attachments at top or in other column--\x3e\n    <div class="fileManager__attachments__empty" ng-if="attachments.length===0">No Attachments</div>\n    <div>\n      <div class="fileManager__attachments__listEntry"\n           ng-repeat="file in attachedFiles track by file._id">\n        <div class="fileManager__attachment__remove" ng-click="toggleAttached(file)"><i class="flaticon-close-1"></i>\n        </div>\n        <div>{{file.name}}</div>\n        <div ng-if="hasRsvp" class="checkbox">\n          <label class="l-rsvpLabel"><input ng-model="file.rsvpOnly"\n                                            ng-click="toggleRsvp(file)" type="checkbox"> <span class="l-labelText">Only give to people who RSVP</span></label>\n          <div class="l-explanation">If checked this file won\'t be shown in your calendar but will be sent to people who\n            RSVP\n          </div>\n        </div>\n        <div class="fileManager__attachments__listEntry__detail">{{file.mime}} {{file.size | formatBytes}}\n          {{file.created | formatCreated}}\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class="fileManager__fileList">\n    \x3c!-- show attachments at top or in other column--\x3e\n\n    <div ng-class="{\'fileManager__listEntry\':true, \'is-attached\':file.isAttached}"\n         ng-click="toggleAttached(file)"\n         ng-repeat="file in fileProxies track by file._id"\n    >\n      <div>\n        <input ng-checked="file.isAttached"\n               ng-disabled="attachments.length >= MAX_ATTACHMENTS && !file.isAttached"\n               type="checkbox"> {{file.name}}\n        <div class="fileManager__listEntry__detail">{{file.mime}} {{file.size | formatBytes}} {{file.created |\n          formatCreated}}\n        </div>\n        <div class="fileManager__listEntry__delete">\n          <a class="l-remove"\n             ng-click="deleteFile(file, $event)"><i\n              class="flaticon-delete"></i></a>\n        </div>\n      </div>\n    </div>\n\n    <div class="fileManager__loadMoreSection">\n      <div class="listStatus d-listStatusText listStatus--hasMore " ng-if="files.length > 0 && pageState.maybeHasNext">\n        <a class="btn btn-loadMore" href="" ng-click="loadMore($event)">Load More Files</a>\n      </div>\n      <div ng-if="files.length > 0 && !pageState.maybeHasNext && images.length != 0">\n        <div class="listStatus d-listStatusText listStatus--noMore">No More Files</div>\n      </div>\n      <div ng-if="files.length === 0 && !pageState.search">\n        <div class="listStatus d-listStatusText listStatus--noMore">You haven\'t uploaded any files yet</div>\n      </div>\n      <div ng-if="files.length === 0 && pageState.search">\n        <div class="listStatus d-listStatusText listStatus--noMore">No files match the search</div>\n      </div>\n\n    </div>\n\n  </div>\n</div>'},320(e){e.exports='<div class="imageLibrary__activeImage__wrapper">\n  <div class="imageLibrary__activeImage">\n    <div class="imageLibrary__popup__top" ng-if="dialog !== \'manage\'">\n      <div class="l-left">\n  <span class="l-addToDescription" ng-if="dialog === \'featured\'">\n          <label>\n            <input ng-model="pageState.addToDescription" type="checkbox"> Also add to Event Description\n          </label>\n        </span>\n      </div>\n      <div class="l-right">\n        <button class="btn btn-siteform" ng-click="selectImage(pageState.activeImage)">Use This Image</button>\n      </div>\n    </div>\n\n    <div class="imageLibrary__popup__main">\n      <div class="imageLibrary__imageBox imageLibrary__imageBox--active">\n        <img ng-src="{{pageState.activeImage.getThumbUrl()}}">\n      </div>\n      <div class="imageLibrary__details">\n        <a class="l-edit"\n           ng-click="toggleEdit()"\n           ng-if="pageState.imageLibrary == \'user\'"><i\n            class="flaticon-draw"></i></a>\n        <div class="form-group">\n          <label>Image Name</label>\n          <div class="imageLibrary__imageName" ng-if="!pageState.editImageName">
2\n            <span><span ng-if="pageState.activeImage.name">{{pageState.activeImage.name}}</span>\n              <span class="l-faded"  ng-if="!pageState.activeImage.name">(blank)</span>\n            </span></div>\n          <div ng-if="pageState.editImageName" class="imageLibrary__details__name">\n            <input class="form-control" ng-model="pageState.activeImage.name" type="text">\n          </div>\n          <label>Image Alt Text (shown on screen readers)</label>\n          <div class="imageLibrary__imageName" ng-if="!pageState.editImageName"><span\n          ><span ng-if="pageState.activeImage.altText"\n          >{{pageState.activeImage.altText}}</span>\n            <span class="l-faded" ng-if="!pageState.activeImage.altText">(none)</span></span>\n          </div>\n          <div ng-if="pageState.editImageName" class="imageLibrary__details__name">\n            <input class="form-control" ng-model="pageState.activeImage.altText" type="text">\n          </div>\n          <label>Image Tags (for searching images)</label>\n          <div class="imageLibrary__imageTags" ng-if="!pageState.editImageName">\n            <span>{{displayTags()}}<span class="l-faded" ng-if="!displayTags()">(none)</span></span>\n          </div>\n          <div ng-if="pageState.editImageName" class="imageLibrary__editTags">\n            <tags-input class="imageLibrary__activeImage__tags"\n                        min-length="1"\n                        ng-model="pageState.tags"\n                        placeholder="click to add tags"\n            >\n              <auto-complete\n                  highlight-matched-text="false"\n                  load-on-empty="true"\n                  load-on-focus="true"\n                  max-results-to-show="100"\n                  min-length="0"\n                  ng-if="pageState.tagOptions.length"\n                  select-first-match="true"\n                  source="matchedTagOptions($query)">\n              </auto-complete>\n            </tags-input>\n          </div>\n        </div>\n        <div class="l-defaultImage">\n          <div>\n            <label>\n              <input ng-click="setDefaultImage(pageState.activeImage.id)"\n                     ng-if="calendar.defaultImageId!==pageState.activeImage.id" type="checkbox">\n              <input checked\n                     ng-click="removeDefaultImage()" ng-if="calendar.defaultImageId===pageState.activeImage.id"\n                     type="checkbox"> Use as default Image\n            </label>\n          </div>\n        </div>\n        <a class="l-remove"\n           ng-click="removeImage(pageState.activeImage)"\n           ng-if="pageState.imageLibrary == \'user\'"><i\n            class="flaticon-delete"></i></a>\n      </div>\n\n    </div>\n    \x3c!--<div class="imageLibrary__popup__footer">--\x3e\n    \x3c!--</div>--\x3e\n  </div>\n</div>\n'},8007(e){e.exports='<div class="imageLibrary">\n    <div ng-if="mode.select" class="imageLibrary__top">\n        <div>\n            <div class="imageLibrary__select">\n                <a href="" ng-click="selectMode(false)"><i class="flaticon-close-1"></i></a>\n                <label>\n                    {{selectedImages()}} selected\n                </label>\n                <button class="btn btn-danger" ng-click="deleteSelected()">Delete\n                </button>\n            </div>\n            <div class="imageLibrary__selectTags">\n                <tags-input class="imageLibrary__activeImage__tags"\n                            min-length="1"\n                            ng-model="pageState.selectedTags"\n                            placeholder="add/remove tags"\n                >\n                    <auto-complete\n                        highlight-matched-text="false"\n                        load-on-empty="true"\n                        load-on-focus="true"\n                        max-results-to-show="100"\n                        min-length="0"\n                        ng-if="pageState.tagOptions.length"\n                        select-first-match="true"\n                        source="matchedTagOptions($query
2)">\n                    </auto-complete>\n                </tags-input>\n                <button class="btn btn-primary" ng-disabled="!tagsModified()" ng-click="changeTags()">Change Tags\n                </button>\n            </div>\n            <div class="imageLibrary__close"><a href="" ng-click="close()"><i class="flaticon-close-1"></i></a></div>\n        </div>\n    </div>\n\n    <div ng-if="!mode.select" class="imageLibrary__top">\n        <div class="btn-group">\n            <button ng-class="{\'btn imageLibrary__switcher__btn\':true,\n                            \'btn-default\':(pageState.imageLibrary !== \'builtin\'),\n                            \'btn-siteform\':(pageState.imageLibrary === \'builtin\')\n                           }"\n                    ng-click="pageState.imageLibrary = \'builtin\'"\n                    type="button"\n            >Image Library\n            </button>\n\n            <button ng-class="{\'btn imageLibrary__switcher__btn\':true,\n                            \'btn-default\':(pageState.imageLibrary !== \'user\'),\n                            \'btn-siteform\':(pageState.imageLibrary === \'user\')\n                           }"\n                    ng-click="pageState.imageLibrary = \'user\'"\n                    type="button"\n            >Your Images\n            </button>\n\n\n            <select ng-if="sharedUsers.length > 1"\n                ng-class="{\'btn imageLibrary__switcher__btn\':true,\n                            \'btn-default\':(pageState.imageLibrary !== \'shared\'),\n                            \'btn-siteform\':(pageState.imageLibrary === \'shared\')\n                           }"\n                    ng-click="pageState.imageLibrary = \'shared\'"\n                    ng-model="pageState.selectedUser.id"\n                    ng-options="u.id as u.label for u in sharedUsers">\n            </select>\n\n        </div>\n\n        <button class="btn btn-siteform imageLibrary__newImageButton" image-upload-button\n                on-upload-complete="newImageUploaded(info)">Upload Image\n        </button>\n\n        <datalist id="tagsList">\n            <option ng-repeat="t in pageState.tagOptions" name={{t.text}} value="{{t.text}}">\n        </datalist>\n\n        <div class="input-group search-box"><input aria-label="search" class="form-control" name="search"\n                                                   ng-model="pageState.search"\n                                                   ng-model-options="{ updateOn: \'blur default\', debounce: {\'default\':500, \'blur\': 0}}"\n                                                   placeholder="{{\'search images\' | translate}}"\n                                                   type="text"\n                                                   autocomplete="off"\n                                                   list="tagsList"\n        /><span class="input-group-btn"><a\n                class="btn btn-default viewer__navbar__button" ng-click="clearSearch()"><i\n                class="flaticon-close-1 l-search"></i></a></span></div>\n\n        <div class="imageLibrary__close"><a href="" ng-click="close()"><i\n                class="flaticon-close-1"></i></a></div>\n    </div>\n\n    <div class="imageLibrary__top--spacer"></div>\n\n    <div class="imageLibrary__imageGrid">\n        <div class="imageLibrary__empty" ng-if="images.length === 0 && pageState.loadedImages && !pageState.search">\n            <div ng-if="pageState.imageLibrary != \'shared\'" class="imageLibrary__emptyNotice">\n                <div>You haven\'t uploaded any images yet.</div>\n            </div>\n            <div ng-if="pageState.imageLibrary != \'shared\'">\n                <button class="btn btn-lg btn-siteform" ng-click="pageState.imageLibrary = \'builtin\'"\n                    type="button">Use Built In Image Library\n                </button>\n            </div>\n            <div ng-if="pageState.imageLibrary == \'shared\'" class="imageLibrary__emptyNotice">\n                <div ng-if="!pageState.selectedUser.id">Please select user to see their images.</div>\n                <div ng-if="pageState.selectedUser.id">No shared images for selected user.</div>\n            </div>\n        </div>\n        <div class="imageLibrary__empty" ng-if="images.length === 0 && pageState.loadedImages && pageState.search">\n            <div class="imageLibrary__emptyNotice">No matching Images\n            </div>\n            <div>\n                <button class="btn btn-siteform" ng-click="clearSearch()"\n                        type="button">Clear Search\n                </button>\n            </div>\n        </div>\n\n        <div class="imageLibrary__imageBox imageLibrary__imageBox--grid"\n             ng-class="{imageLibrary__selectMode: mode.select}"\n             ng-repeat="image in images">\n\n            <input type="checkbox" ng-model="image.selected">\n            <label class="image-checkbox-label" ng-click="checkImage(image, $event)">
2\n                <span class="image-checkbox image-checkbox-img" ng-click="selectMode(true)"></span>\n                <img image-failover ng-src="{{image.getThumbUrl()}}">\n            </label>\n\n            <div>\n                <input type="text" ng-model="image.name"\n                       ng-keyup="$event.keyCode == 13 ? maybeChangeImageName(image) : null"\n                       ng-focus="$event.target.select()"\n                       ng-blur="maybeChangeImageName(image)">\n            </div>\n        </div>\n\n    </div>\n\n    <div class="imageLibrary__loadMoreSection">\n        <div class="listStatus d-listStatusText listStatus--hasMore " ng-if="pageState.maybeHasNext">\n            <a class="btn btn-loadMore" href="" ng-click="loadMore($event)">Load More Images</a>\n        </div>\n        <div ng-if="!pageState.maybeHasNext && images.length != 0">\n            <div class="listStatus d-listStatusText listStatus--noMore">No More Images</div>\n        </div>\n\n    </div>\n\n</div>\n'},9085(e){e.exports='<div class="tkf__link-editor">\n  <legend>Add or Edit Link</legend>\n\n  <form novalidate>\n    <div class="form-group">\n      <label class="control-label">A link to some page</label>\n      <input class="form-control" data-min-length="1" ng-model="viewState.href" placeholder="url"\n             type="text">\n    </div>\n    <div class="form-group" ng-if="!viewState.isImage">\n      <label class="control-label">Text to show for this link</label>\n      <input class="form-control" data-min-length="1" ng-keyup="viewState.textTouched = true" ng-model="viewState.text"\n             placeholder="some text" type="text">\n    </div>\n    <div class="form-group">\n      <label class="control-label">Hover Tooltip</label>\n      <input class="form-control" data-min-length="1" ng-model="viewState.title" placeholder="hover tooltip"\n             type="text">\n    </div>\n\n    <div class="form-group ">\n      <div class="radio">\n        <label>\n          <input ng-model="viewState.target" type="radio" value="_blank"> Open in new tab</label>\n        <label>\n          <input ng-model="viewState.target" type="radio" value="_top"> Open in current tab</label>\n      </div>\n    </div>\n\n    <div class="popup-buttons">\n      <button class="btn btn-default" ng-click="cancel($event)" type="button">Cancel Changes</button>\n      <button ng-if="viewState.canUnlink" class="btn btn-default" ng-click="saveEdit($event, \'unlink\')" type="button">Unlink</button>\n      <button class="btn btn-siteform" ng-click="saveEdit($event)" type="button">Save Link</button>\n    </div>\n\n\n  </form>\n\n\n</div>\n'},3411(e){e.exports='<div class="tkf__notice" ng-if="user && !user.seenPP">\n\n  <p><b>Privacy Policy Change May 25th 2018</b></p>\n  <p>We\'ve updated our Privacy Policy to comply with the new EU privacy laws known as GDPR.</p>\n  <p><a class="l-bigger" target="_blank" ui-sref="docs.inter.company.privacy">Read the new privacy policy</a></p>\n  <p><a target="_blank" ui-sref="docs.inter.company.gdpr">Learn more about what GDPR means to Tockify</a></p>\n\n  <div style="margin-top:6px">\n    <button class="btn btn-default" ng-click="markPPSeen()">Dismiss: I know about the new Privacy Policy</button>\n  </div>\n\n</div>'},2641(e){e.exports='\x3c!-- delay render until initial config values are ready - this timepicker isn\'t dynamic --\x3e\n<div class="when-picker" ng-if="ANGULAR_DATE_FORMAT">\n  <div class="when-picker__block" ng-if="pickerLabel">\n    <div class="when-picker__group">\n      <label></label>\n      <div class="when-picker__text">{{pickerLabel}}</div>\n    </div>\n  </div>\n  <div class="when-picker__block">\n    <div class="when-picker__group">\n      <label>from</label>\n      <div class="when-picker__date">\n        <div class="tkfSelect__input">\n          <input bs-datepicker class="form-control"\n                 data-autoclose="1"\n                 data-date-format="{{ANGULAR_DATE_FORMAT}}"\n                 data-date-type="string"\n                 data-start-week="{{wkstart}}"\n                 ng-blur="render()"\n                 ng-model="textDateTime.start.date"\n                 placeholder="start date" type="text">\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>\n    </div>\n    <div class="when-picker__group" ng-if="showTime">\n      <label>at</label>\n      <div class="when-picker__time" ng-model="textDateTime.start.time" select-model="selectModel" tkf-select></div>\n    </div>\n  </div>\n  <div class="when-picker__group">\n    <label></label>\n    <div class="when-picker__text">\n      <a class="editor__link" ng-click="addRepeat()">&#65291;Add date</a>\n    </div>\n  </div>\n</div>\n\n'},2965(e){e.exports='<div class="rrule__editor" ng-if="rrule">\n\n  <div class="form-group">\n    <when-picker class="l-inline-block" date-format="dateFormat" is-disabled="isDisabled" picker-label="\'First Event\'"\n                 time-format="timeFormat" when="proxy.when"></when-picker>\n  </div>\n  \x3c!--DATEFORMAT:{{dateFormat}} <br>--\x3e\n\n  <div class="rrule__repeats form-group">\n    <div class="l-inline-label">Repeating</div>\n    <div class="rrule__labelled_dropdown">\n      \x3c!--<label>How Often</label>--\x3e\n      <div class="rrule__interval-picker" is-disabled="isDisabled" ng-model="rrule.interval"\n           select-model="intervalSelectModel"\n           tkf-select></div>\n    </div>\n    <div class="rrule__labelled_dropdown">\n      \x3c!--<label>Frequency</label>--\x3e\n      <div class="rrule__freq-picker" is-disabled="isDisabled" ng-model="rrule.freq" select-model="freqSelectModel"\n           tkf-select></div>\n    </div>\n    <div class="rrule__labelled_dropdown">\n      \x3c!--<label>Ends</label>
2--\x3e\n      <div ng-class="{\'tkfSelect__input\':true,\'tkfSelect__input--disabled\':isDisabled}">\n        <div class="rrule__ends form-control" ng-click="showEndPicker()" ng-if="!isDisabled">\n          {{viewState.ends}}\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n        <div class="rrule__ends form-control" ng-disabled="isDisabled" ng-if="isDisabled">\n          {{viewState.ends}}\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>\n    </div>\n\n    <a class="editor__link rrule_removeRepeats" ng-click="removeRepeats()" ng-if="!isDisabled">Remove repeats</a>\n\n  </div>\n\n  <div class="rrule__description">\n    {{viewState.description}}\n    <a class="editor__link"\n       ng-click="viewState.showRRuleDetail=true"\n       ng-if="!isDisabled && !viewState.showRRuleDetail && rrule.freq !== \'daily\' && rrule.freq !== \'yearly\'">Change</a>\n  </div>\n\n  <div class="rrule__invalid-mods-warning" ng-if="viewState.untilInvalid">\n    ERROR: No repeats occur "{{viewState.description}}" between the First Event date and the Until date.\n    <br/>\n    Please modify or remove the repeat details.\n  </div>\n\n  <div class="rrule__ends-picker__pattern" ng-if="viewState.showRRuleDetail">\n\n    <div ng-if="rrule.freq===\'daily\'">\n\n    </div>\n    <div class="rrule__repeat-picker" ng-if="rrule.freq===\'weekly\'">\n      <h4>Choose the days your event repeats on</h4>\n      <a class="l-close" ng-click="viewState.showRRuleDetail=false">Close</a>\n      <label ng-class="{\'rrule__option rrule__weekday\':true,\'l-active\':!!rrule.byday[$index+1]}"\n             ng-repeat="day in weekdays">\n\n        <input\n            name="weekdays[]"\n            ng-false-value="{{unset}}"\n            ng-model="rrule.byday[$index+1]"\n            ng-true-value="[]"\n            type="checkbox"\n        > {{day}}\n      </label>\n    </div>\n    <div ng-if="rrule.freq===\'monthly\'">\n\n      <div class="rrule__repeat-picker rrule__monthdates" ng-if="viewState.monthlyType === \'date\'">\n        <div class="rrule__month__switcher">\n          <label class="radio-inline">\n            <input name="monthlyType" ng-model="viewState.monthlyType"\n                   ng-value="\'day\'" type="radio">pick repeat days</label>\n          <label class="radio-inline">\n            <input name="monthlyType" ng-model="viewState.monthlyType"\n                   ng-value="\'date\'" type="radio">pick repeat dates</label>\n        </div>\n        <h4>Choose the dates your event repeats on</h4>\n        <a class="l-close" ng-click="viewState.showRRuleDetail=false">Close</a>\n        <label ng-class="{\'rrule__option rrule__monthdate\':true,\'l-active\':rrule.bymonthday.indexOf(date.value) !== -1}"\n               ng-repeat="date in monthDates"><input\n            checklist-model="rrule.bymonthday"\n            checklist-value="date.value"\n            name="monthdates"\n            type="checkbox"> {{date.label}}</label>\n        <div class="rrule__monthdates--negative">\n          <label\n              ng-class="{\'rrule__option rrule__monthdate l-negative\':true,\'l-negative-active\':rrule.bymonthday.indexOf(date.value) !== -1}"\n              ng-repeat="date in negativeMonthDates">\n            <input\n                checklist-model="rrule.bymonthday"\n                checklist-value="date.value"\n                name="monthdates"\n                type="checkbox"\n            > {{date.label}}\n          </label>\n        </div>\n      </div>\n\n      <div class="rrule__repeat-picker rrule__monthday-picker" ng-if="viewState.monthlyType !== \'date\'">\n        <div class="rrule__month__switcher">\n          <label class="radio-inline">\n            <input name="monthlyType" ng-model="viewState.monthlyType"\n                   ng-value="\'day\'" type="radio">pick repeat days</label>\n\n          <label class="radio-inline">\n            <input name="monthlyType" ng-model="viewState.monthlyType"\n                   ng-value="\'date\'" type="radio">pick repeat dates</label>\n\n        </div>\n        <h4>Choose the dates your event repeats on</h4>\n        <a class="l-close" ng-click="viewState.showRRuleDetail=false">Close</a>\n        <div class="rrule__monthdays">\n          <div bugctr="{{bugctr}}" class="rrule__monthday" ng-repeat="day in weekdays">\n            <div class="rrule__monthday__daylabel">{{day}}</div>\n            <div class="rrule__monthday__all"><a ng-click="selectAllMonthDays($index+1)">All</a></div>\n            <div ng-repeat="week in monthWeeks">\n              <label\n                  ng-class="{\'rrule__option rrule__monthday__option\':true,\'l-active\':rrule.byday[$parent.$index+1] && rrule.byday[$parent.$index+1].indexOf(week.value) !== -1}">\n                <input\n                    checklist-model="rrule.byday[$parent.$index+1]"\n                    checklist-value="week.value"\n                    name="monthweeks[]"\n                    type="checkbox"> {{week.label}}</label>\n            </div>\n            <div class="rrule__monthday__clear"><a ng-click="clearMonthDays($index+1)">Clear</a></div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div ng-if="rrule.freq===\'yearly\'">\n\n\n    </div>\n  </div>\n\n  <div class="rrule__changeTable" ng-if="changeTable.length > 0">\n    <div ng-if="!viewState.showMods">Some events in this repeating group have been individually modified:\n      <a class="editor__link" ng-click="viewState.showMods=true">Show details</a>\n    </div>\n    <div class="rrule__invalid-mods-warning" ng-if="viewState.hasInvalidMods">\n      Some of the modified events no longer have any effect because the repetition pattern\n      has changed and they are no longer in the group.\n    </div>\n\n    <div class=".eventGroupEditor__promotionButtonForm" ng-if="viewState.showMods">\n      <div class="l-header">These event repeats have been individually modified\n        <a class="editor__link" ng-click="viewState.showMods=false">hide details</a></div>\n      <table>\n        <thead>\n        <tr>\n          <th>Date/Time</th>\n          <th>Type</th>\n          <th class="l-centered">Change</th>\n          <th class="l-centered">Remove</th>\n        </tr>\n        </thead>\n        <tr ng-repeat="change in changeTable">\n          <td>{{change.originalDateTime}}</td>\n          <td class="l-centered">{{change.description}}</td>\n          <td class="l-centered">\n            \x3c!-- External-source (Google-synced) groups: repeats are read-only --\x3e\n            <sp
2an ng-if="isDisabled">-</span>\n            <a class="editor__link" ng-if="!isDisabled && change.type === \'changed_ok\'"\n               ui-sref="^.modeditor({uid:uid, tid:change.tid, rid:change.rid})">Edit Modified Event</a>\n            <a class="editor__link" ng-click="removeExdate(change.tid)"\n               ng-if="!isDisabled && change.type === \'removed_ok\'">Put Back</a>\n            <a class="editor__link" ng-click="convertInvalidRepeat(change.tid)"\n               ng-if="!isDisabled && change.type === \'changed_invalid\'">Convert To Extra Event</a>\n            <span ng-if="!isDisabled && change.type === \'removed_invalid\'">-</span>\n          </td>\n          <td class="l-centered">\n            <span ng-if="isDisabled">-</span>\n            <a class="editor__link" ng-click="revertMod(change.tid,change.rid)" ng-if="!isDisabled && change.type === \'changed_ok\'">Revert</a>\n            <span ng-if="!isDisabled && change.type === \'removed_ok\'">-</span>\n            <a class="editor__link" ng-click="removeMod(change.tid,change.rid)"\n               ng-if="!isDisabled && change.type === \'changed_invalid\'">Delete</a>\n            <a class="editor__link" ng-click="removeExdate(change.tid)"\n               ng-if="!isDisabled && change.type === \'removed_invali
2d\'">Delete</a>\n          </td>\n        </tr>\n      </table>\n    </div>\n  </div>\n\n  \x3c!-- this is absolutely positioned so out of flow--\x3e\n  <div class="rrule__clickPane" ng-click="hideEndPicker($event,true)" ng-show="viewState.showEndPicker"></div>\n  <div class="rrule__ends-picker" ng-show="viewState.showEndPicker">\n    <div class="l-row form-inline">\n\n      <label><input checked name="rruleEndPicker" ng-model="viewState.rruleEndPicker"\n                    type="radio" value="never"><span class="l-pre"></span>Forever</label>\n    </div>\n    <div class="l-row form-inline">\n      <label>\n        <input name="rruleEndPicker" ng-model="viewState.rruleEndPicker" type="radio"\n               value="count"><span class="l-pre"></span><input\n          class="form-control l-count"\n          min="0" ng-blur="syncProxyCount()" ng-disabled="viewState.rruleEndPicker !== \'count\'"\n          ng-model="proxy.count"\n          placeholder="number"\n          step="1"\n          type="number"><span class="l-post">Times</span>\n      </label>\n    </div>\n    <div class="l-row form-inline">\n      <label><input name="rruleEndPicker" ng-model="viewState.rruleEndPicker" type="radio"\n                    value="until"><span class="l-pre--until">Until</span><input bs-datepicker\n                                                                                class="form-control l-until"\n                                                                                data-autoclose="1"\n                                                                                data-date-format="{{ANGULAR_DATE_FORMAT}}"\n                                                                                data-date-type="string"\n                                                                                data-start-week="{{wkstart}}"\n                                                                                ng-blur="syncProxyUntil()"\n                                                                                ng-disabled="viewState.rruleEndPicker !== \'until\'"\n                                                                                ng-model="proxy.until"\n                                                                                placeholder="end date"\n                                                                                type="text"></label>\n    </div>\n    <div class="l-buttons">\n      <button class="btn btn-siteform" ng-click="hideEndPicker($event)">Done</button>\n    </div>\n  </div>\n\n</div>\n'},6793(e){e.exports='<div class="tkf__helpSupport">\n  <h2>Help and Support</h2>\n  <div class="l-breakLine"></div>\n\n  <h4>Documentation Links</h4>\n\n  <ul>\n    <li><a target="_blank" ui-sref="docs.inter.install">How to Install Tockify</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.faq.subscription">Subscription Questions</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.howto.usersubmit">Accepting Community Submitted Events</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.howto.googlesync">Syncing With Google Calendar</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.howto.whitelabel">White Label Calendars</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.howto.addcalendars">Getting More Calendars</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.faq.technical">Technical Questions</a></li>\n    <li><a target="_blank" ui-sref="docs.inter.api.embed">Embedding API for Developers (technical)</a></li>\n  </ul>\n\n  <div class="tkf__helpSupport__button">\n    <a class="btn btn-siteform btn-lg btn-block" ng-href="{{supportUrl}}">Click to Contact Support</a>\n    <div class="tkf__helpSupport__emailLink"> or email [email protected]</div>\n  </div>\n\n</div>'},1317(e){e.exports='<div ng-class="{\'rrule__clickPane\':viewState.clickPane}" ng-click="clickClickPane($event,true)"\n     ng-show="viewState.clickPane"></div>\n<div class="{{pickerQualifier}} tkfSelect" ng-class="{\'l-ontop\':viewState.clickPane}">\n  <div class="tkfSelect__input">\n\n    <div class="tkfSelect__input__readOnly" ng-click="toggleMenu($event)"\n         ng-if="selectOnly">{{viewState.selection || \'&nbsp\'}}
2\n    </div>\n    <input class="form-control" ng-blur="hideMenu()" ng-disabled="isDisabled" ng-focus="showMenu()"\n           ng-if="!selectOnly"\n           ng-keydown="onKeyDown($event)"\n           ng-keyup="onKeyUp($event)"\n           ng-model="viewState.selection"\n           ng-model-options="{ updateOn: \'blur returnKeyPressed\'}"\n           type="text">\n    <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n  </div>\n  <div class="{{pickerQualifier}} tkfSelect__options__wrap" ng-show="viewState.menuOpen" ng-style="{width:inputWidth}">\n    <ul class="tkfSelect__options" ng-style="{width:inputWidthExtra}"\n    >\n      <li ng-class="{activeItem:($index === viewState.activeListIndex)}"\n          ng-mousedown="select(option)"\n          ng-mouseenter="viewState.activeListIndex = $index"\n          ng-repeat="option in options track by $index">{{option}}\n      </li>\n    </ul>\n  </div>\n</div>\n\n'},2889(e){e.exports='<div class="tkf__video-picker">\n  <h2>Choose a Video</h2>\n\n  <div class="form-group">\n    \x3c!--<label>YouTube or Vimeo URL</label>--\x3e\n    <input class="form-control" data-min-length="1" ng-model="viewState.url"\n           placeholder="YouTube, Facebook or Vimeo url"\n           type="text">\n  </div>\n\n  <div ng-if="viewState.hasMatch === false">\n    <div class="tkf__video-picker__preview--placeholder">\n      <div>Video Preview</div>\n    </div>\n    <div class="tkf__video-picker__nomatch">\n      <div ng-show="viewState.url && viewState.url.trim().length > 8">No Matching Video - Please Check the URL</div>\n      <div ng-show="!viewState.url || viewState.url.trim().length <=8">Add A Video URL Above</div>\n    </div>\n  </div>\n\n  <div class="tkf__video-picker__previewSection" ng-if="viewState.hasMatch">\n\n    <div class="tkf__video-picker__preview" ng-bind-html="embedCode">\n\n    </div>\n    <div class="tkf__video-picker__buttons">\n      <button class="btn btn-large btn-siteform" ng-click="selectVideo($event)">Use This Video</button>\n    </div>\n\n  </div>\n\n\n</div>\n'},8863(e){e.exports='\x3c!-- delay render until initial config values are ready - this timepicker isn\'t dynamic --\x3e\n<div class="when-picker" ng-if="ANGULAR_DATE_FORMAT">\n  <div class="when-picker__block" ng-if="pickerLabel">\n    <div class="when-picker__group">\n      <label></label>\n      <div class="when-picker__text">{{pickerLabel}}</div>\n    </div>\n  </div>\n  <div class="when-picker__block">\n    <div class="when-picker__group">\n      <label>from</label>\n      <div class="when-picker__date">\n        <div class="tkfSelect__input">\n          <input bs-datepicker class="form-control" data-autoclose="1"\n                 data-date-format="{{ANGULAR_DATE_FORMAT}}"\n                 data-date-type="string"\n                 data-start-week="{{wkstart}}"\n                 ng-blur="render()"\n                 ng-disabled="isDisabled"\n                 ng-model="textWhen.start.date"\n                 placeholder="start date" type="text">\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>\n    </div>\n    <div class="when-picker__group" ng-if="!when.allDay">\n      <label>at</label>\n      <div class="when-picker__time" is-disabled="isDisabled" ng-model="textWhen.start.time" select-model="selectModel"\n           tkf-select></div>\n    </div>\n  </div>\n  <div class="when-picker__block">\n    <div class="when-picker__group"><label\n        class="when__pickerText"></label>\n      <div class="when-picker__text">-</div>\n    </div>\n  </div>\n  <div class="when-picker__block">\n    <div class="when-picker__group">\n      <label>to</label>\n      <div class="when-picker__date">\n        <div class="tkfSelect__input">\n          <input bs-datepicker class="form-control" data-autoclose="1"\n                 data-date-format="{{ANGULAR_DATE_FORMAT}}"\n                 data-date-type="string"\n                 data-start-week="{{wkstart}}"\n                 ng-blur="render()"\n                 ng-disabled="isDisabled"\
2n                 ng-model="textWhen.end.date"\n                 placeholder="end date" type="text">\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>\n    </div>\n    <div class="when-picker__group" ng-if="!when.allDay">\n      <label>at</label>\n      <div class="when-picker__time" is-disabled="isDisabled" ng-model="textWhen.end.time" select-model="selectModel"\n           tkf-select></div>\n    </div>\n    \x3c!--<div class="when-picker__block">--\x3e\n    <div class="when-picker__group">\n      <label></label>\n\n      <div class="when-picker__text">\n        <label><input ng-disabled="isDisabled" ng-false-value="false" ng-model="when.allDay" ng-true-value="true"\n                      type="checkbox">&nbsp;All day?</label>\n      </div>\n    </div>\n  </div>\n</div>\n<div>\n</div>\n\n<div class="when-picker__zone" ng-if="isDisabled"><label>timezone</label>&nbsp{{when.tzid}}</div>\n\n<div class="when-picker__zone" ng-if="!isDisabled && !pageState.editTimezone"><label>timezone</label>&nbsp;<a\n    class="editor__link" ng-click="pageState.editTimezone = true">{{when.tzid}}</a>\n</div>\n<div ng-if="!isDisabled && pageState.editTimezone"><label>timezone</label>\n  <div class="when-picker__zone-picker" ng-model="when.tzid" select-model="tzSelectModel"\n       tkf-select></div>\n</div>'},251(e){e.exports='<div class="toolbar" onmousedown="event.preventDefault()">\n  <button ng-disabled="isDisabled || !canUndo" ng-click="undo()" class="toolbar-item" aria-label="Undo">\n    <span ng-bind-html="icons.undo"></span>\n  </button>\n  <button ng-disabled="isDisabled || !canRedo" ng-click="redo()" class="toolbar-item" aria-label="Redo">\n    <span ng-bind-html="icons.redo"></span>\n  </button>\n\n  <div class="toolbar-divider"></div>\n\n  <button ng-disabled="isDisabled" ng-click="formatHeading(\'h2\')" ng-class="{\'active\': blockType === \'h2\'}" class="toolbar-item">\n    <span ng-bind-html="icons.heading1"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="formatHeading(\'h3\')" ng-class="{\'active\': blockType === \'h3\'}" class="toolbar-item">\n    <span ng-bind-html="icons.heading2"></span>\n  </button>\n\n  <div class="toolbar-divider"></div>\n\n  <button ng-disabled="isDisabled" ng-click="formatText(\'bold\')" ng-class="{\'active\': isBold}" class="toolbar-item" aria-label="Format Bold">\n    <span ng-bind-html="icons.bold"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="formatText(\'italic\')" ng-class="{\'active\': isItalic}" class="toolbar-item" aria-label="Format Italics">\n    <span ng-bind-html="icons.italic"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="formatText(\'underline\')" ng-class="{\'active\': isUnderline}" class="toolbar-item" aria-label="Format Underline">\n    <span ng-bind-html="icons.underline"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="formatText(\'strikethrough\')" ng-class="{\'active\': isStrikethrough}" class="toolbar-item" aria-label="Format Strikethrough">\n    <span ng-bind-html="icons.strikethrough"></span>\n  </button>\n\n  <div class="toolbar-divider"></div>\n\n  <button ng-disabled="isDisabled" ng-click="toggleList(\'ul\')" ng-class="{\'active\': blockType === \'ul\'}" class="toolbar-item" aria-label="Unordered List">\n    <span ng-bind-html="icons.list"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="toggleList(\'ol\')" ng-class="{\'active\': blockType === \'ol\'}" class="toolbar-item" aria-label="Ordered List">\n    <span ng-bind-html="icons.listOrdered"></span>\n  </button>\n\n  <div class="toolbar-divider"></div>\n\n  <button ng-disabled="isDisabled" ng-click="formatElement(\'left\')" class="toolbar-item" aria-label="Align Left">\n    <span ng-bind-html="icons.alignLeft"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="formatElement(\'center\')" class="toolbar-item" aria-label="Align Center">\n    <span ng-bind-html="icons.alignCenter"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="formatElement(\'right\')" class="toolbar-item" aria-label="Align Right">\n    <span ng-bind-html="icons.alignRight"></span>\n  </button>\n\n  <div class="toolbar-divider"></div>\n\n  <button ng-disabled="isDisabled" ng-click="insertLink()" ng-class="{\'active\': isLink}" class="toolbar-item" aria-label="Insert Link">\n    <span ng-bind-html="icons.link"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="insertImage()" ng-class="{\'active\': isImage}" class="toolbar-item">\n    <span ng-bind-html="icons.image"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="insertVideo()" ng-class="{\'active\': isVideo}" class="toolbar-item" aria-label="Insert Video">\n    <span ng-bind-html="icons.video"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="insertEmbed()" ng-class="{\'active\': isCustomHtml}" class="toolbar-item" aria-label="Add Embed">\n    <span ng-bind-html="icons.code"></span>\n  </button>\n  <button ng-disabled="isDisabled" ng-click="insertClearFloat()" ng-class="{\'active\': isClearFloat}" class="toolbar-item" aria-label="Content Separator">\n    <span ng-bind-html="icons.minus"></span>\n  </button>\n</div>\n'},3126(e){e.exports='<div class="tkf-body container-fluid tkf-popup message-popup">\n  <div class="popup-content {{popup.kind}}" ng-click="$event.stopPropagation()">\n    <h3>{{popup.tparams.title}}</h3>\n\n    <div class="popup-body">\n      <div class="popup-body-content l-centered" ng-bind-html="popup.tparams.main"></div>\n      <div class="popup-buttons">\n        <button class="l-safety" ng-click="popup.closeIfCloseable()" type="button">{{popup.tparams.cancelLabel ||\n          \'Cancel\'}}\n        </button>\n        <button class="l-danger" ng-click="popup.tparams.action()" type="button">{{popup.tparams.actionLabel}}</button>\n      </div>\n    </div>\n  </div>\n</div>\n'},5777(e){e.exports='<div class="editor__leftbar__section editor__leftbar__fixedtop">\n  <div class="editor__leftbar__backbutton"\n       ng-if="$state.current.name===\'edit.inter.detail\' || $state.current.name===\'edit.inter.repeatdetail\' || $state.current.name ===\'edit.inter.rsvpresponses\'">\n    <a class="btn btn-default btn-xs btn-back" ng-click="goBack($event)"><i\n        class="flaticon-arrows-1"></i><span\n        class="l-full-width">{{NavHistory.parentButtonText()}}</span><span\n        class="l-medium-width">Back</span></a>\n  </div>\n  <div class="editor__block">\n    <div class="l-header">Create Event</div>\n    <div class="l-body">\n      <button class="btn btn btn-siteform--green l-save"\n              ui-sref="edit.inter.groupeditor({calname:calendar.name,uid:\'new\'})">Create Event\n      </button>\n    </div>\n  </div>\n  <div class="editor__left__narrow__item l-top">\n    <button class="btn btn btn-siteform--green l-save"\n            ui-sref="edit.inter.groupeditor({calname:calendar.name,uid:\'new\'})">Create Event\n    </button>\n  </div>\n</div>\n\n<div class="editor__leftbar__section editor__leftbar__main">\n\n  <div class="editor__block" ng-if="showSubscriptionFeatures && $state.current.name ===\'edit.inter.rsvpresponses\'">\n    <div class="l-header">RSVP Export</div>\n    <div class="l-body">\n      <div class="l-rsvp-label">Start date for export</div>\n      <div class="tkfSelect__input">\n        <input type="text" class="form-control"\n               ng-model="textWhen.start"\n               data-date-format="{{ANGULAR_DATE_FORMAT}}"\n               data-date-type="string"\n               data-autoclose="1"\n               data-placement="bottom-center"\n               placeholder="start date" bs-datepicker>\n        <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n      </div>\n      <div class="l-rsvp-button">\n        <a class="btn btn-default btn-sm" ng-href="/api/eventresponseexport/{{calendar.name}}?startms={{startms()}}"\n           target="_self">Export and Download</a>\n      </div>\n    </div>\n  </div>\n\n  <div class="editor__block" ng-if="showSubscriptionFeatures && $state.current.name !==\'edit.inter.rsvpresponses\'">\n    <div class="l-header">Submitted Events</div>\n    <div class="l-body">\n      <a class="" href="/tkf2/submittedEventsList/new" ng-if="submittedEventCount > 0"\n         target="{{reviewTarget}}"><span class="badge editor__submit-badge">{{submittedEventCount}}</span>&nbsp;&nbsp;{{eventsText}}\n        to review</a>\n      <a class="" href="/tkf2/submittedEventsList/new" ng-if="submittedEventCount === 0"\n         target="{{reviewTarget}}">No new events to review</a>\n    </div>\n  </div>\n\n  <div class="editor__block">\n    <div class="l-header">Quick Access</div>\n    <div class="l-body">\n      <button\n          class="btn btn-default l-lib" ng-click="manageImages()"\n          type="button">Open Image Library\n      </button>\n    </div>\n    <div class="l-body">\n      <button\n          class="btn btn-default l-lib" ng-click="manageRSVPs()"\n          type="button">Open RSVP Form Editor\n      </button>\n    </div>\n    \x3c!-- managed tags are subscription-only: free calendars see it locked.\n         Held back until the calendar loads so subscribers never see the lock flash. --\x3e\n    <div class="l-body" ng-if="showSubscriptionFeatures !== undefined">\n      <button\n          class="btn btn-default l-lib" ng-click="manageTags()"\n          ng-disabled="!showSubscriptionFeatures"\n          ng-attr-title="{{showSubscriptionFeatures ? undefined : \'Subscription only\'}}"\n          type="button"><span class="glyphicon glyphicon-lock" aria-hidden="true"\n                              ng-if="!showSubscriptionFeatures"></span> Manage Tags\n      </button>\n    </div>\n  </div>\n\n  <div class="editor__block" ng-if="missing_calendar">\n    <div class="l-header">Google</div>\n    <div class="l-body">\n      <p>We have stopped syncing because Google has told us that the calendar you are synced with is no longer part\n        of your Google Account</p>\n      <p>You can re-enable the sync below but it will be disabled again the next time you sync if the Google Calednar\n        isn\'t found.</p>
2\n      <a ng-click="checkMissingCalendar()">Re-enable Sync</a>\n    </div>\n  </div>\n\n  <div class="editor__block" ng-if="googleAccountId">\n    <div class="l-header">Google</div>\n    <div class="l-body">\n      <p>We are no longer authorized to sync with your Google Calendar. Please re-authorize us so we can start syncing\n        again. </p>\n      <a ui-sref="settings.google.reauthorizeGoogleCalendar({id:googleAccountId})">Re-authorize Google Sync</a>\n    </div>\n  </div>\n\n  <div class="editor__block" ng-if="googleSyncOk">\n    <div class="l-header">Google</div>\n    <div class="l-body">\n      <p>We sync with Google Calendar within seconds of your changes there, but if you think something is missing you\n        can force a\n        refresh here</p>\n      <a class="" ng-click="forceSync()">Refresh From Google</a>\n    </div>\n  </div>\n\n  \x3c!-- trial info here --\x3e\n\n  <div class="editor__block__narrow editor__block__narrow--top">\n    <div class="l-header">Submitted</div>\n    <div class="l-body">\n      <a class="" href="/tkf2/submittedEventsList/new" ng-if="submittedEventCount === 0"\n         target="{{reviewTarget}}">No Events</a>\n      <a class="" href="/tkf2/submittedEventsList/new" ng-if="submittedEventCount > 0"\n         target="{{reviewTarget}}"><span class="badge editor__submit-badge">{{submittedEventCount}}</span>&nbsp;&nbsp;{{eventsText}}</a>\n    </div>\n  </div>\n\n  <div class="editor__block__narrow editor__block__narrow--top">\n    <div class="l-header">Quick Access</div>\n    <div class="l-body">\n      <button\n          class="btn btn-link l-lib-narrow" ng-click="manageImages()"\n          type="button">Image Library\n      </button>\n      <button\n          class="btn btn-link l-lib-narrow" ng-click="manageRSVPs()"\n          type="button">Form Editor\n      </button>\n      <button\n          class="btn btn-link l-lib-narrow" ng-click="manageTags()" ng-if="showSubscriptionFeatures !== undefined"\n          ng-disabled="!showSubscriptionFeatures"\n          ng-attr-title="{{showSubscriptionFeatures ? undefined : \'Subscription only\'}}"\n          type="button"><span class="glyphicon glyphicon-lock" aria-hidden="true"\n                              ng-if="!showSubscriptionFeatures"></span> Manage Tags\n      </button>\n    </div>\n  </div>\n\n  <div class="editor__left__narrow__item l-narrowSupport l-nosm">\n    <a ng-click="showSupport()">Help and Support</a>\n  </div>\n\n  <div class="editor__block">\n    <div class="l-body l-center">\n      <a ng-click="showSupport()">Help and Support</a>\n    </div>\n  </div>\n\n</div>\n'},9105(e){e.exports='<div class="inedit__navbar">\n  <div class="viewer__navbar" ng-cloak ng-if="calendar">\n    <div class="viewerArea__clickPane" ng-click="closeModeMenu($event)"\n         ng-if="pageState.showModeMenu"></div>\n    <div class="navbar navbar-default" ng-if="showNavBar">\n      <div class="container-fluid">\n        <div class="row">\n\n          <div class="navbar-header">\n\n            <a ng-class="{\'l-toggle\':true, active:!pageState.isCollapsed}"\n               ng-click="pageState.isCollapsed = !pageState.isCollapsed">\n              <span class="sr-only">Toggle navigation</span>\n              <i ng-class="{\'flaticon-open-menu\':true, \'l-is-on\':pageState.isCollapsed}"></i>\n              <i ng-class="{\'flaticon-close-1\':true, \'l-is-on\':!pageState.isCollapsed}"></i>\n              \x3c!--<span class="icon-bar"></span>--\x3e\n              \x3c!--<span class="icon-bar"></span>--\x3e\n              \x3c!--<span class="icon-bar"></span>--\x3e\n            </a>\n\n            <div class="mobile-navbar-switcher">\n              <div class="btn-group ">\n                <a class="btn btn-default navbar-btn viewer__navbar__button"\n                   ng-if="settings.views.pinboard.show  && viewCount !== 1" translate="pinboard"\n                   type="button"\n                   ui-sref=".pinboard({calname:calendar.name})" ui-sref-active="active"></a>\n                <a class="btn btn-default navbar-btn viewer__navbar__button"\n                   ng-if="settings.views.agenda.show  && viewCount !== 1" translate="agenda"\n                   type="button"\n                   ui-sref=".agenda({calname:calendar.name})" ui-sref-active="active"></a>\n                <a class="btn btn-default navbar-btn viewer__navbar__button"\n                   ng-if="settings.views.monthly.show  && viewCount !== 1" translate="monthly"\n                   type="button"\n                   ui-sref=".monthly({calname:calendar.name })" ui-sref-active="active"></a>\n              </div>\n\n            </div>\n\n          </div>\n\n          \x3c!-- mobile dropdown --\x3e\n          <div ng-class="{\'navbar-collapse\':true, collapse:pageState.isCollapsed}" ng-cloak>\n\n            <div class="col-lg-12">\n              <form class="navbar-form navbar-left">\n                <div class="form-group viewer__navbar__search" ng-show="showSearch">\n                  <div class="input-group ">\n                    <input aria-label="search" class="form-control main-search-box" name="search"\n                           ng-model="searchProxy.search"\n                           ng-model-options="{ updateOn: \'blur default\', debounce: {\'default\':500, \'blur\': 0}}"\n                           placeholder="{{\'search\' | translate}}"\n                           ng-focus="openTagPicker()"\n                           ng-click="openTagPicker()"\n                           ng-keydown="onSearchKeydown($event)"\n                           type="text"\n                    >
2\n                    <span class="input-group-btn">\n                       <a class="btn btn-default viewer__navbar__button" ng-click="clearSearch()"><i\n                           class="flaticon-close-1 l-search"></i>\n                       </a>\n                      </span>\n                  </div>\n                  <search-tag-picker\n                      calendar-name="calendar.name"\n                      on-apply="applyTagFilter(tagQuery)"\n                      on-close="closeTagPicker()"\n                      on-manage-tags="openTagManager()"\n                      is-open="tagPickerOpen"\n                      selected-tags="currentFilterTags"\n                      has-changes="tagPickerState.hasChanges"\n                      ng-if="calendar.effectiveFeatureLevel > 0">\n                  </search-tag-picker>\n                </div>&nbsp;<div class="form-group date-navigator" ng-if="dateFormat && showDateNav"\n                                 ng-show="dateStyle">\n                \x3c!--<label class="control-label">events after</label>--\x3e\n                <a aria-label="go back one month"\n                   class="btn btn-default viewer__navbar__button"\n                   ng-click="bwdMonth()"><i\n                    class="flaticon-back"></i></a><input bs-datepicker class="form-control"\n                                                         data-autoclose="1"\n                                                         data-date-format="{{dateFormat}}"\n                                                         data-date-type="number"\n                                                         data-min-view="0"\n                                                         data-start-view="0"\n                                                         data-start-week="{{wkstart}}"\n                                                         data-template-url="app/common/tkfDatePicker.html"\n                                                         data-timezone="UTC"\n                                                         data-use-native="false"\n                                                         name="date"\n                                                         ng-model="startmsProxy.startms"\n                                                         ng-show="dateStyle === \'full\'" size="8" type="text"><a\n                  aria-label="go forwards one month" class="btn btn-default viewer__navbar__button"\n                  ng-click="fwdMonth()"><i\n                  class="flaticon-next"></i></a>\n              </div>\n                <div class="l-mobile-responder l-noPadding"\n                     ng-if="calendar.effectiveFeatureLevel > 0 && settings.showSubscribeToCalendar && !alwaysShowSubscribe">\n                  <a class="viewer__navbar__linkbutton btn btn-cta"\n                     ng-href="webcal://tockify.com/api/feeds/ics/{{calendar.name}}" target="_top"\n                     translate="subscribe">\n                  </a>\n                </div>\n\n              </form>\n\n              <ul class="nav navbar-nav navbar-right">\n                <li ng-class="{\'dropdown viewer__nav--dropdown\':true, open:pageState.showModeMenu}"\n                    ng-show="calendar.effectiveFeatureLevel >= 0 && switcherStyle === \'dropdown\' && viewCount !== 1">\n                  <a aria-expanded="false" class="dropdown-toggle viewer__mode" data-toggle="dropdown"\n                     href="#" ng-click="openModeMenu()" role="button">{{stateLabel() | translate }}<span\n                      class="caret"></span></a>\n                  <ul class="dropdown-menu" role="menu">\n                    <li ng-if="settings.views.pinboard.show">\n                      <a ng-click="openView($event,\'pinboard\')"\n                         translate="pinboard" ui-sref-active="active"\n                      ></a>\n                    </li>\n                    <li ng-if="settings.views.agenda.show">\n                      <a ng-click="openView($event,\'agenda\')"\n                         translate="agenda" ui-sref-active="active"\n                      ></a>\n                    </li>\n                    <li ng-if="settings.views.monthly.show">\n                      <a ng-click="openView($event,\'monthly\')"\n                         translate="monthly" ui-sref-active="active"\n                      ></a>\n                    </li>\n                  </ul>\n\n                <li>\n                <li ng-show="calendar.effectiveFeatureLevel >= 0 && switcherStyle === \'full\'">\n                  <div class="btn-group">\n                    <a class="btn btn-default navbar-btn viewer__navbar__button"\n                       ng-if="settings.views.pinboard.show  && viewCount !== 1" translate="pinboard"\n                       type="button"\n                       ui-sref=".pinboard({calname:calendar.name})" ui-sref-active="active"></a>\n                    <a class="btn btn-default navbar-btn viewer__navbar__button"\n                       ng-if="settings.views.agenda.show  && viewCount !== 1" translate="agenda"\n                       type="button"\n                       ui-sref=".agenda({calname:calendar.name})" ui-sref-active="active"></a>\n                    <a class="btn btn-default navbar-btn viewer__navbar__button"\n                       ng-if="settings.views.monthly.show  && viewCount !== 1" translate="monthly"\n                       type="button"\n                       ui-sref=".monthly({calname:calendar.name })" ui-sref-active="active"></a>\n                  </div>\n                </li>\n                <li class="mobile-navmenu-view"\n                    ng-show="calendar.effectiveFeatureLevel >= 0 && settings.views.pinboard.show  && viewCount !== 1">\n                  <a\n                      class="btn btn-default navbar-btn viewer__navbar__button" ng-click="openView($event,\'pinboard\')"\n                      translate="pinboard"\n                      type="button" ui-sref-active="active"></a>\n                </li>\n                <li class="mobile-navmenu-view"\n                    ng-show="calendar.effectiveFeatureLevel >= 0 && settings.views.agenda.show  && viewCount !== 1">\n                  <a\n                      class="btn btn-default navbar-btn viewer__navbar__button" ng-click="openView($event,\'agenda\')"\n                      translate="agenda"\n                      type="button" ui-sref-active="active"> </a>\n                </li>\n                <li class="mobile-navmenu-view"\n                    ng-show="calendar.effectiveFeatureLevel >= 0 && settings.views.monthly.show  && viewCount !== 1">\n                  <a\n                      class="btn btn-default navbar-btn viewer__navbar__button" ng-click="openView($event,\'monthly\')"\n                      translate="monthly"\n                      type="button" ui-sref-active="active"></a>\n                </li>\n\n              </ul>\n            </div>\n          </div>\n        </div>\n\n      </div>\n      \x3c!--</div>--\x3e\n    </div>\n    <div class="viewer__navbar__activeTagBar eventTags eventTags--{{settings.tagStyle === \'full\' ? \'full\' : \'hollow\'}}"\n         ng-if="showNavBar && (activeFilterTags.length >
2 0 || specialFilterKey) && calendar.effectiveFeatureLevel > 0"\n         role="region" aria-label="Active tag filters" aria-live="polite">\n      <span class="viewer__navbar__activeTagBar__matchLabel d-textColor" ng-if="specialFilterKey" translate="{{specialFilterKey}}"></span>\n      <span class="viewer__navbar__activeTagBar__matchLabel d-textColor" ng-if="!specialFilterKey" translate="{{tagMatchModeKey}}"></span>\n      <span class="eventTags__tag d-tag eventTagColor--{{tagToKey(tag.text)}}" ng-class="{\'is-negated\': tag.negated}" ng-repeat="tag in activeFilterTags"><a\n          class="eventTagColor--{{tagToKey(tag.text)}}"><span\n          class="eventTags__text">{{tag.negated ? (\'tagPickerNot\' | translate) + \' \' : \'\'}}{{tag.text}}</span><button\n          type="button"\n          class="viewer__navbar__activeTagRemove"\n          ng-click="removeActiveTag(tag)"\n          aria-label="{{(\'tagPickerClearAll\' | translate) + \' \' + tag.text}}">&times;</button></a></span>\n      <a class="viewer__navbar__clearTags" ng-click="clearAllTags()"\n         ng-keydown="($event.keyCode === 13 || $event.keyCode === 32) && clearAllTags()"\n         role="button" tabindex="0" translate="tagPickerClearAll"></a>\n    </div>\n  </div>\n</div>\n\n'},8047(e){e.exports='<div class="editor d-textColor d-fontSize">\n\n  <div class="spinner-wrap">\n    <div class="spinner spinner__double-circles" ng-show="notifier.spinner.show">\n      <div class="circle circle1"></div>\n    </div>\n  </div>\n\n  \x3c!-- eventEditorNavbar.html supplies the whole .navbar-fixed-top bar; the host\n       carries the bar\'s own text colour so nothing inside it can inherit\n       .editor\'s dark d-textColor while the view is being linked --\x3e\n  <div class="tkf-adminnav-host" ui-view="nav"></div>\n\n  <div class="editor__body">\n    <div class="editor__leftbar" ui-view="leftbar"></div>\n    \x3c!--<div class="editor__column-separator"></div>--\x3e\n    <div class="editor__main js-scrolltotop"\n         ng-class="{editor__main__footerSpace:showFooter}">\n      <div class="editor__main__scrollable">\n        <div ui-view="mainNav"></div>\n        <div ui-view="main"></div>\n      </div>\n    </div>\n    <div class="editor__rightbar" ui-view="rightbar"></div>\n  </div>\n\n  <div ng-if="plan.source===\'duda\'">\n    <div class="editor__footer" ng-if="plan.category==\'trial\'">\n      There are {{plan.daysLeft}} days left in your {{plan.name}} trial of Tockify.\n      &nbsp;<a class="btn btn-upgrade btn-xs" ui-sref="settings.subscriptions">Subscribe now</a>\n    </div>\n    <div class="editor__footer" ng-if="calendar.effectiveFeatureLevel === 0 && plan.category==\'free\'">\n      Your free trial of Tockify has expired.\n      &nbsp;&nbsp; <a class="btn btn-upgrade btn-xs" ui-sref="settings.subscriptions">Subscribe now</a>\n    </div>\n\n  </div>\n  <div ng-if="plan.source!==\'duda\'">\n    <div class="editor__footer" ng-if="plan.category==\'trial\'">\n      There are {{plan.daysLeft}} days left in your {{plan.name}} trial of Tockify.\n      &nbsp;<a class="btn btn-upgrade btn-xs" ui-sref="siteform.paidPlanPicker">Upgrade now</a>\n      to keep the premium features\n      or <a ui-sref="docs.inter.faq.subscription">learn more here</a>\n    </div>\n    <div class="editor__footer" ng-if="calendar.effectiveFeatureLevel === 0 && plan.category==\'free\'">\n      You are using the free version of Tockify.\n      &nbsp;&nbsp; <a class="btn btn-upgrade btn-xs" ui-sref="siteform.paidPlanPicker">Upgrade now</a>\n      to enable the premium features\n      or <a ui-sref="docs.inter.faq.subscription">learn more here</a>\n    </div>\n  </div>\n\n</div>\n'},7565(e){e.exports='<div class="editor__missingEvent">\n\n  <div class="editor__missingEvent__message">\n    <h2>\n      We couldn\'t find that event\n    </h2>\n    <h3>\n      It might have been deleted or there might be a typo in the editor URL\n    </h3>\n\n    <div class="l-button">\n      <button class="btn btn-lg btn-siteform" ng-click="goBack($event)">Back To Events</button>\n    </div>\n  </div>\n\n</div>'},1290(e){e.exports='<nav class="navbar navbar-default navbar-fixed-top tkf-adminnav" tkf-adminnav>\n  <div class="container-fluid">\n    <ul class="nav navbar-nav navbar-left">\n      <li ng-if="!isDudaEmbed"><a ui-sref="site">Home</a></li>\n      <li><a ui-sref="settings.calendar.main({id:calendar._id})">Settings<sup class="label label-danger"\n                                                                              ng-if="alerts.length>0">!</sup></a></li>\n      <li><a ui-sref="docs.inter">Documentation</a></li>\n      <li><a target="_blank" ng-href="{{callink}}">View Calendar</a></li>\n      <li><a ui-sref="customizer.main({calname:calendar.name})">Customize</a></li>\n    </ul>\n\n    <ul class="nav navbar-nav navbar-right">\n      <li class="tkf-adminnav__actions">\n        <button class="btn tkf-adminnav__cta" type="button" ng-click="showEmbedCode()">Add to your site</button>\n      </li>\n      \x3c!-- the tabindex is needed to make Safari fire focus and blur events: http://www.quirksmode.org/dom/events/blurfocus.html --\x3e\n      <li class="dropdown tkf-adminnav__account" ng-class="{open:viewState.activeMenu === \'bar\'}">\n        <a class="dropdown-toggle" href="" role="button" tabindex="400"\n           ng-focus="openMenu(\'bar\')" ng-blur="closeMenu(\'bar\')">{{calendar.name}}
2<span class="caret"></span></a>\n        <ul class="dropdown-menu" role="menu" ng-if="calendar">\n          <li ng-repeat="name in calnames"><a target="_self" ui-sref="edit.inter.agenda({calname:name})">{{name}}</a>\n          </li>\n        </ul>\n      </li>\n    </ul>\n  </div>\n</nav>\n'},1225(e){e.exports='<div class="tkf-body tkf-popup big-popup" ng-controller="CalendarSettingsCtrl">\n  <div class="close-bar"><i class="flaticon-close-1"></i></span></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Reauthorize Google Calendar Access</h3>\n\n    <form class="popup-body" name="fChangeCalendarName" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>We can\'t access your Google Calendar</h4>\n        <p>We no longer have permission to access your Google Calendar, so we can\'t sync your events properly.</p>\n        <p>\n          Click the button below to learn more and fix the problem.</p>\n      </div>\n\n      <div class="popup-buttons">\n        <a class="btn btn-siteform"\n           ui-sref="settings.google.reauthorizeGoogleCalendar({id:popup.tparams.googleAccountId})">Fix Google Sync\n          Permissions</a>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},7320(e){e.exports='<div class="form-group">\n  <div class="radio">\n    <label>\n      <input name="responseKind" ng-model="viewState.responseKind"\n             ng-value="\'nothing\'" type="radio">Just reply</label>\n  </div>\n  <div class="radio">\n    <label>\n      <input name="responseKind" ng-model="viewState.responseKind"\n             ng-value="\'yesno\'" type="radio">Ask if attending</label>\n  </div>\n  <div class="radio">\n    <label>\n      <input name="responseKind" ng-model="viewState.responseKind"\n             ng-value="\'howmany\'" type="radio">Ask how many people are attending</label>\n  </div>\n  <div class="form-group" ng-if="viewState.responseKind!==\'nothing\'">\n    <label>Question</label>\n    <input class="form-control" ng-model="field.title" type="text">\n  </div>\n  <div class="form-group" ng-if="viewState.responseKind===\'howmany\'">\n    <div class="formDef__optionsLimit">\n      <label>From</label>\n      <input class="form-control" ng-blur="minChanged()" ng-model="viewState.min" only-digits\n             placeholder="Lowest Allowed Value" type="text">\n    </div>\n    <div class="formDef__optionsLimit">\n      <label>To</label>\n      <input class="form-control" ng-blur="maxChanged()" ng-model="viewState.max" only-digits\n             placeholder="Highest Allowed Value" type="text">\n    </div>\n    <div class="formDef__optionsLimit">\n      <label>Default</label>\n      <input class="form-control" ng-blur="checkInitialBounds()" ng-model="viewState.initial" only-digits\n             placeholder="Default Value" type="text">\n    </div>\n  </div>\n</div>\n'},6386(e){e.exports='<div class="form-group">\n  <label>Question Text</label>\n  <input class="form-control" ng-model="field.title" type="text">\n</div>\n\x3c!--<div ng-if="field.ftype===\'boolean\'">--\x3e\n\x3c!--<input type="checkbox" disabled>--\x3e\n\x3c!--</div>--\x3e\n'},9234(e){e.exports='<div class="form-group">\n  <label>Section Title</label>\n  <input class="form-control" ng-model="field.title" type="text">\n  <br/>\n  <label>Instructions (this will appear as a block of plain text)</label>\n  <textarea class="form-control" ng-model="field.config.message" type="text" rows="4"></textarea>\n</div>'},8257(e){e.exports='<div class="form-group">\n  <label>Question Text</label>\n  <input class="form-control" ng-model="field.title" type="text">\n</div>'},821(e){e.exports='<div class="form-group">\n  <label>Question Text</label>\n  <input class="form-control" ng-model="field.title" type="text">\n</div>\n<div>\n\n  <div class="form-group">\n    <div class="formDef__optionsLimit">\n      <label>From</label>\n      <input class="form-control" ng-blur="minChanged()" ng-model="viewState.min" only-digits\n             placeholder="Lowest Allowed Value" type="text">\n    </div>\n    <div class="formDef__optionsLimit">\n      <label>To</label>\n      <input class="form-control" ng-blur="maxChanged()" ng-model="viewState.max" only-digits\n             placeholder="Highest Allowed Value" type="text">\n    </div>\n    <div class="formDef__optionsLimit">\n      <label>Default</label>\n      <input class="form-control" ng-blur="checkInitialBounds()" ng-model="viewState.initial" only-digits\n             placeholder="Default Value" type="text">\n    </div>\n  </div>\n\n\n</div>\n'},8008(e){e.exports='<div class="form-group">\n  <label>Question Text</label>\n  <input class="form-control" ng-model="field.title" type="text">\n</div>\n<div>\n  <div class="form-group">\n    <div class="formDef__optionsLimit">\n      <label>Min Selected</label>\n      <div ng-model="field.config.min" select-model="minModel" tkf-select></div>\n    </div>\n    <div class="formDef__optionsLimit">\n      <label>Max Selected</label>
2\n      <div ng-model="field.config.max" select-model="maxModel" tkf-select></div>\n    </div>\n  </div>\n\n  <label>Options</label>\n  <ul class="formDef__optionsFieldList">\n    <li class="formDef__optionsField" ng-repeat="opt in field.config.options">\n      <div class="form-inline">\n        <input class="form-control" ng-model="opt.text" type="text">\n        <input ng-change="checkSelectedMax($index)" ng-model="opt.selected" type="checkbox"> select\n        <span class="l-add-remove"><a ng-click="removeOption($index)">remove</a></span>\n      </div>\n    </li>\n    <li class="formDef__optionsField">\n      <div class="form-group form-inline">\n        <input class="form-control" ng-keydown="onKeyDown($event)" ng-model="newOption.text" type="text">\n        <span class="l-add-remove"><a ng-click="addOption()" ng-if="newOption.text.trim().length > 0">add</a></span>\n      </div>\n    </li>\n  </ul>\n\n\n</div>\n'},1369(e){e.exports='<div class="rsvpLibrary">\n  <div class="rsvpLibrary__top" ng-if="viewState.mode === \'list\'">\n\n\n    <div class="rsvpLibrary__close"><a href="" ng-click="close()"><i\n        class="flaticon-close-1"></i></a></div>\n    <button class="btn btn-siteform imageLibrary__newImageButton" ng-click="newForm()">Create New Form</button>\n\n    \x3c!--<div class="input-group search-box"><input type="text" aria-label="search" name="search" class="form-control"--\x3e\n    \x3c!--ng-model="viewState.search"--\x3e\n    \x3c!--placeholder="{{\'search forms\' | translate}}"--\x3e\n    \x3c!--ng-model-options="{ updateOn: \'blur default\', debounce: {\'default\':500, \'blur\': 0}}"--\x3e\n    \x3c!--ng-click="clearSearch()" class="btn btn-default viewer__navbar__button"><i--\x3e\n    \x3c!--class="flaticon-close-1 l-search"></i></a></span></div>--\x3e\n\n  </div>\n  <div class="rsvpLibrary__top" ng-if="viewState.mode !== \'list\'">\n\n    <div class="rsvpLibrary__left">\n\n    </div>\n\n    <div class="btn-group rsvpLibrary__center" ng-if="viewState.canEdit">\n      <button ng-class="{\'btn rsvpLibrary__switcher__btn\':true,\n                            \'btn-default\':(viewState.mode !== \'edit\'),\n                            \'btn-siteform\':(viewState.mode === \'edit\')\n                           }"\n              ng-click="viewState.mode = \'edit\'"\n              type="button"\n      >Edit\n      </button>\n      <button ng-class="{\'btn rsvpLibrary__switcher__btn\':true,\n                            \'btn-default\':(viewState.mode !== \'preview\'),\n                            \'btn-siteform\':(viewState.mode === \'preview\')\n                           }"\n              ng-click="viewState.mode = \'preview\'"\n              type="button"\n      >Preview\n      </button>\n    </div>\n\n    <div class="rsvpLibrary__right">\n      <button class="btn btn-siteform " ng-click="useForm(formDef.formId)"\n              ng-if="formDef.formId && !viewState.manage">Use This Form\n      </button>\n      <button class="btn" ng-class="{\'btn-siteform--green\':hasUnsavedChanges,\n        \'btn-default\':!hasUnsavedChanges}"\n              ng-click="saveForm()"\n              ng-if="viewState.canEdit">Save Form\n      </button>\n      <button class="btn btn-default " ng-click="backToList()">Back To List</button>\n    </div>\n\n  </div>\n  <div class="rsvpLibrary__top--spacer"></div>\n\n  <div class="rsvpLibrary__main">\n\n    \x3c!--<div ng-if="viewState.mode === \'list\'" class="rsvpLibrary__formGrid">--\x3e\n\n    \x3c!--<div class="rsvpLibrary__formDef">--\x3e\n    \x3c!--<div translate class="l-title">Default Form (built in)</div>--\x3e\n    \x3c!--<div class="l-options">--\x3e\n    \x3c!--<div class="l-options-left">--\x3e\n    \x3c!--<a ng-click="editForm(DEFAULT_FORMID, false)">View</a>--\x3e\n    \x3c!--</div>--\x3e\n    \x3c!--<div  class="l-options-right">--\x3e\n    \x3c!--<a ng-click="startAttach(DEFAULT_FORMID)">Use</a>--\x3e\n    \x3c!--</div>--\x3e\n    \x3c!--</div>--\x3e\n    \x3c!--</div>--\x3e\n\n    \x3c!--<div ng-repeat="formDef in formDefIndex" class="rsvpLibrary__formDef">--\x3e\n    \x3c!--<div translate class="l-title">{{formDef.name}}</div>--\x3e\n    \x3c!--<div class="l-options">--\x3e\n    \x3c!--<div class="l-options-left">--\x3e\n    \x3c!--<a ng-click="editForm(formDef.formId, true)">View</a>&nbsp;--\x3e\n    \x3c!--<a ng-click="editForm(formDef.formId, true, \'edit\')">Edit</a>--\x3e\n    \x3c!--</div>--\x3e\n    \x3c!--<div class="l-options-right">--\x3e\n    \x3c!--<a ng-click="startAttach(formDef.formId)">Use</a>--\x3e\n    \x3c!--<a ng-click="removeForm(formDef.formId)">Delete</a></div>--\x3e\n    \x3c!--</div>--\x3e\n\n    \x3c!--</div>--\x3e\n\n    \x3c!--</div>--\x3e\n\n    <div class="rsvpLibrary__formIndex" ng-if="viewState.mode === \'list\'">\n      <ul class="rsvpLibrary__formList">\n        <li>\n          <div class="rsvpLibrary__formListRow">
2\n            <span class="l-title" translate>Default Form (built in)</span>\n            <div class="l-options-right">\n              <a ng-if="!viewState.manage" class="btn btn-siteform" ng-click="startAttach(DEFAULT_FORMID)">Use This Form</a>\n              <a class="btn btn-default" ng-click="editForm(DEFAULT_FORMID, false)">Preview</a>\n              <a class="btn btn-default" ng-click="editForm(formDef.formId, true, \'edit\')" style="visibility: hidden">Edit</a>\n              <a class="btn btn-default" ng-click="dupForm(DEFAULT_FORMID)">Duplicate</a>\n              <a ng-click="removeForm(formDef.formId)" style="visibility: hidden; margin-right:10px"><i class="flaticon-delete"></i></a>\n            </div>\n          </div>\n        </li>\n        <li ng-repeat="formDef in formDefIndex">\n          <div class="rsvpLibrary__formListRow">\n            <div class="l-options-right">\n              <a ng-if="!viewState.manage" class="btn btn-siteform" ng-click="startAttach(formDef.formId)">Use This Form</a>\n              <a class="btn btn-default" ng-click="editForm(formDef.formId, true)">Preview</a>\n              <a class="btn btn-default" ng-click="editForm(formDef.formId, true, \'edit\')">Edit</a>\n              <a class="btn btn-default" ng-click="dupForm(formDef.formId)">Duplicate</a>\n              <a class="l-remove" ng-click="removeForm(formDef.formId)"><i class="flaticon-delete"></i></a>\n            </div>\n            <div class="l-options-left">\n              <span class="l-title" translate>{{formDef.name}}</span>\n            </div>\n          </div>\n        </li>\n      </ul>\n\n      <div class="imageLibrary__loadMoreSection">\n        <div class="listStatus d-listStatusText listStatus--hasMore " ng-if="viewState.maybeHasNext">\n          <a class="btn btn-loadMore" href="" ng-click="loadMore($event)">Load More RSVP Forms</a>\n        </div>\n        <div ng-if="!viewState.maybeHasNext">\n          <div class="listStatus d-listStatusText listStatus--noMore">No More RSVP Forms</div>\n        </div>\n      </div>\n\n    </div>\n\n\n    <div class="rsvpLibrary__formPreview" ng-if="formDef && viewState.mode===\'preview\'">\n      <div form-def="formDef" is-preview="{{true}}" rsvp-filler></div>\n    </div>\n\n    <div class="rsvpLibrary__sideBar" ng-if="viewState.mode === \'edit\'">\n\n      <div class="rsvpLibrary__fieldPicker" ng-if="!viewState.editedField">\n        <ul class="rsvpLibrary__fieldList" dragula=\'"rsvp-field-bag"\' dragula-model="fieldPalette">\n          <li ng-repeat="fieldType in fieldPalette">\n            <div class="rsvpLibrary__fieldAdder" ng-click="addField(fieldType.ftype)">{{getTypeLabel(fieldType.ftype)}}</div>\n          </li>\n        </ul>\n      </div>\n\n\n    </div>\n    <div class="rsvpLibrary__builder__wrap" ng-if="viewState.mode === \'edit\'">\n      <div class="rsvpLibrary__builder" ng-if="viewState.mode===\'edit\'">\n\n\n        <div class="form-group">\n          <label>Form Name (not shown to end user)</label>\n          <input class="form-control" ng-model="formDef.name" type="text">\n        </div>\n        <div class="form-group form-inline">\n          <input class="form-control" ng-model="formDef.title" type="text">\n          <label>&nbsp;Form Title (shown to end user)</label>\n        </div>\n        <div class="form-group form-inline" ng-if="showCustomSubmit">\n          <input class="form-control" ng-model="formDef.submitText" type="text">\n          <label>&nbsp;Custom Submit Button Label</label>&nbsp;\n          <a href ng-click="useStandardSubmit()">revert to default label</a>\n        </div>\n        <div class="form-group form-inline" ng-if="!showCustomSubmit">\n          Using submit button label "<b class="u-capitals" translate="sendRSVP"></b>"\n          <a href ng-click="useCustomSubmit()">click here to customize</a>\n        </div>\n        <div class="form-group form-inline" ng-if="showCustomRsvp">\n          <input class="form-control" ng-model="formDef.rsvpButtonText" type="text">\n          <label> Custom RSVP Button Label</label>&nbsp;\n          <a href ng-click="useDefaultRsvp()">revert to default label</a>\n        </div>\n        <div class="form-group form-inline" ng-if="!showCustomRsvp">\n          Using default rsvp button label "<b class="u-capitals" translate="RSVP"></b>"\n          <a href ng-click="useCustomRsvp()">click here to customize</a>\n        </div>\n\n        <div class="rsvpLibrary__fieldsContainer" dragula=\'"rsvp-field-bag"\' dragula-model="formDef.fields">\n          <div class="rsvpLibrary__field" id="{{\'field_\' + field.id}}"\n               ng-class="{\'l-editing\':viewState.editedField === field}"\n               ng-click="editField(field)"\n               ng-repeat="field in formDef.fields | filter:hideDeleted"\n          >\n            <div class="rsvpLibrary__fieldTypeRow u-dragHandle">\n              <div class="rsvpLibrary__fieldType">{{getTypeLabel(field.ftype, field.flags.contactAddress)}}</div>\n              &nbsp;<div class="checkbox-inline" ng-if="showRequired(field)">\n              <label>&nbsp;<input ng-false-value="true" ng-model="field.flags.optional" ng-true-value="false"\n                                  type="checkbox">Required\n              </label>
2\n              <span ng-if="field.flags.contactAddress && field.flags.optional" class="label label-danger">Warning</span>\n              <span ng-if="field.flags.contactAddress && field.flags.optional">\n                without an email you can\'t contact attendee if event is changed or cancelled\n              </span>\n            </div>\n\n              <div class="rsvpLibrary__removeFieldBox">\n                <a class="rsvpLibrary__removeField" ng-click="removeField(field)" ng-if="!field.flags.fixed">remove</a>\n              </div>\n            </div>\n            <div class="rsvpLibrary__fieldBox">\n              <div class="rsvpLibrary__fieldPreview">\n                <div ng-switch="field.ftype">\n                  <div boolean-field-preview field="field" ng-switch-when="boolean"></div>\n                  <div field="field" ng-switch-when="shortText" short-text-field-preview></div>\n                  <div field="field" long-text-field-preview ng-switch-when="longText"></div>\n                  <div field="field" info-field-preview ng-switch-when="info"></div>\n                  <div field="field" ng-switch-when="options" options-field-preview></div>\n                  <div field="field" ng-switch-when="number" number-field-preview></div>\n                  <div attendee-field-preview field="field" ng-switch-when="attendee"></div>\n                </div>\n\n              </div>\n            </div>\n\n          </div>\n        </div>\n\n      </div>\n\n    </div>\n  </div>\n  <div class="rsvpLibrary__mirrorContainer"></div>\n</div>\n'},6735(e){e.exports='<div class="rsvpLinker">\n  <h2 ng-if="!hasLink">Use this Form</h2>\n  <h2 ng-if="hasLink">Update RSVP (<a ng-click="editForms()">edit forms</a>)</h2>\n  <div class="l-breakLine"></div>\n  <legend>Form: <b><span translate>{{formName}}</span></b></legend>\n\n\n  <div class="form-group">\n    <label>RSVP Button Label</label>\n    <div>\n      <input class="form-control" ng-model="rsvpLink.buttonLabel" placeholder="RSVP Button Label"\n             type="text">\n    </div>\n  </div>\n\n\n  <div class="form-group">\n    <label>RSVP Open Time (time first RSVP accepted)</label>\n    <div ng-if="!viewState.autoOpen">\n        <input class="form-control rsvpLinker__closeHours"\n               ng-model="viewState.openTime.days" only-digits\n               placeholder="days" type="text"><span> days before event starts: <a class="l-link"\n            ng-click="viewState.autoOpen=true">remove open time</a>\n        </span>\n\n      <div style="margin-top:8px" class="when-picker">\n        <div class="when-picker__block">\n          <div class="when-picker__group">\n            <div class="when-picker__time" ng-model="viewState.openTime.time" select-model="selectModel" tkf-select></div>\n          </div><span>time when RSVP opens</span>\n        </div>\n      </div>\n\n    </div>\n    <div ng-if="viewState.autoOpen">
2\n      <span>RSVPs for this event open immediately:\n          <a class="l-link" ng-click="viewState.autoOpen=false">set open time</a>\n      </span>\n    </div>\n  </div>\n\n\n  <div class="form-group">\n    <label>RSVP Close Time (time last RSVP accepted)</label>\n    <div ng-if="viewState.autoClose">\n      <input class="form-control rsvpLinker__closeHours" ng-blur="updateCloseHours()" ng-if="viewState.autoClose"\n             ng-model="viewState.closeHours" only-digits\n             placeholder="hours" type="text">\n      <span ng-if="viewState.autoClose">hours before event starts: <a\n          class="l-link" ng-click="viewState.autoClose=false" ng-if="viewState.autoClose">remove close time</a></span>\n\n    </div>\n    <div ng-if="!viewState.autoClose">\n      <span>RSVPs for this event will never close: <a class="l-link"\n                                                      ng-click="viewState.autoClose=true">set close time</a></span>\n    </div>\n  </div>\n\n  <div class="form-group">\n    <label>Max attendees/places</label>\n    <div>\n      <input class="form-control rsvpLinker__maxAttendees" ng-blur="updateMaxAttendees()" ng-if="hasMaxAttendees()"\n             ng-model="viewState.maxAttendees" only-digits\n             placeholder="Maximum Attendees" type="text">\n      <a class="l-link" ng-click="setUnlimited()" ng-if="hasMaxAttendees()">set unlimited</a>\n      <span ng-if="!hasMaxAttendees()">The number of attendees is currently unlimited: <a class="l-link"\n                                                                                          ng-click="setLimited()">set a limit</a></span>\n    </div>\n  </div>\n\n  <div class="form-group" ng-if="!rsvpLink.markedAsFull">\n    <button class="btn btn-default" ng-click="rsvpLink.markedAsFull=true"\n            type="button">Mark As Full\n    </button>\n    <label>&nbsp;(even if places remain) </label>\n  </div>\n\n  <div class="form-group" ng-if="rsvpLink.markedAsFull">\n    <button class="btn btn-default" ng-click="rsvpLink.markedAsFull=false"\n            type="button">Undo Mark As Full\n    </button>\n    <label>&nbsp;This event was manually marked as full </label>\n  </div>\n\n  <div class="form-group">\n    <label>\n      <input id="uEmailNotes" name="emailNotes" ng-model="viewState.emailNotes"\n             type="checkbox"> Add additional information to email notification\n    </label>\n    <div ng-if="viewState.emailNotes">\n      <textarea class="form-control"\n                ng-model="rsvpLink.emailNotes" rows="4"></textarea>\n    </div>\n  </div>\n\n  <div class="form-group">\n    <label>\n      <input id="uHideWhenFull" name="hideWhenFull" ng-model="rsvpLink.hideWhenFull"\n             type="checkbox"> Hide event when RSVP is full\n    </label>\n  </div>\n\n  <div class="form-group">\n    <label>\n      <input id="uOfferReminders" name="offerReminders" ng-model="rsvpLink.offerReminders"\n             type="checkbox"> Offer to send people reminder emails.\n    </label>\n  </div>\n\n\n  <div class="siteform__buttons clearfix">\n    <button class="btn btn-siteform btn-lg " ng-click="attach()" ng-if="!hasLink" type="button">Use this Form\n    </button>\n    <button class="btn btn-siteform btn-lg " ng-click="saveChanges()" ng-if="hasLink" type="button">Save Changes\n    </button>\n    <button class="btn btn-danger btn-lg " ng-click="detach()" ng-if="hasLink" type="button">Remove Form\n    </button>\n    <button class="btn btn-default btn-lg u-pullRight" ng-click="doClose()" type="button">Cancel\n    </button>\n    \x3c!--<button class="btn btn-default btn-lg ">Cancel</button>--\x3e\n  </div>\n\n</div>\n'},1085(e){e.exports='<div class="form-group">\n  <label>Question Text</label>\n  <input class="form-control" ng-model="field.title" type="text">\n</div>'},6470(e){e.exports='<div class="rsvp__viewer">\n\n  <h1>RSVP Report</h1>\n\n  <h3>{{eventSummary}}</h3>\n  <h4>{{eventDate}}</h4>\n\n  <h2>Total Attendees: {{attendeeSummary}}</h2>\n\n\n  <div class="rsvp__exportSection">\n\n    \x3c!--<input type="text" placeholder="search"--\x3e\n    \x3c!--ng-model="viewState.search"--\x3e\n    \x3c!--ng-model-options="{ updateOn: \'blur default\', debounce: {\'default\':500, \'blur\': 0}}"--\x3e\n    \x3c!--&gt;--\x3e\n\n    \x3c!--<div class="rsvp__report rsvp2">--\x3e\n    \x3c!--<div class="rsvp__report__titleSection">--\x3e\n    \x3c!--<div ng-repeat="header in formattedResponses[0].headers" class="rsvp__report__title">{{header.title}}</div>--\x3e\n    \x3c!--<div class="rsvp__report__title" >--\x3e\n    \x3c!--<a ng-click="toggleDetails(fr)">Toggle {{fr.isOpen}}</a>--\x3e\n    \x3c!--</div>--\x3e\n    \x3c!--</div>--\x3e\n\n    <div style="float:left">\n      <a ng-if="stats.attendeeCount"\n         ng-href="/api/eventresponseexport/{{calendar.name}}/{{eid.uid}}/{{eid.tid}}/{{eid.rid}}"\n         target="_self">Export To\n        Spreadsheet</a>\n      <p class=\'l-null-message\' ng-if="!stats.attendeeCount">This event doesn\'t have any RSVP responses yet.</p>\n    </div>\n\n  </div>\n\n  <div class="response__group" ng-repeat="gr in groupedResponses">\n\n    <div class="response__group__change" ng-if="gr.isChange">The RSVP form for this event was changed here</div>\n\n    <div class="response__showHideAll">\n      <a ng-click="openAllDetails(gr)">Show details</a>&nbsp;&nbsp;\n      <a ng-click="closeAllDetails(gr)">Hide details</a>\n    </div>\n\n    <div class="response__group__table">\n\n      <div class="response__headerRow response__headerLabels l-not-narrow">\n\n        <div class="response__headerCell response__header__string"\n             ng-class="{\'l-attendee\':header.ftype === \'attendee\'}"\n             ng-repeat="header in gr.headers" translate>{{gr.headerLabels[$index]}}\n        </div>\n        <div class="response__headerCell response__header__more"></div>\n        <div class="response__headerCell response__header__delete"></div>\n      </div>\n      <div class="response__item" ng-repeat="fr in gr.formattedResponses"\n           ng-class="{\'l-deleted\': fr.isDeleted}">\n        <div class="response__headerRow  response__headerItems l-not-narrow"\n             ng-class="{\'l-open\':fr.isOpen,\'l-editing\':viewState.edit[fr.id],\'l-deleted\': fr.isDeleted}"\n             ng-attr-title="{{fr.isDeleted ? \'This response was deleted\' : \'\'}}">\n          <div ng-if="viewState.edit[fr.id]" class="response__headerCell response__header__string l-attendee">\n            <input class="form-control response__header__editCount"\n                   ng-model="viewState.attendeeCount[fr.id]" ng-blur="updateAttendeeCount(fr)"\n                   placeholder="count" type="text" only-digits>\n          </div>\n          <div ng-if="!viewState.edit[fr.id]" class="response__headerCell response__header__string l-attendee" translate>\n            {{formatAttendeeCount(fr)}}\n          </div>\n          <div class="response__headerCell response__header__string" ng-class="{\'l-attendee\':hr.ftype === \'attendee\'}"\n               ng-repeat="hr in fr.headers" translate>{{hr.v}}\n          </div>\n          <div class="response__headerCell response__header__more">\n            <a ng-click="toggleDetails(fr)">{{fr.isOpen ? \'hide details\' : \'show details\'}}</a></div>\n          <div class="response__headerCell response__header__delete">\n            <a ng-click="!fr.isDeleted && toggleEditMode(fr)"\n               ng-class="{\'l-disabled\': fr.isDeleted}"\n               ng-attr-title="{{fr.isDeleted ? \'Cannot edit a deleted response\' : \'\'}}"><i class="flaticon-draw"></i></a>\n            &nbsp;&nbsp;\n            &nbsp;&nbsp;\n            <a ng-click="startDeleteResponse(fr)"><i class="flaticon-delete"></i></a>\n          </div>\n        </div>\n        <div class="response__body">\n\n          <div class="response__body__row l-narrow" ng-class="{\'l-header\':$index===0}" ng-repeat="entry in fr.headers">\n            <div\n                class="response__body__cell response__body__label" translate>{{entry.title}}\n            </div>\n            <div\n                class="response__body__cell response__body__content">{{entry.v}}\n            </div>\n          </div>\n\n          <div class="response__body__row" ng-class="{\'l-open\':fr.isOpen}" ng-repeat="entry in fr.body">\n            <div\n                class="response__body__cell response__body__label" translate>{{entry.title}}\n            </div>\n            <div\n                class="response__body__cell response__body__content">{{entry.v}}\n              <div></div>\n            </div>\n\n          </div>\n\n        </div>\n      </div>\n    </div>\n  </div>\n\n\n  <div class="rsvp__showDeletedSection" style="text-align:right;">\n    <label style="cursor:pointer;" title="Include responses that have been deleted">\n      <input type="checkbox" ng-model="viewState.includeDeleted">\n      Show deleted\n    </label>\n  </div>\n\n  <div class="rsvp__loadMoreSection">
2\n    <a ng-click="loadMore()" ng-if="hasNext">Load More</a>\n  </div>\n\n</div>\n'},1206(e){e.exports='<div>\n\n\n  <div class="container-fluid tkf-settings-page">\n    <form name="fUser" ng-show="user" novalidate role="form">\n\n      <legend>Account Settings</legend>\n\n      <div ng-if="alerts.length > 0">\n\n        <div class="help-block--bright help-block--large help-block--header">Important! We are unable to contact you.\n        </div>\n\n        <div class="tkf-bounce-notice" ng-if="alerts[0].reason.startsWith(\'complaint\')">\n          <p><b>You have manually marked at least one of our emails to you as\n            spam so we have stopped sending you emails of any kind.</b></p>\n          <p>Please correct this and then contact\n            <a href="mailto:[email protected]?subject=Unblock {{alerts[0].email}}">[email protected]</a>\n            to get resume receiving emails.</p>\n          <p>Please note that our system will block you again instantly if any email is manually marked as spam.</p>\n          <p>You will not receive RSVP, User-submitted event or billing notifications while your email is blocked.</p>\n        </div>\n        <div class="tkf-bounce-notice" ng-if="alerts[0].reason.startsWith(\'bounce\')">\n          <p>We tried to email you using your account/contact email address <b>{{alerts[0].email}}</b>,\n            but the email was rejected with this error:\n          </p>\n\n          <p><i>{{alerts[0].detail}}</i></p>\n\n          <p><b>We have stopped sending you emails of any kind until this is resolved</b></p>\n\n          <p>If this address is correct please resolve the problem and contact\n            <a href="mailto:[email protected]?subject=Unblock email {{alerts[0].email}}">Tockify support</a>\n            to resume receiving email from us.</p>\n\n          <p>If this address is not correct, please change it in account settings.</p>\n\n          <p>You will not receive RSVP, User-submitted event or billing notifications while your email is blocked.</p>\n\n        </div>\n        <div class="tkf-bounce-notice" ng-if="alerts[0].reason.startsWith(\'unknown\')">\n          <p>We are not sending emails to <b>{{alerts[0].email}}</b>.\n            This is because we\'ve been unable to reach you and have ceased trying.\n          </p>\n\n          <p>
2If the address is correct and you wish to resume receiving emails please contact\n            <a href="mailto:[email protected]?subject=Unblock email {{alerts[0].email}}">[email protected]</a></p>\n\n          <p>If this address is not correct, please change it in account settings.</p>\n\n          <p>You will not receive RSVP, User-submitted event or billing notifications while your email is blocked.</p>\n\n        </div>\n\n\n      </div>\n\n      <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fUser.name.$invalid}">\n        <label class="control-label" for="uName">Your name - so we know what to call you</label>\n        <input class="form-control" id="uName" name="name" ng-model="user.name"\n               placeholder="full name" required server-error type="text">\n        <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fUser.name.$invalid}"></span>\n        <span class="help-block"\n              ng-show="fUser.name.$dirty && fUser.name.$error.required">Please provide a user name</span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <span class="help-block"\n              ng-show="fUser.name.$pristine && fUser.name.$error.serverError">{{serverErrors.name}}</span>\n      </div>\n\n      <div class="form-group">\n        <label class="control-label" for="uName">Your account/contact email address</label>\n\n        <div class="tkf-settings-shortinput">\n          <input class="form-control tkf-settings-shortinput" disabled id="uEmail" name="email"\n                 ng-model="user.rawEmail" placeholder="email address" type="text">\n          <a ng-click="showChangeEmailAddress()">Change Email Address</a>\n        </div>\n      </div>\n\n      <div class="form-group" ng-if="!user.noPW">\n        <label class="control-label" for="uName">Change Your Password</label>\n        <p>\n          <button class="btn btn-default" ng-click="showChangePassword()" type="button">Change Password</button>\n        </p>\n      </div>\n      <div class="form-group" ng-if="user.noPW">\n        <label class="control-label" for="uName">Reset Password</label>\n        <p>\n            You login automatically using single sign-on, so don\'t have a password.\n            If you want to login directly at https://tockify.com\n          <a btn btn-default" href="/i/site/forgotPassword?email={{user.rawEmail}}">Reset Password</a>\n        </p>\n      </div>\n\n      <div ng-if="!hideMFA">\n        <legend>Multi-Factor Authentication</legend>\n        <p>\n          Multi-Factor Authentication (MFA) adds an additional layer of security to your account\n          by requiring more than just a password to sign in.\n        </p>\n\n        <div ng-if="!user.mfaEnabled">\n          <p>\n            When MFA is enabled, after you login using your password\n            we will email you a one-time link to complete your login.\n          </p>\n          <div><a class="btn btn-default" ng-click="showChangeMFA(true)">Enable MFA</a></div>\n        </div>\n\n        <div ng-if="user.mfaEnabled">\n          <b>MFA is enabled</b>. <a class="btn btn-default"  ng-click="showChangeMFA(false)">Disable MFA</a>\n          <p>\n            After you login using your password\n            we will email you a one-time link to complete your login.\n          </p>\n          <p>\n            If you lose access to your email account, you can login using a recovery code.\n            <b>You should view the recovery codes below and copy them somewhere safe</b>.\n          </p>\n          <a href="" ng-click="showRecoverMFA()">Show Recovery Codes</a>\n        </div>\n\n      </div>\n\n\n    </form>\n\n  </div>\n\n  <div class="container-fluid settings-controls-bottom">\n    <button class="btn btn-siteform" ng-click="updateUser()" type="button">Save Changes</button>\n    <button class="btn btn-default" ng-click="refreshUser()" type="button">Cancel Changes</button>\n    <a class="settings-delete-link" ui-sref="siteform.closeAccount">close your account</a>\n  </div>\n\n\n</div>\n'},6578(e){e.exports='<div class="editor__missingEvent">\n\n  <div class="editor__missingEvent__message">\n    <h2>\n      We couldn\'t find that calendar\n    </h2>\n    <h3>\n      It might have been deleted or there might be a typo its name.\n    </h3>\n\n    <div class="l-button">\n      <button class="btn btn-lg btn-siteform" ng-click="goBack($event)">Back To Settings</button>\n    </div>\n  </div>\n\n</div>'},4441(e){e.exports='<div class="container-fluid tkf-settings-page">\n  <form name="fExport" ng-show="calendar" novalidate role="form">\n    <div ng-init="forms.fExport = fExport"></div>\n    <legend>Export Events</legend>\n\n    <div class="form-group">\n      <label>Format</label>\n      <p>Events will be exported in iCalendar (.ics) format</p>\n      <div class="checkbox">\n        <label>\n          <input type="checkbox" ng-model="export.html"> Allow HTML in exported event descriptions\n        </label>\n      </div>\n      <p class="help-block">The iCalendar standard doesn\'t strictly allow this, but it\'s widely supported and keeps\n        your event formatting.</p>\n    </div>\n\n    <div class="form-group">\n      <label>Visibility</label>\n      <div class="checkbox">\n        <label>\n          <input type="checkbox" ng-model="export.private"> Include <b>unlisted</b> and <b>unpublished</b> events\n        </label>\n      </div>\n      <p class="help-block">These are events where you have set <u>+Status</u> and are not publicly visible.</p>\n    </div>\n\n    <div class="form-group">\n      <label>Tags</label>\n      <p class="help-block">Limit the export to specified tags.</p>\n      <tags-input allow-leftover-text="true" min-length="1" ng-if="tagOptionsLoaded" ng-model="export.tagsArray"\n        placeholder="add tags here" select-first-match="true">\n        <auto-complete highlight-matched-text="false" load-on-empty="true" load-on-focus="true"\n          max-results-to-show="100" min-length="0" ng-if="tagOptions" select-first-match="true"\n          source="matchedTagOptions($query
2)">\n        </auto-complete>\n      </tags-input>\n    </div>\n\n    <div class="form-group">\n      <label>Date Range</label>\n      <p>By default, all events will be exported, including repeats years into the future.</p>\n      <p>You can limit the exported events by setting a date range.</p>\n\n      <div class="checkbox">\n        <label>\n          <input type="checkbox" ng-model="export.enableStart"> Start Date After\n        </label>\n      </div>\n      <div ng-if="export.enableStart" class="tkf-settings-date-picker">\n        <div class="tkfSelect__input" style="width: 200px;">\n          <input type="text" class="form-control" ng-model="export.startString"\n            data-date-format="{{ANGULAR_DATE_FORMAT}}" data-date-type="string" data-autoclose="1"\n            data-placement="top-left" placeholder="start date" bs-datepicker>\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>\n\n      <div class="checkbox">\n        <label>\n          <input type="checkbox" ng-model="export.enableEnd"> End Date Before\n        </label>\n      </div>\n      <div ng-if="export.enableEnd" class="tkf-settings-date-picker">\n        <div class="tkfSelect__input" style="width: 200px;">\n          <input type="text" class="form-control" ng-model="export.endString" data-date-format="{{ANGULAR_DATE_FORMAT}}"\n            data-date-type="string" data-autoclose="1" data-placement="top-left" placeholder="end date" bs-datepicker>\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>\n    </div>\n\n    <div class="form-group tkf-settings-controls-bottom">\n      <button class="btn btn-siteform" type="button" ng-click="exportEvents()">Export Events</button>\n    </div>\n\n  </form>\n</div>\n'},9648(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer">\n\n  <div ng-if="pageState.ready && accounts.length === 0">\n    <legend>Google Calendar Sync Setup</legend>\n\n    <form class="popup-body" name="fStartGoogleSync" novalidate role="form">\n\n      <h3>We need your permission to access your Google calendar</h3>\n\n      <div style="margin-bottom: 25px;font-size:1.1em;line-height: 1.4em; font-family: Helvetica,Arial,Sans-Serif">\n        <p>\n          Our Google Calendar Sync feature lets you display events from your Google\n          Calendar using Tockify\'s visually rich layouts.\n        </p>\n        <p>\n          To make it work we need <b>read-only</b> access your Google calendar and event details, so we have\n          to ask your permission for that first.\n        </p>\n        <p>Pressing "Authorize Google Calendar Access" below will take you to a Google page\n          where you\'ll be asked to grant us the necessary permission. If you are already logged in\n          to Google with more than one account you\'ll be asked to choose one first.</p>\n\n        <p>We will never use the access you grant us for any purpose other than providing the Google Sync feature.</p>\n\n      </div>\n\n\n      <button class="btn btn-siteform btn-lg" ng-click="startOAuth()" type="button">Authorize Google Calendar Access\n      </button>\n\n\n    </form>\n  </div>\n\n  <form name="fGoogleSync" ng-if="pageState.ready && accounts.length > 0" ng-show="calendar" novalidate role="form">\n    <div ng-init="forms.fGoogleSync = fGoogleSync"></div>\n    <fieldset>\n      <legend>Google Calendar Sync Setup</legend>\n\n      <div\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fGoogleSync.name.$invalid && !fGoogleSync.name.$pristine}">\n        <label class="control-label" for="cNewName">A one word short name for your calendar (like a Twitter\n          name)</label>\n        <input class="form-control" id="cNewName" name="name" ng-model="calendar.name"\n               placeholder="calendar short name" required server-error type="text">\n        <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fGoogleSync.name.$invalid}"></span>\n        <span class="help-block"\n              ng-show="!fGoogleSync.name.$error.serverError && fGoogleSync.name.$dirty && fGoogleSync.name.$error.required">\n                    Please pick a calendar name</span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <sp
2an class="help-block"\n              ng-show="fGoogleSync.name.$error.serverError">{{serverErrors.name}}</span>\n      </div>\n\n      <div class="form-group" ng-if="accounts.length === 1">\n        <label>Google account: </label>\n        <div>\n          {{accounts[0].email}}\n        </div>\n      </div>\n\n      \x3c!--<span ng-if="!accounts[0].isAuthenticated">We no longer have access to this accounts calendars. Please re-authenticate.</span>--\x3e\n\n      <div class="form-group" ng-if="accounts.length > 1">\n        <label>Which Google account is the calendar in?</label>\n        <select class="form-control" ng-model="selection.account" ng-options="ga as ga.email for ga in accounts">\n        </select>\n      </div>\n      <div class="form-group">\n        <button class="btn btn-default" ng-click="startOAuth()" type="button">Authorize Calendar Access For A Different\n          Google account\n        </button>\n      </div>\n\n      <div class="form-group" ng-if="calendars.length === 0">\n        No Google calendars were found for {{selection.account.email}}\n      </div>\n\n      <div class="form-group" ng-if="calendars.length > 0">\n        <label>Which Google Calendar would you like to sync with</label>\n        <select class="form-control" name="calendar" ng-model="selection.calendar"\n                ng-options="c as c.summary for c in calendars">\n          <option value="">-- Select calendar to sync --</option>\n        </select>\n        \x3c!--<span class="help-block" ng-show="!fGoogleSync.calendar.$error.required">--\x3e\n        \x3c!--Please pick a calendar name</span>--\x3e\n      </div>\n\n    </fieldset>\n  </form>\n</div>\n\n<div class="container-fluid settings-controls-bottom" ng-if="!calendar._id">\n  <button class="btn btn-siteform"\n          ng-if="accounts.length > 0"\n          ng-disabled="!selection.calendar"\n          ng-click="createSyncedCalendar()" type="button">Create\n    Synced Calendar\n  </button>\n  <button class="btn btn-default" ng-click="cancelChanges()" type="button">Cancel</button>\n</div>\n\n\n\n\n\n\n\n\n'},5053(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer">\n\n  <div ng-if="pageState.ready && accounts.length === 0">\n    <legend>Manage Google Calendar Sync</legend>\n\n    <form class="popup-body" name="fStartGoogleSync" novalidate role="form">\n\n      <h3>We need your permission to access your Google calendar</h3>\n\n      <div style="margin-bottom: 25px;font-size:1.1em;line-height: 1.4em; font-family: Helvetica,Arial,Sans-Serif">\n        <p>\n          Our Google Calendar Sync feature lets you display events from your Google\n          Calendar using Tockify\'s visually rich layouts.\n        </p>\n        <p>\n          To make it work we need <b>read-only</b> access your Google calendar and event details, so we have\n          to ask your permission for that first.\n        </p>\n        <p>Pressing "Authorize Google Calendar Access" below will take you to a Google page\n          where you\'ll be asked to grant us the necessary permission. If you are already logged in\n          to Google with more than one account you\'ll be asked to choose one first.</p>\n\n        <p>We will never use the access you grant us for any purpose other than providing the Google Sync feature.</p>\n\n      </div>\n\n      <button class="btn btn-siteform btn-lg"\n              ng-click="startOAuth()" type="button">Authorize Google Calendar Access\n      </button>\n\n    </form>\n  </div>\n\n  <form name="fGoogleSync" ng-if="pageState.ready && accounts.length > 0" ng-show="calendar" novalidate role="form">\n    <div ng-init="forms.fGoogleSync = fGoogleSync"></div>\n    <fieldset>\n      <legend>Manage Google Calendar Sync</legend>\n\n      <div class="form-group" ng-if="selection.id">\n        <p>\n          Your Tockify calendar is connected to and receiving updates from Google calendar as below:\n        </p>\n\n\n        <div class="tkf-google-connection-diagram">\n          <div>\n            <div class="l-from">\n              <div class="l-caltype">Google Calendar</div>\n              <div class="l-calname">{{selection.name}}</div>\n              <div class="l-account">from {{selection.email}}</div>\n            </div>\n          </div>\n          <div>\n            <div class="l-line">\n              <div class="l-arrow">&darr;</div>\n            </div>\n          </div>\n          <div>\n            <div class="l-to">\n              <div class="l-caltype">Tockify Calendar</div>\n              <div class="l-calname">{{calendar.name}}</div>\n            </div>\n          </div>\n\n        </div>\n\n        <p>\n          You can disconnect from Google at any time. This can have a major impact on your calendar so if you want to do\n          that\n          we\'ll guide you through the process.\n        </p>\n\n        <p>\n          If you want to sync with a different Google Calendar you\'ll need to disconnect from the current one first.\n          Each\n          Tockify calendar can only sync with one Google Calendar at a time.\n        </p>\n\n        <div class="tkf-google-disconnect-row" ng-if="!pageState.disconnecting" ng-click="pageState.disconnecting=true">\n\n          <a class="btn btn-siteform" ui-sref="settings.calendar.main({id:calendar.name})">Back to Settings</a>\n          <button class="btn btn-default" type="button" ng-click="pageState.disconnecting=true">Disconnect from the\n            Google Calendar\n          </button>\n\n        </div>\n\n        <div ng-if="pageState.disconnecting">\n\n          <div class="tkf-google-disconnect-notice">\n            <h3 class="l-short">Disconnection Options</h3>\n\n            <p><span class="label label-danger">Warning</span> Disconnecting from a Google calendar can\n              lead to major irreversible changes to the events in your calendar. </p>\n\n            <p>When you disconnect from a Google Calendar you have to decide what to do with the events\n              that came from that calendar. Do you want to: </p></div>\n\n          <div class="tkf-settings-optionBlock">\n            <h4>Keep things as they are</h4>\n            <div>\n              <a class="btn btn-siteform" ui-sref="settings.calendar.main({id:calendar.name})">Cancel disconnection</a>\n            </div>\n          </div>\n\n          <div class="tkf-settings-optionBlock">\n            <h4>Disconnect and remove all events that came from Google</h4>\n            <p>This will remove all events that came from the\n              synced Google calendar as well as any images or other enhnacements you made to those events.</p>\n            <p><span class="label label-danger">Warning</span> You will not be able to reverse this action</p>\n            <div>\n              <button class="btn btn-danger" ng-click="disconnectSync(false)" type="button">Disconnect and Remove Google\n                Events\n              </button>\n            </div>\n          </div>\n\n          <div class="tkf-settings-optionBlock">\n            <h4>Disconnect and keep all events that came from Google.</h4>\n            <p>
2Afterwards they will be treated as ordinary Tockify events and will\n              no longer update when you make changes in Google.\n              There is no way to restart syncing of the disconnected events after this change.</p>\n            <p><span class="label label-danger">Warning</span> You will not be able to reverse this action</p>\n            <div>\n              <button class="btn btn-danger" ng-click="disconnectSync(true)" type="button">Disconnect and keep Google\n                Events\n              </button>\n            </div>\n          </div>\n\n        </div>\n      </div>\n\n\n      <div class="form-group" ng-if="!selection.id">\n        <p>Your calendar <b>{{calendar.name}}</b> is not currently synced with a Google Calendar</p>\n        <p>\n          To synchronize with a Google calendar so events flow <i>from</i> Google Calendar <i>to</i> Tockify, choose a\n          Google calendar below and click <b>Sync with Google</b>.\n        </p>\n        <p>\n          If you want events to flow <i>from</i> Tockify <i>to</i> Google Calendar, then you are in the wrong place and\n          should click the\n          <b>Subscribe</b>\n          link in the navigation bar of <a href="/{{calendar.name}}" target="_blank">your calendar</a> instead.\n        </p>\n      </div>\n\n      \x3c!--      <div class="form-group" ng-if="calendar.action === \'disconnect\'">--\x3e\n      \x3c!--        <label class="checkbox-inline">--\x3e\n      \x3c!--          <input ng-model="calendar.keep" type="checkbox">--\x3e\n      \x3c!--          <span>Keep sync\'ed events after disconnect?</span></label>--\x3e\n      \x3c!--      </div>--\x3e\n\n      <div ng-if="!calendar.hasSync">\n        <div class="form-group">\n          <label>Google account</label>\n          <select class="form-control" ng-model="selection.account" ng-options="ga as ga.email for ga in accounts">\n          </select>\n        </div>\n\n        <div class="form-group">\n          <button class="btn btn-default" ng-click="startOAuth()" type="button">Authorize Calendar Access For A\n            Different\n            Google account\n          </button>\n        </div>\n\n        <div class="form-group" ng-if="calendars.length === 0">\n          No Google calendars were found for {{selection.account.email}}\n        </div>\n\n        <div class="form-group" ng-if="calendars.length > 0">\n          <label>Google Calendar</label>\n          <select class="form-control" name="calendar" ng-model="selection.calendar"\n                  ng-options="c as c.summary for c in calendars">\n            <option value="">-- Select calendar to sync --</option>\n          </select>\n        </div>\n      </div>\n\n    </fieldset>\n  </form>\n</div>\n\n<div ng-if="!calendar.hasSync && accounts.length > 0" class="container-fluid settings-controls-bottom">\n  <button class="btn btn-siteform" type="button"\n          ng-disabled="(!selection.calendar || selection.calendar.summary === selection.name)"\n          ng-click="connectSync()">Sync with Google\n  </button>\n  <button class="btn btn-default" ng-click="cancelChanges()" type="button">Cancel</button>\n</div>\n\n\n\n\n\n\n\n\n'},3497(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer" ng-if="pageState.ready">\n\n  <div ng-if="account.isAuthenticated">\n    <h3>Google Calendar Sync Authorized</h3>\n\n    <h4>Thank you</h4>\n\n\n    <p>The Google Calendar account for <span class="tkf-google__reauth-email">{{account.email}}</span>\n      has been authorized for Tockify Google Sync</p>\n\n  </div>\n\n  <div ng-if="!account.isAuthenticated">\n    <h3>Reauthorize Google Calendar Sync</h3>\n\n    <form class="popup-body" name="fStartGoogleSync" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <p>\n          Our permission to stay in sync with your calendar has been revoked.\n          To restart the synchronization process we need you to give us permission again.\n        </p>\n        <p>\n          There are a few different ways that this could have happened. It could be due to a\n          policy change by Google or have been caused by some action you took, such as manually revoking\n          our permission.\n        </p>\n        <p>Please click below to re-authorize us so that we can keep your Tockify calendar in sync with your\n          Google one.</p>\n      </div>\n\n      <div class="tkf-google__reauth">\n        <h4 class="tkf-google__reauth-big-notice">The account you need to reauthorize is <span\n            class="tkf-google__reauth-email">{{account.email}}</span></h4>\n\n\n        <button class="btn btn-siteform btn-lg" ng-click="startOAuth()" type="button">Reauthorize {{account.email}}\n        </button>\n      </div>\n\n    </form>\n  </div>\n</div>\n\n\n\n\n\n\n'},7203(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer">\n  <form name="fImport" ng-show="calendar" novalidate role="form">\n    <div ng-init="forms.fImport = fImport"></div>\n    <legend>Import Events from an iCalendar (.ics) file</legend>\n\n    <div class="bs-callout bs-callout-danger" ng-if="calendar.effectiveFeatureLevel <= 0">\n      <h4>Import Events is not available with your free plan</h4>\n    </div>\n    <div ng-if="calendar.effectiveFeatureLevel > 0">\n      <div ng-if="!ics.importedCount">\n        <p>Your calendar <b>{{calName}}</b> doesn\'t contain any imported events.</p>\n      </div>\n      <div ng-if="ics.importedCount">\n        <p>Your calendar <b>{{calName}}</b> contains <b>{{ics.importedCount}}</b> imported events.\n          <a class="settings-delete-link l-inline" href=\'\'\n             ng-click="showDeleteImportedEventsModal()">delete all imported events</a></p>\n        \x3c!--                <button class="btn btn-danger"--\x3e\n        \x3c!--                        ng-click="showDeleteImportedEventsModal()">Delete All Previously Imported Events--\x3e\n        \x3c!--                </button>--\x3e\n        \x3c!--                <a ng-href="{{editorURL}}" target="_self">Go To Editor</a>--\x3e\n      </div>\n\n      <div ng-if="ics.state === \'none\'">\n        <div class="form-group tkf-settings-import-button">\n          <label>Import events from iCalendar (.ics) file</label>
2\n          <span class="form-group">\n            <button class="btn btn-siteform" ics-upload-button\n                    on-upload-complete="icsFileUploaded(info)">Choose iCalendar File\n            </button>\n          </span>\n        </div>\n\n        <div ng-if="isDudaUser">\n          <label class="checkbox-inline">\n            <input ng-model="loxi.show" type="checkbox">\n            <span>Import events from Loxi calendar</span>\n          </label>\n\n          <div ng-if="loxi.show">\n            <div class="input-group tkf-settings-loxi-import">\n              <input class="form-control" name="loxiName"\n                     ng-model="loxi.calName"\n                     placeholder="my-calendar-name"\n                     type="text">\n              <div class="input-group-addon">.loxi.io</div>\n            </div>\n\n            <div class="form-group tkf-settings-loxi-import-button">\n              <button class="btn btn-siteform"\n                      ng-disabled="!loxi.calName"\n                      ng-click="loxiExport(loxi.calName)">Import Loxi Calendar\n              </button>\n            </div>\n          </div>\n\n        </div>\n\n        <div class="l-googlesync">\n          <legend>Syncing/Importing from Google Calendars</legend>\n          Google Sync isn\'t managed here: If you\'re trying to sync your calendar with a Google Calendar\n          then the settings you need are at the bottom of <a\n            ui-sref="settings.calendar.main({id:calendar._id})">this page</a>.\n        </div>\n      </div>\n\n      <div ng-if="ics.state === \'pending\'" class="form-group tkf-settings-import-progress">\n        <legend>Import In Progress</legend>\n        <div>\n          Events are currently being imported from <b>{{ics.fileName}}</b>.\n          This page will automatically update when the import is complete.\n          <button class="btn btn-secondary" ng-click="abort()">Cancel</button>\n        </div>\n      </div>\n\n      <div ng-if="ics.state === \'error\'" class="form-group tkf-settings-import-progress">\n        <legend>Import Error</legend>\n        <div>\n          An error occurred importing from <b>{{ics.fileName}}</b>.\n          <span ng-if="icsImport.loxiExport">Check Loxi calendar exists.</span>\n          <span ng-if="!icsImport.loxiExport">Check file is in iCalendar format.</span>\n          <br/>\n          Error: {{ics.error}}\n          <button class="btn btn-secondary" ng-click="abort()">Cancel</button>\n          <br/>\n        </div>\n      </div>\n\n      <div ng-if="ics.state === \'success\' && ics.dryRun" class="tkf-settings-import-summary">\n        <legend>Import Checks and Preferences</legend>\n\n        <p>The file you are importing contains <b>{{ics.futureEvents}}</b> future events\n          and <b>{{ics.pastEvents}}</b> past events.</p>\n\n        <p ng-if="ics.importedCount">If the unique ids of any of the events you import match events that have already\n          been imported then\n          those events will be updated.</p>\n\n        <div ng-if="ics.pastEvents && ics.futureEvents">\n          <label>What to Import</label>\n          <div class="form-group">\n\n            <label class="checkbox-inline">\n              <input type="radio" ng-model="icsImport.futureEventsOnly"\n                     ng-value="{{true}}" ng-click="futureOnly()"> Import future events only</label>\n            <label class="checkbox-inline">\n              <input type="radio" ng-model="icsImport.futureEventsOnly"\n                     ng-value="{{false}}" ng-click="futureOnly()"> Import all events</label>\n          </div>\n        </div>\n\n        \x3c!--                <div ng-if="ics.otherCount">--\x3e\n        \x3c!--                    <p>Your calendar contains <b>{{ics.otherCount}}</b> other non-imported event{{ics.otherCount>1?\'s\':\'\'}}</p>--\x3e\n        \x3c!--                    <div class="form-group">--\x3e\n        \x3c!--                        <label class="checkbox-inline">--\x3e\n        \x3c!--                            <input type="radio" ng-model="icsImport.deleteAllEvents"--\x3e\n        \x3c!--                                   ng-value="{{false}}"> Keep existing events</label>--\x3e\n        \x3c!--                        <label class="checkbox-inline">--\x3e\n        \x3c!--                            <input type="radio" ng-model="icsImport.deleteAllEvents"--\x3e\n        \x3c!--                                   ng-value="{{true}}" ng-click="showDeleteEventsModal()"> Delete all existing--\x3e\n        \x3c!--                            events</label>--\x3e\n        \x3c!--                    </div>--\x3e\n        \x3c!--                </div>--\x3e\n\n        <div ng-if="ics.timezone && ics.timezone !== calendar.tzid" class="form-group">\n          <label>Timezone Check</label>\n          <p>The timezone of the imported events is different to the timezone of your calendar.</p>\n          <div class="form-group">\n            <label class="checkbox-inline">\n              <input type="radio" ng-model="icsImport.convertTZ"\n                     ng-value="{{false}}" ng-click="convertTZ()"> Keep original timezone</label>\n            <label class="checkbox-inline">\n              <input type="radio" ng-model="icsImport.convertTZ"\n                     ng-value="{{true}}" ng-click="convertTZ()"> Convert timezone to match\n              calendar</label>\n          </div>\n          <p>If neither setting is giving the correct times contact\n            <a href="mailto:[email protected]?subject=import%20timezone%20problem">[email protected]</a></p>\n        </div>\n\n      </div>\n\n    </div>\n  </form>\n\n  <div ng-if="previewItems">\n    <legend>Import Preview</legend>\n    <p>Here is a preview showing a few imported events. Check the titles and times to make sure everything is ok.\n      Then click the "Accept And Complete Import" button below to complete the import or "Abort Import" to abort it.</p>\n  </div>\n\n  <div class="importItemWrap" ng-repeat="ev in previewItems | filter:filter">\n\n    <div class="importItem">\n      <div class="importItem__summary">\n        <h4 class="d-title d-titleText agendaItem__title">
2\n          <span ng-bind-html="ev.title"></span>\n        </h4>\n      </div>\n\n      <div class="d-when importItem__when">\n        <span>{{ev.longStartDate}}</span>\n        <span> {{ev.startTime}}</span>\n        <span ng-if="ev.hasEnd"> - {{ev.longEndDate}} {{ev.endTime}}</span>\n        <span>{{ev.startYear}}</span>\n        <span>({{ev.shortTimezone}})</span>\n      </div>\n    </div>\n\n  </div>\n\n</div>\n\n<div class="container-fluid settings-controls-bottom" ng-if="ics.state === \'success\' && ics.dryRun">\n  <button class="btn btn-siteform" ng-click="importEvents()" type="button">Accept And Complete Import\n  </button>\n  <button class="btn btn-default" ng-click="abort()" type="button">Abort Import</button>\n\n  \x3c!--    <a ng-if="ics.importCount" class="settings-delete-link" href=\'\'--\x3e\n  \x3c!--       ng-click="showDeleteImportedEventsModal()">delete all previously imported events</a>--\x3e\n\n</div>\n'},6731(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer" ng-if="calendar">\n\n  <form name="fCalendar" ng-show="calendar" novalidate role="form">\n    <div ng-init="forms.fCalendar = fCalendar"></div>\n\n    <h3 ng-if="!calendar._id">Create a new Calendar</h3>\n\n    <legend ng-if="calendar._id">Calendar Settings</legend>\n\n    <div class="form-group" ng-if="calendar._id">\n      <label class="control-label" for="cName">Calendar Status</label>\n      <div ng-if="calendar.status.name === \'online\'"><span class="label label-success">Online</span> <a href="#"\n                                                                                                        ng-click="setOffline()">Take\n        Calendar Offline</a></div>\n      <div ng-if="calendar.status.name === \'offline\'"><span class="label label-default">Offline</span>\n        <a href="#" ng-click="setOnline()" ng-if="user.unusedCalendars > 0">Bring Calendar Online</a>\n        <span ng-if="user.unusedCalendars <= 0">You have used all the online calendars in your plan. You need to take another\n          calendar offline or upgrade your plan to before you can bring this one online.</span>\n      </div>\n      <div ng-if="calendar.status.name === \'pending.deletion\'">\n        <div><p><span class="label label-danger">Deleting</span> This calendar is offline and will be deleted in the\n          near future.</p>\n          <p>Click here to <a href="#" ng-click="undoDelete()">Cancel Calendar Deletion</a></p>\n        </div>\n      </div>\n    </div>\n\n\n    <div class="form-group" ng-if="calendar._id">\n\n\n      <label class="control-label" for="cName">Your calendar\'s short name</label>\n\n      <div class="tkf-settings-shortinput">\n        <input class="form-control tkf-settings-shortinput" disabled id="cName" name="name"\n               ng-model="calendar.name" placeholder="calendar short name" type="text">\n        <a href="#" ng-click="showChangeName()">Change Calendar Name</a>\n      </div>\n    </div>\n    <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fCalendar.name.$invalid && !fCalendar.name.$pristine}"\n         ng-if="!calendar._id">\n      <label class="control-label" for="cNewName">A one word short name for your calendar (like a Twitter\n        name)</label>\n      <input class="form-control" id="cNewName" name="name" ng-model="calendar.name"\n             placeholder="calendar short name" required server-error type="text">
2\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fCalendar.name.$invalid}"></span>\n      <span class="help-block"\n            ng-show="!fCalendar.name.$error.serverError && fCalendar.name.$dirty && fCalendar.name.$error.required">\n                    Please pick a calendar name</span>\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fCalendar.name.$error.serverError">{{serverErrors.name}}</span>\n    </div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fCalendar.displayName.$invalid && !fCalendar.displayName.$pristine}">\n      <label class="control-label" for="cDisplayName">A title for the top of the calendar (not shown when\n        embedded)</label>\n      <input class="form-control" id="cDisplayName" name="displayName"\n             ng-disabled="calendar.externalSource && calendar.externalDisplayName"\n             ng-model="calendar.displayName"\n             placeholder="calendar title" required server-error type="text">\n\n      <label class="checkbox-inline tkf-settings-checkline" ng-if="calendar.externalSource">\n        <input ng-model="calendar.externalDisplayName" type="checkbox">\n        <span>Use Google Calendar title <span\n            ng-if="calendar.externalDisplayName">(updates with next sync)</span></span></label>
2\n      <span\n          ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fCalendar.displayName.$invalid}"></span>\n      <span class="help-block"\n            ng-show="!fCalendar.displayName.$error.serverError && fCalendar.displayName.$dirty && fCalendar.displayName.$error.required">\n                    Please pick a calendar title</span>\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fCalendar.displayName.$error.serverError">{{serverErrors.displayName}}</span>\n    </div>\n\n    <div class="form-group">\n      <label>Where are you (so we can get the timezone right)</label>\n      <select class="form-control" ng-disabled="calendar.externalSource && calendar.externalTZID"\n              ng-model="calendar.tzid" ng-options="tz for tz in tzs">\n      </select>\n      <label class="checkbox-inline tkf-settings-checkline" ng-if="calendar.externalSource">\n        <input ng-model="calendar.externalTZID" type="checkbox">\n        <span>Use Google Calendar timezone <span\n            ng-if="calendar.externalTZID">(updates with next sync)</span></span></label>\n\n    </div>\n\n    <div class="form-group">\n      <label>Language (we\'ll use your language if we have a translation available)</label>\n      <select class="form-control" ng-disabled="calendar.externalSource && calendar.externalLocale"\n              ng-model="calendar.locale"\n              ng-options="locale.c as locale.n for locale in locales">\n      </select>\n      <label class="checkbox-inline tkf-settings-checkline" ng-if="calendar.externalSource">\n        <input ng-model="calendar.externalLocale" type="checkbox">\n        <span>Use Google Calendar language <span ng-if="calendar.externalLocale">(updates with next sync)</span></span></label>\n    </div>\n\n    <div class="form-group">\n      <label>First day of Week</label>\n      <select class="form-control"\n              ng-model="calendar.wkstart"\n              ng-options="day.v as day.label for day in days">\n      </select>\n    </div>\n\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fCalendar.rsvpEmail.$invalid && !fCalendar.rsvpEmail.$pristine}">\n      <label class="control-label">RSVP Email (if blank we\'ll use the account email address instead)</label>\n      <input class="form-control" id="cRSVPEmail"\n             name="rsvpEmail"\n             ng-blur="doMailCheck(\'fCalendar\',\'rsvpEmail\')"\n             ng-focus="clearMailCheck(\'fCalendar\',\'rsvpEmail\')" ng-model="calendar.rsvpEmail"\n             placeholder="email for RSVPs" server-error type="text">
2\n      <span\n          ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fCalendar.rsvpEmail.$invalid}"></span>\n      <span class="help-block"\n            ng-show="!fCalendar.rsvpEmail.$error.serverError && fCalendar.rsvpEmail.$dirty && fCalendar.rsvpEmail.$error.email">\n                That doesn\'t look like an email address\n                </span>\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fCalendar.rsvpEmail.$error.serverError">{{serverErrors.rsvpEmail}}</span>\n      <label class="checkbox-inline tkf-settings-checkline">\n        <input ng-model="calendar.acknowledgeRSVP" type="checkbox">\n        <span>Send acknowledgement emails when people respond to RSVPs</span></label>\n    </div>\n\n    <div class="form-group">\n      <div>{{\'How many months should RSVP responses be retained \' | translate}}&nbsp;<select\n          class="form-control settings__showWhenPicker"\n          ng-model="calendar.rsvpRetainMonths"\n          ng-options="num.v as num.label for num in rsvpMonthOptions"></select>\n      </div>
2\n      <span class="help-block" style="font-size: smaller">Note: This is for compliance with privacy laws like\n      the EU\'s GDPR. Responses are irreversibly deleted after the retention period.</span>\n    </div>\n\n    <div\n        class="form-group" ng-if="calendar.effectiveFeatureLevel >= 200">\n        <label class="control-label" for="emailFrom">The "From" display name shown in Tockify emails sent to your users (optional)</label>\n        <input class="form-control" id="emailFrom" name="emailFrom"\n            ng-model="calendar.emailFrom"\n            ng-blur="sanitizeEmailFrom()"\n            placeholder="Tockify Notifier" type="text">\n    </div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fCalendar.canonicalHost.$invalid && !fCalendar.canonicalHost.$pristine}"\n        ng-if="calendar.effectiveFeatureLevel >= 200">\n      <label class="control-label" for="canonicalHost">The subdomain to use for your white label calendar\n        (optional)</label>\n      <input class="form-control" id="canonicalHost" name="canonicalHost" ng-model="calendar.canonicalHost"\n             placeholder="calendar.mysite.com" server-error type="text" validate-subdomain>\n      <span\n          ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fCalendar.canonicalHost.$invalid}"></span>\n      <span class="help-block"\n            ng-show="fCalendar.canonicalHost.$error.notSubdomain">That doesn\'t look like a subdomain (you can\'t use a top level domain)</span>\n      <span class="help-block"\n            ng-show="fCalendar.canonicalHost.$error.notWebDomain">Don\'t use <b>www</b> - that\'s already in use by your website</span>\n      <span class="help-block" ng-show="!fCalendar.canonicalHost.$error.serverError">See the <a target="_blank"\n                                                                                                ui-sref="docs.inter.howto.whitelabel">White Label guide</a>\n      for details</span>\n      <span class="help-block"\n            ng-show="!fCalendar.canonicalHost.$error.serverError && fCalendar.canonicalHost.$dirty && fCalendar.canonicalHost.$error.required">\n                    Please pick a calendar title</span>\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fCalendar.displayName.$error.serverError">{{serverErrors.canonicalHost}}</span>\n    </div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fCalendar.gaid.$invalid && !fCalendar.gaid.$pristine}"\n        ng-if="calendar.effectiveFeatureLevel >= 200">\n      <label class="control-label">Google Analytics measurement ID (optional)</label>\n      <input class= "form-control" id="cGaId"\n             ng-model="calendar.gaid"\n             name="gaid"\n             ng-blur="doGaIdCheck(\'fCalendar\',\'gaid\')"\n             ng-focus="clearGaIdCheck(\'fCalendar\',\'gaid\')"\n             placeholder="G-XXXXXXXXXX" type="text">
2\n      <span\n          ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fCalendar.gaid.$invalid}"></span>\n      <span class="help-block"\n            ng-show="!fCalendar.gaid.$error.serverError && fCalendar.gaid.$dirty && fCalendar.gaid.$error.gaid">\n            That doesn\'t look like a valid Google Analytics ID.\n      </span>\n      <div ng-if="calendar.gaid.startsWith(\'UA-\')" class="help-block--bright help-block--large help-block--header">\n        UA- properties no longer collect data. You should migrate to  Google Analytics 4 (GA4).\n      </div>\n      <span class="help-block">\n        See the <a target="_blank" href="https://support.google.com/analytics/answer/9539598">Google\n        Analytics docs</a> for details\n      </span>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">Time display </label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.use24Clock" ng-value="{{true}}" type="radio"> 24 hour clock</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.use24Clock" ng-value="{{false}}" type="radio">\n        Show am/pm based times</label>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">Date Suffixes</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.cardinalDay" ng-value="{{false}}" type="radio"> Default for language</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.cardinalDay" ng-value="{{true}}" type="radio"> Use 1, 2, 3 instead of 1st, 2nd,\n        3rd</label>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">By default show events from</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.channelMode" ng-value="{{false}}" type="radio"> Start of day</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.channelMode" ng-value="{{true}}" type="radio"> Current time</label>
2\n      <span class="help-block">When displaying as a schedule the first calendar entry is the current event\\show</span>\n    </div>\n\n    <div class="form-group">\n      {{\'How many weeks before an event should it be shown \' | translate}}&nbsp;<select\n        class="form-control settings__showWhenPicker"\n        ng-model="calendar.publicWeeksBefore"\n        ng-options="num.v as num.label for num in weekOptions"></select>\n    </div>\n    <div class="form-group">\n      <div>{{\'How many weeks after an event should it be shown \' | translate}}&nbsp;<select\n          class="form-control settings__showWhenPicker"\n          ng-model="calendar.publicWeeksAfter"\n          ng-options="num.v as num.label for num in pastWeekOptions"></select>\n      </div>\n    </div>\n\n    <legend ng-if="calendar._id">Feed Settings</legend>\n    <div class="form-group">\n      <label class="control-label">Make events in the iCalendar feed "block time"\n        <input ng-model="calendar.isOpaque" type="checkbox">\n      </label>\n      <p class="help-block" style="font-size: smaller">If checked then events in the feed will be treated as making the user\'s calendar "busy"</p>\n    </div>\n\n\n    <legend ng-if="calendar._id">Search Settings</legend>\n    <div class="form-group">\n      <label class="control-label">Text Search</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.searchDescription" ng-value="{{false}}" type="radio"> Title but not\n        Description</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.searchDescription" ng-value="{{true}}" type="radio"> Title and Description\n      </label>
2\n      <span class="help-block" style="font-size: smaller">Warning: Including the description can lead to unwanted search matches</span>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">Event Time Default</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.allDayDefault" ng-value="{{true}}" type="radio"> Date Only</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.allDayDefault" ng-value="{{false}}" type="radio"> Date and Time\n      </label>\n    </div>\n\n\x3c!--    <div class="form-group">--\x3e\n\x3c!--      <label class="control-label">Editor Navbar Date Format</label>--\x3e\n\x3c!--      <label class="checkbox-inline">--\x3e\n\x3c!--        <input ng-model="calendar.fourDigitYear" ng-value="{{true}}" type="radio"> 4 digit year</label>--\x3e\n\x3c!--      <label class="checkbox-inline">--\x3e\n\x3c!--        <input ng-model="calendar.fourDigitYear" ng-value="{{false}}" type="radio"> 2 digit year</label>--\x3e\n\x3c!--    </div>--\x3e\n\n    <legend ng-if="calendar._id">Google Sync Settings</legend>\n\n    <div class="form-group" ng-if="calendar._id">\n      <div ng-if="calendar.hasEnabledGoogleSync()">\n        <span class="label label-success">Google Sync Enabled</span>\n        <a ui-sref="settings.google.manageGoogleCalendar({id: calendar.name})">Manage Sync</a>\n      </div>\n      <div\n          ng-if="calendar.status.name === \'online\' && !calendar.hasExternalSource() && calendar.effectiveFeatureLevel > 0">\n\n        <p>This calendar is not currently synced with a Google Calendar.</p>\n\n        <p>Google Sync lets you show events from a Google Calendar in the visually rich Tockify Calendar format\n          and keep them in sync as they are changed in Google Calendar.\n        </p>\n        <p>Events flow <i>from</i> Google calendar <i>to</i> Tockify.</p>\n        <p>If you want events to flow <i>from</i> Tockify <i>to</i> a Google calendar or other personal calendar\n          you don\'t need Google Sync, you need to <i>Subscribe</i> instead using the <b>subscribe</b> link at the top\n          of your Tockify calendar.</p>\n\n        <p>If you want to add Google Sync to your calendar you can do so by clicking on the button below.</p>\n\n        <a ui-sref="settings.google.manageGoogleCalendar({id: calendar.name})" class="btn btn-default">\n          <img class="l-googleFavicon" ng-src="{{googleFavicon}}"> Add Google Sync to this calendar</a>\n      </div>\n      <div ng-if="calendar.hasDisabledGoogleSync()">\n        <span class="label label-danger">Google Sync Disabled</span>\n        <span ng-if="calendar.effectiveFeatureLevel > 0  && calendar.status.name!==\'online\'">Only online calendars are synchronized</span>\n        <span ng-if="calendar.effectiveFeatureLevel <= 0">Only Premium and White Label calendars are synchronized</span>\n      </div>\n    </div>\n\n    <div ng-if="hasPasscodeFeature">\n    <legend ng-if="calendar._id">Security Settings</legend>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fCalendar.viewPasscode.$invalid && !fCalendar.viewPasscode.$pristine}">\n      <label class="control-label" for="cDisplayName">Calendar Passcode (leave blank for none) <span class="label label-siteform label-siteform--light">Experimental Feature</span> </label>\n      <input class="form-control" id="cViewPasscode" name="passcode"\n             ng-model="calendar.viewPasscode"\n             placeholder="enter manually or generate below" server-error type="text">\n      <a style="font-size: smaller" href="#" ng-click="genPasscode()">Generate new secure passcode</a>\n\n      <span class="help-block"\n            ng-show="fCalendar.viewPasscode.$error.serverError">{{serverErrors.displayName}}</span>\n\n    </div>\n    </div>\n\n    <div ng-if="hasCustomHeadCodeFeature||hasCustomBodyCodeFeature && calendar.effectiveFeatureLevel >= 100">\n\n    <div ng-if="hasCustomHeadCodeFeature">\n      <legend>Advanced Settings</legend>\n      <label class="control-label" for="cHeadCode">Custom Html Head Code (optional) <span\n          class="label label-siteform label-siteform--light">Experimental Feature</span></label>\n      <textarea\n          ng-model="calendar.customHeadCode"\n          class="form-control"\n          id="cHeadCode"\n          placeholder="add custom HTML here"\n          rows="10"\n      ></textarea>\n\n      <div class="custom-head-warn">
2\n        <span class="label label-danger">Warning</span>\n        Adding custom HTML code may adversely affect your calendar or break it completely.\n        <br>\n        Abuse of this feature to add malicious code may result in account closure.\n      </div>\n\n    </div>\n\n    <div ng-if="hasCustomBodyCodeFeature">\n      <legend>Advanced Settings</legend>\n      <label class="control-label" for="cBodyCode">Custom Html Body Code (optional). No Javascript. <span\n          class="label label-siteform label-siteform--light">Experimental Feature</span></label>\n      <textarea\n          ng-model="calendar.customBodyCode"\n          class="form-control"\n          id="cBodyCode"\n          placeholder="add custom HTML here"\n          rows="10"\n      ></textarea>\n\n\n    </div>\n    </div>\n\n\n  </form>\n</div>\n\n\n<div class="container-fluid settings-controls-bottom" ng-if="calendar._id">\n  <button class="btn btn-siteform" ng-click="updateCalendar()" type="button">Save Changes</button>\n  <button class="btn btn-default" ng-click="cancelChanges()" type="button">Cancel Changes</button>\n\n  <a class="settings-delete-link" href=\'\' ng-click="showDeleteCalendarModal()"\n     ng-if="calendar.status.name !== \'pending.deletion\'">delete calendar</a>\n</div>\n\n<div class="container-fluid settings-controls-bottom" ng-if="!calendar._id">\n  <button class="btn btn-siteform" ng-click="updateCalendar()" type="button">Create Calendar</button>\n  <button class="btn btn-default" ng-click="cancelChanges()" type="button">Cancel Create</button>\n</div>\n'},7035(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer">\n  <form name="fSocial" ng-show="calendar" novalidate role="form">\n\n    <h3>Social Profile for {{calendar.name}} </h3>\n\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.description.$invalid && !fSocial.description.$pristine}">\n      <label class="control-label" for="cDescription">Calendar description (you can use HTML here if you\n        like)</label>\n      <textarea class="form-control" id="cDescription" name="description"\n                ng-model="calendar.description" placeholder="calendar description (replaces Tockify\'s default text)"\n                server-error>\n            </textarea>\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.description.$invalid}"></span>\n\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fSocial.description.$error.serverError">{{serverErrors.description}}</span>\n    </div>\n\n\n    <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.url.$invalid && !fSocial.url.$pristine}">\n      <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.url.$invalid && !fSocial.url.$pristine}">\n        <label class="control-label">Your web address</label>\n        <input class="form-control" name="url" ng-model="calendar.url" placeholder="https://mysite.com"\n               server-error type="text">\n        <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.url.$invalid}"></span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <span class="help-block"\n              ng-show="fSocial.url.$error.serverError">{{serverErrors.url}}</span>\n      </div>\n    </div>\n\n    <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.phone.$invalid && !fSocial.phone.$pristine}">\n      <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.phone.$invalid && !fSocial.phone.$pristine}">\n        <label class="control-label" for="cPhone">Your contact phone number (this will be public)</label>\n        <input class="form-control" id="cPhone" name="phone" ng-model="calendar.phone"\n               placeholder="phone number" server-error type="text">\n        <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.phone.$invalid}"></span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <sp
2an class="help-block"\n              ng-show="fSocial.phone.$error.serverError">{{serverErrors.phone}}</span>\n      </div>\n    </div>\n\n    <div ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.email.$invalid && !fSocial.email.$pristine}">\n      <label class="control-label" for="cEmail">Your contact email address (this will be public)</label>\n      <input class="form-control" id="cEmail" name="email" ng-model="calendar.email"\n             placeholder="email address" server-error type="text">\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.email.$invalid}"></span>\n\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fSocial.email.$error.serverError">{{serverErrors.email}}</span>\n    </div>\n\n\n    <div address-picker where="calendar.where"></div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.twitter.$invalid && !fSocial.twitter.$pristine}">\n      <label class="control-label" for="cTwitter">Your twitter name</label>\n\n      <div class="input-group">\n        <div class="input-group-addon">@</div>\n        <input class="form-control" id="cTwitter" name="twitter" ng-model="calendar.twitter"\n               placeholder="twitter name" server-error type="text">\n      </div>
2\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.twitter.$invalid}"></span>\n\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fSocial.twitter.$error.serverError">{{serverErrors.twitter}}</span>\n    </div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.facebook.$invalid && !fSocial.facebook.$pristine}">\n      <label class="control-label" for="cFacebook">Your facebook page</label>\n\n      <div class="input-group">\n        <div class="input-group-addon">https://facebook.com/</div>\n        <input class="form-control" id="cFacebook" name="facebook" ng-model="calendar.facebook"\n               placeholder="facebook page" server-error type="text">\n      </div>\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.facebook.$invalid}"></span>\n\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fSocial.facebook.$error.serverError">{{serverErrors.facebook}}</span>\n    </div>\n\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.linkedin.$invalid && !fSocial.linkedin.$pristine}">\n      <label class="control-label" for="cLinkedIn">Your LinkedIn Profile</label>\n\n      <div class="input-group">\n        <div class="input-group-addon">https://linkedin.com/</div>\n        <input class="form-control" id="cLinkedIn" name="linkedin" ng-model="calendar.linkedin"\n               placeholder="linkedin profile" server-error type="text">\n      </div>
2\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.linkedin.$invalid}"></span>\n\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fSocial.linkedin.$error.serverError">{{serverErrors.linkedin}}</span>\n    </div>\n\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fSocial.pinterest.$invalid && !fSocial.pinterest.$pristine}">\n      <label class="control-label" for="cPinterest">Your Pinterest Page</label>\n\n      <div class="input-group">\n        <div class="input-group-addon">https://pinterest.com/</div>\n        <input class="form-control" id="cPinterest" name="pinterest" ng-model="calendar.pinterest"\n               placeholder="pinterest page" server-error type="text">\n      </div>\n      <span ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fSocial.pinterest.$invalid}"></span>\n\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fSocial.pinterest.$error.serverError">{{serverErrors.pinterest}}</span>\n    </div>\n\n  </form>\n\n</div>\n<div class="container-fluid settings-controls-bottom">\n  <button class="btn btn-siteform" ng-click="updateProfile()" type="button">Save Changes</button>\n  <button class="btn btn-default" ng-click="cancelChanges()" type="button">Cancel Changes</button>\n</div>\n\n\n\n\n\n'},1531(e){e.exports='<div class="container-fluid tkf-settings-page l-with-footer">\n  <form name="fUserSubmitted" ng-show="calendar" novalidate role="form">\n    <div ng-init="forms.fUserSubmitted = fUserSubmitted"></div>\n\n\n    <div class="bs-callout bs-callout-danger" ng-if="calendar.effectiveFeatureLevel <= 0">\n      <h4>User Submitted Events are not available with your free plan</h4>\n      <p style="font-size: 1.1em">\n        You can configure the settings here but they will not take effect without a subscription.\n      </p>\n    </div>\n\n    <h3>User Submitted Events</h3>\n\n\n    <h4>Accepting events from third parties</h4>\n\n    <p>See the <a ui-sref="docs.inter.howto.usersubmit">User Submitted Events Guide</a> for detailed instructions</p>\n\n\n    <div class="form-group tkf-usersubmit-showbutton">\n      <label class="control-label">Show a public Submit Event button on your calendar</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.showSubmitEvent" ng-value="{{false}}" type="radio"> No</label>\n      <label class="checkbox-inline">\n        <input ng-model="calendar.showSubmitEvent" ng-value="{{true}}" type="radio">\n        Yes</label>\n    </div>\n\n\n    <h4>Shareable event submission link</h4>\n\n    <p>\n      If you want to put an event submission link somewhere else you can use the following URL:\n    </p>\n\n    <p>\n      <a ng-href="{{calendar.submitURL}}" target="_blank">{{calendar.submitURL}}</a>\n    </p>\n\n    <p>\n      You can make it prettier like this:\n      <a ng-href="{{calendar.submitURL}}" target="_blank">Submit an event</a>\n      using this code:\n\n    </p>\n    <pre ng-if="calendar"><code class="language-markup" prism>\n      &lt;a href="{{calendar.submitURL}}" target="_blank">Submit an Event&lt;/a>\n    </code></pre>\n\n    <p>or style it in a more advanced way using CSS and HTML.</p>\n\n    <div class="form-group">\n      <label class="control-label">Require Password to submit events</label>&nbsp;\n      <input type="checkbox" ng-model="viewState.useSubmitPassword">\n      <a ng-if="viewState.useSubmitPassword" style="float:right;cursor: pointer"\n         ng-click="viewState.hidePassword=!viewState.hidePassword">{{viewState.hidePassword ? \'reveal password\' : \'hide password\'}}</a>\n      <div ng-if="viewState.useSubmitPassword">\n        <input type="{{viewState.hidePassword ? \'password\' : \'text\'}}" class="form-control"\n               ng-model="calendar.submitPassword"\n               placeholder="enter password">\n        <span class="help-block">Submitters will need to enter this password before they can submit events.</span>\n      </div>\n    </div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fUserSubmitted.submittedEventEmail.$invali
2d && !fUserSubmitted.submittedEventEmail.$pristine}">\n      <label class="control-label">Submitted Event Approval Email(s) (if blank we\'ll use the account email address\n        instead)</label>\n      <input class="form-control" id="csubmittedEventEmail"\n             name="submittedEventEmail"\n             ng-blur="doMailCheck(\'fUserSubmitted\',\'submittedEventEmail\')"\n             ng-focus="clearMailCheck(\'fUserSubmitted\',\'submittedEventEmail\')" ng-model="calendar.submittedEventEmail"\n             placeholder="email for user submitted event approvals" server-error type="text">\n      <span\n          ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fUserSubmitted.submittedEventEmail.$invalid}"></span>\n      <span class="help-block"\n            ng-show="!fUserSubmitted.submittedEventEmail.$error.serverError && fUserSubmitted.submittedEventEmail.$dirty && fUserSubmitted.submittedEventEmail.$error.email">\n                That doesn\'t look like an email address\n                </span>\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fUserSubmitted.submittedEventEmail.$error.serverError">{{serverErrors.submittedEventEmail}}</span>\n    </div>\n\n    <div\n        ng-class="{\'form-group has-feedback\':true, \'has-error\':fUserSubmitted.submittedEventContactEmail.$invalid && !fUserSubmitted.submittedEventContactEmail.$pristine}">\n      <label class="control-label">Submitted Event Contact Email (if blank we\'ll use the account email address\n        instead)</label>\n      <input class="form-control" id="csubmittedEventContactEmail"\n             name="submittedEventContactEmail"\n             ng-blur="doSingleMailCheck(\'fUserSubmitted\',\'submittedEventContactEmail\')"\n             ng-focus="clearMailCheck(\'fUserSubmitted\',\'submittedEventContactEmail\')" ng-model="calendar.submittedEventContactEmail"\n             placeholder="contact email sent to people after they submit events" server-error type="text">
2\n      <span\n          ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fUserSubmitted.submittedEventContactEmail.$invalid}"></span>\n      <span class="help-block"\n            ng-show="!fUserSubmitted.submittedEventContactEmail.$error.serverError && fUserSubmitted.submittedEventContactEmail.$dirty && fUserSubmitted.submittedEventContactEmail.$error.email">\n                That doesn\'t look like an email address\n                </span>\n      \x3c!-- use server error directive here to clear on edit --\x3e\n      <span class="help-block"\n            ng-show="fUserSubmitted.submittedEventContactEmail.$error.serverError">{{serverErrors.submittedEventContactEmail}}</span>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">Auto approve User Submitted Events\n        <input ng-model="calendar.autoApproveSubmittedEvents" type="checkbox">\n      </label>&nbsp;\n    </div>\n    <div ng-if="calendar.autoApproveSubmittedEvents">\n        <span class="help-block">Warning: We advise making your submission form private\n          or requiring a password if you auto-approve submitted events. If you don\'t,\n          the options below may help to reduce auto-approval of bad submissions.</span>\n      <div class="form-group">\n        <label class="control-label">\n          Only auto-approve events from people with previous approved events\n          <input ng-model="calendar.priorCheckSubmittedEvents" type="checkbox">\n        </label>\n      </div>\n      <div class="form-group form-group-sm">\n        <label>{{\'Check for banned words\' | translate}}</label>\n        <label class="radio-inline">\n          <input name="spamCheck" ng-model="calendar.spamCheckSubmittedEvents"\n                 type="radio" value="no">{{\'No\' | translate}}</label>\n        <label class="radio-inline">\n          <input name="spamCheck" ng-model="calendar.spamCheckSubmittedEvents"\n                 type="radio" value="hold">{{\'Hold for manual review\' | translate}}\n        </label>\n        <label class="radio-inline">\n          <input name="spamCheck" ng-model="calendar.spamCheckSubmittedEvents"\n                 type="radio" value="reject">{{\'Auto-reject\' | translate}}\n        </label>\n        <span class="help-block" style="font-size: smaller">Note: the list of offensive words we use\n              comes from here: https://github.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words\n              and will be updated periodically.\n            </span>\n      </div>\n    </div>\n\n\n    <div class="form-group">\n      <label class="control-label">Automatically add a tag to User Submitted Events</label>&nbsp;\n      <input type="text" class="form-control" ng-model="calendar.submittedEventsTag"\n             ng-blur="tagCheck()" placeholder="tag-name">
2\n      <span class="help-block">This tag will appear before manually added tags and can be used, for example,\n      to give user submitted events a different color.</span>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">Restrict tags to managed tags\n        <input ng-model="calendar.restrictTagsToManaged" type="checkbox">\n      </label>\n      <span class="help-block">When enabled, event submitters can only choose from your managed tags\n        and cannot create new ones.</span>\n    </div>\n\n    <div class="form-group">\n      <label>Add a note asking event submitters for extra information</label>\n      <input type="checkbox" ng-model="viewState.submitterNotes">\n      <div ng-if="viewState.submitterNotes">\n        <span class="help-block">These notes appear before the "Private notes" field\n          in the submitted event form, so you can ask submitters to provide specific information.\n        </span>\n        <textarea class="form-control"\n                  ng-model="calendar.submitterNotes" rows="4"></textarea>\n      </div>\n    </div>\n\n    <div class="form-group">\n      <label class="control-label">Send email acknowledgements to submitter</label>&nbsp;\n      <input ng-model="calendar.sendUSESubmitterEmails" type="checkbox">
2\n      <span class="help-block">If selected event submitters will be sent acknowledgements when\n        events are received, approved or rejected.\n        </span>\n    </div>\n\n    <div class="form-group">\n      <div>\n      <label class="control-label">Export submitted events</label>\n      </div>\n      <div class="when-picker__date l-inline">\n        <span>starting after</span>\n        <div class="tkfSelect__input">\n          <input type="text" class="form-control"\n                 ng-model="textWhen.start"\n                 data-date-format="{{ANGULAR_DATE_FORMAT}}"\n                 data-date-type="string"\n                 data-autoclose="1"\n                 data-placement="top-left"\n                 placeholder="start date" bs-datepicker>\n          <div class="tkfSelect__input__arrow"><i class="flaticon-expand38"></i></div>\n        </div>\n      </div>&nbsp;<a ng-href="/api/interim/downloadSubmitted/{{calendar.name}}?startms={{startms()}}"\n           target="_self">Export to spreadsheet</a>\n\n    </div>\n\n  </form>\n\n</div>\n\n<div class="container-fluid settings-controls-bottom">\n  <button class="btn btn-siteform" ng-click="updateProfile()" type="button">Save Changes</button>\n  <button class="btn btn-default" ng-click="cancelChanges()" type="button">Cancel Changes</button>\n</div>\n'},2054(e){e.exports='<div class="settings-calendars" ng-controller="CalendarsSettingsCtrl">\n\n  <table class="settings-calendars-list">\n    <thead>\n    <tr>\n      <td>Calendar</td>\n      <td>Status</td>\n      <td>Settings</td>\n      <td>Edit</td>\n    </tr>\n    </thead>\n    \x3c!--<ul class="settings-calendars-list">--\x3e\n    <tr class="calendar-row" ng-click="openCalendar(calendar)" ng-repeat="calendar in undeletedCalendars">\n      <td class="shortname">{{calendar.name}}</td>\n      <td ng-if="calendar.status.name === \'online\'">\n        <span class="label label-success">Online</span>\n        &nbsp;\n        <span class="label label-success" ng-if="calendar.hasEnabledGoogleSync()">Google Sync Enabled</span>\n        <span class="label label-danger" ng-if="calendar.hasDisabledGoogleSync()">Google Sync Disabled</span>\n      </td>\n      <td ng-if="calendar.status.name === \'offline\'">\n        <span class="label label-default">Offline</span>\n        &nbsp;\n        <span class="label label-danger" ng-if="calendar.hasDisabledGoogleSync()">Google Sync Disabled</span>\n\n      </td>\n      <td ng-if="calendar.status.name === \'pending.deletion\'">\n        <span class="label label-danger">Deleting</span>\n      </td>\n\n      <td><a ui-sref="settings.calendar.main({id:calendar._id})">edit settings</a></td>\n      <td><a ng-click="$event.stopPropagation()"\n             target="_self"\n             ui-sref="edit.inter.agenda({calname:calendar.name})">edit</a>&nbsp;&nbsp;<a\n          ng-click="$event.stopPropagation()"\n          target="_self"\n          ng-href={{calendar.viewerURL}}>view</a>\n      </td>\n\n    </tr>\n  </table>\n  <div class="settings-calendar-create">\n    <span ng-if="user.subscriptionStatus === \'free\'">
2\n      <span ng-if="!user.isDudaUser">\n      Your <b>free</b> plan includes <b>1</b> calendar.\n        <span ng-if="user.isEligibleForTrial">\n        To get more calendars and lots of extra features <a ui-sref="siteform.trialPlanPicker">Start A Trial</a> (no credit card required)</span>\n        <span ng-if="!user.isEligibleForTrial">\n        To get more calendars lots of extra features <a ui-sref="siteform.paidPlanPicker">Sign Up Now</a></span>\n      </span>\n      <span ng-if="user.isDudaUser">\n      Your free <b>trial has expired</b>. To get premium features <a ui-sref="settings.subscriptions">Upgrade Now</a>\n      </span>\n    </span>\n    <p ng-if="user.subscriptionStatus === \'trial\' || user.subscriptionStatus === \'paid\'">\n      You are using <b>{{user.onlineCalendars}}</b> of the <b>{{user.maxOnlineCalendars}}</b> online calendar<span\n        ng-if="user.maxOnlineCalendars > 1">s</span>\n      included in your <b ng-if="user.subscriptionStatus === \'trial\'">trial</b> plan.\n      <span ng-if="!user.isDudaUser">\n        <span ng-if="user.subscriptionStatus === \'trial\'">To keep them after your trial\n          <a ui-sref="siteform.paidPlanPicker">Sign Up Now</a>. Please note that we charge per calendar.</span>\n        <span ng-if="user.subscriptionStatus === \'paid\'"><a\n            ui-sref="siteform.updateSubscription">Get More Calendars</a></span>\n      </span>\n      <span ng-if="user.isDudaUser">\n        <span ng-if="user.subscriptionStatus === \'trial\'">To keep them after your trial\n          <a ui-sref="settings.subscriptions">Upgrade Now</a>.</span>\n      </span>\n    </p>\n\n  </div>\n  <div class="settings-calendar-create" ng-if="user">\n    <a class="btn btn-default" ui-sref="settings.calendar.main({id:\'new\'})">Create a new calendar</a>\n\n    <a class="btn btn-default"\n       ng-if="user.subscriptionStatus !== \'free\' && hasAvailableCalendars()"\n       ui-sref="settings.google.pickGoogleCalendar"><img class="l-googleFavicon"\n                                                         ng-src="{{googleFavicon}}"> Sync with\n      a Google calendar <span\n          class="label label-siteform">Subscription Only</span></a>\n\n    <a class="btn btn-default disabled"\n       ng-if="user.subscriptionStatus !== \'free\' && !hasAvailableCalendars()">Sync with a Google calendar <span\n        class="label label-danger">No Online Calendars Available</span></a>\n    <a class="btn btn-default disabled"\n       ng-if="user.subscriptionStatus === \'free\' && hasAvailableCalendars()">Sync with a Google calendar <span\n        class="label label-siteform">Subscription Only</span></a>\n\n\n    <div class="settings-googlesync-notice" ng-if="user.subscriptionStatus !== \'free\' && !hasAvailableCalendars()">\n      <p>You\'ve used all the calendars in your plan so you can\'t create a new Google Synced one.</p>\n      <p>If you want to add Google Sync to an existing calendar you can do that via its settings page (click on the\n        "edit settings" link above).</p>\n    </div>\n\n  </div>\n\n</div>\n'},3446(e){e.exports='<div class="container-fluid tkf-settings-page">\n\n  <div class="customFonts__settings">\n    <legend>Your Custom Fonts</legend>\n\n\n    <div class="customFonts__settings__notice">\n      <p><span class="label label-siteform label-siteform--light">Subscription Feature</span></p>\n      <p>\n        If you want to use your own fonts rather than the ones built in to Tockify you can configure them here.\n        If you are adding a code from a fonts service like Typekit make sure that the <b>tockify.com</b> domain (or your\n        configured custom domain) is on the list of allowed domains for your fonts.\n      </p>\n\n      <p>\n        Adding <i>invalid</i> codes could reduce the speed at which your calendar loads.\n      </p>\n\n      <p>Fonts added here will appear in all Font Pickers in our customizer tools.\n        As with all customizations it is only available with in the subscription version of Tockify.\n      </p>\n\n    </div>\n\n\n    <form class="form-inline" name="fGFont" novalidate role="form">\n      <label class="control-label">Google Fonts</label>\n      (<a href="https://fonts.google.com/" target="_blank">Browse fonts</a> and copy name below)\n      <ul class="customFonts__list">\n        <li ng-repeat="font in fontGroups.gfont">\n          <div class="l-item">{{fontDisplayName(font.args.id)}}</div>\n          &nbsp;<a class="l-remove" ng-click="removeCustomFont(font)"><i class="flaticon-close47"></i></a></li>\n      </ul>\n      <div class="form-group">\n        <input class="form-control input-sm" ng-model="viewState.gFontInput" placeholder="font name" type="text">\n        <a class="l-add" ng-click="addGFont()">&#65291;Add Google Font</a>\n      </div>\n    </form>\n\n    <form class="form-inline" name="fTypekit" novalidate role="form">\n      <label class="control-label">Typekit Fonts</label>\n      <ul class="customFonts__list">\n        <li ng-repeat="font in fontGroups.typekit">\n          <div class="l-item">{{font.args.id}}</div>\n          &nbsp;<a class="l-remove" ng-click="removeCustomFont(font)"><i class="flaticon-close47"></i></a></li>\n      </ul>\n      <div class="form-group">\n        <input class="form-control input-sm" ng-model="viewState.typekitInput" placeholder="kit id" type="text">\n        <a class="l-add" ng-click="addTypekit()">&#65291;Add Kit Id</a>\n      </div>\n    </form>\n\n    <form class="form-inline" name="fFontFace" novalidate role="form">\n      <label class="control-label">Font-Face Stylesheet URLs (https only)</label>\n      <ul class="customFonts__list">\n        <li ng-repeat="font in fontGroups.fontface">\n          <div class="l-item">{{font.args.url}}</div>\n          &nbsp;<a class="l-remove" ng-click="removeCustomFont(font)"><i class="flaticon-close47"></i></a></li>\n      </ul>\n      <div class="form-group">\n        <input class="form-control input-sm customFonts__url" ng-model="viewState.fontFaceInput"\n               placeholder="url" type="text">\n        <a class="l-add" ng-click="addFontFace()">&#65291;Add Url</a>\n      </div>\n      <p class="l-inputnote">https urls only</p>\n    </form>\n\n    <form class="form-inline" name="fFontsDotCom" novalidate role="form">\n      <label class="control-label">Fonts.com Projects</label>\n      <ul class="customFonts__list">\n        <li ng-repeat="font in fontGroups.fontsdotcom">\n          <div class="l-item">{{font.args.projectId}} {{font.args.version}}</div>\n          &nbsp;<a class="l-remove" ng-click="removeCustomFont(font)"><i class="flaticon-close47"></i></a></li>\n      </ul>\n\n      <div class="form-group">\n        <input class="form-control input-sm customFonts__projectId" ng-model="viewState.fontsDotComInput"\n               placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" type="text">\n        <input class="form-control input-sm customFonts__version" ng-model="viewState.fontsDotComVersionInput"\n               placeholder="version (optional)" type="text">\n        <a class="l-add" ng-click="addFontsDotCom()">&#65291;Add Project</a>\n      </div>\n\n    </form>\n  </div>\n\n</div>\n'},5348(e){e.exports='<div class="tkf-body container-fluid tkf-popup message-popup l-big">\n  <div class="popup-content {{popup.kind}}" ng-click="$event.stopPropagation()">\n    <h3>{{popup.tparams.title}}</h3>\n\n    <div class="popup-body">\n      <div ng-bind-html="popup.tparams.main"></div>\n      <div class="popup-buttons">\n        <button ng-click="popup.closeIfCloseable()" type="button">OK</button>\n      </div>\n    </div>\n  </div>\n</div>\n'},5668(e){e.exports='<div class="tkf-body tkf-popup big-popup" ng-controller="CalendarSettingsCtrl">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Change Calendar Name</h3>\n\n    <form class="popup-body" name="fChangeCalendarName" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>Tread very carefully</h4>\n        Changing this will break any pre-existing links to events in your calendar and will make\n        it necessary to regenerate the code for any embedded or popup calendars.\
2n      </div>\n\n      <div\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangeCalendarName.password.$invalid && !fChangeCalendarName.password.$pristine}">\n        <label class="control-label" for="uPassword">This is a big deal so we need to check your current\n          password</label>\n        <input class="form-control" id="uPassword" name="password" ng-model="changeCalendarName.password"\n               placeholder="your password" required server-error type="password">\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangeCalendarName.password.$invalid}"></span>\n        <span class="help-block"\n              ng-show="fChangeCalendarName.password.$dirty && fChangeCalendarName.password.$error.required">Please provide your password</span>\n        <span class="help-block"\n              ng-show="fChangeCalendarName.password.$error.serverError">{{serverErrors.password}}</span>\n        <span class="help-block"\n              ng-show="fChangeCalendarName.password.$pristine && fChangeCalendarName.password.$error.serverError">{{serverErrors.password}}</span>\n      </div>\n\n      <div\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangeCalendarName.name.$invalid && !fChangeCalendarName.name.$pristine}">\n        <label class="control-label" for="uName">New Calendar\n          Name</label>\n        <input class="form-control" id="uName" name="name" ng-model="changeCalendarName.name"\n               placeholder="new name" required server-error type="text">\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangeCalendarName.name.$invalid}"></span>\n        <span class="help-block" ng-show="fChangeCalendarName.name.$dirty && fChangeCalendarName.name.$error.required">Please provide a calendar name</span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <span class="help-block"\n              ng-show="fChangeCalendarName.name.$error.serverError">{{serverErrors.name}}</span>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="calendarNameCancel()" type="button">Cancel Changes</button>\n        <button class="btn btn-siteform" ng-click="calendarNameUpdate()" type="button">Change Calendar Name</button>\n      </div>\n\n      <div class="pop-up-link-section">\n        <a ui-sref="siteform.forgotPassword">Click here if you\'ve forgotten your password</a>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},5941(e){e.exports='<div class="tkf-body tkf-popup big-popup" ng-controller="AccountSettingsCtrl">\n  <div class="close-bar"><i class="flaticon-close-1"></i>\n  </div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Change Account Email Address</h3>\n\n    <form class="popup-body" name="fChangeEmail" novalidate role="form">\n      <div ng-init="forms.changeEmailForm = fChangeEmail"></div>\n\n      <div class="bs-callout bs-callout-primary">\n        <h4>Email confirmation required</h4>\n        After you make this change we will send a confirmation email to your\n        new address. The update won\'t occur until you confirm.\n      </div>\n\n      <div ng-if="!user.noPW"\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangeEmail.password.$invalid && !fChangeEmail.password.$pristine}">\n        <label class="control-label" for="uPassword">This is a big deal so we need to check your current\n          password</label>\n        <input class="form-control" id="uPassword" name="password" ng-model="changeEmail.password"\n               placeholder="your password" required server-error type="password">\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangeEmail.password.$invalid}"></span>\n        <span class="help-block"\n              ng-show="fChangeEmail.password.$dirty && fChangeEmail.password.$error.required">Please provide your password</span>\n        <span class="help-block"\n              ng-show="fChangeEmail.password.$error.serverError">{{serverErrors.password}}</span>
2\n        <span class="help-block"\n              ng-show="fChangeEmail.password.$pristine && fChangeEmail.password.$error.serverError">{{serverErrors.password}}</span>\n      </div>\n\n      <div\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangeEmail.email.$invalid && !fChangeEmail.email.$pristine}">\n        <label class="control-label" for="uEmail2">New email address</label>\n        <input class="form-control" id="uEmail2" name="email" ng-model="changeEmail.email"\n               placeholder="new email address" required server-error type="text">\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangeEmail.email.$invalid}"></span>\n        <span class="help-block" ng-show="fChangeEmail.email.$dirty && fChangeEmail.email.$error.required">Please provide an email address</span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <span class="help-block"\n              ng-show="fChangeEmail.email.$error.serverError">{{serverErrors.email}}</span>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="emailCancel()" type="button">Cancel Changes</button>\n        <button class="btn btn-siteform" ng-click="emailUpdate()" type="button">Change Email Address</button>\n      </div>\n\n      <div class="pop-up-link-section">\n        <a ui-sref="siteform.forgotPassword">Click here if you\'ve forgotten your password</a>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n'},5839(e){e.exports='<div class="tkf-body tkf-popup big-popup" ng-controller="AccountSettingsCtrl">\n  <div class="close-bar"><i class="flaticon-close-1"></i>\n  </div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>{{popup.tparams.enable ? \'Enable\' : \'Disable\'}} Multi-Factor Authentication</h3>\n\n    <form class="popup-body" name="fChangeEmail" novalidate role="form">\n      <div ng-init="forms.changeEmailForm = fChangeEmail"></div>\n\n      <div ng-show="popup.tparams.enable" class="bs-callout bs-callout-primary">\n        <h4>Email confirmation required</h4>\n        After you make this change we will send a confirmation email to {{user.email}}.\n        The update won\'t occur until you confirm.\n      </div>\n\n      <div ng-if="!user.noPW"\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangeEmail.password.$invalid && !fChangeEmail.password.$pristine}">\n        <label class="control-label" for="uPassword">This is a big deal so we need to check your current\n          password</label>\n        <input class="form-control" id="uPassword" name="password" ng-model="changeEmail.password"\n               placeholder="your password" required server-error type="password">\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangeEmail.password.$invalid}"></span>\n        <span class="help-block"\n              ng-show="fChangeEmail.password.$dirty && fChangeEmail.password.$error.required">Please provide your password</span>\n        <span class="help-block"\n              ng-show="fChangeEmail.password.$error.serverError">{{serverErrors.password}}</span>\n        <span class="help-block"\n              ng-show="fChangeEmail.password.$pristine && fChangeEmail.password.$error.serverError">{{serverErrors.password}}</span>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="emailCancel()" type="button">Cancel Changes</button>\n        <button class="btn btn-siteform" ng-click="mfaChange(popup.tparams.enable)" type="button">{{popup.tparams.enable ? \'Enable\' : \'Disable\'}} MFA</button>\n      </div>\n\n      <div class="pop-up-link-section">\n        <a ui-sref="siteform.forgotPassword">Click here if you\'ve forgotten your password</a>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n'},9352(e){e.exports='<div class="tkf-body tkf-popup big-popup" ng-controller="AccountSettingsCtrl">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Change Password</h3>\n\n    <form class="popup-body" name="fChangePassword" novalidate role="form">\n\n      <div\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangePassword.old.$invalid && !fChangePassword.old.$pristine}">\n        <label class="control-label" for="uOld">This is a big deal so we need to check your current\n          password</label>\n        <input class="form-control" id="uOld" name="old" ng-model="changePassword.old"\n               placeholder="current password" required server-error type="password">
2\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangePassword.old.$invalid}"></span>\n        <span class="help-block" ng-show="fChangePassword.old.$dirty && fChangePassword.old.$error.required">Please provide your old password</span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <span class="help-block"\n              ng-show="fChangePassword.old.$error.serverError">{{serverErrors.old}}</span>\n      </div>\n\n      <div\n          ng-class="{\'form-group has-feedback\':true, \'has-error\':fChangePassword.new.$invalid && !fChangePassword.new.$pristine}">\n        <label class="control-label" for="uNew">Pick a new password\n        </label>\n        <input class="form-control" id="uNew" name="new" ng-model="changePassword.new"\n               placeholder="new password" required server-error type="password">\n        <span\n            ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fChangePassword.new.$invalid}"></span>\n        <span class="help-block" ng-show="fChangePassword.new.$dirty && fChangePassword.new.$error.required">Please provide a password</span>\n        \x3c!-- use server error directive here to clear on edit --\x3e\n        <span class="help-block"\n              ng-show="fChangePassword.new.$error.serverError">{{serverErrors.new}}</span>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="passwordCancel()" type="button">Cancel Changes</button>\n        <button class="btn btn-siteform" ng-click="passwordUpdate()" type="button">Change Password</button>\n      </div>\n\n      <div class="pop-up-link-section">\n        <a ui-sref="siteform.forgotPassword">Click here if you\'ve forgotten your current password</a>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},6896(e){e.exports='<div class="tkf-body container-fluid tkf-popup message-popup">\n  <div class="popup-content {{popup.kind}}" ng-click="$event.stopPropagation()">\n    <h3>{{popup.tparams.title}}</h3>\n\n    <div class="popup-body">\n      <div class="popup-body-content l-centered" ng-bind-html="popup.tparams.main"></div>\n      <div class="popup-buttons">\n        <button class="l-safety" ng-click="popup.closeIfCloseable()" type="button">Keep Calendar</button>\n        <button class="l-danger" ng-click="popup.tparams.action()" type="button">Delete Forever</button>\n      </div>\n    </div>\n  </div>\n</div>\n'},1447(e){e.exports='<div class="tkf-body container-fluid tkf-popup message-popup l-wide ">\n  <div class="popup-content {{popup.kind}}" ng-click="$event.stopPropagation()">\n    <h3>{{popup.tparams.title}}</h3>\n\n    <div style="padding:10px 10px 0 10px ">\n      <div class="bs-callout bs-callout-danger" style="margin-bottom:5px">\n        <h4>Danger: Read This First</h4>\n        This will delete <b>ALL</b> previously imported events, <i>not just the most recent import</i>.\n        This is <b>IRREVERSIBLE</b> and should only be used if you want to remove all imported events and start over.\n      </div>\n    </div>\n    <div class="popup-section">\n      <label><input type="checkbox" class="" ng-model="popup.confirmed"> I have read and understood the warning above\n        and still\n        want to delete all imported events</label>\n    </div>\n    <div class="popup-body">\n      <div class="popup-buttons">\n        <button class="l-safety" ng-click="popup.closeIfCloseable()" type="button">Keep Events</button>\n        <button ng-if="popup.confirmed" class="l-danger" ng-click="popup.tparams.action()"\n                type="button">Delete <b>All</b> Imported Events\n        </button>\n      </div>\n    </div>\n  </div>\n</div>\n'},4435(e){e.exports='<div class="tkf-body tkf-popup big-popup" ng-controller="AccountSettingsCtrl">\n  <div class="close-bar"><i class="flaticon-close-1"></i>\n  </div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>MFA Recovery Codes</h3>\n    <p>\n      Recovery codes can be used to access your account if you lose access to your email\n      and cannot receive MFA authentication codes.\n    </p>\n\n    <form class="popup-body" name="fRecoveryCodes" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>Keep recovery codes as safe as your password</h4>\n        These codes are the last resort for accessing your account.\n        <b>Copy these recovery codes somewhere safe</b>.\n        If you cannot find these codes, you will lose access to your account.\n      </div>\n\n      <div>\n        <label for="recoveryCodes">Recovery Codes</label>\n        <textarea readonly cols=50 id=\'recoveryCodes\'\n                  style="font-family: monospace; resize: none;"\n        >{{recovery.codes || popup.tparams.recovery.codes}}</textarea>\n        <p style="font-size: small">\n          Each recovery code can only be used once.\n        </p>\n      </div>\n\n      <div>\n        <h5>Generate new recovery codes</h5>\n        <div class="bs-callout bs-callout-danger">\n        <p >\n          When you generate new recovery codes, you must copy or print the new codes.\n          <b><em>Your old codes won\'t work anymore</em></b>.\n        </p>\n        </div>\n\n        <div class="popup-buttons">\n          <button class="btn btn-siteform" ng-click="emailCancel()" type="button">Close</button>\n          <button class="btn btn-default" ng-click="regenRecoverMFA()" type="button">Generate new recovery codes</button>\n        </div>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n'},7e3(e){e.exports='<div class="container-fluid">\n  <div class="container-fluid">\n    <div class="navbar navbar-default navbar-fixed-top tkf-adminnav" role="navigation" tkf-adminnav>\n      <div class="container-fluid">\n        <div class="navbar-header">\n          <button class="navbar-toggle" data-target=".tkf-main-navbar-collapse" data-toggle="collapse" type="button">
2\n            <span class="sr-only">Toggle navigation</span>\n            <span class="icon-bar"></span>\n            <span class="icon-bar"></span>\n            <span class="icon-bar"></span>\n          </button>\n          <ul class="nav navbar-nav navbar-left">\n            <li ng-if="!hideHome()">\n              <a ui-sref="site">Home</a>\n            </li>\n            <li>\n              <a ng-href="{{editorLink()}}">Edit</a>\n            </li>\n          </ul>\n        </div>\n        <div class="collapse navbar-collapse tkf-main-navbar-collapse">\n          \x3c!--<ul class="nav navbar-nav">--\x3e\n          \x3c!--<li><a href="#">Back</a></li>--\x3e\n          \x3c!--</ul>--\x3e\n          <ul class="nav navbar-nav navbar-right">\n            <li><a ui-sref="docs.inter">Documentation</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class="tkf-message-bar" ng-show="status.show"><span class="{{status.kind}}">{{status.message}}</span></div>\n  <div class="row tkf-left-nav">\n    <h2><i class="tkf-left-nav-header-icon flaticon-management"></i><span\n        class="tkf-left-nav-header-text">Settings</span></h2>\n    <ul>\n      <li><a ui-sref="settings.account" ui-sref-active="active"><i class="tkf-icon flaticon-user"></i><span\n            class="tkf-item-text">Account </span><sup class="label label-danger" ng-if="alerts.length>0">!</sup></a>\n      </li>\n\n      <li><a ui-sref="settings.subscriptions" ui-sref-active="active"><i class="tkf-icon flaticon-credit-card"></i><span\n            class="tkf-item-text">Subscription</span></a></li>\n      \x3c!--<li><a ui-sref-active="active" ui-sref="settings.premium"><span class="tkf-icon tkf-icon-paperplane"></span><span class="tkf-item-text">Premium features</span></a></li>--\x3e\n\n      <li><a ui-sref="settings.calendars" ui-sref-active="active"><i class="tkf-icon flaticon-calendar"></i><span\n            class="tkf-item-text">Calendars</span></a></li>\n\n      <div ng-if="istate.calendar && istate.calendar._id">\n        <li class="tkf-selected-calendar"><span>{{istate.calendar.name}}</span></li>\n        <li><a ui-sref="settings.calendar.main({id:istate.calendar.name})" ui-sref-active="active"><i\n              class="tkf-icon flaticon-management"></i><span class="tkf-item-text">Calendar Settings</span></a></li>\n        <li><a ui-sref="settings.calendar.social({id:istate.calendar.name})" ui-sref-active="active"><i\n              class="tkf-icon flaticon-like"></i><span class="tkf-item-text">Social Profile</span></a></li>\n        \x3c!--<li><a ui-sref-active="active" ui-sref="settings.rsvp"><span class="tkf-icon tkf-icon-paperplane"></span><span class="tkf-item-text">RSVP</span></a></li>--\x3e\n        <li><a ui-sref="settings.calendar.userSubmitted({id:istate.calendar.name})" ui-sref-active="active"><i\n              class="tkf-icon flaticon-email-1"></i><span class="tkf-item-text">User Submitted Events</span></a></li>\n        <li><a ui-sref="settings.calendar.import({id:istate.calendar.name})" ui-sref-active="active"><i\n              class="tkf-icon flaticon-import"></i><span class="tkf-item-text">Import Events</span></a></li>\n        <li><a ui-sref="settings.calendar.export({id:istate.calendar.name})" ui-sref-active="active"><i\n              class="tkf-icon flaticon-download"></i><span class="tkf-item-text">Export Events</span></a></li>\n      </div>\n\n      <li><a ui-sref="settings.customFonts" ui-sref-active="active"><i class="tkf-icon flaticon-lowercase"></i><span\n            class="tkf-item-text">Custom Fonts</span></a></li>\n\n    </ul>\n  </div>\n  <div class="tkf-content-area container-fluid">\n\n    <div ng-cloak ui-view="main"></div>\n\n    \x3c!--<div ui-view="footer" class="container-fluid tkf-settings-page-footer"></div>--\x3e\n\n  </div>\n</div>\n'},6806(e){e.exports='<div class="container-fluid tkf-settings-page">\n\n  <form name="fSubscription" novalidate role="form">\n    <legend>Your Subscription Details</legend>\n\n    <fieldset ng-if="planCategory===\'free\'">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12 \'>\n            <div class="subscription-settings__section">\n              <label>Plan</label>\n\n              <div ng-if="source!==\'duda\'">\n                <div class="subscription-settings__value">Free Plan (basic features only)\n                  <div class="subscription-settings__signup">\n                    <a class="btn btn-lg btn-siteform" ng-if="offerTrial"\n                       ui-sref="siteform.trialPlanPicker">\n                      Start A Free Trial of the Premium Features</a></div>\n                </div>\n                <a class="btn btn-lg btn-siteform" ng-if="!offerTrial" ui-sref="siteform.paidPlanPicker">\n                  Sign Up To Get All Features</a>\n              </div>\n              <div ng-if="source===\'duda\'">\n                <div class="subscription-settings__value l-warning">Your free trial has expired\n                  <button class="btn btn-lg btn-siteform" ng-click="dudaChange.show = !dudaChange.show">\n                    Upgrade To Get All Features</button>\n                </div>\n              </div>\n              <div class="subscription-settings__featureList" ng-if="!dudaChange.show">\n                <h4>Subscription only features include:</h4>\n                <ul>\n                  <li>Custom Themes</li>\n                  <li>All calendar styles</li>\n                  <li>Minimal or zero Tockify branding</li>\n                  <li>Use your own domain for event links</li>\n                  <li>Promotion and RSVP Buttons</li>\n                  <li>Community submitted events</li>\n                  <li>iCalendar support</li>\n                  <li>Fast friendly email support</li>\n                </ul>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset ng-if="planCategory===\'trial\'">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12 \'>\n            <div class="subscription-settings__section">\n              <label>Plan</label>\n\n              <div class="subscription-settings__value"><span class="label label-info">
2Trial</span>\n                {{planKindName}} Plan {{daysLeft}} days remaining\n                <div class="subscription-settings__signup">\n                  <a ng-if="source!==\'duda\'" class="btn btn-lg btn-siteform" ui-sref="siteform.paidPlanPicker">\n                    Sign up to keep using the {{planKindName}} features\n                  </a>\n                  <button ng-if="source===\'duda\' && !dudaChange.show" class="btn btn-lg btn-siteform" ng-click="dudaChange.show = !dudaChange.show">\n                    Subscribe now in the App Store\n                  </button>\n                </div>\n                <div class="subscription-settings__featureList" ng-if="!dudaChange.show">\n                  <h4>{{planKindName}} features include:</h4>\n                  <ul>\n                    <li>Custom Themes</li>\n                    <li>All calendar styles</li>\n                    <li ng-if="kind ===\'premium\'">Minimal Tockify branding</li>\n                    <li ng-if="kind ===\'white.label\'">Zero Tockify branding</li>\n                    <li ng-if="kind ===\'white.label\'">Use your own domain for event links</li>\n                    <li>Promotion and RSVP Buttons</li>\n                    <li>Community submitted events</li>\n                    <li>iCalendar support</li>\n                    <li ng-if="kind ===\'white.label\'">Priority email support</li>\n                    <li ng-if="kind ===\'premium\'">Fast friendly email support</li>\n                  </ul>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset ng-if="planCategory===\'other\'">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12 \'>\n            <div class="subscription-settings__section">\n              <label>Plan</label>\n              <div class="subscription-settings__value">\n                You are not paying via our online billing system so your plan is not managed here.\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="row" ng-if="kind === \'invoiced\'">\n          <div class=\'col-md-12\'>\n            <div class="subscription-settings__section">\n              <label>Next Invoice Date</label>\n              <p>You are paying outside our usual system so the renewal process is not automated.</p>\n              <p>We will email you shortly before your subscription ends.</p>\n              <p>If you want to change your subscription please email [email protected].</p>\n            </div>\n          </div>\n        </div>\n        <div class="row" ng-if="kind === \'editor\'">\n          <div class=\'col-md-12\'>\n            <div class="subscription-settings__section">\n              <label>Editor access</label>\n              You have access to edit one or more calendars owned by other users.\n            </div>\n          </div>\n        </div>\n        <div class="row" ng-if="kind === \'unpaid\'">\n          <div class=\'col-md-12\'>\n            <div class="subscription-settings__section">\n              <label>Special access (unpaid)</label>\n              Your access to subscription features is via a special arrangement set up by Tockify Support.\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset ng-if="planCategory===\'paid\' && source===\'duda\'">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12\'>\n\n            <div class="subscription-settings__section">\n              <label>Plan</label>\n              <div class="subscription-settings__value">{{planDescription}} <a class="btn btn-siteform"\n                  ng-click="dudaChange.show = !dudaChange.show">Change Plan</a></div>\n              <span class="help-block">You subscribed via your App Store</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset ng-if="source===\'duda\' && dudaChange.show">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12\'>\n            <div class="subscription-settings__section">\n              <legend ng-if="planCategory===\'paid\'">Change Plan</legend>\n              <legend ng-if="planCategory!==\'paid\'">Choose Plan</legend>\n\n              <div class="subscription-settings__duda">\n                <div class="row">\n                  <div class="form-group">\n                    <label>Number of Calendars</label>\n                    <select\n                        class="form-control" ng-model="dudaChange.quantity"\n                        ng-options="q.value as q.name for q in quantities"></select>\n                  </div>\n                </div>\n\n                <div class="row">\n                  <div class="form-group">\n                    <label>Plan Type</label>\n                    <select class="form-control" ng-model="dudaChange.kind"\n                            ng-options="p.value as p.name for p in planKinds"></select>\n                  </div>\n                </div>\n\n                <div class="row">\n                  <button ng-disabled="!dudaChanged && planCategory!==\'trial\'"\n                          class="btn btn-siteform l-label"\n                          ng-click="dudaUpgrade(dudaChange.planUuid)">{{\n                    planCategory===\'paid\' ? \'Upgrade in the App Store\': \'Subscribe in the App Store\' }}\n                  </button>\n                </div>\n              </div>\n\n              <br>
2\n             <span class="help-block" ng-if="planCategory===\'paid\'">\n                To <b>cancel</b> your subscription you need to open the App Store and <b>remove</b> the Tockify Calendar App.</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset ng-if="planCategory===\'paid\' && source===\'tockify\'">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12 \'>\n            <div class="subscription-settings__section" ng-if="!card">\n              <div class="help-block--bright">\n                There is no payment card associated with your account. Please add one.\n              </div>\n            </div>\n            <div class="subscription-settings__section">\n              <label>Plan</label>\n\n              <div class="subscription-settings__value">{{planDescription}} <a class="btn btn-siteform"\n                                                                               ng-if="card"\n                                                                               ui-sref="siteform.updateSubscription">Change\n                Plan</a>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="row">\n          <div class=\'col-md-12\'>\n            <div class="subscription-settings__section">\n              <label>Next Bill Date</label>\n\n              <div class="subscription-settings__value">{{nextInvoiceDate}}</div>\n            </div>\n          </div>\n        </div>\n        <div class="row">\n          <div class=\'col-md-12\'>\n            <div class="subscription-settings__section" ng-if="card">\n              <label>Payment Card</label>\n\n              <div class="subscription-settings__value"><span class="label label-danger"\n                                                              ng-if="cardExpired">Card Expired</span>\n                {{card.brand}} {{hiddenNumber}} expires {{card.exp_month}}/{{card.exp_year}}\n              </div>\n              <a class="subscription-settings__changeCardButton btn btn-siteform"\n                 ui-sref="siteform.changeCard">Change Payment Card</a>\n            </div>\n\n\n            <div class="subscription-settings__section" ng-if="!card">\n              <a ng-class="{\'btn btn-siteform\':true, \'l-warning\':cardExpired}"\n                 ui-sref="siteform.changeCard">Add a payment card</a>\n\n            </div>\n\n\n          </div>\n        </div>\n        <div class="help-block--bright" ng-if="notice">\n          {{notice}}\n        </div>\n      </div>\n    </fieldset>\n    <fieldset ng-if="planCategory===\'incomplete\'">\n      <div class="container-fluid">\n        <div class="row">\n          <div class=\'col-md-12 \'>\n\n            <div class="help-block--bright l-lg">\n              The initial payment for your subscription failed. Please select\n              and pay the invoice below to start your subscription.\n            </div>\n            <p></p>\n\n            <div class="subscription-settings__section">\n              <label>After the payment succeeds your plan will be:</label>\n\n              <div class="subscription-settings__value">{{planDescription}}\n              </div>\n            </div>\n          </div>\n        </div>\n\n\n      </div>\n    </fieldset>\n    <div class="subscription__invoices" ng-if="formattedInvoices && formattedInvoices.length > 0">\n      <legend>Your Invoices</legend>\n      <ul class="subscription__invoice__list">\n        <li class="subscription__invoice__item" ng-repeat="invoice in formattedInvoices">\n          <a class={{\'l-\'+invoice.status}} target="_blank" ui-sref="siteform.invoice({id:invoice.id})">\n            <div>{{invoice.grossTotal}}</div>\n            <div>{{invoice.date}}</div>\n          </a>\n        </li>\n      </ul>\n    </div>\n  </form>\n\n</div>\n'},8974(e){e.exports='<div class="col-md-12">\n  This is the userSubmitted view.\n</div>\n'},5252(e){e.exports='<div class="siteform-background">\n  <div class="cancelSubscription__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2h r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <form class="cancelSubscription__form" name="fCancel" novalidate role="form">\n      <div ng-init="forms.fCancel = fCancel"></div>\n      <legend>Cancel Your Tockify Subscription</legend>\n      <fieldset ng-if="subscription && !paid">\n        <div class="container-fluid">\n          <div class="row">\n            <div class=\'col-md-12 form-inline cancelSubscription__plan\'>\n\n              <div class="cancelSubscription__plan-name">You don\'t have a paid plan at the moment\n                <a class="btn btn-siteform" href="/">\n                  Back to Tockify\n                </a>\n              </div>\n\n\n            </div>\n          </div>\n        </div>\n      </fieldset>\n      <fieldset ng-if="subscription && paid">\n        <div class="container-fluid">\n          <div class="row">\n            <div class=\'col-md-12 form-inline cancelSubscription__plan\'>\n\n              <div class="cancelSubscription__plan-name">{{planDescription}}</div>\n\n            </div>\n          </div>\n\n        </div>\n\n        <div class="container-fluid" ng-if="!willCancel">\n          <div class="row">\n            <div class="col-md-12">\n              <div class="help-block--warning">
2\n                <span class="label label-danger">Warning</span> Cancelling will remove all premium features from\n                your calendar(s) and disable all but one calendar at the end of the current\n                billing period.\n              </div>\n            </div>\n          </div>\n          <div class="row">\n            <div class="col-md-12">\n              <div class="siteform__buttons clearfix">\n\n                <div class="checkout__confirm-box">\n\n\n                  <div ng-init="forms.fCancel = fCancel"></div>\n                  <div ng-class="{\'form-group has-feedback\':true,\n           \'has-error\':fCancel.agree.$invalid && fCancel.agree.$dirty}">\n                    <label class="checkbox-inline">\n                      <input name="agree" ng-model="page.agree" required\n                             type="checkbox" value="{{page.agree}}">\n                      {{\'I have read the warning above and want to cancel my subscription\' | translate}}\n                    </label>\n                    <div class="help-block--bright" ng-show="fCancel.agree.$invalid && fCancel.agree.$dirty    ">\n                      Please check the box above to confirm that you want to cancel your subscription\n                    </div>\n                  </div>\n\n                </div>\n                <button class="btn btn-danger btn-lg" ng-click="cancelSubscription()" type="button">\n                  Cancel Subscription\n                </button>\n                <a class="btn btn-siteform btn-lg" ui-sref="siteform.updateSubscription">\n                  Change Subscription Instead\n                </a>\n                <div class="siteform__footerlink">\n                  <a href="/">Go Back To Tockify</a>\n                </div>\n\n\n              </div>\n            </div>\n          </div>\n        </div>\n\n\n        <div class="container-fluid" ng-if="willCancel">\n          <div class="row">\n            <div class="col-md-12">\n              <div class="help-block--warning">\n                This plan has already been cancelled. It will remain\n                active until the end of the period you have paid for.\n              </div>\n            </div>\n          </div>\n          <div class="row">\n            <div class="col-md-12">\n              <div class="siteform__buttons clearfix">\n                <a class="btn btn-siteform btn-lg" ui-sref="siteform.paidPlanPicker">\n                  Subscribe Again\n                </a>\n                <a href="/">Go Back To Tockify</a>\n              </div>\n            </div>\n          </div>\n        </div>\n\n      </fieldset>\n\n\n    </form>\n  </div>\n</div>'},5058(e){e.exports='<div class="siteform-background" ng-if="loaded">\n  <div class="checkout__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <form name="fCreditCard" ng-if="!stripeCard" novalidate>\n      <div ng-init="forms.fCreditCard = fCreditCard"></div>\n\n      <legend ng-if="!foundCard">Add Payment Card</legend>\n      <legend ng-if="foundCard">Change Payment Card</legend>\n      <fieldset>\n        <div class="container-fluid">\n\n          <div class="row">\n            <div class="col-md-6">\n              <div ng-class="{\'form-group has-feedback\':true,\n           \'has-error\':fCreditCard.name.$invalid && fCreditCard.name.$dirty}">\n                <label>Name on Card</label>\n\n                <input class=\'form-control\' name="name" ng-model="card.name"\n                       placeholder="Cardholder Name" required server-error type=\'text\'>\n                <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.name.$invalid && fCreditCard.name.$dirty,\n      \'glyphicon-ok\':fCreditCard.name.$valid\n       }"></span>\n\n                <span class="help-block" ng-show="fCreditCard.name.$dirty && fCreditCard.name.$error.required\n        && !fCreditCard.name.$error.serverError">\n                    Please provide the cardholder\'s name</span>
2\n                <span class="help-block"\n                      ng-show="fCreditCard.name.$error.serverError">{{serverErrors.name}}</span>\n              </div>\n            </div>\n\n            <div class="col-md-6">\n              <div class="form-group">\n                <label class=\'control-label\'>Card Number</label>\n                <div class="stripe-field-wrapper">\n                  <div id="stripe-cardNumber"></div>\n                </div>\n                <span class="stripe-help-block" id="stripe-cardNumber-errors"></span>\n              </div>\n            </div>\n\n\n          </div>\n          <div class="row">\n\n            <div class="col-md-6">\n              <div class="form-group">\n                <label class=\'control-label\'>CVC</label>\n                <div class="stripe-field-wrapper">\n                  <div id="stripe-cardCvc"></div>\n                </div>\n                <span class="stripe-help-block" id="stripe-cardCvc-errors"></span>\n                <span class="help-block"\n                      ng-show="fCreditCard.name.$error.serverError">{{serverErrors.name}}</span>\n              </div>\n            </div>\n\n            <div class="col-md-6">\n              <div class="form-group">\n                <label class=\'control-label\'>Expiration</label>\n                <div class="stripe-field-wrapper">\n                  <div id="stripe-cardExpiry"></div>\n                </div>\n                <span class="stripe-help-block" id="stripe-cardExpiry-errors"></span>\n              </div>\n            </div>\n\n\n          </div>\n        </div>\n\n      </fieldset>\n      <fieldset>\n        <legend>Company/Organization Details</legend>\n        <div ng-class="{\'col-xs-12 form-group\':true}">\n          <label class=\'control-label\'>Are you representing a company/organization? </label>&nbsp;\n          <input ng-model="page.isOrganization" ng-value="{{true}}" type="radio"> Yes\n          <input ng-model="page.isOrganization" ng-value="{{false}}" type="radio"> No\n        </div>\n\n        <div ng-if="page.isOrganization">\n          <div class="col-md-12">\n            <div\n                ng-class="{\'form-group has-feedback\':true, \'has-error\':page.isOrganization &&fCredit
2Card.organization_name.$invalid && fCreditCard.organization_name.$dirty}">\n              <label class=\'control-label\'>Company/Organization Name</label>\n              <input autocomplete=\'off\' class=\'form-control organization-name\' name="organization_name"\n                     ng-model="organization.organization_name"\n                     placeholder="Company/Organization Name" required server-error size=\'20\' type=\'text\'\n              >\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.organization_name.$invalid && fCreditCard.organization_name.$dirty,\n      \'glyphicon-ok\':fCreditCard.organization_name.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.organization_name.$dirty && fCreditCard.organization_name.$error.required">\n                    Please provide the company or other organization\'s legal name</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.organization.$error.serverError">{{serverErrors.organization}}</span>\n            </div>\n          </div>\n          <div class="col-md-12" ng-if="isEUCountry">\n            <div\n                ng-class="{\' form-group has-feedback\':true,\'has-error\':fCreditCard.vat_number.$invalid && fCreditCard.vat_number.$dirty}">\n              <label class=\'control-label\'>VAT Number</label>\n              <input autocomplete=\'off\' class=\'form-control organization-vat\' name="vat_number"\n                     ng-model="organization.vat_number"\n                     placeholder="VAT Number" server-error size=\'20\' type=\'text\'\n                     vat-validator>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.vat_number.$invalid && fCreditCard.vat_number.$dirty,\n      \'glyphicon-ok\':fCreditCard.vat_number.$valid\n       }"></span>\n              \x3c!--<span class="help-block" ng-show="fCreditCard.vat_number.$dirty && fCreditCard.vat_number.$error.required">--\x3e\n              \x3c!--Please provide the company\'s ccs number</span>--\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.vat_number.$dirty && fCreditCard.vat_number.$error.badNumber">\n                    Invalid Vat No</span>\n              <span class="help-block"\n                    ng-show="fCreditCard.vat_number.$dirty && fCreditCard.vat_number.$error.wrongCountry">\n                    Vat number doesn\'t match country</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.vat_number.$error.serverError">{{serverErrors.vat_number}}</span>\n\n            </div>\n          </div>\n\n\n        </div>\n\n\n      </fieldset>\n\n      <fieldset>\n        <legend>Billing Address</legend>\n\n\n        <div class=\'form-row\'>\n          <div class="col-md-12">\n            <div\n                ng-class="{\'form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_line1.$invalid && !fCreditCard.address_line1.$pristine}">\n              <label class=\'control-label\'>Address Line 1</label>\n              <input class=\'form-control\' name="address_line1" ng-model="card.address_line1"\n                     placeholder="" required server-error size=\'4\' type=\'text\'>\n\n\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_line1.$invalid && fCreditCard.address_line1.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_line1.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_line1.$dirty && fCreditCard.address_line1.$error.required">\n                    Please provide the street address</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <sp
2an class="help-block"\n                    ng-show="fCreditCard.address_line1.$error.serverError">{{serverErrors.address_line1}}</span>\n\n            </div>\n          </div>\n        </div>\n\n        <div class=\'form-row\'>\n          <div class="col-md-12">\n            <div\n                ng-class="{\' form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_line2.$invalid && !fCreditCard.address_line2.$pristine}">\n              <label class=\'control-label\'>Address Line 2 (optional)</label>\n              <input class=\'form-control\' name="address_line2" ng-model="card.address_line2"\n                     placeholder="" server-error size=\'20\' type=\'text\'>\n\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_line2.$error.serverError">{{serverErrors.address_line2}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n            <div\n                ng-class="{\'form-group required has-feedback\':true,\n                             \'has-error\':fCreditCard.address_city.$invalid && !fCreditCard.address_city.$pristine}">\n              <label class=\'control-label\' ng-if="countryCode === \'US\'">City</label>\n              <label class=\'control-label\' ng-if="countryCode === \'GB\'">Town/City</label>\n              <label class=\'control-label\' ng-if="countryCode !== \'GB\' && countryCode !== \'US\'">Town/City</label>\n              <input autocomplete=\'off\' class=\'form-control\'\n                     name="address_city" ng-model="card.address_city" required server-error size=\'20\'\n                     type=\'text\'>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_city.$invalid && fCreditCard.address_city.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_city.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_city.$dirty && fCreditCard.address_city.$error.required">\n                        Please provide your town/city</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_city.$error.serverError">{{serverErrors.address_city}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n            <div\n                ng-class="{\'form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_state.$invalid && !fCreditCard.address_state.$pristine}">\n              <label class=\'control-label\' ng-if="countryCode === \'US\'">State</label>\n              <label class=\'control-label\' ng-if="countryCode === \'GB\'">County</label>\n              <label class=\'control-label\'\n                     ng-if="countryCode !== \'GB\' && countryCode !== \'US\'">State/County/Region</label>\n              <input autocomplete=\'off\' class=\'form-control\'\n                     name="address_state" ng-model="card.address_state" required server-error size=\'20\'\n                     type=\'text\'>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_state.$invalid && fCreditCard.address_state.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_state.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_state.$dirty && fCreditCard.address_state.$error.required">\n                    Please complete this field</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_state.$error.serverError">{{serverErrors.address_state}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n            <div\n                ng-class="{\' form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_zip.$invalid && !fCreditCard.address_zip.$pristine}">\n              <label class=\'control-label\' ng-if="countryCode === \'US\'">Zip Code</label>\n              <label class=\'control-label\' ng-if="countryCode === \'GB\'">Post Code</label>\n              <label class=\'control-label\' ng-if="countryCode !== \'GB\' && countryCode !== \'US\'">Zip or\n                Post Code</label>\n              <input autocomplete=\'off\' class=\'form-control\'\n                     name="address_zip" ng-model="card.address_zip" required server-error size=\'20\'\n                     type=\'text\'>
2\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_zip.$invalid && fCreditCard.address_zip.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_zip.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_zip.$dirty && fCreditCard.address_zip.$error.required">\n                    Please provide your zip code/postal code</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_zip.$error.serverError">{{serverErrors.address_zip}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\' ng-if="!foundCard">\n          <div class="col-md-4">\n\n            <div ng-class="{\'form-group required has-feedback\':true,\n                            \'has-error\':fCreditCard.address_country.$invalid}">\n\n              <div class=\'form-group address required\'>\n                <label class=\'control-label\'>Country</label>\n                \x3c!--<input ng-model="countryName" autocomplete=\'off\'--\x3e\n                \x3c!--class=\'form-control address_country\' size=\'20\' type=\'text\'>--\x3e\n                <select class="form-control" name="address_country" ng-model="card.address_country"\n                        ng-options="cc.c as cc.n for cc in codeToCountry" server_error>\n                </select>\n                <span class="help-block"\n                      ng-show="fCreditCard.address_country.$error.serverError">{{serverErrors.address_country}}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\' ng-if="foundCard">\n          <div class="col-md-4">\n            <div ng-class="{\'form-group required has-feedback\':true,\n                            \'has-error\':fCreditCard.address_country.$invalid}">\n\n              <div class=\'form-group address required\'>\n                <label class=\'control-label\'>Country</label>\n                <input class=\'form-control address_country\' name="address_country" ng-disabled="card.address_country"\n                       ng-model="card.address_country" server-error>\n                <span class="help-block">This must be the same as for your current card</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n\n      <div class="container-fluid">\n        <div class="row">\n          <div class="col-md-12">\n            <div class="help-block--bright"\n                 ng-show="serverErrors.form">{{serverErrors.form.message}}\n            </div>\n          </div>\n        </div>\n        <div class="row">\n          <div class="col-md-12">\n            <div class="siteform__buttons clearfix">\n              <button class="btn btn-siteform btn-lg " ng-click="changeCard()" type="button">\n                Change Payment Card\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div ng-if="showTestControls" style="display:block;margin-top:60px">\n        <button class="btn btn-default" ng-click="addCard()">Add Card</button>\n        <button class="btn btn-default" ng-click="loadDummyData1()">Dummy Data 1</button>\n        <button class="btn btn-default" ng-click="loadDummyData2()">Dummy Data 2</button>\n        <button class="btn btn-default" ng-click="loadDummyData3()">Bad CVC</button>\n      </div>\n\n    </form>\n\n\n  </div>\n</div>\n\n\n\n'},1798(e){e.exports='<div class="siteform-background">\n  <div class="checkout__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n\n    <form class="checkout__form" name="fCheckout" novalidate role="form">\n      <div ng-init="forms.fCheckout = fCheckout"></div>\n      <legend>Order Details</legend>\n      <fieldset>\n        <div class="container-fluid">\n          <div class="row">\n            <div class=\'col-md-12 form-inline checkout__plan\'>\n              <label class=\'control-label\'>Plan</label>\n\n              <div class="checkout__plan-name">{{checkout.planDisplayName}} per calendar&nbsp;<select\n                  class="form-control" ng-model="checkout.quantity"\n                  ng-options="q.value as q.name for q in quantities">\n              </select>&nbsp;<a ui-sref="siteform.paidPlanPicker">pick a different plan</a></div>\n\n            </div>\n          </div>\n          <div class="row">\n            <div class=\'col-md-12 \'>\n              <div class="checkout__total-cost">\n                <label>Total Cost:</label>&nbsp;<span class="l-amount">\n                                    {{checkout.formattedCostExVat}} <span ng-if="checkout.shouldApplyVAT"> + VAT (if applicable)</span> </span>
2\n                <span class="l-currency-notice" ng-if="checkout.unsupportedGBP">countries outside the EU and US are charged in £ (GBP)</span>\n                <span class="l-currency-notice" ng-if="checkout.unsupportedUSD">Charged in US Dollars (USD)</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n\n\n    </form>\n\n\n    <form name="fCreditCard" novalidate>\n      <div ng-init="forms.fCreditCard = fCreditCard"></div>\n\n\n      <div id="card-errors" role="alert"></div>\n      <fieldset ng-if="stripeCard">\n        <div class="container-fluid">\n          <div class="row">\n            <div class="col-md-12">\n              <label>Card</label>\n\n              <div class="card__summary__details">{{stripeCard.card.brand}} **** **** ****\n                {{stripeCard.card.last4}}\n                expires {{("0" + stripeCard.card.exp_month).slice(-2)}}/{{stripeCard.card.exp_year}}\n              </div>\n              <div class="card__change-link"><a href="" ng-click="changeCard()">Edit Card</a></div>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n      <fieldset ng-if="!stripeCard">\n        <div class="container-fluid">\n\n          <div class="row">\n            <div class="col-md-6">\n              <div ng-class="{\'form-group has-feedback\':true,\n           \'has-error\':fCreditCard.name.$invalid && fCreditCard.name.$dirty}">\n                <label>Name on Card</label>\n\n                <input class=\'form-control\' name="name" ng-model="card.name"\n                       placeholder="Cardholder Name" required server-error type=\'text\'>\n                <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.name.$invalid && fCreditCard.name.$dirty,\n      \'glyphicon-ok\':fCreditCard.name.$valid\n       }"></span>\n\n                <span class="help-block" ng-show="fCreditCard.name.$dirty && fCreditCard.name.$error.required\n        && !fCreditCard.name.$error.serverError">\n                    Please provide the cardholder\'s name</span>\n                <span class="help-block"\n                      ng-show="fCreditCard.name.$error.serverError">{{serverErrors.name}}</span>\n              </div>\n            </div>\n\n            <div class="col-md-6">\n              <div class="form-group">\n                <label class=\'control-label\'>Card Number</label>\n                <div class="stripe-field-wrapper">\n                  <div id="stripe-cardNumber"></div>\n                </div>\n                <span class="stripe-help-block" id="stripe-cardNumber-errors"></span>\n              </div>\n            </div>\n          </div>\n\n          <div class="row">\n            <div class="col-md-6">\n              <div class="form-group">\n                <label class=\'control-label\'>CVC</label>\n                <div class="stripe-field-wrapper">\n                  <div id="stripe-cardCvc"></div>\n                </div>\n                <span class="stripe-help-block" id="stripe-cardCvc-errors"></span>\n              </div>\n            </div>\n\n            <div class="col-md-6">\n              <div class="form-group">\n                <label class=\'control-label\'>Expiration</label>\n                <div class="stripe-field-wrapper">\n                  <div id="stripe-cardExpiry"></div>\n                </div>\n                <span class="stripe-help-block" id="stripe-cardExpiry-errors"></span>\n              </div>\n            </div>\n\n\n          </div>\n        </div>\n\n      </fieldset>\n      <fieldset>\n        <legend>Company/Organization Details</legend>\n        <div ng-class="{\'col-xs-12 form-group\':true}">\n          <label class=\'control-label\'>Are you subscribing on behalf of a company or other\n            organization?</label>\n          &nbsp;<input ng-model="page.isOrganization" ng-value="{{true}}" type="radio">&nbsp;Yes\n          &nbsp;<input ng-model="page.isOrganization" ng-value="{{false}}" type="radio">&nbsp;No\n        </div>\n\n        <div ng-if="page.isOrganization">\n          <div class="col-md-12">\n            <div\n                ng-class="{\'form-group has-feedback\':true, \'has-error\':page.isOrganization &&fCredit
2Card.organization_name.$invalid && fCreditCard.organization_name.$dirty}">\n              <label class=\'control-label\'>Are you representing a company/organization? </label>\n              <input autocomplete=\'off\' class=\'form-control organization-name\' name="organization_name"\n                     ng-model="organization.organization_name"\n                     placeholder="Company/Organization Name" required server-error size=\'20\' type=\'text\'\n              >\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.organization_name.$invalid && fCreditCard.organization_name.$dirty,\n      \'glyphicon-ok\':fCreditCard.organization_name.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.organization_name.$dirty && fCreditCard.organization_name.$error.required">\n                    Please provide the company or other organization\'s legal name</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.organization.$error.serverError">{{serverErrors.organization}}</span>\n            </div>\n          </div>\n          <div class="col-md-12" ng-if="checkout.isEUCountry">\n            <div\n                ng-class="{\' form-group has-feedback\':true,\'has-error\':fCreditCard.vat_number.$invalid && fCreditCard.vat_number.$dirty}">\n              <label class=\'control-label\'>VAT Number</label>\n              <input autocomplete=\'off\' class=\'form-control organization-vat\' name="vat_number"\n                     ng-model="organization.vat_number"\n                     placeholder="VAT Number" server-error size=\'20\' type=\'text\'\n                     vat-validator>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.vat_number.$invalid && fCreditCard.vat_number.$dirty,\n      \'glyphicon-ok\':fCreditCard.vat_number.$valid\n       }"></span>\n              \x3c!--<span class="help-block" ng-show="fCreditCard.vat_number.$dirty && fCreditCard.vat_number.$error.required">--\x3e\n              \x3c!--Please provide the company\'s ccs number</span>--\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.vat_number.$dirty && fCreditCard.vat_number.$error.badNumber">\n                    Invalid Vat No</span>\n              <span class="help-block"\n                    ng-show="fCreditCard.vat_number.$dirty && fCreditCard.vat_number.$error.wrongCountry">\n                    Vat number doesn\'t match country</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.vat_number.$error.serverError">{{serverErrors.vat_number}}</span>\n\n              <div class="checkout__vat-notice">VAT registered EU Organizations outside the UK will not be\n                charged VAT\n              </div>\n            </div>\n          </div>\n\n\n        </div>\n\n\n      </fieldset>\n\n      <fieldset>\n        <legend>Billing Address</legend>\n\n\n        <div class=\'form-row\'>\n          <div class="col-md-12">\n            <div\n                ng-class="{\'form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_line1.$invalid && !fCreditCard.address_line1.$pristine}">\n              <label class=\'control-label\'>Address Line 1</label>\n              <input class=\'form-control\' name="address_line1" ng-model="card.address_line1"\n                     placeholder="" required server-error size=\'4\' type=\'text\'>\n\n\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_line1.$invalid && fCreditCard.address_line1.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_line1.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_line1.$dirty && fCredit
2Card.address_line1.$error.required">\n                    Please provide the street address</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_line1.$error.serverError">{{serverErrors.address_line1}}</span>\n\n            </div>\n          </div>\n        </div>\n\n        <div class=\'form-row\'>\n          <div class="col-md-12">\n            <div\n                ng-class="{\' form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_line2.$invalid && !fCreditCard.address_line2.$pristine}">\n              <label class=\'control-label\'>Address Line 2 (optional)</label>\n              <input class=\'form-control\' name="address_line2" ng-model="card.address_line2"\n                     placeholder="" server-error size=\'20\' type=\'text\'>\n\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_line2.$error.serverError">{{serverErrors.address_line2}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n            <div\n                ng-class="{\'form-group required has-feedback\':true,\n                             \'has-error\':fCreditCard.address_city.$invalid && !fCreditCard.address_city.$pristine}">\n              <label class=\'control-label\' ng-if="countryCode === \'US\'">City</label>\n              <label class=\'control-label\' ng-if="countryCode === \'GB\'">Town/City</label>\n              <label class=\'control-label\'\n                     ng-if="countryCode !== \'GB\' && countryCode !== \'US\'">Town/City</label>\n              <input autocomplete=\'off\' class=\'form-control\'\n                     name="address_city" ng-model="card.address_city" required server-error size=\'20\'\n                     type=\'text\'>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_city.$invalid && fCreditCard.address_city.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_city.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_city.$dirty && fCreditCard.address_city.$error.required">\n                        Please provide your town/city</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_city.$error.serverError">{{serverErrors.address_city}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n            <div\n                ng-class="{\'form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_state.$invalid && !fCreditCard.address_state.$pristine}">\n              <label class=\'control-label\' ng-if="countryCode === \'US\'">State</label>\n              <label class=\'control-label\' ng-if="countryCode === \'GB\'">County</label>\n              <label class=\'control-label\'\n                     ng-if="countryCode !== \'GB\' && countryCode !== \'US\'">State/County/Region</label>\n              <input autocomplete=\'off\' class=\'form-control\'\n                     name="address_state" ng-model="card.address_state" required server-error size=\'20\'\n                     type=\'text\'>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_state.$invalid && fCreditCard.address_state.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_state.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_state.$dirty && fCreditCard.address_state.$error.required">\n                    Please complete this field</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <sp
2an class="help-block"\n                    ng-show="fCreditCard.address_state.$error.serverError">{{serverErrors.address_state}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n            <div\n                ng-class="{\' form-group required has-feedback\':true,\n                         \'has-error\':fCreditCard.address_zip.$invalid && !fCreditCard.address_zip.$pristine}">\n              <label class=\'control-label\' ng-if="countryCode === \'US\'">Zip Code</label>\n              <label class=\'control-label\' ng-if="countryCode === \'GB\'">Post Code</label>\n              <label class=\'control-label\' ng-if="countryCode !== \'GB\' && countryCode !== \'US\'">Zip or\n                Post Code</label>\n              <input autocomplete=\'off\' class=\'form-control\'\n                     name="address_zip" ng-model="card.address_zip" required server-error size=\'20\'\n                     type=\'text\'>\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fCreditCard.address_zip.$invalid && fCreditCard.address_zip.$dirty,\n      \'glyphicon-ok\':fCreditCard.address_zip.$valid\n       }"></span>\n              <span class="help-block"\n                    ng-show="fCreditCard.address_zip.$dirty && fCreditCard.address_zip.$error.required">\n                    Please provide your zip code/postal code</span>\n              \x3c!-- use server error directive here to clear on edit --\x3e\n              <span class="help-block"\n                    ng-show="fCreditCard.address_zip.$error.serverError">{{serverErrors.address_zip}}</span>\n\n            </div>\n          </div>\n        </div>\n        <div class=\'form-row\'>\n          <div class="col-md-4">\n\n            <div ng-class="{\'form-group required has-feedback\':true,\n                            \'has-error\':fCreditCard.address_country.$invalid}">\n\n              <div class=\'form-group address required\'>\n                <label class=\'control-label\'>Country</label>\n                \x3c!--<input ng-model="countryName" autocomplete=\'off\'--\x3e\n                \x3c!--class=\'form-control address_country\' size=\'20\' type=\'text\'>--\x3e\n                <select class="form-control" name="address_country" ng-model="card.address_country"\n                        ng-options="cc.c as cc.n for cc in codeToCountry" server_error>\n                </select>\n                <span class="help-block"\n                      ng-show="fCreditCard.address_country.$error.serverError">{{serverErrors.address_country}}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n\n      <div class="container-fluid">\n        <div class="row">\n          <div class="col-md-12">\n            <div class="help-block--bright"\n                 ng-show="serverErrors.form">{{serverErrors.form.message}}\n            </div>\n          </div>\n        </div>\n        <div class="row">\n          <div class="col-md-12">\n            <div class="siteform__buttons clearfix">\n              <button class="btn btn-siteform btn-lg " ng-click="submitOrder()" type="button">\n                View Order Summary\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div ng-if="showTestControls" style="display:block;margin-top:60px">\n        <div>\n          <button class="btn btn-default" ng-click="addCard()">Add Card</button>\n          <button class="btn btn-default" ng-click="loadDummyData1()">Good US 1</button>\n          <button class="btn btn-default" ng-click="loadDummyData2()">Good US 2</button>\n          <button class="btn btn-default" ng-click="loadDummyDeclined()">Declined US 1</button>\n          <button class="btn btn-default" ng-click="loadBadZip()">badZip US</button>\n        </div>\n        <div>\n          <button class="btn btn-default" ng-click="loadBadCVC()">CVC Problem</button>\n          <button class="btn btn-default" ng-click="loadProcessingError()">Processing Error</button>\n          <button class="btn btn-default" ng-click="loadFraudulent()">Fraudulent</button>\n          <button class="btn btn-default" ng-click="loadExpired()">Expired</button>\n        </div>\n      </div>\n\n    </form>\n\n\n  </div>\n</div>\n\n\n\n'},1204(e){e.exports='<div class="siteform-background">\n  <div class="closeAccount__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <form class="closeAccount__form" name="fClose" novalidate role="form">\n      <div ng-init="forms.fClose = fClose"></div>\n      <legend>Close Your Tockify Account</legend>\n\n      <fieldset ng-if="planSource === \'duda\'">\n        <div class="container-fluid">\n          <div class="row">\n            <div class=\'col-md-12 form-inline\'>\n              <div class="closeAccount__message">\n                To close your account you need to uninstall the Tockify Calendar App from your site builder.\n              </div>\n              <a class="btn btn-default" ui-sref="settings.account">OK</a>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n\n      <fieldset ng-if="planStatus === \'active\' && planSource !== \'duda\'">\n        <div class="container-fluid">\n          <div class="row">\n            <div class=\'col-md-12 form-inline\'>\n              <div class="closeAccount__message">\n                You have an active subscription and can\'t close your account\n                until you have cancelled It.\n              </div>\n              <a class="btn btn-siteform" ui-sref="siteform.cancelSubscription">\n                Cancel Subscription\n              </a>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n\n      <fieldset ng-if="planStatus && planStatus !== \'active\' && planSource !== \'duda\'">\n        <div ng-if="planStatus === \'willCancel\'">\n          <div class="row">\n            <div class="col-md-12">\n              <div class="help-block">
2\n                <span class="label label-danger">Warning</span>\n                You have a cancelled subscription that is valid until the end of the current\n                billing period. If you close your account you will lose access to it immediately.\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="row">\n          <div class="col-md-12">\n            <div class="help-block">\n              <span class="label label-danger">Warning</span> Once you have closed your account your calendars will stop\n              working and you will\n              no longer be able to log in.\n            </div>\n          </div>\n        </div>\n        <div class="row">\n          <div class="col-md-12">\n            <div class="checkout__confirm-box">\n              <div ng-init="forms.fClose = fClose"></div>\n              <div ng-class="{\'form-group has-feedback\':true,\n           \'has-error\':fClose.agree.$invalid && fClose.agree.$dirty}">\n                <label class="checkbox-inline">\n                  <input name="agree" ng-model="page.agree" required\n                         type="checkbox" value="{{page.agree}}">\n                  {{\'I have read the warnings above and want to close my account\' | translate}}\n                </label>\n                <div class="help-block--bright" ng-show="fClose.agree.$invalid && fClose.agree.$dirty    ">\n                  Please check the box above to confirm that you want to close your account\n                </div>\n              </div>\n\n            </div>\n            <div class="siteform__buttons clearfix">\n              <button class="btn btn-danger btn-lg" ng-click="closeAccount()" type="button">\n                Close Account\n              </button>\n              <a class="btn btn-default btn-lg" ui-sref="settings.account" type="button">Keep Account</a>\n            </div>\n          </div>\n        </div>\n\n      </fieldset>\n\n    </form>\n  </div>\n</div>\n'},5810(e){e.exports='<div class="siteform-background">\n  <div class="checkout__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <form class="checkout__form" name="fConfirm" novalidate role="form">\n      <div ng-if="!checkout">\n        <legend>Order Not Found</legend>\n      </div>\n      <div ng-if="checkout" ng-init="forms.fConfirm = fConfirm">\n        <legend>Check and place your order</legend>\n        <fieldset>\n          <div class="container-fluid">\n            <div class="row">\n              <div class=\'col-md-12 form-inline checkout__plan\'>\n\n                <div class="checkout__plan-name">{{checkout.orderDisplayDescription}} <span\n                    ng-if="checkout.vatRate !== 0"> + {{checkout.vatRate}}% VAT </span></div>\n\n              </div>\n            </div>\n\n            <div class="row">\n              <div class=\'col-md-12 \'>\n                <div class="checkout__total-cost--vat">\n                  <label>Total Cost: </label>&nbsp;\n                  <span\n                      class="l-amount"> {{checkout.formattedCostIncVat}} <span> per {{checkout.interval}}</span></span>\n                  <span ng-if="checkout.vatRate !== 0"> includes {{checkout.vatCost}} VAT</span>\n\n                  <span class="l-currency-notice" ng-if="checkout.unsupportedGBP">(GBP)</span>\n                  <span class="l-currency-notice" ng-if="checkout.unsupportedUSD">(USD)</span>\n\n                </div>\n              </div>\n            </div>\n            <div class="row">\n              <div class="col-md-12">\n                <div class="confirm__card">\n                  <label>Card: </label>&nbsp;\n                  <span class="card__summary__details"> {{stripeCard.card.brand}} **** **** **** {{stripeCard.card.last4}}\n                                    expires {{("0" + stripeCard.card.exp_month).slice(-2)}}/{{stripeCard.card.exp_year}}</span>\n                </div>\n              </div>\n            </div>\n\n            <div class="row">\n              <div class="col-md-12">\n                <div class="checkout__confirm-box">\n\n\n                  <div ng-init="forms.fConfirm = fConfirm"></div>\n                  <div ng-class="{\'form-group has-feedback\':true,\n           \'has-error\':fConfirm.agree.$invali
2d && fConfirm.agree.$dirty}">\n                    <label class="checkbox-inline">\n                      <input name="agree" ng-model="page.agree" required\n                             type="checkbox" value="{{page.agree}}">\n                      I have read and agree to the <a target="_blank" ui-sref="docs.inter.company.tos">Terms and\n                      Conditions</a>\n                    </label>\n                    <div class="help-block--bright" ng-show="fConfirm.agree.$invalid && fConfirm.agree.$dirty    ">\n                      You must agree to our terms and conditions before subscribing\n                    </div>\n                  </div>\n\n                </div>\n              </div>\n            </div>\n            <div class="row">\n              <div class="col-md-12">\n                <div class="siteform__buttons checkout__confirm-button clearfix">\n\n                  <button class="btn btn-siteform btn-lg" ng-click="subscribe()" ng-if="!page.stripeTokenUsed"\n                          type="button">\n                    Confirm and Place Order\n                  </button>\n\n\n                  <button class="btn btn-default btn-lg" ng-click="editOrder()" ng-if="page.stripeTokenUsed"\n                          type="button">\n                    Go back and edit order details\n                  </button>\n\n\n                </div>\n              </div>\n            </div>\n          </div>\n\n\n        </fieldset>\n\n      </div>\n    </form>\n\n\n  </div>\n</div>\n\n\n\n'},818(e){e.exports='<div class="tkf__link-editor">\n  <legend>Subscription Payment Incomplete</legend>\n\n  <form novalidate>\n\n    <div class="bs-callout bs-callout-danger">\n      <h4>Complete Payment To Start The Subscription</h4>\n\n      <p>The initial payment for your subscription failed. You can try again in the invoice page for the next 24\n        hours.</p>\n      <p>After that you\'ll need to go through the checkout process again.</p>\n\n    </div>\n    <div class="container-fluid">\n      <a class="btn btn-siteform btn-block" ng-click="closePopup()"\n         ui-sref="siteform.invoice({id:\'latest.open\'})">Go To Invoice Page to Retry Payment</a>\n    </div>\n\n\n  </form>\n\n\n</div>'},3612(e){e.exports='<div class="docs">\n  <div class="docs__top__bar">\n    <div class="nav-icon" ng-class="{\'l-open\':viewState.menuOpen}" ng-click="viewState.menuOpen = !viewState.menuOpen">
2\n      <span></span>\n      <span></span>\n      <span></span>\n      <span></span>\n    </div>\n    <a ng-if="!isDudaEmbed" class="docs__top__bar__brand" ui-sref="docs.inter">Tockify</a>\n    <a ng-if="isDudaEmbed" class="docs__top__bar__brand" ng-href="{{editorLink()}}">back to Editor</a>\n  </div>\n  <div ng-class="{\'docs__menu__scroller\':true, \'l-open\':viewState.menuOpen}">\n    <div class="docs__menu" ui-view="menu"></div>\n  </div>\n  <div ng-class="{\'docs__page__scroller\':true, \'l-open\':viewState.menuOpen}">\n    <nav class="docs__crumbs" ng-if="currentPage() && !atDocsRoot()">\n      <a ui-sref="docs.inter">Docs</a>\n      <span ng-if="currentPage().section">/</span>\n      <a ng-if="currentPage().section" ui-sref="{{sectionSref()}}">{{currentPage().section}}</a>\n      <span>/</span>\n      <span class="docs__crumbs__current">{{currentPage().title}}</span>\n    </nav>\n    <div autoscroll="true" class="docs__page" ui-view="docpage"></div>\n  </div>\n</div>\n'},2212(e){e.exports='<div class="docs__menu__header">\n  <a ng-if="!isDudaEmbed" class="docs__menu__brand" href="/"><span class="tockify-logo">Tockify</span></a>\n  <a ng-if="isDudaEmbed" class="docs__menu__brand" ng-href="{{editorLink()}}"><span>back to Editor</span></a>\n  <div class="docs__menu__title"><a ui-sref="docs.inter">Docs</a></div>\n</div>\n<ul class="docs__menu__items">\n  <div class="docs__menu__group" ng-repeat="doc in docinfo">\n    <li class="docs__menu__item {{isActive(doc.state)?\'is-active\':\'\'}}">\n      <a ui-sref="{{\'docs.inter.\' + doc.state}}">\n        <span class="docs__menu__caret">\n          <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">\n            <path d="m9 6 6 6-6 6"/>\n          </svg>\n        </span>\n        <span class="docs__menu__label">{{doc.title.trim()}}</span>\n      </a>\n    </li>\n\n    <ul class="docs__menu--secondary {{isActive(doc.state)?\'is-active\':\'\'}}"\n        ng-click="resetScroll();viewState.menuOpen = false">\n      <li class="docs__menu__item {{isExactly(doc.state)?\'is-active\':\'\'}}">\n        <a ui-sref="{{\'docs.inter.\' + doc.state}}">Overview</a>\n      </li>\n      <li class="docs__menu__item {{isActive(doc.state + \'.\' + cdoc.state)?\'is-active\':\'\'}}"\n          ng-repeat="cdoc in doc.children">\n        <a ui-sref="{{\'docs.inter.\' + doc.state + \'.\' + cdoc.state}}">{{cdoc.title}}</a>\n      </li>\n    </ul>\n  </div>\n</ul>\n<div class="docs__menu__foot">\n  Need a hand? <a href="mailto:[email protected]?subject=documentation%20question">Contact support</a>\n</div>\n'},1978(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify Embedding API Documentation</h1>\n      <h2 class="docs__header__subtitle">The API For Embedding Tockify in Your Site</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">These notes are mostly for advanced users</h3>\n\n  <p>Most people will be able to embed Tockify in their site using the embed code generated by the\n    <a ui-sref="customizer.main">customization tool</a> or using a plugin for their website.\n    This page gives extra details for people who want more control.</p>\n\n  <p>Before you can use the Embedding API you must first either install a platform specific Tockify plugin or add the\n    Tockify embed script to\n    your page:</p>\n\n  <pre><code class="language-markup" prism>&lt;script data-cfasync=&quot;false&quot; data-tockify-script=&quot;embed&quot;\nsrc=&quot;https://public.tockify.com/browser/embed.js&quot;&gt;&lt;/script&gt;</code></pre>\n\n  <p>You can now use the embedding API to add Tockify and control how it appears. For a generic site the easiest way to\n    add\n    the Tockify calendar is with the following:</p>\n\n  <pre><code class="language-markup" prism>&lt;div data-tockify-calendar=&quot;spirited&quot; data-tockify-component=&quot;calendar&quot;&gt;&lt;/div&gt;</code></pre>\n\n  <p>The <code>data-tockify-component="calendar"</code> attribute says that we are embedding the calendar component and\n    the\n    <code>data-tockify-calendar="spirited"</code> atribute identifies the calendar to embed.</p>\n\n  <p>Alternatively, to embed the mini calendar use:</p>\n\n  <pre><code class="language-markup" prism>&lt;div data-tockify-calendar=&quot;spirited&quot; data-tockify-component=&quot;mini&quot;&gt;&lt;/div&gt;</code></pre>\n\n  <p>For Wordpress users the equivalent code using the shortcode provided by our\n    <a ui-sref="docs.inter.install.wordpress">Wordpress plugin</a> is as follows:</p>\n\n  <pre><code class="language-css" prism>\n        [tockify component="calendar" calendar="spirited"]\n    </code></pre>\n\n  <p>The equivalent for the mini calendar is:</p>\n  <pre><code class="language-css" prism>\n        [tockify component="mini" calendar="spirited"]\n    </code></pre>\n\n  <p>The other attributes you can use to control how the calendar is embedded are listed below:</p>\n\n  <ul>\n    <li><code>data-tockify-search</code> (or just <code>search</code> in Wordpress). This pre-fills the embedded\n      calendar\'s\n      search box with the attribute\'s value\n    </li>\n    <li><code>data-tockify-tags</code> (or just <code>tags</code> in Wordpress). This is a comma separated list of\n      tags to pre-filter the calendar by.\n    </li>\n    <li><code>data-tockify-view</code> (or just <code>view</code> in Wordpress). The default view for your calendar can\n      be set\n      in <a ui-sref="customizer.main">the theme customizer</a>. This attribute lets you override the theme setting. The\n      value can\n      be <code>pinboard</code>,\n      <code>agenda</code> or <code>monthly</code>\n    </li>\n    <li><code>data-tockify-path</code> (or just <code>path</code> in Wordpress). This lets you open the calendar on\n      a particular event page and can only be used when <code>component="calendar"</code>. For example:\n      <pre><code class="language-markup" prism>&lt;div data-tockify-component=&quot;calendar&quot;\n  data-tockify-path=&quot;/spirited/detail/557/1449050400000&quot;&gt;&lt;/div&gt;</code></pre>\n    </li>\n    <li><code>data-tockify-width</code> (or just <code>width</code> in Wordpress). This limits the calendars width.\n      You need to include units, e.g. 400px or 50%. It\'s usually better not to set this and limit the width using your\n      own\n      wrapper div.\n    </li>\n    <li><code>data-tockify-height</code> (or just <code>height</code> in Wordpress). This limits the calendars height\n      and\n      adds a scrollbar when it won\'t fit. You need to include units, e.g. 400px or 50%. This is usually a bad idea and\n      should be seen as a last resort if you are having problems with the calendar being clipped or overlapping some\n      other content on your site (some website builder tools make HTML with these problems).\n    </li>\n  </ul>\n\n  <h3>Calling the API from Javascript</h3>\n  <p>We also provide a simple Javascript API for launching the popup (lightbox) calendar. This is included in our embed\n    script (see above).</p>\n  <pre><code class="language-javascript" prism>\n         _tkf.openFullScreen({name:\'spirited\'});\n     </code></pre>\n  <p></p>\n  <p>Here <code>_tkf</code> is the global namespace for Tockify javascript functions. The <code>name</code> parameter\n    identifies\n    the calendar. You can also add a <code>view</code> parameter with values <code>pinboard</code>, <code>agenda</code>,\n    or <code>monthly</code> view to control the view that the calendar shows first when it opens.</p>\n  <p>If you want to open the popup calendar on a particular event page use this instead: </p>\n  <pre><code class="language-javascript" prism>\n          _tkf.openFullScreen({path:\'/spirited/detail/557/1449050400000\'});\n      </code></pre>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},1399(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify API Documentation</h1>\n      <h2 class="docs__header__subtitle">How to use the APIs provided by Tockify</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">The APIs that we provide</h3>\n\n  <p>\n    Tockify currently provides only one API - the <a ui-sref="docs.inter.api.embed">Embedding API</a>\n    that can be used to add Tockify to any website.\n  </p>\n\n</div>\n\n\n\n\n\n\n\n\n\n'},8531(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify Calendar</h1>\n      <h2 class="docs__header__subtitle">GDPR</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions l-company container-fluid">\n\n  <ul class="docs__list-with-titles">\n    <li>\n      <h3 class="l-notice">Tockify is compliant with the <a\n          href="https://ec.europa.eu/info/law/law-topic/data-protection/data-protection-eu_en">\n        EU General Data Protection Regulation [GDPR]</a></h3>\n      <p class="l-body">GDPR is a new regulatory framework for the personal data in the EU and EEA (European Economic\n        Area).\n        It offers much stronger protections than the regulations it replaces. We have always been committed to\n        protecting the privacy and integrity of our Users\' personal data so we welcome it.</p>\n      <p class="l-body">An outline of some key steps we\'ve taken to comply is provided below.\n        Please see our <a ui-sref="docs.inter.company.privacy"><b>Privacy Policy</b></a> for more details. </p>\n    </li>\n\n    <li>\n      <h4 class="l-title">Sub-Processors</h4>\n      <p class="l-body">We use several third party providers to help us provide the best service we can.\n        All are committed to ensuring the security of personal data and have strong security track records.</p>\n      <p class="l-body">A list of all third party providers who can come into contact with our users\' personal\n        data is provided below. You can request notification of any updates to this list here:\n        <a href="mailto:[email protected]?subject=sub-processor%20updates">Request Sub-Processor updates</a>\n      </p>\n      <table class="docs__subprocessor-table">\n        <thead>\n        <tr>\n          <td>Name</td>\n          <td>Services</td>\n          <td class="center">Location</td>\n          <td class="center">GDPR compliance</td>\n          <td class="center">Basis</td>\n        </tr>\n        </thead>\n        <tbody>\n        <tr>\n          <td>AWS</td>\n          <td>Website hosting, Data Storage, Email delivery</td>\n          <td>USA</td>\n          <td><a href="https://aws.amazon.com/compliance/gdpr-center">Learn More</a></td>\n          <td>DPA with Tockify</td>\n        </tr>\n        <tr>\n          <td>Stripe</td>\n          <td>Payment Processing</td>\n          <td>USA</td>\n          <td><a href="https://stripe.com/guides/general-data-protection-regulation">Learn More</a></td>\n          <td>DPA with Tockify</td>\n        </tr>\n        <tr>\n          <td>UploadCare</td>\n          <td>File Upload and processing</td>\n          <td>USA</td>\n          <td><a href="https://uploadcare.com/about/gdpr">Learn More</a></td>\n          <td>DPA with Tockify</td>\n        </tr>\n        <tr>\n          <td>Missive</td>\n          <td>Email Management (Support)</td>\n          <td>USA</td>\n          <td><a href="https://missiveapp.com/gdpr">Learn More</a></td>\n          <td>DPA with Tockify</td>\n        </tr>\n        <tr>\n          <td>Google</td>\n          <td>Support email and (anonymous) analytics</td>\n          <td>USA</td>\n          <td><a href="https://cloud.google.com/security/gdpr/resource-center">Learn More</a></td>\n          <td>DPA with Tockify</td>\n        </tr>\n        <tr>\n          <td>Slack</td>\n          <td>Internal IM (Support)</td>\n          <td>USA</td>\n          <td><a href="https://slack.com/gdpr">Learn More</a></td>\n          <td>DPA with Tockify</td>\n        </tr>\n        </tbody>\n      </table>\n\n      In the above DPA stands for Data Processor Agreement.\n\n    </li>\n    <li>\n      <h4 class="l-title">Data Transfers</h4>\n      <p class="l-body">
2\n        As a UK-based company, Tockify Ltd. benefits from an EU adequacy decision (Commission Implementing Decision (EU) 2021/1773,\n        extended by (EU) 2025/1225). Therefore, personal data transfers from the EU to Tockify do not require additional\n        GDPR safeguards.\n      </p>\n      <p class="l-body">Tockify Ltd. may transfer personal data to the Sub-Processors listed above.\n        Where these sub-processors are based in the US, transfers are covered by the EU-US Data Privacy Framework,\n        or by appropriate Standard Contractual Clauses (SCCs) as part of our Data Processing Agreements.</p>\n    <li>\n    <li>\n      <h4 class="l-title">Data Subject Rights</h4>\n      <p class="l-body">\n        All of our users have the right to access and export all of their personal data\n        we hold about them in machine readable format.\n        Users can also request information about whether and what information we hold about them and can request its\n        deletion or correction.\n        We will respond to all such requests within 30 days and aim to do so much faster.\n      </p>\n    </li>\n\n    <li>\n      <h4 class="l-title">Privacy By Design</h4>\n      <p class="l-body">\n        Tockify\'s service has been designed with security and privacy in mind and stays up to date with security best\n        practices.\n        All data transfers take place over encrypted TLS (aka SSL) channels and all personal data is kept in secured\n        databases on encrypted storage.\n        All backups of personal data are also kept on encypted storage.\n      </p>\n      <p class="l-body">\n        We have built Tockify to protect personal data from unauthorized access, changes, discosure or destruction.\n      </p>\n    </li>\n\n    <li>\n      <h4 class="l-title">Data Processor Agreement</h4>\n      <p class="l-body">Tockify Users who require a Data Processor Agreement (DPA), e.g. because they are using Tockify\n        as a sub-processor, can request one here:\n        <a href="mailto:[email protected]?subject=DPA%20request">Request DPA</a>\n    </li>\n\n\n  </ul>\n\n</div>'},4660(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">About Tockify</h1>\n      <h2 class="docs__header__subtitle">A Little Company Background</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions l-company container-fluid">\n\n  <h2>\n    About Tockify\n  </h2>\n\n  <p>\n    We are a small team of developers and designers dedicated to making it easier to create and consume\n    time related information on the internet.\n  </p>\n  <p>\n    Tockify was founded in 2011 by <a href="http://robertdunne.com" target="_blank">Robert Dunne</a>.\n    Our first calendar was released in 2012. We are based in London, England.\n  </p>\n\n  <h3>\n    Support contact details\n  </h3>\n\n  <p>\n    <b>Email:</b>\n    <a href="mailto:[email protected]">[email protected]</a>\n  </p>\n</div>'},8604(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify Calendar</h1>\n      <h2 class="docs__header__subtitle">Privacy Policy</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions l-tos l-company container-fluid">\n\n  <h2>Tockify<sup>&copy;</sup> Privacy Policy</h2>\n  <p>Effective as of July 3rd 2025</p>\n\n  <p>\n    Tockify Ltd, a company registered in the UK under number 07611951 ("Tockify")\n  </p>\n  <p>\n    We are committed to the protection and accuracy of all personal information we collect\n    from you and of any personal information collected <i>by you</i> when using Tockify features.\n  </p>\n\n  <p>We are committed to and compliant with the European General Data Protection Regulation 2016/679 (<b>“GDPR”</b>).\n  </p>\n\n  <p>This document the <b>“Privacy Policy”</b>, our <a ui-sref="docs.inter.company.tos"><b>Terms of Service</b></a>\n    and any other agreements you have with us are collectively referred to as the <b>“Terms”</b>. </p>\n\n  <p>The terms “personal data,” “data subject,” “processing,” “Processing Instruction” and\n    “data processor” and “data controller” shall have the meanings given to those terms respectively in the GDPR.\n  </p>\n\n  <ol class="l-root">\n    <li>\n      <h3>Introduction</h3>\n\n      <p>Tockify collects personal information when people sign up for our service and in the\n        course of using the service. When you add content to Tockify or use Tockify to collect information from third\n        parties, e.g. using our RSVP\n        system we may also process their personal information. By agreeing to these Terms you are agreeing that we may\n        use your\n        data as specified in these Terms and giving us a “Processing Instruction” to process any personal data collected\n        by\n        you through the Service, on your behalf.\n      </p>\n      <p><b>This policy applies: </b></p>\n      <ol>\n        <li>When we collect data from you and determine how it will be used, e.g. when we ask for your\n          name when you sign up. In this case we are acting as the <i>data controller</i>.\n        </li>\n        <li>When you add content to Tockify or use features such as our RSVP and or User Submitted Events systems to\n          collect\n          other people\'s personal data. In this case we are acting as the <i>data processor</i> and you are acting as\n          the <i>data controller</i>.\n        </li>\n      </ol>\n    </li>\n    <li>\n      <h3>How we use your personal information</h3>\n      <ol>\n        <li><b>Data Collected: </b>We may collect your name, email address, mailing address,\n          phone number, billing information (such as card number and billing address),\n          password, company name, geographical location, your service use history and\n          access details for services you are using in conjunction with Tockify, e.g. Google Calendars.\n        </li>\n        <li><b>Incidental Data Collected:</b> Using the system logs we maintain for operational\n          reasons we may be able to discover your IP address, browser and computer name and version and\n          internet service provider. This information is only used for service maintenance and diagnostic purposes\n          and does not result in long term collection of personal data.\n        </li>\n        <li>\n          <b>Uses of Google Data</b>\n          <p>If you opt to use our Google Calendar Sync feature we will request read only access to your Google Calendar\n            and\n            Google Calendar Event data. This is only ever used to keep changes you make in Google Calendar and Tockify\n            synchronized and not for any other purpose.</p>\n        </li>\n\n        <li><b>We use the data we collect to:</b>\n          <ol>\n            <li>Identify you when you use our site and show you the correct content.</li>\n            <li>Improve and personalize the service.</li>\n            <li>Implement our Google Calendar Sync feature.</li>\n            <li>Process payments.</li>\n            <li>Send emails including responses to support requests, security notices,\n              terms of service change notifications, subscription/payment notifications.\n            </li>\n            <li>
2Send you emails relating to the expiry of a service trial period or other Tockify marketing.</li>\n            <li>Comply with legal and regulatory requirements.</li>\n          </ol>\n        </li>\n        <li><b>Your right to your personal data: </b>All of our users have the right to access and export all of the\n          personal data\n          we hold about them in machine readable format. Users can also request information about whether and what\n          information we hold about them and can request its deletion or correction except where doing so would be\n          incompatible with a legal or regulatory requirement.\n          <p>We will respond to all such requests within 30 days and aim to do so much faster.</p>\n        </li>\n      </ol>\n    </li>\n    <li>\n      <h3>Sub-Processors</h3>\n      <p>We do not sell, share, trade, or rent or otherwise provide Users\' personal data to others except in the case of\n        trusted third party service providers parties (<b>“sub-processors”</b>) that we use to help provide our\n        service and operate our business or when required to do so by law.</p>\n      <ol>\n        <li>Tockify uses sub-processors to facilitate provision of certain aspects of the Tockify Service.\n          By agreeing to these Terms, you give a general authorization to Tockify to engage onward sub-processors,\n          subject to compliance with the requirements set out in the Terms.\n          <p>A current list of sub-processors who handle personal data for the Data Processor is maintained in\n            the <a ui-sref="docs.inter.company.gdpr">GDPR section</a> of the Tockify website.</p>\n          <p>You may request updates whenever we add new sub-processors to this list and will have 10 days to object\n            to any additions to the list before the change is implemented by us. </p>\n          <p>If you object to a particular sub-processor\n            that the Tockify Service cannot be reasonably provided without and we determine there’s no reasonable way to\n            disassociate the sub-processor from your account, then your sole remedy will be to terminate your\n            subscription and close your account.\n            Such termination will be without a right of refund for any fees that were prepaid for the period following\n            termination.</p>\n        </li>\n        <li>Tockify is accountable for the actions and omissions of any Sub-Processor in the same way as for its own\n          actions and omissions.\n        </li>\n      </ol>\n\n    </li>\n    <li>\n      <h3>Security</h3>\n      <ol>\n        <li>Taking into account the state of the art, the costs of implementation and the nature, scope, context\n          and purposes of Processing as well as the risk of varying likelihood and severity for the rights and freedoms\n          of natural persons Tockify shall in relation to the Personal Data implement appropriate technical\n          and organizational measures to ensure a level of security appropriate to that risk, including,\n          as appropriate, the measures referred to in Article 32(1) of the GDPR.\n        </li>\n        <li>
2In assessing the appropriate level of security Tockify shall take account in\n          particular of the risks that are presented by Processing, in particular from a Personal Data Breach.\n        </li>\n        <li>If Tockify becomes aware of a (“Security Incident”), i.e. any unauthorized or unlawful\n          access to, modification, disclosure or destruction of, personal data we will notify you as soon as\n          we reasonably can and at most within 72 hours of becoming aware of the Security Incident.\n          In such cases we will cooperate with you to notify any affected parties and to investigate the\n          incident and will provide any reasonably requested relevant information\n        </li>\n      </ol>\n\n    </li>\n    <li>\n      <h3>International Data Transfers</h3>\n      <p>\n        Tockify’s service is global in nature and it is sometimes necessary to make use of data storage\n        facilities and sub-processors outside of the European Economic Area (EEA), such as Amazon Web Services.\n        Transfers of personal data to suppliers and services in third countries (countries outside the EEA)\n        are conducted only when appropriate safeguards are in place, in compliance with applicable law.\n        These safeguards typically include reliance on an adequacy decision by the European Commission (where available),\n        the EU-US Data Privacy Framework (for transfers to certified US entities), or Standard Contractual Clauses (SCCs)\n        adopted by the European Commission, as incorporated into our agreements with sub-processors.\n      </p>\n    </li>\n    <li>\n      <h3>Cookies</h3>\n      <p>A cookie is a tiny text file that resides on your computer, mobile phone, or other device,\n        and allows us and/or our business partners to recognise you as a user when you return to a Tockify Website\n        or Tockify Service using the same computer and web browser. For more detail on how businesses\n        use cookies on websites, please see www.allaboutcookies.org.</p>\n      <p>Please note that by deleting our cookies or disabling future cookies you may not be able fully\n        use the Tockify Website and Tockify Services.</p>\n      <ul>\n        <li>We only use cookies to remember who you are when you have logged in so that we can show you the right\n          content\n        </li>\n        <li>We don\'t add tracking cookies of any kind</li>\n        <li>We don\'t add any cookies to the browsers of people who have not logged in.</li>\n        <li>When you add a Tockify calendar to your site we will not set any cookies for your visitors</li>\n      </ul>\n    </li>\n    <li>\n      <h3>Additional terms for customers who collect personal data</h3>\n      <p>The terms in this section apply to users who use Tockify to collect personal\n        data from third parties using, e.g. our RSVP system or to publish\n        it in the description of an event. In such cases the user is acting as a “Data Controller” and Tockify is a\n        “Data Processor”</p>\n      <ol>\n        <li><b>Data category restrictions: </b>Use of Tockify services to collect “Special Category Personal Data”\n          as per Article 9 of the GDPR is forbidden. This includes information about “racial or ethnic origin,\n          political opinions, religious or philosophical beliefs, or trade union membership” or\n          “health or data concerning a natural person’s sex life or sexual orientation”\n        </li>\n        <li><b>Data Transfer To Tockify: </b> Tockify Ltd. is based in the UK, which benefits from an EU adequacy decision\n          (Commission Implementing Decision (EU) 2021/1773, extended by (EU) 2025/1225). This means no special GDPR\n          agreements are required for data transfers from the EU to Tockify.\n        </li>\n        <li><b>Customer Obligations as a the “Data Controller”</b>\n          <ol>\n            <li>\n              You shall ensure that where relevant all data subjects have been informed of and consented\n              to the collection and processing of their personal data as required by Applicable Law\n              and accept that you have sole responsibility for the accuracy, legality and\n              quality of personal data processed on your behalf in order to provide the Tockify Service.\n            </li>\n          </ol>\n\n        </li>\n        <li><b>Tockify Obligations as the “Data Processor”</b>\n          <ol>\n            <li>Tockify will only process or transfer data (internally or to a sub-processor)\n              on your behalf in accordance with Applicable Law and on your documented instructions.\n              The Terms constitute the necessary documented instructions.\n            </li>\n            <li>When you delete personal data we will only retain it when that is necessary to comply\n              with Applicable Law or regulations. After deletion the data may exist in rout
2ine\n              disaster recovery and continuity backups for up to one year.\n            </li>\n            <li>If we receive a request from a “data subject” about data\n              collected by you we will promptly notify you and forward the request to you.\n            </li>\n            <li>If you need to demonstrate compliance with your obligations under Article 28\n              of the GDPR and the necessary information cannot be accessed by using the services\n              available to your account then we will, where technically feasible, provide\n              the necessary information. 14 days’ written notice must be provided for any such requests.\n            </li>\n            <li>Tockify staff will only have access to personal\n              data as required to carry out their duties and only after committing\n              themselves to privacy and confidentiality.\n            </li>\n            <li>If you wish to conduct a data impact assessment\n              relating to Tockify services we will assist you as reasonably required (at your expense).\n            </li>\n          </ol>\n        </li>\n        <li><b>Audits:</b>\n          <ol>\n            <li>Tockify shall allow for and reasonably cooperate with audits\n              or inspections by the Data Controller or an auditor mandated by the Data Controller.\n              The Data Controller shall give notice of any audit or document inspection\n              to be conducted and shall make reasonable endeavours to avoid causing damage\n              or disruption to the Data Processors premises, equipment and business in\n              the course of such an audit or inspection. Any audit or document\n              inspection shall be carried out with reasonable prior written notice of no less than 30 days,\n              and shall not be conducted more than once a year.\n            <li>The Data Controller may be requested to sign a non-disclosure agreement reasonably\n              acceptable to the Data Processor before being provided with the above.\n            </li>\n          </ol>\n        </li>\n        <li><b>Remuneration and costs</b>\n          <ol>\n            <li>The Data Controller shall remunerate the Data Processor based on time\n              spent to perform the obligations under section 7.4.4, 7.4.6 and 7.5 of these\n              Terms based on the Data Processor’s hourly rates.\n            </li>\n            <li>The Data Processor is also entitled to remuneration for any time\n              and material used to adapt and change the processing activities in order to comply with any changes to the\n              Data Controller’s Instruction, including implementation costs and additional costs required to deliver the\n              Tockify Services due to the change in the Instruction. The Data Processor is exempted from liability for\n              non-performance with the Tockify Terms if the performance of the obligations under the Tockify Terms would\n              be in conflict with any changed Instruction or if contractual delivery in accordance with the changed\n              Instruction is impossible. This could for instance be the case; (i) if the changes to the Instruction\n              cannot\n              technically, practically or legally be implemented; (ii) where the Data Controller explicitly requires\n              that\n              the changes to the Instruction shall be applicable before the changes can be implemented; and (iii)\n              in the period of time until the Tockify Terms is changed to reflect the new Instruction and commercial\n              terms thereof.\n            </li>\n          </ol>\n        </li>\n      </ol>\n    </li>\n    <li>\n      <h3>Changes to this Tockify Privacy Policy</h3>\n      <p>Tockify reserves the right to make changes to this Tockify Privacy Policy. If we make any material changes to\n        this\n        policy we will notify you by posting the new version of the policy on the Tockify Websites. It is your own\n        responsibility to check the website for such postings from time to time.</p>\n      <p>Please note that by accepting the Tockify Terms and Conditions of Use or by using the Tockify Software\n        Application\n        or the\n        Tockify Website, you consent to the collection and processing of your personal information as described 
2in this\n        Tockify\n        Privacy Policy. As mentioned above, we will notify you if we make any material changes to this Tockify Privacy\n        Policy by\n        posting the new version of the policy on the Tockify Websites. Your continued use of the Tockify Software\n        Application or the Tockify\n        Website following the posting of changes to this Tockify Privacy Policy will constitute an acceptance of such\n        changes.</p>\n      <p>If you have any concerns, questions or thoughts on how we can improve our privacy policy, please let us know by\n        sending an email to [email protected]</p>\n    </li>\n    <li>\n      <h3>English version prevails</h3>\n      <p>In the event that this Agreement is translated into other languages and there is a discrepancy between the two\n        language versions, the English language version shall prevail to the extent that such discrepancy is the result\n        of an error in translation.</p>\n    </li>\n  </ol>\n\n  <div class="tos-footer">\n    <p>Copyright &copy; 2011 - 2025 Tockify Ltd. All rights reserved.<br>\n      Tockify Ltd, Unit 11 Hove Business Centre, Fonthill Road, Hove, East Sussex, England, BN3 6HA</p>\n  </div>\n\n\n</div>'},8040(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify Calendar</h1>\n      <h2 class="docs__header__subtitle">Privacy Policy</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions l-company container-fluid">\n\n  <h2>Tockify<sup>&copy;</sup> Privacy Policy</h2>\n  <p>Effective as from August 14 2019</p>\n\n  <p>\n    Tockify Ltd, a company registered in the UK under number 07611951 ("<b>Tockify</b>") aims to provide the best\n    calendar\n    management service possible. In order to do so Tockify will request some information from you and automatically\n    collect\n    information about your use of the <b>Tockify Software Application</b> (as defined in the Tockify <a\n      ui-sref="docs.inter.company.tos">Terms of Service</a>). This\n    policy (the "<b>Tockify Privacy Policy</b>") describes what personal information we may collect from you and what we\n    will and will not do with that information.\n  </p>\n\n  <h2>Collection and use of personal information</h2>\n  <p>\n    When you sign up for a Tockify account or purchase Tockify&#39;s products and services described on the Tockify<a\n      href="/">Website</a>\n    or access the Tockify Software Application, we may ask you for and collect certain information such as email\n    address, postal address,\n    age, gender and place of residence. In addition, when you use the Tockify Software Application and Tockify Websites,\n    we will\n    automatically receive information about your use of the service and website including information such as calendars\n    that you access, queries you make, the URL of the website from which you use or access the Tockify Software\n    Application, date and\n    time of your request, your Internet protocol address, performance of your network and computer, your browser type,\n    language and identifying information, your operating system and application version.\n  </p>\n  <p>We will use your personal information (i) to provide the products and services that you have purchased or requested\n    (ii) to communicate with you concerning your account, customer service issues and other Tockify products and\n    services,\n    (iii) to personalise and improve the Tockify Software Application and the Tockify Websites, (iv) to ensure the\n    technical functioning\n    of our products and services, (v) to develop new products and services, (vi) to protect the copyright-protected\n    content\n    of the Tockify Software Application, and (vii) as otherwise stated in this Tockify Privacy Policy.</p>\n\n  <h2>Sharing information with others</h2>\n  <p>Unless you give us your explicit approval we will only share your personal information, including with Tockify\n    affiliates (being other companies controlled by or under common control with us) for the purposes set forth under\n    Section 1 (i) to (vii) above or as is necessary to:\n  <ul>\n    <li>Enforce the terms and conditions of the Tockify Terms and Conditions of Use, (as defined in the Tockify Terms\n      and Conditions of Use)\n    </li>\n    <li>Comply with laws and regulations, requests from a governmental or administrative body or court, or to respond\n      to litigation.\n    </li>\n    <li>Allow for a change of ownership of Tockify (including but not limited to an acquisition by or merger with\n      another company) and related transfer of all personal information to the new owner in which case any information\n      remains protected in accordance with this Tockify Privacy Policy.\n    </li>\n    <li>Allow advertising audits and analysis measuring the size and composition of the group of users that have\n      listened to and/or viewed an advertisement or other promotional information.\n    </li>\n    <li>Allow us to use a third party to perform surveys measuring your experiences and use of our services (not\n      permitting the third party to use your personal information for any other purpose).\n    </li>\n    <li>Allow us to share aggregated statistics about use of the Tockify Software Application with our business\n      partners.\n    </li>\n  </ul>\n\n\n  <h2>Transfer of personal information to other countries</h2>\n  <p>Tockify processes personal information on servers in a number of countries. We may therefore transfer and process\n    your personal information on a server outside your country or subcontract our processing to third parties located in\n    such countries, including countries outside the European Economic Area. However, we will always do so in accordance\n    with\n    this Tockify Privacy Policy and applicable law. By approving the Tockify Privacy Policy, you consent to such\n    transfer of\n    your personal information.</p>\n\n  <h2>Security</h2>\n  <p>We take a number of steps to keep your personal information secure from unauthorized access. For example, we ask\n    you to use a unique and strong password and not to share this information with anyone. In addition, we use encrypted\n    transmissions to limit access to the systems that store your personal information. Further, we respect and comply\n    with\n    EU legislation on data protection.</p>\n\n  <h2>Access to personal information and corrections</h2>\n  <p>You can access and update some of the personal information we keep on you through the Tockify Software Application\n    or by sending\n    a request to supp
2[email protected]. We will respond to your request upon verification of your identity within a\n    reasonable period of time, and to the maximum extent practical.</p>\n\n  <h2>Links and social buttons</h2>\n  <p>We may display links to third party websites or embed social sharing buttons. Please note that we cannot control\n    and cannot be held responsible for the privacy policies of such websites or buttons. You should always read the\n    privacy\n    policy of a website to find out more about how personal information is collected and processed.</p>\n\n  <h2 id="cookies">Cookies</h2>\n  <p>\n    Like most websites, we use cookies to track site usage and trends and to improve the quality and customise your\n    experience of the Tockify Websites and Tockify Service. We may also use cookies to provide advertising on the\n    Tockify\n    Websites and Tockify Service. We may also allow certain business partners to place or recognise cookies on your\n    browser\n    for those purposes. A cookie is a tiny text file that resides on your computer, mobile phone, or other device, and\n    allows us and/or our business partners to recognise you as a user when you return to a Tockify Website or Tockify\n    Service using the same computer and web browser. For more detail on how businesses use cookies on websites, please\n    see <a\n      href="https://www.allaboutcookies.org">www.allaboutcookies.org</a>. You can find an overview of the various types\n    of\n    cookies used by Tockify and/or our business partners, in the table below.\n  </p>\n\n  <p>We may use cookies for 3 purposes:\n  <table>\n    <thead>\n    <tr>\n      <th>Cookie Type</th>\n      <th>Reason For Cookie</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n      <td>Essential For Site Operation</td>\n      <td>These cookies are necessary to allow us to operate the Tockify Website and Tockify Software Application as you\n        have\n        requested. These cookies, for example, let us identify you and provide you with access to the services to which\n        you are entitled.\n      </td>\n    </tr>\n    <tr>\n      <td>Performance Enhancing</td>\n      <td>These cookies are used by us or our business partners to analyse how the Tockify Website and Tockify\n        Service are used. The cookies also let us monitor how the Tockify Website and Tockify Software Application are\n        performing.\n        These cookies do not let us identify users and we combine the information which they provide us. We use this\n        information to maintain, operate and continually improve the Tockify Website and Tockify Software Application.\n      </td>\n    </tr>\n    <tr>\n      <td>Customisation</td>\n      <td>These cookies let us operate certain functions of the Tockify Website and Tockify Software Application in line\n        with the\n        choices you make. These cookies mean that when you come back to the Tockify Website or Tockify Software\n        Application we can\n        provide you with our services as you have asked for them to be provided, such as knowing your user name,\n        remembering how you have customised our services.\n      </td>\n    </tr>\n    </tbody>\n  </table>\n\n\n  <p>As above, our business partners may use their cookies on the Tockify Website and Tockify Software Application. This\n    is done to\n    provide us with information about how the Tockify Website and Tockify Software Application are used, whether they\n    are used properly,\n    how they are performing and how we can improve them.</p>\n  <p>Our business partners may also use their cookies on Tockify Website to provide you with advertising which is\n    relevant to you. This relevance is based on a profile those business partners have developed from websites you have\n    previously visited. More information is available on these profiles, the targeting of advertising and how to stop\n    the\n    use of these cookies. Please see <a href="https://www.youronlinechoices.eu">www.youronlinechoices.eu</a> if you are\n    located in Europe or\n    <a href="https://www.aboutads.info/choices">http://www.aboutads.info/choices</a> if in the United States.</p>\n  <p>As above, cookies help us let you fully use the Tockify Website and Tockify Software Application. Please note that\n    b
2y deleting\n    our cookies or disabling future cookies you may not be able fully use the Tockify Website and Tockify Software\n    Application. If you\n    want to delete any cookies on your computer, please refer to the instructions for your file management software to\n    locate the file or directory that stores cookies.</p>\n\n  <h2>Uses of Google Data</h2>\n  <p>If you opt to use our Google Calendar Sync feature we will request read only access to your Google Calendar and\n    Google Calendar Event data. This is only ever used to keep changes you make in Google Calendar and Tockify\n    synchronized and not for any other purpose.</p>\n\n  <h2>Changes to this Tockify Privacy Policy</h2>\n  <p>Tockify reserves the right to make changes to this Tockify Privacy Policy. If we make any material changes to this\n    policy we will notify you by posting the new version of the policy on the Tockify Websites. It is your own\n    responsibility to check the website for such postings from time to time.</p>\n  <p>Please note that by accepting the Tockify Terms and Conditions of Use or by using the Tockify Software Application\n    or the\n    Tockify Website, you consent to the collection and processing of your personal information as described in this\n    Tockify\n    Privacy Policy. As mentioned above, we will notify you if we make any material changes to this Tockify Privacy\n    Policy by\n    posting the new version of the policy on the Tockify Websites. Your continued use of the Tockify Software\n    Application or the Tockify\n    Website following the posting of changes to this Tockify Privacy Policy will constitute an acceptance of such\n    changes.</p>\n  <p>If you have any concerns, questions or thoughts on how we can improve our privacy policy, please let us know by\n    sending an email to [email protected].</p>\n\n  <h2>English version prevails</h2>\n  <p>In the event that this Agreement is translated into other languages and there is a discrepancy between the two\n    language versions, the English language version shall prevail to the extent that such discrepancy is the result of\n    an\n    error in translation.</p>\n\n\n  <p>Copyright &copy; 2011 - 2015 Tockify Ltd. All rights reserved.</p>\n\n  <p>Tockify Ltd, Unit 11 Hove Business Centre, Fonthill Road, Hove, East Sussex, England, BN3 6HA</p>\n\n</div>'},7393(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify Calendar</h1>\n      <h2 class="docs__header__subtitle">Terms and Conditions of Use</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions l-company container-fluid">\n\n  <h2>Tockify<sup>&copy;</sup> Terms and Conditions of Use</h2>\n  <p>Effective as from May 18 2018</p>\n\n  <p>\n    This document (the "<b>Agreement</b>") is a legally binding agreement between you and Tockify Ltd, a company\n    registered\n    in the UK under number 07611951 ("<b>Tockify</b>") that governs your use of Tockify\'s software application (the "<b>Tockify\n    Software Application</b>"), available at the Tockify Website (as defined in the <a rel="nofollow"\n                                                                                       ui-sref="docs.inter.company.privacy">Tockify\n    Privacy Policy</a>).\n  </p>\n\n  <h2>Contract Formation</h2>\n  <p>By creating a Tockify account you confirm that you are 18 years of age or more, or that you are 14 years of age or\n    more\n    and that you have received your parent\'s or guardian\'s consent to enter into this Agreement, that any registration\n    information that you submit to Tockify is true, accurate and complete, that you will update such information in\n    order to\n    keep it current, and that you agree to the terms and conditions of this Agreement and the <a rel="nofollow"\n                                                                                                 ui-sref="docs.inter.company.privacy">Tockify\n      Privacy Policy</a>. You also\n    hereby agree to termination of any previous Tockify Terms and Conditions agreed with Tockify Ltd, a company\n    registered\n    in the UK under number 07611951 ("<b>Tockify Ltd</b>") (if applicable).</p>\n\n  <h2>Changes to the Agreement</h2>\n  <p>Tockify may make changes to this Agreement at its sole discretion. Any material changes will be communicated to you\n    and\n    your acceptance of and / or continued use of the Tockify Software Application after such notification of changes to\n    this\n    Agreement will constitute your acceptance of such changes.</p>\n\n  <h2>Grant of license</h2>\n  <p>You are granted a limited, non-exclusive, revocable license to make use of the Tockify Software Application. You do\n    not\n    have a right to transfer or sublicense your rights under this Agreement. Third party components included in the\n    Tockify\n    Software Application are licensed to you either under this Agreement, or under the relevant third party component\n    license\n    terms, as applicable, and published in the help section of the Tockify Software Application.</p>\n\n  <h2>Fees and Services</h2>\n  <p> Tockify offers a\n    range of subscriptions, prepaid plans and free usage upon\n    registration. Upon registration for free usage, credit card\n    information is not required. Our all paid plans including\n    subscriptions are available on monthly pre-paid, non-refundable\n    contracts. All contracts will automatically renew for the same term\n    using the payment method on file unless the client changes or\n    discontinues the service. All service upgrades are effective\n    immediately, while downgrades are effective as of the next renewal\n    date. Tockify may change its fee structure and/or provide an\n    upgrade service at any time with notice, in which case new rates will\n    be in effect as of the next renewal period.</p>\n\n  <h2>Restrictions of use</h2>\n  <p>For the avoidance of doubt, you agree that you may not (without limitation):\n  <ul>\n    <li>copy, reproduce, make available to the public or otherwise use any part of the Tockify Software Application or\n      its\n      content in a manner not expressly permitted under this Agreement;\n    </li>\n    <li>sell or attempt to sell any invite to access the Tockify Software Application, or resell any code used to access\n      the Tockify Paid Service;\n    </li>\n    <li>provide your password to any other person or use any other person\'s user name and password;</li>\n    <li>reverse-engineer, decompile, disassemble, modify or create derivative works based on the Tockify Software\n      Application or any part thereof;\n    </li>\n    <li>obscure or disable any element of the Tockify Software Application;</li>\n    <li>embed the Tockify Software Application in a third party website using any mechanism other than the embed\n      code supplied by Tockify;\n    </li>\n    <li>circumvent any technology used by Tockify, its licensors, or any third party to protect content accessible\n      through\n      the Tockify Software Application;\n    </li>\n    <li>rent or lease any part of the Tockify Software Application</li>\n    <li>use the Tockify Software Application in a way that violates the terms of this Agreement;</li>\n    <li>circumvent any territorial restrictions applied by Tockify;</li>\n  </ul>\n\n  <p>You also acknowledge and agree that Tockify may remove or reclaim your username or calendar name at any time if\n    Tockify in its absolute discretion considers such action appropriate.</p>\n\n  <h2>Acceptable Use</h2>\n  <p>\n    Tockify does <b>not allow any</b> of the following content, or <b>links to such content</b>, to be published on the\n    Service:\n\n  <ul>\n    <li>Content of a pornographic, sexually explicit, or violent nature.</li>\n    <li>Content of an illegal nature (including stolen copyrighted material).</li>\n    <li>Content created solely or principally as part of the search engine optimization (SEO) efforts of other websites,\n      e.g. content\n      created by marketers solely to link back to their customer\'s websites\n    </li>\n    <li>Pirated software sites, including cracking programs or cracking program archives.</li>\n    <li>Content with the sole purpose of causing harm or inciting hate, or content that could be reasonably considered\n      as\n      slanderous or libelous.\n    </li>\n  </ul>\n  <p>\n    Tockify reserve the right to close or suspend accounts posting such content without warning.\n    Less severe violations will, at Tockify\'s discretion, result in a warning and\n    48 hour grace peri
2od to take any corrective actions. If no corrective actions are taken, Tockify will suspend the\n    services of\n    the member account until a resolution is met between Tockify Ltd. and the User. A repeated violation of this Policy\n    may cause\n    cancellation of service without refund of any fees.\n  </p>\n  <p>\n    In addition, Tockify does <b>not allow any</b> any of the following:\n  <ul>\n    <li>Users may not use the Tockify Software Application as a remote storage server only;</li>\n    <li>Users may not access the Tockify Software Application through automated methods. Use of robots or other computer\n      code which calls the\n      Service, except where explicitly allowed, is absolutely forbidden;\n    </li>\n    <li>Users may not upload individual files larger than 5MB. Tockify reserves the right to refuse to host any\n      downloadable file.\n    </li>\n    <li>Users may not send unsolicited messages (also known as junk mail or SPAM) to promote any website published on\n      the\n      Tockify Software Application.\n    </li>\n  </ul>\n\n  <p>Users are not permitted to knowingly allow another website or hosting server to link to content files stored on\n    Tockify\'s servers. Users deemed to be using Tockify solely as a remote storage server will have their account\n    immediately\n    terminated and will have all files associated with their account permanently removed. The final choice of whether an\n    account\n    is in violation of any of these policies is at the sole discretion of Tockify. Violation of any of these policies\n    may\n    result in tracking information being stored to identify the offending user, and permanent restriction from holding\n    an\n    account on the Service.</p>\n\n\n  <h2>Use of computational resources</h2>\n  <p>Tockify has a right to allow the Tockify Software Application to utilise the processor,\n    bandwidth and storage hardware on your computer or other relevant device for the\n    limited purpose of facilitating the communication and transmission of content and other data or features to you and\n    other\n    users of the Tockify Software Application, and to facilitate the operation of the network on which the Tockify\n    Software\n    Application runs.</p>\n\n  <h2>Customer support</h2>\n  <p>\n    If you have any questions concerning the Tockify Software Application or this Agreement, please contact Tockify\n    customer\n    service by visiting the <a rel="nofollow" ui-sref="docs.inter.company">help section</a>\n  </p>\n\n  <h2>Term and termination</h2>\n  <p>This Agreement will become effective in relation to you when you create a Tockify account or when you start using\n    the\n    Tockify Software Application and will remain effective until terminated by you or Tockify. Tockify reserves the\n    right to\n    terminate this Agreement or suspend your Tockify account at any time in case of unauthorised, or suspected\n    unauthorised use\n    of the Tockify Software Application whether in contravention of this Agreement or otherwise. If Tockify terminates\n    this\n    Agreement, or suspends your Tockify account for any of the reasons set out in this section, Tockify shall have no\n    liability\n    or responsibility to you</p>\n\n  <h2>No warranty</h2>\n  <p>In no event shall Tockify, its affiliates, officers, directors, employees, licensors or any third parties be liable\n    for\n    any direct, indirect, incidental, special or consequential damages (including but not limited to any loss of data,\n    service\n    interruption, computer failure or pecuniary loss) arising out of the use of or inability to use the Tockify Software\n    Application (including but not limited to its content), the Third Party Applications or the Third Party Application\n    Content,\n    even if you have advised Tockify about the possibility of such loss, and including any damages resulting\n    therefrom.</p>\n  <p>Your only right with respect to any problems or dissatisfaction with the Tockify Software Application, the Third\n    Party\n    Applications or the Third Party Application Content is to stop using the Tockify Software Application.</p>\n  <p>Nothing in this Agreement removes or limits Tockify\'s liability for fraudulent misrepresentation, death or personal\n    injury caused by its negligence.</p>\n\n  <h2>Indemnity</h2>\n  <p>You agree to indemnify and hold Tockify and its officers, directors, employees and licensors harmless from any\n    claim or\n    demand (including but not limited to reasonable legal fees) made by a third party due to or arising out of or\n    related to\n    your violation of the terms and conditions of this Agreement or your violation of any laws, regulations or third\n    party\n    rights.</p>\n\n  <h2>Intellectual property</h2>\n  <p>Tockify respects intellectual property rights, and expects you to do the same. Please note therefore that the\n    Tockify\n    Softw
2are Application and the content provided through it is the property of Tockify or Tockify\'s licensors and\n    protected by\n    intellectual property rights (including but not limited to copyright) and that you do not have a right to use the\n    Tockify\n    Software Application (including but not limited to its content) in any manner not covered by the Agreement.\n    Furthermore, you\n    must not infringe any third party\'s intellectual property rights in using the Tockify Software Application.</p>\n  <p>Further, you may not remove or alter any copyright, trademark or other intellectual property notices contained on\n    or\n    provided through the Tockify Software Application.</p>\n\n  <h2>Technology limitations and modifications</h2>\n  <p>Tockify will make reasonable efforts to keep the Tockify Software Application operational. However, certain\n    technical\n    difficulties or maintenance may, from time to time, result in temporary interruptions. Tockify reserves the right at\n    any\n    time and from time to time to modify or discontinue, temporarily or permanently, functions and features of the\n    Tockify\n    Software Application with or without notice</p>\n\n  <h2>Assignment by Tockify</h2>\n  <p>Tockify may assign this Agreement or any part of it without restrictions. You may not assign this Agreement or any\n    part\n    of it to any third party.</p>\n\n  <h2>Privacy</h2>\n  <p>In the course of your use of the Tockify Software Application we may collect your <b>"Personal Data"</b> and other\n    Content. We\n    understand that you are trusting us to protect this personal data and to use it only for the purposes for which\n    it has been given. Our Privacy Policy explains in detail what data we collect and how it is used.\n  </p>\n  <p>\n    Customers using features of the Tockify Software Application to act as “data controllers” as defined in\n    the European General Data Protection Regulation 2016/679 ("GDPR") will find details of their obligations and other\n    relevant information in our Privacy Policy.\n  </p>\n\n  <h2>Entire Agreement</h2>\n  <p>This Agreement together with the Tockify Privacy Policy, (the "<b>Agreements</b>") constitutes all the terms and\n    conditions\n    agreed upon between you and Tockify and supersede any prior agreements in relation to the subject matter of these\n    Agreements, whether written or oral. Any additional or different terms or conditions in relation to the subject\n    matter of\n    these Agreements in any written or oral communication from you to Tockify are void. You agree and accept that you\n    have not\n    accepted the terms and conditions of this Agreement in reliance of or to any oral or written representations made by\n    Tockify\n    not contained in this Agreement.</p>\n\n  <h2>Severability</h2>\n  <p>Should for any reason or to any extent any provision of this Agreement be held invalid or unenforceable, such\n    invalidity or enforceability shall not in any manner affect or render invalid or unenforceable the remaining\n    provisions of\n    this Agreement and the application of that provision shall be enforced to the extent permitted by law.</p>\n\n  <h2>Governing law and disputes</h2>\n  <p>This Agreement shall be governed and construed in accordance with the laws of the UK</p>\n\n  <h2>English version prevails</h2>\n  <p>In the event that this Agreement is translated into other languages and there is a discrepancy between the two\n    language\n    versions, the English language version shall prevail to the extent that such discrepancy is the result of an error\n    in\n    translation.</p>\n\n\n  <p>Copyright &copy; 2011 - 2024 Tockify Ltd. All rights reserved.</p>\n\n  <p>Tockify Ltd, Unit 11 Hove Business Centre, Fonthill Road, Hove, East Sussex, England, BN3 6HA</p>\n\n\n</div>'},6016(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Subscription Questions</h1>\n      <h2 class="docs__header__subtitle">Frequently asked questions about Tockify Subscriptions</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Tockify Accounts and Subscriptions</h3>\n\n  <div ng-if="!isDudaUser" class="alert alert-danger" role="alert">\n    <p>This page describes the Duda App version of Tockify so it does not apply to you (or you are not logged in).</p>\n    <p>Please visit the standard <a ui-sref="docs.inter.faq.subscription"> Subscriptions FAQ</a> instead.</p>\n  </div>\n\n  <ul class="docs__list-with-titles docs__list-with-titles--numbered">\n    <li>\n      <h4 class="l-title">How can I get an account?</h4>\n      <div class="l-body">\n        <p>\n          You can sign up for a trial or subscribe to a paid plan\n          <a target="_blank" ui-sref="siteform.trialPlanPicker">by clicking here</a>.\n        </p>\n        <p>Details of the different plans are on the same page.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">How much do Tockify calendars cost?</h4>\n\n      <div class="l-body">\n        <p>For full pricing details <a target="_blank" ui-sref="siteform.trialPlanPicker">click here.</a></p>\n        <p>We charge per calendar so 2 calendars costs twice as much as 1 etc.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">What happens when the trial ends?</h4>\n      <div class="l-body">\n        <p>If you decide not to subscribe then when your trial ends your account will automatically\n          switch over to the free version. All of your events will still be there. Only the subscription\n          features will be removed.</p>\n        <p>The free plan only includes 1 online calendar per account so if you created multiple calendars\n          only one of them will be visible to other people.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">How do I cancel my subscription</h4>\n      <div class="l-body">\n        <p>Once you have a subscription you can cancel it at any time by clicking on the\n          blue change plan button on the\n          <a ui-sref="settings.subscriptions">subscription management page</a> and then\n          clicking where it says <em>click here to cancel your subscription</em>.</p>\n        <p>We make it easy to cancel and will never put any obstacles in your way.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Is there a minimum contract period</h4>\n      <div class="l-body">\n        <p>No. You are only committed for the current billing period.</p>\n        <p>So if you have a monthly\n          plan you are only committed for the month that you have already paid for and can cancel any time\n          before we take payment for the next month.</p>\n        <p>Similarly if you have an annual\n          plan you are only committed for the year that you have already paid for and can cancel any time\n          before we take payment for the next year. We will send you a reminder 2 weeks before your\n          annual payment is due.</p>\n\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Do you have charity/non-profit rates?</h4>\n      <div class="l-body">\n        <p>There\'s no standard rate for non profits because they vary so much but we\n          try to help out where we think there\'s a worthy cause and real need.</p>\n        <p>Contact <a href="mailto:[email protected]?subject=non%20profit%20question">
2Tockify Support</a> for more\n          details. Please include a description of your organization and a link to your website in the email.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Are there any alternatives to Credit/Debit card based payment?</h4>\n      <div class="l-body">\n        <p>If you are unable to pay by credit card due to the processes used by your organization or for\n          other reasons and can pay annually then we can invoice you and let you pay by bank transfer.</p>\n        <p>If you\'d like to pay this way please contact\n          <a href="mailto:[email protected]?subject=payment%20method%20question">Tockify Support</a>\n          and they\'ll ask you for the details we need for the invoice.\n        </p>\n        <p>We are a UK based company and some banks charge fees for international transfers. Paying these fees is your\n          responsibility. We can\'t absorb them for you.</p>\n        <p>We don\'t support payment using PayPal at the moment.</p>\n      </div>\n    </li>\n\n  </ul>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},6379(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">General Questions</h1>\n      <h2 class="docs__header__subtitle">Frequently asked questions about our calendar and company</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">General FAQ</h3>\n\n  <ul class="docs__list-with-titles docs__list-with-titles--numbered">\n    <li>\n      <h4 class="l-title">What is Tockify </h4>\n      <div class="l-body">Tockify is an online calendar designed with an emphasis on good looks and ease of use.\n        It can be customized extensively to blend seamlessly into your site.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Who is using Tockify</h4>\n      <div class="l-body">Tockify Calendars are in use on thousands of websites around the world. Our customers include\n        museums, theatres and other venues, tv and radio stations, community sites, schools and univerities, churches\n        and other places of worship, doctors, gyms, and countless others.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">How long has Tockify been around</h4>\n      <div class="l-body">We were founded in 2011 by <a href="http://www.robertdunne.com" target="_blank">Robert\n        Dunne</a>.\n        Our first calendar was released in 2012.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Which browsers are supported</h4>\n      <div class="l-body">We support all modern browsers, i.e. Chrome, Firefox, Safari, Edge and other browsers based on\n        the same technology. As long as you\'re using one of those browsers and have updated it during the last 2 years\n        Tockify will work. We dropped support for Internet Explorer in August 2024 when it dropped below 0.02% of our visitors.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Does Tockify work with mobile phones and tablets</h4>\n      <div class="l-body">\n        Our calendar looks good and works well on mobile phones. Our event creation tools are\n        currently desktop only, but that will be changing soon.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Is Tockify Calendar free</h4>\n      <div class="l-body">\n        There are free and subscription versions. The free version gives you an attractive calendar that you\n        can embed on your website. The subscription versions let you design a custom theme, sync with a Google\n        calendar and use lots of other extras. Follow the plans link at the top of our homepage to compare.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">How can I change my calendar\'s visual theme</h4>\n      <div class="l-body">\n        Our <a ui-sref="customizer.main">customization tool</a> gives you detailed control over the way your calendar\n        looks.\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Is my data backed up safely?</h4>\n      <div class="l-body">\n        We make a live copy of all changes as they happen and take a full back up every hour. This is stored\n        in Amazon S3, a global network backed up to multiple locations. We also copy a full backup to another external\n        system once each week.\n      </div>\n    </li>\n    \x3c!--<li>--\x3e\n    \x3c!--<h4 class="l-title"></h4>--\x3e\n    \x3c!--<div class="l-body">We\'re sorry to see anyone leave but we\'re not the kind--\x3e\n    \x3c!--of company that--\x3e\n    \x3c!--If you want to leave we\'ll give you a full copy of all of--\x3e\n    \x3c!--your data in format that other calendar programs can use. There is no standard way to move images or--\x3e\n    \x3c!--tags/categories between calendars so unfortunately we can\'t give you an easy way to move those.--\x3e\n    \x3c!--</div>--\x3e\n    \x3c!--</li>--\x3e\n\n    <li>\n      <h4 class="l-title">Can I hire Tockify to do custom calendar work or other consulting</h4>\n      <div class="l-body">Maybe. We prefer calendar centric engagements but will consider other projects\n        if they are interesting and help supp
2ort us while we grow.\n        <a href="mailto:[email protected]?subject=calendar%20consultancy">[email protected]</a> is the place to\n        start.\n      </div>\n    </li>\n\n  </ul>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},9527(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Questions and Answers</h1>\n      <h2 class="docs__header__subtitle">Frequently asked questions with answers</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Get answers to common questions</h3>\n\n  <p>\n    We\'ve gathered answers to some frequently asked questions into the following sections:\n  </p>\n\n  <ul class="docs__list-with-titles">\n    <li>\n      <h4 class="l-title">General Questions</h4>\n      <div class="l-body"> Frequently asked questions about Tockify\'s product and company\n        <a ui-sref="docs.inter.faq.general">go to the general questions</a></div>\n    </li>\n    <li>\n      <h4 class="l-title">Technical Questions</h4>\n      <div class="l-body"> Frequently asked questions about installing and customizing Tockify and about the technology\n        we use\n        to create and maintain the service. <a ui-sref="docs.inter.faq.technical">go to the technical questions</a>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Subscription Questions</h4>\n      <div class="l-body"> Frequently asked questions about Tockify subscriptions, payment etc.\n        <a ui-sref="docs.inter.faq.subscription">go to the subscription questions</a></div>\n    </li>\n  </ul>\n\n  <p>Can\'t find what you need? Contact us at <a\n      href="mailto:[email protected]?subject=faq%20question">[email protected]</a> -\n    we\'re usually quick to respond.\n  </p>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},7996(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Subscription Questions</h1>\n      <h2 class="docs__header__subtitle">Frequently asked questions about Tockify Subscriptions</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Tockify Accounts and Subscriptions</h3>\n\n  <div ng-if="isDudaUser" class="alert alert-danger" role="alert">\n    <p>You installed Tockify via your platform\'s App Store so this page does not apply to you.</p>\n    <p>Please refer to your App Store subscription conditions instead.</p>\n  </div>\n\n  <ul class="docs__list-with-titles docs__list-with-titles--numbered">\n    <li>\n      <h4 class="l-title">How can I get an account?</h4>\n      <div class="l-body">\n        <p>\n          You can sign up for a trial or subscribe to a paid plan\n          <a target="_blank" ui-sref="siteform.trialPlanPicker">by clicking here</a>.\n        </p>\n        <p>Details of the different plans are on the same page.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">How much do Tockify calendars cost?</h4>\n\n      <div class="l-body">\n        <p>For full pricing details <a target="_blank" ui-sref="siteform.trialPlanPicker">click here.</a></p>\n        <p>We charge per calendar so 2 calendars costs twice as much as 1 etc.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">What happens when the trial ends?</h4>\n      <div class="l-body">\n        <p>If you decide not to subscribe then when your trial ends your account will automatically\n          switch over to the free version. All of your events will still be there. Only the subscription\n          features will be removed.</p>\n        <p>The free plan only includes 1 online calendar per account so if you created multiple calendars\n          only one of them will be visible to other people.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">How do I cancel my subscription</h4>\n      <div class="l-body">\n        <p>Once you have a subscription you can cancel it at any time by clicking on the\n          blue change plan button on the\n          <a ui-sref="settings.subscriptions">subscription management page</a> and then\n          clicking where it says <em>click here to cancel your subscription</em>.</p>\n        <p>We make it easy to cancel and will never put any obstacles in your way.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Is there a minimum contract period</h4>\n      <div class="l-body">\n        <p>No. You are only committed for the current billing period.</p>\n        <p>So if you have a monthly\n          plan you are only committed for the month that you have already paid for and can cancel any time\n          before we take payment for the next month.</p>\n        <p>Similarly if you have an annual\n          plan you are only committed for the year that you have already paid for and can cancel any time\n          before we take payment for the next year. We will send you a reminder 2 weeks before your\n          annual payment is due.</p>\n\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Do you have charity/non-profit rates?</h4>\n      <div class="l-body">\n        <p>There\'s no standard rate for non profits because they vary so much but we\n          try to help out where we think there\'s a worthy cause and real need.</p>\n        <p>Contact <a href="mailto:[email protected]?subject=non%20profit%20question">
2Tockify Support</a> for more\n          details. Please include a description of your organization and a link to your website in the email.</p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Are there any alternatives to Credit/Debit card based payment?</h4>\n      <div class="l-body">\n        <p>If you are unable to pay by credit card due to the processes used by your organization or for\n          other reasons and can pay annually then we can invoice you and let you pay by bank transfer.</p>\n        <p>If you\'d like to pay this way please contact\n          <a href="mailto:[email protected]?subject=payment%20method%20question">Tockify Support</a>\n          and they\'ll ask you for the details we need for the invoice.\n        </p>\n        <p>We are a UK based company and some banks charge fees for international transfers. Paying these fees is your\n          responsibility. We can\'t absorb them for you.</p>\n        <p>We don\'t support payment using PayPal at the moment.</p>\n      </div>\n    </li>\n\n  </ul>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},9942(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Technical Questions</h1>\n      <h2 class="docs__header__subtitle">Frequently asked technical questions</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Technical FAQ</h3>\n\n  <ul class="docs__list-with-titles docs__list-with-titles--numbered">\n    <li>\n      <h4 class="l-title">Can I include the Tockify embed script in the concatinated/minified\n        script for my site?</h4>\n      <div class="l-body">\n        <p>\n          No. The embed script is updated over time to fix problems and add enhancements,\n          so it needs to be downloaded from us each time you use it rather than concatenated/minified with\n          other Javascript that you use.\n        </p>\n      </div>\n    </li>\n    <li>\n      <h4 class="l-title">Where does the embed script go?</h4>\n      <div class="l-body">\n        <p>\n          The embed script consists of a <code>&lt;div&gt</code> tag and a <code>&lt;script&gt;</code> tag.\n          The <code>&lt;div&gt</code> defines where the calendar will go - the <code>&lt;script&gt;</code> is\n          just there for convenience - you could put it in the <code>&lt;head></code> section if you prefer.\n        </p>\n      </div>\n    </li>\n    <li id="#restricting-size">\n      <h4 class="l-title">How can I limit the calendar\'s size?</h4>\n      <div class="l-body">\n        <p>\n          By default the calendar will fill 100% of the available width and its height will vary\n          depending on how many events are being shown.\n        </p>\n        <p>It\'s designed for modern websites where content underneath the calendar is able to\n          move down as the calendar grows. By varying its height we\'re able to avoid showing an unsightly\n          scroll bar and make the calendar look like it truly belongs on your site.</p>\n        <p>Some visual website builder tools fix the position of everything on the page exactly. For sites built\n          this way the calendar can overlap with other parts of the page as its height changes causing problems.</p>\n        <p>In these cases you can limit the calendar\'s height using our <a ui-sref="docs.inter.api.embed">Embedding\n          API</a>.\n          This is usually a bad idea so you should only do it if you have to.</p>\n        <p>Here\'s an example embed code modified to limit the height to 600 pixels: </p>\n        <pre><code class="language-markup" prism>\n&lt;div data-tockify-calendar=&quot;spirited&quot; data-tockify-component=&quot;calendar&quot;\n  data-tockify-height=&quot;600px&quot; >&lt;/div&gt;\n&lt;script data-cfasync=&quot;false&quot; data-tockify-script=&quot;embed&quot;\nsrc=&quot;https://public.tockify.com/browser/embed.js&quot;&gt;&lt;/script&gt;\n               </code></pre>\n\n        <p>This example will limit the calendar\'s height to 600 pixels and create a scrollbar if it gets\n          any longer.</p>\n      </div>\n    </li>\n  </ul>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},7444(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Adding More Calendars</h1>\n      <h2 class="docs__header__subtitle">Creating And Working With Multiple Calendars.</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <div class="docs__instructions__subscription">\n    <span class="label label-siteform label-siteform--light">Subscription Feature</span>\n  </div>\n  <h3 class="docs__section__header">Adding more calendars to your account</h3>\n\n  <p>You can add or remove calendars from your account on the <a ui-sref="settings.calendars">Calendar Settings</a>\n    page.\n    Bear in mind that we charge per calendar and you may need to upgrade your account before this will work.\n  </p>\n\n  <p>If you created multiple Tockify accounts before we supported multiple calendars per account\n    and would now like to move all of your calendars into a single account please contact\n    <a href="mailto:[email protected]?subject=merge%20accounts">[email protected]</a> and they\'ll organize that for\n    you.\n    This feature is only available to people with paid subscriptions.\n    Bear in mind that we charge per calendar and you may 
2need to upgrade your account before this will work.\n  </p>\n\n\n</div>'},2447(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Calendar Customization Guide</h1>\n      <h2 class="docs__header__subtitle">How To Customize Your Calendar</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <div class="docs__instructions__subscription">\n    <span class="label label-siteform label-siteform--light">Subscription Feature</span>\n  </div>\n  <h3 class="docs__section__header">Customization instructions and tips</h3>\n\n  <p>Our <a ui-sref="customizer.main">Customization Tool</a> lets you configure the fonts colors and layout\n    details of your calendar.</p>\n\n  <p>The tool is very flexible and can be used to make your calendar match your site\'s style exactly.\n    People have created widely varying themes for all kinds of sites.</p>\n\n  <p>You don\'t have to update your embed code when you change the theme. The changes will be applied\n    automatically.</p>\n\n  <h4 class="l-title">Tags and tag based colors</h4>\n\n  <p>There are several ways you can use colors in Tockify styles.\n    In all cases the color comes from the <i>first tag</i> for the event.</p>\n\n  <h4 class="l-subtitle">1) Tag basics</h4>\n\n  <p>To use tag based colors you must first set up the allowed tags. You can do that in the\n    editor for any event or\n    <a ui-sref="customizer.anonmain({tab:\'style\',sub:\'tag\'})">here in the calendar customizer</a>.</p>\n\n  <p>\n    After you\'ve set up allowed tags you\'ll see them in a list under <b>Per Tag Colors</b> and you can\n    set their colors there.\n  </p>\n\n  <p>\n    On the same page there are options that control how tags are displayed and whether or not links,\n    including titles, should use the event colors.\n  </p>\n\n  <h4 class="l-subtitle">2) Agenda layout specific use of colors </h4>\n\n  <p>\n    In the layout section of the agenda tab of the\n    <a ui-sref="customizer.anonmain({tab:\'agenda\',sub:\'layout\'})">calendar customizer</a>\n    there\'s an option labelled <b>Show tag bar</b>.\n    If you enable that a tag colored bar will appear on the left side of the event.\n  </p>\n  <p>\n    In the colors and styles section of the agenda tab of the\n    <a ui-sref="customizer.anonmain({tab:\'agenda\',sub:\'layout\'})">calendar customizer</a> there\'s an option\n    labelled <b>Image Outline</b>. If you enable that a colored border will appear around the event\'s image.\n  </p>\n\n  <h4 class="l-subtitle">3) Monthly Layout specific use of colors </h4>\n\n  <p>\n    The text and background of events in the monthly view is based on the event\'s first tag color.\n    If you want more control than that you can fine tune it in the month view specific\n    <a ui-sref="customizer.anonmain({tab:\'monthly\',sub:\'tags\'})">tag colors section</a>.\n  </p>\n\n  <h4 class="l-subtitle">4) Mini Calendar specific use of colors </h4>\n\n  <p>\n    On the agenda tab of the\n    <a ui-sref="customizer.anonupcoming({tab:\'agenda\'})">mini-calendar customizer tool</a>: there are options\n    labelled <b>Use tag colors in titles</b> and <b>Show tag bar</b>\n    that work in a similar way to the options described above.\n  </p>\n\n\n</div>\n'},6406(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Google Calendar Sync</h1>\n      <h2 class="docs__header__subtitle">Synchronizing with a Google Calendar</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <div class="docs__instructions__subscription">\n    <span class="label label-siteform label-siteform--light">Subscription Feature</span>\n  </div>\n  <h3 class="docs__section__header">How it works</h3>\n\n  <p>You can create a new Tockify Calendar that\'s synchronized with one of your Google Calendars on the\n    <a ui-sref="settings.calendars">Calendar Settings</a> page.\n  </p>\n\n  <p>\n    Pressing the "Sync with a Google Calendar" button will begin the process by asking you to give us permission\n    to read your Google Calendar and Event details so that we can keep them in sync.\n  </p>\n  <p>\n    After that we\'ll show your Google calendars in a list so that you can pick one with and then create a new Tockify\n    Calendar that stays in sync with it.\n  </p>\n  <p>As well as showing the details in your Google calendar you can use Tockify to add images, tags, RSVPs and more to each event.</p>\n\n\n</div>'},2556(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">How To Guides</h1>\n      <h2 class="docs__header__subtitle">A collection of helpful guides to using Tockify features</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">How To Guides</h3>\n\n  <p>\n    We\'ve written how to guides that show you how to use and make the most of Tockify\'s features.\n    If you want a guide to something that isn\'t listed below let us know and we might add one.\n  </p>\n  <ul>\n    <li><b>User Submitted Events</b> How to enable and use Tockify\'s\n      <a ui-sref="docs.inter.howto.usersubmit">User Submitted Events</a> feature so that you can accept\n      event submissions from your community\n    </li>\n    <li><b>Add More Calendars</b> Tockify lets you have multiple calendars per account. To learn how to do this\n      take a look at our <a ui-sref="docs.inter.howto.addcalendars">Adding Calendars Guide</a></li>\n    <li><b>White Label Calendars</b> When you have a white label calendar you can use your own domain for event\n      links instead of tockify.com. Learn how to set this up with the Tockify\n      <a ui-sref="docs.inter.howto.whitelabel">White Label Guide</a></li>\n    <li><b>Calendar Customization</b> Tockify calendars are very customizable. Find out how to customize\n      your calendar and get some tips about how to make it look good in our\n      <a ui-sref="docs.inter.howto.customize">Calendar Customization Guide</a></li>\n    <li><b>The Tag Picker</b> Learn how to set up managed tags so your visitors can filter events\n      by tag using the built-in <a ui-sref="docs.inter.howto.tagpicker">Tag Picker</a></li>\n  </ul>\n\n</div>\n\n\n\n\n\n\n\n\n\n'},2058(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">The Tag Picker</h1>\n      <h2 class="docs__header__subtitle">Help Your Visitors Find Events By Tag</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <div class="docs__instructions__subscription">\n    <span class="label label-siteform label-siteform--light">Subscription Feature</span>\n  </div>\n\n  <h3 class="docs__section__header">What Is The Tag Picker?</h3>\n\n  <p>The tag picker is a dropdown that lets your calendar visitors filter events by tag.\n    Once you\'ve set up managed tags, it appears in the search area of your calendar,\n    giving visitors a quick way to find relevant events.</p>\n\n  <h3 class="docs__section__header" style="margin-top:2em">What Visitors See</h3>\n\n  <p>When a visitor opens the search area, the tag picker displays your managed tags as\n    clickable pills. Visitors can select one or more tags and choose how to combine them:</p>\n\n  <ul>\n    <li><b>Match All</b> — only show events that have every selected tag</li>\n    <li><b>Match Any</b> — show events that have at least one of the selected tags</li>\n  </ul>\n\n  <p><img src="/assets/docs/tagpicker-visitor.png" alt="Tag picker dropdown showing tag pills in the search area" style="max-width:100%;height:auto"></p>\n\n  <h3 class="docs__section__header" style="margin-top:2em">How To Enable The Tag Picker</h3>\n\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        In the <a ui-sref="customizer.anonmain({tab:\'navbar\'})">Navbar section</a> of the customizer,\n        check that the <b>Tag Picker</b> option is set to <b>Show When Searching</b> (this is the default).\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Open any event in the event editor.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Find the <b>Tags / Categories</b> section.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Click <b>Manage Tags</b> to open the tag manager.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Add the tags you want visitors to filter by. Type a name and press Enter to add each one.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Save your changes. The tag picker will now appear on your calendar.\n      </div>\n    </li>\n  </ol>\n\n  <h3 class="docs__section__header" style="margin-top:2em">Managing Your Tags</h3>\n\n  <p>You can add, remove, and reorder managed tags at any time through the tag manager\n    in the event editor, or from\n    the <a ui-sref="customizer.anonmain({tab:\'style\',sub:\'tag\'})">Style &gt; Tag section</a> of the customizer.</p>\n\n  <p>Each tag can have its own color, which you set in\n    the <a ui-sref="customizer.anonmain({tab:\'style\',sub:\'tag\'})">tag settings in the customizer</a>.\n    These colors are used for tag bars, event backgrounds, and other tag-colored elements.\n    See the <a ui-sref="docs.inter.howto.customize">Calendar Customization Guide</a> for more on tag colors.</p>\n\n  <h3 class="docs__section__header" style="margin-top:2em">Disabling The Tag Picker</h3>\n\n  <p>To hide the tag picker, go to\n    the <a ui-sref="customizer.anonmain({tab:\'navbar\'})">Navbar section</a> of the customizer\n    and set the <b>Tag Picker</b> option to <b>None</b>.\n    Your tags and tag colors will continue to work for styling events —\n    only the visitor-facing picker will be hidden.</p>\n\n</div>\n'},3841(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">User Submitted Events Guide</h1>\n      <h2 class="docs__header__subtitle">How To Accept Events Submitted By Your Community</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <div class="docs__instructions__subscription">\n    <span class="label label-siteform label-siteform--light">Subscription Feature</span>\n  </div>\n\n  <h3 class="docs__section__header">Accepting and Approving User Submitted Events</h3>\n\n  <p>You can accept events submitted to your calendar by third parties either by adding submit events\n    button to the calendar itself of by putting a link to your calendar\'s event submission form somewhere else.</p>\n\n  <p>Here\'s how to get started:</p>\n\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Go to the <a ui-sref="settings.calendars">Calendar Settings</a> page and click on the calendar you want to\n        accept submitted events for.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        On the left hand panel you\'ll see the calendar\'s name and below it a menu item called <b>User Submitted\n        Events</b>.\n        Click on this to open the user submitted events settings.\n      </div>\n    </li>\n    <li>\n      <span class="l-number"></span>\n      <div class="l-instruction">\n        If you want to show a <b>submit event</b> button on your calendar select that option and press save.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        If you want to put a submit event link somewhere else you can use the shareable event submission link\n        shown on the same page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That’s all. You are now ready to accept events.</div>\n    </li>\n  </ol>\n\n  <p>Whenever somebody submits and event we\'ll send you an email notification. If you click on it you\'ll be taken to a\n    page\n    where you can approve or reject the event. Approved events will appear in your calendar. Rejected ones will be\n    deleted.</p>\n\n  <p>Whenever there are events waiting to be approved you\'ll see an indicator at the top of the event editor page\n    showing\n    how many. If you click on it you\'ll be taken to the event approval page.</p>\n\n  <h3>Private event submissions</h3>\n\n  <p>If you only want to accept event submissions from a pre-approved group make sure the event\n    submission button on your calendar is turned off and keep the shareable event submission link private.\n    (it is unguessable).</p>\n  <p>Then put the shareable event submission link in a password protected area of your site or email\n    it to people you want to accept event submissions from.</p>\n  <p>Alternatively, you could check <b>Require password to submit events</b>,\n    to require that submitters enter the password you set before they can submit events.</p>\n\n</div>\n'},3287(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">White Label Guide</h1>\n      <h2 class="docs__header__subtitle">How To Set Up A White Label Calendar</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <div class="docs__instructions__subscription">\n    <span class="label label-siteform label-siteform--light">Subscription Feature</span>\n  </div>\n  <h3 class="docs__section__header">White Label Calendars</h3>\n\n  <p>To get started with a white label calendar all you need to do is sign up for a white label account.\n    This will remove all of our branding from your calendar.</p>\n\n  <p>Once you have a white label calendar you can optionally change the URL of your calendar so that event links include\n    your domain name, e.g. <b>mycompany.com</b> rather than ours <b>tockify.com</b>. A few extra steps\n    are needed to get this working. We\'ll describe these below.</p>\n\n  <p>Using your own domain for event links involves changing your site\'s DNS records. We can\'t do this automatically\n    because only site owners have access to these records. If you have a site admin they will understand the\n    instructions below.\n    If not and you are having trouble contact <a\n        href="mailto:[email protected]?subject=white%20label%20question">[email protected]</a> for help.</p>\n\n  <p>\n    <span class="label label-danger">Warning</span> Don\'t</span> try to set up your white label domain using an HTTP\n    redirect,\n    especially not a <i>permanent</i> (HTTP 301) redirect. Doing so could affect your ability to set up a white label\n    domain for the redirected domain in the future.\n  </p>\n\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Pick a subdomain on your site as the base URL for your calendar.\n        For example, you could use <b>calendar.mycompany.com</b> or <b>events.mycompany.com</b>.\n        Note that this has to be a subdomain not a directory so there can’t be any forward slashes in the name.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Go the the <a ui-sref="settings.calendars">Calendar Settings</a> and add the name you\'ve picked to your\n        calendar.\n      </div>\n    </li>\n    <li>\n      <span class="l-number"></span>\n      <div class="l-instruction">\n        Ask your site administrator to set up a DNS CNAME alias so that requests to the\n        subdomain you’ve picked get sent to your calendar’s CNAME: <b>your-calendars-short-name.tockify.com</b>\n        (Here <b>your-calendars-short-name</b> should be replaced with the actual short name of your calendar. You can\n        find this\n        in the <a ui-sref="settings.calendars">Calendar Settings</a> if you don\'t know it)\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction"> (Optional) Send a copy of the favicon you’d like to associate with the calendar\n        (the image that appears on its browser tab) to <a\n            href="mailto:[email protected]?subject=white%20label%20favicon">[email protected]</a></div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That’s all. Once that’s in place it will take about 24 hours for your calendar\n        to switch over to the new name.\n      </div>\n    </li>\n\n  </ol>\n\n</div>'},6712(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tockify Documentation</h1>\n      <h2 class="docs__header__subtitle">Installation, configuration and more</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Tockify Calendar Documentation</h3>\n\n  <p>\n    This is the main documentation page for Tockify calendar.\n  </p>\n  <p>\n    We do all we can to make using Tockify intuitive, but also appreciate the\n    need for well written up to date documentation so that\'s what we\'re trying to provide here.\n  </p>\n\n  <p>\n    Pick the area you\'re interested in from the menu on the left to get started.\n  </p>\n\n  <p>If you can\'t find what you need or have any questions just contact us at <a\n      href="mailto:[email protected]?subject=documentation%20question">[email protected]</a> -\n    we\'re usually quick to respond.\n  </p>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},1735(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Install Tockify Anywhere</h1>\n      <h2 class="docs__header__subtitle">Generic install instructions for any website</h2>\n    </div>\n    \x3c!--<div class="homepage__top__buttons">--\x3e\n    \x3c!--<a type="button" class="btn btn-white-hollow btn-lg siteform__buttons__left" ui-sref="siteform.register">--\x3e\n    \x3c!--Get Started With A Free Calendar--\x3e\n    \x3c!--</a>--\x3e\n    \x3c!--<a class="not-button" ui-sref="siteform.login">sign in</a>--\x3e\n    \x3c!--</div>--\x3e\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Don\'t worry, this is going to be easy.</h3>\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">These are generic instructions designed to work anywhere. Before\n        you start <a ui-sref="docs.inter.install">check</a> that we don\'t have more specific instructions\n        for your platform.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Next make sure you have the embed code for your calendar handy.\n        If not you can get one from the <a ui-sref="customizer.main({calname:\'\'})">Customizer Tool</a>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Open your website editor tool on the page\n        you\'d like to add your Tockify calendar to.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Make sure that you are editing the HTML itself, not a visual\n        representation of your page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Insert the Tockify embed code from (2) above into the HTML wherever you want the calendar to appear.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Save and view your page. You should now be able to see your Tockify calendar on the page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all.\n      </div>\n    </li>\n\n  </ol>\n</div>'},4406(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Duda</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a Duda Site</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">It\'s easy. Just use our Duda App!</h3>\n\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Sign in to Duda then go to the site editor.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Click the <b>App Store</b> icon on the left and search for <b>Tockify</b>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Click the <b>Install</b> button and you\'ll be guided through a simple install\n        process.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">After you\'ve finished, click on the <b>Widgets</b> icon on the left and search\n        for <b>Tockify</b>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Then drag the <b>Tockify Calendar</b> widget onto any page you want to see a calendar\n        on.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all, but if you have any questions you can reach us at\n        <a href="mailto:[email protected]?subject=Duda%20App%20Question">[email protected]</a>.\n      </div>\n    </li>\n  </ol>\n\n</div>\n'},2604(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Installing Tockify</h1>\n      <h2 class="docs__header__subtitle">How to add a calendar to your website</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Tockify can be installed on any website</h3>\n\n  <p>\n    Tockify can be installed on any website<sup>*</sup>. We provide detailed install instructions and plugins\n    for some of the more popular website creation tools and platforms, as well as more generic instructions that\n    work everywhere else.\n  </p>\n  <ul>\n    <li><b>Wordpress</b> We provide a <a ui-sref="docs.inter.install.wordpress">Wordpress Plugin</a> that makes it easy\n      to\n      add Tockify to your Wordpress site.\n    </li>\n    <li><b>SquareSpace</b> We provide <a ui-sref="docs.inter.install.squarespace">detailed instructions</a> that will\n      take you though\n      the simple steps needed to add Tockify to your SquareSpace site\n    </li>\n    <li><b>Adobe Muse</b> We provide a <a ui-sref="docs.inter.install.muse">Muse Widget</a> that makes it easy to\n      add Tockify to your Muse site.\n    </li>\n    <li><b>Weebly</b> We\'re in the <a href="https://www.weebly.com/app-center/tockify-calendar">Weebly App Center</a>.\n      Here are <a ui-sref="docs.inter.install.weebly">detailed instructions</a>\n      that will take you though the simple steps needed to add Tockify to your Weebly site\n    </li>\n    <li><b>Tumblr</b> We provide <a ui-sref="docs.inter.install.tumblr">detailed instructions</a> that will tke you\n      though\n      the simple steps needed to add Tockify to your Tumblr site\n    </li>\n    <li><b>Wix</b> We provide <a ui-sref="docs.inter.install.wix">detailed instructions</a> that will\n      take you though\n      the simple steps needed to add Tockify to your Wix site\n    </li>\n    <li><b>Everywhere else</b> Don\'t worry if your preferred website builder isn\'t mentioned here, you really can\n      install\n      Tockify on just about any site. Here are some <a ui-sref="docs.inter.install.anywhere">install instructions</a>\n      that will\n      work anywhere.\n    </li>\n  </ul>\n\n  <div class="l-footnote">* Some website hosting companies actively block third party add-ons like Tockify Calendar.\n    This is quite unusual, but in in those cases there\'s nothing we can do.\n  </div>\n</div>\n\n\n\n\n\n\n\n\n\n'},6120(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Adobe Muse</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a website using Muse</h2>\n    </div>\n\n  </div>\n\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Installing The Tockify Muse Widget</h3>\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Before you start you\'ll need to install the Tockify Muse widget library that we provide\n        to make it\n        easy to add your Tockify calendar to Adobe Muse.\n        You can <a download="TockifyMuseLibrary.mulib" ng-href="{{museLibraryLink}}" target="_self">Download the widget\n          library here</a>\n        or get it from the Adobe Muse Widgets directory.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Start Adobe Muse and make sure you are in design\n        mode by checking that the word <b>Design</b> in the top right of Adobe Muse is selected. Click on it if not.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Click on the <b>Window</b>\n        menu at the top of Muse and then select <b>Library</b> from the list of options that appears.\n        The Muse library panel will now appear.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Click on the <b>Import Muse Library</b> icon at the bottom of the library panel (it\'s\n        next to the question mark and looks like an arrow pointing at some books). A file selection dialog will now\n        appear.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Choose the Tockify Muse Widget Library you downloaded in (1) above -\n        the file is called <b>TockifyMuseLibrary.mulib</b>. A new entry called <b>Tockify</b> will now appear in the\n        Library panel.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all. The Tockify Muse widget library is now installed and\n        you can use it to add your calendar to Adobe Muse.\n      </div>\n    </li>\n  </ol>\n\n\n  <h3 class="docs__section__header">Adding A Tockify Calendar To Adobe Muse</h3>\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Before you start make sure you have the Tockify Muse widget library installed in Adobe\n        Muse\n        as described above.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Start Adobe Muse and open the page you want to add the calendar to. Make sure you are\n        in design\n        mode by checking that the word <b>Design</b> in the top right of Adobe Muse is selected. Click on it if not.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Click on the <b>Window</b>\n        menu at the top of Muse and then select <b>Library</b> from the list of options that appears.\n        The Muse library panel will now appear.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        In the library panel there should be a folder called <b>Tockify</b>. Click to open it and you\'ll see an\n        item called <b>Calendar</b>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Drag the item called <b>Calendar</b> to your page. A panel will appear with a notice\n        telling you how to preview the calendar.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction"> Position and adjust the width of this panel so that it\'s where you want your calendar\n        to be. Don\'t\n        worry about the height, that will change automatically to make the calendar fit.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">In the top right hand corner of this panel there will be a small blue circle with a\n        white arrow\n        in it. Click on this to open the Tockify calendar settings.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        <p ng-if="calmetas.length === 0">In the calendar settings replace the word <b>spirited</b> with your calendar\'s\n          short name\n          (you can get this in the <a target="_blank" ui-sref="settings.calendars">calendar settings</a> if you don\'t\n          know it).\n        </p>\n        <p ng-if="calmetas.length !== 0">In the calendar settings replace the word <b>spirited</b> with\n          <b>{{calendarName}}</b>\n          (or another one of your calendar names if you have several).\n        </p>\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">To preview your calendar click on the <b>Preview</b> link in the top right corner of\n        Muse.\n        You should now be able to see your calendar. If it\'s not quite right go back to <b>Design</b> mode and adjust\n        the\n        size and settings until it\'s the way you want it.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all just save your site and you\'re finished.\n      </div>\n    </li>\n  </ol>\n</div>'},1951(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Squarespace</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a Squarespace Site</h2>\n    </div>\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Don\'t worry, this is going to be easy.</h3>\n  <ol class="docs__instructions__list">\n      <li>\n        <div class="l-instruction l-note">\n          Note: These instructions use <b>Code Block (advanced)</b> which is only available with "Core" and higher Squarespace plans.\n        </div>\n      </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Before you start make sure you have the embed code for your calendar handy.\n        If not you can get one using the green <b>Add To Your Site</b> link at the top of the\n        <a ui-sref="customizer.main({calname:\'\'})">Customizer Tool</a> page on our site. It\'s also on\n        every event editor page for your calendar.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">In the Squarespace editor go to the page where you want to add Tockify and then\n        press <b>Edit</b> at the top left.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Pick an insert point and click <b>+ ADD BLOCK</b>\n        - a popup will appear with various things you can add to the page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction"> Select <b>&lt;/&gt; Code</b> from the section labelled <b>Basic</b>\n        - a box will appear where you can insert the Tockify Embed code.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Click the <b>pencil</b> (Edit) icon. Make sure the Mode is set to <b>HTML</b> then\n        remove any code that is already in this box and add the\n        Tockify embed code from (1) above.\n        You might see an "upgrade" message telling you that adding embeds is a premium feature.\n        Click outside the content popup to dismiss it.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n          Now click in the box where you added the embed script, and drag the resize handle to the desired width.\n          Don\'t worry about setting the height, as Tockify expands vertically, as needed.\n          Squarespace doesn\'t show Tockify while you are editing (or if you click <i>preview in safe mode</i>),\n          but it will be visible, after you <b>save</b> and <b>exit</b> the editor and on your live site.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all. The Tockify Calendar should now be visible on your page.\n      </div>\n    </li>\n  </ol>\n</div>\n'},1172(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Tumblr</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a Tumblr Site</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Don\'t worry, this is going to be easy.</h3>\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Before you start make sure you have the embed code for your calendar handy.\n        If not you can get one from the <a ui-sref="customizer.main({calname:\'\'})">Customizer Tool</a>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Log into Tumblr and click on the icon that looks like a person (head and body) in the\n        top\n        right hand corner. Pick <b>settings</b> from the menu that appears.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Select the blog you want to add Tockify to from the list outside the white settings area on the right.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction"> Click on the button labelled <b>Edit Theme</b>\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">At the top of the dark grey settings menu on the left there\'s a link labelled <b>Edit\n        HTML</b> - press it and some code will show..\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Just below where it says <b>&lt;head&gt;</b> near the top add the following (exactly)\n        being careful not to change anything else:\n      </div>\n      <pre><code class="language-markup" prism>\n    &lt;script data-cfasync=&quot;false&quot; data-tockify-script=&quot;embed&quot;\n    src=&quot;https://public.tockify.com/browser/embed.js&quot;&gt;&lt;/script&gt;\n    </code></pre>\n    </li>\n\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Save the change by clicking the green <b>Update Preview</b> button then press\n        the blue <b>Save</b> button that appears\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Go back to the settings menu then go to the bottom and pick the existing page you want to\n        add the calendar to or create a new one by clicking <b>Add a page</b>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">An <b>Edit page</b> form will appear. If it\'s a new page you\'ll need to fill in the URL\n        and Title for the page.\n      </div>\n    </li>\n\n    <li><span class="l-number"></span>\n      <div class="l-instruction">At the bottom of the add/edit page form add the\n        Tockify embed code from (1) above where it says <b>Page Body</b> and then and press the blue <b>Save</b> button.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all. The Tockify Calendar should now be visible on your page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">You can change the width of the calendar etc. by editing the HTML and CSS for the\n        Tumblr page\n        or changing the Tumblr theme.\n      </div>\n    </li>\n\n  </ol>\n</div>'},4998(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Weebly</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a Weebly Site</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">It\'s easy. Just use our Weebly App!</h3>\n\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Sign in to Weebly then go to the\n        <a href="https://www.weebly.com/app-center/tockify-calendar" target="_blank">Tockify Calendars App</a> page in\n        the Weebly App center.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Click on the big blue <b>Add</b> button and you\'ll be guided through a simple install\n        process.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">When you\'ve finished there will be a <b>Tockify Calendar</b> element in the\n        <b>Third Party</b> section of the Weebly editor\'s left hand toolbar (at the bottom).\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Just drag the <b>Tockify Calendar</b> element onto any page you want to see a calendar\n        on.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all, but if you have any questions you can reach us at\n        <a href="mailto:[email protected]?subject=Weebly%20App%20Question">[email protected]</a>.\n      </div>\n    </li>\n  </ol>\n\n  \x3c!--\n     <h3 class="docs__section__header">Alternative Manual Method (advanced)</h3>\n      <ol class="docs__instructions__list">\n          <li><span class="l-number"></span>\n              <div class="l-instruction">Before you start make sure you have the embed code for your calendar handy.\n                  If not you can get one from the <a ui-sref="customizer.main({calname:\'\'})">Customizer Tool</a>. </div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction">Log into Weebly and go to your site’s editor page.</div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction">Click on <b>Pages</b> on the top bar then select the\n                  page you want to add Tockify to from the list of pages on the left.</div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction">Press the blue <b>Save and Edit</b> button. This will take you to the page editor for the selected page.\n              </div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction">Scroll down to the section labelled <b>MORE</b> on the left of the page\n                  and drag the box labelled <b>Embed Code</b> onto the page editor.\n              </div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction">Click where it says <b>click to set custom HTML</b> then add the embed code snippet\n                  from (1) above to the white box that appears.\n              </div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction"> Click outside the white box.\n              </div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction"> Click on the Orange Publish button.\n              </div></li>\n          <li><span class="l-number"></span>\n              <div class="l-instruction">That\'s all. The Tockify Calendar should now be visible on your page.\n              </div></li>\n\n      </ol>\n      --\x3e\n</div>'},3976(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">Wix</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a Wix Site</h2>\n    </div>\n\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">Don\'t worry, this is going to be easy.</h3>\n\n\n  <ol class="docs__instructions__list">\n    <li>\n      <div class="l-instruction l-note">\n        Note: These instructions use <b>Custom Elements</b> which are only available with premium Wix plans\n        on sites with their own domain.\n        If you can\'t use Custom Elements, then you can still add the calendar using a WiX\n        <b>HTML iframe embed</b> element and our standard embed code, but that\'s not quite as seamless.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Before you start make sure you have the shortname for your calendar handy.\n        If not you can find it in your\n        <a ui-sref="settings.calendars">Calendar Settings page</a>.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Log into Wix and edit the site to which you want to add the calendar.\n        Select <b>+ Add</b> from the left hand menu. Then select <b>More</b> and <b>Custom Embeds</b>.\n        From the Custom Embeds menu select <b>Custom Element</b> and drag it onto the page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Select the <b>Custom Element</b> you just dragged into the editor,\n        then click the <b>Choose Source</b> button that appears above it.\n        <p>Set <b>Server URL</b> to <code>https://public.tockify.com/browser/wixembed.js</code></p>\n        <p>Set <b>Tag Name</b> to <code>tockify-element</code></p>\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Now click the <b>Set Attributes</b> button above your <b>Custom Element</b>\n        and then click the <b>Set Attributes</b> button in the <b>Element Attributes</b> dialog.\n        <p>Set the <b>Attribute Name</b> to <code>calendar</code></p>\n        <p>Set the <b>Value</b> to your calendar\'s <b><i>shortname</i></b></p>\n        <p>Then click the <b>Set</b> button.</p>\n\n        <p>Now click <b>New Attribute</b></p>\n        <p>Set the <b>Attribute Name</b> to <code>component</code></p>\n        <p>Set the <b>Value</b> to <code>calendar</code></p>\n        <div class="l-instruction l-note">Note: if you want to embed the mini-calendar,\n          then set <code>component</code> to <code>mini</code> instead.\n        </div>\n        <p>Then click the <b>Set</b> button and close the <b>Element Attributes</b> dialog.</p>\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all. The Tockify Calendar should now be visible on your page.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Tockify won\'t automatically resize in the Wix editor or preview mode,\n        but it will on your published site.\n      </div>\n      <div class="l-instruction l-note">\n        Technical Note: Wix renders the custom element inside an iFrame in the Editor\n        and in preview mode. This stops the calendar from automatically resizing.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Note that if the space you add Tockify to is narrow the calendar will, by default, automatically\n        switch over to the mini-calendar that usually works better in such situations. If you don\'t\n        want that you can turn it off in the calendar customizer.\n      </div>\n    </li>\n  </ol>\n</div>'},11(e){e.exports='<div class="docs__top">\n\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">
2\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">WordPress</h1>\n      <h2 class="docs__header__subtitle">How to add Tockify to a WordPress Site</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n\n  <p class="docs__info">\n    <span class="label label-siteform">Important</span> Our Wordpress plugin works for self-hosted Wordpress\n    and most third-party hosted versions of Wordpress, however wordpress.com blocks installation of third party\n    components\n    so unfortunately these instructions won\'t work there.\n  </p>\n\n\n  <h3 class="docs__section__header">Installing The Tockify Wordpress Plugin</h3>\n\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Tockify provides a Wordpress plugin to make it easy to add your calendar to a Wordpress\n        website.\n        To install it start by logging in to your site\'s Wordpress admin panel.\n        The plugin is in the Wordpress plugin directory and can be installed directly from there as described below or,\n        if you\n        prefer, you can <a ng-href="{{wordpressPluginLink}}" target="_self">Download the plugin here</a> and install it\n        manually.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">In the left panel of the Wordpress admin panel , select <b>Plugins > Add New</b>.\n        This will take you to the plugin directory.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Use the plugin search box on the right to search for "Tockify".\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Click the <b>Install</b> button on the Tockify plugin published <b>By Tockify</b>. You\'ll see a progess\n        indicator and\n        then some messages ending in one telling you that the Tockify plugin was successfully installed.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Under the last message there is a link labelled <b>Active Plugin</b>. Click it to\n        enable the Tockify Plugin\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all. The Tockify Plugin is now installed and\n        you can use it to add your calendar to Wordpress.\n      </div>\n    </li>\n  </ol>\n\n\n  <h3 class="docs__section__header">Adding A Tockify Calendar To Wordpress</h3>\n  <ol class="docs__instructions__list">\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Before you start make sure you have the Tockify Wordpress\n        plugin installed as described above. This adds the Wordpress shortcode that we\'ll use below to add Tockify.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">Log in to Wordpress and open the editor for the\n        page or post you want to add the calendar to.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction"><p>Find the place in your post where you want to add the calendar and add the\n        Tockify calendar shortcode as follows:\n        <pre>[tockify component="calendar" calendar="{{calendarName}}"]</pre>\n        <p ng-if="calmetas.length === 0"> replacing <b>your-calendar-name-goes-here</b>\n          with the short name for your calendar.</p>\n        <p ng-if="calmetas.length != 0"> where <b>{{calendarName}}</b>\n          is the short name for your calendar (change it if you want to use a different one).</p>\n        <p>If you want to use the mini-calendar instead change <code>component="calendar"</code> above to\n          <code>component="mini"</code></p>\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">\n        Press the grey <b>Preview</b> button on the right-hand control you\'ll\n        see a preview of your page with the calendar on it.\n      </div>\n    </li>\n    <li><span class="l-number"></span>\n      <div class="l-instruction">That\'s all. If you are happy with it just press the <b>Publish</b> button\n        on the right-hand control pane to make the change permanent.\n      </div>\n    </li>\n  </ol>\n\n  <p> The Tockify Shortcode has other attributes that you can use to control how the calendar is embedded.\n    These are described 
2in our <a ui-sref="docs.inter.api.embed">Embedding API Documentation</a>.</p>\n</div>'},8759(e){e.exports='<div class="docs__top">\n  <div class="docs__top__content container-fluid">\n    <div class="docs__header">\n      <span class="docs__eyebrow" ng-if="currentPage().section">{{currentPage().section}}</span>\n      <h1 class="docs__header__title">The New Tockify Calendar</h1>\n      <h2 class="docs__header__subtitle">About the new calendar and the status of the old one</h2>\n    </div>\n\n  </div>\n</div>\n<div class="docs__instructions container-fluid">\n  <h3 class="docs__section__header">About the new calendar</h3>\n\n  <p>\n    A lot has changed since we launched the old calendar 3 years ago. The web has moved to a cleaner flatter style,\n    mobile phones are widely used to browse the web and peoples\' design quality expectations for websites are a lot\n    higher.\n  </p>\n\n  <p>\n    We\'ve been improving our old calendar over time but, given these changes, incremental improvements\n    no longer seemed like enough so we decided to start again with a blank sheet and create a truly modern calendar.\n  </p>\n\n  <p>\n    Our new calendar has 3 calendar styles: attractive pinboard and agenda(list) style calendars, and a modern take on\n    the\n    tradional month grid calendar. All are super-configurable giving you deep control over colors, fonts and layout\n    details.\n  </p>\n\n  <p>\n    The new calendar is built to blend seamlessly into your site and make it look better.\n    There are no scrollbars or other awkward widgetty bits, just a modern attractive calendar that seems at home\n    on your site.\n  </p>\n\n  <p>We used to have separate mobile and desktop calendars. The new calendar works everywhere, adapting its look\n    to suit the device. This keeps the style and features consistent no matter how it is viewed.\n  </p>\n\n  <h3>What happened to the old calendar</h3>\n\n  <p>The new calendar will be our focus from now on.</p>\n\n\n</div>\n\n\n\n\n\n\n\n\n\n'},4855(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <div>\n      <form name="fDudaGetStarted" novalidate role="form">\n        <div ng-init="forms.fDudaGetStarted = fDudaGetStarted"></div>\n        <legend>Create calendar for your site</legend>\n        <fieldset>\n          <div\n              ng-class="{\'form-group has-feedback\':true, \'has-error\':fDudaGetStarted.ffname.$invalid && !fDudaGetStarted.ffname.$pristine}">\n            <label class="control-label" for="ffname">A one word short name for your calendar (like a Twitter\n              name)</label>\n\n            <div style="position:relative">\n              <input class="form-control" id="ffname" name="ffname" ng-model="calendar.name"\n                     placeholder="calendar short name" required server-error type="text">\n              <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fDudaGetStarted.ffname.$invalid && fDudaGetStarted.ffname.$dirty,\n      \'glyphicon-ok\':fDudaGetStarted.ffname.$valid\n       }"></span>\n            </div>\n            <span class="help-block"\n                  ng-show="!fDudaGetStarted.ffname.$error.serverError && fDudaGetStarted.ffname.$dirty && fDudaGetStarted.ffname.$error.required">\n                    Please provide a calendar name</span>\n            <span class="help-block"\n                  ng-show="fDudaGetStarted.ffname.$error.serverError">{{serverErrors.name}}</span>\n          </div>\n\n          <div\n              ng-class="{\'form-group has-feedback\':true, \'has-error\':fDudaGetStarted.displayName.$invalid && !fDudaGetStarted.displayName.$pristine}">\n            <label class="control-label" for="cDisplayName">A title for the top of the calendar</label>\n            <input class="form-control" id="cDisplayName" name="displayName" ng-model="calendar.displayName"\n                   placeholder="calendar title" required server-error type="text">
2\n            <span\n                ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fDudaGetStarted.displayName.$invalid}"></span>\n            <span class="help-block"\n                  ng-show="!fDudaGetStarted.displayName.$error.serverError && fDudaGetStarted.displayName.$dirty && fDudaGetStarted.displayName.$error.required">\n                    Please pick a calendar title</span>\n            <span class="help-block"\n                  ng-show="fDudaGetStarted.displayName.$error.serverError">{{serverErrors.displayName}}</span>\n          </div>\n\n          <div\n              ng-class="{\'form-group has-feedback\':true, \'has-error\':fDudaGetStarted.url.$invalid && !fDudaGetStarted.url.$pristine}">\n            <label class="control-label" for="cUrl">Your website so we can link back to you (optional)</label>\n            <input class="form-control" id="cUrl" name="url" ng-model="calendar.url"\n                   placeholder="https://yoursite.com" server-error type="text">\n            <span\n                ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fDudaGetStarted.url.$invali
2d}"></span>\n            <span class="help-block"\n                  ng-show="fDudaGetStarted.url.$error.serverError">{{serverErrors.url}}</span>\n          </div>\n\n          <div class="form-group">\n            <label>Where are you (so we can get the timezone right)</label>\n            <select class="form-control" ng-model="calendar.tzid" ng-options="tz for tz in tzs">\n            </select>\n          </div>\n\n          <div class="form-group">\n            <label>Language (so we can format dates correctly)</label>\n            <select class="form-control" ng-model="calendar.locale"\n                    ng-options="locale.c as locale.n for locale in locales">\n            </select>\n          </div>\n\n          <div class="form-group">\n            <label class="control-label">Trial plan type</label>\n            <label class="checkbox-inline">\n              <input ng-model="calendar.changePlan" ng-value="{{false}}" type="radio"> Premium</label>\n            <label class="checkbox-inline">\n              <input ng-model="calendar.changePlan" ng-value="{{true}}" type="radio">\n              White Label</label>\n          </div>\n\n          <div class="help-block--bright"\n               ng-show="serverErrors.form">{{serverErrors.form.message}}\n          </div>\n\n          <div class="siteform__buttons clearfix">\n            <button class="btn btn-siteform btn-lg siteform__buttons__fill" ng-click="tryCreateCalendar()"\n                    type="button"> Create calendar\n            </button>\n          </div>\n          <div class="help-block">\n            You can connect your site to an existing calendar later, by contacting Tockify support.\n          </div>\n\n        </fieldset>\n      </form>\n    </div>\n\n  </div>\n</div>\n'},280(e){e.exports='<div class="siteform-background">\n  <div class="dudaLaunchpad site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/" target="_blank">Tockify</a>\n    </div>\n\n    <div>\n      <div class="dudaLaunchpad__calendar">\n        <a ng-href="{{editUrl}}" target="_blank">Edit Events</a>\n        <a ng-href="{{customizeUrl}}" target="_blank">Customize</a>\n        <a ng-href="{{manageUrl}}" target="_blank">Manage</a>\n      </div>\n\n      <div class="dudaLaunchpad__planInfo">\n        <div ng-if="planCategory === \'free\'">\n          <a class="btn btn-siteform l-label" ui-sref="settings.subscriptions">Trial Expired</a>\n          <span>Your free trial of Tockify has expired.\n          <a class="l-subscribe" ui-sref="settings.subscriptions" target="_blank">Upgrade</a> to get all the features</span>\n        </div>\n        <div ng-if="planCategory === \'trial\'">\n          <a class="btn btn-siteform l-label" ui-sref="settings.subscriptions">Trial</a>\n          <span ng-if="daysLeft > 1"> There are {{daysLeft}} days left in your trial of the premium features.</span>\n          <span ng-if="daysLeft === 1"> This is the last day of your trial of the premium features.</span>\n          <a class="l-subscribe" ui-sref="settings.subscriptions" target="_blank">Upgrade Now</a>\n        </div>\n        <div ng-if="planCategory === \'paid\'">\n          <a class="btn btn-siteform l-label" ui-sref="settings.subscriptions" target="_blank">{{planKindName}}</a>\n          Thanks for using our calendar!\n        </div>\n      </div>\n    </div>\n\n  </div>\n</div>\n'},5600(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fEmailChange" novalidate role="form">\n\n      <legend>Confirm Email Change</legend>\n      <div style="font-size: 1.1em">\n        Change email to <b>{{newEmail}}</b>\n      </div>\n      <div class="siteform__buttons login__buttons clearfix">\n        <button type="button"\n                class="btn btn-siteform btn-lg siteform__buttons__fill"\n                ng-click="performAction()">Click To Complete The Email Change\n        </button>\n      </div>\n      <div style="position: relative;top:5px; color:#666" >For security reasons this can only be used once</div>\n\n    </form>\n\n  </div>\n</div>\n'},2340(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fEmailUnsubscribe" novalidate role="form">\n\n      <legend>Confirm Email Unsubscribe</legend>\n      <div style="font-size: 1.1em">\n        Unsubscribe <b>{{email}}</b> from <b>{{category}}</b> email notifications\n      </div>\n      <div class="siteform__buttons login__buttons clearfix">\n        <button type="button"\n                class="btn btn-siteform btn-lg siteform__buttons__fill"\n                ng-click="performAction()">Click To Unsubscribe\n        </button>\n      </div>\n\n    </form>\n\n  </div>\n</div>\n'},3342(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fForgotPassword" novalidate role="form">\n      <div ng-init="forms.fForgotPassword = fForgotPassword"></div>\n      <fieldset>\n        <legend>Reset your password by email</legend>\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fForgotPassword.email.$invali
2d && !fForgotPassword.email.$pristine}">\n          <label class="control-label" for="uEmail">Your email address</label>\n          <input class="form-control input--tlg" id="uEmail" name="email" ng-model="forgotPassword.email"\n                 placeholder="email address" required server-error type="text">\n\n          <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fForgotPassword.email.$invalid && fForgotPassword.email.$dirty,\n      \'glyphicon-ok\':fForgotPassword.email.$valid\n       }"></span>\n\n          <span class="help-block"\n                ng-show="fForgotPassword.email.$dirty && fForgotPassword.email.$error.required">Please provide your email address</span>\n          <span class="help-block"\n                ng-show="fForgotPassword.email.$error.serverError">{{serverErrors.email}}</span>\n\n        </div>\n\n      </fieldset>\n\n      <div class="help-block--bright"\n           ng-show="serverErrors.form">{{serverErrors.form.message}}\n      </div>\n\n\n      <div class="siteform__buttons login__buttons clearfix">\n        <button class="btn btn-siteform btn-lg login__buttons__left" ng-click="trySendResetEmail()" type="button">\n          Send Reset Email\n        </button>\n        <a class="btn btn-default btn-lg login__buttons__right" ui-sref="siteform.login">Cancel</a>\n      </div>\n\n\n    </form>\n\n  </div>\n</div>\n\n\n\n'},3836(e){e.exports='<div class="siteform-background">\n\n  <div class="signup__form site__focusbox clearfix">\n\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fGetStarted" novalidate role="form">\n      <div ng-init="forms.fGetStarted = fGetStarted"></div>\n      <fieldset>\n        <legend>Create Your First Calendar</legend>\n        \x3c!--<div class="bs-callout bs-callout-primary">--\x3e\n        \x3c!--<h4>Email confirmation required</h4>--\x3e\n        \x3c!--After you make this change we will send a confirmation email to your--\x3e\n        \x3c!--new address. The update won\'t occur until you confirm.--\x3e\n        \x3c!--</div>--\x3e\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fGetStarted.ffname.$invalid && !fGetStarted.ffname.$pristine}">\n          <label class="control-label" for="ffname">A one word short name for your calendar (like a Twitter\n            name)</label>\n\n          <div style="position:relative">\n            <input autocapitalize="none" autocorrect="off" class="form-control" id="ffname"\n                   name="ffname" ng-model="calendar.name"\n                   placeholder="calendar short name" required server-error type="text">\n            <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fGetStarted.ffname.$invalid && fGetStarted.ffname.$dirty,\n      \'glyphicon-ok\':fGetStarted.ffname.$valid\n       }"></span>\n          </div>\n          <span class="help-block"\n                ng-show="!fGetStarted.ffname.$error.serverError && fGetStarted.ffname.$dirty && fGetStarted.ffname.$error.required">\n                    Please provide a calendar name</span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <span class="help-block"\n                ng-show="fGetStarted.ffname.$error.serverError">{{serverErrors.name}}</span>\n        </div>\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fGetStarted.displayName.$invalid && !fGetStarted.displayName.$pristine}">\n          <label class="control-label" for="cDisplayName">A title for the top of the calendar</label>\n          <input autocapitalize="none" autocorrect="off" class="form-control" id="cDisplayName"\n                 name="displayName" ng-model="calendar.displayName"\n                 placeholder="calendar title" required server-error type="text">\n          <span\n              ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fGetStarted.displayName.$invali
2d}"></span>\n          <span class="help-block"\n                ng-show="!fGetStarted.displayName.$error.serverError && fGetStarted.displayName.$dirty && fGetStarted.displayName.$error.required">\n                    Please pick a calendar title</span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <span class="help-block"\n                ng-show="fGetStarted.displayName.$error.serverError">{{serverErrors.displayName}}</span>\n        </div>\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fGetStarted.url.$invalid && !fGetStarted.url.$pristine}">\n          <label class="control-label" for="cUrl">Your website so we can link back to you. (optional)</label>\n          <input autocapitalize="none" autocorrect="off" class="form-control" id="cUrl"\n                 name="url" ng-model="calendar.url"\n                 placeholder="https://yoursite.com" server-error type="text">\n          <span\n              ng-class="{\'glyphicon form-control-feedback\':true, \'glyphicon-remove\':fGetStarted.url.$invali
2d}"></span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <span class="help-block"\n                ng-show="fGetStarted.url.$error.serverError">{{serverErrors.url}}</span>\n        </div>\n\n        <div class="form-group">\n          <label>Where are you (so we can get the timezone right)</label>\n          <select class="form-control" ng-model="calendar.tzid" ng-options="tz for tz in tzs">\n          </select>\n        </div>\n\n        <div class="form-group">\n          <label>Language (so we can format dates correctly)</label>\n          <select class="form-control" ng-model="calendar.locale"\n                  ng-options="locale.c as locale.n for locale in locales">\n          </select>\n        </div>\n\n        <div class="help-block--bright"\n             ng-show="serverErrors.form">{{serverErrors.form.message}}\n        </div>\n\n        <div>We\'re giving you access to all {{trialPlanKind}} features for the next 14 days. After that you\'ll\n          be able to use the free calendar forever if that\'s all you need.\n        </div>\n\n        <div class="siteform__buttons clearfix">\n          <button class="btn btn-siteform btn-lg siteform__buttons__fill" ng-click="tryCreateCalendar()"\n                  type="button">\n            Create your first Calendar\n          </button>\n        </div>\n\n\n      </fieldset>\n    </form>\n\n  </div>\n</div>\n\n\n\n'},1218(e){e.exports='<div class="siteform-background">\n\n  <div class="gsync__perms__form site__focusbox clearfix">\n\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <div ng-if="pageState.ready && accounts.length === 0">\n      <form name="fStartGoogleSync" novalidate role="form">\n        <fieldset>\n          <legend>Sync With Your Google Calendar</legend>\n\n          <div style="margin-bottom: 20px;font-size:1.1em">\n            <p>\n              Our Google Calendar Sync feature lets you display events from your Google\n              Calendar using Tockify\'s visually rich layouts.\n            </p>\n            <p>\n              Before we can sync with your Google Calendar we need to be granted <b>read-only</b>\n              access to your Google calendar and events.\n            </p>\n            <p>\n              Pressing "Authorize Google Calendar Access" below will begin this process.\n            </p>\n            <p>\n              We will never use the permission you grant us for any purpose other than providing\n              the Google Sync feature.\n            </p>\n          </div>\n\n\n          <div class="siteform__buttons clearfix">\n            <button class="btn btn-siteform btn-lg siteform__buttons__fill" ng-click="startOAuth()"\n                    type="button">\n              Authorize Google Calendar Access\n            </button>\n          </div>\n        </fieldset>\n      </form>\n    </div>\n\n    <form name="fGoogleSync" ng-if="pageState.ready && accounts.length > 0" novalidate role="form">\n      <fieldset>\n        <legend>Sync With Your Google Calendar</legend>\n        <div ng-init="forms.fGoogleSync = fGoogleSync"></div>\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fGoogleSync.name.$invalid && !fGoogleSync.name.$pristine}">\n          <label class="control-label" for="name">A one word short name for your calendar (like a Twitter\n            name)</label>\n\n          <div style="position:relative">\n            <input class="form-control" id="name" name="name" ng-model="calendar.name"\n                   placeholder="calendar short name" required server-error type="text">\n            <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fGoogleSync.name.$invalid && fGoogleSync.name.$dirty,\n      \'glyphicon-ok\':fGoogleSync.name.$valid\n       }"></span>\n          </div>\n\n          <span class="help-block"\n                ng-show="!fGoogleSync.name.$error.serverError && fGoogleSync.name.$dirty && fGoogleSync.name.$error.required">\n                    Please provide a calendar name</span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <sp
2an class="help-block"\n                ng-show="fGoogleSync.name.$error.serverError">{{serverErrors.name}}</span>\n        </div>\n\n        <div class="form-group" ng-if="calendars.length === 0">\n          No Google calendars were found for {{selection.account.email}}\n        </div>\n\n        <div class="form-group" ng-if="calendars.length > 0">\n          <label>Which Google Calendar would you like to sync with</label>\n          <select class="form-control" name="calendar" ng-model="selection.calendar"\n                  ng-options="c as c.summary for c in calendars">\n          </select>\n          \x3c!--<span class="help-block" ng-show="!fGoogleSync.calendar.$error.required">--\x3e\n          \x3c!--Please pick a calendar name</span>--\x3e\n        </div>\n\n\n        <div class="help-block--bright"\n             ng-show="serverErrors.form">{{serverErrors.form}}\n        </div>\n\n        <div class="siteform__buttons clearfix">\n          <button class="btn btn-siteform btn-lg siteform__buttons__fill" ng-click="createSyncedCalendar()"\n                  type="button">\n            Create Synced Calendar\n          </button>\n        </div>\n\n      </fieldset>\n    </form>\n\n  </div>\n</div>\n\n\n\n'},7242(e){e.exports='<div class="container-fluid homepage">\n  <div class="row">\n    \x3c!--http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700,900,200italic,300italic,400italic,600italic,700italic,900italic--\x3e\n    <div class="homepage__main">\n\n      <div class="navbar navbar-default homepage__navbar">\n        <div class="container-fluid ">\n          <div class="row">\n            <div class="navbar-header">\n\n              <a class="navbar-brand" href="/"><span class="tockify-logo">Tockify</span></a>\n            </div>\n            <div ng-class="{\'navbar-collapse\':true, collapse:isCollapsed}">\n\n              <ul class="nav navbar-nav navbar-right">\n                <li ng-if="planSource!==\'duda\' && subscriptionStatus===\'paid\'"><a ui-sref="siteform.updateSubscription">Your Plan</a></li>\n                <li ng-if="planSource===\'duda\'"><a ui-sref="settings.subscriptions">Your Plan</a></li>\n                <li><a ui-sref="customizer.anonmain">Customizer</a></li>\n                <li><a ui-sref="customizer.anonupcoming">Mini Calendar</a></li>\n                <li><a ui-sref="docs.inter">Documentation</a></li>\n                <li ng-if="planSource!==\'duda\' && subscriptionStatus===\'none\'"><a ui-sref="siteform.trialPlanPicker">Plans</a></li>\n                <li ng-if="planSource!==\'duda\' && subscriptionStatus===\'unpaid\'"><a ui-sref="siteform.paidPlanPicker">Plans</a></li>\n                \x3c!--<li ng-class="{active: isActive(\'/blog\')}"><a  href="/blog.php">Blog</a></li>--\x3e\n                <li ng-if="pageState.isLoggedIn"><a ui-sref="settings">Settings<span\n                    ng-if="alerts.length>0">&nbsp;<sup class="label label-danger" ng-if="alerts.length>0">!</sup></span>\n                </a></li>\n                <li ng-if="!pageState.isLoggedIn"><a ui-sref="siteform.login">Log in</a></li>\n                <li ng-if="pageState.isLoggedIn && showLogout"><a href="#" ng-click="doLogout($event)">Log out</a></li>\n                \x3c!--<li ng-if="pageState.pageState.isLoggedIn" ><a  ng-href="{{editorURL}}">Calendar Editor</a></li>--\x3e\n              </ul>\n            </div>\n          </div>\n        </div>\n      </div>\n\n\n      <div class="homepage__top">\n\n        <div class="homepage__top__content container-fluid">\n          <div class="homepage__header">\n            <div class="homepage__header__overlay">\n              <span class="flaticon-tcal2 r4"></span>\n              <span class="flaticon-tcal2 r8"></span>\n            </div>\n            <h1 class="homepage__header__title">Modern Attractive Website Calendars</h1>\n            <h2 class="homepage__header__subtitle">Customizable web calendars that blend seamlessly into your site</h2>\n          </div>\n          <div class="homepage__top__buttons" ng-if="!pageState.isLoggedIn">\n            <a class="btn btn-orange-white btn-lg siteform__buttons__left" type="button"\n               ui-sref="siteform.register">\n              Get Started For Free\n            </a>\n            <a class="not-button" ui-sref="siteform.login">sign in</a>\n          </div>\n          <div class="homepage__top__buttons" ng-if="pageState.isLoggedIn && editorURL">\n            <div class="l-message">Welcome Back</div>\n            <a class="btn btn-green-white btn-lg siteform__buttons__left" ng-href="{{editorURL}}" target="_self"\n               type="button">\n              Go To Your Calendar Editor\n            </a>\n          </div>\n          <div class="homepage__top__buttons" ng-if="pageState.isLoggedIn && !editorURL">\n            <div class="l-message">Welcome Back</div>\n            <a class="btn btn-green-white btn-lg siteform__buttons__left" target="_self" type="button"\n               ui-sref="settings.calendars">\n              Go To Calendar Settings\n            </a>\n          </div>\n        </div>\n      </div>\n\n      <div ng-include="\'app/site/homepage/sections/demo.html\'" onload="demoLoaded()"></div>\n      <div ng-include="\'app/site/homepage/sections/workswith.html\'"></div>\n      <div ng-include="\'app/site/homepage/sections/features.html\'"></div>\n      <div ng-include="\'app/site/homepage/sections/bottom.html\'"></div>\n    </div>\n  </div>\n</div>\n'},2146(e){e.exports='<div class="homepage__bottom" ng-if="!pageState.isLoggedIn">\n\n  <div class="homepage__bottom__content container-fluid">\n    <div class="homepage__header">\n      <div class="homepage__header__overlay">
2\n        <span class="flaticon-tcal2 r4"></span>\n        <span class="flaticon-tcal2 r8"></span>\n      </div>\n      <h2 class="homepage__header__title">A website calendar built for the modern web</h2>\n      <h3 class="homepage__header__subtitle">Attract a following, Engage an audience, Inform a community</h3>\n    </div>\n    <div class="homepage__bottom__buttons" ng-if="!pageState.isLoggedIn">\n      <a class="btn btn-orange-white btn-lg siteform__buttons__left" type="button" ui-sref="siteform.trialPlanPicker">\n        Get Started For Free\n      </a>\n    </div>\n\n  </div>\n</div>'},942(e){e.exports='<div class="homepage__demo container-fluid" style="background-color: rgb(255, 255, 255); color: rgb(34, 34, 34)">\n\n\n  \x3c!-- assume script already loaded --\x3e\n\n  <div class="row">\n\n\n    <div class="col-md-8 homepage__demo__calendar-wrap" style="{{demoBackground}}">\n      <div class="homepage__section__header">\n        <h2 class="homepage__section__header__title">Try this live web calendar</h2>\n        <div class="homepage__section__header__subtitle">Try searching, switching to the agenda or month grid calendar,\n          or going fullscreen\n        </div>\n      </div>\n      <div class="homepage__demo__calendar">\n        <div data-tockify-calendar="spirited"\n             data-tockify-component="calendar"\n             data-tockify-demo="false"\n             data-tockify-maxEventsPerQuery="8"\n             data-tockify-narrowwidth="0"\n             data-tockify-view="pinboard"></div>\n      </div>\n    </div>\n    <div class="col-md-4 homepage__demo__info-wrap">\n      \x3c!--<div class="homepage__demo__feature">--\x3e\n      \x3c!--<div>Precision customization to match your site. No programming required.</div>--\x3e\n      \x3c!--</div>--\x3e\n      <div class="homepage__demo__layout-switcher homepage__demo__info-block">\n        <div class="l-title">Try all three calendar layouts</div>\n        <div class="container-fluid">\n          <div class="row">\n            <div class="col-xs-4 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(activeView === \'pinboard\')}"\n                      ng-click="setCalendarView(\'pinboard\')">pinboard\n              </button>\n            </div>\n            <div class="col-xs-4 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(activeView === \'agenda\')}"\n                      ng-click="setCalendarView(\'agenda\')">agenda\n              </button>\n            </div>\n            <div class="col-xs-4 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(activeView === \'monthly\')}"\n                      ng-click="setCalendarView(\'monthly\')">monthly\n              </button>\n            </div>\n          </div>\n\n        </div>\n        <div class="row">\n          <div class="col-xs-12 ">\n            <div class="l-info">\n              <div>You can use any combination of layouts in your calendar and make any the default.</div>\n            </div>\n\n          </div>\n\n        </div>\n      </div>\n      <div class="homepage__demo__style-switcher homepage__demo__info-block">\n        <div class="l-title">Now try switching style</div>\n        <div class="container-fluid">\n          <div class="row">\n            <div class="col-xs-6 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(baseTheme === \'light\')}"\n                      ng-click="setBaseTheme(\'light\')">light\n              </button>\n            </div>\n            <div class="col-xs-6 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(baseTheme === \'dark\')}"\n                      ng-click="setBaseTheme(\'dark\')">dark\n              </button>\n            </div>\n          </div>\n\n          <div class="row">\n            <div class="col-xs-6 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(baseTheme === \'curvy\')}"\n                      ng-click="setBaseTheme(\'outline\')">outline\n              </button>\n            </div>\n            <div class="col-xs-6 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(baseTheme === \'subtle\')}"\n                      ng-click="setBaseTheme(\'subtle\')">subtle\n              </button>\n            </div>\n          </div>\n          <div class="row">\n            <div class="col-xs-6 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(baseTheme === \'transparent1\')}
2"\n                      ng-click="setBaseTheme(\'dark-transparent\')">transparent1\n              </button>\n            </div>\n            <div class="col-xs-6 l-option">\n              <button ng-class="{\'btn btn-default\':true, active:(baseTheme === \'transparent2\')}"\n                      ng-click="setBaseTheme(\'light-transparent\')">transparent2\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class="homepage__demo__layout-switcher homepage__demo__info-block">\n        <div class="l-title">Make it match your site or brand</div>\n        <div class="row">\n          <div class="col-xs-12 ">\n            <div class="l-center">\n              <a class="btn btn-siteform btn-lg homepage__demo__customButton"\n                 ui-sref="customizer.anonmain">Build A Custom Theme</a>\n            </div>\n          </div>\n        </div>\n\n        <div class="row">\n          <div class="col-xs-12 ">\n            <div class="l-info">\n              <div>Use our customizer tool to make the calendar\'s look a perfect match for your\n                website or organization\'s colors. No programming required.\n              </div>\n            </div>\n\n          </div>\n\n        </div>\n      </div>\n      <div class="homepage__demo__layout-switcher homepage__demo__info-block">\n        <div class="l-title">Open full page for extra space</div>\n        <div class="row">\n          <div class="col-xs-12 ">\n            <div class="l-center">\n              <button class="btn btn-siteform btn-lg homepage__demo__customButton" ng-click="openFullScreen()"\n                      target="_blank">Open Full Page Calendar\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <div class="row">\n          <div class="col-xs-12 ">\n            <div class="l-info">\n              <div>\n                There\'s a full page button in the top right corner of the embedded calendar and you\n                can also launch it with a click using our simple API.\n              </div>\n            </div>\n\n          </div>\n\n        </div>\n      </div>\n    </div>\n  </div>\n</div>'},5766(e){e.exports='<div class="homepage__features">\n\n  <div class="container-fluid">\n    <div class="row">\n      <div class="col-md-4">\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">Three attractive styles</h3>\n          <div class="l-body">Tockify includes a visually rich pinboard calendar as well\n            as attractive modern takes on month grid and list/agenda style calendars. All styles look great on mobile\n            too.\n          </div>\n        </div>\n      </div>\n      <div class="col-md-4">\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">Modern and professional</h3>\n          <div class="l-body">Tockify blends seamlessly into your site to improve its looks and impress\n            your visitors. You don\'t have to settle for a widgety calendar that undermines your style any more.\n          </div>\n        </div>\n      </div>\n      <div class="col-md-4">\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">Super-Customizable</h3>\n          <div class="l-body">Tockify\'s customizer tool lets you control every aspect of your calendar\'s\n            colors, fonts and layout so you can make it match your site\'s style. All without any programming.\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="row">\n      <div class="homepage__features__google-sync">\n        <div class="container-fluid">\n          <div class="row">\n            <div class="col-md-1"></div>\n            <div class="col-md-6">\n              <img class="l-googleFavicon"\n                   ng-src="{{googleFavicon}}">\n              <span class="l-featureHeader">Live Sync with Google Calendar</span>\n            </div>\n            <div class="col-md-6">\n              Turn your Google Calendar into an attractive public events Calendar\n            </div>\n            <div class="col-md-1"></div>\n          </div>\n          <div class="row">\n            <div class="col-md-12">\n              <div class="l-center">\n                <a class="btn btn-siteform btn-lg homepage__demo__customButton" ng-if="!pageState.isLoggedIn"\n                   target="_blank"\n                   ui-sref="siteform.register({variant:\'google-sync\'})">Get Started For Free</a>\n                <a class="btn btn-siteform btn-lg homepage__demo__customButton" ng-if="pageState.isLoggedIn"\n                   target="_blank"\n                   ui-sref="settings.calendars">Synchronize Now</a>\n                <div class="homepage_gs_note">\n                  Note: To provide this feature we will need you to grant us read-only access to your\n                  Google Calendars. As per our <a ui-sref="docs.inter.company.privacy">Privacy Policy</a>\n                  we will only ever use this permission to implement the synchronization feature.\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="row">\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n\n          <h3 class="l-heading">Social Sharing</h3>\n          <div class="l-body">Sharing to Facebook, Twitter, Pinterest and LinkedIn is built in.\n            So is emailing event details and saving events to personal calendars.\
2n          </div>\n        </div>\n      </div>\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n\n          <h3 class="l-heading">Repeating Events</h3>\n          <div class="l-body"><p>Create daily, weekly or monthly events, then move or cancel particular repeats.</p>\n            <p>Do you have an event that repeats on the second and last Tuesdays of every month? No problem.</p>\n\n          </div>\n        </div>\n      </div>\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n\n          <h3 class="l-heading">Community Submitted Events</h3>\n          <div class="l-body">Our event submission feature makes it easy for you to\n            let your community submit events to your calendar and to review and approve them before they\'re published.\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="row">\n      <div class="homepage__features__google-sync">\n        <div class="container-fluid">\n          <div class="row">\n            <div class="col-md-1"></div>\n            <div class="col-md-6">\n              <img class="l-rsvpFavicon"\n                   ng-src="{{peopleImage}}">\n              <span class="l-featureHeader">Flexible RSVPs</span>\n            </div>\n            <div class="col-md-6">\n              Add a custom RSVP form to any event to collect and manage responses\n            </div>\n            <div class="col-md-1"></div>\n          </div>\n          <div class="row">\n            <div class="col-md-12">\n              <div class="l-center">\n                <a class="btn btn-siteform btn-lg homepage__demo__customButton" ng-if="!pageState.isLoggedIn"\n                   target="_blank"\n                   ui-sref="siteform.register">Get Started For Free</a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="row">\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">Simple, Powerful Editor</h3>\n          <div class="l-body"><p>Adding an event is as easy as writing an email.</p>\n            <p>Our simple, snappy editor makes it easy to create events, move them around,\n              set up repeating events, add maps and images, and accept RSVPs.</p>\n          </div>\n\n\n        </div>\n      </div>\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n\n          <h3 class="l-heading">Ticket Buttons</h3>\n          <div class="l-body">\n            Add a prominent promotion button to any event and use it to send visitors to your tickets or booking page.\n          </div>\n        </div>\n\n      </div>\n\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">iCalendar Support</h3>\n\n          <div class="l-body">\n            Tockify supports the iCalendar standard so if you want to\n            you can let people subscribe to your calendar with their mobile\n            phone\'s calendar or another personal calendar.\n          </div>\n\n        </div>\n      </div>\n    </div>\n\n    <div class="row">\n      <div class="homepage__features__google-sync">\n        <div class="container-fluid">\n          <div class="row">\n            <div class="col-md-1"></div>\n            <div class="col-md-6">\n              <img alt="Wordpress Calendar" class="l-wpLogo" ng-src="{{wordpressLogoLight}}"\n                   title="Best Wordpress Calendar">\n            </div>\n            <div class="col-md-6">\n              Using Wordpress? Make Tockify your Wordpress Calendar by installing our\n              <a class="l-nowrap" href="https://wordpress.org/plugins/tockify-events-calendar/" target="_blank">Wordpress\n                Events Calendar</a> plugin\n            </div>\n            <div class="col-md-1"></div>\n          </div>\n          <div class="row">\n            <div class="col-md-12">\n              <div class="l-center">\n                <a class="btn btn-siteform btn-lg homepage__demo__customButton" ng-if="!pageState.isLoggedIn"\n                   target="_blank"\n                   ui-sref="siteform.register">Get Started For Free</a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class="row">\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">Embed Movies</h3>\n          <div class="l-body">\n            <p>It\'s easy to add YouTube and Vimeo and Facebook videos that bring your events to life.</p>\n            <p>No embed codes needed. Just give us the YouTube, Vimeo or Facebook page URL and we\'ll add\n          </div>\n\n        </div>\n      </div>\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n\n          <h3 class="l-heading">Custom Fonts</h3>\n          <div class="l-body">\n            <p>Tockify comes with a selection of the best Google Fonts, but if you need more it\'s easy to\n              add fonts from Typekit, Fonts.com or from your own Font-Face stylesheet.</p>\n\n\n          </div>\n        </div>\n      </div>\n\n      <div class="col-md-4">\n\n        <div class="homepage__features__featurebox">\n          <h3 class="l-heading">Attach Files</h3>\n\n          <div class="l-body">\n            If you need to add a flyer, guide or form for your attendees to\n            complete you can attach files to any event so that they can download it beforehand.\n          </div>\n\n        </div>\n      </div>\n    </div>\n  </div>\n\n\n</div>'},5051(e){e.exports='<div class="homepage__workswith">\n  <div class="l-header">Works with all these platforms and everywhere else</div>\n  <div class="container-fluid ">\n    <div class="row">\n      <div class="col-md-3 col-xs-6">\n        <a ui-sref="docs.inter.install.wordpress"><img alt="Calendar for Wordpress" ng-src="{{wordpressLogo}}"\n                                                       title="Wordpress Calendar"></a>\n      </div>\n      <div class="col-md-3 col-xs-6">\n        <a ui-sref="docs.inter.install.wix"><img class="l-wiximg" alt="Calendar for Wix" ng-src="{{wixLogo}}"\n                                                 title="Wix Calendar"></a>\n      </div>\n      <div class="col-md-3 col-xs-6">\n        <a ui-sref="docs.inter.install.squarespace"><img alt="Calendar for Squarespace" ng-src="{{squarespaceLogo}}"\n                                                         title="Squarespace Calendar"></a>\n      </div>\n      \x3c!--      <div class="col-md-3 col-xs-6">--\x3e\n      \x3c!--        <a ui-sref="docs.inter.install.muse"><img alt="Calendar for Muse" ng-src="{{museLogo}}"--\x3e\n      \x3c!--                                                  title="Muse C
2alendar"></a>--\x3e\n      \x3c!--      </div>--\x3e\n\n      <div class="col-md-3 col-xs-6">\n        <a ui-sref="docs.inter.install.weebly"><img alt="Calendar for Weebly" ng-src="{{weeblyLogo}}"\n                                                    title="Weebly Calendar"></a>\n      </div>\n\n    </div>\n  </div>\n  <div class="l-footer">Works <a ui-sref="docs.inter.install.anywhere">everywhere</a>. Add it to any website in minutes.\n  </div>\n</div>'},5028(e){e.exports='<div class="siteform-background">\n  <div class="invoice__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <div class="invoice__unpaid" ng-if="invoice.status === \'unpaid\'">\n      <div ng-if="!invoice.incompleteCreate" class="invoice__unpaid__title">This invoice hasn\'t been paid.</div>\n      <div ng-if="invoice.incompleteCreate" class="invoice__unpaid__title">The initial subscription payment failed.\n        The subscription will start when it succeeds.\n      </div>\n      <button ng-disabled="viewState.tryStarted" class="btn btn-siteform" ng-click="retryPayment()">Retry Using Current\n        Card\n      </button>\n      <a class="btn btn-default"\n         ui-sref={{"siteform.changeCard({next})"}}>Change Payment Card</a>\n\n      <div class="invoice__unpaid__notice" ng-if="invoice.incompleteCreate">\n        <p>Your subscription hasn\'t started because when you subscribed your card\n          was declined. Please try again here. Your subscription will begin as soon as payment succeeds.</p>\n        <p>This invoice will be voided after 24 hours. After that you\'ll have to start over if you still want to\n          subscribe.</p>\n      </div>\n\n    </div>\n\n    <div class="invoice__main" ng-if="invoice">\n\n      <div class="invoice__header" ng-if="viewState.receipt">\n        <h1>Receipt</h1>\n        <div class="invoice__status ">\n          <a ng-click="viewState.receipt = false"> Hide Receipt</a></div>\n        <div class="invoice__print">\n          <button class="btn btn-siteform"\n                  ng-click="printInvoice()">Print This Receipt\n          </button>\n        </div>\n\n\n        <table class="invoice__receipt__table">\n          <tr>\n            <td class="l-name">Payment Date:</td>\n            <td class="l-value">{{invoice.payment.dateOfPayment}}</td>\n          </tr>\n          <tr>\n            <td class="l-name">Payment Method:</td>\n            <td class="l-value">{{invoice.payment.brand}} **** **** **** {{invoice.payment.last4}}</td>\n          </tr>\n          <tr>\n            <td class="l-name">Payment Amount:</td>\n            <td class="l-value">{{invoice.payment.amount}}</td>\n          </tr>\n        </table>\n\n\n      </div>\n\n\n      <div class="invoice__header">\n\n        <h1 ng-if="!viewState.receipt">Invoice</h1>\n        <h2 ng-if="viewState.receipt">Invoice details for this receipt</h2>\n        <div class="invoice__status " ng-if="!viewState.receipt && invoice.status === \'paid\'">\n          <span class="invoice__status-paid">PAID</span><a ng-click="viewState.receipt = true">&nbsp;Show Receipt</a>\n        </div>\n        <div class="invoice__status" ng-if="invoice.status === \'unpaid\'"><span\n            class="invoice__status-unpaid">UNPAID</span>\n        </div>\n        <div class="invoice__status" ng-if="invoice.status === \'void\'"><span class="invoice__status-void">VOID</span>\n        </div>\n        <div class="invoice__status" ng-if="invoice.status === \'draft\'"><span class="invoice__status-draft">DRAFT</span>\n        </div>\n\n        <div class="invoice__print" ng-if="!viewState.receipt">\n          <button class="btn btn-siteform" ng-click="printInvoice()">Print This Invoice</button>\n        </div>\n      </div>\n      <div class="invoice__meta">\n        <div><b>Invoice Number:</b> {{invoice.number}}</div>\n        <div><b>Invoice Date:</b> {{invoice.dateOfIssue}}</div>\n      </div>\n      <div class="clearfix">\n        <div class="invoice__address l-customer">\n          <div class="l-customer">To:</div>\n          <div class="l-name" ng-if="invoice.customer.organization">{{invoice.customer.organization}}</div>\n          <div class="l-name" ng-if="!invoice.customer.organization">{{invoice.customer.name}}</div>\n          <div ng-if="invoice.address">\n            <div class="">{{invoice.address.line1}}</div>\n            <div class="">{{invoice.address.line2}}</div>\n            <div class="">{{invoice.address.city}}</div>\n            <div class="">{{invoice.address.state}}</div>\n            <div class="">{{invoice.address.postalCode}}</div>\n            <div class="">{{invoice.address.country}}</div>\n          </div>\n          <div class="l-vatno" ng-if="invoice.customer.vatNumber"><b>VAT Registration Number</b>\n            {{invoice.customer.vatNumber}}\n          </div>\n        </div>\n\n        <div class="invoice__address l-supplier">\n          <div class="l-customer">From:</div>\n          <div class="l-name" ng-if="invoice.supplier.organization">{{invoice.supplier.organization}}</div>\n          <div class="l-name" ng-if="!invoice.supplier.organization">{{invoice.supplier.name}}</div>\n          <div class="">{{invoice.supplier.address_line1}}</div>\n          <div class="">{{invoice.supplier.address_line2}}</div>\n          <div class="">{{invoice.supplier.address_city}}</div>\n          <div class="">{{invoice.supplier.address_state}}</div>\n          <div class="">{{invoice.supplier.address_zip}}</div>\n          <div class="">{{invoice.supplier.address_country}}</div>\n          <div class="l-vatno" ng-if="invoice.supplier.vatNumber"><b>VAT Registration Number</b>\n            {{invoice.supplier.vatNumber}}\n          </div>\n        </div>\n      </div>\n\n      <div class="invoice__gap"></div>\n\n      <table class="invoice__balance">\n        <tr>\n          <td>Initial Account Balance:</td>\n          <td>{{invoice.startBalance}}</td>\n        </tr>\n        <tr>\n          <td>Final Account Balance:</td>\n          <td>{{invoice.endBalance}}</td>\n        </tr>\n      </table>\n\n\n      <div class="invoice__gap"></div>\n\n      <table class="invoice__items">\n        <thead>\n        <tr>\n          <td class="l-label">Description</td>\n          <td class="l-label">Net Price</td>\n          <td class="l-label">Tax Rate</td>\n          <td class="l-label">Tax Amount</td>\n          <td class="l-label">Gross Price</td>\n        </tr>\n        </thead>\n        <tbody>\n        <tr ng-repeat="item in invoice.items">\n          <td class="l-text">{{item.description}}</td>\n          <td>{{item.netAmount}}</td>\n          <td>{{item.taxRate}}</td>\n          <td>{{item.taxAmount}}</td>\n          <td>{{item.grossAmount}}</td>\n        </tr>\n        <tr class="l-gaprow"></tr>\n        <tr>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-text l-label">Net Total</td>\n          <td>{{invoice.netTotal}}</td>\n        </tr>\n        <tr ng-if="invoice.hasDiscount">\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-text l-label">Discount</td>\n          <td>{{invoice.discount}}</td>\n        </tr>\n        <tr>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-text l-label">Tax Total</td>\n          <td>{{invoice.taxTotal}}</td>\n        </tr>\n        <tr ng-if="invoice.usedBalance > 0">\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-text l-label">Credit From Account Balance</td>\n          <td class="">{{invoice.balanceCredit}}</td>\n        </tr>\n        <tr ng-if="invoice.usedBalance < 0">\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-text l-label">Credit To Account Balance</td>\n          <td class="">{{invoice.balanceCredit}}</td>\n        </tr>\n        <tr>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-hidden"></td>\n          <td class="l-text l-label l-gross">Invoice Total</td>\n          <td class="l-gross">{{invoice.grossTotal}}</td>\n        </tr>\n        </tbody>\n      </table>\n      <div class="invoice__currency">Invoice Currency: {{invoice.currencyDesc}}</div>\n    </div>\n  </div>\n</div>\n'},8732(e){e.exports='<div class="siteform-background">\n  <div class="invoice__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <button ng-click="retryPayment()">Make a payment</button>\n\n  </div>\n</div>\n'},3520(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fLogin" novalidate role="form">\n      <div ng-init="forms.fLogin = fLogin"></div>\n      <legend>Sign in to Tockify</legend>\n      <fieldset>\n        \x3c!--<div class="bs-callout bs-callout-primary">--\x3e\n        \x3c!--<h4>Email confirmation required</h4>--\x3e\n        \x3c!--After you make this change we will send a confirmation email to your--\x3e\n        \x3c!--new address. The update won\'t occur until you confirm.--\x3e\n        \x3c!--</div>--\x3e\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fLogin.email.$invali
2d && !fLogin.email.$pristine}">\n          <label class="control-label" for="uEmail">Your email address</label>\n          <input autocapitalize="none" autocorrect="off" class="form-control input--tlg" id="uEmail"\n                 name="email" ng-model="login.email" autocomplete="email"\n                 placeholder="email address" required server-error type="text">\n\n          <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fLogin.email.$invalid && fLogin.email.$dirty,\n      \'glyphicon-ok\':fLogin.email.$valid\n       }"></span>\n\n          <span class="help-block"\n                ng-show="fLogin.email.$dirty && fLogin.email.$error.required">Please provide your email address</span>\n          <span class="help-block"\n                ng-show="fLogin.email.$error.serverError">{{serverErrors.email}}</span>\n\n\n        </div>\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fLogin.password.$invalid && !fLogin.password.$pristine}">\n          <label class="control-label" for="uOld">Your Password</label>\n          <input class="form-control input--tlg" id="uOld" name="password" ng-model="login.password"\n                 placeholder="password" required server-error type="password" autocomplete="current-password">\n          <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fLogin.password.$invalid && fLogin.password.$dirty,\n      \'glyphicon-ok\':fLogin.password.$valid\n       }"></span>\n\n          <span class="help-block" ng-show="fLogin.password.$dirty && fLogin.password.$error.required">Please provide your password</span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <div class="help-block--bright"\n               ng-show="fLogin.password.$error.serverError">{{serverErrors.password}}\n          </div>\n        </div>\n      </fieldset>\n\n      <div class="help-block--bright"\n           ng-show="serverErrors.form">{{serverErrors.form.message}}\n      </div>\n\n\n      <div class="siteform__buttons login__buttons clearfix">\n        <button class="btn btn-siteform btn-lg login__buttons__left" ng-click="tryLogin()" type="button">Sign\n          in\n        </button>\n        <a class="btn btn-default btn-lg login__buttons__right" ui-sref="siteform.register">Need an\n          account?</a>\n      </div>\n\n      <div class="siteform__footerlink">\n        <a target="_self" ui-sref="siteform.forgotPassword">Forgotten your password?</a>\n      </div>\n\n    </form>\n\n  </div>\n</div>\n'},2588(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <form name="fMFALogin" novalidate role="form">\n      <div ng-init="setForm(fMFALogin)"></div>\n\n      <div ng-if="params.email">\n        <legend>Login Email sent</legend>\n        <div>\n          <p>\n            A link to complete your login has been sent to <u>{{params.email}}</u> and should arrive soon.\n          </p>\n          <p>\n            You may need to refresh your inbox or check spam folders if it has not arrived within a few minutes.\n          </p>\n          <p>\n            If you can\'t access your email, you can\n            <a ng-click="showRecoveryDialog=!showRecoveryDialog">login using a recovery code</a>.\n          </p>\n        </div>\n\n        <div ng-show="showRecoveryDialog">\n          <p>\n            When you enabled Multi-Factor Authentication, you should have saved some recovery codes\n            that you can use to login even if you can\'t access your email\n            or didn\'t receive the recovery link.\n          </p>\n\n          <div\n              ng-class="{\'form-group has-feedback\':true, \'has-error\':fMFALogin.recoveryCode.$invalid && !fMFALogin.recoveryCode.$pristine}">\n            <label class="control-label" for="mfaCode">Recovery code</label>\n            <input class="form-control input--tlg" id="mfaCode" name="recoveryCode" ng-model="mfaLogin.code"\n                   placeholder="1a2bc-3d4e5" required server-error type="text">
2\n            <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fMFALogin.recoveryCode.$invalid && fMFALogin.recoveryCode.$dirty,\n      \'glyphicon-ok\':fMFALogin.recoveryCode.$valid\n       }"></span>\n            <span class="help-block"\n                  ng-show="fMFALogin.recoveryCode.$dirty && fMFALogin.recoveryCode.$error.required">Please enter one of your recovery codes</span>\n            <div style="position: relative;top:5px; color:#666">For security reasons each recovery code can only be used\n              once\n            </div>\n            <div class="help-block--bright"\n                 ng-show="fMFALogin.recoveryCode.$error.serverError">{{serverErrors.recoveryCode}}\n            </div>\n          </div>\n\n          <div class="help-block--bright"\n               ng-show="serverErrors.form">{{serverErrors.form.message}}\n          </div>\n\n          <div class="siteform__buttons login__buttons clearfix">\n            <button type="button"\n                    class="btn btn-siteform btn-lg login__buttons__left"\n                    ng-click="tryRecover()"\n            >Use Recovery Code\n            </button>\n          </div>\n\n        </div>\n      </div>\n\n      <div ng-if="params.token && !params.enable">\n        <legend>Complete login to Tockify</legend>\n        <p>\n          This link can only be used once and will expire shortly.\n        </p>\n        <div class="siteform__buttons login__buttons clearfix">\n          <button type="button"\n                  class="btn btn-siteform btn-lg siteform__buttons__fill"\n                  ng-click="performAction()">Complete Login\n          </button>\n        </div>\n      </div>\n\n      <div ng-if="params.token && params.enable">\n        <legend>Complete Multi Factor Authentication Setup</legend>\n        <p>\n          We have now verified the email address where MFA login links will be sent.\n          Click below to enable MFA.\n        </p>\n        <div class="siteform__buttons login__buttons clearfix">\n          <button type="button"\n                  class="btn btn-siteform btn-lg siteform__buttons__fill"\n                  ng-click="performAction()">Enable MFA\n          </button>\n        </div>\n      </div>\n\n    </form>\n\n  </div>\n</div>\n'},8054(e){e.exports='<div class="siteform-background">\n\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>We didn\'t recognize that link</h1>\n\n    <p>The most common reasons for this are that it\'s been used before, is too old to use, or has been copied\n      incorrectly.</p>\n\n    <p class="site-notice__footnote">You can get more help from\n      <a href="mailto:[email protected]?subject=bad%20confirm%20token">[email protected]</a>\n    </p>\n  </div>\n</div>\n'},2907(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Subscription Cancelled</h1>\n\n    <p>Your Tockify subscription has now been cancelled. You will still be able to use all of your plan\'s\n      features until the end of the period you have already paid for.</p>\n\n    <p>At the end of the current billing period your account will revert to the free features only.</p>\n\n  </div>\n</div>\n'},3018(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Payment Card Changed</h1>\n\n    <p>You have successfully changed the payment card used by your Tockify account. From now on all\n      charges will use the new card.</p>\n\n    <p>You can check your card and other subscription details in the <a ui-sref="settings.account">Account Settings</a>\n    </p>\n\n  </div>\n</div>\n'},9584(e){e.exports="<div class=\"siteform-background\">\n  <div class=\"site-notice site__focusbox\">\n    <span class=\"flaticon-tcal2 r4\"></span>\n    <span class=\"flaticon-clock148 r8\"></span>\n\n    <div class=\"tockify-logo__wrap\">\n      <a class=\"tockify-logo tockify-logo--siteform\" href=\"/\">Tockify</a>\n    </div>\n\n    <h1>You have closed your account</h1>\n\n    <p>We're sorry to see you go. All of your calendars have been deactivated and you will no longer be able to log\n      in.</p>\n\n\n    <p> If you&apos;ve change your mind contact us <b>soon</b> at\n      <a href=\"mailto:[email protected]?subject=closed%20account\">[email protected]</a>\n    </p>\n\n\n    \x3c!--<div id=\"wufoo-qld6jea0zsuf6k\"></div>--\x3e\n    \x3c!--<script type=\"text/javascript\">var qld6jea0zsuf6k;(function(d, t) {--\x3e\n    \x3c!--var s = d.createElement(t), options = {--\x3e\n    \x3c!--'userName':'tockify',--\x3e\n    \x3c!--'formHash':'qld6jea0zsuf6k',--\x3e\n    \x3c!--'autoResize':true,--\x3e\n    \x3c!--'height':'590',--\x3e\n    \x3c!--'async':true,--\x3e\n    \x3c!--'host':'wufoo.com',--\x3e\n    \x3c!--'header':'show',--\x3e\n    \x3c!--'ssl':true};--\x3e\n    \x3c!--s.src = ('https:' == d.location.protocol ? 'https://' : 'http://') + 'www.wufoo.com/scripts/embed/form.js';--\x3e\n    \x3c!--s.onload = s.onreadystatechange = function() {--\x3e\n    \x3c!--var rs = this.readyState; if (rs) if (rs != 'complete') if (rs != 'loaded') return;--\x3e\n    \x3c!--try { qld6jea0zsuf6k = new WufooForm();qld6jea0zsuf6k.initialize(options);qld6jea0zsuf6k.display(); } catch (e) {}};--\x3e\n    \x3c!--var scr = d.getElementsByTagName(t)[0], par = scr.parentNode; par.insertBefore(s, scr);--\x3e\n    \x3c!--})(document, 'script');<\/script>--\x3e\n\n    \x3c!--</div>--\x3e\n  </div>\n"},8753(e){e.exports='<div class="siteform-background">\n\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Email Address Changed</h1>\n\n    <p>Your account\'s email address has been updated</p>\n\n    <p>You can confirm this in your <a ui-sref="settings.account">Account Settings</a></p>\n\n    <p class="site-notice__footnote">You can get more help from\n      <a href="mailto:[email protected]?subject=email%20change">[email protected]</a>\n    </p>\n  </div>\n</div>\n'},4910(e){e.exports='<div class="siteform-background">\n\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Email Address Verified</h1>\n\n    <p>Your account\'s email address has been verified</p>\n\n    <p>Thank you</p>\n\n    <p class="site-notice__footnote">You can get help from\n      <a href="mailto:[email protected]?subject=email%20verify">[email protected]</a>\n    </p>\n  </div>\n</div>\n'},870(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Goodbye for now</h1>\n\n    <p>You have signed out of Tockify. See you again soon.</p>\n\n    <p><a ui-sref="site">Back To Tockify</a></p>\n\n  </div>\n</div>\n'},4043(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Password Changed</h1>\n\n    <p>Your password has been successfully updated</p>\n\n    <p><a ui-sref="site">Back To Tockify</a></p>\n\n  </div>\n</div>\n'},7794(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Please check your email</h1>\n\n    <p>We\'ve just sent an email to <span class="site-notice__email">{{email}}</span> with a link you can click on to\n      confirm your email address and get started.</p>\n\n    <p class="site-notice__footnote">If it doesn\'t come in the next few minutes please check your spam folder to\n      make sure it didn\'t get lost. If it\'s not there and 
2you\'re sure you used the right email address contact\n      <a href="mailto:[email protected]?subject=new%20calendar%20feedback">[email protected]</a> for more help.\n      (we\'re usually quick to respond).\n    </p>\n  </div>\n</div>\n'},9946(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Password reset email sent</h1>\n\n    <p>We\'ve just sent an email to <span class="site-notice__email">{{email}}</span> with a link you can use to reset\n      your Password.</p>\n\n    <p class="site-notice__footnote">If it doesn\'t come in the next few minutes please check your spam folder to\n      make sure it didn\'t get lost. If it\'s not there and you\'re sure you used the right email address contact\n      <a href="mailto:[email protected]?subject=password%20reset">[email protected]</a> for more help.\n      (we\'re usually quick to respond).\n    </p>\n  </div>\n</div>\n'},3299(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Thank You</h1>\n\n    <p>You have successfully subscribed to Tockify Calendar and can now enjoy all of\n      the benefits of your <b>\n        <span ng-if="quantity !== \'1\'">{{quantity}} calendar </span> {{kindName}}</b> subscription</p>\n\n    <p>You can check your subscription details in the <a ui-sref="settings.account">Account Settings</a></p>\n\n  </div>\n</div>\n'},9119(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Thank You</h1>\n\n    <p>Your {{kindName}} trial period has now started - enjoy all the new features</p>\n\n    <p>You can check your subscription details in the <a ui-sref="settings.account">Account Settings</a></p>\n\n  </div>\n</div>\n'},4893(e){e.exports='<div class="siteform-background">\n\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Unknown User</h1>\n\n    <p>We couldn\'t find an account with that email address - have you closed your account?</p>\n\n    <p class="site-notice__footnote">You can get more help from\n      <a href="mailto:[email protected]?subject=unknown%20user">[email protected]</a>\n    </p>\n  </div>\n</div>\n'},1857(e){e.exports='<div class="siteform-background">\n\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>You have been unsubscribed</h1>\n\n    <p>You will no longer receive emails from us about product releases and updates.</p>\n\n    <p class="site-notice__footnote">You can get more help from\n      <a href="mailto:[email protected]?subject=bad%20confirm%20token">[email protected]</a>\n    </p>\n  </div>\n</div>\n'},6229(e){e.exports='<div class="siteform-background">\n\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>You have been unsubscribed</h1>\n\n    <p>You will no longer receive emails from us about your trial.</p>\n\n    <p class="site-notice__footnote">You can get more help from\n      <a href="mailto:[email protected]?subject=bad%20confirm%20token">[email protected]</a>\n    </p>\n  </div>\n</div>\n'},9192(e){e.exports='<div class="siteform-background">\n  <div class="site-notice site__focusbox">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <h1>Thank You</h1>\n\n    <p>You have successfully updated your Tockify Calendar subscription.</p>\n\n    <p>You can check your new subscription details in the <a ui-sref="settings.account">Account Settings</a></p>\n\n  </div>\n</div>\n'},8660(e){e.exports='<div class="planPicker__background ">\n  <div class="planPicker__homelink">\n    <a href="site" ui-sref="site">Back To Tockify</a>\n  </div>\n  <div class="container-fluid">\n    <div class="row">\n\n      <h1 class="planPicker__title">Pick the plan that\'s right for you</h1>\n      <h2 class="planPicker__subtitle">Save money with an annual plan</h2>\n      <div style="text-align: center;padding-top:1em">\n        <a ng-if="paid" href="" class="btn btn-lg btn-siteform--pink" ui-sref="siteform.updateSubscription">View or\n          Change Your Subscription</a>\n      </div>\n      <div class="planPicker__switcher">\n        <div aria-label="..." class="btn-group" role="group">\n          <button ng-class="{\'btn btn-lg planPicker__switcher__btn\':true,\n                           \'btn-default\':(plan.interval!==\'month\'),\n                            \'btn-siteform\':(plan.interval===\'month\')\n                           }"\n                  ng-click="plan.interval=\'month\'"\n                  type="button">Monthly Plans\n          </button>\n          <button ng-class="{\'btn btn-lg planPicker__switcher__btn\':true,\n                            \'btn-default\':(plan.interval!==\'year\'),\n                            \'btn-siteform\':(plan.interval===\'year\')\n                           }"\n                  ng-click="plan.interval=\'year\'"\n                  type="button">Annual Plans\n          </button>\n        </div>\n        <div class="planPicker__switcher__country">\n          <form class="inline-form">\n            <select class="form-control" ng-model="plan.ccode" ng-options="cc.c as cc.n for cc in ccs">\n            </select>\n          </form>\n        </div>\n      </div>\n    </div>\n\n    <div class="row planPicker__boxes">\n      <div class="col-md-3">\n        <div class="planPicker__box  planPicker__box--left">\n          <div class="planPicker__box__content">\n            <div class="planPicker__box__header">\n              <div class="planPicker__price">
2\n                <span class="planPicker__price__currency">{{currency.major}}</span>\n                <span class="planPicker__price__amount">0</span>\n                <span class="planPicker__price__interval">/{{plan.interval}}</span>\n              </div>\n              <div class="planPicker__name">free</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li ng-if="!paid">\n                \x3c!--<button ng-click="startTrial(\'free\')"  class="btn btn-siteform btn-lg btn-block">--\x3e\n                \x3c!--<div class="planPicker__btn-label">Get Started Today</div>--\x3e\n                \x3c!--<span class="planPicker__btn-sublabel">Just the essentials</span>--\x3e\n                \x3c!--</button>--\x3e\n                <div class="planPicker__pseudobutton-free">\n                  <div class="planPicker__btn-label">Just The Essentials</div>\n                </div>\n              </li>\n              <li><b>Agenda Style</b> Calendar</li>\n              <li>Attractive Default Theme</li>\n              <li>No Event History</li>\n              <li><b>2000</b> views/month<sup>*</sup></li>\n              <li><b>Prominent</b> Tockify Branding</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-3">\n        <div class="planPicker__box planPicker__box--big">\n          <div class="planPicker__box__content">\n            <div class="planPicker__notice">Best for small organizations</div>\n            <div class="planPicker__box__header">\n              <div class="planPicker__price">\n                <span class="planPicker__price__currency">{{currency.major}}</span>\n                <span class="planPicker__price__amount">8{{plan.interval === \'year\' ? \'0\' : \'\'}}</span>\n                <span class="planPicker__price__interval">/{{plan.interval}}</span>\n              </div>\n              <div class="planPicker__name">premium</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li ng-if="!paid"><a class="btn btn-siteform--pink btn-lg btn-block"\n                                   ui-sref="siteform.checkout({kind:\'premium\',interval:plan.interval,ccode:plan.ccode})">\n                <div class="planPicker__btn-label">Sign Up Now</div>\n\n              </a></li>\n              <li>All Free Features</li>\n              <li><b>Pinboard</b> Style Calendar</li>\n              <li><b>Month</b> Style Calendar</li>\n              <li><b>Mini Calendar</b> for small spaces</li>\n              <li><b>Customize</b> to match your site</li>\n              <li><b>20,000</b> views/month<sup>*</sup></li>\n              <li><b>Minimal</b> Tockify Branding</li>\n              <li>Sync with <b>Google Calendar</b></li>\n              <li>Accept <b>submitted</b> events</li>\n              <li>Create <b>repeating</b> events</li>\n              <li>Add <b>YouTube</b> or <b>Vimeo</b> videos</li>\n              <li>Use your own <b>fonts</b></li>\n              <li>Add <b>attachments</b> to events</li>\n              <li>Promotion & RSVP <b>buttons</b></li>\n              \x3c!--<li>Embed <b>Videos</b> From YouTube etc.</li>--\x3e\n              <li>iCalendar support</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-3">\n        <div class="planPicker__box planPicker__box--right">\n          <div class="planPicker__box__content">\n            <div class="planPicker__box__header">\n              <div class="planPicker__price">\n                <span class="planPicker__price__currency">{{currency.major}}</span>\n                <span class="planPicker__price__amount">40{{plan.interval === \'year\' ? \'0\' : \'\'}}</span>\n                <span class="planPicker__price__interval">/{{plan.interval}}</span>\n              </div>\n              <div class="planPicker__name">white label</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li ng-if="!paid"><a class="btn btn-siteform btn-lg btn-block"\n                                   ui-sref="siteform.checkout({kind:\'white.label\',interval:plan.interval,ccode:plan.ccode})">\n                <div class="planPicker__btn-label">Sign Up Now</div>\n              </a></li>\n              <li>All Premium features</li>\n              <li><b>200,000</b> views/month<sup>*</sup></li>\n              <li><b>White Label</b> (no Tockify branding)</li>\n              <li>Your <b>domain name</b> in event links</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n\n      <div class="col-md-3">\n        <div class="planPicker__box planPicker__box--right">\n          <div class="planPicker__box__content">\n            <div class="planPicker__box__header">\n              <div class="planPicker__more">need something else?</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li><a class="btn btn-siteform btn-lg btn-block"\n                     href="mailto:[email protected]?subject=question%20about%20plans">\n                <div class="planPicker__btn-label">Get In Touch</div>\n              </a></li>\n              <li>Support Plans</li>\n              <li>Alternate Payment Methods</li>\n              <li>Web Agency Questions</li>\n              <li>Higher Limits</li>\n              <li>High volume conference plans</li>\n              <li>Dedicated Hosting</li>\n              <li>Custom Integrations</li>\n              <li>Assisted Install</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n    </div>\n    <div class="row planPicker__notes">\n      <div class="l-footnote">* Paying subscribers will always be given plenty of warning when limits are exceeded.\n      </div>\n    </div>\n  </div>\n</div>\n\n'},8667(e){e.exports='<div class="tkf-body tkf-popup big-popup">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Card Declined</h3>\n\n    <form class="popup-body" name="fThemeNotice" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>Your payment card was declined</h4>\n        <p>\n          We don\'t know why this happened, but its usually just your bank being over-cautious and classifying the\n          payment\n          as a suspicious transaction.\n        </p>\n        <p>It\'s easy to fix by giving your bank a call.</p>\n        <p>At present no payment has been made and we do not have your card on file.</p>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="popup.closeIfCloseable()" type="button">Close</button>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},9697(e){e.exports='<div class="tkf-body tkf-popup big-popup">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Incorrect Zip/Post code</h3>\n\n    <form class="popup-body" name="fThemeNotice" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>Your zip/post code was rejected by your bank</h4>\n        <p>\n          This is often just caused by a simple typo, but occasionally banks use it when there\'s another problem with\n          the address.\n        </p>\n        <p>If you have multiple payment cards you should double check that the address you are using\n          is the right one for the card you are trying.</p>\n        <p>Also, if you have just changed address it can take a while for your bank\'s internal systems to catch up.</p>\n        <p>If none of this helps a call to your bank will usually resolve the problem.</p>\n        <p>At present no payment has been made and we do not have your card on file.</p>\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="popup.closeIfCloseable()" type="button">Close</button>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},5087(e){e.exports='<div class="tkf-body tkf-popup big-popup">\n  <div class="close-bar"><i class="flaticon-close-1"></i></div>\n  <div class="popup-content" ng-click="$event.stopPropagation()">\n    <h3>Payment Incomplete</h3>\n\n    <form class="popup-body" name="fThemeNotice" novalidate role="form">\n\n      <div class="bs-callout bs-callout-danger">\n        <h4>We weren\'t able to collect payment for this change because your bank declined the charge</h4>\n\n        <p>You can try again here: <a ui-sref=\'{{"siteform.invoice({id:\\""+ popup.tparams.invoiceId +"\\"})"}}\'>View\n          Invoice And Pay</a></p>\n\n      </div>\n\n      <div class="popup-buttons">\n        <button class="btn btn-default" ng-click="popup.closeIfCloseable()" type="button">Close</button>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n\n'},1696(e){e.exports='<div class="siteform-background">\n  \x3c!--<img class="l-image-right" ng-src="/assets/images/pinbig.png">--\x3e\n\n  <div class="register__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fRegister" novalidate role="form">\n      <div ng-init="forms.fRegister = fRegister"></div>\n      \x3c!-- Honeypot: hidden from real users; bots that fill it are silently dropped server-side --\x3e\n      <input type="text" name="website" ng-model="register.website" tabindex="-1"\n             autocomplete="off" aria-hidden="true"\n             style="position:absolute; left:-9999px; top:-9999px; width:1px; height:1px; opacity:0;">\n\n      <legend ng-if="register.plan === \'free\'">Join to get your free calendar</legend>\n      <legend ng-if="userPickedPlan && register.plan === \'premium\'">Start your <span class="label label-siteform">Premium</span>\n        trial\n      </legend>\n      <legend ng-if="!userPickedPlan">Join for free to get your calendar</legend>\n      <legend ng-if="register.plan === \'white.label\'">Start your <span class="label label-siteform">White Label</span>\n        trial\n      </legend>\n      <fieldset>\n        \x3c!--<div class="bs-callout bs-callout-primary">--\x3e\n        \x3c!--<h4>Email confirmation required</h4>--\x3e\n        \x3c!--After you make this change we will send a confirmation email to your--\x3e\n        \x3c!--new address. The update won\'t occur until you confirm.--\x3e\n        \x3c!--</div>--\x3e\n\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fRegister.ffname.$invali
2d && !fRegister.ffname.$pristine}">\n          <label class="control-label" for="uName">Your name - so we know what to call you</label>\n          <input class="form-control" id="uName" name="ffname" ng-model="register.name"\n                 placeholder="full name" required server-error type="text">\n          <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fRegister.ffname.$invalid && fRegister.ffname.$dirty,\n      \'glyphicon-ok\':fRegister.ffname.$valid\n       }"></span>\n          <span class="help-block"\n                ng-show="fRegister.ffname.$dirty && fRegister.ffname.$error.required">Please tell us your name</span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <span class="help-block"\n                ng-show="register.name && fRegister.ffname.$error.serverError">{{serverErrors.name}}</span>\n        </div>\n\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fRegister.ffemail.$invalid && !fRegister.ffemail.$pristine}">\n          <label class="control-label" for="uEmail">Your email address</label>\n          <input autocapitalize="none" autocorrect="off" class="form-control input--tlg"\n                 id="uEmail" name="ffemail"\n                 ng-blur="doMailCheck()"\n                 ng-focus="clearMailCheck()"\n                 ng-model="register.email"\n                 placeholder="email address" required server-error type="text">\n\n          <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fRegister.ffemail.$invalid && fRegister.ffemail.$dirty,\n      \'glyphicon-ok\':fRegister.ffemail.$valid\n       }"></span>\n          <span class="help-block"\n                ng-show="fRegister.ffemail.$dirty && fRegister.ffemail.$error.email">{{viewState.emailErrorMessage}}</span>\n\n          <div class="help-block--suggest"\n               ng-show="mailCheckSuggestion"><h4>Did you mean</h4>\n\n            <h3>{{mailCheckSuggestion}}?</h3> <br>\n            <a class="btn btn-default btn-sm" href=""\n               ng-click="register.email = mailCheckSuggestion;doMailCheck()">Yes - change it</a>\n            <a class="btn btn-default btn-sm" href="" ng-click="clearMailCheck()">No - leave it alone</a>\n          </div>\n\n          <span class="help-block"\n                ng-show="fRegister.ffemail.$dirty && fRegister.ffemail.$error.required">Please provide your email address</span>\n          <span class="help-block"\n                ng-show="register.email && fRegister.ffemail.$error.serverError">{{serverErrors.email}}</span>\n        </div>\n\n        <div\n            ng-class="{\'form-group has-feedback\':true, \'has-error\':fRegister.ffpassword.$invalid && !fRegister.ffpassword.$pristine}">\n          <label class="control-label" for="uOld">Pick a Password</label>\n          <input class="form-control input--tlg" id="uOld" name="ffpassword"\n                 ng-model="register.password"\n                 placeholder="password" required server-error type="password">\n          <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fRegister.ffpassword.$invalid && fRegister.ffpassword.$dirty,\n      \'glyphicon-ok\':fRegister.ffpassword.$valid\n       }"></span>\n\n          <span class="help-block" ng-show="fRegister.ffpassword.$dirty && fRegister.ffpassword.$error.required">\n          Please pick a password</span>\n          \x3c!-- use server error directive here to clear on edit --\x3e\n          <div class="help-block"\n               ng-show="register.password && fRegister.ffpassword.$error.serverError">\n            {{serverErrors.password}}\n          </div>\n        </div>\n\n        <div class="checkbox">\n          <label>\n            <input name="acceptLicense" ng-model="register.acceptLicense"\n                   server-error type="checkbox"> I accept the Tockify <a target="tkf_tos"\n                                                                         ui-sref="docs.inter.company.tos">Terms\n            of Service</a>\n          </label>\n\n          <div class="help-block--bright"\n               ng-show="fRegister.acceptLicense.$error.serverError">{{serverErrors.acceptLicense}}\n          </div>\n        </div>\n\n        \x3c!--<div class="checkbox">--\x3e\n        \x3c!--<label>--\x3e\n        \x3c!--<input type="checkbox" name="acceptMail" ng-model="register.acceptMail"> Keep me informed about--\x3e\n        \x3c!--changes to Tockify (no spam ever)--\x3e\n        \x3c!--</label>--\x3e\n        \x3c!--</div>--\x3e\n\n      </fieldset>\n\n      <div class="help-block--bright"\n           ng-show="serverErrors.form">{{serverErrors.form}}\n      </div>\n\n\n      <div class="siteform__buttons clearfix">\n        <button class="btn btn-siteform btn-lg siteform__buttons__fill" ng-click="tryRegister()" type="button">\n          Join Tockify and Create a Calendar\n        </button>\n      </div>\n\n      <div class="siteform__footerlink">\n        <a ui-sref="siteform.login">I already have an account</a>\n      </div>\n\n    </form>\n\n  </div>\n\n</div>\n\n\n'},4462(e){e.exports='<div class="siteform-background">\n  <div class="signup__form site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n    <form name="fResetPassword" novalidate role="form">\n      <div ng-if="!token">\n        <div ng-init="forms.fResetPassword = fResetPassword"></div>\n        <fieldset>\n          <legend>Choose a new password</legend>\n          <div\n              ng-class="{\'form-group has-feedback\':true, \'has-error\':fResetPassword.password1.$invalid && !fResetPassword.password1.$pristine}">\n            <label class="control-label">Your new password</label>\n            <input class="form-control input--tlg" name="password1" ng-model="resetPassword.password1"\n                   placeholder="new password"\n                   required server-error type="password">
2\n            <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fResetPassword.password1.$invalid && fResetPassword.password1.$dirty,\n      \'glyphicon-ok\':fResetPassword.password1.$valid\n       }"></span>\n\n            <span class="help-block"\n                  ng-show="fResetPassword.password1.$dirty && fResetPassword.password1.$error.required">Please choose a password</span>\n            \x3c!-- use server error directive here to clear on edit --\x3e\n            <div class="help-block"\n                 ng-show="fResetPassword.password1.$error.serverError">{{serverErrors.password1}}\n            </div>\n          </div>\n\n          <div\n              ng-class="{\'form-group has-feedback\':true, \'has-error\':fResetPassword.password2.$invalid && !fResetPassword.password2.$pristine}">\n            <label class="control-label">Confirm your new password</label>\n            <input class="form-control input--tlg" name="password2" ng-model="resetPassword.password2"\n                   placeholder="confirm password"\n                   required server-error type="password">\n            <span ng-class="{\'glyphicon form-control-feedback\':true,\n      \'glyphicon-remove\':fResetPassword.password2.$invalid && fResetPassword.password2.$dirty,\n      \'glyphicon-ok\':fResetPassword.password2.$valid\n       }"></span>\n\n            <span class="help-block"\n                  ng-show="fResetPassword.password2.$dirty && fResetPassword.password2.$error.required">Please confirm your password</span>\n            \x3c!-- use server error directive here to clear on edit --\x3e\n            <div class="help-block"\n                 ng-show="fResetPassword.password2.$error.serverError">{{serverErrors.password2}}\n            </div>\n          </div>\n\n\n        </fieldset>\n\n        <div class="help-block--bright"\n             ng-show="serverErrors.form">{{serverErrors.form.message}}\n        </div>\n\n        <div class="siteform__buttons login__buttons clearfix">\n          <button type="button"\n                  class="btn btn-siteform btn-lg siteform__buttons__fill"\n                  ng-click="tryResetPassword()">Change Password\n          </button>\n        </div>\n\n      </div>\n\n      <div ng-if="token">\n        <legend>Reset your password</legend>\n        <div class="siteform__buttons login__buttons clearfix">\n          <button type="button"\n                  class="btn btn-siteform btn-lg siteform__buttons__fill"\n                  ng-click="performAction()">Click Here To Reset\n          </button>\n        </div>\n        <div style="position: relative;top:5px; color:#666" >For security reasons this can only be used once</div>\n\n      </div>\n\n\n    </form>\n\n  </div>\n</div>\n'},1736(e){e.exports='<div class="planPicker__background ">\n  \x3c!--<div class="corner-blue">--\x3e\n  \x3c!--<span class="tockify-logo">Tockify</span>--\x3e\n  \x3c!--</div>--\x3e\n  <div class="planPicker__homelink"><a href="site" ui-sref="site">Back To Tockify</a></div>\n  <div class="container-fluid">\n    <div class="row">\n\n      <h1 class="planPicker__title">Something For Everybody</h1>\n      <h2 class="planPicker__subtitle">Start a 14 day free trial. No credit card required</h2>\n      <div class="planPicker__switcher">\n        <div aria-label="..." class="btn-group" role="group">\n          <button ng-class="{\'btn btn-lg planPicker__switcher__btn\':true,\n                           \'btn-default\':(plan.interval!==\'month\'),\n                            \'btn-siteform\':(plan.interval===\'month\')\n                           }"\n                  ng-click="plan.interval=\'month\'"\n                  type="button">Monthly Plans\n          </button>\n          <button ng-class="{\'btn btn-lg planPicker__switcher__btn\':true,\n                            \'btn-default\':(plan.interval!==\'year\'),\n                            \'btn-siteform\':(plan.interval===\'year\')\n                           }"\n                  ng-click="plan.interval=\'year\'"\n                  type="button">Annual Plans\n          </button>\n        </div>\n        <div class="planPicker__switcher__country">\n          <form class="inline-form">\n            <select class="form-control" ng-model="plan.ccode" ng-options="cc.c as cc.n for cc in ccs">\n            </select>\n          </form>\n        </div>\n      </div>\n    </div>\n\n    <div class="row planPicker__boxes">\n      <div class="col-md-3">\n        <div class="planPicker__box  planPicker__box--left">\n          <div class="planPicker__box__content">\n            <div class="planPicker__box__header">\n              <div class="planPicker__price">
2\n                <span class="planPicker__price__currency">{{currency.major}}</span>\n                <span class="planPicker__price__amount">0</span>\n                <span class="planPicker__price__interval">/{{plan.interval}}</span>\n              </div>\n              <div class="planPicker__name">free</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li>\n                \x3c!--<button ng-click="startTrial(\'free\')"  class="btn btn-siteform btn-lg btn-block">--\x3e\n                \x3c!--<div class="planPicker__btn-label">Get Started Today</div>--\x3e\n                \x3c!--<span class="planPicker__btn-sublabel">Just the essentials</span>--\x3e\n                \x3c!--</button>--\x3e\n                <button class="btn btn-default btn-lg btn-block" ng-click="noFreeStart()" type="button">\n                  <div class="planPicker__btn-label">Just The Essentials</div>\n                  <span class="planPicker__btn-sublabel">start with a trial - go free after</span>\n                </button>\n              </li>\n              <li><b>Agenda</b> Style Calendar</li>\n              <li>Attractive Theme</li>\n              <li><b>Unlimited</b> events</li>\n              <li><b>Powerful</b>, flexible editor</li>\n              <li>Very <b>easy</b> to use</li>\n              <li>Event <b>Images</b></li>\n              <li>Great <b>mobile</b> experience</li>\n              <li><b>Fast</b>, intuitive interface</li>\n              <li>Works <b>anywhere</b></li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-3">\n        <div class="planPicker__box planPicker__box--big">\n          <div class="planPicker__box__content">\n            <div class="planPicker__notice">Best for small organizations</div>\n            <div class="planPicker__box__header">\n              <div class="planPicker__price">\n                <span class="planPicker__price__currency">{{currency.major}}</span>\n                <span class="planPicker__price__amount">8{{plan.interval === \'year\' ? \'0\' : \'\'}}</span>\n                <span class="planPicker__price__interval">/{{plan.interval}}</span>\n              </div>\n              <div class="planPicker__name">premium</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li>\n                <button class="btn btn-siteform--pink btn-lg btn-block" ng-click="startTrial(\'premium\')" type="button">\n                  <div class="planPicker__btn-label">Try Free For 14 Days</div>\n                  <span class="planPicker__btn-sublabel">No credit card required</span>\n                </button>\n              </li>\n              <li>All Free Features</li>\n              <li><b>Pinboard</b> Style Calendar</li>\n              <li><b>Month</b> Style Calendar</li>\n              <li><b>Mini Calendar</b> for small spaces</li>\n              <li><b>Customize</b> to match your site</li>\n              <li><b>Minimal</b> Tockify Branding</li>\n              <li>Sync with <b>Google Calendar</b></li>\n              <li>Accept <b>submitted</b> events</li>\n              <li>Create <b>repeating</b> events</li>\n              <li>Add <b>YouTube</b> or <b>Vimeo</b> videos</li>\n              <li>Use your own <b>fonts</b></li>\n              <li>Add <b>attachments</b> to events</li>\n              <li>Promotion & RSVP <b>Buttons</b></li>\n              \x3c!--<li>Embed <b>Videos</b> From YouTube etc.</li>--\x3e\n              <li>iCalendar support</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-3">\n        <div class="planPicker__box planPicker__box--right">\n          <div class="planPicker__box__content">\n            <div class="planPicker__box__header">\n              <div class="planPicker__price">\n                <span class="planPicker__price__currency">{{currency.major}}</span>\n                <span class="planPicker__price__amount">40{{plan.interval === \'year\' ? \'0\' : \'\'}}</span>
2\n                <span class="planPicker__price__interval">/{{plan.interval}}</span>\n              </div>\n              <div class="planPicker__name">white label</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li>\n                <button class="btn btn-siteform btn-lg btn-block" ng-click="startTrial(\'white.label\')" type="button">\n                  <div class="planPicker__btn-label">Try Free For 14 Days</div>\n                  <span class="planPicker__btn-sublabel">No credit card required</span>\n                </button>\n              </li>\n              <li>All Premium features</li>\n              \x3c!--<li><b>200,000</b> views/month<sup>*</sup></li>--\x3e\n              <li><b>White Label</b> (no Tockify branding)</li>\n              <li>Your <b>domain name</b> in event links</li>\n              <li><b>Priority</b> support</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-3">\n        <div class="planPicker__box planPicker__box--right">\n          <div class="planPicker__box__content">\n            <div class="planPicker__box__header">\n              <div class="planPicker__more">need something else?</div>\n            </div>\n            <div class="planPicker__divider"></div>\n            <ul class="planPicker__features">\n              <li><a class="btn btn-siteform btn-lg btn-block"\n                     href="mailto:[email protected]?subject=question%20about%20plans">\n                <div class="planPicker__btn-label">Get In Touch</div>\n                <span class="planPicker__btn-sublabel">We\'ll try to help</span>\n              </a></li>\n              <li>Support Plans</li>\n              <li>Agency Questions</li>\n              <li>Bulk Subscriptions</li>\n              <li>Higher Limits</li>\n              <li>High volume conference plans</li>\n              <li>Custom Integrations</li>\n              <li>Assisted Install</li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n    </div>\n    <div class="row planPicker__notes">\n      <div class="l-footnote"></div>\n    </div>\n  </div>\n</div>\n\n'},2053(e){e.exports='<div class="tkf__link-editor">\n  <legend>Please Add A Payment Card</legend>\n\n  <form novalidate>\n\n    <div class="bs-callout bs-callout-danger">\n      <h4>Missing Payment Card</h4>\n      Your account does not have an associated payment card. Please add one before making any changes\n      to your plan.\n    </div>\n    <div class="container-fluid">\n      <a class="btn btn-siteform btn-block" ng-click="closePopup()"\n         ui-sref="siteform.changeCard">Add a payment card</a>\n    </div>\n\n\n  </form>\n\n\n</div>'},5798(e){e.exports='<div class="siteform-background">\n  <div class="checkout__wrap site__focusbox clearfix">\n    <span class="flaticon-tcal2 r4"></span>\n    <span class="flaticon-clock148 r8"></span>\n\n    <div class="tockify-logo__wrap">\n      <a class="tockify-logo tockify-logo--siteform" href="/">Tockify</a>\n    </div>\n\n    <form class="update__form" name="fUpdate" novalidate role="form">\n      <div ng-init="forms.fUpdate = fUpdate"></div>\n      <legend>Change Your Subscription Details Here</legend>\n      <fieldset>\n        <div class="container-fluid">\n          <div class="row">\n            <div class=\'col-md-4 \'>\n              <div class="container-fluid">\n                <div class="row">\n\n                  <div class="form-group">\n                    <label class=\'control-label\'>Plan Type (<a ui-sref="siteform.paidPlanPicker">compare\n                      plans</a>)</label>\n\n\n                    <select class="form-control" ng-model="update.kind"\n                            ng-options="p.value as p.name for p in planKinds"></select>\n                    <span class="help-block">\n                                for {{update.pricePerCalendar}}/{{update.interval}} per calendar\n                                </span>\n\n                  </div>\n\n                  <div class="form-group">\n                    <label class=\'control-label\'>
2Billing Period</label>\n\n\n                    <select class="form-control" ng-model="update.interval"\n                            ng-options="p.value as p.name for p in planIntervals"></select>\n                    <span class="help-block">\n                                    annual plans save you money\n                                         </span>\n\n                  </div>\n\n                  <div class="form-group">\n                    <label class=\'control-label\'>Number of Calendars</label>\n\n\n                    <select\n                        class="form-control" ng-model="update.quantity"\n                        ng-options="q.value as q.name for q in quantities"></select>\n                    <span class="help-block">\n                                         the number of calendars you need\n                                         </span>\n\n                  </div>\n\n                </div>\n              </div>\n            </div>\n            <div class=\'col-md-8\'>\n              <div class="update__plan l-old">\n                <div class="update__plan__title">Your Current Plan</div>\n                <div class="update__plan__description">{{update.oldSubDisplayDescription}}</div>\n                <div>\n                  <span class="label label-danger" ng-if="willCancel">Cancelled</span>\n                </div>\n              </div>\n              <div class="update__plan l-new">\n                <div class="update__plan__title">Your New Plan</div>\n                <div class="update__plan__description" ng-if="hasChange">{{update.newSubDisplayDescription}}</div>\n                <div class="update__plan__description" ng-if="!hasChange">No changes</div>\n              </div>\n              <div class="update__plan__cancel" ng-if="!willCancel"><a ui-sref="siteform.cancelSubscription">click here\n                to cancel your subscription</a></div>\n            </div>\n          </div>\n        </div>\n        <div class="update__plan__divider">\n        </div>\n        <div class="container-fluid">\n          <div class="update__plan__confirm" ng-if="!hasChange">\n            <div class="row">\n\n              <div class=\'col-md-12 \'>\n                <div class="update__total-cost--vat">\n                  You can adjust your plan using the drop-downs above. You\'ll be asked to confirm before we make any\n                  changes.\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class="update__plan__confirm" ng-if="hasChange">\n            \x3c!--\n        <div class="row">\n\n                <div class=\'col-md-12 \'>\n                    <div class="update__total-cost--vat">\n                        <label>New Plan:</label> <span\n                            >{{update.newSubDisplayDescription}} </span>\n\n\n                    </div>\n                </div>\n            </div>\n            --\x3e\n            <div class="row">\n\n              <div class=\'col-md-12 \'>\n                <div class="update__total-cost--vat">\n                  <label>Total Cost Of New Plan: </label><span\n                    class="l-amount"> {{update.formattedCostIncVat}} <span> per {{update.interval}}</span>\n                                </span> <span\n                    ng-if="update.vatRate !== 0"> includes {{update.formattedVatCost}} VAT ({{update.vatRate}}%) </span>\n                  <span class="l-currency-notice" ng-if="update.unsupportedGBP">Charged in British Pounds (GBP)</span>\n                  <span class="l-currency-notice" ng-if="update.unsupportedUSD">Charged in US Dollars (USD)</span>\n                </div>\n              </div>\n            </div>\n            <div class="row">\n              <div class="col-md-12">\n                <div class="update__plan__confirm__notice">\n                  If you confirm this change the updated subscription plan will be available immediately.\n                  The value of any time remaining on your current plan will be credited to your account\n                  for use against future bills. This can\'t be withdrawn as a refund.\n                </div>\n                <div class="update__plan__confirm__warning" ng-if="willCancel">
2\n                  <span class="label label-danger">Warning</span> You have cancelled your current plan.\n                  Changing the plan here will create a new one.\n\n                </div>\n              </div>\n            </div>\n            <div class="row">\n              <div class="col-md-12">\n                <div class="checkout__confirm-box">\n\n\n                  <div ng-class="{\'form-group has-feedback\':true,\n           \'has-error\':fUpdate.agree.$invalid && fUpdate.agree.$dirty}">\n                    <label class="checkbox-inline">\n                      <input name="agree" ng-model="page.agree"\n                             required type="checkbox">\n                      {{\'I have carefully checked my changes and want to update my subscription\' | translate}}\n                    </label>\n                    <div class="help-block--bright"\n                         ng-show="fUpdate.agree.$invalid && fUpdate.agree.$dirty ">\n                      Please check the box above to confirm that you want to update\n                    </div>\n\n                  </div>\n\n                </div>\n              </div>\n            </div>\n            <div class="row">\n              <div class="col-md-12">\n\n                <div class="siteform__buttons clearfix">\n                  <button class="btn btn-siteform btn-lg" ng-click="updateSubscription()" type="button">\n                    Change My Subscription Now\n                  </button>\n                  <span ng-if="page.agree"> Pressing this button will update your subscription immediately</span>\n                  <span ng-if="!page.agree"> Please agree to the update before pressing this button</span>\n                </div>\n\n              </div>\n            </div>\n          </div>\n        </div>\n      </fieldset>\n\n\n    </form>\n\n\n  </div>\n</div>\n\n\n\n'},3330(e){e.exports='<div class="tagEditor">\n  <form ng-submit="addTag()">\n    <div class="tagEditor__tags" dragula=\'"tag-field-bag"\' dragula-model="tags">\n      <div class="tagEditor__tag tag__{{$index}} {{tagEditorId}}" ng-keydown="onDelete($event, tag)"\n           ng-repeat="tag in tags"><span class="tagEditor__tag__text" tabindex="0">{{tag.text}}</span><span\n          class="tagEditor__removeTag" ng-click="removeTag(tag)">×</span></div>\n    </div>\n    <input ng-blur="addTag()" ng-keydown="onDelete($event)"\n           ng-model="viewState.newTag"\n           placeholder="add tag here"\n           size="{{viewState.newTag.length<12?12:viewState.newTag.length+4}}">\n  </form>\n  <div class="tagManager__mirrorContainer"></div>\n</div>'},7132(e){e.exports='<div class="tagManager">\n  <div class="tagManager__top">\n    <div class="tagManager__topControls">\n      <div class="l-left">\n        <button class="btn btn-default" ng-click="close()">Cancel Changes</button>\n      </div>\n      <div class="tagManager__title">Tag Picker Tags</div>\n      <div class="l-right">\n        <button class="btn btn-siteform--green" ng-click="saveTags()">Save and Close</button>\n      </div>\n    </div>\n  </div>\n  \x3c!--<div class="tagManager__top&#45;&#45;spacer"></div>--\x3e\n  <div class="tagManager__scrollable">\n\n\n    <div class="tagManager__tagEditor">\n      \x3c!--TO-{{tagOptions}}--\x3e\n      \x3c!--<div ng-if="!hasSubscription" class="tagManager__subscriptionOnly"><span class="glyphicon glyphicon-lock"></span> subscription only</div>--\x3e\n\n      <div class="tagManager__instructions">\n        The tags added here will appear in the <b>Tag Picker</b> and be available in a dropdown in the event editor.\n      </div>\n      <div class="tagManager__tagEditor">\n        <div tag-editor tag-editor-id="\'tagManagerEditor\'" tags="tagOptions.tags"></div>\n      </div>\n\n    </div>\n  </div>\n\n  <div class="tagManager__bottom" ng-if="calName">\n    <div class="tagManager__separator"></div>\n    <div class="tagManager__bottomControls">\n      <button class="btn btn-siteform tagManager__autofillBtn" ng-click="syncTopTags()">\n        Autofill From Most Used Tags\n      </button>\n      <a class="tagManager__sortLink" href ng-click="sortAlphabetically()">\n        Sort Alphabetically\n      </a>\n    </div>\n  </div>\n\n</div>'},7521(e,n,t){"use strict";t.r(n)},3562(e,n,t){const a={"./doc.routes":2891,"./doc.routes.js":2891,"./docs.controller":2606,"./docs.controller.js":2606,"./docs.html":3612,"./docs.scss":7521,"./menu.html":2212,"./pages/api/embedding.html":1978,"./pages/api/index.html":1399,"./pages/company/gdpr.html":8531,"./pages/company/index.html":4660,"./pages/company/privacy-gdpr.html":8604,"./pages/company/privacy.html":8040,"./pages/company/tos.html":7393,"./pages/faq/dudaSubscriptionFAQ.html":6016,"./pages/faq/generalFAQ.html":6379,"./pages/faq/index.html":9527,"./pages/faq/subscriptionFAQ.html":7996,"./pages/faq/technicalFAQ.html":9942,"./pages/howto/addcalendars.html":7444,"./pages/howto/customize.html":2447,"./pages/howto/googlesync.html":6406,"./pages/howto/index.html":2556,"./pages/howto/tagpicker.html":2058,"./pages/howto/usersubmit.html":3841,"./pages/howto/whitelabel.html":3287,"./pages/index.html":6712,"./pages/install/anywhere.html":1735,"./pages/install/duda.html":4406,"./pages/install/index.html":2604,"./pages/install/muse.html":6120,"./pages/install/squarespace.html":1951,"./pages/install/tumblr.html":1172,"./pages/install/weebly.html":4998,"./pages/install/wix.html":3976,"./pages/install/wordpress.html":11,"./pages/newcalendar/index.html":8759};function i(e){const n=o(e);return t(n)}function o(e){if(!t.o(a,e)){const n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=o,e.exports=i,i.id=3562}};const n={};function t(a){const i=n[a];if(void 0!==i)return i.exports;const o=n[a]={id:a,loaded:!1,exports:{}};return e[a].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}t.m=e,(()=>{const e=[];t.O=(n,a,i)=>{if(!a){for(var o=0;o<e.length;o++){let[a,i]=e[o],s=!0;for(var r=0;r<a.length;r++)t.O.j(a[r])?a.splice(r--,1):s=!1;if(s){e.splice(o--,1);const t=i();void 0!==t&&(n=t)}}return n}e.push([a,i])}})(),t.n=e=>
2{const n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},t.cw=e=>{var n;return()=>{if(e){var t=e;e=0,n={exports:{}},t.call(n.exports,n,n.exports)}return n.exports}},t.d=(e,n)=>{if(Array.isArray(n))for(var a=0;a<n.length;){var i=n[a++],o=n[a++],r=0===o?{enumerable:!0,value:n[a++]}:{enumerable:!0,get:o};t.o(e,i)||Object.defineProperty(e,i,r)}else for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),t.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.dn=e=>{var n=Object.getOwnPropertyDescriptor(e,"name");(!n||!n.writable&&n.configurable)&&Object.defineProperty(e,"name",{value:"default",configurable:!0})},t.p="/",(()=>{const e={884:0};t.O.j=n=>0===e[n];const n=(n,a)=>{let[i,o,r]=a;var s,l,c=0;if(i.some(n=>0!==e[n])){for(s in o)t.o(o,s)&&(t.m[s]=o[s]);if(r)var d=r(t)}for(n&&n(a);c<i.length;c++)l=i[c],t.o(e,l)&&e[l]&&e[l][0](),e[l]=0;return t.O(d)},a=globalThis.webpackChunktockify_client=globalThis.webpackChunktockify_client||[];a.forEach(n.bind(null,0)),a.push=n.bind(null,a.push.bind(a))})();let a=t.O(void 0,[601,71,858],()=>t(4487));a=t.O(a)})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.