{"version":3,"file":"startExam.909a2b2c.mjs","sources":["../../../../pages/exam/startExam.vue"],"sourcesContent":["<template>\n  <NuxtLayout>\n    <div class=\"exam_page\">\n      <div class=\"exam_header\">\n        <div class=\"header_flex\">\n          <div class=\"exit_exam\" @click=\"submit(true, true)\">退出考试</div>\n          <div class=\"exam_title\">{{ state.info.examName || state.info.paperName }}</div>\n          <div class=\"exam_time_box\">\n            考试剩余：\n            <div class=\"exam_time\">{{ map.examTimeText }}</div>\n            <el-button type=\"primary\" @click=\"submit(true, true)\" class=\"pointer\">交卷</el-button>\n          </div>\n        </div>\n      </div>\n      <div class=\"exam_paper_box\" ref=\"box\">\n        <div class=\"exam_user_paper\">\n          <div class=\"exam_user_item\">\n            <div class=\"exam_user_top\">\n              <el-avatar :size=\"40\" :src=\"userInfo.headImg\"></el-avatar>\n            </div>\n            <div class=\"exam_user_bottom\">{{ userInfo.nickname }}</div>\n          </div>\n          <div class=\"exam_user_item\">\n            <div class=\"exam_user_bottom\"><el-switch v-model=\"ctrl.next\" size=\"default\"></el-switch></div>\n            <div class=\"exam_user_top\">自动下一题</div>\n          </div>\n          <div class=\"exam_user_item\">\n            <div class=\"exam_user_top\">考试总分</div>\n            <div class=\"exam_user_bottom\">{{ map.list.totalScore }}</div>\n          </div>\n          <div v-if=\"state.examType !== 6\" class=\"exam_user_item\">\n            <div class=\"exam_user_top\">合格分数</div>\n            <div class=\"exam_user_bottom\">{{ map.list.passScore }}</div>\n          </div>\n        </div>\n        <div class=\"exam_center\">\n          <div class=\"left\" v-loading=\"ctrl.loading\">\n            <template v-for=\"(t, t1) in map.list.titleList\" :key=\"t1\">\n              <p class=\"paper_name\" v-if=\"map.list.titleList.length > 1\">{{ t.titleName }}</p>\n              <template v-for=\"(p, index2) in t.problemList\" :key=\"index2\">\n                <div :id=\"p.qIndex\" class=\"carousel_item\">\n                  <problem-item\n                    @updateUserAnswer=\"updateUserAnswer\"\n                    :title-id=\"t.id\"\n                    :problem=\"p\"\n                    :record-id=\"map.list.recordId\"\n                    :index=\"p.qIndex\"\n                    :is-analysis=\"false\"\n                    :is-show-confirm=\"ctrl.next\"\n                  ></problem-item>\n                </div>\n              </template>\n            </template>\n          </div>\n        </div>\n        <div class=\"exam_right\">\n          <div class=\"exam_right_title\">答题卡</div>\n          <div class=\"problem\">\n            <div class=\"problem_exam_box\">\n              <div class=\"problem_exam_box_item true\">已答</div>\n              <div class=\"problem_exam_box_item false\">未答</div>\n            </div>\n            <div v-for=\"(t, i) in map.list.titleList\" :key=\"'key1' + i\" class=\"mgb20\">\n              <div class=\"title_type\" :title=\"t.titleName\" v-if=\"map.list.titleList.length > 1\">\n                {{ t.titleName }}\n              </div>\n              <div class=\"card_box\">\n                <span\n                  :class=\"['problem_num', p.userAnswer ? 'active_num' : '']\"\n                  v-for=\"(p, idx) in t.problemList\"\n                  :key=\"'key2' + idx\"\n                  @click=\"jumpProblem(p.qIndex)\"\n                  >{{ p.qIndex + 1 }}</span\n                >\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </NuxtLayout>\n</template>\n\n<script setup>\nimport { useUserStore } from '@/stores/user'\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { defineComponent, ref, toRefs, reactive, onMounted, nextTick } from 'vue'\nimport {\n  startExam,\n  paperRecordContinue,\n  paperFinishExam,\n  collectionUserSave,\n  collectionUserDelete,\n  paperRecordUpdate,\n  paperRecordCheck,\n} from '@/api/paper.js'\nimport problemItem from '@/components/exam/problemItem.vue'\nimport { getStore, setStore } from '@/utils/storage'\nimport { forbidCopy } from '@/utils'\nimport cookie from '@/utils/cookies'\nlet cookieData = cookie.getShop()\nuseHead({\n  title: '考试中-' + cookieData.shopName\n});\nconst route = useRoute()\nconst router = useRouter()\n//router.beforeResolve((to, from, next) => {\n//  if (to.path !== route.path) {\n//    if (!ctrl.save) {\n//      submit(true, true)\n//      next(false)\n//    } else {\n//      next()\n//    }\n//  } else {\n//    state.controlShow = to.query.controlShow === 'true'\n//    state.isExamination = to.query.isExamination === 'true'\n//    state.relevanceType = parseInt(to.query.relevanceType)\n//    state.examType = parseInt(to.query.examType)\n//    state.recordId = to.query.recordId\n//    state.info = JSON.parse(getStore('examInfo'))\n//    next(false)\n//  }\n//})\nconst state = reactive({\n  controlShow: true,\n  info: {},\n  relevanceType: 1,\n  examType: 2,\n  isExamination: false,\n  recordId: '',\n})\nconst store = useUserStore()\nconst box = ref(null)\nconst { getEnumList, userView } = store\nconst map = reactive({\n  index: 0,\n  examTime: 0, //考试时间\n  switchScreenLimit: -1, // 切屏次数，-1为无限次，0为不允许切屏，正整数为允许的切屏次数\n  examTimeText: '',\n  time: null,\n  list: {\n    titleList: [],\n  },\n  checkIfCheat: null,\n})\n\nconst signInfo = reactive({\n  id: '',\n  chapterId: '',\n  periodId: '',\n})\nconst opts = reactive({\n  questionTypeEnums: [],\n})\nconst ctrl = reactive({\n  loading: false,\n  next: true\n})\nconst userInfo = computed(() => {\n  return store.userView\n})\nconst cheat = async () => {\n  if (!document.hasFocus()) {\n    clearInterval(map.checkIfCheat)\n    map.checkIfCheat = null\n    const shengyu = await paperRecordUpdate({\n      id: map.list.recordId,\n    })\n    if (shengyu) {\n      map.switchScreenLimit = shengyu\n      if (shengyu.code) {\n        map.switchScreenLimit = shengyu.data\n      }\n    }\n    if (map.switchScreenLimit < 0) {\n      submit(false)\n    } else {\n      ElMessageBox.confirm(\n        `已离开${map.list.switchScreenLimit - map.switchScreenLimit}次，超过${map.list.switchScreenLimit}次将自动交卷！`,\n        '切屏提示',\n        {\n          cancelButtonText: '知道了',\n          showConfirmButton: false,\n          closeOnClickModal: false,\n          type: 'warning',\n        }\n      )\n        .then(() => {\n          map.checkIfCheat = setInterval(cheat, 500)\n        })\n        .catch(() => {\n          map.checkIfCheat = setInterval(cheat, 500)\n        })\n    }\n  }\n}\nconst initTime = () => {\n  function adds(n) {\n    return n > 9 ? n : '0' + n\n  }\n  const settime = () => {\n    map.examTime--\n    if (map.examTime <= 0) {\n      clearInterval(map.time)\n      submit(false)\n    }\n    if (map.examTime > 3600) {\n      map.examTimeText =\n        adds(parseInt(map.examTime / 3600)) + ':' + adds(parseInt((map.examTime % 3600) / 60)) + ':' + adds(parseInt(map.examTime % 60))\n    } else {\n      map.examTimeText = adds(parseInt(map.examTime / 60)) + ':' + adds(parseInt(map.examTime % 60))\n    }\n  }\n  settime()\n  map.time = setInterval(settime, 1000)\n}\nconst updateUserAnswer = (d) => {\n  map.list.titleList.forEach((e, i1) => {\n    e.problemList.forEach((p, i2) => {\n      if (p.questionId === d.questionId) {\n        p.userAnswer = d.userAnswer\n        if(ctrl.next) {\n          jumpProblem(p.qIndex+1)\n        }\n      }\n    })\n  })\n}\nconst jumpProblem = (index) => {\n  if(document.getElementById(index)) {\n    document.getElementById(index).scrollIntoView()\n  }\n}\nconst submit = async (bool = true, handleSubmit = false) => {\n  if (bool) {\n    let text = '确定交卷吗？'\n    if (handleSubmit) {\n      map.list.titleList.forEach((t) => {\n        t.problemList.forEach((p) => {\n          if (!p.userAnswer) {\n            text = '您还有未答试题，确定交卷吗？'\n          }\n        })\n      })\n    }\n    ElMessageBox.confirm(text, '交卷提示', {\n      cancelButtonText: '取消',\n      confirmButtonText: '确定',\n      type: 'warning',\n      center: true,\n    })\n      .then(() => {\n        paperFinishExam({\n          recordId: map.list.recordId,\n        }).then((r) => {\n          if (r) {\n            ctrl.save = true\n            let obj = JSON.parse(getStore('examInfoAndResult')) || {}\n            Object.assign(obj, r)\n            obj.examName = state.info.examName\n            obj.relationalId = state.info.chapterId ? state.info.courseId : state.info.id\n            setStore('examInfoAndResult', obj)\n            setStore('lastExamQuery', {...route.query, recordId: state.recordId})\n            clearInterval(map.checkIfCheat)\n            clearInterval(map.time)\n            router.replace({\n              path: '/exam/result',\n              query: {\n                type: 1,\n                examType: route.query.examType,\n              },\n            })\n          }\n        })\n      })\n      .catch(() => {})\n  } else {\n    let r = await paperFinishExam({\n      recordId: map.list.recordId,\n    })\n    ElMessageBox.confirm('考试已结束', '提示', {\n      confirmButtonText: '确定',\n      showClose: false,\n      showCancelButton: false,\n      closeOnClickModal: false,\n      type: 'warning',\n      center: true,\n    })\n      .then(() => {\n          if (r) {\n            ctrl.save = true;\n            let obj = JSON.parse(getStore(\"examInfoAndResult\")) || {};\n            Object.assign(obj, r);\n            obj.relationalId = state.info.chapterId\n              ? state.info.courseId\n              : state.info.id;\n            setStore(\"examInfoAndResult\", obj);\n            setStore(\"lastExamQuery\", {...route.query, recordId: state.recordId});\n            clearInterval(map.checkIfCheat);\n            clearInterval(map.time);\n            router.replace({\n              path: '/exam/result',\n              query: {\n                type: 1,\n                examType: route.query.examType,\n              },\n            })\n          }\n        })\n\n  }\n}\n\nconst paperStartExam = (d) => {\n  startExam(d).then(async (r1) => {\n    state.recordId = r1.recordId\n    map.list = r1\n    map.examTime = map.list.answerTime * 60\n    map.switchScreenLimit = map.list.switchScreenLimit\n    state.info.examName = r1.examName\n    let obj = JSON.parse(getStore('examInfoAndResult') || '{}')\n    if (obj) {\n      map.list.switchScreenLimit = JSON.parse(JSON.stringify(obj.maxSwitchScreenLimit))\n      map.list.passScore = obj.passScore\n    }\n    if (map.list.switchScreenLimit > -1) {\n      ElMessageBox.confirm(\n        `本场考试已开启防作弊机制，${\n          map.list.switchScreenLimit > 0 ? `切屏页面${map.list.switchScreenLimit}次后将自动交卷` : '切屏后自动交卷'\n        }，答题过程中请勿切屏及刷新页面！`,\n        '温馨提示',\n        {\n          cancelButtonText: '知道了',\n          showConfirmButton: false,\n          showClose: false,\n          type: 'warning',\n          center: true,\n        }\n      )\n    }\n    let sequenceIndex = 0\n    map.list.titleList.forEach((t, i1) => {\n      t.problemList.forEach((p, i2) => {\n        const lastIndex = p.questionTitle.lastIndexOf('</p>')\n        if(lastIndex > -1) {\n          p.questionTitle = p.questionTitle.slice(0, lastIndex) + '（' + p.questionScore + '分）' + p.questionTitle.slice(lastIndex)\n        } else {\n          p.questionTitle = p.questionTitle + '（' + p.questionScore + '分）'\n        }\n        p.qIndex = sequenceIndex++\n        if (i1 === 0 && i2 === 0) {\n          p.isNow = true\n        }\n        if (p.questionType === 3) {\n          p.optionList = []\n          p.optionList.push(\n            {\n              id: '对',\n              optionContent: '对',\n            },\n            {\n              id: '错',\n              optionContent: '错',\n            }\n          )\n        }\n      })\n    })\n    if (map.list.switchScreenLimit >= 0) {\n      map.checkIfCheat = setInterval(cheat, 500)\n    }\n    initTime()\n    nextTick(() => {\n      forbidCopy('.exam_center')\n    })\n    ctrl.loading = false\n  })\n}\n\nconst recordContinue = () => {\n  paperRecordContinue({\n    id: state.recordId,\n  }).then((r2) => {\n    map.list = r2\n    state.info.examName = r2.examName\n    map.examTime = map.list.surplusTime\n    map.switchScreenLimit = map.list.switchScreenLimit\n    let obj = JSON.parse(getStore('examInfoAndResult'))\n    map.list.passScore = obj && obj.passScore\n    if (map.list.switchScreenLimit > -1) {\n      ElMessageBox.confirm(\n        `本场考试已开启防作弊机制，${\n          map.list.switchScreenLimit > 0 ? `切屏页面${map.list.switchScreenLimit}次后将自动交卷` : '切屏后自动交卷'\n        }，答题过程中请勿切屏及刷新页面！`,\n        '温馨提示',\n        {\n          cancelButtonText: '知道了',\n          showConfirmButton: false,\n          showClose: false,\n          type: 'warning',\n          center: true,\n        }\n      )\n    }\n    let sequenceIndex = 0\n    let isJump = false\n    map.list.titleList.forEach((t, i1) => {\n      t.problemList.forEach((p, i2) => {\n        const lastIndex = p.questionTitle.lastIndexOf('</p>')\n        if(lastIndex > -1) {\n          p.questionTitle = p.questionTitle.slice(0, lastIndex) + '（' + p.questionScore + '分）' + p.questionTitle.slice(lastIndex)\n        } else {\n          p.questionTitle = p.questionTitle + '（' + p.questionScore + '分）'\n        }\n        p.qIndex = sequenceIndex++\n        if(!p.userAnswer && !isJump) {\n          isJump = true\n          p.isJump = true\n        }\n        if (i1 === 0 && i2 === 0) {\n          p.isNow = true\n        }\n        if (p.questionType === 3) {\n          p.optionList = []\n          p.optionList.push(\n            {\n              id: '对',\n              optionContent: '对',\n            },\n            {\n              id: '错',\n              optionContent: '错',\n            }\n          )\n        }\n        nextTick(() => {\n          if(p.isJump && p.qIndex > 0) {\n            document.getElementById(p.qIndex).scrollIntoView()\n          }\n        })\n      })\n    })\n    if (map.list.switchScreenLimit >= 0) {\n      map.checkIfCheat = setInterval(cheat, 500)\n    }\n    initTime()\n    nextTick(() => {\n      forbidCopy('.exam_center')\n    })\n    ctrl.loading = false\n  })\n}\n\nonMounted(async () => {\n  state.controlShow = route.query.controlShow === 'true'\n  state.relevanceType = parseInt(route.query.relevanceType)\n  state.examType = parseInt(route.query.examType)\n  // 判断是否处于考试状态中，考试中选择让用户继续考试，否则正常开始考试\n  const checkHasExam = await paperRecordCheck()\n  state.recordId = checkHasExam.recordId\n  state.isExamination = checkHasExam.isExamination\n  state.info = JSON.parse(getStore('examInfo') || '{}')\n\n  const d = {\n    examType: state.examType, //1:普通考试、2:课程考试、3:班级作业\n    relevanceType: state.relevanceType, //1:课程关联、2:专题关联\n    paperId: route.query.paperId || state.info.paperId,\n    relationalId: route.query.relationalId || state.info.id, //关联试卷的资源id\n    resultsRecordType: state.info.scoreRecordRule, //考试记录类型：1最新 2最高成绩\n  }\n  if (state.info.chapterId) {\n    // 专题课\n    d.chapterId = state.info.chapterId\n    d.periodId = state.info.id\n    d.relationalId = state.info.courseId // 关联id是专题课id\n    d.courseId = state.info.resourceId // 当前单课id\n  }\n  if (state.controlShow) {\n    ctrl.loading = true\n    getEnumList('QuestionTypeEnum', 'obj').then((res) => {\n      opts.questionTypeEnums = res\n    })\n\n    if (state.isExamination) {\n      ElMessageBox.confirm(\n        `您有未考完的试卷，请继续考试`,\n        '考试提示',\n        {\n          showClose: false,\n          showCancelButton: false,\n          closeOnClickModal: false,\n          type: 'warning',\n        }\n      )\n        .then(() => {\n          recordContinue()\n        })\n        .catch(() => {\n        })\n    } else {\n      paperStartExam(d)\n    }\n  }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.exam_page {\n  position: fixed;\n  width: 100vw;\n  height: 100vh;\n  left: 0;\n  top: 0;\n  background: #f6f8fb;\n  z-index: 1001;\n}\n.close_exam {\n  position: absolute;\n  right: 30px;\n  top: 30px;\n}\n.exam_center {\n  width: 1058px;\n  margin-left: 146px;\n  .left {\n    position: relative;\n    background: #ffffff;\n    .paper_name {\n      padding: 16px 30px;\n      border-bottom: 1px solid #ebeef5;\n      font-size: 20px;\n      color: #333333;\n      &:not(:first-child) {\n        border-top: 16px solid #f6f8fb;\n      }\n    }\n    .carousel_item {\n      padding: 30px 44px;\n      display: flex;\n      div:first-child {\n        width: 100%;\n      }\n      .collect_item {\n        min-width: 80px;\n        height: 24px;\n        display: flex;\n        align-items: center;\n        padding-top: 5px;\n      }\n    }\n  }\n}\n.exam_header {\n  width: 100%;\n  height: 54px;\n  border-bottom: 1px solid #ebeef5;\n  .header_flex {\n    width: 1480px;\n    height: 100%;\n    margin: auto;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n  }\n  background-color: #ffffff;\n  .exit_exam {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 14px;\n    color: #333333;\n    cursor: pointer;\n  }\n  .exam_title {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-style: normal;\n    font-weight: 400;\n    font-size: 18px;\n    color: #333333;\n  }\n  .exam_time_box {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 14px;\n    display: flex;\n    align-items: center;\n  }\n  .el-button {\n    width: 100px;\n    height: 32px;\n    border-radius: 4px;\n    margin-left: 24px;\n  }\n  .exam_time {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 20px;\n    color: #f23c3c;\n  }\n}\n.exam_paper_box {\n  width: calc(100%);\n  max-width: 1480px;\n  padding-top: 16px;\n  max-height: 90vh;\n  overflow: auto;\n  margin: auto;\n  &::-webkit-scrollbar {\n    display: none;\n  }\n}\n.exam_right {\n  width: 260px;\n  background-color: #ffffff;\n  position: fixed;\n  top: 72px;\n  right: calc((100% - 1480px) / 2);\n  .exam_right_title {\n    margin-top: 21px;\n    height: 54px;\n    width: 100%;\n    padding: 18px 27px;\n    border-bottom: 1px solid #ebeef5;\n  }\n  .problem {\n    padding: 20px 16px;\n    max-height: calc(100vh - 172px);\n    overflow: auto;\n    padding-right: 11px;\n  }\n  .problem_exam_box {\n    width: 100%;\n    display: flex;\n    align-items: center;\n    margin-bottom: 18px;\n  }\n  .problem_exam_box_item {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 12px;\n    color: #333333;\n    padding-left: 23px;\n    position: relative;\n    display: flex;\n    align-items: center;\n    margin-right: 13px;\n  }\n  .problem_exam_box_item:before {\n    content: '';\n    width: 16px;\n    height: 16px;\n    background: #ffffff;\n    border: 1px solid #d9d9d9;\n    border-radius: 1.6px;\n    left: 0;\n    position: absolute;\n  }\n  .problem_exam_box_item.true:before {\n    background: rgba(61, 127, 255, 0.1);\n    border-radius: 1.6px;\n    width: 16px;\n    height: 16px;\n    border: 1px solid rgba(61, 127, 255, 0.4);\n  }\n  //.problem_exam_box_item.collect:after {\n  //  content: '';\n  //  width: 0;\n  //  height: 0;\n  //  border-top: 10px solid #fac923;\n  //  border-right: 10px solid transparent;\n  //  position: absolute;\n  //  left: 0;\n  //  top: 3px;\n  //}\n  .title_type {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 13px;\n    color: #333333;\n    margin-top: 20px;\n    margin-bottom: 14px;\n  }\n  .card_box {\n    .problem_num {\n      display: inline-block;\n      margin-right: 12px;\n      margin-bottom: 12px;\n      width: 28px;\n      height: 28px;\n      color: #333333;\n      border: 1px solid #d9d9d9;\n      text-align: center;\n      line-height: 28px;\n      border-radius: 2px;\n      font-style: normal;\n      font-weight: 400;\n      font-size: 14px;\n      cursor: pointer;\n      &:nth-child(6n) {\n        margin-right: 0;\n      }\n    }\n    .collect_num {\n      position: relative;\n      //&:after {\n      //  content: '';\n      //  width: 0;\n      //  height: 0;\n      //  border-top: 10px solid #fac923;\n      //  border-right: 10px solid transparent;\n      //  position: absolute;\n      //  left: -1px;\n      //  top: -1px;\n      //}\n    }\n    .active_num {\n      border: 1px solid rgba(61, 127, 255, 0.4);\n      background: rgba(61, 127, 255, 0.1);\n      color: #3d7fff;\n    }\n    .now_num {\n      border: 1px solid #3d7fff;\n      background: #3d7fff;\n      color: #ffffff;\n    }\n  }\n}\n\n.exam_user_paper {\n  background-color: #ffffff;\n  width: 130px;\n  position: fixed;\n  left: calc((100% - 1480px) / 2);\n  top: 72px;\n  .exam_user_item {\n    width: 100%;\n    height: calc(100% / 3);\n    border-bottom: 1px solid #ebeef5;\n    padding: 16px 10px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-direction: column;\n  }\n  .exam_user_bottom {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 16px;\n    color: #333333;\n    margin-top: 6px;\n  }\n}\n</style>\n"],"names":["cookieData","cookie","getShop","useHead","title","shopName","route","useRoute","router","useRouter","state","reactive","controlShow","info","relevanceType","examType","isExamination","recordId","store","useUserStore","box","ref","getEnumList","userView","map","index","examTime","switchScreenLimit","examTimeText","time","list","titleList","checkIfCheat","id","chapterId","periodId","opts","questionTypeEnums","ctrl","loading","next","userInfo","computed","cheat","async","document","hasFocus","clearInterval","shengyu","paperRecordUpdate","code","data","submit","ElMessageBox","confirm","cancelButtonText","showConfirmButton","closeOnClickModal","type","then","setInterval","catch","initTime","adds","n","settime","parseInt","updateUserAnswer","d","forEach","e","i1","problemList","p","i2","questionId","userAnswer","jumpProblem","qIndex","getElementById","scrollIntoView","bool","handleSubmit","text","t","confirmButtonText","center","paperFinishExam","r","save","obj","JSON","parse","getStore","Object","assign","examName","relationalId","courseId","setStore","query","replace","path","showClose","showCancelButton","onMounted","checkHasExam","paperRecordCheck","paperId","resultsRecordType","scoreRecordRule","resourceId","res","paperRecordContinue","r2","surplusTime","passScore","sequenceIndex","isJump","lastIndex","questionTitle","lastIndexOf","slice","questionScore","isNow","questionType","optionList","push","optionContent","nextTick","forbidCopy","startExam","r1","answerTime","stringify","maxSwitchScreenLimit","paperStartExam"],"mappings":"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"}