From 964f7f25636114e2289cfd80a932718e6db96d74 Mon Sep 17 00:00:00 2001 From: dinesh Date: Sat, 13 Jun 2020 04:42:54 -0700 Subject: [PATCH] Validations --- qp-template-master/package-lock.json | 5 + qp-template-master/package.json | 1 + qp-template-master/src/App.css | 10 + qp-template-master/src/App.js | 28 +- qp-template-master/src/copy.js | 703 +++++++++++++++++++++++++++ qp-template-master/src/parta.js | 29 +- qp-template-master/src/partb.js | 25 +- qp-template-master/src/partc.js | 445 +++++++++-------- qp-template-master/src/subdivide.png | Bin 0 -> 17308 bytes 9 files changed, 1008 insertions(+), 238 deletions(-) create mode 100644 qp-template-master/src/copy.js create mode 100644 qp-template-master/src/subdivide.png diff --git a/qp-template-master/package-lock.json b/qp-template-master/package-lock.json index f6f152b..5b1b115 100644 --- a/qp-template-master/package-lock.json +++ b/qp-template-master/package-lock.json @@ -7885,6 +7885,11 @@ } } }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", diff --git a/qp-template-master/package.json b/qp-template-master/package.json index 1e3d8da..700763e 100644 --- a/qp-template-master/package.json +++ b/qp-template-master/package.json @@ -11,6 +11,7 @@ "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", "bootstrap": "^4.5.0", + "font-awesome": "^4.7.0", "katex": "^0.11.1", "popups": "^1.1.3", "react": "^16.13.1", diff --git a/qp-template-master/src/App.css b/qp-template-master/src/App.css index e395509..dbcdb6a 100644 --- a/qp-template-master/src/App.css +++ b/qp-template-master/src/App.css @@ -6,6 +6,16 @@ border-color: white; } + .preview{ + padding-left: 30px; + } + + .button{ + background-color: violet; + } + + + .row-align{ justify-content: center; } diff --git a/qp-template-master/src/App.js b/qp-template-master/src/App.js index 12474e3..2f44e13 100644 --- a/qp-template-master/src/App.js +++ b/qp-template-master/src/App.js @@ -11,15 +11,17 @@ class template extends Component { super(); this.state={ date:'', + rollno:'', subject:'', semester:'', course:'', regulation:'', time:'', marks:'', - touched:[ + touched: { date:false, + rollno:false, subject:false, semester:false, course:false, @@ -27,15 +29,16 @@ class template extends Component { time:false, marks:false, } - ] + } this.handleBlur=this.handleBlur.bind(this) } - validate(date,subject,semester,course,regulation,time,marks){ + validate(date,rollno,subject,semester,course,regulation,time,marks){ const errors={ date:'', + rollno:'', subject:'', semester:'', course:'', @@ -47,6 +50,9 @@ class template extends Component { if(this.state.touched.date&&date=='') errors.date="Date should not be empty"; + if(this.state.touched.rollno&&rollno=='') + errors.rollno="Rollno should not be empty"; + if(this.state.touched.subject&&subject=='') errors.subject="Subject should not be empty"; @@ -84,21 +90,29 @@ class template extends Component { render(){ - const errors=this.validate(this.state.date,this.state.subject,this.state.semester,this.state.course,this.state.regulation,this.state.time,this.state.marks) + const errors=this.validate(this.state.date,this.state.rollno,this.state.subject,this.state.semester,this.state.course,this.state.regulation,this.state.time,this.state.marks) return(
- - + + {errors.date} + + + {errors.rollno} + diff --git a/qp-template-master/src/copy.js b/qp-template-master/src/copy.js new file mode 100644 index 0000000..7aadaa7 --- /dev/null +++ b/qp-template-master/src/copy.js @@ -0,0 +1,703 @@ +Gmail Dinesh Kumar +Re: Webex meeting invitation: Qp-Template-Demo +kishor kumar Fri, Jun 12, 2020 at 12:08 PM +To: dkdinesh6688@gmail.com +import React, { Component } from "react"; +import {Row,Col,Input, Label, Button, FormFeedback} from 'reactstrap' +import Math from './math' +import { confirmAlert } from 'react-confirm-alert'; +import 'react-confirm-alert/src/react-confirm-alert.css'; // Import css +import './App.css'; +import 'katex/dist/katex.min.css'; +import { PDFViewer,Page, Text, View, Document, StyleSheet } from "@react-pdf/renderer"; +import Popup from 'reactjs-popup'; +import Mydoc from './mydoc.js'; +import Scroll from 'react-scroll'; +import { PDFExport } from "@progress/kendo-react-pdf"; + +var qpaMark=0 +var qpbMark=0 +var qpcMark=0 + +class Partc extends Component { + + constructor(props){ + super(props); + + this.state={ + subload:false, + noMatch:false, + noMatchA:false, + noMatchB:false, + noMatchC:false, + total:'', + touched:[ + { + total:false + } + ], + open:false, + sub:["a","b","c","d"], + qp: + [ + { + + question:"", + mark:"", + touched:{ + question:false, + mark:false, + }, + file: '', + imagePreviewUrl: '', + errors:{ + question :"error", + mark:"error" + }, + subqp: + [ + + ] + } + ] + + } + this.handleBlur=this.handleBlur.bind(this) + this._handleImageChange = this._handleImageChange.bind(this); + this._handleImageSubChange = this._handleImageSubChange.bind(this); + this._handleSubmit = this._handleSubmit.bind(this); + } + + handleBlurTotal=(field)=>(evt)=>{ + this.setState({ + touched:{...this.state.touched,[field]:true} + }) + } + + _handleSubmit(e) { + e.preventDefault(); + // TODO: do something with -> this.state.file + } + + _handleImageChange(e,index) { + e.preventDefault(); + + let reader = new FileReader(); + let file = e.target.files[0]; + + reader.onloadend = () => { + const list = [...this.state.qp]; + list[index].file =file; + list[index].imagePreviewUrl=reader.result; + this.setState({ + qp:list + }); + } + if(file) + reader.readAsDataURL(file) + } + _handleImageSubChange(e,id,index) { + e.preventDefault(); + + let reader = new FileReader(); + let file = e.target.files[0]; + + reader.onloadend = () => { + this.state.qp[id].subqp[index].file=file; + this.state.qp[id].subqp[index].imagePreviewUrl=reader.result; + this.setState( + this.state.qp[id].subqp[index] + ); + } + if(file) + reader.readAsDataURL(file) + } + submit = (e,id) => { + e.preventDefault(); + confirmAlert({ + customUI: ({ onClose }) => { + return ( +
+

Are you sure?

+

You want to delete this Question + ?

+ +
+ +
+
+ ); + } + }); + }; + + submitsub (e,id,subid) { + e.preventDefault(); + confirmAlert({ + customUI: ({ onClose }) => { + return ( +
+

Are you sure?

+

You want to delete this Question + ?

+ +
+ +
+
+ ); + } + }); + }; + + + handletotal=e=>{ + const {value} = e.target; + this.setState({total:value}) + } + + validate(total){ + const errors={ + total:'', + } + + if(this.state.touched.total&&total=='') + errors.total="Total should not be empty"; + + return errors; + } + validateQp(question,mark,id){ + if(this.state.qp[id].touched.question&&question=='') + this.state.qp[id].errors.question="Question should not be empty"; + if(this.state.qp[id].touched.mark&&mark=='') + this.state.qp[id].errors.mark="Mark should not be empty"; + + } + validateSubQp(question,mark,id,subid){ + if(this.state.qp[id].subqp[subid].touched.question&&question=='') + this.state.qp[id].subqp[subid].errors.question="Question should not be empty"; + if(this.state.qp[id].subqp[subid].touched.mark&&mark=='') + this.state.qp[id].subqp[subid].errors.mark="Mark should not be empty"; + } + exportPDFWithComponent = () => { + this.pdfExportComponent.save(); +}; + + openModal=(event) =>{ + event.preventDefault(); + this.setState({ open: true }); + } + + closeModal=(event)=> { + + this.setState({ open: false }); + } + + + // handle input change + handleInputChange = (e, index) => { + const { name, value } = e.target; + const list = [...this.state.qp]; + list[index][name] = value; + if(name=="question"&&list[index][name]!='') + { + list[index].errors.question='error'; + this.setState({qp:list}) + } + if(name=="mark"&&list[index][name]!='') + { + list[index].errors.mark='error'; + this.setState({qp:list}) + } + this.setState({qp:list}) + }; + + handleInputsubChange = (e, index,subid) => { + const { name, value } = e.target; + this.state.qp[index].subqp[subid][name] = value; + if(name=="question"&&this.state.qp[index].subqp[subid].question!=''){ + this.state.qp[index].subqp[subid].errors.question='error' + this.setState(this.state.qp[index].subqp[subid]) + } + if(name=="mark"&&this.state.qp[index].subqp[subid].mark!=""){ + this.state.qp[index].subqp[subid].errors.mark='error' + this.setState(this.state.qp[index].subqp[subid]) + } + this.setState(this.state.qp[index].subqp[subid]) + + }; + + // handle click event of the Remove button + handleRemoveClick = index => { + const list = [...this.state.qp]; + list.splice(index, 1); + this.setState({qp:list}) + }; + + handleRemovesubClick = (index,subid) => { + this.state.qp[index].subqp.splice(subid, 1); + this.setState(this.state.qp[index].subqp) + }; + + // handle click event of the Add button + handleAddClick = (id) => { + this.setState((prevState)=>({ + qp:[...prevState.qp,{question:"",mark:"",subqp:[],touched:{ + question:false, + mark:false, + }, + file: '', + imagePreviewUrl: '', + errors:{ + question :"error", + mark:"error" + }}] + })) + }; + + handleSubClick = index => { + this.state.qp[index].subqp.push({question:"",mark:"",file: '', + imagePreviewUrl: '',touched:{ + question:false, + mark:false, + }, + errors:{ + question :"error", + mark:"error" + }}) + this.setState({subload:true}) + }; + + onClick = (e) => { + e.preventDefault(); + var qpa=''+qpaMark + var tota=''+(this.props.sab.total) + var qpb=''+qpbMark + var totb=''+(this.props.sb.total) + var qpc=''+qpcMark + var totc=''+(this.state.total) + var tot=''+this.props.header.marks + // console.log(tot) + var total=parseInt(this.props.sab.total)+parseInt(this.props.sb.total)+parseInt(this.state.total) + //console.log(total) + var total_abc=''+total + // console.log(typeof(total_abc)) + if(qpa!=tota){ + this.state.noMatchA=true + } + if(qpa==tota){ + this.state.noMatchA=false + } + if(qpb!=totb){ + this.state.noMatchB=true + } + if(qpb==totb){ + this.state.noMatchB=false + } + if(qpc!=totc){ + this.state.noMatchC=true + } + if(qpc==totc){ + this.state.noMatchC=false + } + if(tot!=total_abc){ + this.state.noMatch=true + console.log(this.state.noMatch) + } + if(tot==total_abc){ + this.state.noMatch=false + console.log(this.state.noMatch) + } + if(this.state.noMatch){ + alert("Total is not equal") + } + else if(this.state.noMatchA){ + alert("Total is not equal in Part-A") + } + else if(this.state.noMatchB){ + alert("Total is not equal in Part-B") + } + else if(this.state.noMatchC){ + alert("Total is not equal in Part-C") + } + if(this.state.noMatchA||this.state.noMatchB||this.state.noMatchC||this.state.noMatch){ + this.setState({open:false}) + } + else{ + this.setState({open:true}) + } + //this.setState({open:true}) +} + +handleBlur=(field,id)=>(evt)=>{ + const list = [...this.state.qp]; + list[id].touched[field] = true; + this.setState({qp:list}) +} + +handleBlurSubQp=(field,index,subid)=>(evt)=>{ + console.log(this.state.qp[index].subqp[subid].touched[field]) + this.state.qp[index].subqp[subid].touched[field]=true; + this.setState(this.state.qp[index].subqp[subid]) + } + + handlecheck(){ + var qpamark=0; + var qpasubmark=0; + var qpbmark=0; + var qpbsubmark=0; + var qpcmark=0; + var qpcsubmark=0; + this.props.sab.qp.map((x,id)=>{ + qpamark=qpamark+parseInt(x.mark) + this.props.sab.qp[id].subqp.map((xb,id)=>{ + qpasubmark=qpasubmark+parseInt(xb.mark) + }) + }) + qpaMark=qpamark+qpasubmark + // console.log(qpaMark) + + this.props.sb.qp.map((x,id)=>{ + qpbmark=qpbmark+parseInt(x.mark) + this.props.sb.qp[id].subqp.map((xb,id)=>{ + qpbsubmark=qpbsubmark+parseInt(xb.mark) + }) + }) + qpbMark=qpbmark+qpbsubmark + //console.log(qpbMark) + + this.state.qp.map((x,id)=>{ + qpcmark=qpcmark+parseInt(x.mark) + this.state.qp[id].subqp.map((xb,id)=>{ + qpcsubmark=qpcsubmark+parseInt(xb.mark) + }) + }) + qpcMark=qpcmark+qpcsubmark + // console.log(qpcMark) + } + + + + render(){ + const errors=this.validate(this.state.total) + return ( +
+ + + + + + { } + + + + {errors.total} + + + + { + this.state.qp.map((x,id) => { + return ( +
+ {this.validateQp(x.question,x.mark,id)} + + + {this.state.qp.length !== 1 && x.subqp.length<1 &&} + + + + + {this.state.qp[id].subqp.length!==0? + :} + + + + this.handleInputChange(e, id)}/> + + {x.errors.question} + + + + this.handleInputChange(e, id)}/> + {x.errors.mark} + + + {} + + +
{this.state.qp[id].subqp.map((xb,subid)=>
+ {this.validateSubQp(xb.question,xb.mark,id,subid)} + + + {} + + + + + + this.handleInputsubChange(e, id, subid)}/> + {xb.errors.question} + + + + + this.handleInputsubChange(e, id,subid)}/> + {xb.errors.mark} + + + {} + +
)}
+
+ ); + } + )} +
+ {this.handlecheck()} +
+ + + + + + +
+ + × + + (this.pdfExportComponent = component)} + paperSize="a4" + margin={40} + fileName={`Report for ${new Date().getFullYear()}`} + author="KendoReact Team" + + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + this.props.sab.qp.map((x,id) => { + return( +
+ + + {this.props.sab.qp[id].subqp.length!==0? + :} + + + + + + + + + + + + + + {this.props.sab.qp[id].subqp.map((xb,subid)=>{ + return( + + + + + + + + + + + + + + ); + })} + +
+ ); + }) + } +
+
+ + + + + { + this.props.sb.qp.map((x,id) => { + return( +
+ + + {this.props.sb.qp[id].subqp.length!==0? + :} + + + + + + + + + + + + + {this.props.sb.qp[id].subqp.map((xb,subid)=>{ + return( + + + + + + + + + + + + + + ); + })} + +
+ ); + }) + } +
+
+ + + + + + { + this.state.qp.map((x,id) => { + return( +
+ + + {this.state.qp[id].subqp.length!==0? + :} + + + + + + + + + + + + + {this.state.qp[id].subqp.map((xb,subid)=>{ + return( + + + + + + + + + + + + + + ); + })} + +
+ ); + }) + } +
+
+
+ +
+ + +
+ +
+ +
+ ); + }} + +export default Partc; + diff --git a/qp-template-master/src/parta.js b/qp-template-master/src/parta.js index ac0335e..2713d4b 100644 --- a/qp-template-master/src/parta.js +++ b/qp-template-master/src/parta.js @@ -6,6 +6,8 @@ import Partb from './partb' import Popup from 'reactjs-popup'; import Math from './math' import 'katex/dist/katex.min.css'; +import '../node_modules/font-awesome/css/font-awesome.min.css' +import subdivide from './subdivide.png' @@ -284,9 +286,9 @@ class Parta extends Component { - { } + { } - + - {this.state.qp.length !== 1 && x.subqp.length<1 &&} + {this.state.qp.length !== 1 && x.subqp.length<1 &&} @@ -315,10 +317,11 @@ class Parta extends Component { this.handleInputChange(e, id)}/> - - {x.errors.question} - + {x.errors.question}
+ + + {x.errors.mark} - {} + {}
{this.state.qp[id].subqp.map((xb,subid)=>
@@ -335,7 +338,7 @@ class Parta extends Component { - {} + {} @@ -344,10 +347,10 @@ class Parta extends Component { this.handleInputsubChange(e, id, subid)}/> - {xb.errors.question} + {xb.errors.question}
- + this._handleImageSubChange(e,id,subid)} /> + {xb.errors.mark} - {} + {}
)}
diff --git a/qp-template-master/src/partb.js b/qp-template-master/src/partb.js index 2b83f50..00e62d2 100644 --- a/qp-template-master/src/partb.js +++ b/qp-template-master/src/partb.js @@ -5,6 +5,7 @@ import { confirmAlert } from 'react-confirm-alert'; import 'react-confirm-alert/src/react-confirm-alert.css'; // Import css import Math from './math' import 'katex/dist/katex.min.css'; +import subdivide from './subdivide.png' class Partb extends Component { constructor(){ @@ -267,9 +268,9 @@ class Partb extends Component { - { } + { } - + - {this.state.qp.length !== 1 && x.subqp.length<1 &&} + {this.state.qp.length !== 1 && x.subqp.length<1 &&} @@ -298,10 +299,10 @@ class Partb extends Component { this.handleInputChange(e, id)}/> + {x.errors.question}
- {x.errors.question} - + this._handleImageChange(e,id)} /> + {x.errors.mark} - {} + {}
{this.state.qp[id].subqp.map((xb,subid)=>
{this.validateSubQp(xb.question,xb.mark,id,subid)} - {} + {} @@ -326,10 +327,10 @@ class Partb extends Component { this.handleInputsubChange(e, id, subid)}/> - {xb.errors.question} + {xb.errors.question}
- + this._handleImageSubChange(e,id,subid)} /> + {xb.errors.mark} - {} + {}
)}
diff --git a/qp-template-master/src/partc.js b/qp-template-master/src/partc.js index 6f850a2..d586412 100644 --- a/qp-template-master/src/partc.js +++ b/qp-template-master/src/partc.js @@ -10,6 +10,7 @@ import Popup from 'reactjs-popup'; import Mydoc from './mydoc.js'; import Scroll from 'react-scroll'; import { PDFExport } from "@progress/kendo-react-pdf"; +import subdivide from './subdivide.png' var qpaMark=0 var qpbMark=0 @@ -22,6 +23,7 @@ class Partc extends Component { this.state={ subload:false, + field:false, noMatch:false, noMatchA:false, noMatchB:false, @@ -316,9 +318,12 @@ class Partc extends Component { } if(tot==total_abc){ this.state.noMatch=false - console.log(this.state.noMatch) + //console.log(this.state.noMatch) } - if(this.state.noMatch){ + if(this.state.field){ + alert("Some Field is not typed") + } + else if(this.state.noMatch){ alert("Total is not equal") } else if(this.state.noMatchA){ @@ -358,10 +363,35 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{ var qpbsubmark=0; var qpcmark=0; var qpcsubmark=0; + + var head=this.props.header.touched + + if(head.date==false||head.rollno==false||head.subject==false||head.semester==false|| + head.course==false||head.regulation==false||head.time==false||head.marks==false){ + this.state.field=true + } + else{ + this.state.field=false + } + this.props.sab.qp.map((x,id)=>{ qpamark=qpamark+parseInt(x.mark) + if(x.touched.question==false||x.touched.mark==false){ + this.state.field=true + // console.log(this.state.field) + } + else{ + this.state.field=false + // console.log(this.state.field) + } this.props.sab.qp[id].subqp.map((xb,id)=>{ qpasubmark=qpasubmark+parseInt(xb.mark) + if(xb.touched.question==false||xb.touched.mark==false){ + this.state.field=true + } + else{ + this.state.field=false + } }) }) qpaMark=qpamark+qpasubmark @@ -369,8 +399,20 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{ this.props.sb.qp.map((x,id)=>{ qpbmark=qpbmark+parseInt(x.mark) + if(x.touched.question==false||x.touched.mark==false){ + this.state.field=true + } + else{ + this.state.field=false + } this.props.sb.qp[id].subqp.map((xb,id)=>{ qpbsubmark=qpbsubmark+parseInt(xb.mark) + if(xb.touched.question==false||xb.touched.mark==false){ + this.state.field=true + } + else{ + this.state.field=false + } }) }) qpbMark=qpbmark+qpbsubmark @@ -378,8 +420,20 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{ this.state.qp.map((x,id)=>{ qpcmark=qpcmark+parseInt(x.mark) + if(x.touched.question==false||x.touched.mark==false){ + this.state.field=true + } + else{ + this.state.field=false + } this.state.qp[id].subqp.map((xb,id)=>{ qpcsubmark=qpcsubmark+parseInt(xb.mark) + if(xb.touched.question==false||xb.touched.mark==false){ + this.state.field=true + } + else{ + this.state.field=false + } }) }) qpcMark=qpcmark+qpcsubmark @@ -397,9 +451,9 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{ - { } + { } - + (evt)=>{ {this.validateQp(x.question,x.mark,id)} - {this.state.qp.length !== 1 && x.subqp.length<1 &&} + {this.state.qp.length !== 1 && x.subqp.length<1 &&} @@ -429,10 +483,10 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{ this.handleInputChange(e, id)}/> + {x.errors.question}
- {x.errors.question} - + this._handleImageChange(e,id)} /> + (evt)=>{ {x.errors.mark} - {} + {}
{this.state.qp[id].subqp.map((xb,subid)=>
{this.validateSubQp(xb.question,xb.mark,id,subid)} - {} + {} @@ -457,10 +511,10 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{ this.handleInputsubChange(e, id, subid)}/> - {xb.errors.question} + {xb.errors.question}
- + this._handleImageSubChange(e,id,subid)} /> + (evt)=>{ {xb.errors.mark} - {} + {}
)}
@@ -479,10 +533,11 @@ handleBlurSubQp=(field,index,subid)=>(evt)=>{
{this.handlecheck()}
- - + + + + + (evt)=>{ >
- - - + + + - - - - + + - - - + - - - - + + - - - - + + + + + - - - - - - - + + + + + + - - - - - - - - - + + + + { - this.props.sab.qp.map((x,id) => { - return( -
- - - {this.props.sab.qp[id].subqp.length!==0? - :} - - - - - - - - - - - - - {this.props.sab.qp[id].subqp.map((xb,subid)=>{ - return( - - - - - - - - - - - - - - ); - })} - -
- ); + this.props.sab.qp.map((x,id) => { + return( +
+ + + {this.props.sab.qp[id].subqp.length!==0? + :} + + + + + + + + + + + + + + {this.props.sab.qp[id].subqp.map((xb,subid)=>{ + return( + + + + + + + + + + + + + + ); + })} + +
+ ); }) }
- - - - - - - - + + + { - this.props.sb.qp.map((x,id) => { - return( -
- - - {this.props.sb.qp[id].subqp.length!==0? - :} - - - - - - - - - - - - - {this.props.sb.qp[id].subqp.map((xb,subid)=>{ - return( - - - - - - - - - - - - - - ); - })} - -
- ); + this.props.sb.qp.map((x,id) => { + return( +
+ + + {this.props.sb.qp[id].subqp.length!==0? + :} + + + + + + + + + + + + + {this.props.sb.qp[id].subqp.map((xb,subid)=>{ + return( + + + + + + + + + + + + + + ); + })} + +
+ ); }) }
- - - - - - - - + + + + { - this.state.qp.map((x,id) => { - return( -
- - - {this.state.qp[id].subqp.length!==0? - :} - - - - - - - - - - - - - {this.state.qp[id].subqp.map((xb,subid)=>{ - return( - - - - - - - - - - - - - - ); - })} - -
- ); + this.state.qp.map((x,id) => { + return( +
+ + + {this.state.qp[id].subqp.length!==0? + :} + + + + + + + + + + + + + {this.state.qp[id].subqp.map((xb,subid)=>{ + return( + + + + + + + + + + + + + + ); + })} + +
+ ); }) } -
- -
- - - - - - - - - - ); - }} - -export default Partc; - - + + + + + + + + + + + + + ); + }} +export default Partc; \ No newline at end of file diff --git a/qp-template-master/src/subdivide.png b/qp-template-master/src/subdivide.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1fe3b5c1647f350b0ddbd4f9afe9dfadcf5307 GIT binary patch literal 17308 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

Ln%+D{A`shvs3v# z3jB{1Iw89}Lwt{f_*ona@&i8*n>K7TGumKcv~lD9jiwgh_ogl2tHp*5tlx_~|LuhU dobQR_;s5&=?h}{yfEN&$T`oI|w;#UnzW_hg-lhNm literal 0 HcmV?d00001