!function(e){var t={};function a(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)a.d(n,r,function(t){return e[t]}.bind(null,r));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=5)}([function(e,t){e.exports=React},function(e,t){e.exports=ReactBootstrap},function(e,t){e.exports=gapi},function(e,t){e.exports=ReactDOM},function(e,t){e.exports=MathJax},function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(3),o=a(1);const s=Object(n.createContext)({time:0,examData:{questions:[]},stale:!1});var c=s;function u(){return Object(n.useContext)(s).time}function m(){return Object(n.useContext)(s).examData}function i({text:e,suffixType:t}){return r.a.createElement("div",{style:{color:"red"}},e," ",e&&{exam:"If this error persists, contact your course staff or use the alternative exam medium.",alerts:""}[t||"exam"])}function d({children:e,loading:t,disabled:a,onClick:n,style:l,variant:s="primary",size:c}){return r.a.createElement(o.Button,{variant:s,onClick:()=>n(),disabled:a,style:l,size:c},t&&r.a.createElement(o.Spinner,{as:"span",animation:"border",size:"sm",role:"status","aria-hidden":"true",style:{marginRight:10}}),e)}function E({send:e}){const t=m(),[a,l]=Object(n.useState)(""),[s,c]=Object(n.useState)("Overall Exam"),[u,E]=Object(n.useState)(!1),[f,p]=Object(n.useState)("");return r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement(o.Card,null,r.a.createElement(o.Card.Header,null,"Request Clarification"),r.a.createElement(o.Card.Body,null,r.a.createElement(o.Form,null,r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"textarea",rows:3,value:a,placeholder:"Send a private message to staff.",onChange:e=>l(e.target.value)})),r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"select",value:s,onChange:e=>c(e.target.value),custom:!0},r.a.createElement("option",{value:null},"Overall Exam"),t.questions.map(e=>r.a.createElement("option",{key:e},e)))),r.a.createElement(o.Form.Group,null,r.a.createElement(d,{loading:u,disabled:u,onClick:async()=>{E(!0);const t=await e("ask_question",{question:"Overall Exam"===s?null:s,message:a});t?p(t):l(""),E(!1)}},"Send"),r.a.createElement(i,{text:f,suffixType:"alerts"}))))),r.a.createElement("br",null)))}function f({onDownloadClick:e}){const[t,a]=Object(n.useState)(!1),[l,o]=Object(n.useState)("");return r.a.createElement(r.a.Fragment,null,r.a.createElement(d,{onClick:async()=>{a(!0),o("");const t=await e();t&&o(t),a(!1)},disabled:t,loading:t},"Connect to Server"),r.a.createElement(i,{text:l,suffixType:"alerts"}))}function p({staffData:e,send:t}){const[a,l]=Object(n.useState)(""),[s,c]=Object(n.useState)(!1),[u,m]=Object(n.useState)(""),[E,f]=Object(n.useState)("Overall Exam"),[p,g]=Object(n.useState)("immediate"),[h,b]=Object(n.useState)(null),[y,v]=Object(n.useState)(!1),[C,x]=Object(n.useState)("");return r.a.createElement(r.a.Fragment,null,r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement(o.Card,null,r.a.createElement(o.Card.Header,null,"Create Announcement"),r.a.createElement(o.Card.Body,null,r.a.createElement(o.Form,null,r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"textarea",rows:3,value:a,placeholder:"Broadcast a message to all students in this exam.",onChange:e=>l(e.target.value)})),s?r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"textarea",rows:3,value:u,placeholder:"Override the associated spoken audio message.",onChange:e=>m(e.target.value)})):null,r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"select",value:E,onChange:e=>f(e.target.value),custom:!0},r.a.createElement("option",{value:null},"Overall Exam"),e.exam.questions.map(({canonical_question_name:e})=>r.a.createElement("option",{key:e},e)))),r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"select",value:p,onChange:e=>g(e.target.value),custom:!0},r.a.createElement("option",{value:"immediate"},"Immediately"),r.a.createElement("option",{value:"start"},"Relative to start"),r.a.createElement("option",{value:"end"},"Relative to end"))),"immediate"!==p&&r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{type:"number",placeholder:"Offset from reference (seconds)",value:h,onChange:e=>b(e.target.value)})),r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Check,{custom:!0,checked:s,name:E.id,type:"checkbox",label:"Override audio message",id:"audioOverrideCheckbox",onChange:e=>c(e.target.checked)})),r.a.createElement(o.Form.Group,null,r.a.createElement(d,{loading:y,disabled:y||null==h&&"immediate"!==p,onClick:async()=>{v(!0);const e=await t("add_announcement",{announcement:{type:"immediate"===p?"immediate":"scheduled",canonical_question_name:"Overall Exam"===E?null:E,base:p,offset:Number.parseInt(h,10),spoken_message:s?u.trim():void 0,message:a}});e&&x(e),v(!1)}},"Send"),r.a.createElement(i,{text:C,suffixType:"alerts"}))))))),r.a.createElement("br",null))}var g=a(2);function h(){return"localhost"===window.location.hostname?null:g.auth2.getAuthInstance().currentUser.get().getAuthResponse(!0).id_token}function b(){return{token:h(),...y()}}function y(){const e=window.location.hash.slice(1);return e?Object.fromEntries(e.split(";").map(e=>e.split("="))):{}}function v({onSuccess:e}){const[t,a]=Object(n.useState)("localhost"===window.location.hostname?"exam-test@berkeley.edu":""),l=e=>{e.preventDefault(),a(""),g.auth2.getAuthInstance().signOut(),window.location.reload()};return Object(n.useEffect)(()=>{t?e(t):Object(g.load)("auth2",()=>{g.signin2.render("signInButton",{width:200,longtitle:!0,onsuccess:t=>{a(t.getBasicProfile().getEmail()),e(t.getBasicProfile().getEmail())}})})},[]),t?r.a.createElement(r.a.Fragment,null,"You have signed in as ",r.a.createElement("b",null,y().loginas||t),"."," ",r.a.createElement("a",{href:"#",onClick:l},"Log out")," ","if this is not the right account."):r.a.createElement(r.a.Fragment,null,"First, sign into Google using your CalNet account.",r.a.createElement("div",{id:"signInButton",className:"g-signin2","data-onsuccess":"onSignIn","data-theme":"dark"}))}async function C(e,t,a){const n=fetch(e,{method:"POST",cache:"no-cache",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return a?n:function(e,t){return new Promise((a,n)=>{const r=setTimeout(()=>{n(new Error("promise timeout"))},e);t.then(e=>{clearTimeout(r),a(e)},e=>{clearTimeout(r),n(e)})})}(1e4,n)}function x({staffData:e,send:t}){const a=e=>()=>t("delete_announcement",{id:e});return r.a.createElement(r.a.Fragment,null,r.a.createElement("h3",null,"Public Announcements"),e.announcements.map(({base:e,id:t,offset:n,canonical_question_name:l,message:s,spoken_message:c})=>r.a.createElement("div",{key:t},r.a.createElement(o.Card,null,r.a.createElement(o.Card.Header,null,"Announcement for ",l||"the overall exam"," ",n&&`(${e}+${n})`,r.a.createElement(o.Button,{style:{float:"right"},variant:"primary",onClick:a(t),size:"sm"},"Delete")),r.a.createElement(o.Card.Body,null,s,""===c?r.a.createElement("i",null," [Silent]"):null==c?null:r.a.createElement("i",null," [Audio Override: ",c,"]"))),r.a.createElement("br",null))))}var w=a(4);function S({name:e}){return r.a.createElement("a",{style:{display:"block",position:"relative",top:-70,visibility:"hidden"},name:e})}var O=Object(n.createContext)({exam:"",savedAnswers:{},onInternetError:()=>null,recordUnsaved:()=>null,recordSaved:()=>null,recordSolved:()=>null,recordUnsolved:()=>null,setStarred:()=>null,unsavedQuestions:new Set,solvedQuestions:new Map,starredQuestions:new Map});function k({points:e}){return null!==e&&r.a.createElement("small",null,"Points: ",e)}function j(e){return{historyPrefix:e+"|history:|",answerPrefix:e+"|answerPrefix:|"}}async function F(e){try{const t={},a={},{historyPrefix:n,answerPrefix:r}=j(e);for(const[e,l]of Object.entries(localStorage))e.startsWith(n)?(t[e.slice(n.length)]=l,localStorage.removeItem(e)):e.startsWith(r)&&(a[e.slice(r.length)]=l);C("backup_all",{exam:e,history:t,snapshot:a,...b()})}catch(e){console.error(e)}}window.synchronize=F;const _=(e,t)=>{if("short_answer"!==e.type&&"short_code_answer"!==e.type)return null;const a=`^(${e.options})$`;try{if(e.options&&t&&"string"==typeof t){if(!t.match(a))return r.a.createElement(r.a.Fragment,null,"Input does not match regular expression ",r.a.createElement("code",null,a))}return null}catch(e){return r.a.createElement(r.a.Fragment,null,"Internal error: regular expression ",r.a.createElement("code",null,a)," is invalid")}};function T({question:e,number:t}){const a=Object(n.useContext)(O),l=a.savedAnswers[e.id]||e.template||"",[s,c]=Object(n.useState)(l),[u,m]=Object(n.useState)(l),[E,f]=Object(n.useState)(!1),[p,g]=Object(n.useState)(""),h=t=>{a.locked||(c(t),function(e,t,a){try{const{historyPrefix:n,answerPrefix:r}=j(e);localStorage.setItem(`${n}${t}|${Date.now()}`,a),localStorage.setItem(`${r}${t}`,a)}catch(e){console.error(e)}}(a.exam,e.id,t),t[0]&&t!==e.template&&!_(e,t)?a.recordSolved(e.id):a.recordUnsolved(e.id))};Object(n.useEffect)(()=>{h(l)},[]),Object(n.useEffect)(()=>{u===s?a.recordSaved(e.id):a.recordUnsaved(e.id)},[s!==u]);const y=Object(n.useRef)(null);let v;if(Object(n.useLayoutEffect)(()=>{if(null!==y.current){const{target:e,pos:t}=y.current;e.selectionStart=t,e.selectionEnd=t,y.current=null}},[y.current]),"multiple_choice"===e.type)v=r.a.createElement("div",{style:{marginBottom:10}},e.options.map(t=>r.a.createElement(o.Form.Check,{key:t.text,custom:!0,checked:s===t.text,name:e.id,type:"radio",label:r.a.createElement("span",{dangerouslySetInnerHTML:{__html:t.html}}),value:t.text,id:`${e.id}|${t.text}`,onChange:e=>{h(e.target.value)}})));else if("select_all"===e.type)v=r.a.createElement("div",{style:{marginBottom:10}},e.options.map(t=>r.a.createElement(o.Form.Check,{key:t.text,custom:!0,checked:s.includes(t.text),name:e.id,type:"checkbox",label:r.a.createElement("span",{dangerouslySetInnerHTML:{__html:t.html}}),value:t.text,id:`${e.id}|${t.text}`,onChange:e=>{h((Array.isArray(s)?s:[]).filter(t=>t!==e.target.value).concat(e.target.checked?[e.target.value]:[]))}})));else if("short_answer"===e.type||"short_code_answer"===e.type){const t=_(e,s);v=r.a.createElement(o.InputGroup,{className:"mb-3"},r.a.createElement(o.FormControl,{isInvalid:!!t,style:"short_code_answer"===e.type?{fontFamily:"monospace"}:null,value:s,onChange:e=>{h(e.target.value)}}),t&&r.a.createElement(o.Form.Control.Feedback,{type:"invalid"},t))}else if("long_answer"===e.type)v=r.a.createElement(o.InputGroup,{className:"mb-3"},r.a.createElement(o.FormControl,{as:"textarea",value:s,rows:e.options,onChange:e=>{h(e.target.value)}}));else if("long_code_answer"===e.type){const t=e=>{if(9===e.keyCode){e.preventDefault();const{target:t}=e,a=t.selectionStart,n=t.selectionEnd;h(`${s.substring(0,a)}\t${s.substring(n)}`),y.current={target:t,pos:t.selectionStart+1}}};v=r.a.createElement(o.InputGroup,{className:"mb-3"},r.a.createElement(o.FormControl,{as:"textarea",style:{fontFamily:'"Lucida Console", Monaco, monospace',tabSize:4},value:s,onKeyDown:t,rows:e.options,onChange:e=>{h(e.target.value)}}))}const x=async(t,n)=>{if(t!==n&&!E){f(!0);try{const n=await C("submit_question",{id:e.id,value:t,sentTime:(new Date).getTime(),exam:a.exam,...b()});if(f(!1),!n.ok)return g("Server failed to respond, please try again."),void a.onInternetError();try{(await n.json()).success?(m(t),g("")):(g("Server responded but failed to save, please refresh and try again."),a.onInternetError())}catch{m(null),g("Server returned invalid JSON. Please try again."),a.onInternetError()}}catch{m(null),f(!1),g("Unable to reach server, your network may have issues."),a.onInternetError()}}},w=()=>x(s,u),F=Object(n.useCallback)(function(e,t){let a;return(...n)=>{clearTimeout(a),a=setTimeout(()=>e(...n),t)}}(x,3e3),[]);Object(n.useEffect)(()=>(F(s,u),()=>F(s,u)),[s,u]);const T=a.starredQuestions.get(e.id),I=T?"orange":"black",B=T?r.a.createElement(r.a.Fragment,null,"★"):r.a.createElement(r.a.Fragment,null,"☆");return r.a.createElement(r.a.Fragment,null,r.a.createElement(o.Form,{onSubmit:e=>{e.preventDefault(),w()}},r.a.createElement(o.Form.Label,{style:{width:"100%"}},r.a.createElement(S,{name:t}),r.a.createElement("h5",{style:{marginTop:8,marginBottom:0}},"Q",t,r.a.createElement("a",{href:"#",onClick:t=>{t.preventDefault(),a.setStarred(e.id,!T)},className:"badge badge-light",style:{float:"right",fontSize:"100%",color:I}},B))," ",r.a.createElement(k,{points:e.points}),r.a.createElement("div",{style:{marginTop:8},dangerouslySetInnerHTML:{__html:e.html}})),v,r.a.createElement(d,{loading:E,disabled:E||s===u,onClick:w},s===u?"Saved":E?"Saving...":"Save"),r.a.createElement(i,{text:p})),r.a.createElement("br",null))}function I(e,t){const a=Object(n.useRef)();Object(n.useEffect)(()=>{a.current=e},[e]),Object(n.useEffect)(()=>{const e=setInterval((function(){a.current()}),t);return()=>clearInterval(e)},[t])}function B(e){for(const t of e.getElementsByTagName("a"))t.getAttribute("href")&&t.hostname!==window.location.hostname&&(t.target="_blank");for(const t of e.getElementsByTagName("table"))t.classList.add("table","table-bordered");for(const t of e.getElementsByTagName("blockquote"))t.classList.add("blockquote");Object(w.typeset)([e])}function G({group:e,number:t,small:a}){const n=e=>a?r.a.createElement("h4",e):r.a.createElement("h3",e);return r.a.createElement(r.a.Fragment,null,r.a.createElement("br",null),r.a.createElement("div",null,r.a.createElement(S,{name:t}),r.a.createElement(n,{style:{marginBottom:0}},r.a.createElement("b",null,"Q",t)," ",e.name),r.a.createElement(k,{points:e.points}),r.a.createElement("div",{dangerouslySetInnerHTML:{__html:e.html}}),e.elements.map((e,a)=>"group"===e.type?r.a.createElement(G,{key:a,group:e,number:`${t}.${a+1}`,small:!0}):r.a.createElement(T,{key:a,question:e,number:`${t}.${a+1}`}))),!a&&r.a.createElement("hr",null))}function R({compact:e,message:t,send:a}){const[l,s]=Object(n.useState)(""),[c,u]=Object(n.useState)(!1),[m,E]=Object(n.useState)(""),f=async n=>{u(!0);const r=await a("send_response",{id:t,reply:e?n?"Staff cannot answer this question":"Staff has read your message":l});r?E(r):s(""),u(!1)};return r.a.createElement(r.a.Fragment,null,!e&&r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Control,{as:"textarea",rows:3,value:l,placeholder:"Reply to the private message.",onChange:e=>s(e.target.value)})),r.a.createElement(o.Form.Group,null,r.a.createElement(d,{loading:c,disabled:c,onClick:f,size:e&&"sm",variant:e?"warning":"primary"},e?"✔":"Send"),e&&r.a.createElement(d,{loading:c,disabled:c,onClick:()=>f(!0),size:e&&"sm",variant:"secondary"},"✖"),r.a.createElement(i,{text:m,suffixType:"alerts"})))}function M(e){return Math.floor(e/60)+" minutes ago"}function D({selectedExam:e,staffData:t,send:a}){const l=u(),[s,c]=Object(n.useState)(!1),[m,i]=Object(n.useState)(null),[d,E]=Object(n.useState)(!1),[f,p]=Object(n.useState)(!1);Object(n.useEffect)(()=>B(document.body),[m]);const g=(e,t)=>r.a.createElement(R,{message:e,compact:t,send:a});return r.a.createElement(r.a.Fragment,null,r.a.createElement("h3",null,"Private Messages"),r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Check,{id:"staffCheckbox",custom:!0,type:"checkbox",label:"Compact Mode",value:d,onChange:e=>E(e.target.checked)}),r.a.createElement(o.Form.Check,{id:"hideResolvedCheckbox",custom:!0,type:"checkbox",label:"Hide Resolved",value:f,onChange:e=>p(e.target.checked)})),t.messages.filter(({responses:e})=>!f||0===e.length).map(({id:a,responses:n,email:s,message:u,question:m,timestamp:E})=>r.a.createElement("div",{key:a},r.a.createElement(o.Card,{className:"mb-4",bg:0===n.length?"danger":"default",text:0===n.length?"white":"dark"},r.a.createElement(o.Card.Header,null,r.a.createElement("b",null,0===n.length?"Unresolved Thread":"Resolved Thread")," ","[",m||"Overall Exam","]"," ",0===n.length&&r.a.createElement("span",{style:{float:"right",marginLeft:10}}," ",g(a,!0)," "),null!=m&&r.a.createElement(o.Button,{style:{float:"right"},variant:"primary",size:"sm",onClick:()=>(async(a,n)=>{i(null),c(!0);try{const r=await C("get_question",{token:h(),exam:e,latestTimestamp:t.latestTimestamp,student:n,id:a}),l=await r.json();if(!l.success)throw Error();i(l.question)}catch{c(!1)}})(m,s)},"View Question")),r.a.createElement(o.ListGroup,{variant:"flush"},r.a.createElement(o.ListGroup.Item,{style:{whiteSpace:"pre-wrap"},variant:"secondary"},r.a.createElement("b",null,s,": "),u," (",M(l-E),")"),n.map(({id:e,message:t,timestamp:a})=>r.a.createElement(o.ListGroup.Item,{key:e,style:{whiteSpace:"pre-wrap"}},r.a.createElement("b",null,"Staff: "),t," (",M(l-a),")")),!d&&r.a.createElement(o.ListGroup.Item,{style:{whiteSpace:"pre-wrap"}},g(a,!1)))))),r.a.createElement(o.Modal,{show:s,onHide:()=>c(!1),size:"lg"},r.a.createElement(o.Modal.Header,{closeButton:!0},"Question Preview"),r.a.createElement(o.Modal.Body,null,null!=m&&("group"===m.type?r.a.createElement(G,{group:m,number:m.index.slice(0,-1)}):r.a.createElement(T,{question:m,number:m.index.slice(0,-1)}))),r.a.createElement(o.Modal.Footer,null,r.a.createElement(o.Button,{onClick:()=>c(!1)},"Close"))))}function P(){const e=u(),t=m();return 0===t.messages.length?null:r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,t.messages.map(({id:t,message:a,question:n,timestamp:l,responses:s})=>r.a.createElement("div",{key:t},r.a.createElement(o.Card,null,r.a.createElement(o.Card.Header,null,r.a.createElement("b",null,0===s.length?"Unresolved Thread":"Resolved Thread")," ","[",n,"]"),r.a.createElement(o.ListGroup,{variant:"flush"},r.a.createElement(o.ListGroup.Item,{key:t,style:{whiteSpace:"pre-wrap"}},r.a.createElement("b",null,"You: "),a," (",M(e-l),")"),s.map(({id:t,message:a,timestamp:n})=>r.a.createElement(o.ListGroup.Item,{key:t,style:{whiteSpace:"pre-wrap"}},r.a.createElement("b",null,"Staff: "),a," (",M(e-n),")")))),r.a.createElement("br",null)))))}function L(e,t){const[a,l]=Object(n.useState)(e);return[a,r.a.createElement(o.ButtonGroup,{size:"sm"},r.a.createElement(o.Button,{variant:"secondary",onClick:()=>l(e=>e+t)},"+"),r.a.createElement(o.Button,{variant:"secondary",onClick:()=>l(e=>e-t)},"-"))]}function $({customizable:e}){const t=u(),a=m(),l=Object(n.useContext)(s).stale,[c,i]=L(18,2);return r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement(o.Card,{style:{fontSize:c}},r.a.createElement(o.Card.Header,null,"Announcements",l&&r.a.createElement(o.Badge,{style:{float:"right"},variant:"danger"},"Disconnected"),e&&i),r.a.createElement(o.ListGroup,{variant:"flush"},a.announcements.map(({id:e,message:a,question:n,timestamp:l,private:s})=>r.a.createElement(o.ListGroup.Item,{key:e,style:{whiteSpace:"pre-wrap"}},r.a.createElement("b",null,"[",s?"Private":n,"]")," ",a," (",M(t-l),")"))))))}function q({customizable:e}){const t=u(),a=m(),[l,s]=Object(n.useState)(null),c=l||(ts(t+a.endTime-a.startTime)},"Start Exam Now"),l&&r.a.createElement(r.a.Fragment,null,r.a.createElement(o.Button,{onClick:()=>s(e=>e+60)},"Add 1 minute"),r.a.createElement(o.Button,{onClick:()=>s(e=>e-60)},"Remove 1 minute"))),r.a.createElement(o.Jumbotron,{style:{padding:d/4}},r.a.createElement("h1",{className:"display-1 text-center",style:{fontSize:d}},i)))}function N(){const[e,t]=Object(n.useState)(""),[a,l]=Object(n.useState)([]),s=decodeURIComponent(window.location.pathname).replace("/","").trim(),[u,m]=Object(n.useState)(s),[i,d]=Object(n.useState)(!1),[g,h]=Object(n.useState)(!1),[y,w]=Object(n.useState)(!0),[S,O,k,j]=function(e,t,a,r){const[l,o]=Object(n.useState)(null),[s,c]=Object(n.useState)(!1),[u,m]=Object(n.useState)([]),[i,d]=Object(n.useState)(!1);Object(n.useEffect)(()=>{if(u.length>0&&!i){const e=u[0],t=new Audio("data:audio/mp3;base64,"+e);d(!0),t.play(),t.addEventListener("ended",()=>{m(e=>e.slice(1)),d(!1)})}},[u,i]);const E=e=>{c(!1);const n={};for(const[t,a]of Object.entries(e))if("messages"===t){const t=new Map;for(const e of l.messages)t.set(e.id,e);const a=[];for(const n of e.messages)if(t.has(n.id)){const e=t.get(n.id),a=e.responses.map(({id:e})=>e);t.set(n.id,{...n,responses:e.responses.concat(n.responses.filter(({id:e})=>!a.includes(e)))})}else a.push(n);for(const e of l.messages)a.push(t.get(e.id));n.messages=a}else if("announcements"===t){const t=new Map;for(const e of l.announcements)e.private&&t.set(e.id,e);for(const a of e.announcements)t.set(a.id,a);n.announcements=Array.from(t.values()).sort(({timestamp:e},{timestamp:t})=>t-e)}else n[t]=a;if(o(n),!t){const t=[];for(const{audio:a}of e.announcements)a&&(t.push(a),r&&r());t.reverse(),m(e=>e.concat(t))}a&&a(e.endTime-Math.round(e.timestamp)+Math.round((new Date).getTime()/1e3)-2)};return I(async()=>{if(l)try{const a=await C(t?"alerts/fetch_staff_data":"alerts/fetch_data",{...b(),exam:e,receivedAudio:l?l.announcements.map(e=>e.id):null,latestTimestamp:l.latestTimestamp});if(a.ok){const e=await a.json();e.success&&E(e)}}catch(e){console.error(e),c(!0)}},1e4),[l,s,async()=>{try{const a=await C(t?"alerts/fetch_staff_data":"alerts/fetch_data",{...b(),exam:e,latestTimestamp:0});if(!a.ok)return`The exam server failed with error ${a.status}. Please try again.`;try{const e=await a.json();if(!e.success)return"The exam server responded but did not produce valid data. Please try again.";o(e)}catch{return"The web server returned invalid JSON. Please try again."}}catch{return"Unable to reach server, your network may have issues."}return null},async(t,a)=>{try{const n=await C("alerts/"+t,{...b(),exam:e,latestTimestamp:l.latestTimestamp,...a}),r=await n.json();if(!r.success)throw Error();E(r)}catch(e){return console.error(e),"Something went wrong. Please try again, or reload the page."}return null}]}(u,i),F=function(){const[e,t]=Object(n.useState)(Math.round((new Date).getTime()/1e3));return I(()=>t(Math.round((new Date).getTime()/1e3))),e}();return Object(n.useEffect)(()=>{(async()=>{l(await(await C("list_exams")).json())})()},[]),Object(n.useEffect)(()=>{document.title=O?"(DISCONNECTED) Exam Announcements":"Exam Announcements"},[O]),r.a.createElement(c.Provider,{value:{time:F,examData:S,stale:O}},r.a.createElement(o.Container,null,r.a.createElement("br",null),r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement("h1",null,"Exam Announcements"))),r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement(v,{onSuccess:t}))),r.a.createElement("br",null),e&&!S&&!s&&r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement(o.Form,null,r.a.createElement(o.Form.Group,{controlId:"exampleForm.SelectCustom"},r.a.createElement(o.Form.Label,null,"Now, choose your exam:"),r.a.createElement(o.Form.Control,{as:"select",value:u,onChange:e=>{m(e.target.value)},custom:!0},r.a.createElement("option",{hidden:!0,disabled:!0,selected:!0,value:""},"Select an exam"),a.map(e=>r.a.createElement("option",{key:e},e)))),r.a.createElement(o.Form.Group,null,r.a.createElement(o.Form.Check,{id:"staffCheckbox",custom:!0,type:"checkbox",label:"Log in as staff",value:i,onChange:e=>d(e.target.checked)}))))),e&&u&&!S&&r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement("p",null,"You have selected the exam ",r.a.createElement("b",null,u),".",!s&&r.a.createElement(r.a.Fragment,null," ","If this does not look correct, please re-select your exam.")),r.a.createElement("p",null,"Click the button to connect to the exam server. You can do this before the exam begins."),r.a.createElement(f,{exam:u,isStaff:i,onDownloadClick:k}))),!i&&S&&r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement(q,{customizable:g}))),!i&&S&&r.a.createElement(o.Row,null,r.a.createElement(o.Col,null,r.a.createElement($,{customizable:g})),!0===S.enableClarifications&&y&&r.a.createElement(o.Col,{xs:6},g&&r.a.createElement(o.Row,{className:"justify-content-center"},r.a.createElement(o.Button,{onClick:()=>w(!1),variant:"secondary"},"Hide Clarifications")),r.a.createElement(E,{send:j}),r.a.createElement(P,null))),!i&&S&&r.a.createElement(o.Row,{className:"justify-content-center",style:{marginTop:24}},r.a.createElement(o.Button,{variant:"light",onClick:()=>h(e=>!e)},g?"Disable":"Enable"," Customizations")),i&&S&&r.a.createElement(p,{staffData:S,send:j}),i&&S&&r.a.createElement(o.Row,null,r.a.createElement(o.Col,{xs:6},r.a.createElement(x,{staffData:S,send:j})),r.a.createElement(o.Col,{xs:6},r.a.createElement(D,{selectedExam:u,staffData:S,send:j}))),r.a.createElement("br",null)))}Object(l.render)(r.a.createElement(N,null),document.querySelector("#root"))}]);