{"version":3,"sources":["theme.js","services/auth.js","util.js","services/upload.js","components/admin/EditableImage.js","services/content.js","components/admin/EditToggle.js","components/animation/Spin.js","components/admin/ProgressOverlay.js","components/text/SectionHeading.js","services/animation.js","constants.js","components/animation/FadingContainer.js","components/admin/EditableCover.js","components/text/PurpleTextContainer.js","components/animation/PurpleText.js","components/animation/ContentCover.js","components/ui/Arrow.js","components/ui/MovingArrowContainer.js","services/analytics.js","components/ui/DragLine.js","components/animation/ContentBase.js","components/Column.js","components/branding/Logo.js","components/text/PeopleHeadline.js","components/branding/PurpleQuarterCirclePeople.js","components/branding/PurpleRectanglePeople.js","components/admin/EditableText.js","services/interaction.js","components/ui/Bio.js","components/content/People.js","components/text/PurposeHeadline.js","components/text/TelstraPurpleIntroductionText.js","services/youtube.js","components/ui/YouTubeVideo.js","components/branding/PurpleHalfCirclePurpose.js","components/branding/PurpleRectanglePurpose.js","components/content/Purpose.js","components/Presentation.js","components/RegionList.js","components/admin/AuthenticationControl.js","serviceWorker.js","services/toast.js","index.js","services/icons.js","components/App.js"],"names":["telstraTheme","primaryRed","primaryBlue","secondaryBlack","secondaryWhite","lightGrey","darkGrey","validationRed","authProvider","MsalAuthProvider","auth","authority","process","clientId","postLogoutRedirectUri","window","location","origin","redirectUri","validateAuthority","cache","cacheLocation","storeAuthStateInCookie","scopes","loginType","LoginType","Redirect","isAuthenticated","authenticationState","AuthenticationState","Authenticated","stopEventAnd","handler","evt","a","stopPropagation","stopEventIf","condition","checkImageDimensions","imageSource","minimumDimensions","Promise","resolve","tempImage","Image","src","onload","width","height","result","expected","actual","String","substring","normaliseResourceUri","uri","region","type","index","placeholder","test","ensureArrayLength","array","length","item","push","handleFileUpload","file","minimumImageDimensions","reject","reader","FileReader","onabort","Error","name","onerror","readAsDataURL","uploadResult","toast","error","undefined","warn","success","Container","styled","div","theme","editing","Overlay","transparentize","DropzoneRoot","Instructions","p","EditableImage","children","onFileAccepted","onFileRejected","minimumResolution","onDropAccepted","onDropRejected","accept","getRootProps","getInputProps","icon","content","bios","videos","purpose","covers","people","emptyBio","imageUrl","bio","emptyCover","normaliseContent","response","json","body","status","message","loadContent","fetch","method","headers","Accept","saveContent","getAccessToken","accessToken","JSON","stringify","Authorization","updateBio","updatePurposeVideo","videoId","getCoverImages","updateCoverImages","side","images","Button","button","Icon","FontAwesomeIcon","EditToggle","editText","edit","saveText","save","cancelText","cancel","onClick","size","Spin","span","motion","Text","layout","ProgressOverlay","iconSize","text","SectionHeading","h2","pipe","transform","clamp","interpolate","nonlinearSpring","applyOffset","createFade","windowWidth","createLateFade","Fading","opacity","display","FadingContainer","x","style","vanishOnly","useTransform","innerWidth","val","Math","abs","sign","CoverEditorOuterContainer","EditToggleContainer","CoverEditor","CoverEditorInner","CoverEditorImagesContainer","CoverEditorImageContainer","CoverEditorImage","img","minimumCoverImageDimensions","ContentCoverEditableImage","setImageUrl","imageRef","createRef","useParams","updateImageUrl","current","rejectedFiles","map","join","alt","ref","imagesBeforeEditing","EditableCover","setImages","updateExternalImage","useState","setEditing","busy","setBusy","xNeg","newImages","forEach","setImageUrlAtIndex","splice","parse","margin","key","PurpleTextContainer","PurpleText","scaleFactor","direction","xDirected","lateFade","scaledX","filter","right","ImageFlicker","color","framePoint","value","totalPicturesCount","createFadeOutIn","keyframes","timePerImageMs","ImageContainer","isFace","animationDelay","animationName","getAnimationDelayMs","allImages","cyclePeriod","Date","now","ContentCover","textScaleFactor","imageContainerRefs","normalisedImageUrl","data-animated-image","normalisedUri","backgroundImage","ArrowHead","ArrowLine","ArrowContainer","ArrowText","props","ArrowSeparationLine","Arrow","React","forwardRef","position","useInterpolatedTransform","minIn","maxIn","minOut","maxOut","MovingArrowContainer","halfWidth","floor","arrowXVal","rightText","rightArrow","leftText","leftArrow","xAbs","left","textAlign","sendAnalyticsEvent","event","GoogleAnalytics","Dragger","draggerWidth","DragLine","onChange","get","action","category","drag","dragElastic","dragMomentum","dragConstraints","ContentContainer","ContentBase","xIsNegative","Column","ImageColumn","circleWidth","Logo","PeopleHeadline","article","PurpleQuarterCirclePeople","PurpleRectanglePeople","lastInteraction","updateWith","setText","currentTarget","innerText","trim","getBorderColor","contentEditable","EditableText","role","onKeyPress","onBlur","dangerouslySetInnerHTML","__html","initialiseInteractionTimeout","isRestartBlocked","restart","setInterval","checkRestart","interactionOccurred","BioBox","isZoomed","BioBoxInner","BioBoxIcon","BioImageContainer","BioImage","Frame","TextContainer","minimumBioImageDimensions","dataBeforeEditing","Bio","bioData","setIsZoomed","data","setData","animate","top","scale","zIndex","flexDirection","toggleZoom","updateImageDataUrl","transition","ease","Object","assign","People","id","set","replace","toLowerCase","PurposeHeadline","TelstraPurpleIntroductionText","players","pendingPlayers","loadYouTubeVideo","YT","Player","container","document","getElementById","replacement","createElement","parentElement","insertBefore","remove","setTimeout","player","playerVars","controls","rel","isYouTubeVideoPlaying","getPlayerState","YouTubeVideoContainer","VideoEditControlsContainer","VideoIdContainer","PlayerContainer","Label","label","videoIdTransformPatterns","pattern","YouTubeVideo","setVideoId","useEffect","videoCanPlay","isPlaying","time","seekTo","seekYouTubeVideo","playVideo","playYouTubeVideo","pauseVideo","pauseYouTubeVideo","input","reduce","PurpleHalfCirclePurpose","PurpleRectanglePurpose","PurposeVideoContainer","Purpose","Presentation","loading","setLoading","useMotionValue","then","pageview","pathname","search","addEventListener","regions","path","Heading","h1","Inner","InnerContainer","Paragraph","List","ul","RegionLink","Link","RegionList","to","AuthenticationControl","login","logout","accountInfo","errorMessage","isInProgress","InProgress","account","disabled","Boolean","hostname","match","config","configure","POSITION","TOP_CENTER","autoClose","initialize","library","add","faTimes","faTimesCircle","faUpload","faEdit","faImage","faSignInAlt","faSignOutAlt","faSpinner","tag","firstScriptTag","getElementsByTagName","parentNode","onYouTubeIframeAPIReady","keys","initialiseYouTubeAPI","ReactDOM","render","provider","authProviderProps","navigator","serviceWorker","ready","registration","unregister"],"mappings":"ySAAaA,EAAe,CAC1BC,WAAY,UACZC,YAAa,UACbC,eAAgB,OAChBC,eAAgB,OAChBC,UAAW,UACXC,SAAU,UACVC,cAAe,QCLJC,EAAe,IAAIC,mBAC9B,CACEC,KAAM,CACJC,UAAWC,gDACXC,SAAUD,uCACVE,sBAAuBC,OAAOC,SAASC,OACvCC,YAAaH,OAAOC,SAASC,OAC7BE,mBAAmB,GAErBC,MAAO,CACLC,cAAe,eACfC,wBAAwB,IAG5B,CACEC,OAAQ,CAAC,SAAD,OAAUX,uCAAV,qBAEV,CACEY,UAAWC,YAAUC,WAIZC,EAAkB,kBAAMnB,EAAaoB,sBAAwBC,sBAAoBC,e,uECxBjFC,EAAe,SAAAC,GAAO,8CAAI,WAAMC,GAAN,SAAAC,EAAA,yDACrCD,EAAIE,mBACAH,EAFiC,gCAG7BA,EAAQC,GAHqB,2CAAJ,uDAOtBG,EAAc,SAAAC,GAAS,OAAI,SAAAJ,GAClCI,GACFJ,EAAIE,oBAMKG,EAAoB,uCAAG,WAAOC,EAAaC,GAApB,SAAAN,EAAA,+EAClC,IAAIO,SAAQ,SAAAC,GACV,IAAMC,EAAY,IAAIC,MACtBD,EAAUE,IAAMN,EAChBI,EAAUG,OAAS,WACjB,OAAIH,EAAUI,MAAQP,EAAkBO,OAASJ,EAAUK,OAASR,EAAkBQ,OAC7EN,EAAQ,CACbO,OAAQ,YACRC,SAAS,GAAD,OAAKV,EAAkBO,MAAvB,YAAgCP,EAAkBQ,QAC1DG,OAAO,GAAD,OAAKR,EAAUI,MAAf,YAAwBJ,EAAUK,UAIxCL,EAAUI,MAAQJ,EAAUK,SAAWR,EAAkBO,MAAQP,EAAkBQ,OAC9EN,EAAQ,CACbO,OAAQ,kBACRC,SAAS,GAAD,OAAKE,OAAOZ,EAAkBO,MAAQP,EAAkBQ,QAAQK,UAAU,EAAG,GAA7E,MACRF,OAAO,GAAD,OAAKC,OAAOT,EAAUI,MAAQJ,EAAUK,QAAQK,UAAU,EAAG,GAA7D,QAIHX,EAAQ,CAAEO,OAAQ,iBArBK,2CAAH,wDAyBpBK,EAAuB,SAACC,EAAKC,EAAQC,EAAMC,GACtD,IAAKH,EAAK,CAER,IAAMI,EAAuB,QAATF,EAAA,UAAoBA,EAApB,YAA4BC,GAAUD,EAC1D,MAAM,gBAAN,OAAuBE,EAAvB,QAEF,MAAI,SAASC,KAAKL,GACTA,EAEH,GAAN,OAAU3C,YAAV,YAAqD4C,EAArD,YAA+DD,IAGpDM,EAAoB,SAACC,EAAOC,EAAQC,GAC/C,KAAOF,EAAMC,OAASA,GACpBD,EAAMG,KAAN,eAAgBD,KCnDPE,EAAgB,uCAAG,WAAOC,EAAMC,GAAb,uBAAAlC,EAAA,+EAED,IAAIO,SAAQ,SAACC,EAAS2B,GAC/C,IAAMC,EAAS,IAAIC,WACnBD,EAAOE,QAAU,kBAAMH,EAAOI,MAAM,8BAAD,OAA+BN,EAAKO,KAApC,sCACnCJ,EAAOK,QAAU,kBAAMN,EAAOI,MAAM,8BAAD,OAA+BN,EAAKO,KAApC,0BACnCJ,EAAOxB,OAAP,sBAAgB,sBAAAZ,EAAA,+EAAYQ,EAAQ4B,EAAOrB,SAA3B,2CAChBqB,EAAOM,cAAcT,MAPK,cAEtBU,EAFsB,gBAUevC,EAAqBuC,EAAcT,GAVlD,gBAUpBnB,EAVoB,EAUpBA,OAAQC,EAVY,EAUZA,SAAUC,EAVE,EAUFA,OAVE,KAYpBF,EAZoB,OAarB,cAbqB,QAiBrB,oBAjBqB,QAqBrB,YArBqB,gCAcxB6B,IAAMC,MAAN,qBAA0BZ,EAAKO,KAA/B,4CAAuExB,EAAvE,sBAA6FC,IAdrE,uBAejB6B,GAfiB,eAkBxBF,IAAMG,KAAN,qBAAyBd,EAAKO,KAA9B,qDAA+ExB,EAA/E,sBAAqGC,IAlB7E,kBAmBjB0B,GAnBiB,eAsBxBC,IAAMI,QAAN,qBAA4Bf,EAAKO,KAAjC,gCAtBwB,kBAuBjBG,GAvBiB,sCA0BjBG,GA1BiB,iEA6B5BF,IAAMC,MAAN,MA7B4B,uBA8BrBC,GA9BqB,0DAAH,wD,y/BCG7B,IAAMG,EAAYC,IAAOC,IAAV,KAMG,gBAAGC,EAAH,EAAGA,MAAH,SAAUC,QAAyBD,EAAMhF,SAAW,iBAE1D,qBAAGiF,QAAyB,UAAY,UACvC,qBAAGA,QAAyB,SAAW,UAG9CC,EAAUJ,IAAOC,IAAV,KACA,qBAAGE,QAAyB,QAAU,UAQ7B,gBAAGD,EAAH,EAAGA,MAAH,OAAeG,YAAe,GAAKH,EAAMjF,cAIvC,gBAAGiF,EAAH,EAAGA,MAAH,SAAUC,QAAyBE,YAAe,IAAMH,EAAMjF,WAAa,iBAK7FqF,EAAeN,IAAOC,IAAV,KAYZM,EAAeP,IAAOQ,EAAV,KAILC,EAAgB,SAAC,GAAD,IAAGC,EAAH,EAAGA,SAAUP,EAAb,EAAaA,QAASQ,EAAtB,EAAsBA,eAAgBC,EAAtC,EAAsCA,eAAgBC,EAAtD,EAAsDA,kBAAtD,OAC3B,kBAACd,EAAD,CAAWI,QAASA,GACjBO,EACD,kBAACN,EAAD,CAASD,QAASA,GAChB,kBAAC,IAAD,CAAUW,eAAgBH,EAAgBI,eAAgBH,EAAgBI,OAAO,eAC9E,gBAAGC,EAAH,EAAGA,aAAcC,EAAjB,EAAiBA,cAAjB,OACC,kBAACZ,EAAiBW,IAChB,0BAAWC,KACX,6BACE,6BACE,kBAAC,IAAD,CAAiBC,KAAK,YAExB,kBAACZ,EAAD,gDACA,kBAACA,EAAD,yBACCM,GACC,kBAACN,EAAD,2BACsBM,EAAkBlD,MADxC,MACkDkD,EAAkBjD,OADpE,mBC/DZwD,EAAU,CACZC,KAAM,GACNC,OAAQ,CACNC,aAAS3B,GAEX4B,OAAQ,CACND,QAAS,GACTE,OAAQ,KAKNC,EAAW,CAAEC,SAAU,GAAIrC,KAAM,GAAIsC,IAAK,IAG1CC,EAAa,CAAEF,SAAU,IAEzBG,EAAgB,uCAAG,WAAMC,GAAN,eAAAjF,EAAA,sEACJiF,EAASC,OADL,UACjBC,EADiB,SAGnBF,EAASG,QAAU,KAHA,sBAIf7C,MAAM4C,GAAQA,EAAKE,QAAb,UAA0BF,EAAKE,QAA/B,oBAAkDJ,EAASG,OAA3D,KAAuEH,EAASG,QAJvE,cAOvBzD,EAAkBwD,EAAKZ,KAbP,EAawBK,GACxCjD,EAAkBwD,EAAKT,OAAOC,OAXZ,EAWiCI,GACnDpD,EAAkBwD,EAAKT,OAAOD,QAZZ,EAYkCM,GAT7B,kBAWhBI,GAXgB,2CAAH,sDAeTG,EAAW,uCAAG,WAAMhE,GAAN,eAAAtB,EAAA,+EAEAuF,MAAM,GAAD,OAAI7G,YAAJ,YAA+C4C,EAA/C,iBAAsE,CAChGkE,OAAQ,MACRC,QAAS,CACPC,OAAQ,sBALW,cAEjBT,EAFiB,gBAQPD,EAAiBC,GARV,OAQvBX,EARuB,uDAUvB1B,IAAMC,MAAN,sDAVuB,yDAAH,sDAeX8C,EAAW,uCAAG,WAAMrE,GAAN,mBAAAtB,EAAA,+EAEO1B,EAAasH,iBAFpB,uBAEfC,EAFe,EAEfA,YAFe,SAGAN,MAAM,GAAD,OAAI7G,oDAAJ,oBAAkD4C,GAAU,CACtFkE,OAAQ,MACRL,KAAMW,KAAKC,UAAUzB,EAAS,KAAM,GACpCmB,QAAS,CACP,eAAgB,mBAChBO,cAAc,UAAD,OAAYH,MARN,cAGjBZ,EAHiB,iBAWPD,EAAiBC,GAXV,QAWvBX,EAXuB,yDAavB1B,IAAMC,MAAN,4CAbuB,0DAAH,sDAmBXoD,EAAY,SAACzE,EAAOsD,GAC/BR,EAAQC,KAAK/C,GAASsD,GAKXoB,EAAqB,SAAAC,GAChC7B,EAAQE,OAAOC,QAAU0B,GAGdC,EAAiB,kBAAM9B,EAAQI,QAE/B2B,EAAoB,SAACC,EAAMC,GACtCjC,EAAQI,OAAO4B,GAAQC,G,sSC7EzB,IAAMC,EAAStD,IAAOuD,OAAV,KAKD,qBAAGrD,MAAkBjF,aAI1BuI,GAAOxD,YAAOyD,IAAPzD,CAAH,KAIG0D,GAAa,SAAC,GAAqE,IAAnEvD,EAAkE,EAAlEA,QAASwD,EAAyD,EAAzDA,SAAUC,EAA+C,EAA/CA,KAAMC,EAAyC,EAAzCA,SAAUC,EAA+B,EAA/BA,KAAMC,EAAyB,EAAzBA,WAAYC,EAAa,EAAbA,OAKhF,OAAO7D,EACL,oCACE,kBAACmD,EAAD,CAAQjF,KAAK,SAAS4F,QAAStH,EAAaqH,IAC1C,kBAACR,GAAD,CAAMrC,KAAK,eAAe+C,KAAK,OAC9BH,GAAc,UAEjB,kBAACT,EAAD,CAAQjF,KAAK,SAAS4F,QAAStH,EAAamH,IAC1C,kBAACN,GAAD,CAAMrC,KAAK,SAAS+C,KAAK,OACxBL,GAAY,YAIjB,kBAACP,EAAD,CAAQjF,KAAK,SAAS4F,QAAStH,EAAaiH,IAC1C,kBAACJ,GAAD,CAAMrC,KAAK,OAAO+C,KAAK,OACtBP,GAAY,S,2WCpCZ,IAAMQ,GAAOnE,IAAOoE,KAAV,M,saCIjB,IAAMrE,GAAYC,YAAOqE,IAAOpE,IAAdD,CAAH,MAQJ,qBAAGE,MAAkBlF,kBAO1BsJ,GAAOtE,IAAOC,IAAV,MACG,kBAA4B,eAA5B,EAAGsE,OAAwC,eAAiB,WACxD,kBAA4B,eAA5B,EAAGA,OAAwC,SAAW,OAG1DC,GAAkB,SAAC,GAAD,IAAGC,EAAH,EAAGA,SAAUF,EAAb,EAAaA,OAAQG,EAArB,EAAqBA,KAArB,OAC7B,kBAAC,GAAD,KACE,6BACE,kBAACP,GAAD,KACE,kBAAC,IAAD,CAAiBhD,KAAK,UAAU+C,KAAMO,GAAY,QAEpD,kBAACH,GAAD,CAAMC,OAAQA,GAAU,YAAaG,GAAQ,gB,wLC9B5C,IAAMC,GAAiB3E,IAAO4E,GAAV,M,SCCnBC,GAA2DC,KAA3DD,KAAME,GAAqDD,KAArDC,MAAOC,GAA8CF,KAA9CE,YAAaC,GAAiCH,KAAjCG,gBAAiBC,GAAgBJ,KAAhBI,YAEtCC,GAAa,SAAAC,GAAW,OACnCP,GAAKE,GAAM,ECGuB,IDHpBK,GAAqCH,GAAgB,IAAM,GAAID,GAAY,CAAC,EAAG,GAAI,CAAC,EAAG,MAE1FK,GAAiB,SAAAD,GAAW,OACvCP,GACEK,GAAY,ECA4B,MDAzBE,GACfL,GAAM,ECDkC,MDC/BK,GACTD,GAAWC,K,2GEPf,IAAME,GAAStF,YAAOqE,IAAOpE,IAAdD,CAAH,MACC,qBAAGuF,WACH,qBAAGC,WAGHC,GAAkB,SAAC,GAAwC,IFK5CL,EELMM,EAAqC,EAArCA,EAAGC,EAAkC,EAAlCA,MAAOjF,EAA2B,EAA3BA,SAAUkF,EAAiB,EAAjBA,WAC9CL,EAAUM,YAAaH,EAAGE,EAAa,kBAAM,GAAIT,GAAWxJ,OAAOmK,aACnEN,EAAUK,YAAaH,GFGHN,EEHmBzJ,OAAOmK,WFGX,SAAAC,GAAG,OAC5CC,KAAKC,IAAIF,GAAOC,KAAKC,ICPa,IDOcb,IAChDY,KAAKE,KAAKH,KAASC,KAAKE,KCRU,IDQkBd,GAChD,OACA,WELJ,OACE,kBAACE,GAAD,CAAQK,MAAOA,EAAOJ,QAASA,EAASC,QAASA,GAC9C9E,I,2nCCDP,IAAMyF,GAA4BnG,IAAOC,IAAV,MAEzBmG,GAAsBpG,IAAOC,IAAV,MAGrB,kBAAwB,WAAxB,EAAGmD,KAAgC,QAAU,UAE3B,gBAAGlD,EAAH,EAAGA,MAAH,OAAeG,YAAe,GAAKH,EAAMnF,mBAQzDsL,GAAcrG,IAAOC,IAAV,MAEK,qBAAGC,MAAkBnF,kBAChC,qBAAGmF,MAAkBlF,kBAc1BsL,GAAmBtG,IAAOC,IAAV,MAKhBsG,GAA6BvG,IAAOC,IAAV,MAM1BuG,GAA4BxG,IAAOC,IAAV,MAIzBwG,GAAmBzG,IAAO0G,IAAV,MAOhBC,GAA8B,CAAEhJ,MAAO,KAAMC,OAAQ,MAErDgJ,GAA4B,SAAC,GAA2D,IAAzDtI,EAAwD,EAAxDA,MAAO8E,EAAiD,EAAjDA,KAAMsB,EAA2C,EAA3CA,KAAMvE,EAAqC,EAArCA,QAASwB,EAA4B,EAA5BA,SAAUkF,EAAkB,EAAlBA,YACnEC,EAAWC,sBACT3I,EAAW4I,cAAX5I,OAEF6I,EAAc,uCAAG,iCAAAnK,EAAA,gFAAQiC,EAAR,cACMD,EAAiBC,EAAM4H,IAD7B,QACflH,EADe,SAEDqH,EAASI,UAC3BJ,EAASI,QAAQzJ,IAAMgC,EACvBoH,EAAYpH,IAJO,2CAAH,sDAWpB,OACE,kBAAC+G,GAAD,KACE,kBAAC,EAAD,CACErG,QAASA,EACTU,kBAAmB8F,GACnBhG,eAAgBsG,EAChBrG,eATqB,SAAAuG,GAAa,OACtCzH,IAAMC,MAAN,uCAA4CwH,EAAcC,KAAI,SAAArI,GAAI,OAAIA,EAAKO,QAAM+H,KAAK,QAAtF,QAUI,kBAACZ,GAAD,CACEhJ,IAAKS,EAAqByD,EAAUvD,EAAQgF,EAAM9E,GAClDgJ,IAAG,UAAK5C,EAAL,yBAA0BpG,EAAQ,GACrCiJ,IAAKT,OAOTU,GAAsB,CAAE/F,OAAQ,GAAIF,QAAS,IAEtCkG,GAAgB,SAAC,GAA+D,IAA7DrE,EAA4D,EAA5DA,KAAMsB,EAAsD,EAAtDA,KAAMgB,EAAgD,EAAhDA,EAAGrC,EAA6C,EAA7CA,OAAQqE,EAAqC,EAArCA,UAAWC,EAA0B,EAA1BA,oBAA0B,EAC5DC,oBAAS,GADmD,mBACnFzH,EADmF,KAC1E0H,EAD0E,OAElED,oBAAS,GAFyD,mBAEnFE,EAFmF,KAE7EC,EAF6E,KAGlF3J,EAAW4I,cAAX5I,OACF4J,EAAOnC,YAAaH,GAAG,SAAAK,GAAG,OAAKA,KAO/BjC,EAAI,uCAAG,4BAAAhH,EAAA,6DACXiL,GAAQ,GACR5E,EAAkBC,EAAMC,GAFb,SAGLZ,EAAYrE,GAHP,OAML6J,EAAY/E,IAAiBE,GACnCsE,EAAUO,GACVA,EAAUb,KAAI,qBAAGzF,YAAyBuG,QAAQP,GAElDE,GAAW,GACXE,GAAQ,GAXG,2CAAH,qDAmBJI,EAAqB,SAAA7J,GAAK,OAAI,SAAAqD,GAClC0B,EAAO+E,OAAO9J,EAAO,EAAG,CAAEqD,aAC1B+F,EAAUrE,KAGZ,OACE,oCACE,kBAAC,GAAD,CAAiBqC,EAAY,WAATtC,EAAoBsC,EAAIsC,GAC1C,kBAAC,GAAD,CAAiBtC,EAAY,YAATtC,EAAqBsC,EAAIsC,EAAMpC,YAAU,GAC3D,kBAACQ,GAAD,CAAqBhD,KAAMA,GACzB,kBAAC,GAAD,CAAYjD,QAASA,EAASwD,SAAQ,eAAUe,EAAV,UAAwBd,KAlC3D,WACX4D,GAAoBpE,GAAQR,KAAKyF,MAAMzF,KAAKC,UAAUQ,IACtDwE,GAAW,IAgCuE/D,KAAMA,EAAME,OAfjF,WACb0D,EAAUF,GAAoBpE,IAC9ByE,GAAW,SAiBRC,GAAQ,kBAAC,GAAD,CAAiBrD,SAAS,OACnC,kBAAC0B,GAAD,KACGhG,GACC,kBAACkG,GAAD,KACE,kBAACC,GAAD,KACE,kBAAC3B,GAAD,CAAgBgB,MAAO,CAAE2C,OAAQ,IAAjC,QAA4C5D,EAA5C,UACA,mDAAyBA,EAAzB,4CACA,kBAAC6B,GAAD,KACGlD,EAAO+D,KAAI,WAAe9I,GAAf,IAAGqD,EAAH,EAAGA,SAAH,OACV,kBAAC,GAAD,CACExB,QAASA,EACT7B,MAAOA,EACP8E,KAAMA,EACNsB,KAAMA,EACN/C,SAAUA,EACVkF,YAAasB,EAAmB7J,GAChCiK,IAAK5G,a,wPCnKlB,IAAM6G,GAAsBxI,YAAOqE,IAAOpE,IAAdD,CAAH,MASrB,qBAAGE,MAAkBlF,kBCLxB6J,GAA6BC,KAA7BD,KAAME,GAAuBD,KAAvBC,MAAOC,GAAgBF,KAAhBE,YAERyD,GAAa,SAAC,GAA8B,IAA5B/C,EAA2B,EAA3BA,EAAGgD,EAAwB,EAAxBA,YAAahE,EAAW,EAAXA,KACrCiE,EAAY3C,KAAKE,KAAKwC,GACtBE,EAAY/C,YAAaH,GAAG,SAAAK,GAAG,OAAK4C,EAAY5C,KAChD8C,EAAWxD,GAAe1J,OAAOmK,YAEjCgD,EAAUjD,YACdH,EACAb,IACE,SAAAkB,GAAG,OJJsB,GIIlB2C,EAAgCC,EAAY5C,IACnD4C,EAAY,EAAI5D,GAAM,EAAGpJ,OAAOmK,YAAcf,IAAOpJ,OAAOmK,WAAY,IACxE,SAAAC,GAAG,gBAAOA,EAAP,UAIDR,EAAUM,YAAa+C,EAAW/D,GAAKgE,EAAU7D,GAAY,CAAC,EAAG,GAAI,CAAC,EAAG,MAEzE+D,EAASlD,YACb+C,EACA/D,GAAKgE,EAAU7D,GAAY,CAAC,EAAG,GAAI,CAAC,GAAI,KAAK,SAAAe,GAAG,qBAAYA,EAAZ,WAGlD,OACE,kBAACyC,GAAD,CACE7C,MAAO,CACLqD,MAAOL,EAAY,EAAI,SAAM/I,EAC7BjC,MAAOgL,EAAY,EAAIG,OAAUlJ,EACjChC,OAAO,GAAD,OAAK,GAAL,OACN2H,UACAwD,WAGF,kBAAC,IAAO9I,IAAR,CAAY0F,MAAOgD,EAAY,OAAI/I,EAAY,CAAE8F,EAAGoD,IAAYpE,K,kyBC7BtE,IAAMuE,GAAejJ,YAAOqE,IAAOpE,IAAdD,CAAH,MAGI,gBAAGkJ,EAAH,EAAGA,MAAOhJ,EAAV,EAAUA,MAAV,MAAiC,WAAVgJ,EAAqBhJ,EAAMrF,WAAaqF,EAAMpF,eAChF,qBAAG6C,SAKRwL,GAAa,SAACC,EAAOC,GAAR,gBAAmCD,GLpBxB,IKoBiCC,GAAwC,IAApF,MAEbC,GAAkB,SAAC,GAAD,IAAGD,EAAH,EAAGA,mBAAH,OAA4BE,YAA3B,KAIrBJ,GLzB2B,IKyBCE,GAG5BF,GAAWK,IAAkCH,GAG7CF,GAAWK,IAAsCH,KAK/CI,GAAiBzJ,IAAOC,IAAV,MAMM,qBAAG0B,YAKd,qBAAG+H,OAAuB,aAAe,QAEzC,mBLlDe,IKkDf,EAAGL,sBACZ,qBAAGM,kBAAkD,qBAAGC,iBAKxDC,GAAsB,SAACzG,EAAM9E,EAAOwL,GACxC,IAAMC,ELzDsB,KKyDUD,EAAUrI,OAAO9C,OAASmL,EAAUvI,QAAQ5C,QAElF,OL3D4B,KK2DpBL,GADgB,WAAT8E,EAAoB,EAAI0G,EAAUrI,OAAO9C,SACZqL,KAAKC,MAAQF,GAG9CG,GAAe,SAAC,GAAuB,IAArBxE,EAAoB,EAApBA,EAAGtC,EAAiB,EAAjBA,KAAMsB,EAAW,EAAXA,KAC9BtG,EAAW4I,cAAX5I,OAEF0L,GADkBE,KAAKC,MACX/G,KACZmG,EAAqBS,EAAUrI,OAAO9C,OAASmL,EAAUvI,QAAQ5C,OAJtB,EAKrBiJ,mBAASkC,EAAU1G,IALE,mBAK1CC,EAL0C,KAKlCqE,EALkC,KAM3CyC,EAA2B,WAAT/G,GAAqB,OAAS,MAChDuF,EAAY3C,KAAKE,KAAKiE,GACtBxM,EAAQkI,YAAaH,GAAG,SAAAK,GAAG,gBAAOpK,OAAOmK,WAAa,EAAIC,EAAM4C,EAArC,SAE3ByB,EAAqB/G,EAAO+D,KAAI,kBAAML,yBAU5C,OACE,oCACE,kBAACkC,GAAD,CAActL,MAAOA,EAAOuL,MAAO9F,GAChCC,EAAO+D,KAAI,WAAe9I,GAAW,IAAvBqD,EAAsB,EAAtBA,SACP0I,EAAqBnM,EAAqByD,EAAUvD,EAAQgF,EAAM9E,GACxE,OACE,kBAACmL,GAAD,CACEa,uBAAA,EACA3I,SAAU0I,EACVX,OAAQf,EAAY,EACpBU,mBAAoBA,EACpBO,cAAeN,GAAgB,CAAED,uBACjCM,eAAgBE,GAAoBzG,EAAM9E,EAAOwL,GACjDvC,IAAK6C,EAAmB9L,GACxBiK,IAAG,UAAK8B,QAId,kBAAC,GAAD,CAAY3E,EAAGA,EAAGgD,YAAayB,EAAiBzF,KAAMA,KAEvDnI,KACC,kBAAC,GAAD,CACE6G,KAAMA,EACNsB,KAAMA,EACNgB,EAAGA,EACHrC,OAAQA,EACRqE,UAAWA,EACXC,oBApCoB,SAAChG,EAAUrD,GACrC,GAAI8L,EAAmB9L,IAAU8L,EAAmB9L,GAAO4I,QAAS,CAClE,IAAMqD,EAAgBrM,EAAqByD,EAAUvD,EAAQgF,EAAM9E,GACnE8L,EAAmB9L,GAAO4I,QAAQvB,MAAM6E,gBAAxC,cAAiED,EAAjE,W,i6BCxEN,IAAME,GAAYzK,YAAOqE,IAAOpE,IAAdD,CAAH,MAST0K,GAAY1K,YAAOqE,IAAOpE,IAAdD,CAAH,MAQT2K,GAAiB3K,YAAOqE,IAAOpE,IAAdD,CAAH,MAMP4K,GAAY5K,YAAOqE,IAAOpE,IAAdD,CAAH,MAGX,SAAA6K,GAAK,OAAIA,EAAM3K,MAAMlF,kBAMnB8P,GAAsB9K,YAAOqE,IAAOpE,IAAdD,CAAH,MASnB+K,GAAQC,IAAMC,YAAW,SAACJ,EAAOtD,GAAR,OACpC,kBAACoD,GAAD,eAAgBpD,IAAKA,EAAK5B,MAAO,CAAEuF,SAAU,aAAkBL,GAC7D,kBAACJ,GAAD,MACA,kBAACC,GAAD,U,8ICzCI7F,GAAsBC,KAAtBD,KAAMG,GAAgBF,KAAhBE,YAER2F,GAAiB3K,YAAOqE,IAAOpE,IAAdD,CAAH,MAOdmL,GAA2B,SAACzF,EAAG0F,EAAOC,EAAOC,EAAQC,GAA1B,OAC/B1F,YACEH,EACAb,GAAKG,GAAY,CAACoG,EAAOC,GAAQ,CAACC,EAAQC,KAAU,SAAAxF,GAAG,gBAAOA,EAAP,YAG9CyF,GAAuB,SAAC,GAAW,IAAT9F,EAAQ,EAARA,EAC/B+F,EAAYzF,KAAK0F,MAAM/P,OAAOmK,WAAa,GAC3C6F,EAAY9F,YAAaH,GAAG,SAAAK,GAAG,2BAAkBA,EAAlB,UAC/B6F,EAAYT,GAAyBzF,EAAG,EAAG+F,EAAW,EAAG,GACzDI,EAAaV,GAAyBzF,EAAG,EAAG+F,EAAW,EAAG,GAC1DK,EAAWX,GAAyBzF,GAAI+F,EAAW,EAAG,EAAG,GACzDM,EAAYZ,GAAyBzF,GAAI+F,EAAW,EAAG,EAAG,GAC1DzD,EAAOnC,YAAaH,GAAG,SAAAK,GAAG,OAAKA,KAC/BiG,EAAOnG,YAAaH,EAAGM,KAAKC,KAElC,OACE,kBAAC,GAAD,CAAgBN,MAAO,CAAEsG,KAAMN,IAC7B,kBAAC,GAAD,CAAiBjG,EAAGsC,GAClB,kBAAC4C,GAAD,CAAWjF,MAAO,CAAEqD,MAAO4C,EAAWM,UAAW,QAAjD,aACA,kBAACnB,GAAD,CAAOpF,MAAO,CAAEqD,MAAO6C,MAEzB,kBAAC,GAAD,CAAiBnG,EAAGsG,GAClB,kBAAClB,GAAD,CAAqBnF,MAAO,CAAEqD,MAAO,YAEvC,kBAAC,GAAD,CAAiBtD,EAAGA,GAClB,kBAACkF,GAAD,CAAWjF,MAAO,CAAEsG,KAAMH,IAA1B,cACA,kBAACf,GAAD,CAAOpF,MAAO,CAAEsG,KAAMF,EAAWjH,UAAW,mB,SC5BvCqH,GAAqB,SAAAC,GAE9BC,KAAgBD,MAAMA,I,2OCTlBvH,GAAsBC,KAAtBD,KAAMG,GAAgBF,KAAhBE,YAERsH,GAAUtM,YAAOqE,IAAOpE,IAAdD,CAAH,KTJe,GSQPuM,IAMRC,GAAW,SAAC,GAAW,IAAT9G,EAAQ,EAARA,EACnB+F,EAAY9P,OAAOmK,WAAa,EAGpCJ,EAAE+G,UAAS,WACT,GAAIzG,KAAKC,IAAIP,EAAEgH,SAAWjB,EAAW,CACnC,IAAMkB,EAASjH,EAAEwB,QAAU,EAAI,UAAY,SAC3CiF,GAAmB,CAAES,SAAU,YAAaD,eAKlD,IAAMhP,EAAQkI,YACZH,EACAb,GAAKG,GAAY,CAAC,EAAGyG,GAAY,CT5BT,GS4BwB,MAAM,SAAA1F,GAAG,gBAAOA,EAAP,WAGrDkG,EAAOpG,YACXH,EACAb,GAAKG,GAAY,CAAC,EAAGyG,GAAY,CAACc,GAAkB,MAAM,SAAAxG,GAAG,2BAAkBA,EAAlB,YAG/D,OACE,kBAACuG,GAAD,CACEO,KAAK,IACLlH,MAAO,CAAED,IAAG/H,QAAOsO,QACnBa,YAAa,EACbC,cAAY,EACZC,gBAAiB,CAAEf,MAAOR,EAAWzC,MAAOyC,M,gSC3ClD,IAAMwB,GAAmBjN,YAAOqE,IAAOpE,IAAdD,CAAH,MAOX,qBAAGE,MAAkBlF,kBACV,qBAAGkF,MAAkBnF,kBAQ9BmS,GAAc,SAAC,GAAkC,IAAhCxH,EAA+B,EAA/BA,EAAGyH,EAA4B,EAA5BA,YAAazM,EAAe,EAAfA,SACtCmI,EAAWxD,GAAe1J,OAAOmK,YACjCP,EAAUM,YAAaH,GAAG,SAAAK,GAAG,OAAI8C,EAASsE,GAAepH,EAAMA,MACrE,OAAO,kBAACkH,GAAD,CAAkBtH,MAAO,CAAEJ,YAAY7E,I,gaCrBzC,IAAM0M,GAASpN,IAAOC,IAAV,MAMNoN,GAAcrN,IAAOC,IAAV,KAIPqN,GAGCA,I,qUCdX,IAAMC,GAAOvN,IAAOC,IAAV,MAWK,qBAAGC,MAAkBnF,kB,0ICXpC,IAAMyS,GAAiBxN,IAAOyN,QAAV,M,+MCCpB,IAAMC,GAA4B1N,IAAOC,IAAV,KdIX,ScCVqN,KACK,qBAAGpN,MAAkBpF,e,oKCNpC,IAAM6S,GAAwB3N,IAAOC,IAAV,KAEvBqN,IfEgB,IeAL,qBAAGpN,MAAkBrF,c,gSCA3C,ICLI+S,GDKEC,GAAa,SAACC,EAASxO,GAAV,OAAmB,SAAAzC,GACpC,IAAM6H,EAAO7H,EAAIkR,cAAcC,UAAUC,OACrB,IAAhBvJ,EAAK/F,QACPe,IAAMG,KAAN,oCAAwCP,IAE1CwO,EAAQpJ,KAUJ3E,GAAYC,IAAOC,IAAV,MAGG,mBAVK,SAACC,EAAOC,EAASuE,GACtC,OAAIvE,EACKuE,EAAOxE,EAAMhF,SAAWgF,EAAM/E,cAEhC,cAMuC+S,CAA9B,EAAGhO,MAAH,EAAUC,QAAV,EAAmBuE,SAEzB,qBAAGvE,QAAyB,mBAAqB,UAChD,qBAAGA,QAAyB,iBAAmB,UAKpC,gBAAGD,EAAH,EAAGA,MAAH,SAAUiO,gBACV9N,YAAe,GAAKH,EAAMjF,WAAa,iBAIlDmT,GAAe,SAAC,GAAD,IAAG9O,EAAH,EAAGA,KAAMoF,EAAT,EAASA,KAAMoJ,EAAf,EAAeA,QAAS3N,EAAxB,EAAwBA,QAAxB,OAC1B,kBAAC,GAAD,CACEkO,KAAK,UACLF,gBAAiBhO,EACjBA,QAASA,EACTuE,KAAMA,EACNT,QAASjH,EAAYmD,GACrBmO,WAAYtR,EAAYmD,GACxBoO,OAAQV,GAAWC,EAASxO,GAE5BkP,wBAAyB,CAAEC,OAAQ/J,MCtC1BgK,GAA+B,SAACC,EAAkBC,GAC7DhB,GAAkB5D,KAAKC,MACvB4E,YARmB,SAACF,EAAkBC,GAAnB,OAA+B,WAC9ChB,GAAkB5D,KAAKC,MjBDG,MiBC0B0E,KACtDC,KAMUE,CAAaH,EAAkBC,GjBTJ,MiBY5BG,GAAsB,WACjCnB,GAAkB5D,KAAKC,O,03DCAzB,IAAM+E,GAAShP,YAAOqE,IAAOpE,IAAdD,CAAH,MAGD,qBAAGiP,SAA2B,QAAU,UAE7B,qBAAG/O,MAAkBnF,kBAGrCmU,GAAclP,IAAOC,IAAV,MAKXkP,GAAanP,YAAOqE,IAAOpE,IAAdD,CAAH,MAUH,qBAAGE,MAAkBjF,aACnB,qBAAGgU,SAA2B,OAAS,WAKzC,qBAAG/O,MAAkBhF,YACnB,qBAAG+T,SAA2B,QAAU,UAIjDG,GAAoBpP,IAAOC,IAAV,MAOjBoP,GAAWrP,IAAO0G,IAAV,MAMC,gBAAGxG,EAAH,EAAGA,MAAH,SAAU+O,cAA2BrP,EAAH,oBAA4BM,EAAMjF,cAI7EqJ,GAAOtE,IAAOyN,QAAV,MACG,qBAAGwB,SAA2B,QAAU,UAK/CK,GAAQtP,IAAOC,IAAV,MAMK,qBAAGC,MAAkBnF,kBAM/BwU,GAAgBvP,IAAOC,IAAV,MAKbmG,GAAsBpG,IAAOC,IAAV,MAId,qBAAGE,QAAyB,IAAM,UAOvCqP,GAA4B,CAAE7R,MAAO,IAAKC,OAAQ,KAElD6R,GAAoB,GAEbC,GAAM,SAAC,GAAwB,IAAtBpR,EAAqB,EAArBA,MAAOqR,EAAc,EAAdA,QAAc,EACT/H,oBAAS,GADA,mBAClCqH,EADkC,KACxBW,EADwB,OAEXhI,oBAAS,GAFE,mBAElCzH,EAFkC,KAEzB0H,EAFyB,OAGjBD,oBAAS,GAHQ,mBAGlCE,EAHkC,KAG5BC,EAH4B,OAIjBH,mBAAS+H,GAJQ,mBAIlCE,EAJkC,KAI5BC,EAJ4B,KAKjC1R,EAAW4I,cAAX5I,OAEF2R,EAAUd,EACZ,CACE/D,SAAU,WACVe,KAAM,MACN+D,IAAK,MACLC,MAAO,EACPC,OAAQ,EACRC,cAAe,OAEjB,CACEjF,SAAU,SACV+E,MAAO,EACPC,OAAQ,EACRC,cAAe,UAGfC,EAAa,WACZnB,EAGO9O,GACVyP,GAAY,IAHZzD,GAAmB,CAAES,SAAU,MAAOD,OAAQkD,EAAKvQ,OACnDsQ,GAAY,IAIdb,MAUIjL,EAAI,uCAAG,sBAAAhH,EAAA,0DACPP,IADO,uBAETwL,GAAQ,GACRhF,EAAUzE,EAAOuR,GAHR,SAIHpN,EAAYrE,GAJT,OAKTyJ,GAAW,GACXE,GAAQ,GANC,2CAAH,qDAmBJjB,EAAWC,sBAEXsJ,EAAkB,uCAAG,iCAAAvT,EAAA,gFAAQiC,EAAR,cACED,EAAiBC,EAAMyQ,IADzB,OACnB/P,EADmB,OAErBqH,EAASI,SAAWzH,IACtBqH,EAASI,QAAQzJ,IAAMgC,EACvBqQ,EAAQ,eAAKD,EAAN,CAAYlO,SAAUlC,MAJN,2CAAH,sDAWxB,OACE,oCACE,kBAAC6P,GAAD,CAAOrL,QAASmM,EAAYzK,MAAO,CAAEH,QAASyJ,EAAW,QAAU,UACnE,kBAACD,GAAD,CACE/K,QAASmM,EACTL,QAASA,EACTO,WAAY,CAAEjS,KAAM,QAASkS,KAAM,WACnCtB,SAAUA,GAETnH,GAAQ,kBAAC,GAAD,CAAiBrD,SAAS,OACnC,kBAACyK,GAAD,KACE,kBAACC,GAAD,CAAYF,SAAUA,EAAUtJ,MAAO,CAAEH,QAASrF,EAAU,OAAS,WACrE,kBAAC,EAAD,CACEA,QAASA,EACTU,kBAAmB2O,GACnB7O,eAAgB0P,EAChBzP,eAnBiB,SAAAuG,GAAa,OACtCzH,IAAMC,MAAN,uCAA4CwH,EAAcC,KAAI,SAAArI,GAAI,OAAIA,EAAKO,QAAM+H,KAAK,QAAtF,QAoBQ,kBAAC+H,GAAD,KACE,kBAACC,GAAD,CACE5R,IAAKS,EAAqB2R,EAAKlO,SAAUvD,EAAQ,MAAOE,GACxDgJ,IAAG,sBAAiBuI,EAAKvQ,MACzB2P,SAAUA,EACV1H,IAAKT,MAIVvK,KAAqB0S,GACpB,kBAAC,GAAD,CAAqB9O,QAASA,GAC5B,kBAAC,GAAD,CAAYA,QAASA,EAASyD,KApE7B,WACPrH,MACFiU,OAAOC,OAAOhB,GAAmBI,GACjChI,GAAW,KAiEuC/D,KAAMA,EAAME,OAnDnD,WACb8L,EAAQL,IACR5H,GAAW,OAoDL,kBAAC0H,GAAD,KACE,4BACE,kBAAC,GAAD,CAAcjQ,KAAK,OAAOoF,KAAMmL,EAAKvQ,KAAMwO,QAnDvC,SAAAxO,GAAI,OAAIwQ,EAAQ,eAAKD,EAAN,CAAYvQ,WAmD8Ba,QAASA,KAExE,kBAAC,GAAD,CAAM8O,SAAUA,GACd,kBAAC,GAAD,CAAc3P,KAAK,YAAYoF,KAAMmL,EAAKjO,IAAKkM,QApD5C,SAAAlM,GAAG,OAAIkO,EAAQ,eAAKD,EAAN,CAAYjO,UAoDmCzB,QAASA,UC3M1EuQ,GAAS,SAAC,GAAD,IAAGhL,EAAH,EAAGA,EAAH,OACpB,kBAAC,GAAD,CAAaiL,GAAG,SAASjL,EAAGA,GAC1B,kBAAC0H,GAAD,KACE,kBAACG,GAAD,CAAMtJ,QAAS,kBAAMyB,EAAEkL,IAAI,IAAInT,IAAI,oCAAoC6J,IAAI,yBAE7E,kBAAC8F,GAAD,KACE,kBAACI,GAAD,6CAEF,kBAACJ,GAAD,KACE,kBAACM,GAAD,MACA,kBAACC,GAAD,OAEF,kBAACN,GAAD,KACE,kBAAC1I,GAAD,8BzB4CuBvD,EAAQC,KyB3CpB+F,KAAI,SAACuI,EAASrR,GAAV,OACb,kBAAC,GAAD,CACEqR,QAASA,EACTrR,MAAOA,EAEPiK,IAAG,UAAKoH,EAAQrQ,KAAKuR,QAAQ,KAAM,KAAKC,cAArC,YAAsDxS,W,yJC5B5D,IAAMyS,GAAkB/Q,IAAOyN,QAAV,M,gKCArB,IAAMuD,GAAgChR,IAAOyN,QAAV,MCCpCwD,GAAU,GAGVC,GAAiB,GAEVC,GAAmB,SAACR,EAAI1N,GACnC,GAAKtH,OAAOyV,IAAOzV,OAAOyV,GAAGC,OAA7B,CAOA,GAAIJ,GAAQN,GAAK,CAEf,GAAIM,GAAQN,GAAI1N,UAAYA,EAC1B,OAKF,IAAMqO,EAAYC,SAASC,eAAeb,GAC1C,GAAIW,EAAW,CACb,IAAMG,EAAcF,SAASG,cAAc,OAC3CD,EAAYd,GAAKA,EACjBW,EAAUK,cAAcC,aAAaH,EAAaH,GAClDA,EAAUO,UAMdC,YAAW,WACTb,GAAQN,GAAM,CACZ1N,UACA8O,OAAQ,IAAIpW,OAAOyV,GAAGC,OAAOV,EAAI,CAC/B1N,UACAtF,MAAO,OACPC,OAAQ,OACRoU,WAAY,CACVC,SAAU,EAGVC,IAAK,QAIV,QAvCDhB,GAAeP,GAAM1N,GAyDZkP,GAAwB,SAAAxB,GAAE,OACrCM,GAAQN,IAAoD,oBAAtCM,GAAQN,GAAIoB,OAAOK,gBAAyE,IAAxCnB,GAAQN,GAAIoB,OAAOK,kB,oqBCpD/F,IAAMC,GAAwBrS,IAAOC,IAAV,MAMrBqS,GAA6BtS,IAAOC,IAAV,MAY1BsS,GAAmBvS,IAAOC,IAAV,MACT,qBAAGE,QAAyB,eAAiB,UAIpDqS,GAAkBxS,IAAOC,IAAV,MAKfwS,GAAQzS,IAAO0S,MAAV,MAKLjD,GAAoB,GAEpBkD,GAA2B,CAC/B,CACEC,QAAS,qEACTnB,YAAa,MAEf,CACEmB,QAAS,+BACTnB,YAAa,OAIJoB,GAAe,SAAC,GAAqB,IAAnBlC,EAAkB,EAAlBA,GAAId,EAAc,EAAdA,KAAMnK,EAAQ,EAARA,EAAQ,EACjBkC,mBAASiI,EAAK5M,SADG,mBACxCA,EADwC,KAC/B6P,EAD+B,OAEjBlL,oBAAS,GAFQ,mBAExCzH,EAFwC,KAE/B0H,EAF+B,OAGvBD,oBAAS,GAHc,mBAGxCE,EAHwC,KAGlCC,EAHkC,KAIvC3J,EAAW4I,cAAX5I,OAeF0F,EAAI,uCAAG,sBAAAhH,EAAA,0DACPP,IADO,uBAETwL,GAAQ,GACR/E,EAAmBC,GAHV,SAIHR,EAAYrE,GAJT,OAKT+S,GAAiBR,EAAI1N,GACrB4E,GAAW,GACXE,GAAQ,GAPC,2CAAH,qDAkCV,OAlBAoJ,GAAiBR,EAAI1N,GAErB8P,qBACE,kBACErN,EAAE+G,UAAS,WACT,IAAMuG,EAAetN,EAAEgH,OAAS/Q,OAAOmK,WAAa,EAC9CmN,EAAYd,GAAsBxB,GACpCqC,IAAiBC,ID5BG,SAACtC,GAAD,IAAKuC,EAAL,uDAAY,EAC1CjC,GAAQN,IAA4C,oBAA9BM,GAAQN,GAAIoB,OAAOoB,QAAyBlC,GAAQN,GAAIoB,OAAOoB,OAAOD,GC4BpFE,CAAiBzC,GDnCK,SAAAA,GAC9BM,GAAQN,IAA+C,oBAAjCM,GAAQN,GAAIoB,OAAOsB,WAA4BpC,GAAQN,GAAIoB,OAAOsB,YCmChFC,CAAiB3C,GACjBxE,GAAmB,CAAES,SAAU,QAASD,OAAQ1J,MACtC+P,GAAgBC,GDnCH,SAAAtC,GAC/BM,GAAQN,IAAgD,oBAAlCM,GAAQN,GAAIoB,OAAOwB,YAA6BtC,GAAQN,GAAIoB,OAAOwB,aCmCjFC,CAAkB7C,QAGxB,CAACjL,EAAGiL,EAAI1N,IAIR,kBAACoP,GAAD,KACG9V,KACC,kBAAC+V,GAAD,KACGxK,GAAQ,kBAAC,GAAD,CAAiBvD,OAAO,eAChCpE,GAAW,kBAACsS,GAAD,2BACZ,kBAACF,GAAD,CAAkBpS,QAASA,GACzB,kBAAC,GAAD,CAAcA,QAASA,EAASuE,KAAMzB,EAAS6K,QAtDvB,SAAA2F,GAAK,OACrCX,EACEH,GAAyBe,QACvB,SAAC7V,EAAD,OAAW+U,EAAX,EAAWA,QAASnB,EAApB,EAAoBA,YAApB,OAAuCmB,EAAQpU,KAAKX,GAAUA,EAAOgT,QAAQ+B,EAASnB,GAAe5T,IACrG4V,QAoDE,kBAAC,GAAD,CAAYtT,QAASA,EAASyD,KAhDzB,WACXiE,GAAW,GACX2I,OAAOC,OAAOhB,GAAmBI,IA8Ce/L,KAAMA,EAAME,OAhC/C,WACb8O,EAAWrD,GAAkBxM,SAC7B4E,GAAW,OAiCT,kBAAC2K,GAAD,CAAiB7B,GAAIA,M,0PC7HpB,IAAMgD,GAA0B3T,IAAOC,IAAV,MAEd,qBAAGC,MAAkBpF,cxBEhB,GwBAfwS,GACoBA,GACHA,GACZA,K,oKCPV,IAAMsG,GAAyB5T,IAAOC,IAAV,KAExBqN,IACaA,IACF,qBAAGpN,MAAkBrF,c,qHCM3C,IAAMgZ,GAAwB7T,IAAOC,IAAV,MAMd6T,GAAU,SAAC,GAAD,IAAGpO,EAAH,EAAGA,EAAH,OACrB,kBAAC,GAAD,CAAaiL,GAAG,UAAUjL,EAAGA,EAAGyH,aAAW,GACzC,kBAACC,GAAD,KACE,kBAACG,GAAD,CAAMtJ,QAAS,kBAAMyB,EAAEkL,IAAI,OAE7B,kBAACxD,GAAD,KACE,kBAAC2D,GAAD,qFACA,kBAACC,GAAD,2OAKA,kBAAC6C,GAAD,KACE,kBAAC,GAAD,CAAclD,G1BjBe,gB0BiBYd,KAAM,CAAE5M,QhC0CpB7B,EAAQE,OAAOC,SgC1CmCmE,EAAGA,MAGtF,kBAAC0H,GAAD,KACE,kBAACuG,GAAD,MACA,kBAACC,GAAD,SCtBOG,GAAe,WAAO,IAAD,EACFnM,oBAAS,GADP,mBACzBoM,EADyB,KAChBC,EADgB,KAE1BvO,EAAIwO,YAAe,GACjB9V,EAAW4I,cAAX5I,OAkBR,OAhBAgE,EAAYhE,GAAQ+V,MAAK,kBAAMF,GAAW,MnBTxC5H,KAAgB+H,SAASzY,OAAOC,SAASyY,SAAW1Y,OAAOC,SAAS0Y,QmBctE3Y,OAAO4Y,iBAAiB,UAAU,kBAAM7O,EAAEkL,IAAI,MAG9ClC,IACE,kBAAMyD,G3Bd2B,oB2BejC,kBAAMzM,EAAEkL,IAAI,MAIdlL,EAAE+G,SAASsC,IAEJiF,EACL,kBAAC,GAAD,CAAiBvP,SAAS,KAAKC,KAAK,eAEpC,oCACE,kBAAC,GAAD,CAAcA,KAAK,UAAUtB,KAAK,UAAUsC,EAAGA,IAC/C,kBAAC,GAAD,CAAchB,KAAK,SAAStB,KAAK,SAASsC,EAAGA,IAC7C,kBAAC,GAAD,CAAsBA,EAAGA,IACzB,kBAAC,GAAD,CAAUA,EAAGA,IACb,kBAAC,GAAD,CAAQA,EAAGA,IACX,kBAAC,GAAD,CAASA,EAAGA,M,kjCCpClB,IAAM8O,GAAU,CACd,CACEC,KAAM,mBACN/B,MAAO,mBAET,CACE+B,KAAM,cACN/B,MAAO,cAET,CACE+B,KAAM,aACN/B,MAAO,aAET,CACE+B,KAAM,kBACN/B,MAAO,kBAET,CACE+B,KAAM,YACN/B,MAAO,YAET,CACE+B,KAAM,qBACN/B,MAAO,sBAIL3S,GAAYC,IAAOC,IAAV,MAOJ,qBAAGC,MAAkBlF,kBAG1B0Z,GAAU1U,IAAO2U,GAAV,MAKPC,GAAQ5U,IAAOC,IAAV,MAEW,qBAAGC,MAAkBlF,kBAIrC6Z,GAAiB7U,IAAOC,IAAV,MAWd6U,GAAY9U,IAAOQ,EAAV,MACJ,qBAAGN,MAAkBlF,kBAG1B+Z,GAAO/U,IAAOgV,GAAV,MAMJC,GAAajV,YAAOkV,IAAPlV,CAAH,MACL,qBAAGE,MAAkBlF,kBAInBma,GAAa,kBACxB,kBAAC,GAAD,KACE,kBAAC/H,GAAD,KACE,kBAACG,GAAD,OAEF,kBAACH,GAAD,CAAQzH,MAAO,CAAEhI,MAAO,QACtB,kBAACkX,GAAD,KACE,kBAACH,GAAD,4BACA,kBAACE,GAAD,KACE,kBAACE,GAAD,qEACA,kBAACC,GAAD,KACGP,GAAQpN,KAAI,gBAAGqN,EAAH,EAAGA,KAAM/B,EAAT,EAASA,MAAT,OACX,wBAAInK,IAAKkM,GACP,kBAACQ,GAAD,CAAYG,GAAIX,GAAO/B,WAOnC,kBAACtF,GAAD,KACE,kBAACuG,GAAD,MACA,kBAACC,GAAD,S,yaCjGN,IAAM7T,GAAYC,IAAOC,IAAV,MAOTqD,GAAStD,IAAOuD,OAAV,MACD,qBAAGrD,MAAkBlF,kBAO1BwI,GAAOxD,YAAOyD,IAAPzD,CAAH,MAIGqV,GAAwB,SAAC,GAAgE,IAA9DC,EAA6D,EAA7DA,MAAOC,EAAsD,EAAtDA,OAAQ/Y,EAA8C,EAA9CA,oBAAqBgZ,EAAyB,EAAzBA,YAAa7V,EAAY,EAAZA,MAKnFA,GACFD,IAAMC,MAAN,gCAAqCA,EAAM8V,eAG7C,IAAMC,EAAelZ,IAAwBC,sBAAoBkZ,WAEjE,OACE,kBAAC,GAAD,KACGnZ,IAAwBC,sBAAoBC,cAC3C,kBAAC,GAAD,CAAQ2B,KAAK,SAAS4F,QAASsR,GAC7B,kBAAC,GAAD,CAAMpU,KAAK,iBADb,aAEaqU,EAAYI,QAAQtW,KAFjC,KAKA,kBAAC,GAAD,CAAQjB,KAAK,SAAS4F,QAASqR,EAAOO,SAAUH,GAC7CA,EACC,kBAACvR,GAAD,KACE,kBAAC,GAAD,CAAMhD,KAAK,aAGb,kBAAC,GAAD,CAAMA,KAAK,gBAEZuU,EAAe,aAAe,aC1CrBI,QACW,cAA7Bna,OAAOC,SAASma,UAEe,UAA7Bpa,OAAOC,SAASma,UAEhBpa,OAAOC,SAASma,SAASC,MAAM,2DCf5B,I,kBCUPC,mBDTEvW,IAAMwW,UAAU,CACdhL,SAAUxL,IAAMyW,SAASC,WACzBC,UAAW,MvBAXhK,KAAgBiK,WAAW9a,kByBQ7B+a,KAAQC,IAAIC,KAASC,KAAeC,KAAUC,KAAQC,KAASC,KAAaC,KAAcC,MXyCxD,WAClC,IAAMC,EAAM1F,SAASG,cAAc,UACnCuF,EAAIxZ,IAAM,qCACV,IAAMyZ,EAAiB3F,SAAS4F,qBAAqB,UAAU,GAC/DD,EAAeE,WAAWxF,aAAaqF,EAAKC,GAC5Cvb,OAAO0b,wBAA0B,WAE/B7G,OAAO8G,KAAKpG,IAAgBhJ,SAAQ,SAAAyI,GAClCQ,GAAiBR,EAAIO,GAAeP,WAC7BO,GAAeP,OU9C5B4G,GAEAC,IAASC,OAAO,mBETG,kBACjB,kBAAC,UAAD,CAASC,SAAUtc,IAChB,SAAAuc,GAAiB,OAChB,kBAAC,IAAD,CAAezX,MAAOtF,GACpB,kBAAC,IAAD,KACE,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAO6Z,KAAK,YACV,kBAAC,GAAD,OAEF,kBAAC,IAAD,CAAOA,KAAK,KACV,kBAAC,GAAD,SAIN,kBAAC,GAA0BkD,SFLnB,MAASpG,SAASC,eAAe,SF6G3C,kBAAmBoG,WACrBA,UAAUC,cAAcC,MAAM3D,MAAK,SAAA4D,GACjCA,EAAaC,kB","file":"static/js/main.77046c70.chunk.js","sourcesContent":["export const telstraTheme = {\n primaryRed: '#ed1f4f',\n primaryBlue: '#0e39fb',\n secondaryBlack: '#000',\n secondaryWhite: '#fff',\n lightGrey: '#eee8e2',\n darkGrey: '#686366',\n validationRed: '#f00'\n};\n","import { LoginType, MsalAuthProvider, AuthenticationState } from 'react-aad-msal';\n\nexport const authProvider = new MsalAuthProvider(\n {\n auth: {\n authority: process.env.REACT_APP_MSAL_AUTHORITY || 'https://login.microsoftonline.com/common',\n clientId: process.env.REACT_APP_MSAL_CLIENT_APP_ID,\n postLogoutRedirectUri: window.location.origin,\n redirectUri: window.location.origin,\n validateAuthority: true\n },\n cache: {\n cacheLocation: 'localStorage',\n storeAuthStateInCookie: true\n }\n },\n {\n scopes: [`api://${process.env.REACT_APP_MSAL_CLIENT_APP_ID}/access_as_user`]\n },\n {\n loginType: LoginType.Redirect\n }\n);\n\nexport const isAuthenticated = () => authProvider.authenticationState === AuthenticationState.Authenticated;\n","export const stopEventAnd = handler => async evt => {\n evt.stopPropagation();\n if (handler) {\n await handler(evt);\n }\n};\n\nexport const stopEventIf = condition => evt => {\n if (condition) {\n evt.stopPropagation();\n }\n};\n\n// Resolves to an array: { result, expected, actual } (If the `result` is `success`, it is the only key).\n// The `result` is either `success`, `too-small` or `incorrect-ratio`. The other keys are for displaying errors.\nexport const checkImageDimensions = async (imageSource, minimumDimensions) =>\n new Promise(resolve => {\n const tempImage = new Image();\n tempImage.src = imageSource;\n tempImage.onload = () => {\n if (tempImage.width < minimumDimensions.width || tempImage.height < minimumDimensions.height) {\n return resolve({\n result: 'too-small',\n expected: `${minimumDimensions.width}x${minimumDimensions.height}`,\n actual: `${tempImage.width}x${tempImage.height}`\n });\n }\n\n if (tempImage.width / tempImage.height !== minimumDimensions.width / minimumDimensions.height) {\n return resolve({\n result: 'incorrect-ratio',\n expected: `${String(minimumDimensions.width / minimumDimensions.height).substring(0, 4)}:1`,\n actual: `${String(tempImage.width / tempImage.height).substring(0, 4)}:1`\n });\n }\n\n return resolve({ result: 'success' });\n };\n });\n\nexport const normaliseResourceUri = (uri, region, type, index) => {\n if (!uri) {\n // The placeholders for the Purpose cover are indexed\n const placeholder = type !== 'bio' ? `${type}-${index}` : type;\n return `placeholders/${placeholder}.jpg`;\n }\n if (/^data:/.test(uri)) {\n return uri;\n }\n return `${process.env.REACT_APP_RESOURCE_BASE_URI}/${region}/${uri}`;\n};\n\nexport const ensureArrayLength = (array, length, item) => {\n while (array.length < length) {\n array.push({ ...item });\n }\n};\n","import { toast } from 'react-toastify';\nimport { checkImageDimensions } from '../util';\n\nexport const handleFileUpload = async (file, minimumImageDimensions) => {\n try {\n const uploadResult = await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onabort = () => reject(Error(`The reading operation for \"${file.name}\" was aborted, please try again`));\n reader.onerror = () => reject(Error(`An error occurred reading \"${file.name}\", please try again`));\n reader.onload = async () => resolve(reader.result);\n reader.readAsDataURL(file);\n });\n\n const { result, expected, actual } = await checkImageDimensions(uploadResult, minimumImageDimensions);\n\n switch (result) {\n case 'too-small':\n toast.error(`The image \"${file.name}\" is too low resolution: minimum ${expected}, received ${actual}`);\n return undefined;\n\n case 'incorrect-ratio':\n toast.warn(`The image \"${file.name}\" has an incorrect aspect ratio: expected ${expected}, received ${actual}`);\n return uploadResult;\n\n case 'success':\n toast.success(`The image \"${file.name}\" was successfully uploaded`);\n return uploadResult;\n\n default:\n return undefined;\n }\n } catch (e) {\n toast.error(e);\n return undefined;\n }\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { transparentize } from 'polished';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Dropzone from 'react-dropzone';\n\nconst Container = styled.div`\n display: inline-block;\n position: relative;\n line-height: 1;\n border-width: 1px;\n border-style: solid;\n border-color: ${({ theme, editing }) => (editing ? theme.darkGrey : 'transparent')};\n border-radius: 4px;\n margin: ${({ editing }) => (editing ? '-0.5rem' : 'none')};\n padding: ${({ editing }) => (editing ? '0.5rem' : 'none')};\n`;\n\nconst Overlay = styled.div`\n display: ${({ editing }) => (editing ? 'block' : 'none')};\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n // TODO Why does this need to be 1px less than the Container's border-radius? (Otherwise there is a gap)\n border-radius: 3px;\n background-color: ${({ theme }) => transparentize(0.8, theme.lightGrey)};\n opacity: 80%;\n\n &:hover {\n background-color: ${({ theme, editing }) => (editing ? transparentize(0.67, theme.lightGrey) : 'transparent')};\n opacity: initial;\n }\n`;\n\nconst DropzoneRoot = styled.div`\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n align-items: center;\n justify-content: center;\n text-align: center;\n`;\n\nconst Instructions = styled.p`\n font-size: xx-small;\n`;\n\nexport const EditableImage = ({ children, editing, onFileAccepted, onFileRejected, minimumResolution }) => (\n \n {children}\n \n \n {({ getRootProps, getInputProps }) => (\n \n \n
\n
\n \n
\n Drag-and-drop or click to replace image\n JPEG images only\n {minimumResolution && (\n \n Minimum resolution {minimumResolution.width} x {minimumResolution.height} pixels\n \n )}\n
\n
\n )}\n
\n
\n
\n);\n","import { toast } from 'react-toastify';\nimport { ensureArrayLength } from '../util';\nimport { authProvider } from './auth';\n\nlet content = {\n bios: [],\n videos: {\n purpose: undefined\n },\n covers: {\n purpose: [],\n people: []\n }\n};\n\nconst biosCount = 6;\nconst emptyBio = { imageUrl: '', name: '', bio: '' };\n\nconst coversCount = 6;\nconst emptyCover = { imageUrl: '' };\n\nconst normaliseContent = async response => {\n const body = await response.json();\n\n if (response.status >= 300) {\n throw Error(body && body.message ? `${body.message} (status ${response.status})` : response.status);\n }\n\n ensureArrayLength(body.bios, biosCount, emptyBio);\n ensureArrayLength(body.covers.people, coversCount, emptyCover);\n ensureArrayLength(body.covers.purpose, coversCount, emptyCover);\n\n return body;\n};\n\n// Note this is loading from the *resource* URI\nexport const loadContent = async region => {\n try {\n const response = await fetch(`${process.env.REACT_APP_RESOURCE_BASE_URI}/${region}/content.json`, {\n method: 'GET',\n headers: {\n Accept: 'application/json'\n }\n });\n content = await normaliseContent(response);\n } catch (e) {\n toast.error(`Fatal error: Could not load content: ${e}`);\n }\n};\n\n// Note this is saving to the *API* URI\nexport const saveContent = async region => {\n try {\n const { accessToken } = await authProvider.getAccessToken();\n const response = await fetch(`${process.env.REACT_APP_API_BASE_URI}/content/${region}`, {\n method: 'PUT',\n body: JSON.stringify(content, null, 2),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`\n }\n });\n content = await normaliseContent(response);\n } catch (e) {\n toast.error(`Could not publish content: ${e}`);\n }\n};\n\nexport const getBios = () => content.bios;\n\nexport const updateBio = (index, bio) => {\n content.bios[index] = bio;\n};\n\nexport const getPurposeVideo = () => content.videos.purpose;\n\nexport const updatePurposeVideo = videoId => {\n content.videos.purpose = videoId;\n};\n\nexport const getCoverImages = () => content.covers;\n\nexport const updateCoverImages = (side, images) => {\n content.covers[side] = images;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { stopEventAnd } from '../../util';\nimport { isEditingEnabled } from '../../services/flags';\n\nconst Button = styled.button`\n display: inline-block;\n background: transparent;\n border: none;\n padding: 2px 4px;\n color: ${({ theme }) => theme.lightGrey};\n cursor: pointer;\n`;\n\nconst Icon = styled(FontAwesomeIcon)`\n margin-right: 0.2rem;\n`;\n\nexport const EditToggle = ({ editing, editText, edit, saveText, save, cancelText, cancel }) => {\n if (!isEditingEnabled()) {\n return null;\n }\n\n return editing ? (\n <>\n \n \n \n ) : (\n \n );\n};\n","import styled from 'styled-components';\n\nexport const Spin = styled.span`\n display: inline-block;\n animation-name: spin;\n animation-duration: 5000ms;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Spin } from '../animation/Spin';\n\nconst Container = styled(motion.div)`\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(0, 0, 0, 0.5);\n color: ${({ theme }) => theme.secondaryWhite};\n align-items: center;\n justify-content: center;\n text-align: center;\n z-index: 10;\n`;\n\nconst Text = styled.div`\n display: ${({ layout }) => (layout === 'horizontal' ? 'inline-block' : 'block')};\n margin-left: ${({ layout }) => (layout === 'horizontal' ? '0.5rem' : '0')};\n`;\n\nexport const ProgressOverlay = ({ iconSize, layout, text }) => (\n \n
\n \n \n \n {text || 'Saving...'}\n
\n
\n);\n","import styled from 'styled-components';\n\nexport const SectionHeading = styled.h2`\n font-family: Plain, Arial, sans-serif;\n width: 100%;\n margin: 0 1.5rem 1rem 1.5rem;\n font-size: 2rem;\n`;\n","import { transform } from 'popmotion';\nimport { triggerDistanceRatio, lateFadeTriggerDistanceRatio } from '../constants';\n\nconst { pipe, clamp, interpolate, nonlinearSpring, applyOffset } = transform;\n\nexport const createFade = windowWidth =>\n pipe(clamp(0, windowWidth * triggerDistanceRatio), nonlinearSpring(0.65, 0), interpolate([0, 6], [1, 0]));\n\nexport const createLateFade = windowWidth =>\n pipe(\n applyOffset(0, windowWidth * lateFadeTriggerDistanceRatio),\n clamp(0, windowWidth * lateFadeTriggerDistanceRatio),\n createFade(windowWidth)\n );\n\nexport const createVanish = windowWidth => val =>\n Math.abs(val) > Math.abs(triggerDistanceRatio * windowWidth) &&\n Math.sign(val) === Math.sign(triggerDistanceRatio * windowWidth)\n ? 'none'\n : 'block';\n","export const timePerImageMs = 4000;\nexport const crossFadeTimeMs = 1000;\n\nexport const restartIntervalDurationMs = 30 * 1000;\nexport const restartTimeoutMs = 5 * 60 * 1000;\n\nexport const draggerWidth = 80;\nexport const circleWidth = 15;\n\nexport const triggerDistanceRatio = 0.27;\nexport const lateFadeTriggerDistanceRatio = 0.3375;\n\n// Due to compatibility with Edge reasons SVGs can't use rem and em is broken, so I'm using breaking responsiveness :(\nexport const rootElementSize = 16;\n\nexport const purposeVideoElementId = 'video_purpose';\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion, useTransform } from 'framer-motion';\nimport { createFade, createVanish } from '../../services/animation';\n\nconst Fading = styled(motion.div)`\n opacity: ${({ opacity }) => opacity};\n display: ${({ display }) => display};\n`;\n\nexport const FadingContainer = ({ x, style, children, vanishOnly }) => {\n const opacity = useTransform(x, vanishOnly ? () => 1 : createFade(window.innerWidth));\n const display = useTransform(x, createVanish(window.innerWidth));\n\n return (\n \n {children}\n \n );\n};\n","import React, { createRef, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { toast } from 'react-toastify';\nimport styled from 'styled-components';\nimport { transparentize } from 'polished';\nimport { useTransform } from 'framer-motion';\nimport { handleFileUpload } from '../../services/upload';\nimport { EditableImage } from './EditableImage';\nimport { normaliseResourceUri } from '../../util';\nimport { getCoverImages, saveContent, updateCoverImages } from '../../services/content';\nimport { EditToggle } from './EditToggle';\nimport { ProgressOverlay } from './ProgressOverlay';\nimport { SectionHeading } from '../text/SectionHeading';\nimport { FadingContainer } from '../animation/FadingContainer';\n\nconst CoverEditorOuterContainer = styled.div``;\n\nconst EditToggleContainer = styled.div`\n position: absolute;\n top: 0.5rem;\n ${({ side }) => (side === 'people' ? 'right' : 'left')}: 0.5rem;\n z-index: 6;\n background-color: ${({ theme }) => transparentize(0.8, theme.secondaryBlack)};\n white-space: nowrap;\n\n & button {\n font-size: 1.25rem;\n }\n`;\n\nconst CoverEditor = styled.div`\n display: flex;\n background-color: ${({ theme }) => theme.secondaryBlack};\n color: ${({ theme }) => theme.secondaryWhite};\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 5;\n flex-direction: column;\n align-content: center;\n align-items: center;\n justify-content: center;\n justify-items: center;\n`;\n\nconst CoverEditorInner = styled.div`\n width: 838px;\n margin: 0 auto;\n`;\n\nconst CoverEditorImagesContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n margin: 0 -16px;\n`;\n\nconst CoverEditorImageContainer = styled.div`\n margin: 24px;\n`;\n\nconst CoverEditorImage = styled.img`\n display: inline-block;\n width: 240px;\n height: 240px;\n object-fit: cover;\n`;\n\nconst minimumCoverImageDimensions = { width: 1280, height: 1327 };\n\nconst ContentCoverEditableImage = ({ index, side, text, editing, imageUrl, setImageUrl }) => {\n const imageRef = createRef();\n const { region } = useParams();\n\n const updateImageUrl = async ([file]) => {\n const uploadResult = await handleFileUpload(file, minimumCoverImageDimensions);\n if (uploadResult && imageRef.current) {\n imageRef.current.src = uploadResult;\n setImageUrl(uploadResult);\n }\n };\n\n const notifyFileRejected = rejectedFiles =>\n toast.error(`File(s) are the wrong type: \"${rejectedFiles.map(file => file.name).join('\", \"')}\"`);\n\n return (\n \n \n \n \n \n );\n};\n\nconst imagesBeforeEditing = { people: [], purpose: [] };\n\nexport const EditableCover = ({ side, text, x, images, setImages, updateExternalImage }) => {\n const [editing, setEditing] = useState(false);\n const [busy, setBusy] = useState(false);\n const { region } = useParams();\n const xNeg = useTransform(x, val => -val);\n\n const edit = () => {\n imagesBeforeEditing[side] = JSON.parse(JSON.stringify(images));\n setEditing(true);\n };\n\n const save = async () => {\n setBusy(true);\n updateCoverImages(side, images);\n await saveContent(region);\n\n // The updated image URLs are available via `getCoverImages`, so use that to update the UI\n const newImages = getCoverImages()[side];\n setImages(newImages);\n newImages.map(({ imageUrl }) => imageUrl).forEach(updateExternalImage);\n\n setEditing(false);\n setBusy(false);\n };\n\n const cancel = () => {\n setImages(imagesBeforeEditing[side]);\n setEditing(false);\n };\n\n const setImageUrlAtIndex = index => imageUrl => {\n images.splice(index, 1, { imageUrl });\n setImages(images);\n };\n\n return (\n <>\n \n \n \n \n \n \n \n {busy && }\n \n {editing && (\n \n \n Edit {text} Cover\n

Manage images on the {text} side of the home page cover slide show.

\n \n {images.map(({ imageUrl }, index) => (\n \n ))}\n \n
\n
\n )}\n
\n \n );\n};\n","import styled from 'styled-components';\nimport { motion } from 'framer-motion';\n\nexport const PurpleTextContainer = styled(motion.div)`\n font-size: 15rem;\n margin: 0;\n padding: 0;\n z-index: 2;\n\n width: 100%;\n overflow: hidden;\n\n color: ${({ theme }) => theme.secondaryWhite};\n\n position: absolute;\n\n top: calc(50% - 15rem);\n`;\n","import React from 'react';\nimport { transform } from 'popmotion';\nimport { motion, useTransform } from 'framer-motion';\nimport { rootElementSize } from '../../constants';\nimport { createLateFade } from '../../services/animation';\nimport { PurpleTextContainer } from '../text/PurpleTextContainer';\n\nconst { pipe, clamp, interpolate } = transform;\n\nexport const PurpleText = ({ x, scaleFactor, text }) => {\n const direction = Math.sign(scaleFactor);\n const xDirected = useTransform(x, val => -direction * val);\n const lateFade = createLateFade(window.innerWidth);\n\n const scaledX = useTransform(\n x,\n pipe(\n val => scaleFactor * rootElementSize + direction * val,\n direction > 0 ? clamp(0, window.innerWidth) : clamp(-window.innerWidth, 0),\n val => `${val}px`\n )\n );\n\n const opacity = useTransform(xDirected, pipe(lateFade, interpolate([1, 0], [0, 1])));\n\n const filter = useTransform(\n xDirected,\n pipe(lateFade, interpolate([1, 0], [10, 0]), val => `blur(${val}px)`)\n );\n\n return (\n 0 ? '0' : undefined,\n width: direction > 0 ? scaledX : undefined,\n height: `${18}rem`,\n opacity,\n filter\n }}\n >\n 0 ? undefined : { x: scaledX }}>{text}\n \n );\n};\n","import React, { createRef, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport styled, { keyframes } from 'styled-components';\nimport { motion, useTransform } from 'framer-motion';\nimport { EditableCover } from '../admin/EditableCover';\nimport { crossFadeTimeMs, timePerImageMs } from '../../constants';\nimport { PurpleText } from './PurpleText';\nimport { getCoverImages } from '../../services/content';\nimport { normaliseResourceUri } from '../../util';\nimport { isAuthenticated } from '../../services/auth';\n\nconst ImageFlicker = styled(motion.div)`\n display: block;\n position: relative;\n background-color: ${({ color, theme }) => (color === 'people' ? theme.primaryRed : theme.primaryBlue)};\n width: ${({ width }) => width};\n height: 100%;\n max-height: 100vh;\n`;\n\nconst framePoint = (value, totalPicturesCount) => `${(value / (totalPicturesCount * timePerImageMs)) * 100}%`;\n\nconst createFadeOutIn = ({ totalPicturesCount }) => keyframes`\n 0%, 100% {\n opacity: 0;\n }\n ${framePoint(crossFadeTimeMs, totalPicturesCount)} {\n opacity: 1;\n }\n ${framePoint(timePerImageMs + crossFadeTimeMs, totalPicturesCount)} {\n opacity: 1;\n }\n ${framePoint(timePerImageMs + crossFadeTimeMs * 2, totalPicturesCount)} {\n opacity: 0;\n }\n`;\n\nconst ImageContainer = styled.div`\n width: 100%;\n height: 100%;\n max-height: 100vh;\n position: absolute;\n left: 0;\n background-image: url(${({ imageUrl }) => imageUrl});\n background-repeat: no-repeat;\n background-position-x: 0;\n background-position-y: 20%;\n background-size: cover;\n transform: ${({ isFace }) => (isFace ? 'scaleX(-1)' : null)};\n opacity: 0;\n animation: ${({ totalPicturesCount }) => timePerImageMs * totalPicturesCount}ms ease-in-out\n ${({ animationDelay }) => animationDelay}ms infinite ${({ animationName }) => animationName};\n`;\n\n// Generate `animation-delay` values such that the image cycle is dictated by clock time, not page load time\n// This means that when an image is updated, it will slot into the correct part of the animation cycle\nconst getAnimationDelayMs = (side, index, allImages) => {\n const cyclePeriod = timePerImageMs * (allImages.people.length + allImages.purpose.length);\n const offset = side === 'people' ? 0 : allImages.people.length;\n return (index + offset) * timePerImageMs - (Date.now() % cyclePeriod);\n};\n\nexport const ContentCover = ({ x, side, text }) => {\n const { region } = useParams();\n const renderTimestamp = Date.now();\n const allImages = getCoverImages();\n const totalPicturesCount = allImages.people.length + allImages.purpose.length;\n const [images, setImages] = useState(allImages[side]);\n const textScaleFactor = side === 'people' ? -28.375 : 24.75;\n const direction = Math.sign(textScaleFactor);\n const width = useTransform(x, val => `${window.innerWidth / 2 + val * direction}px`);\n\n const imageContainerRefs = images.map(() => createRef());\n const updateExternalImage = (imageUrl, index) => {\n if (imageContainerRefs[index] && imageContainerRefs[index].current) {\n const normalisedUri = normaliseResourceUri(imageUrl, region, side, index);\n imageContainerRefs[index].current.style.backgroundImage = `url(${normalisedUri})`;\n }\n };\n\n // Note that each `ImageContainer` receives a `key` that includes the current timestamp, which forces React to\n // render all the images whenever the parent `ContentCover` is rendered, which keeps the animations in sync\n return (\n <>\n \n {images.map(({ imageUrl }, index) => {\n const normalisedImageUrl = normaliseResourceUri(imageUrl, region, side, index);\n return (\n \n );\n })}\n \n \n {isAuthenticated() && (\n \n )}\n \n );\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\n\nconst ArrowHead = styled(motion.div)`\n border-bottom: white solid 2px;\n border-left: white solid 2px;\n transform: rotate(45deg);\n width: 1rem;\n height: 1rem;\n position: absolute;\n`;\n\nconst ArrowLine = styled(motion.div)`\n border-bottom: white solid 2px;\n width: 2rem;\n height: 0.5rem;\n position: absolute;\n left: -2px;\n`;\n\nconst ArrowContainer = styled(motion.div)`\n position: absolute;\n z-index: 2;\n top: 80%;\n`;\n\nexport const ArrowText = styled(motion.div)`\n font-weight: lighter;\n font-size: 1.5rem;\n color: ${props => props.theme.secondaryWhite};\n position: absolute;\n top: calc(80% - 0.75rem);\n width: 8rem;\n`;\n\nexport const ArrowSeparationLine = styled(motion.div)`\n border-bottom: white dashed 2px;\n z-index: 2;\n width: 6rem;\n height: 0.5rem;\n position: absolute;\n top: 80%;\n`;\n\nexport const Arrow = React.forwardRef((props, ref) => (\n \n \n \n \n));\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion, useTransform } from 'framer-motion';\nimport { transform } from 'popmotion';\nimport { Arrow, ArrowSeparationLine, ArrowText } from './Arrow';\nimport { FadingContainer } from '../animation/FadingContainer';\n\nconst { pipe, interpolate } = transform;\n\nconst ArrowContainer = styled(motion.div)`\n position: absolute;\n z-index: 3;\n top: 70%;\n left: 50%;\n`;\n\nconst useInterpolatedTransform = (x, minIn, maxIn, minOut, maxOut) =>\n useTransform(\n x,\n pipe(interpolate([minIn, maxIn], [minOut, maxOut]), val => `${val}rem`)\n );\n\nexport const MovingArrowContainer = ({ x }) => {\n const halfWidth = Math.floor(window.innerWidth / 2);\n const arrowXVal = useTransform(x, val => `calc(50% + ${val}px)`);\n const rightText = useInterpolatedTransform(x, 0, halfWidth, 6, 3);\n const rightArrow = useInterpolatedTransform(x, 0, halfWidth, 5, 2);\n const leftText = useInterpolatedTransform(x, -halfWidth, 0, 3, 6);\n const leftArrow = useInterpolatedTransform(x, -halfWidth, 0, 2, 5);\n const xNeg = useTransform(x, val => -val);\n const xAbs = useTransform(x, Math.abs);\n\n return (\n \n \n Drag Left\n \n \n \n \n \n \n Drag Right\n \n \n \n );\n};\n","import GoogleAnalytics from 'react-ga';\nimport { isGoogleAnalyticsEnabled } from './flags';\n\nexport const initialiseGoogleAnalytics = () => {\n if (isGoogleAnalyticsEnabled()) {\n GoogleAnalytics.initialize(process.env.REACT_APP_GA_TRACKING_ID);\n }\n};\n\nexport const sendAnalyticsPageView = () => {\n if (isGoogleAnalyticsEnabled()) {\n GoogleAnalytics.pageview(window.location.pathname + window.location.search);\n }\n};\n\nexport const sendAnalyticsEvent = event => {\n if (isGoogleAnalyticsEnabled()) {\n GoogleAnalytics.event(event);\n }\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion, useTransform } from 'framer-motion';\nimport { transform } from 'popmotion';\nimport { draggerWidth } from '../../constants';\nimport { sendAnalyticsEvent } from '../../services/analytics';\nimport { isGoogleAnalyticsEnabled } from '../../services/flags';\n\nconst { pipe, interpolate } = transform;\n\nconst Dragger = styled(motion.div)`\n position: absolute;\n width: ${draggerWidth}rem;\n height: 100%;\n left: calc(50% - ${draggerWidth / 2}rem);\n z-index: 3;\n background-color: transparent;\n cursor: ew-resize;\n`;\n\nexport const DragLine = ({ x }) => {\n const halfWidth = window.innerWidth / 2;\n\n if (isGoogleAnalyticsEnabled()) {\n x.onChange(() => {\n if (Math.abs(x.get()) === halfWidth) {\n const action = x.current > 0 ? 'purpose' : 'people';\n sendAnalyticsEvent({ category: 'Expansion', action });\n }\n });\n }\n\n const width = useTransform(\n x,\n pipe(interpolate([0, halfWidth], [draggerWidth, 20]), val => `${val}rem`)\n );\n\n const left = useTransform(\n x,\n pipe(interpolate([0, halfWidth], [draggerWidth / 2, 20]), val => `calc(50% - ${val}rem)`)\n );\n\n return (\n \n );\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion, useTransform } from 'framer-motion';\nimport { createLateFade } from '../../services/animation';\n\nconst ContentContainer = styled(motion.div)`\n display: flex;\n flex: 1;\n width: 100%;\n height: 100%;\n max-height: 100vh;\n\n color: ${({ theme }) => theme.secondaryWhite};\n background-color: ${({ theme }) => theme.secondaryBlack};\n\n justify-content: flex-start;\n align-items: flex-start;\n\n position: absolute;\n`;\n\nexport const ContentBase = ({ x, xIsNegative, children }) => {\n const lateFade = createLateFade(window.innerWidth);\n const opacity = useTransform(x, val => lateFade(xIsNegative ? -val : val));\n return {children};\n};\n","import styled from 'styled-components';\nimport { circleWidth } from '../constants';\n\nexport const Column = styled.div`\n display: flex;\n flex-direction: column;\n height: 100%;\n`;\n\nexport const ImageColumn = styled.div`\n display: flex;\n flex-direction: row;\n flex: 1;\n padding-top: ${circleWidth + 1}rem;\n flex-wrap: wrap;\n align-content: flex-start;\n margin-left: -${circleWidth - 2}rem;\n max-height: calc(100vh - 18rem);\n max-width: 50%;\n`;\n","import styled from 'styled-components';\n\nexport const Logo = styled.div`\n width: 8rem;\n height: 8rem;\n\n margin: 4rem 4rem 0 4rem;\n z-index: 5;\n cursor: pointer;\n\n background-image: url('Telstra_Purple_Logo_RGB_White.png');\n background-size: contain;\n background-repeat: no-repeat;\n background-color: ${({ theme }) => theme.secondaryBlack};\n`;\n","import styled from 'styled-components';\n\nexport const PeopleHeadline = styled.article`\n font-size: 2rem;\n margin: 4rem 4rem 0;\n max-width: 15rem;\n`;\n","import styled from 'styled-components';\nimport { circleWidth } from '../../constants';\n\nexport const PurpleQuarterCirclePeople = styled.div`\n z-index: 2;\n width: ${circleWidth}rem;\n height: ${circleWidth}rem;\n border-radius: 0 0 ${circleWidth}rem 0;\n margin-left: ${circleWidth / 2}rem;\n background-color: ${({ theme }) => theme.primaryBlue};\n`;\n","import styled from 'styled-components';\nimport { circleWidth } from '../../constants';\n\nexport const PurpleRectanglePeople = styled.div`\n z-index: 2;\n width: ${circleWidth / 2}rem;\n height: calc(100% - ${circleWidth}rem);\n background-color: ${({ theme }) => theme.primaryRed};\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { toast } from 'react-toastify';\nimport { transparentize } from 'polished';\nimport { stopEventIf } from '../../util';\n\n// This ensures HTML cannot be copied from external sources\nconst updateWith = (setText, name) => evt => {\n const text = evt.currentTarget.innerText.trim();\n if (text.length === 0) {\n toast.warn(`You have entered an empty ${name}`);\n }\n setText(text);\n};\n\nconst getBorderColor = (theme, editing, text) => {\n if (editing) {\n return text ? theme.darkGrey : theme.validationRed;\n }\n return 'transparent';\n};\n\nconst Container = styled.div`\n border-width: 1px;\n border-style: solid;\n border-color: ${({ theme, editing, text }) => getBorderColor(theme, editing, text)};\n border-radius: 0.25rem;\n margin: ${({ editing }) => (editing ? '-0.25rem -0.5rem' : 'none')};\n padding: ${({ editing }) => (editing ? '0.25rem 0.5rem' : 'none')};\n width: 100%;\n min-height: 1.4rem;\n\n &:hover {\n background-color: ${({ theme, contentEditable }) =>\n contentEditable ? transparentize(0.8, theme.lightGrey) : 'transparent'};\n }\n`;\n\nexport const EditableText = ({ name, text, setText, editing }) => (\n \n);\n","import { restartIntervalDurationMs, restartTimeoutMs } from '../constants';\n\nlet lastInteraction;\n\nconst checkRestart = (isRestartBlocked, restart) => () => {\n if (lastInteraction < Date.now() - restartTimeoutMs && !isRestartBlocked()) {\n restart();\n }\n};\n\nexport const initialiseInteractionTimeout = (isRestartBlocked, restart) => {\n lastInteraction = Date.now();\n setInterval(checkRestart(isRestartBlocked, restart), restartIntervalDurationMs);\n};\n\nexport const interactionOccurred = () => {\n lastInteraction = Date.now();\n};\n","import React, { createRef, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { toast } from 'react-toastify';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport { sendAnalyticsEvent } from '../../services/analytics';\nimport { EditableText } from '../admin/EditableText';\nimport { EditableImage } from '../admin/EditableImage';\nimport { EditToggle } from '../admin/EditToggle';\nimport { saveContent, updateBio } from '../../services/content';\nimport { ProgressOverlay } from '../admin/ProgressOverlay';\nimport { handleFileUpload } from '../../services/upload';\nimport { normaliseResourceUri } from '../../util';\nimport { interactionOccurred } from '../../services/interaction';\nimport { isAuthenticated } from '../../services/auth';\n\nconst BioBox = styled(motion.div)`\n cursor: pointer;\n padding: 0 1.5rem 1.5rem 1.5rem;\n width: ${({ isZoomed }) => (isZoomed ? '32rem' : 'auto')};\n display: flex;\n background-color: ${({ theme }) => theme.secondaryBlack};\n`;\n\nconst BioBoxInner = styled.div`\n position: relative;\n width: 100%;\n`;\n\nconst BioBoxIcon = styled(motion.div)`\n cursor: pointer;\n position: absolute;\n top: -2px;\n right: 4px;\n font-size: x-large;\n line-height: 1;\n\n &:before {\n content: '\\u25f3';\n color: ${({ theme }) => theme.lightGrey};\n display: ${({ isZoomed }) => (isZoomed ? 'none' : 'block')};\n }\n\n &:after {\n content: '\\u00D7';\n color: ${({ theme }) => theme.darkGrey};\n display: ${({ isZoomed }) => (isZoomed ? 'block' : 'none')};\n }\n`;\n\nconst BioImageContainer = styled.div`\n width: 200px;\n height: 150px;\n overflow: hidden;\n text-align: center;\n`;\n\nconst BioImage = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n\n &:hover {\n outline: ${({ theme, isZoomed }) => (isZoomed ? undefined : `solid 1px ${theme.lightGrey}`)};\n }\n`;\n\nconst Text = styled.article`\n display: ${({ isZoomed }) => (isZoomed ? 'block' : 'none')};\n font-size: xx-small;\n padding: 0 0;\n`;\n\nconst Frame = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: ${({ theme }) => theme.secondaryBlack};\n z-index: 4;\n opacity: 0.95;\n cursor: pointer;\n`;\n\nconst TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst EditToggleContainer = styled.div`\n position: absolute;\n display: inline-block;\n top: -1px;\n right: ${({ editing }) => (editing ? '0' : '32px')};\n\n & button {\n font-size: x-small;\n }\n`;\n\nconst minimumBioImageDimensions = { width: 400, height: 300 };\n\nconst dataBeforeEditing = {};\n\nexport const Bio = ({ index, bioData }) => {\n const [isZoomed, setIsZoomed] = useState(false);\n const [editing, setEditing] = useState(false);\n const [busy, setBusy] = useState(false);\n const [data, setData] = useState(bioData);\n const { region } = useParams();\n\n const animate = isZoomed\n ? {\n position: 'absolute',\n left: '40%',\n top: '30%',\n scale: 2,\n zIndex: 4,\n flexDirection: 'row'\n }\n : {\n position: 'static',\n scale: 1,\n zIndex: 3,\n flexDirection: 'column'\n };\n\n const toggleZoom = () => {\n if (!isZoomed) {\n sendAnalyticsEvent({ category: 'Bio', action: data.name });\n setIsZoomed(true);\n } else if (!editing) {\n setIsZoomed(false);\n }\n interactionOccurred();\n };\n\n const edit = () => {\n if (isAuthenticated()) {\n Object.assign(dataBeforeEditing, data);\n setEditing(true);\n }\n };\n\n const save = async () => {\n if (isAuthenticated()) {\n setBusy(true);\n updateBio(index, data);\n await saveContent(region);\n setEditing(false);\n setBusy(false);\n }\n };\n\n const cancel = () => {\n setData(dataBeforeEditing);\n setEditing(false);\n };\n\n const setName = name => setData({ ...data, name });\n\n const setBio = bio => setData({ ...data, bio });\n\n const imageRef = createRef();\n\n const updateImageDataUrl = async ([file]) => {\n const uploadResult = await handleFileUpload(file, minimumBioImageDimensions);\n if (imageRef.current && uploadResult) {\n imageRef.current.src = uploadResult;\n setData({ ...data, imageUrl: uploadResult });\n }\n };\n\n const notifyFileRejected = rejectedFiles =>\n toast.error(`File(s) are the wrong type: \"${rejectedFiles.map(file => file.name).join('\", \"')}\"`);\n\n return (\n <>\n \n \n {busy && }\n \n \n \n \n \n \n \n {isAuthenticated() && isZoomed && (\n \n \n \n )}\n \n

\n \n

\n \n \n \n
\n
\n \n \n );\n};\n","import React from 'react';\nimport { ContentBase } from '../animation/ContentBase';\nimport { Column, ImageColumn } from '../Column';\nimport { Logo } from '../branding/Logo';\nimport { PeopleHeadline } from '../text/PeopleHeadline';\nimport { PurpleQuarterCirclePeople } from '../branding/PurpleQuarterCirclePeople';\nimport { PurpleRectanglePeople } from '../branding/PurpleRectanglePeople';\nimport { SectionHeading } from '../text/SectionHeading';\nimport { Bio } from '../ui/Bio';\nimport { getBios } from '../../services/content';\n\nexport const People = ({ x }) => (\n \n \n x.set(0)} src=\"Telstra_Purple_Logo_RGB_White.png\" alt=\"Telstra Purple Logo\" />\n \n \n People giving purpose to technology\n \n \n \n \n \n \n Meet the Purple Peeps\n {getBios().map((bioData, index) => (\n \n ))}\n \n \n);\n","import styled from 'styled-components';\n\nexport const PurposeHeadline = styled.article`\n font-size: 3rem;\n margin: 4rem 4rem 0;\n width: 70%;\n max-width: 75rem;\n`;\n","import styled from 'styled-components';\n\nexport const TelstraPurpleIntroductionText = styled.article`\n font-size: 1.5rem;\n margin: 1rem 4rem 0 4rem;\n width: 70%;\n max-width: 75rem;\n`;\n","// YouTube API reference is here: https://developers.google.com/youtube/iframe_api_reference\n\n// Map of { id: { videoId, player } }; id is the DOM ID where the player is loaded; videoId is the video ID; player is the `YT.Player` object\nconst players = {};\n\n// Map of { id: videoId }; id is the DOM ID to load the video into; videoId is the video to load\nconst pendingPlayers = {};\n\nexport const loadYouTubeVideo = (id, videoId) => {\n if (!window.YT || !window.YT.Player) {\n // The API isn't loaded yet, so queue the player for creation later\n pendingPlayers[id] = videoId;\n return;\n }\n\n // Check whether a video is already loaded in this element\n if (players[id]) {\n // If the video loaded is the same as the video being loaded, then we're done\n if (players[id].videoId === videoId) {\n return;\n }\n\n // The YT API doesn't give a `restore()` or similar function, so we have to clean up ourselves\n // The new `div` is created to be the container for the next video\n const container = document.getElementById(id);\n if (container) {\n const replacement = document.createElement('div');\n replacement.id = id;\n container.parentElement.insertBefore(replacement, container);\n container.remove();\n }\n }\n\n // The YouTube API is unreliable, it seems; I tried several different (better) workarounds but this `setTimeout` was\n // the only thing that would reliably get the video to load on page load\n setTimeout(() => {\n players[id] = {\n videoId,\n player: new window.YT.Player(id, {\n videoId,\n width: '100%',\n height: '100%',\n playerVars: {\n controls: 0,\n // Does not disable related videos, but sticks to the same channel.\n // https://developers.google.com/youtube/player_parameters.html?playerVersion=HTML5#rel\n rel: 0\n }\n })\n };\n }, 0);\n};\n\n// This function should be called once only\nexport const initialiseYouTubeAPI = () => {\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n window.onYouTubeIframeAPIReady = () => {\n // If any videos attempted to load before the YT API is ready, load them again now\n Object.keys(pendingPlayers).forEach(id => {\n loadYouTubeVideo(id, pendingPlayers[id]);\n delete pendingPlayers[id];\n });\n };\n};\n\nexport const isYouTubeVideoPlaying = id =>\n players[id] && typeof players[id].player.getPlayerState === 'function' && players[id].player.getPlayerState() === 1;\n\nexport const playYouTubeVideo = id =>\n players[id] && typeof players[id].player.playVideo === 'function' && players[id].player.playVideo();\n\nexport const pauseYouTubeVideo = id =>\n players[id] && typeof players[id].player.pauseVideo === 'function' && players[id].player.pauseVideo();\n\nexport const seekYouTubeVideo = (id, time = 0) =>\n players[id] && typeof players[id].player.seekTo === 'function' && players[id].player.seekTo(time);\n","import React, { useEffect, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport styled from 'styled-components';\nimport {\n isYouTubeVideoPlaying,\n loadYouTubeVideo,\n pauseYouTubeVideo,\n playYouTubeVideo,\n seekYouTubeVideo\n} from '../../services/youtube';\nimport { sendAnalyticsEvent } from '../../services/analytics';\nimport { EditToggle } from '../admin/EditToggle';\nimport { EditableText } from '../admin/EditableText';\nimport { saveContent, updatePurposeVideo } from '../../services/content';\nimport { ProgressOverlay } from '../admin/ProgressOverlay';\nimport { isAuthenticated } from '../../services/auth';\n\nconst YouTubeVideoContainer = styled.div`\n position: relative;\n width: 100%;\n height: 100%;\n`;\n\nconst VideoEditControlsContainer = styled.div`\n position: absolute;\n top: -2rem;\n right: 0;\n text-align: right;\n z-index: 5;\n\n & button {\n font-size: large;\n }\n`;\n\nconst VideoIdContainer = styled.div`\n display: ${({ editing }) => (editing ? 'inline-block' : 'none')};\n margin-right: 1rem;\n`;\n\nconst PlayerContainer = styled.div`\n z-index: 4;\n max-width: 75rem;\n`;\n\nconst Label = styled.label`\n margin-right: 2rem;\n white-space: nowrap;\n`;\n\nconst dataBeforeEditing = {};\n\nconst videoIdTransformPatterns = [\n {\n pattern: /^https?:\\/\\/(?:www\\.)?youtube\\.com\\/watch\\?(?:.*&)?v=(.+)(?:&.*)?$/,\n replacement: '$1'\n },\n {\n pattern: /^https?:\\/\\/youtu\\.be\\/(.+)$/,\n replacement: '$1'\n }\n];\n\nexport const YouTubeVideo = ({ id, data, x }) => {\n const [videoId, setVideoId] = useState(data.videoId);\n const [editing, setEditing] = useState(false);\n const [busy, setBusy] = useState(false);\n const { region } = useParams();\n\n const setNormalisedVideoIdOrUrl = input =>\n setVideoId(\n videoIdTransformPatterns.reduce(\n (result, { pattern, replacement }) => (pattern.test(result) ? result.replace(pattern, replacement) : result),\n input\n )\n );\n\n const edit = () => {\n setEditing(true);\n Object.assign(dataBeforeEditing, data);\n };\n\n const save = async () => {\n if (isAuthenticated()) {\n setBusy(true);\n updatePurposeVideo(videoId);\n await saveContent(region);\n loadYouTubeVideo(id, videoId);\n setEditing(false);\n setBusy(false);\n }\n };\n\n const cancel = () => {\n setVideoId(dataBeforeEditing.videoId);\n setEditing(false);\n };\n\n loadYouTubeVideo(id, videoId);\n\n useEffect(\n () =>\n x.onChange(() => {\n const videoCanPlay = x.get() >= window.innerWidth / 2;\n const isPlaying = isYouTubeVideoPlaying(id);\n if (videoCanPlay && !isPlaying) {\n seekYouTubeVideo(id);\n playYouTubeVideo(id);\n sendAnalyticsEvent({ category: 'Video', action: videoId });\n } else if (!videoCanPlay && isPlaying) {\n pauseYouTubeVideo(id);\n }\n }),\n [x, id, videoId]\n );\n\n return (\n \n {isAuthenticated() && (\n \n {busy && }\n {editing && }\n \n \n \n \n \n )}\n \n \n );\n};\n","import styled from 'styled-components';\nimport { circleWidth } from '../../constants';\n\nexport const PurpleHalfCirclePurpose = styled.div`\n z-index: 2;\n background-color: ${({ theme }) => theme.primaryBlue};\n width: ${circleWidth}rem;\n height: ${circleWidth * 2}rem;\n border-bottom-right-radius: ${circleWidth * 2}rem;\n border-top-right-radius: ${circleWidth * 2}rem;\n margin-left: ${circleWidth / 2}rem;\n`;\n","import styled from 'styled-components';\nimport { circleWidth } from '../../constants';\n\nexport const PurpleRectanglePurpose = styled.div`\n z-index: 2;\n width: ${circleWidth / 2}rem;\n height: calc(100% - ${circleWidth * 2}rem);\n background-color: ${({ theme }) => theme.primaryRed};\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { ContentBase } from '../animation/ContentBase';\nimport { Column } from '../Column';\nimport { Logo } from '../branding/Logo';\nimport { PurposeHeadline } from '../text/PurposeHeadline';\nimport { TelstraPurpleIntroductionText } from '../text/TelstraPurpleIntroductionText';\nimport { YouTubeVideo } from '../ui/YouTubeVideo';\nimport { PurpleHalfCirclePurpose } from '../branding/PurpleHalfCirclePurpose';\nimport { PurpleRectanglePurpose } from '../branding/PurpleRectanglePurpose';\nimport { getPurposeVideo } from '../../services/content';\nimport { purposeVideoElementId } from '../../constants';\n\nconst PurposeVideoContainer = styled.div`\n flex: 1;\n margin: 4rem;\n width: 70%;\n`;\n\nexport const Purpose = ({ x }) => (\n \n \n x.set(0)} />\n \n \n We’re a collective of passionate people who give purpose to technology.\n \n Telstra Purple is a newly aggregated entity of 8 technology consulting organisations. The core of everything we\n do is deliberately purposeful - we listen, we learn, we solve problems, we design, we share. We're Telstra\n Purple.\n \n \n \n \n \n \n \n \n \n \n);\n","import React, { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useMotionValue } from 'framer-motion';\nimport { ContentCover } from './animation/ContentCover';\nimport { MovingArrowContainer } from './ui/MovingArrowContainer';\nimport { DragLine } from './ui/DragLine';\nimport { People } from './content/People';\nimport { Purpose } from './content/Purpose';\nimport { ProgressOverlay } from './admin/ProgressOverlay';\nimport { sendAnalyticsPageView } from '../services/analytics';\nimport { purposeVideoElementId } from '../constants';\nimport { isYouTubeVideoPlaying } from '../services/youtube';\nimport { initialiseInteractionTimeout, interactionOccurred } from '../services/interaction';\nimport { loadContent } from '../services/content';\n\nexport const Presentation = () => {\n const [loading, setLoading] = useState(true);\n const x = useMotionValue(0);\n const { region } = useParams();\n\n loadContent(region).then(() => setLoading(false));\n\n sendAnalyticsPageView();\n\n // Reset the slider if the window is resized\n window.addEventListener('resize', () => x.set(0));\n\n // Reset the slider after a period of non-interaction, ready for the next viewer\n initialiseInteractionTimeout(\n () => isYouTubeVideoPlaying(purposeVideoElementId),\n () => x.set(0)\n );\n\n // Moving the slider `x` position is an interaction\n x.onChange(interactionOccurred);\n\n return loading ? (\n \n ) : (\n <>\n \n \n \n \n \n \n \n );\n};\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { PurpleHalfCirclePurpose } from './branding/PurpleHalfCirclePurpose';\nimport { PurpleRectanglePurpose } from './branding/PurpleRectanglePurpose';\nimport { Column } from './Column';\nimport { Logo } from './branding/Logo';\n\n// Hardcoded list, it's only for this component\nconst regions = [\n {\n path: '/new-south-wales',\n label: 'New South Wales'\n },\n {\n path: '/queensland',\n label: 'Queensland'\n },\n {\n path: '/singapore',\n label: 'Singapore'\n },\n {\n path: '/united-kingdom',\n label: 'United Kingdom'\n },\n {\n path: '/victoria',\n label: 'Victoria'\n },\n {\n path: '/western-australia',\n label: 'Western Australia'\n }\n];\n\nconst Container = styled.div`\n position: absolute;\n display: flex;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.secondaryWhite};\n`;\n\nconst Heading = styled.h1`\n font-size: 2rem;\n font-weight: normal;\n`;\n\nconst Inner = styled.div`\n padding: 0.5rem 1.5rem;\n border: 2px solid ${({ theme }) => theme.secondaryWhite};\n border-radius: 8px;\n`;\n\nconst InnerContainer = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n flex-direction: column;\n align-items: center;\n align-content: center;\n justify-items: center;\n justify-content: center;\n`;\n\nconst Paragraph = styled.p`\n color: ${({ theme }) => theme.secondaryWhite};\n`;\n\nconst List = styled.ul`\n text-align: center;\n list-style: none;\n padding: 0;\n`;\n\nconst RegionLink = styled(Link)`\n color: ${({ theme }) => theme.secondaryWhite};\n font-size: x-large;\n`;\n\nexport const RegionList = () => (\n \n \n \n \n \n \n Meet Telstra Purple\n \n Please select a region to display the relevant presentation:\n \n {regions.map(({ path, label }) => (\n
  • \n {label}\n
  • \n ))}\n
    \n
    \n
    \n
    \n \n \n \n \n
    \n);\n","import React from 'react';\nimport styled from 'styled-components';\nimport { AuthenticationState } from 'react-aad-msal';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { toast } from 'react-toastify';\nimport { isAuthenticationEnabled } from '../../services/flags';\nimport { Spin } from '../animation/Spin';\n\nconst Container = styled.div`\n position: absolute;\n bottom: 0.5rem;\n right: 0.5rem;\n z-index: 6;\n`;\n\nconst Button = styled.button`\n color: ${({ theme }) => theme.secondaryWhite};\n background: rgba(0, 0, 0, 0.25);\n padding: 2px 4px;\n border: none;\n cursor: pointer;\n`;\n\nconst Icon = styled(FontAwesomeIcon)`\n margin-right: 4px;\n`;\n\nexport const AuthenticationControl = ({ login, logout, authenticationState, accountInfo, error }) => {\n if (!isAuthenticationEnabled()) {\n return null;\n }\n\n if (error) {\n toast.error(`Authentication error: ${error.errorMessage}`);\n }\n\n const isInProgress = authenticationState === AuthenticationState.InProgress;\n\n return (\n \n {authenticationState === AuthenticationState.Authenticated ? (\n \n ) : (\n \n )}\n \n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n // eslint-disable-next-line no-param-reassign\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n // eslint-disable-next-line no-console\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n // eslint-disable-next-line no-console\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n // eslint-disable-next-line no-console\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n // eslint-disable-next-line no-console\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n // eslint-disable-next-line no-console\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { toast } from 'react-toastify';\n\nexport const initialiseToast = () =>\n toast.configure({\n position: toast.POSITION.TOP_CENTER,\n autoClose: 10000\n });\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { config } from 'dotenv';\nimport 'react-toastify/dist/ReactToastify.css';\nimport './index.css';\nimport { App } from './components/App';\nimport * as serviceWorker from './serviceWorker';\nimport { initialiseToast } from './services/toast';\nimport { initialiseGoogleAnalytics } from './services/analytics';\nimport { initialiseYouTubeAPI } from './services/youtube';\nimport { initialiseIcons } from './services/icons';\n\nconfig();\n\ninitialiseToast();\ninitialiseGoogleAnalytics();\ninitialiseIcons();\ninitialiseYouTubeAPI();\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change unregister() to register() below.\n// Note this comes with some pitfalls. Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import { library } from '@fortawesome/fontawesome-svg-core';\nimport {\n faEdit,\n faTimes,\n faTimesCircle,\n faUpload,\n faImage,\n faSignInAlt,\n faSignOutAlt,\n faSpinner\n} from '@fortawesome/free-solid-svg-icons';\n\nexport const initialiseIcons = () =>\n library.add(faTimes, faTimesCircle, faUpload, faEdit, faImage, faSignInAlt, faSignOutAlt, faSpinner);\n","import React from 'react';\nimport { BrowserRouter, Route, Switch } from 'react-router-dom';\nimport { AzureAD } from 'react-aad-msal';\nimport { ThemeProvider } from 'styled-components';\nimport { telstraTheme } from '../theme';\nimport { authProvider } from '../services/auth';\nimport { Presentation } from './Presentation';\nimport { RegionList } from './RegionList';\nimport { AuthenticationControl } from './admin/AuthenticationControl';\n\nexport const App = () => (\n \n {authProviderProps => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n \n);\n"],"sourceRoot":""}