From 522032c2862e17497328534d3f5fe00a68c56d63 Mon Sep 17 00:00:00 2001 From: Alexander Sullivan Date: Thu, 19 Feb 2026 14:36:01 -0500 Subject: [PATCH 1/4] fix --- core/scripts/crispr_scripts.js | 27 +++++------- core/scripts/crispr_scripts.min.js | 2 +- core/scripts/serviceWorker/sw.js | 2 +- core/scripts/serviceWorker/sw.js.map | 2 +- core/systemrun.html | 66 ---------------------------- docs/architecture/index.md | 4 +- docs/index.md | 2 +- playwright.config.js | 2 +- tests/playwright/submission.spec.js | 3 ++ 9 files changed, 21 insertions(+), 89 deletions(-) diff --git a/core/scripts/crispr_scripts.js b/core/scripts/crispr_scripts.js index 7b04e9a..ad7771a 100644 --- a/core/scripts/crispr_scripts.js +++ b/core/scripts/crispr_scripts.js @@ -692,12 +692,12 @@ function showFeedback() { append_str += "
"; append_str += "
"; append_str += - ""; append_str += "
"; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${MARgRNAseq_degree_display}.

`; @@ -713,12 +713,12 @@ function showFeedback() { append_str += "
"; append_str += "
"; append_str += - ""; append_str += "
"; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${MARPAMseq_display}.

`; @@ -734,12 +734,13 @@ function showFeedback() { append_str += "
"; append_str += "
"; append_str += - ""; append_str += "
"; append_str += "
"; - append_str += "
"; + append_str += + "
"; append_str += "
"; // Content append_str += `

For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${MAROffTarget_degree_display}.

`; @@ -755,12 +756,12 @@ function showFeedback() { append_str += "
"; append_str += "
"; append_str += - ""; append_str += "
"; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${MARF1primers_display}.

`; @@ -776,12 +777,12 @@ function showFeedback() { append_str += "
"; append_str += "
"; append_str += - ""; append_str += "
"; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${MARR1primers_display}.

`; @@ -856,13 +857,7 @@ function submitAnswers() { ); all_marks.push(studentMark, studentMarkPercentage); - document.getElementById("options_label").innerHTML = - "Would you like to see feedback on your answers or start a new assignment?"; - document.getElementById("seeFeedback").removeAttribute("hidden"); - showFeedback(); - - $("#feedbackButton").click(); }, 750); } diff --git a/core/scripts/crispr_scripts.min.js b/core/scripts/crispr_scripts.min.js index 719bb19..fe3e421 100644 --- a/core/scripts/crispr_scripts.min.js +++ b/core/scripts/crispr_scripts.min.js @@ -24,4 +24,4 @@ let selection_inMode="practice";const listOfGenes=["eBFP","ACTN3","HBB","CCR5","
- `,e+='
',e+='',e+='',e+='This would be your off-target score for your gRNA. NOTE: This input only takes numbers',e+="
",e+='
',e+='',e+='',e+='This would be your forward primer (F1) for your gRNA',e+="
",e+='
',e+='',e+='',e+='This would be your reverse primer (R1) for your gRNA',e+="
",e+='',e+='',e+="",e+="
",$("#work").append(e)}else(gene_backgroundInfo===""||!gene_backgroundInfo||!backgroundInfo?.[0].gene_list[current_gene])&&alert("Error code lFS50-66 occurred. Please contact admin or TA!")}function isNumberOrDashKey(e){const n=e.which?e.which:e.keyCode;return!(n!==46&&n!==45&&n>31&&(n<48||n>57))}let MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,MARF1primers=!1,MARR1primers=!1,possible_comparable_answers=[],correctNucleotideIncluded=!1,true_counts=0,checkAnswers_executed=!1;function checkAnswers(){MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,correctNucleotideIncluded=!1,true_counts=0;const e=gene_backgroundInfo.gene_list[current_gene]["Target position"]-1,n=document?.getElementById("sequence_input")?.value?.trim()||void 0;if(possible_comparable_answers=[],n)for(const t of benchling_gRNA_outputs.gene_list[current_gene])t.Sequence===n&&possible_comparable_answers.push(t);if(possible_comparable_answers.length>0)for(const t of possible_comparable_answers){if(true_counts=0,correctNucleotideIncluded=!1,t.Strand===1){const i=t.Position-1-1+3,r=t.Position-1-17;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}else if(t.Strand===-1){const i=t.Position-1+17,r=t.Position-1-3;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}if(correctNucleotideIncluded){let i,r;if(t.Strand===1?(i=t.Position-1+2,r=t.Position-1+4,document.getElementById("strand_input").value==="Sense (+)"&&(MARstrand=!0,true_counts+=1)):t.Strand===-1&&(i=t.Position-1-2,r=t.Position-1-4,document.getElementById("strand_input").value==="Antisense (-)"&&(MARstrand=!0,true_counts+=1)),e>=i&&e<=r?(MARgRNAseq=!1,MARgRNAseq_degree=0):e>=t.Position-1+1&&e<=t.Position-1+10||e<=t.Position-1-1&&e>=t.Position-1-10?(MARgRNAseq=!0,MARgRNAseq_degree=1,true_counts+=1):e>=t.Position-1&&e<=t.Position-1+20||e<=t.Position-1&&e>=t.Position-1-20?(MARgRNAseq=!0,MARgRNAseq_degree=2,true_counts+=1):(e>=t.Position-1&&e<=t.Position-1+30||e<=t.Position-1&&e>=t.Position-1-30)&&(MARgRNAseq=!0,MARgRNAseq_degree=3,true_counts+=1),MARgRNAseq){const o=t;o.Position&&parseInt(o.Position,10)===parseInt(document.getElementById("position_input").value,10)?(MARCutPos=!0,true_counts+=1):(o.Position===null||o.Position===void 0)&&alert("Error code cA302-307: retrieving server information on 'Position' answers occurred. Please contact admin or TA!"),(o.PAM||o.PAM)&&o.PAM===document.getElementById("pam_input").value.trim()?(MARPAMseq=!0,true_counts+=1):(o.PAM===null||o.PAM===void 0)&&alert("Error code cA311-317: retrieving server information on 'PAM' answers occurred. Please contact admin or TA!"),o["Specificity Score"]||o["Specificity Score"]?checkOffTarget(o["Specificity Score"]):(o["Specificity Score"]===null||o["Specificity Score"]===void 0)&&alert("Error code cA342-348: retrieving server information on 'Specificity Score' answers occurred. Please contact admin or TA!"),checkF1Primers(document?.getElementById("sequence_input")?.value?.trim()||""),checkR1Primers(document?.getElementById("sequence_input")?.value?.trim()||"")}}}checkAnswers_executed=!0}let offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];function checkOffTarget(e){MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1;const n=Math.floor(e),t=Math.ceil(e),i=parseInt(document.getElementById("offtarget_input").value,10);if(correctNucleotideIncluded&&MARgRNAseq&&i>=n&&i<=t&&(MAROffTarget=!0,true_counts+=1),MAROffTarget){const r=parseInt(document.getElementById("position_input").value,10)+35,o=parseInt(document.getElementById("position_input").value,10)-35;offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];for(let a=0;a=o&&benchling_gRNA_outputs.gene_list[current_gene][a].Position<=r&&benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]&&(offtarget_List.push(benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]),offtarget_dict[a]=benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"],offtarget_dictParse.push(a));let l=!0;Math.max.apply(null,offtarget_List)<35&&(l=!1);const u=Math.max.apply(null,offtarget_List),c=getOffTargetOptimalValue(u);i>=c?(MAROffTarget_aboveOpt=!0,MAROffTarget_above35=!0,MAROffTarget_degree=1):i>=35?(MAROffTarget_above35=!0,Math.max.apply(null,offtarget_List)<80?MAROffTarget_degree=1:MAROffTarget_degree=2):l||(MAROffTarget_onlyOption=!0,MAROffTarget_degree=3)}}function getOffTargetOptimalValue(e){const n=e-e*.2;return n>80||n<35?80:n}let possible_F1_primers=[];function checkF1Primers(e){MARF1primers=!1,possible_F1_primers=[];const n="TAATACGACTCACTATAG";let t=!0;e[0]==="G"&&(t=!1);for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(0,i));if(!t)for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(1,i));possible_F1_primers.includes(document.getElementById("f1_input").value.trim())&&(MARF1primers=!0)}let possible_R1_primers=[];const complementary_nt_dict={A:"T",T:"A",C:"G",G:"C"};function checkR1Primers(e){MARR1primers=!1,possible_R1_primers=[];const n="TTCTAGCTCTAAAAC";let t="";for(const i of e)t=complementary_nt_dict[i]+t;for(let i=19;i<=20;i+=1)possible_R1_primers.push(n+t.slice(0,i));possible_R1_primers.includes(document.getElementById("r1_input").value.trim())&&(MARR1primers=!0)}function createComplementarySeq(e){let n="";for(const t of e)n=complementary_nt_dict[t]+n;return n}let studentMark=0,studentMarkPercentage=0;const markTotal=10;function markAnswers(){studentMark=0,checkAnswers_executed||checkAnswers(),checkAnswers_executed&&(MARgRNAseq&&(MARgRNAseq_degree===1?studentMark+=2:MARgRNAseq_degree===2?studentMark+=1:MARgRNAseq_degree===3&&(studentMark+=.5)),MARPAMseq&&(studentMark+=2),MAROffTarget&&(MAROffTarget_degree===1?studentMark+=2:MAROffTarget_degree===2?studentMark+=1:MAROffTarget_degree===3&&(studentMark+=.5)),MARF1primers&&(studentMark+=2),MARR1primers&&(studentMark+=2),studentMarkPercentage=(studentMark/markTotal*100).toFixed(2),studentMarkPercentage>100?studentMarkPercentage=100:studentMarkPercentage<0&&(studentMarkPercentage=0))}function showFeedback(){$("#mainContainer").empty();let e="

You would only receive feedback on your practice attempts and not your final assignments.

";e+="

The assignment itself is marked out of 10 marks with 2 marks for each input excluding gRNA strand direction, cut position and target region range (these three values are used to calculate if you have the right answer or not which means they are still crucial that they are still correct).

",e+="

The following is the breakdown of what marks you would have received and why you would have gotten them:

",e+=`

Mark: ${all_marks[0]}/10 (${all_marks[1]})

`;let n=0,t="Your gRNA sequence was wrong and not found in the Benchling gRNA outputs. Either you made a typo or this answer was not correct and did not contain the target cut site within an acceptable range.";MARgRNAseq&&(MARgRNAseq_degree===1?(n=2,t="This means your answer was correct and you received full marks."):MARgRNAseq_degree===2?(n=1,t="This means your sequence was partially correct as it contains the target sequence within a 20bp range but was not optimal. One mark."):MARgRNAseq_degree===3&&(n=.5,t="This means your sequence was not wrong (therefore was still correct) but there were better options out there. I recommend you try this practice assignment again. Still worth some marks though (half a mark)."));let i=0,r="Your PAM sequence was wrong and not found relative to your gRNA sequence. Either you made a typo or this answer was not correct. Either it contained the cut site within the PAM site or it was not an NGG or NAG PAM site (SciGrade only accepts either of those two PAM sites).";MARPAMseq&&(i=2,r="This means your answer was correct and you received full marks.");let o=0,l="Your off-target score was wrong. Either it was not above/within the optimal range (or above 35) or the last-resort option.";MAROffTarget&&(MAROffTarget_degree===1?(o=2,l="This means your answer was correct while above/within the optimal and you received full marks."):MAROffTarget_degree===2?(o=1,l="This means your answer was technically correct as its on-target value was above 35."):MAROffTarget_degree===3&&(o=.5,l="This means your answer was partially correct as it was found to be your only option is solely based on the target region range you selected."));let u=0,c="";for(let s=0;s For gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${n}.

`,e+=t,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${i}.

`,e+=r,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${o}.

`,e+=l,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${u}.

`,e+=a,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${f}.

`,e+=p,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="

If at any point you wish to dispute marks, please contact your TA or professor once you completed your assignment. If you have found a bug in our SciGrade marking system, please contact your professor or our admin.

",e+="
",e+='

',$("#mainContainer").append(e)}function showNewInput(e,n,t){document.getElementById(String(e)).value===String(n)?document.getElementById(String(t)).removeAttribute("hidden"):document.getElementById(String(t)).setAttribute("hidden",!0)}let completed_assignments=[],all_answers=[],all_outputs=[],all_marks=[];function submitAnswers(){all_answers=[],all_outputs=[],all_marks=[],checkAnswers(),setTimeout(()=>{markAnswers(),all_answers.push(document?.getElementById("sequence_input")?.value?.trim()||"",document.getElementById("pam_input").value.trim(),document.getElementById("position_input").value,document.getElementById("strand_input").value,document.getElementById("offtarget_input").value,document.getElementById("f1_input").value.trim(),document.getElementById("r1_input").value.trim()),all_outputs.push(MARstrand,MARgRNAseq,MARgRNAseq_degree,MARCutPos,MARPAMseq,MAROffTarget,MAROffTarget_degree,MAROffTarget_aboveOpt,MAROffTarget_above35,MAROffTarget_onlyOption,MARF1primers,MARR1primers),all_marks.push(studentMark,studentMarkPercentage),document.getElementById("options_label").innerHTML="Would you like to see feedback on your answers or start a new assignment?",document.getElementById("seeFeedback").removeAttribute("hidden"),showFeedback(),$("#feedbackButton").click()},750)}function IfPressEnter(e,n){(e.which===13||e.keyCode===13)&&$(`#${n}`).click()}function backToAssignments(){redirectCRISPR(),$("#practice").click()}$(()=>{$("form").submit(()=>!1)}),typeof module<"u"&&module.exports&&(module.exports={getOffTargetOptimalValue,isNumberOrDashKey,createComplementarySeq,checkOffTarget,checkF1Primers,checkR1Primers,fillGeneList,get MAROffTarget(){return MAROffTarget},get MAROffTarget_degree(){return MAROffTarget_degree},get MARF1primers(){return MARF1primers},get MARR1primers(){return MARR1primers},__setTestState(e={}){e.correctNucleotideIncluded!==void 0&&(correctNucleotideIncluded=e.correctNucleotideIncluded),e.MARgRNAseq!==void 0&&(MARgRNAseq=e.MARgRNAseq),e.benchling_gRNA_outputs!==void 0&&(benchling_gRNA_outputs=e.benchling_gRNA_outputs),e.current_gene!==void 0&&(current_gene=e.current_gene),e.gene_backgroundInfo!==void 0&&(gene_backgroundInfo=e.gene_backgroundInfo)},__resetState(){MAROffTarget=!1,MAROffTarget_degree=0,MARF1primers=!1,MARR1primers=!1,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,correctNucleotideIncluded=!1,MARgRNAseq=!1}}); + `,e+='
',e+='',e+='',e+='This would be your off-target score for your gRNA. NOTE: This input only takes numbers',e+="
",e+='
',e+='',e+='',e+='This would be your forward primer (F1) for your gRNA',e+="
",e+='
',e+='',e+='',e+='This would be your reverse primer (R1) for your gRNA',e+="
",e+='',e+='',e+="",e+="
",$("#work").append(e)}else(gene_backgroundInfo===""||!gene_backgroundInfo||!backgroundInfo?.[0].gene_list[current_gene])&&alert("Error code lFS50-66 occurred. Please contact admin or TA!")}function isNumberOrDashKey(e){const n=e.which?e.which:e.keyCode;return!(n!==46&&n!==45&&n>31&&(n<48||n>57))}let MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,MARF1primers=!1,MARR1primers=!1,possible_comparable_answers=[],correctNucleotideIncluded=!1,true_counts=0,checkAnswers_executed=!1;function checkAnswers(){MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,correctNucleotideIncluded=!1,true_counts=0;const e=gene_backgroundInfo.gene_list[current_gene]["Target position"]-1,n=document?.getElementById("sequence_input")?.value?.trim()||void 0;if(possible_comparable_answers=[],n)for(const t of benchling_gRNA_outputs.gene_list[current_gene])t.Sequence===n&&possible_comparable_answers.push(t);if(possible_comparable_answers.length>0)for(const t of possible_comparable_answers){if(true_counts=0,correctNucleotideIncluded=!1,t.Strand===1){const i=t.Position-1-1+3,r=t.Position-1-17;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}else if(t.Strand===-1){const i=t.Position-1+17,r=t.Position-1-3;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}if(correctNucleotideIncluded){let i,r;if(t.Strand===1?(i=t.Position-1+2,r=t.Position-1+4,document.getElementById("strand_input").value==="Sense (+)"&&(MARstrand=!0,true_counts+=1)):t.Strand===-1&&(i=t.Position-1-2,r=t.Position-1-4,document.getElementById("strand_input").value==="Antisense (-)"&&(MARstrand=!0,true_counts+=1)),e>=i&&e<=r?(MARgRNAseq=!1,MARgRNAseq_degree=0):e>=t.Position-1+1&&e<=t.Position-1+10||e<=t.Position-1-1&&e>=t.Position-1-10?(MARgRNAseq=!0,MARgRNAseq_degree=1,true_counts+=1):e>=t.Position-1&&e<=t.Position-1+20||e<=t.Position-1&&e>=t.Position-1-20?(MARgRNAseq=!0,MARgRNAseq_degree=2,true_counts+=1):(e>=t.Position-1&&e<=t.Position-1+30||e<=t.Position-1&&e>=t.Position-1-30)&&(MARgRNAseq=!0,MARgRNAseq_degree=3,true_counts+=1),MARgRNAseq){const o=t;o.Position&&parseInt(o.Position,10)===parseInt(document.getElementById("position_input").value,10)?(MARCutPos=!0,true_counts+=1):(o.Position===null||o.Position===void 0)&&alert("Error code cA302-307: retrieving server information on 'Position' answers occurred. Please contact admin or TA!"),(o.PAM||o.PAM)&&o.PAM===document.getElementById("pam_input").value.trim()?(MARPAMseq=!0,true_counts+=1):(o.PAM===null||o.PAM===void 0)&&alert("Error code cA311-317: retrieving server information on 'PAM' answers occurred. Please contact admin or TA!"),o["Specificity Score"]||o["Specificity Score"]?checkOffTarget(o["Specificity Score"]):(o["Specificity Score"]===null||o["Specificity Score"]===void 0)&&alert("Error code cA342-348: retrieving server information on 'Specificity Score' answers occurred. Please contact admin or TA!"),checkF1Primers(document?.getElementById("sequence_input")?.value?.trim()||""),checkR1Primers(document?.getElementById("sequence_input")?.value?.trim()||"")}}}checkAnswers_executed=!0}let offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];function checkOffTarget(e){MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1;const n=Math.floor(e),t=Math.ceil(e),i=parseInt(document.getElementById("offtarget_input").value,10);if(correctNucleotideIncluded&&MARgRNAseq&&i>=n&&i<=t&&(MAROffTarget=!0,true_counts+=1),MAROffTarget){const r=parseInt(document.getElementById("position_input").value,10)+35,o=parseInt(document.getElementById("position_input").value,10)-35;offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];for(let a=0;a=o&&benchling_gRNA_outputs.gene_list[current_gene][a].Position<=r&&benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]&&(offtarget_List.push(benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]),offtarget_dict[a]=benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"],offtarget_dictParse.push(a));let l=!0;Math.max.apply(null,offtarget_List)<35&&(l=!1);const u=Math.max.apply(null,offtarget_List),c=getOffTargetOptimalValue(u);i>=c?(MAROffTarget_aboveOpt=!0,MAROffTarget_above35=!0,MAROffTarget_degree=1):i>=35?(MAROffTarget_above35=!0,Math.max.apply(null,offtarget_List)<80?MAROffTarget_degree=1:MAROffTarget_degree=2):l||(MAROffTarget_onlyOption=!0,MAROffTarget_degree=3)}}function getOffTargetOptimalValue(e){const n=e-e*.2;return n>80||n<35?80:n}let possible_F1_primers=[];function checkF1Primers(e){MARF1primers=!1,possible_F1_primers=[];const n="TAATACGACTCACTATAG";let t=!0;e[0]==="G"&&(t=!1);for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(0,i));if(!t)for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(1,i));possible_F1_primers.includes(document.getElementById("f1_input").value.trim())&&(MARF1primers=!0)}let possible_R1_primers=[];const complementary_nt_dict={A:"T",T:"A",C:"G",G:"C"};function checkR1Primers(e){MARR1primers=!1,possible_R1_primers=[];const n="TTCTAGCTCTAAAAC";let t="";for(const i of e)t=complementary_nt_dict[i]+t;for(let i=19;i<=20;i+=1)possible_R1_primers.push(n+t.slice(0,i));possible_R1_primers.includes(document.getElementById("r1_input").value.trim())&&(MARR1primers=!0)}function createComplementarySeq(e){let n="";for(const t of e)n=complementary_nt_dict[t]+n;return n}let studentMark=0,studentMarkPercentage=0;const markTotal=10;function markAnswers(){studentMark=0,checkAnswers_executed||checkAnswers(),checkAnswers_executed&&(MARgRNAseq&&(MARgRNAseq_degree===1?studentMark+=2:MARgRNAseq_degree===2?studentMark+=1:MARgRNAseq_degree===3&&(studentMark+=.5)),MARPAMseq&&(studentMark+=2),MAROffTarget&&(MAROffTarget_degree===1?studentMark+=2:MAROffTarget_degree===2?studentMark+=1:MAROffTarget_degree===3&&(studentMark+=.5)),MARF1primers&&(studentMark+=2),MARR1primers&&(studentMark+=2),studentMarkPercentage=(studentMark/markTotal*100).toFixed(2),studentMarkPercentage>100?studentMarkPercentage=100:studentMarkPercentage<0&&(studentMarkPercentage=0))}function showFeedback(){$("#mainContainer").empty();let e="

You would only receive feedback on your practice attempts and not your final assignments.

";e+="

The assignment itself is marked out of 10 marks with 2 marks for each input excluding gRNA strand direction, cut position and target region range (these three values are used to calculate if you have the right answer or not which means they are still crucial that they are still correct).

",e+="

The following is the breakdown of what marks you would have received and why you would have gotten them:

",e+=`

Mark: ${all_marks[0]}/10 (${all_marks[1]})

`;let n=0,t="Your gRNA sequence was wrong and not found in the Benchling gRNA outputs. Either you made a typo or this answer was not correct and did not contain the target cut site within an acceptable range.";MARgRNAseq&&(MARgRNAseq_degree===1?(n=2,t="This means your answer was correct and you received full marks."):MARgRNAseq_degree===2?(n=1,t="This means your sequence was partially correct as it contains the target sequence within a 20bp range but was not optimal. One mark."):MARgRNAseq_degree===3&&(n=.5,t="This means your sequence was not wrong (therefore was still correct) but there were better options out there. I recommend you try this practice assignment again. Still worth some marks though (half a mark)."));let i=0,r="Your PAM sequence was wrong and not found relative to your gRNA sequence. Either you made a typo or this answer was not correct. Either it contained the cut site within the PAM site or it was not an NGG or NAG PAM site (SciGrade only accepts either of those two PAM sites).";MARPAMseq&&(i=2,r="This means your answer was correct and you received full marks.");let o=0,l="Your off-target score was wrong. Either it was not above/within the optimal range (or above 35) or the last-resort option.";MAROffTarget&&(MAROffTarget_degree===1?(o=2,l="This means your answer was correct while above/within the optimal and you received full marks."):MAROffTarget_degree===2?(o=1,l="This means your answer was technically correct as its on-target value was above 35."):MAROffTarget_degree===3&&(o=.5,l="This means your answer was partially correct as it was found to be your only option is solely based on the target region range you selected."));let u=0,c="";for(let s=0;s For gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${n}.

`,e+=t,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${i}.

`,e+=r,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${o}.

`,e+=l,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${u}.

`,e+=a,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${f}.

`,e+=p,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="

If at any point you wish to dispute marks, please contact your TA or professor once you completed your assignment. If you have found a bug in our SciGrade marking system, please contact your professor or our admin.

",e+="
",e+='

',$("#mainContainer").append(e)}function showNewInput(e,n,t){document.getElementById(String(e)).value===String(n)?document.getElementById(String(t)).removeAttribute("hidden"):document.getElementById(String(t)).setAttribute("hidden",!0)}let completed_assignments=[],all_answers=[],all_outputs=[],all_marks=[];function submitAnswers(){all_answers=[],all_outputs=[],all_marks=[],checkAnswers(),setTimeout(()=>{markAnswers(),all_answers.push(document?.getElementById("sequence_input")?.value?.trim()||"",document.getElementById("pam_input").value.trim(),document.getElementById("position_input").value,document.getElementById("strand_input").value,document.getElementById("offtarget_input").value,document.getElementById("f1_input").value.trim(),document.getElementById("r1_input").value.trim()),all_outputs.push(MARstrand,MARgRNAseq,MARgRNAseq_degree,MARCutPos,MARPAMseq,MAROffTarget,MAROffTarget_degree,MAROffTarget_aboveOpt,MAROffTarget_above35,MAROffTarget_onlyOption,MARF1primers,MARR1primers),all_marks.push(studentMark,studentMarkPercentage),showFeedback()},750)}function IfPressEnter(e,n){(e.which===13||e.keyCode===13)&&$(`#${n}`).click()}function backToAssignments(){redirectCRISPR(),$("#practice").click()}$(()=>{$("form").submit(()=>!1)}),typeof module<"u"&&module.exports&&(module.exports={getOffTargetOptimalValue,isNumberOrDashKey,createComplementarySeq,checkOffTarget,checkF1Primers,checkR1Primers,fillGeneList,get MAROffTarget(){return MAROffTarget},get MAROffTarget_degree(){return MAROffTarget_degree},get MARF1primers(){return MARF1primers},get MARR1primers(){return MARR1primers},__setTestState(e={}){e.correctNucleotideIncluded!==void 0&&(correctNucleotideIncluded=e.correctNucleotideIncluded),e.MARgRNAseq!==void 0&&(MARgRNAseq=e.MARgRNAseq),e.benchling_gRNA_outputs!==void 0&&(benchling_gRNA_outputs=e.benchling_gRNA_outputs),e.current_gene!==void 0&&(current_gene=e.current_gene),e.gene_backgroundInfo!==void 0&&(gene_backgroundInfo=e.gene_backgroundInfo)},__resetState(){MAROffTarget=!1,MAROffTarget_degree=0,MARF1primers=!1,MARR1primers=!1,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,correctNucleotideIncluded=!1,MARgRNAseq=!1}}); diff --git a/core/scripts/serviceWorker/sw.js b/core/scripts/serviceWorker/sw.js index 4a0009b..f42d7ff 100644 --- a/core/scripts/serviceWorker/sw.js +++ b/core/scripts/serviceWorker/sw.js @@ -1,2 +1,2 @@ -if(!self.define){let e,r={};const c=(c,o)=>(c=new URL(c+".js",o).href,r[c]||new Promise(r=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=r,document.head.appendChild(e);}else e=c,importScripts(c),r();}).then(()=>{let e=r[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e;}));self.define=(o,i)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(r[a])return;let s={};const n=e=>c(e,a),d={module:{uri:a},exports:s,require:n};r[a]=Promise.all(o.map(e=>d[e]||n(e))).then(e=>(i(...e),s));};}define(["./workbox-813eeb66"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting();}),e.precacheAndRoute([{url:"core/systemrun.html",revision:"8dff6048b9d69269ee93641fe2a6fdd3"},{url:"core/styling/style.min.css",revision:"65a608b7d010ea2b87bb7ea7584ab875"},{url:"core/styling/style.css",revision:"b67cbfd3995e07bba50358eaa64009fe"},{url:"core/scripts/runtime.min.js",revision:"8a3d731b68f7a844695d9f62975f9e87"},{url:"core/scripts/runtime.js",revision:"3d9fff75f5461d4c927f08837da3737f"},{url:"core/scripts/crispr_scripts.min.js",revision:"a33cfc3004c2dade90c7df5ec2eb33e2"},{url:"core/scripts/crispr_scripts.js",revision:"9b350e01172d688a17f6151a69b9334b"},{url:"core/scripts/APIandLibraries/tabletoCSV/package.json",revision:"ef0258ebdf3f9d244d7d38c4c35ec723"},{url:"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js",revision:"1757e6cdbbbe5f5a1c330e2f182e24f2"},{url:"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js",revision:"c93880a7ac368dcd9b51d547948cbf8a"},{url:"core/scripts/APIandLibraries/tabletoCSV/example.html",revision:"9b17ab0cdbf7acd33dfcfff87c410d2b"},{url:"core/scripts/APIandLibraries/tabletoCSV/bower.json",revision:"79787e672bb7dc33e2a2e0bdc8467a38"},{url:"core/scripts/APIandLibraries/tabletoCSV/README.md",revision:"d581efd7f3de48bdf77206307df41034"},{url:"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js",revision:"38e3e2fcaff8b3a33f2e3bf01190e845"},{url:"core/scripts/APIandLibraries/jQuery/jquery.min.js",revision:"a8e7cabd4d49dfaf0146678ee147dfc5"},{url:"core/scripts/APIandLibraries/Fonts/MaterialIcon.css",revision:"c1cbea39f07b551807abd9967b809ffd"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js",revision:"a92b3364fb0a7349f2a1c31a7ad5ed5e"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js",revision:"52de67605c3d156f4958c83fa9cfc8d9"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js",revision:"6ccf144f123da79e62d5e46a06f133b9"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js",revision:"32e42b38a15f27b01f79bb13aad53714"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js",revision:"5cc1b73e70520fa84b1846afe0ec8fb6"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js",revision:"7d2c412531f05f39e97195f9b48a53dc"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css",revision:"53aa521e55523d4f35610e568c5991fd"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css",revision:"f50b588ab5764c08bb2e57da6bbe47c7"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css",revision:"1b1cb0e2be9a21f091a87691f20c6300"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css",revision:"32f9388da564ecf3f4f129021d3736a8"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css",revision:"1282e3b4ef0226816da34cd92a7ae69b"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css",revision:"95616dd04a2044a59dbefbc48c050891"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css",revision:"20d013574c70b2032e408e8f81a8fec9"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css",revision:"2609642eaa62f29a2275e0ced5a098fe"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css",revision:"c01f229a610e6f96bdb57fd287f48fc9"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css",revision:"0b4f19eb4846adc5a866b80c81bda434"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css",revision:"7c821536802bd2fa35701c22f2e96d36"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css",revision:"cb9d8d28a86d39db9b43030a8248b766"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css",revision:"fc7e1eb57c409c379d21a8001a0f9b33"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css",revision:"93f428651ed8b87b9986050f06e03cb2"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css",revision:"895b9494c7178ac12ad9c56d81305665"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css",revision:"4dd0ce2aa69225d64aacbded692fe756"},{url:"core/images/logo_transparent.svg",revision:"d6abce258f77c56dfa6bb87765e3dfcf"},{url:"core/images/logo_transparent.png",revision:"86746c9170e4cc9fccb363d0c54b3497"},{url:"core/images/logo_transparent-Dark.svg",revision:"faef5b38e346a12888c11184c890292e"},{url:"core/images/logo_transparent-Dark.png",revision:"cec8eede6a0b9a7e6da788d86edf6b37"},{url:"core/images/dna.svg",revision:"7cf969d66011a6cddf39163fa202fa51"},{url:"core/images/dna.png",revision:"d2778bf9fba581a4f4b8c2fca9abc9e8"},{url:"core/images/EDITmd/005_Algorithm.png",revision:"934afcec1bad4f6cd1b39e799e6de5c2"},{url:"core/images/EDITmd/004_FeedbackPage.png",revision:"e4ffddaa8a91c2c5547a89a4c6f47794"},{url:"core/images/EDITmd/002_SciGradePracticeGene.png",revision:"a47cd17752a978f6e468985af11d5f3e"},{url:"core/images/BackgroundImage/homeBackground.webp",revision:"fcb1240061569d6c355261f8d75a0f1b"},{url:"core/images/BackgroundImage/grey.webp",revision:"44f3357b5a1f4d29ea3368de0f0f5279"},{url:"core/icon/screenshot3.webp",revision:"19ef6219d8f3ba14ebf25b72e07240d8"},{url:"core/icon/screenshot2.webp",revision:"87d56bb07395695fda9e04a30caf1672"},{url:"core/icon/screenshot1.webp",revision:"426fd7165422ee95968d181411229d95"},{url:"core/icon/safari-pinned-tab.svg",revision:"3a6f655958b21d384ae3dad886960d93"},{url:"core/icon/resoc.png",revision:"4b94395e0972a350b0727a20e3d06baa"},{url:"core/icon/mstile-70x70.png",revision:"b2902f78c5c0344f8a0558a8f36b97bf"},{url:"core/icon/mstile-310x310.png",revision:"39af54c06ac44ebe9312f682ddd3602c"},{url:"core/icon/mstile-310x150.png",revision:"7555e1760cd643b25105bfe4114eedfd"},{url:"core/icon/mstile-150x150.png",revision:"4a6b569778e6b9d81aaee10df7c65284"},{url:"core/icon/mstile-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/maskable_icon_x96.png",revision:"5269c50f0761a8aa50ae7201c28760c6"},{url:"core/icon/maskable_icon_x72.png",revision:"0603508e30979836bd82b2d95dc0b1f4"},{url:"core/icon/maskable_icon_x512.png",revision:"499293f67750aa3b60815cb50d8e3b72"},{url:"core/icon/maskable_icon_x48.png",revision:"c521515543d0ccc88a843690484dfefe"},{url:"core/icon/maskable_icon_x384.png",revision:"83527cdabf00617fb5b56df08a08b2a3"},{url:"core/icon/maskable_icon_x192.png",revision:"bd977cf9153d6ebb3e8d8f79b4f100b6"},{url:"core/icon/maskable_icon_x128.png",revision:"cf5ea1b4cd68730505d36d59d3c8b04d"},{url:"core/icon/maskable_icon.png",revision:"94a300afab67912c4aa267989a725155"},{url:"core/icon/manifest.json",revision:"ec78f1b4aaf3e8be6d7db11ef45fbf72"},{url:"core/icon/favicon.ico",revision:"ea57adfd4a62355e9f4c2b46ef21600f"},{url:"core/icon/favicon-32x32.png",revision:"a6296dcec5e5a6449807f753d885507d"},{url:"core/icon/favicon-16x16.png",revision:"f9e844d671e8e4b80174f643fe4dcf56"},{url:"core/icon/apple-touch-icon.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-76x76.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"core/icon/apple-touch-icon-76x76-precomposed.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"core/icon/apple-touch-icon-72x72.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"core/icon/apple-touch-icon-72x72-precomposed.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"core/icon/apple-touch-icon-60x60.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"core/icon/apple-touch-icon-60x60-precomposed.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"core/icon/apple-touch-icon-57x57.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"core/icon/apple-touch-icon-57x57-precomposed.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"core/icon/apple-touch-icon-180x180.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-180x180-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-152x152.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"core/icon/apple-touch-icon-152x152-precomposed.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"core/icon/apple-touch-icon-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/apple-touch-icon-144x144-precomposed.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/apple-touch-icon-120x120.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"core/icon/apple-touch-icon-120x120-precomposed.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"core/icon/apple-touch-icon-114x114.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"core/icon/apple-touch-icon-114x114-precomposed.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"core/icon/android-chrome-96x96.png",revision:"497e53074c189be631a8368192870f02"},{url:"core/icon/android-chrome-72x72.png",revision:"a2b1197f79059981d8a19ba65ce73e6d"},{url:"core/icon/android-chrome-512x512.png",revision:"d5a6869fb6a0d95e1c1398de5aac2278"},{url:"core/icon/android-chrome-48x48.png",revision:"7ac44965ab502f17205e2d048d3e1580"},{url:"core/icon/android-chrome-384x384.png",revision:"45ea1a83b4d26a9224844344602ad69e"},{url:"core/icon/android-chrome-36x36.png",revision:"c3603b9735bb8397b0ac5351da9e94ed"},{url:"core/icon/android-chrome-256x256.png",revision:"d80b94ad67334b9560e3cefaf8b04677"},{url:"core/icon/android-chrome-192x192.png",revision:"f94fc51b10052dcc8f91e04945a618b8"},{url:"core/icon/android-chrome-144x144.png",revision:"859cb36c4d6354a1d76e8d9692fdd88d"},{url:"core/data/Benchling_gRNA_Outputs.json",revision:"515b0830b197e126a294fb15cd6d8e89"},{url:"core/data/eBFP/eBFP.fasta",revision:"a30dc131549dc5fbbaa59128830ca49c"},{url:"core/data/eBFP/Benchling_gRNA_outputs.xlsx",revision:"cb29f7f64c8c0f44cfe58c3504af0d2b"},{url:"core/data/HBB/HBB.fasta",revision:"0314a959f59b730536fddec088d4a6c5"},{url:"core/data/HBB/Benchling_gRNA_Outputs.xlsx",revision:"571ef05c0a5fc985423f08ab13e3fc71"},{url:"core/data/CCR5/CCR5.fasta",revision:"60232b31119c5c0dfd9c59216f46928a"},{url:"core/data/CCR5/Benchling_gRNA_Outputs.xlsx",revision:"d204b7de85c0def6a40789a3104dd975"},{url:"core/data/Background_info/gene_background_info.json",revision:"ebeaca222ceb2e2354f6b2bacb6d0b26"},{url:"core/data/APOE/Benchling_gRNA_Outputs.xlsx",revision:"d728b00ab3559732abc114c43893ba7e"},{url:"core/data/APOE/APOE.fasta",revision:"9955beb43e9fd5a6e506cb9853ef13f2"},{url:"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx",revision:"9d9a05ae5858671f89b87ae185b4917b"},{url:"core/data/ACTN3/ACTN3.fasta",revision:"a5ad42f7acbecbc28bed864b8377c5d4"}],{}),e.registerRoute(/\.(?:png|jpg|jpeg|webp|ico|svg)$/,new e.CacheFirst({cacheName:"images",plugins:[new e.ExpirationPlugin({maxEntries:10})]}),"GET"),e.registerRoute(/\.html$/,new e.NetworkFirst({cacheName:"html",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET"),e.registerRoute(/\.(?:css|js)$/,new e.NetworkFirst({cacheName:"assets",plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET");}); +if(!self.define){let e,r={};const c=(c,o)=>(c=new URL(c+".js",o).href,r[c]||new Promise(r=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=r,document.head.appendChild(e);}else e=c,importScripts(c),r();}).then(()=>{let e=r[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e;}));self.define=(o,i)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(r[a])return;let s={};const n=e=>c(e,a),d={module:{uri:a},exports:s,require:n};r[a]=Promise.all(o.map(e=>d[e]||n(e))).then(e=>(i(...e),s));};}define(["./workbox-813eeb66"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting();}),e.precacheAndRoute([{url:"core/systemrun.html",revision:"162fdd219b27839b2db1dd3d3162551f"},{url:"core/styling/style.min.css",revision:"65a608b7d010ea2b87bb7ea7584ab875"},{url:"core/styling/style.css",revision:"b67cbfd3995e07bba50358eaa64009fe"},{url:"core/scripts/runtime.min.js",revision:"8a3d731b68f7a844695d9f62975f9e87"},{url:"core/scripts/runtime.js",revision:"3d9fff75f5461d4c927f08837da3737f"},{url:"core/scripts/crispr_scripts.min.js",revision:"024fe69397a26d29cbe66a1f5231f6ad"},{url:"core/scripts/crispr_scripts.js",revision:"7ab74de172a7cdbcf01d0b494fef8c74"},{url:"core/scripts/APIandLibraries/tabletoCSV/package.json",revision:"ef0258ebdf3f9d244d7d38c4c35ec723"},{url:"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js",revision:"1757e6cdbbbe5f5a1c330e2f182e24f2"},{url:"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js",revision:"c93880a7ac368dcd9b51d547948cbf8a"},{url:"core/scripts/APIandLibraries/tabletoCSV/example.html",revision:"9b17ab0cdbf7acd33dfcfff87c410d2b"},{url:"core/scripts/APIandLibraries/tabletoCSV/bower.json",revision:"79787e672bb7dc33e2a2e0bdc8467a38"},{url:"core/scripts/APIandLibraries/tabletoCSV/README.md",revision:"d581efd7f3de48bdf77206307df41034"},{url:"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js",revision:"38e3e2fcaff8b3a33f2e3bf01190e845"},{url:"core/scripts/APIandLibraries/jQuery/jquery.min.js",revision:"a8e7cabd4d49dfaf0146678ee147dfc5"},{url:"core/scripts/APIandLibraries/Fonts/MaterialIcon.css",revision:"c1cbea39f07b551807abd9967b809ffd"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js",revision:"a92b3364fb0a7349f2a1c31a7ad5ed5e"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js",revision:"52de67605c3d156f4958c83fa9cfc8d9"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js",revision:"6ccf144f123da79e62d5e46a06f133b9"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js",revision:"32e42b38a15f27b01f79bb13aad53714"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js",revision:"5cc1b73e70520fa84b1846afe0ec8fb6"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js",revision:"7d2c412531f05f39e97195f9b48a53dc"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css",revision:"53aa521e55523d4f35610e568c5991fd"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css",revision:"f50b588ab5764c08bb2e57da6bbe47c7"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css",revision:"1b1cb0e2be9a21f091a87691f20c6300"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css",revision:"32f9388da564ecf3f4f129021d3736a8"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css",revision:"1282e3b4ef0226816da34cd92a7ae69b"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css",revision:"95616dd04a2044a59dbefbc48c050891"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css",revision:"20d013574c70b2032e408e8f81a8fec9"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css",revision:"2609642eaa62f29a2275e0ced5a098fe"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css",revision:"c01f229a610e6f96bdb57fd287f48fc9"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css",revision:"0b4f19eb4846adc5a866b80c81bda434"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css",revision:"7c821536802bd2fa35701c22f2e96d36"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css",revision:"cb9d8d28a86d39db9b43030a8248b766"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css",revision:"fc7e1eb57c409c379d21a8001a0f9b33"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css",revision:"93f428651ed8b87b9986050f06e03cb2"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css",revision:"895b9494c7178ac12ad9c56d81305665"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css",revision:"4dd0ce2aa69225d64aacbded692fe756"},{url:"core/images/logo_transparent.svg",revision:"d6abce258f77c56dfa6bb87765e3dfcf"},{url:"core/images/logo_transparent.png",revision:"86746c9170e4cc9fccb363d0c54b3497"},{url:"core/images/logo_transparent-Dark.svg",revision:"faef5b38e346a12888c11184c890292e"},{url:"core/images/logo_transparent-Dark.png",revision:"cec8eede6a0b9a7e6da788d86edf6b37"},{url:"core/images/dna.svg",revision:"7cf969d66011a6cddf39163fa202fa51"},{url:"core/images/dna.png",revision:"d2778bf9fba581a4f4b8c2fca9abc9e8"},{url:"core/images/EDITmd/005_Algorithm.png",revision:"934afcec1bad4f6cd1b39e799e6de5c2"},{url:"core/images/EDITmd/004_FeedbackPage.png",revision:"e4ffddaa8a91c2c5547a89a4c6f47794"},{url:"core/images/EDITmd/002_SciGradePracticeGene.png",revision:"a47cd17752a978f6e468985af11d5f3e"},{url:"core/images/BackgroundImage/homeBackground.webp",revision:"fcb1240061569d6c355261f8d75a0f1b"},{url:"core/images/BackgroundImage/grey.webp",revision:"44f3357b5a1f4d29ea3368de0f0f5279"},{url:"core/icon/screenshot3.webp",revision:"19ef6219d8f3ba14ebf25b72e07240d8"},{url:"core/icon/screenshot2.webp",revision:"87d56bb07395695fda9e04a30caf1672"},{url:"core/icon/screenshot1.webp",revision:"426fd7165422ee95968d181411229d95"},{url:"core/icon/safari-pinned-tab.svg",revision:"3a6f655958b21d384ae3dad886960d93"},{url:"core/icon/resoc.png",revision:"4b94395e0972a350b0727a20e3d06baa"},{url:"core/icon/mstile-70x70.png",revision:"b2902f78c5c0344f8a0558a8f36b97bf"},{url:"core/icon/mstile-310x310.png",revision:"39af54c06ac44ebe9312f682ddd3602c"},{url:"core/icon/mstile-310x150.png",revision:"7555e1760cd643b25105bfe4114eedfd"},{url:"core/icon/mstile-150x150.png",revision:"4a6b569778e6b9d81aaee10df7c65284"},{url:"core/icon/mstile-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/maskable_icon_x96.png",revision:"5269c50f0761a8aa50ae7201c28760c6"},{url:"core/icon/maskable_icon_x72.png",revision:"0603508e30979836bd82b2d95dc0b1f4"},{url:"core/icon/maskable_icon_x512.png",revision:"499293f67750aa3b60815cb50d8e3b72"},{url:"core/icon/maskable_icon_x48.png",revision:"c521515543d0ccc88a843690484dfefe"},{url:"core/icon/maskable_icon_x384.png",revision:"83527cdabf00617fb5b56df08a08b2a3"},{url:"core/icon/maskable_icon_x192.png",revision:"bd977cf9153d6ebb3e8d8f79b4f100b6"},{url:"core/icon/maskable_icon_x128.png",revision:"cf5ea1b4cd68730505d36d59d3c8b04d"},{url:"core/icon/maskable_icon.png",revision:"94a300afab67912c4aa267989a725155"},{url:"core/icon/manifest.json",revision:"ec78f1b4aaf3e8be6d7db11ef45fbf72"},{url:"core/icon/favicon.ico",revision:"ea57adfd4a62355e9f4c2b46ef21600f"},{url:"core/icon/favicon-32x32.png",revision:"a6296dcec5e5a6449807f753d885507d"},{url:"core/icon/favicon-16x16.png",revision:"f9e844d671e8e4b80174f643fe4dcf56"},{url:"core/icon/apple-touch-icon.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-76x76.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"core/icon/apple-touch-icon-76x76-precomposed.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"core/icon/apple-touch-icon-72x72.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"core/icon/apple-touch-icon-72x72-precomposed.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"core/icon/apple-touch-icon-60x60.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"core/icon/apple-touch-icon-60x60-precomposed.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"core/icon/apple-touch-icon-57x57.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"core/icon/apple-touch-icon-57x57-precomposed.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"core/icon/apple-touch-icon-180x180.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-180x180-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-152x152.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"core/icon/apple-touch-icon-152x152-precomposed.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"core/icon/apple-touch-icon-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/apple-touch-icon-144x144-precomposed.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/apple-touch-icon-120x120.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"core/icon/apple-touch-icon-120x120-precomposed.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"core/icon/apple-touch-icon-114x114.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"core/icon/apple-touch-icon-114x114-precomposed.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"core/icon/android-chrome-96x96.png",revision:"497e53074c189be631a8368192870f02"},{url:"core/icon/android-chrome-72x72.png",revision:"a2b1197f79059981d8a19ba65ce73e6d"},{url:"core/icon/android-chrome-512x512.png",revision:"d5a6869fb6a0d95e1c1398de5aac2278"},{url:"core/icon/android-chrome-48x48.png",revision:"7ac44965ab502f17205e2d048d3e1580"},{url:"core/icon/android-chrome-384x384.png",revision:"45ea1a83b4d26a9224844344602ad69e"},{url:"core/icon/android-chrome-36x36.png",revision:"c3603b9735bb8397b0ac5351da9e94ed"},{url:"core/icon/android-chrome-256x256.png",revision:"d80b94ad67334b9560e3cefaf8b04677"},{url:"core/icon/android-chrome-192x192.png",revision:"f94fc51b10052dcc8f91e04945a618b8"},{url:"core/icon/android-chrome-144x144.png",revision:"859cb36c4d6354a1d76e8d9692fdd88d"},{url:"core/data/Benchling_gRNA_Outputs.json",revision:"515b0830b197e126a294fb15cd6d8e89"},{url:"core/data/eBFP/eBFP.fasta",revision:"a30dc131549dc5fbbaa59128830ca49c"},{url:"core/data/eBFP/Benchling_gRNA_outputs.xlsx",revision:"cb29f7f64c8c0f44cfe58c3504af0d2b"},{url:"core/data/HBB/HBB.fasta",revision:"0314a959f59b730536fddec088d4a6c5"},{url:"core/data/HBB/Benchling_gRNA_Outputs.xlsx",revision:"571ef05c0a5fc985423f08ab13e3fc71"},{url:"core/data/CCR5/CCR5.fasta",revision:"60232b31119c5c0dfd9c59216f46928a"},{url:"core/data/CCR5/Benchling_gRNA_Outputs.xlsx",revision:"d204b7de85c0def6a40789a3104dd975"},{url:"core/data/Background_info/gene_background_info.json",revision:"ebeaca222ceb2e2354f6b2bacb6d0b26"},{url:"core/data/APOE/Benchling_gRNA_Outputs.xlsx",revision:"d728b00ab3559732abc114c43893ba7e"},{url:"core/data/APOE/APOE.fasta",revision:"9955beb43e9fd5a6e506cb9853ef13f2"},{url:"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx",revision:"9d9a05ae5858671f89b87ae185b4917b"},{url:"core/data/ACTN3/ACTN3.fasta",revision:"a5ad42f7acbecbc28bed864b8377c5d4"}],{}),e.registerRoute(/\.(?:png|jpg|jpeg|webp|ico|svg)$/,new e.CacheFirst({cacheName:"images",plugins:[new e.ExpirationPlugin({maxEntries:10})]}),"GET"),e.registerRoute(/\.html$/,new e.NetworkFirst({cacheName:"html",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET"),e.registerRoute(/\.(?:css|js)$/,new e.NetworkFirst({cacheName:"assets",plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET");}); //# sourceMappingURL=sw.js.map diff --git a/core/scripts/serviceWorker/sw.js.map b/core/scripts/serviceWorker/sw.js.map index 8fa3213..6d402b9 100644 --- a/core/scripts/serviceWorker/sw.js.map +++ b/core/scripts/serviceWorker/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/x_/xp67pwcd45d2bwd0h9y9cpbw0000gp/T/e056a9aa17af84bd1b613818bd12b446/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-routing/registerRoute.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"core/systemrun.html\",\n \"revision\": \"8dff6048b9d69269ee93641fe2a6fdd3\"\n },\n {\n \"url\": \"core/styling/style.min.css\",\n \"revision\": \"65a608b7d010ea2b87bb7ea7584ab875\"\n },\n {\n \"url\": \"core/styling/style.css\",\n \"revision\": \"b67cbfd3995e07bba50358eaa64009fe\"\n },\n {\n \"url\": \"core/scripts/runtime.min.js\",\n \"revision\": \"8a3d731b68f7a844695d9f62975f9e87\"\n },\n {\n \"url\": \"core/scripts/runtime.js\",\n \"revision\": \"3d9fff75f5461d4c927f08837da3737f\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.min.js\",\n \"revision\": \"a33cfc3004c2dade90c7df5ec2eb33e2\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.js\",\n \"revision\": \"9b350e01172d688a17f6151a69b9334b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/package.json\",\n \"revision\": \"ef0258ebdf3f9d244d7d38c4c35ec723\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js\",\n \"revision\": \"1757e6cdbbbe5f5a1c330e2f182e24f2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js\",\n \"revision\": \"c93880a7ac368dcd9b51d547948cbf8a\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/example.html\",\n \"revision\": \"9b17ab0cdbf7acd33dfcfff87c410d2b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/bower.json\",\n \"revision\": \"79787e672bb7dc33e2a2e0bdc8467a38\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/README.md\",\n \"revision\": \"d581efd7f3de48bdf77206307df41034\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js\",\n \"revision\": \"38e3e2fcaff8b3a33f2e3bf01190e845\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/jQuery/jquery.min.js\",\n \"revision\": \"a8e7cabd4d49dfaf0146678ee147dfc5\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Fonts/MaterialIcon.css\",\n \"revision\": \"c1cbea39f07b551807abd9967b809ffd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js\",\n \"revision\": \"a92b3364fb0a7349f2a1c31a7ad5ed5e\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js\",\n \"revision\": \"52de67605c3d156f4958c83fa9cfc8d9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js\",\n \"revision\": \"6ccf144f123da79e62d5e46a06f133b9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js\",\n \"revision\": \"32e42b38a15f27b01f79bb13aad53714\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js\",\n \"revision\": \"5cc1b73e70520fa84b1846afe0ec8fb6\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js\",\n \"revision\": \"7d2c412531f05f39e97195f9b48a53dc\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css\",\n \"revision\": \"53aa521e55523d4f35610e568c5991fd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css\",\n \"revision\": \"f50b588ab5764c08bb2e57da6bbe47c7\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css\",\n \"revision\": \"1b1cb0e2be9a21f091a87691f20c6300\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css\",\n \"revision\": \"32f9388da564ecf3f4f129021d3736a8\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css\",\n \"revision\": \"1282e3b4ef0226816da34cd92a7ae69b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css\",\n \"revision\": \"95616dd04a2044a59dbefbc48c050891\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css\",\n \"revision\": \"20d013574c70b2032e408e8f81a8fec9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css\",\n \"revision\": \"2609642eaa62f29a2275e0ced5a098fe\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css\",\n \"revision\": \"c01f229a610e6f96bdb57fd287f48fc9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css\",\n \"revision\": \"0b4f19eb4846adc5a866b80c81bda434\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css\",\n \"revision\": \"7c821536802bd2fa35701c22f2e96d36\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css\",\n \"revision\": \"cb9d8d28a86d39db9b43030a8248b766\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css\",\n \"revision\": \"fc7e1eb57c409c379d21a8001a0f9b33\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css\",\n \"revision\": \"93f428651ed8b87b9986050f06e03cb2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css\",\n \"revision\": \"895b9494c7178ac12ad9c56d81305665\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css\",\n \"revision\": \"4dd0ce2aa69225d64aacbded692fe756\"\n },\n {\n \"url\": \"core/images/logo_transparent.svg\",\n \"revision\": \"d6abce258f77c56dfa6bb87765e3dfcf\"\n },\n {\n \"url\": \"core/images/logo_transparent.png\",\n \"revision\": \"86746c9170e4cc9fccb363d0c54b3497\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.svg\",\n \"revision\": \"faef5b38e346a12888c11184c890292e\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.png\",\n \"revision\": \"cec8eede6a0b9a7e6da788d86edf6b37\"\n },\n {\n \"url\": \"core/images/dna.svg\",\n \"revision\": \"7cf969d66011a6cddf39163fa202fa51\"\n },\n {\n \"url\": \"core/images/dna.png\",\n \"revision\": \"d2778bf9fba581a4f4b8c2fca9abc9e8\"\n },\n {\n \"url\": \"core/images/EDITmd/005_Algorithm.png\",\n \"revision\": \"934afcec1bad4f6cd1b39e799e6de5c2\"\n },\n {\n \"url\": \"core/images/EDITmd/004_FeedbackPage.png\",\n \"revision\": \"e4ffddaa8a91c2c5547a89a4c6f47794\"\n },\n {\n \"url\": \"core/images/EDITmd/002_SciGradePracticeGene.png\",\n \"revision\": \"a47cd17752a978f6e468985af11d5f3e\"\n },\n {\n \"url\": \"core/images/BackgroundImage/homeBackground.webp\",\n \"revision\": \"fcb1240061569d6c355261f8d75a0f1b\"\n },\n {\n \"url\": \"core/images/BackgroundImage/grey.webp\",\n \"revision\": \"44f3357b5a1f4d29ea3368de0f0f5279\"\n },\n {\n \"url\": \"core/icon/screenshot3.webp\",\n \"revision\": \"19ef6219d8f3ba14ebf25b72e07240d8\"\n },\n {\n \"url\": \"core/icon/screenshot2.webp\",\n \"revision\": \"87d56bb07395695fda9e04a30caf1672\"\n },\n {\n \"url\": \"core/icon/screenshot1.webp\",\n \"revision\": \"426fd7165422ee95968d181411229d95\"\n },\n {\n \"url\": \"core/icon/safari-pinned-tab.svg\",\n \"revision\": \"3a6f655958b21d384ae3dad886960d93\"\n },\n {\n \"url\": \"core/icon/resoc.png\",\n \"revision\": \"4b94395e0972a350b0727a20e3d06baa\"\n },\n {\n \"url\": \"core/icon/mstile-70x70.png\",\n \"revision\": \"b2902f78c5c0344f8a0558a8f36b97bf\"\n },\n {\n \"url\": \"core/icon/mstile-310x310.png\",\n \"revision\": \"39af54c06ac44ebe9312f682ddd3602c\"\n },\n {\n \"url\": \"core/icon/mstile-310x150.png\",\n \"revision\": \"7555e1760cd643b25105bfe4114eedfd\"\n },\n {\n \"url\": \"core/icon/mstile-150x150.png\",\n \"revision\": \"4a6b569778e6b9d81aaee10df7c65284\"\n },\n {\n \"url\": \"core/icon/mstile-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x96.png\",\n \"revision\": \"5269c50f0761a8aa50ae7201c28760c6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x72.png\",\n \"revision\": \"0603508e30979836bd82b2d95dc0b1f4\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x512.png\",\n \"revision\": \"499293f67750aa3b60815cb50d8e3b72\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x48.png\",\n \"revision\": \"c521515543d0ccc88a843690484dfefe\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x384.png\",\n \"revision\": \"83527cdabf00617fb5b56df08a08b2a3\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x192.png\",\n \"revision\": \"bd977cf9153d6ebb3e8d8f79b4f100b6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x128.png\",\n \"revision\": \"cf5ea1b4cd68730505d36d59d3c8b04d\"\n },\n {\n \"url\": \"core/icon/maskable_icon.png\",\n \"revision\": \"94a300afab67912c4aa267989a725155\"\n },\n {\n \"url\": \"core/icon/manifest.json\",\n \"revision\": \"ec78f1b4aaf3e8be6d7db11ef45fbf72\"\n },\n {\n \"url\": \"core/icon/favicon.ico\",\n \"revision\": \"ea57adfd4a62355e9f4c2b46ef21600f\"\n },\n {\n \"url\": \"core/icon/favicon-32x32.png\",\n \"revision\": \"a6296dcec5e5a6449807f753d885507d\"\n },\n {\n \"url\": \"core/icon/favicon-16x16.png\",\n \"revision\": \"f9e844d671e8e4b80174f643fe4dcf56\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76-precomposed.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72-precomposed.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60-precomposed.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57-precomposed.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152-precomposed.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144-precomposed.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120-precomposed.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114-precomposed.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/android-chrome-96x96.png\",\n \"revision\": \"497e53074c189be631a8368192870f02\"\n },\n {\n \"url\": \"core/icon/android-chrome-72x72.png\",\n \"revision\": \"a2b1197f79059981d8a19ba65ce73e6d\"\n },\n {\n \"url\": \"core/icon/android-chrome-512x512.png\",\n \"revision\": \"d5a6869fb6a0d95e1c1398de5aac2278\"\n },\n {\n \"url\": \"core/icon/android-chrome-48x48.png\",\n \"revision\": \"7ac44965ab502f17205e2d048d3e1580\"\n },\n {\n \"url\": \"core/icon/android-chrome-384x384.png\",\n \"revision\": \"45ea1a83b4d26a9224844344602ad69e\"\n },\n {\n \"url\": \"core/icon/android-chrome-36x36.png\",\n \"revision\": \"c3603b9735bb8397b0ac5351da9e94ed\"\n },\n {\n \"url\": \"core/icon/android-chrome-256x256.png\",\n \"revision\": \"d80b94ad67334b9560e3cefaf8b04677\"\n },\n {\n \"url\": \"core/icon/android-chrome-192x192.png\",\n \"revision\": \"f94fc51b10052dcc8f91e04945a618b8\"\n },\n {\n \"url\": \"core/icon/android-chrome-144x144.png\",\n \"revision\": \"859cb36c4d6354a1d76e8d9692fdd88d\"\n },\n {\n \"url\": \"core/data/Benchling_gRNA_Outputs.json\",\n \"revision\": \"515b0830b197e126a294fb15cd6d8e89\"\n },\n {\n \"url\": \"core/data/eBFP/eBFP.fasta\",\n \"revision\": \"a30dc131549dc5fbbaa59128830ca49c\"\n },\n {\n \"url\": \"core/data/eBFP/Benchling_gRNA_outputs.xlsx\",\n \"revision\": \"cb29f7f64c8c0f44cfe58c3504af0d2b\"\n },\n {\n \"url\": \"core/data/HBB/HBB.fasta\",\n \"revision\": \"0314a959f59b730536fddec088d4a6c5\"\n },\n {\n \"url\": \"core/data/HBB/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"571ef05c0a5fc985423f08ab13e3fc71\"\n },\n {\n \"url\": \"core/data/CCR5/CCR5.fasta\",\n \"revision\": \"60232b31119c5c0dfd9c59216f46928a\"\n },\n {\n \"url\": \"core/data/CCR5/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d204b7de85c0def6a40789a3104dd975\"\n },\n {\n \"url\": \"core/data/Background_info/gene_background_info.json\",\n \"revision\": \"ebeaca222ceb2e2354f6b2bacb6d0b26\"\n },\n {\n \"url\": \"core/data/APOE/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d728b00ab3559732abc114c43893ba7e\"\n },\n {\n \"url\": \"core/data/APOE/APOE.fasta\",\n \"revision\": \"9955beb43e9fd5a6e506cb9853ef13f2\"\n },\n {\n \"url\": \"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"9d9a05ae5858671f89b87ae185b4917b\"\n },\n {\n \"url\": \"core/data/ACTN3/ACTN3.fasta\",\n \"revision\": \"a5ad42f7acbecbc28bed864b8377c5d4\"\n }\n], {});\n\n\n\n\nworkbox_routing_registerRoute(/\\.(?:png|jpg|jpeg|webp|ico|svg)$/, new workbox_strategies_CacheFirst({ \"cacheName\":\"images\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 10 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.html$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"html\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|js)$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","workbox_routing_registerRoute","workbox_strategies_CacheFirst","cacheName","plugins","workbox_expiration_ExpirationPlugin","maxEntries","workbox_strategies_NetworkFirst","networkTimeoutSeconds","workbox_cacheable_response_CacheableResponsePlugin","statuses"],"mappings":"inBAwBAA,KAAKC,iBAAiB,UAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,gBAYTC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,0EACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,qCAEb,CAAE,GAKLC,EAAAA,cAA8B,mCAAoC,IAAIC,aAA8B,CAAEC,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,QAAW,OACvML,EAAAA,cAA8B,UAAW,IAAIM,eAAgC,CAAEJ,UAAY,OAAOK,sBAAwB,GAAIJ,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc,OAC3RT,EAAAA,cAA8B,gBAAiB,IAAIM,eAAgC,CAAEJ,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/x_/xp67pwcd45d2bwd0h9y9cpbw0000gp/T/196063519cfc2da9ae4dd63d8897bc3f/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-routing/registerRoute.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"core/systemrun.html\",\n \"revision\": \"162fdd219b27839b2db1dd3d3162551f\"\n },\n {\n \"url\": \"core/styling/style.min.css\",\n \"revision\": \"65a608b7d010ea2b87bb7ea7584ab875\"\n },\n {\n \"url\": \"core/styling/style.css\",\n \"revision\": \"b67cbfd3995e07bba50358eaa64009fe\"\n },\n {\n \"url\": \"core/scripts/runtime.min.js\",\n \"revision\": \"8a3d731b68f7a844695d9f62975f9e87\"\n },\n {\n \"url\": \"core/scripts/runtime.js\",\n \"revision\": \"3d9fff75f5461d4c927f08837da3737f\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.min.js\",\n \"revision\": \"024fe69397a26d29cbe66a1f5231f6ad\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.js\",\n \"revision\": \"7ab74de172a7cdbcf01d0b494fef8c74\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/package.json\",\n \"revision\": \"ef0258ebdf3f9d244d7d38c4c35ec723\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js\",\n \"revision\": \"1757e6cdbbbe5f5a1c330e2f182e24f2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js\",\n \"revision\": \"c93880a7ac368dcd9b51d547948cbf8a\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/example.html\",\n \"revision\": \"9b17ab0cdbf7acd33dfcfff87c410d2b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/bower.json\",\n \"revision\": \"79787e672bb7dc33e2a2e0bdc8467a38\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/README.md\",\n \"revision\": \"d581efd7f3de48bdf77206307df41034\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js\",\n \"revision\": \"38e3e2fcaff8b3a33f2e3bf01190e845\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/jQuery/jquery.min.js\",\n \"revision\": \"a8e7cabd4d49dfaf0146678ee147dfc5\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Fonts/MaterialIcon.css\",\n \"revision\": \"c1cbea39f07b551807abd9967b809ffd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js\",\n \"revision\": \"a92b3364fb0a7349f2a1c31a7ad5ed5e\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js\",\n \"revision\": \"52de67605c3d156f4958c83fa9cfc8d9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js\",\n \"revision\": \"6ccf144f123da79e62d5e46a06f133b9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js\",\n \"revision\": \"32e42b38a15f27b01f79bb13aad53714\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js\",\n \"revision\": \"5cc1b73e70520fa84b1846afe0ec8fb6\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js\",\n \"revision\": \"7d2c412531f05f39e97195f9b48a53dc\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css\",\n \"revision\": \"53aa521e55523d4f35610e568c5991fd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css\",\n \"revision\": \"f50b588ab5764c08bb2e57da6bbe47c7\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css\",\n \"revision\": \"1b1cb0e2be9a21f091a87691f20c6300\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css\",\n \"revision\": \"32f9388da564ecf3f4f129021d3736a8\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css\",\n \"revision\": \"1282e3b4ef0226816da34cd92a7ae69b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css\",\n \"revision\": \"95616dd04a2044a59dbefbc48c050891\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css\",\n \"revision\": \"20d013574c70b2032e408e8f81a8fec9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css\",\n \"revision\": \"2609642eaa62f29a2275e0ced5a098fe\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css\",\n \"revision\": \"c01f229a610e6f96bdb57fd287f48fc9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css\",\n \"revision\": \"0b4f19eb4846adc5a866b80c81bda434\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css\",\n \"revision\": \"7c821536802bd2fa35701c22f2e96d36\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css\",\n \"revision\": \"cb9d8d28a86d39db9b43030a8248b766\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css\",\n \"revision\": \"fc7e1eb57c409c379d21a8001a0f9b33\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css\",\n \"revision\": \"93f428651ed8b87b9986050f06e03cb2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css\",\n \"revision\": \"895b9494c7178ac12ad9c56d81305665\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css\",\n \"revision\": \"4dd0ce2aa69225d64aacbded692fe756\"\n },\n {\n \"url\": \"core/images/logo_transparent.svg\",\n \"revision\": \"d6abce258f77c56dfa6bb87765e3dfcf\"\n },\n {\n \"url\": \"core/images/logo_transparent.png\",\n \"revision\": \"86746c9170e4cc9fccb363d0c54b3497\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.svg\",\n \"revision\": \"faef5b38e346a12888c11184c890292e\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.png\",\n \"revision\": \"cec8eede6a0b9a7e6da788d86edf6b37\"\n },\n {\n \"url\": \"core/images/dna.svg\",\n \"revision\": \"7cf969d66011a6cddf39163fa202fa51\"\n },\n {\n \"url\": \"core/images/dna.png\",\n \"revision\": \"d2778bf9fba581a4f4b8c2fca9abc9e8\"\n },\n {\n \"url\": \"core/images/EDITmd/005_Algorithm.png\",\n \"revision\": \"934afcec1bad4f6cd1b39e799e6de5c2\"\n },\n {\n \"url\": \"core/images/EDITmd/004_FeedbackPage.png\",\n \"revision\": \"e4ffddaa8a91c2c5547a89a4c6f47794\"\n },\n {\n \"url\": \"core/images/EDITmd/002_SciGradePracticeGene.png\",\n \"revision\": \"a47cd17752a978f6e468985af11d5f3e\"\n },\n {\n \"url\": \"core/images/BackgroundImage/homeBackground.webp\",\n \"revision\": \"fcb1240061569d6c355261f8d75a0f1b\"\n },\n {\n \"url\": \"core/images/BackgroundImage/grey.webp\",\n \"revision\": \"44f3357b5a1f4d29ea3368de0f0f5279\"\n },\n {\n \"url\": \"core/icon/screenshot3.webp\",\n \"revision\": \"19ef6219d8f3ba14ebf25b72e07240d8\"\n },\n {\n \"url\": \"core/icon/screenshot2.webp\",\n \"revision\": \"87d56bb07395695fda9e04a30caf1672\"\n },\n {\n \"url\": \"core/icon/screenshot1.webp\",\n \"revision\": \"426fd7165422ee95968d181411229d95\"\n },\n {\n \"url\": \"core/icon/safari-pinned-tab.svg\",\n \"revision\": \"3a6f655958b21d384ae3dad886960d93\"\n },\n {\n \"url\": \"core/icon/resoc.png\",\n \"revision\": \"4b94395e0972a350b0727a20e3d06baa\"\n },\n {\n \"url\": \"core/icon/mstile-70x70.png\",\n \"revision\": \"b2902f78c5c0344f8a0558a8f36b97bf\"\n },\n {\n \"url\": \"core/icon/mstile-310x310.png\",\n \"revision\": \"39af54c06ac44ebe9312f682ddd3602c\"\n },\n {\n \"url\": \"core/icon/mstile-310x150.png\",\n \"revision\": \"7555e1760cd643b25105bfe4114eedfd\"\n },\n {\n \"url\": \"core/icon/mstile-150x150.png\",\n \"revision\": \"4a6b569778e6b9d81aaee10df7c65284\"\n },\n {\n \"url\": \"core/icon/mstile-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x96.png\",\n \"revision\": \"5269c50f0761a8aa50ae7201c28760c6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x72.png\",\n \"revision\": \"0603508e30979836bd82b2d95dc0b1f4\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x512.png\",\n \"revision\": \"499293f67750aa3b60815cb50d8e3b72\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x48.png\",\n \"revision\": \"c521515543d0ccc88a843690484dfefe\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x384.png\",\n \"revision\": \"83527cdabf00617fb5b56df08a08b2a3\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x192.png\",\n \"revision\": \"bd977cf9153d6ebb3e8d8f79b4f100b6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x128.png\",\n \"revision\": \"cf5ea1b4cd68730505d36d59d3c8b04d\"\n },\n {\n \"url\": \"core/icon/maskable_icon.png\",\n \"revision\": \"94a300afab67912c4aa267989a725155\"\n },\n {\n \"url\": \"core/icon/manifest.json\",\n \"revision\": \"ec78f1b4aaf3e8be6d7db11ef45fbf72\"\n },\n {\n \"url\": \"core/icon/favicon.ico\",\n \"revision\": \"ea57adfd4a62355e9f4c2b46ef21600f\"\n },\n {\n \"url\": \"core/icon/favicon-32x32.png\",\n \"revision\": \"a6296dcec5e5a6449807f753d885507d\"\n },\n {\n \"url\": \"core/icon/favicon-16x16.png\",\n \"revision\": \"f9e844d671e8e4b80174f643fe4dcf56\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76-precomposed.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72-precomposed.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60-precomposed.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57-precomposed.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152-precomposed.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144-precomposed.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120-precomposed.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114-precomposed.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/android-chrome-96x96.png\",\n \"revision\": \"497e53074c189be631a8368192870f02\"\n },\n {\n \"url\": \"core/icon/android-chrome-72x72.png\",\n \"revision\": \"a2b1197f79059981d8a19ba65ce73e6d\"\n },\n {\n \"url\": \"core/icon/android-chrome-512x512.png\",\n \"revision\": \"d5a6869fb6a0d95e1c1398de5aac2278\"\n },\n {\n \"url\": \"core/icon/android-chrome-48x48.png\",\n \"revision\": \"7ac44965ab502f17205e2d048d3e1580\"\n },\n {\n \"url\": \"core/icon/android-chrome-384x384.png\",\n \"revision\": \"45ea1a83b4d26a9224844344602ad69e\"\n },\n {\n \"url\": \"core/icon/android-chrome-36x36.png\",\n \"revision\": \"c3603b9735bb8397b0ac5351da9e94ed\"\n },\n {\n \"url\": \"core/icon/android-chrome-256x256.png\",\n \"revision\": \"d80b94ad67334b9560e3cefaf8b04677\"\n },\n {\n \"url\": \"core/icon/android-chrome-192x192.png\",\n \"revision\": \"f94fc51b10052dcc8f91e04945a618b8\"\n },\n {\n \"url\": \"core/icon/android-chrome-144x144.png\",\n \"revision\": \"859cb36c4d6354a1d76e8d9692fdd88d\"\n },\n {\n \"url\": \"core/data/Benchling_gRNA_Outputs.json\",\n \"revision\": \"515b0830b197e126a294fb15cd6d8e89\"\n },\n {\n \"url\": \"core/data/eBFP/eBFP.fasta\",\n \"revision\": \"a30dc131549dc5fbbaa59128830ca49c\"\n },\n {\n \"url\": \"core/data/eBFP/Benchling_gRNA_outputs.xlsx\",\n \"revision\": \"cb29f7f64c8c0f44cfe58c3504af0d2b\"\n },\n {\n \"url\": \"core/data/HBB/HBB.fasta\",\n \"revision\": \"0314a959f59b730536fddec088d4a6c5\"\n },\n {\n \"url\": \"core/data/HBB/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"571ef05c0a5fc985423f08ab13e3fc71\"\n },\n {\n \"url\": \"core/data/CCR5/CCR5.fasta\",\n \"revision\": \"60232b31119c5c0dfd9c59216f46928a\"\n },\n {\n \"url\": \"core/data/CCR5/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d204b7de85c0def6a40789a3104dd975\"\n },\n {\n \"url\": \"core/data/Background_info/gene_background_info.json\",\n \"revision\": \"ebeaca222ceb2e2354f6b2bacb6d0b26\"\n },\n {\n \"url\": \"core/data/APOE/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d728b00ab3559732abc114c43893ba7e\"\n },\n {\n \"url\": \"core/data/APOE/APOE.fasta\",\n \"revision\": \"9955beb43e9fd5a6e506cb9853ef13f2\"\n },\n {\n \"url\": \"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"9d9a05ae5858671f89b87ae185b4917b\"\n },\n {\n \"url\": \"core/data/ACTN3/ACTN3.fasta\",\n \"revision\": \"a5ad42f7acbecbc28bed864b8377c5d4\"\n }\n], {});\n\n\n\n\nworkbox_routing_registerRoute(/\\.(?:png|jpg|jpeg|webp|ico|svg)$/, new workbox_strategies_CacheFirst({ \"cacheName\":\"images\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 10 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.html$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"html\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|js)$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","workbox_routing_registerRoute","workbox_strategies_CacheFirst","cacheName","plugins","workbox_expiration_ExpirationPlugin","maxEntries","workbox_strategies_NetworkFirst","networkTimeoutSeconds","workbox_cacheable_response_CacheableResponsePlugin","statuses"],"mappings":"inBAwBAA,KAAKC,iBAAiB,UAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,gBAYTC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,0EACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,qCAEb,CAAE,GAKLC,EAAAA,cAA8B,mCAAoC,IAAIC,aAA8B,CAAEC,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,QAAW,OACvML,EAAAA,cAA8B,UAAW,IAAIM,eAAgC,CAAEJ,UAAY,OAAOK,sBAAwB,GAAIJ,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc,OAC3RT,EAAAA,cAA8B,gBAAiB,IAAIM,eAAgC,CAAEJ,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc"} \ No newline at end of file diff --git a/core/systemrun.html b/core/systemrun.html index 867f2ff..60d8b6b 100644 --- a/core/systemrun.html +++ b/core/systemrun.html @@ -181,71 +181,5 @@
- - - - diff --git a/docs/architecture/index.md b/docs/architecture/index.md index e597b0f..e69622a 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -106,8 +106,8 @@ Application styles covering: - Layout and responsive design - Form styling and validation states -- Feedback page appearance -- Modal dialogs used by feedback flows + - Feedback page appearance + - Feedback UI: rendered inline by `showFeedback()` in the runtime page (no modal dialogs are used; see [core/scripts/crispr_scripts.js](../../core/scripts/crispr_scripts.js) and [core/systemrun.html](../../core/systemrun.html)). Built with Bootstrap utilities integrated via [core/scripts/APIandLibraries/Bootstrap/](../../core/scripts/APIandLibraries/Bootstrap/). diff --git a/docs/index.md b/docs/index.md index 54bf87c..20d1804 100644 --- a/docs/index.md +++ b/docs/index.md @@ -77,7 +77,7 @@ SciGrade uses the gene list defined in [core/data/Background_info/gene_backgroun #### Practice Flow - The runtime page initializes the practice flow on page load -- Feedback is generated after submission by [core/scripts/crispr_scripts.js](../core/scripts/crispr_scripts.js) +- Feedback is generated after submission by [core/scripts/crispr_scripts.js](../core/scripts/crispr_scripts.js) and rendered inline by `showFeedback()`. The [CHANGELOG.md](../CHANGELOG.md) records the deprecation of online account features. diff --git a/playwright.config.js b/playwright.config.js index 8bd1fce..39dc4fb 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -23,7 +23,7 @@ export default defineConfig({ forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: 2, - workers: 20, + workers: 15, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [["list"], ["html"], ["json", { outputFile: "test-results/results.json" }]], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/tests/playwright/submission.spec.js b/tests/playwright/submission.spec.js index 62cfe80..b810326 100644 --- a/tests/playwright/submission.spec.js +++ b/tests/playwright/submission.spec.js @@ -52,6 +52,9 @@ test.describe("SciGrade Submission Flow", () => { // Wait for the form to be generated (loadWork appends form inputs into #work) await page.waitForSelector("#sequence_input", { state: "visible" }); + + // Wait for form to fully render and be interactive + await page.waitForTimeout(200); }); // Data-driven tests using test case table From a0399b46dd09f50446ba2d0cab393f7c5e58dc3f Mon Sep 17 00:00:00 2001 From: Alexander Sullivan Date: Thu, 19 Feb 2026 14:58:53 -0500 Subject: [PATCH 2/4] Update core/scripts/crispr_scripts.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- core/scripts/crispr_scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/scripts/crispr_scripts.js b/core/scripts/crispr_scripts.js index ad7771a..641dabb 100644 --- a/core/scripts/crispr_scripts.js +++ b/core/scripts/crispr_scripts.js @@ -782,7 +782,7 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${MARR1primers_display}.

`; From cf9309e9e07ef916a116575a86891d514a55936a Mon Sep 17 00:00:00 2001 From: codefactor-io Date: Thu, 19 Feb 2026 19:59:04 +0000 Subject: [PATCH 3/4] [CodeFactor] Apply fixes to commit a0399b4 --- core/scripts/crispr_scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/scripts/crispr_scripts.js b/core/scripts/crispr_scripts.js index 641dabb..8fdd5b7 100644 --- a/core/scripts/crispr_scripts.js +++ b/core/scripts/crispr_scripts.js @@ -782,7 +782,8 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += "
"; + append_str += + "
"; append_str += "
"; // Content append_str += `

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${MARR1primers_display}.

`; From d777c8e46384c89c8e3b6bfaff93185c135f5dc2 Mon Sep 17 00:00:00 2001 From: Alexander Sullivan Date: Thu, 19 Feb 2026 15:09:24 -0500 Subject: [PATCH 4/4] update --- core/scripts/crispr_scripts.js | 12 +++--- core/scripts/crispr_scripts.min.js | 2 +- tests/playwright/submission.spec.js | 59 ++++++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/core/scripts/crispr_scripts.js b/core/scripts/crispr_scripts.js index 8fdd5b7..8d4dbef 100644 --- a/core/scripts/crispr_scripts.js +++ b/core/scripts/crispr_scripts.js @@ -697,7 +697,7 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${MARgRNAseq_degree_display}.

`; @@ -718,7 +718,7 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${MARPAMseq_display}.

`; @@ -739,8 +739,7 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += - "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${MAROffTarget_degree_display}.

`; @@ -761,7 +760,7 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${MARF1primers_display}.

`; @@ -782,8 +781,7 @@ function showFeedback() { append_str += ""; append_str += ""; append_str += "
"; - append_str += - "
"; + append_str += "
"; append_str += "
"; // Content append_str += `

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${MARR1primers_display}.

`; diff --git a/core/scripts/crispr_scripts.min.js b/core/scripts/crispr_scripts.min.js index fe3e421..512c6bb 100644 --- a/core/scripts/crispr_scripts.min.js +++ b/core/scripts/crispr_scripts.min.js @@ -24,4 +24,4 @@ let selection_inMode="practice";const listOfGenes=["eBFP","ACTN3","HBB","CCR5","
- `,e+='
',e+='',e+='',e+='This would be your off-target score for your gRNA. NOTE: This input only takes numbers',e+="
",e+='
',e+='',e+='',e+='This would be your forward primer (F1) for your gRNA',e+="
",e+='
',e+='',e+='',e+='This would be your reverse primer (R1) for your gRNA',e+="
",e+='',e+='',e+="",e+="
",$("#work").append(e)}else(gene_backgroundInfo===""||!gene_backgroundInfo||!backgroundInfo?.[0].gene_list[current_gene])&&alert("Error code lFS50-66 occurred. Please contact admin or TA!")}function isNumberOrDashKey(e){const n=e.which?e.which:e.keyCode;return!(n!==46&&n!==45&&n>31&&(n<48||n>57))}let MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,MARF1primers=!1,MARR1primers=!1,possible_comparable_answers=[],correctNucleotideIncluded=!1,true_counts=0,checkAnswers_executed=!1;function checkAnswers(){MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,correctNucleotideIncluded=!1,true_counts=0;const e=gene_backgroundInfo.gene_list[current_gene]["Target position"]-1,n=document?.getElementById("sequence_input")?.value?.trim()||void 0;if(possible_comparable_answers=[],n)for(const t of benchling_gRNA_outputs.gene_list[current_gene])t.Sequence===n&&possible_comparable_answers.push(t);if(possible_comparable_answers.length>0)for(const t of possible_comparable_answers){if(true_counts=0,correctNucleotideIncluded=!1,t.Strand===1){const i=t.Position-1-1+3,r=t.Position-1-17;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}else if(t.Strand===-1){const i=t.Position-1+17,r=t.Position-1-3;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}if(correctNucleotideIncluded){let i,r;if(t.Strand===1?(i=t.Position-1+2,r=t.Position-1+4,document.getElementById("strand_input").value==="Sense (+)"&&(MARstrand=!0,true_counts+=1)):t.Strand===-1&&(i=t.Position-1-2,r=t.Position-1-4,document.getElementById("strand_input").value==="Antisense (-)"&&(MARstrand=!0,true_counts+=1)),e>=i&&e<=r?(MARgRNAseq=!1,MARgRNAseq_degree=0):e>=t.Position-1+1&&e<=t.Position-1+10||e<=t.Position-1-1&&e>=t.Position-1-10?(MARgRNAseq=!0,MARgRNAseq_degree=1,true_counts+=1):e>=t.Position-1&&e<=t.Position-1+20||e<=t.Position-1&&e>=t.Position-1-20?(MARgRNAseq=!0,MARgRNAseq_degree=2,true_counts+=1):(e>=t.Position-1&&e<=t.Position-1+30||e<=t.Position-1&&e>=t.Position-1-30)&&(MARgRNAseq=!0,MARgRNAseq_degree=3,true_counts+=1),MARgRNAseq){const o=t;o.Position&&parseInt(o.Position,10)===parseInt(document.getElementById("position_input").value,10)?(MARCutPos=!0,true_counts+=1):(o.Position===null||o.Position===void 0)&&alert("Error code cA302-307: retrieving server information on 'Position' answers occurred. Please contact admin or TA!"),(o.PAM||o.PAM)&&o.PAM===document.getElementById("pam_input").value.trim()?(MARPAMseq=!0,true_counts+=1):(o.PAM===null||o.PAM===void 0)&&alert("Error code cA311-317: retrieving server information on 'PAM' answers occurred. Please contact admin or TA!"),o["Specificity Score"]||o["Specificity Score"]?checkOffTarget(o["Specificity Score"]):(o["Specificity Score"]===null||o["Specificity Score"]===void 0)&&alert("Error code cA342-348: retrieving server information on 'Specificity Score' answers occurred. Please contact admin or TA!"),checkF1Primers(document?.getElementById("sequence_input")?.value?.trim()||""),checkR1Primers(document?.getElementById("sequence_input")?.value?.trim()||"")}}}checkAnswers_executed=!0}let offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];function checkOffTarget(e){MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1;const n=Math.floor(e),t=Math.ceil(e),i=parseInt(document.getElementById("offtarget_input").value,10);if(correctNucleotideIncluded&&MARgRNAseq&&i>=n&&i<=t&&(MAROffTarget=!0,true_counts+=1),MAROffTarget){const r=parseInt(document.getElementById("position_input").value,10)+35,o=parseInt(document.getElementById("position_input").value,10)-35;offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];for(let a=0;a=o&&benchling_gRNA_outputs.gene_list[current_gene][a].Position<=r&&benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]&&(offtarget_List.push(benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]),offtarget_dict[a]=benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"],offtarget_dictParse.push(a));let l=!0;Math.max.apply(null,offtarget_List)<35&&(l=!1);const u=Math.max.apply(null,offtarget_List),c=getOffTargetOptimalValue(u);i>=c?(MAROffTarget_aboveOpt=!0,MAROffTarget_above35=!0,MAROffTarget_degree=1):i>=35?(MAROffTarget_above35=!0,Math.max.apply(null,offtarget_List)<80?MAROffTarget_degree=1:MAROffTarget_degree=2):l||(MAROffTarget_onlyOption=!0,MAROffTarget_degree=3)}}function getOffTargetOptimalValue(e){const n=e-e*.2;return n>80||n<35?80:n}let possible_F1_primers=[];function checkF1Primers(e){MARF1primers=!1,possible_F1_primers=[];const n="TAATACGACTCACTATAG";let t=!0;e[0]==="G"&&(t=!1);for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(0,i));if(!t)for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(1,i));possible_F1_primers.includes(document.getElementById("f1_input").value.trim())&&(MARF1primers=!0)}let possible_R1_primers=[];const complementary_nt_dict={A:"T",T:"A",C:"G",G:"C"};function checkR1Primers(e){MARR1primers=!1,possible_R1_primers=[];const n="TTCTAGCTCTAAAAC";let t="";for(const i of e)t=complementary_nt_dict[i]+t;for(let i=19;i<=20;i+=1)possible_R1_primers.push(n+t.slice(0,i));possible_R1_primers.includes(document.getElementById("r1_input").value.trim())&&(MARR1primers=!0)}function createComplementarySeq(e){let n="";for(const t of e)n=complementary_nt_dict[t]+n;return n}let studentMark=0,studentMarkPercentage=0;const markTotal=10;function markAnswers(){studentMark=0,checkAnswers_executed||checkAnswers(),checkAnswers_executed&&(MARgRNAseq&&(MARgRNAseq_degree===1?studentMark+=2:MARgRNAseq_degree===2?studentMark+=1:MARgRNAseq_degree===3&&(studentMark+=.5)),MARPAMseq&&(studentMark+=2),MAROffTarget&&(MAROffTarget_degree===1?studentMark+=2:MAROffTarget_degree===2?studentMark+=1:MAROffTarget_degree===3&&(studentMark+=.5)),MARF1primers&&(studentMark+=2),MARR1primers&&(studentMark+=2),studentMarkPercentage=(studentMark/markTotal*100).toFixed(2),studentMarkPercentage>100?studentMarkPercentage=100:studentMarkPercentage<0&&(studentMarkPercentage=0))}function showFeedback(){$("#mainContainer").empty();let e="

You would only receive feedback on your practice attempts and not your final assignments.

";e+="

The assignment itself is marked out of 10 marks with 2 marks for each input excluding gRNA strand direction, cut position and target region range (these three values are used to calculate if you have the right answer or not which means they are still crucial that they are still correct).

",e+="

The following is the breakdown of what marks you would have received and why you would have gotten them:

",e+=`

Mark: ${all_marks[0]}/10 (${all_marks[1]})

`;let n=0,t="Your gRNA sequence was wrong and not found in the Benchling gRNA outputs. Either you made a typo or this answer was not correct and did not contain the target cut site within an acceptable range.";MARgRNAseq&&(MARgRNAseq_degree===1?(n=2,t="This means your answer was correct and you received full marks."):MARgRNAseq_degree===2?(n=1,t="This means your sequence was partially correct as it contains the target sequence within a 20bp range but was not optimal. One mark."):MARgRNAseq_degree===3&&(n=.5,t="This means your sequence was not wrong (therefore was still correct) but there were better options out there. I recommend you try this practice assignment again. Still worth some marks though (half a mark)."));let i=0,r="Your PAM sequence was wrong and not found relative to your gRNA sequence. Either you made a typo or this answer was not correct. Either it contained the cut site within the PAM site or it was not an NGG or NAG PAM site (SciGrade only accepts either of those two PAM sites).";MARPAMseq&&(i=2,r="This means your answer was correct and you received full marks.");let o=0,l="Your off-target score was wrong. Either it was not above/within the optimal range (or above 35) or the last-resort option.";MAROffTarget&&(MAROffTarget_degree===1?(o=2,l="This means your answer was correct while above/within the optimal and you received full marks."):MAROffTarget_degree===2?(o=1,l="This means your answer was technically correct as its on-target value was above 35."):MAROffTarget_degree===3&&(o=.5,l="This means your answer was partially correct as it was found to be your only option is solely based on the target region range you selected."));let u=0,c="";for(let s=0;s For gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${n}.

`,e+=t,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${i}.

`,e+=r,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${o}.

`,e+=l,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${u}.

`,e+=a,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${f}.

`,e+=p,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="

If at any point you wish to dispute marks, please contact your TA or professor once you completed your assignment. If you have found a bug in our SciGrade marking system, please contact your professor or our admin.

",e+="
",e+='

',$("#mainContainer").append(e)}function showNewInput(e,n,t){document.getElementById(String(e)).value===String(n)?document.getElementById(String(t)).removeAttribute("hidden"):document.getElementById(String(t)).setAttribute("hidden",!0)}let completed_assignments=[],all_answers=[],all_outputs=[],all_marks=[];function submitAnswers(){all_answers=[],all_outputs=[],all_marks=[],checkAnswers(),setTimeout(()=>{markAnswers(),all_answers.push(document?.getElementById("sequence_input")?.value?.trim()||"",document.getElementById("pam_input").value.trim(),document.getElementById("position_input").value,document.getElementById("strand_input").value,document.getElementById("offtarget_input").value,document.getElementById("f1_input").value.trim(),document.getElementById("r1_input").value.trim()),all_outputs.push(MARstrand,MARgRNAseq,MARgRNAseq_degree,MARCutPos,MARPAMseq,MAROffTarget,MAROffTarget_degree,MAROffTarget_aboveOpt,MAROffTarget_above35,MAROffTarget_onlyOption,MARF1primers,MARR1primers),all_marks.push(studentMark,studentMarkPercentage),showFeedback()},750)}function IfPressEnter(e,n){(e.which===13||e.keyCode===13)&&$(`#${n}`).click()}function backToAssignments(){redirectCRISPR(),$("#practice").click()}$(()=>{$("form").submit(()=>!1)}),typeof module<"u"&&module.exports&&(module.exports={getOffTargetOptimalValue,isNumberOrDashKey,createComplementarySeq,checkOffTarget,checkF1Primers,checkR1Primers,fillGeneList,get MAROffTarget(){return MAROffTarget},get MAROffTarget_degree(){return MAROffTarget_degree},get MARF1primers(){return MARF1primers},get MARR1primers(){return MARR1primers},__setTestState(e={}){e.correctNucleotideIncluded!==void 0&&(correctNucleotideIncluded=e.correctNucleotideIncluded),e.MARgRNAseq!==void 0&&(MARgRNAseq=e.MARgRNAseq),e.benchling_gRNA_outputs!==void 0&&(benchling_gRNA_outputs=e.benchling_gRNA_outputs),e.current_gene!==void 0&&(current_gene=e.current_gene),e.gene_backgroundInfo!==void 0&&(gene_backgroundInfo=e.gene_backgroundInfo)},__resetState(){MAROffTarget=!1,MAROffTarget_degree=0,MARF1primers=!1,MARR1primers=!1,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,correctNucleotideIncluded=!1,MARgRNAseq=!1}}); + `,e+='
',e+='',e+='',e+='This would be your off-target score for your gRNA. NOTE: This input only takes numbers',e+="
",e+='
',e+='',e+='',e+='This would be your forward primer (F1) for your gRNA',e+="
",e+='
',e+='',e+='',e+='This would be your reverse primer (R1) for your gRNA',e+="
",e+='',e+='',e+="",e+="
",$("#work").append(e)}else(gene_backgroundInfo===""||!gene_backgroundInfo||!backgroundInfo?.[0].gene_list[current_gene])&&alert("Error code lFS50-66 occurred. Please contact admin or TA!")}function isNumberOrDashKey(e){const n=e.which?e.which:e.keyCode;return!(n!==46&&n!==45&&n>31&&(n<48||n>57))}let MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,MARF1primers=!1,MARR1primers=!1,possible_comparable_answers=[],correctNucleotideIncluded=!1,true_counts=0,checkAnswers_executed=!1;function checkAnswers(){MARgRNAseq=!1,MARgRNAseq_degree=0,MARPAMseq=!1,MARCutPos=!1,MARstrand=!1,correctNucleotideIncluded=!1,true_counts=0;const e=gene_backgroundInfo.gene_list[current_gene]["Target position"]-1,n=document?.getElementById("sequence_input")?.value?.trim()||void 0;if(possible_comparable_answers=[],n)for(const t of benchling_gRNA_outputs.gene_list[current_gene])t.Sequence===n&&possible_comparable_answers.push(t);if(possible_comparable_answers.length>0)for(const t of possible_comparable_answers){if(true_counts=0,correctNucleotideIncluded=!1,t.Strand===1){const i=t.Position-1-1+3,r=t.Position-1-17;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}else if(t.Strand===-1){const i=t.Position-1+17,r=t.Position-1-3;e>=r&&e<=i&&(correctNucleotideIncluded=!0)}if(correctNucleotideIncluded){let i,r;if(t.Strand===1?(i=t.Position-1+2,r=t.Position-1+4,document.getElementById("strand_input").value==="Sense (+)"&&(MARstrand=!0,true_counts+=1)):t.Strand===-1&&(i=t.Position-1-2,r=t.Position-1-4,document.getElementById("strand_input").value==="Antisense (-)"&&(MARstrand=!0,true_counts+=1)),e>=i&&e<=r?(MARgRNAseq=!1,MARgRNAseq_degree=0):e>=t.Position-1+1&&e<=t.Position-1+10||e<=t.Position-1-1&&e>=t.Position-1-10?(MARgRNAseq=!0,MARgRNAseq_degree=1,true_counts+=1):e>=t.Position-1&&e<=t.Position-1+20||e<=t.Position-1&&e>=t.Position-1-20?(MARgRNAseq=!0,MARgRNAseq_degree=2,true_counts+=1):(e>=t.Position-1&&e<=t.Position-1+30||e<=t.Position-1&&e>=t.Position-1-30)&&(MARgRNAseq=!0,MARgRNAseq_degree=3,true_counts+=1),MARgRNAseq){const o=t;o.Position&&parseInt(o.Position,10)===parseInt(document.getElementById("position_input").value,10)?(MARCutPos=!0,true_counts+=1):(o.Position===null||o.Position===void 0)&&alert("Error code cA302-307: retrieving server information on 'Position' answers occurred. Please contact admin or TA!"),(o.PAM||o.PAM)&&o.PAM===document.getElementById("pam_input").value.trim()?(MARPAMseq=!0,true_counts+=1):(o.PAM===null||o.PAM===void 0)&&alert("Error code cA311-317: retrieving server information on 'PAM' answers occurred. Please contact admin or TA!"),o["Specificity Score"]||o["Specificity Score"]?checkOffTarget(o["Specificity Score"]):(o["Specificity Score"]===null||o["Specificity Score"]===void 0)&&alert("Error code cA342-348: retrieving server information on 'Specificity Score' answers occurred. Please contact admin or TA!"),checkF1Primers(document?.getElementById("sequence_input")?.value?.trim()||""),checkR1Primers(document?.getElementById("sequence_input")?.value?.trim()||"")}}}checkAnswers_executed=!0}let offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];function checkOffTarget(e){MAROffTarget=!1,MAROffTarget_degree=0,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1;const n=Math.floor(e),t=Math.ceil(e),i=parseInt(document.getElementById("offtarget_input").value,10);if(correctNucleotideIncluded&&MARgRNAseq&&i>=n&&i<=t&&(MAROffTarget=!0,true_counts+=1),MAROffTarget){const r=parseInt(document.getElementById("position_input").value,10)+35,o=parseInt(document.getElementById("position_input").value,10)-35;offtarget_List=[],offtarget_dict={},offtarget_dictParse=[],offtarget_Use=[];for(let a=0;a=o&&benchling_gRNA_outputs.gene_list[current_gene][a].Position<=r&&benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]&&(offtarget_List.push(benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"]),offtarget_dict[a]=benchling_gRNA_outputs.gene_list[current_gene][a]["Specificity Score"],offtarget_dictParse.push(a));let l=!0;Math.max.apply(null,offtarget_List)<35&&(l=!1);const c=Math.max.apply(null,offtarget_List),u=getOffTargetOptimalValue(c);i>=u?(MAROffTarget_aboveOpt=!0,MAROffTarget_above35=!0,MAROffTarget_degree=1):i>=35?(MAROffTarget_above35=!0,Math.max.apply(null,offtarget_List)<80?MAROffTarget_degree=1:MAROffTarget_degree=2):l||(MAROffTarget_onlyOption=!0,MAROffTarget_degree=3)}}function getOffTargetOptimalValue(e){const n=e-e*.2;return n>80||n<35?80:n}let possible_F1_primers=[];function checkF1Primers(e){MARF1primers=!1,possible_F1_primers=[];const n="TAATACGACTCACTATAG";let t=!0;e[0]==="G"&&(t=!1);for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(0,i));if(!t)for(let i=16;i<=20;i+=1)possible_F1_primers.push(n+e.slice(1,i));possible_F1_primers.includes(document.getElementById("f1_input").value.trim())&&(MARF1primers=!0)}let possible_R1_primers=[];const complementary_nt_dict={A:"T",T:"A",C:"G",G:"C"};function checkR1Primers(e){MARR1primers=!1,possible_R1_primers=[];const n="TTCTAGCTCTAAAAC";let t="";for(const i of e)t=complementary_nt_dict[i]+t;for(let i=19;i<=20;i+=1)possible_R1_primers.push(n+t.slice(0,i));possible_R1_primers.includes(document.getElementById("r1_input").value.trim())&&(MARR1primers=!0)}function createComplementarySeq(e){let n="";for(const t of e)n=complementary_nt_dict[t]+n;return n}let studentMark=0,studentMarkPercentage=0;const markTotal=10;function markAnswers(){studentMark=0,checkAnswers_executed||checkAnswers(),checkAnswers_executed&&(MARgRNAseq&&(MARgRNAseq_degree===1?studentMark+=2:MARgRNAseq_degree===2?studentMark+=1:MARgRNAseq_degree===3&&(studentMark+=.5)),MARPAMseq&&(studentMark+=2),MAROffTarget&&(MAROffTarget_degree===1?studentMark+=2:MAROffTarget_degree===2?studentMark+=1:MAROffTarget_degree===3&&(studentMark+=.5)),MARF1primers&&(studentMark+=2),MARR1primers&&(studentMark+=2),studentMarkPercentage=(studentMark/markTotal*100).toFixed(2),studentMarkPercentage>100?studentMarkPercentage=100:studentMarkPercentage<0&&(studentMarkPercentage=0))}function showFeedback(){$("#mainContainer").empty();let e="

You would only receive feedback on your practice attempts and not your final assignments.

";e+="

The assignment itself is marked out of 10 marks with 2 marks for each input excluding gRNA strand direction, cut position and target region range (these three values are used to calculate if you have the right answer or not which means they are still crucial that they are still correct).

",e+="

The following is the breakdown of what marks you would have received and why you would have gotten them:

",e+=`

Mark: ${all_marks[0]}/10 (${all_marks[1]})

`;let n=0,t="Your gRNA sequence was wrong and not found in the Benchling gRNA outputs. Either you made a typo or this answer was not correct and did not contain the target cut site within an acceptable range.";MARgRNAseq&&(MARgRNAseq_degree===1?(n=2,t="This means your answer was correct and you received full marks."):MARgRNAseq_degree===2?(n=1,t="This means your sequence was partially correct as it contains the target sequence within a 20bp range but was not optimal. One mark."):MARgRNAseq_degree===3&&(n=.5,t="This means your sequence was not wrong (therefore was still correct) but there were better options out there. I recommend you try this practice assignment again. Still worth some marks though (half a mark)."));let i=0,r="Your PAM sequence was wrong and not found relative to your gRNA sequence. Either you made a typo or this answer was not correct. Either it contained the cut site within the PAM site or it was not an NGG or NAG PAM site (SciGrade only accepts either of those two PAM sites).";MARPAMseq&&(i=2,r="This means your answer was correct and you received full marks.");let o=0,l="Your off-target score was wrong. Either it was not above/within the optimal range (or above 35) or the last-resort option.";MAROffTarget&&(MAROffTarget_degree===1?(o=2,l="This means your answer was correct while above/within the optimal and you received full marks."):MAROffTarget_degree===2?(o=1,l="This means your answer was technically correct as its on-target value was above 35."):MAROffTarget_degree===3&&(o=.5,l="This means your answer was partially correct as it was found to be your only option is solely based on the target region range you selected."));let c=0,u="";for(let s=0;s For gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${n}.

`,e+=t,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${i}.

`,e+=r,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${o}.

`,e+=l,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${c}.

`,e+=a,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="
",e+="
",e+="",e+="
",e+="
",e+="
",e+="
",e+=`

For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${f}.

`,e+=p,e+="
",e+="
",e+="
",$("#mainContainer").append(e),e="
",e+="

If at any point you wish to dispute marks, please contact your TA or professor once you completed your assignment. If you have found a bug in our SciGrade marking system, please contact your professor or our admin.

",e+="
",e+='

',$("#mainContainer").append(e)}function showNewInput(e,n,t){document.getElementById(String(e)).value===String(n)?document.getElementById(String(t)).removeAttribute("hidden"):document.getElementById(String(t)).setAttribute("hidden",!0)}let completed_assignments=[],all_answers=[],all_outputs=[],all_marks=[];function submitAnswers(){all_answers=[],all_outputs=[],all_marks=[],checkAnswers(),setTimeout(()=>{markAnswers(),all_answers.push(document?.getElementById("sequence_input")?.value?.trim()||"",document.getElementById("pam_input").value.trim(),document.getElementById("position_input").value,document.getElementById("strand_input").value,document.getElementById("offtarget_input").value,document.getElementById("f1_input").value.trim(),document.getElementById("r1_input").value.trim()),all_outputs.push(MARstrand,MARgRNAseq,MARgRNAseq_degree,MARCutPos,MARPAMseq,MAROffTarget,MAROffTarget_degree,MAROffTarget_aboveOpt,MAROffTarget_above35,MAROffTarget_onlyOption,MARF1primers,MARR1primers),all_marks.push(studentMark,studentMarkPercentage),showFeedback()},750)}function IfPressEnter(e,n){(e.which===13||e.keyCode===13)&&$(`#${n}`).click()}function backToAssignments(){redirectCRISPR(),$("#practice").click()}$(()=>{$("form").submit(()=>!1)}),typeof module<"u"&&module.exports&&(module.exports={getOffTargetOptimalValue,isNumberOrDashKey,createComplementarySeq,checkOffTarget,checkF1Primers,checkR1Primers,fillGeneList,get MAROffTarget(){return MAROffTarget},get MAROffTarget_degree(){return MAROffTarget_degree},get MARF1primers(){return MARF1primers},get MARR1primers(){return MARR1primers},__setTestState(e={}){e.correctNucleotideIncluded!==void 0&&(correctNucleotideIncluded=e.correctNucleotideIncluded),e.MARgRNAseq!==void 0&&(MARgRNAseq=e.MARgRNAseq),e.benchling_gRNA_outputs!==void 0&&(benchling_gRNA_outputs=e.benchling_gRNA_outputs),e.current_gene!==void 0&&(current_gene=e.current_gene),e.gene_backgroundInfo!==void 0&&(gene_backgroundInfo=e.gene_backgroundInfo)},__resetState(){MAROffTarget=!1,MAROffTarget_degree=0,MARF1primers=!1,MARR1primers=!1,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,correctNucleotideIncluded=!1,MARgRNAseq=!1}}); diff --git a/tests/playwright/submission.spec.js b/tests/playwright/submission.spec.js index b810326..03048fb 100644 --- a/tests/playwright/submission.spec.js +++ b/tests/playwright/submission.spec.js @@ -53,8 +53,11 @@ test.describe("SciGrade Submission Flow", () => { // Wait for the form to be generated (loadWork appends form inputs into #work) await page.waitForSelector("#sequence_input", { state: "visible" }); - // Wait for form to fully render and be interactive - await page.waitForTimeout(200); + // Wait for form to be fully rendered and interactive: submit button present and enabled + await page.waitForFunction(() => { + const btn = document.getElementById("assignmentSubmitButton"); + return !!btn && !btn.disabled; + }); }); // Data-driven tests using test case table @@ -83,4 +86,56 @@ test.describe("SciGrade Submission Flow", () => { await expect(page.locator("body")).toContainText(/gRNA PAM Sequence/); }); } + + // Test for double submission in the same session + test("should allow submitting twice in the same session", async ({ page }) => { + // First submission + await page.fill("#sequence_input", "AAGCACTGCACGCCGTGGGT"); + await page.selectOption("#strand_input", "Antisense (-)"); + await page.fill("#pam_input", "CAG"); + await page.fill("#position_input", "381"); + await page.fill("#offtarget_input", "87"); + await page.fill("#f1_input", "TAATACGACTCACTATAGAAGCACTGCACGCCGT"); + await page.fill("#r1_input", "TTCTAGCTCTAAAACACCCACGGCGTGCAGTGCT"); + + // Click Submit button + await page.click("#assignmentSubmitButton"); + + // Wait for feedback to render + await expect(page.locator("body")).toContainText(/Mark:/, { timeout: 15000 }); + + // Return to assignments (simulates selecting a new assignment) + await page.click("button:has-text('Back to Assignments')"); + + // Wait for the form to be reset and visible again + await page.waitForSelector("#gene_dropdown_selection"); + + // Select gene again + await page.selectOption("#gene_dropdown_selection", "eBFP"); + await page.getByRole("button", { name: "Load Gene" }).click(); + + // Wait for form to be ready + await page.waitForFunction(() => { + const btn = document.getElementById("assignmentSubmitButton"); + return !!btn && !btn.disabled; + }); + + // Second submission with different values + await page.fill("#sequence_input", "AAAAAAAAAAAAAAAAAAAA"); + await page.selectOption("#strand_input", "Sense (+)"); + await page.fill("#pam_input", "AAA"); + await page.fill("#position_input", "999"); + await page.fill("#offtarget_input", "1"); + await page.fill("#f1_input", "AAAAAAAAAAAAAAAAAAAA"); + await page.fill("#r1_input", "TTTTTTTTTTTTTTTTTTTT"); + + // Click Submit button again + await page.click("#assignmentSubmitButton"); + + // Wait for feedback to render again + await expect(page.locator("body")).toContainText(/Mark:/, { timeout: 15000 }); + + // Verify feedback is displayed correctly + await expect(page.locator("body")).toContainText(/gRNA Strand Sequence/); + }); });