You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-mitmproxy/addon/web/client/build/static/js/main.6b681f56.chunk.js.map

1 line
39 KiB
Plaintext

{"version":3,"sources":["components/BreakPoint.js","message.js","utils.js","components/EditFlow.js","flow.js","App.js","reportWebVitals.js","index.js"],"names":["BreakPoint","props","state","show","rule","method","url","action","haveRules","handleClose","bind","handleShow","handleSave","this","setState","rules","push","parseInt","onSave","length","variant","Button","size","onClick","Modal","onHide","Header","closeButton","Title","Body","Form","Group","as","Row","Label","column","sm","Col","Control","value","onChange","e","target","Footer","React","Component","messageEnum","allMessageBytes","Object","keys","map","k","messageByteMap","reduce","m","sendMessageEnum","buildMessageEdit","messageType","flow","view","Uint8Array","set","TextEncoder","encode","id","header","body","request","Error","response","bodyLen","byteLength","headerBytes","JSON","stringify","len","data","ArrayBuffer","view2","DataView","setUint32","isTextBody","payload","test","join","getSize","isNaN","toFixed","EditFlow","alertMsg","content","msg","firstLine","headerLines","key","valstr","bodyLines","TextDecoder","decode","stringifyRequest","statusCode","stringifyResponse","when","sections","split","vals","parseRequest","showAlert","onChangeRequest","parseResponse","onChangeResponse","waitIntercept","className","onMessage","rows","Alert","FlowManager","items","_map","Map","filterText","filterTimer","num","max","filter","item","includes","no","oldest","shift","delete","get","text","callback","clearTimeout","setTimeout","App","flowMgr","flows","showList","flowTab","ws","initWs","close","host","URL","document","WebSocket","binaryType","onopen","console","log","onclose","onmessage","evt","meta","Int8Array","slice","type","resp","parse","err","parseMessage","add","error","onerror","send","style","padding","clear","placeholder","changeFilterLazy","rulesBytes","buildMessageMeta","Table","striped","bordered","f","u","path","pathname","search","classNames","renderFlow","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.6b681f56.chunk.js","sourcesContent":["import React from 'react'\nimport Button from 'react-bootstrap/Button'\nimport Modal from 'react-bootstrap/Modal'\nimport Form from 'react-bootstrap/Form'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nclass BreakPoint extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n show: false,\n\n rule: {\n method: 'ALL',\n url: '',\n action: '1',\n },\n\n haveRules: false,\n }\n\n this.handleClose = this.handleClose.bind(this)\n this.handleShow = this.handleShow.bind(this)\n this.handleSave = this.handleSave.bind(this)\n }\n\n handleClose() {\n this.setState({ show: false })\n }\n\n handleShow() {\n this.setState({ show: true })\n }\n\n handleSave() {\n const { rule } = this.state\n const rules = []\n if (rule.url) {\n rules.push({\n method: rule.method === 'ALL' ? '' : rule.method,\n url: rule.url,\n action: parseInt(rule.action)\n })\n }\n\n this.props.onSave(rules)\n this.handleClose()\n\n this.setState({ haveRules: rules.length ? true : false })\n }\n\n render() {\n const { rule, haveRules } = this.state\n const variant = haveRules ? 'success' : 'primary'\n\n return (\n <div>\n <Button variant={variant} size=\"sm\" onClick={this.handleShow}>BreakPoint</Button>\n\n <Modal show={this.state.show} onHide={this.handleClose}>\n <Modal.Header closeButton>\n <Modal.Title>Set BreakPoint</Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Form.Group as={Row}>\n <Form.Label column sm={2}>Method</Form.Label>\n <Col sm={10}>\n <Form.Control as=\"select\" value={rule.method} onChange={e => { this.setState({ rule: { ...rule, method: e.target.value } }) }}>\n <option>ALL</option>\n <option>GET</option>\n <option>POST</option>\n <option>PUT</option>\n <option>DELETE</option>\n </Form.Control>\n </Col>\n </Form.Group>\n\n <Form.Group as={Row}>\n <Form.Label column sm={2}>URL</Form.Label>\n <Col sm={10}><Form.Control value={rule.url} onChange={e => { this.setState({ rule: { ...rule, url: e.target.value } }) }} /></Col>\n </Form.Group>\n\n <Form.Group as={Row}>\n <Form.Label column sm={2}>Action</Form.Label>\n <Col sm={10}>\n <Form.Control as=\"select\" value={rule.action} onChange={e => { this.setState({ rule: { ...rule, action: e.target.value } }) }}>\n <option value=\"1\">Request</option>\n <option value=\"2\">Response</option>\n <option value=\"3\">Both</option>\n </Form.Control>\n </Col>\n </Form.Group>\n </Modal.Body>\n\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={this.handleClose}>\n Close\n </Button>\n <Button variant=\"primary\" onClick={this.handleSave}>\n Save\n </Button>\n </Modal.Footer>\n </Modal>\n </div>\n )\n }\n}\n\nexport default BreakPoint\n","const messageEnum = {\n 'request': 1,\n 'requestBody': 2,\n 'response': 3,\n 'responseBody': 4,\n}\n\nconst allMessageBytes = Object.keys(messageEnum).map(k => messageEnum[k])\n\nconst messageByteMap = Object.keys(messageEnum).reduce((m, k) => {\n m[messageEnum[k]] = k\n return m\n}, {})\n\n\n// type: 1/2/3/4\n// messageFlow\n// version 1 byte + type 1 byte + id 36 byte + waitIntercept 1 byte + content left bytes\nexport const parseMessage = data => {\n if (data.byteLength < 39) return null\n const meta = new Int8Array(data.slice(0, 39))\n const version = meta[0]\n if (version !== 1) return null\n const type = meta[1]\n if (!allMessageBytes.includes(type)) return null\n const id = new TextDecoder().decode(data.slice(2, 38))\n const waitIntercept = meta[38] === 1\n\n const resp = {\n type: messageByteMap[type],\n id,\n waitIntercept,\n }\n if (data.byteLength === 39) return resp\n if (type === messageEnum['requestBody'] || type === messageEnum['responseBody']) {\n resp.content = data.slice(39)\n return resp\n }\n\n let content = new TextDecoder().decode(data.slice(39))\n try {\n content = JSON.parse(content)\n } catch (err) {\n return null\n }\n\n resp.content = content\n return resp\n}\n\n\nexport const sendMessageEnum = {\n 'changeRequest': 11,\n 'changeResponse': 12,\n 'dropRequest': 13,\n 'dropResponse': 14,\n 'changeBreakPointRules': 21,\n}\n\n// type: 11/12/13/14\n// messageEdit\n// version 1 byte + type 1 byte + id 36 byte + header len 4 byte + header content bytes + body len 4 byte + [body content bytes]\nexport const buildMessageEdit = (messageType, flow) => {\n if (messageType === sendMessageEnum.dropRequest || messageType === sendMessageEnum.dropResponse) {\n const view = new Uint8Array(38)\n view[0] = 1\n view[1] = messageType\n view.set(new TextEncoder().encode(flow.id), 2)\n return view\n }\n\n let header, body\n \n if (messageType === sendMessageEnum.changeRequest) {\n ({ body, ...header } = flow.request)\n } else if (messageType === sendMessageEnum.changeResponse) {\n ({ body, ...header } = flow.response)\n } else {\n throw new Error('invalid message type')\n }\n \n const bodyLen = (body && body.byteLength) ? body.byteLength : 0\n const headerBytes = new TextEncoder().encode(JSON.stringify(header))\n const len = 2 + 36 + 4 + headerBytes.byteLength + 4 + bodyLen\n const data = new ArrayBuffer(len)\n const view = new Uint8Array(data)\n view[0] = 1\n view[1] = messageType\n view.set(new TextEncoder().encode(flow.id), 2)\n view.set(headerBytes, 2 + 36 + 4)\n if (bodyLen) view.set(body, 2 + 36 + 4 + headerBytes.byteLength + 4)\n\n const view2 = new DataView(data)\n view2.setUint32(2 + 36, headerBytes.byteLength)\n view2.setUint32(2 + 36 + 4 + headerBytes.byteLength, bodyLen)\n\n return view\n}\n\n\n// type: 21\n// messageMeta\n// version 1 byte + type 1 byte + content left bytes\nexport const buildMessageMeta = (messageType, rules) => {\n if (messageType !== sendMessageEnum.changeBreakPointRules) {\n throw new Error('invalid message type')\n }\n\n const rulesBytes = new TextEncoder().encode(JSON.stringify(rules))\n const view = new Uint8Array(2 + rulesBytes.byteLength)\n view[0] = 1\n view[1] = messageType\n view.set(rulesBytes, 2)\n\n return view\n}\n","export const isTextBody = payload => {\n if (!payload) return false\n if (!payload.header) return false\n if (!payload.header['Content-Type']) return false\n\n return /text|javascript|json/.test(payload.header['Content-Type'].join(''))\n}\n\nexport const getSize = response => {\n if (!response) return '0'\n if (!response.header) return '0'\n\n let len\n if (response.header['Content-Length']) {\n len = parseInt(response.header['Content-Length'][0])\n } else if (response && response.body) {\n len = response.body.byteLength\n }\n if (!len) return '0'\n if (isNaN(len)) return '0'\n if (len <= 0) return '0'\n \n if (len < 1024) return `${len} B`\n if (len < 1024*1024) return `${(len/1024).toFixed(2)} KB`\n return `${(len/(1024*1024)).toFixed(2)} MB`\n}\n","import React from 'react'\nimport Button from 'react-bootstrap/Button'\nimport Modal from 'react-bootstrap/Modal'\nimport Form from 'react-bootstrap/Form'\nimport Alert from 'react-bootstrap/Alert'\n\nimport { sendMessageEnum, buildMessageEdit } from '../message'\nimport { isTextBody } from '../utils'\n\n\nconst stringifyRequest = request => {\n const firstLine = `${request.method} ${request.url}`\n const headerLines = Object.keys(request.header).map(key => {\n const valstr = request.header[key].join(' \\t ') // for parse convenience\n return `${key}: ${valstr}`\n }).join('\\n')\n\n let bodyLines = ''\n if (request.body && isTextBody(request)) bodyLines = new TextDecoder().decode(request.body)\n \n return `${firstLine}\\n\\n${headerLines}\\n\\n${bodyLines}`\n}\n\nconst parseRequest = content => {\n const sections = content.split('\\n\\n')\n if (sections.length !== 3) return\n\n const [firstLine, headerLines, bodyLines] = sections\n const [method, url] = firstLine.split(' ')\n if (!method || !url) return\n \n const header = {}\n for (const line of headerLines.split('\\n')) {\n const [key, vals] = line.split(': ')\n if (!key || !vals) return\n header[key] = vals.split(' \\t ')\n }\n\n let body = null\n if (bodyLines) body = new TextEncoder().encode(bodyLines)\n\n return {\n method,\n url,\n header,\n body,\n }\n}\n\nconst stringifyResponse = response => {\n const firstLine = `${response.statusCode}`\n const headerLines = Object.keys(response.header).map(key => {\n const valstr = response.header[key].join(' \\t ') // for parse convenience\n return `${key}: ${valstr}`\n }).join('\\n')\n\n let bodyLines = ''\n if (response.body && isTextBody(response)) bodyLines = new TextDecoder().decode(response.body)\n \n return `${firstLine}\\n\\n${headerLines}\\n\\n${bodyLines}`\n}\n\nconst parseResponse = content => {\n const sections = content.split('\\n\\n')\n if (sections.length !== 3) return\n\n const [firstLine, headerLines, bodyLines] = sections\n const statusCode = parseInt(firstLine)\n if (isNaN(statusCode)) return\n\n const header = {}\n for (const line of headerLines.split('\\n')) {\n const [key, vals] = line.split(': ')\n if (!key || !vals) return\n header[key] = vals.split(' \\t ')\n }\n\n let body = null\n if (bodyLines) body = new TextEncoder().encode(bodyLines)\n\n return {\n statusCode,\n header,\n body,\n }\n}\n\n\nclass EditFlow extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n show: false,\n alertMsg: '',\n content: '',\n }\n\n this.handleClose = this.handleClose.bind(this)\n this.handleShow = this.handleShow.bind(this)\n this.handleSave = this.handleSave.bind(this)\n }\n\n showAlert(msg) {\n this.setState({ alertMsg: msg })\n }\n\n handleClose() {\n this.setState({ show: false })\n }\n\n handleShow() {\n const { flow } = this.props\n const when = flow.response ? 'response' : 'request'\n\n let content = ''\n if (when === 'request') {\n content = stringifyRequest(flow.request)\n } else {\n content = stringifyResponse(flow.response)\n }\n\n this.setState({ show: true, alertMsg: '', content })\n }\n\n handleSave() {\n const { flow } = this.props\n const when = flow.response ? 'response' : 'request'\n\n const { content } = this.state\n\n if (when === 'request') {\n const request = parseRequest(content)\n if (!request) {\n this.showAlert('parse error')\n return\n }\n\n this.props.onChangeRequest(request)\n this.handleClose()\n } else {\n const response = parseResponse(content)\n if (!response) {\n this.showAlert('parse error')\n return\n }\n\n this.props.onChangeResponse(response)\n this.handleClose()\n }\n }\n\n render() {\n const { flow } = this.props\n if (!flow.waitIntercept) return null\n\n const { alertMsg } = this.state\n \n const when = flow.response ? 'response' : 'request'\n\n return (\n <div className=\"flow-wait-area\">\n\n <Button size=\"sm\" onClick={this.handleShow}>Edit</Button>\n\n <Button size=\"sm\" onClick={() => {\n const msgType = when === 'response' ? sendMessageEnum.changeResponse : sendMessageEnum.changeRequest\n const msg = buildMessageEdit(msgType, flow)\n this.props.onMessage(msg)\n }}>Continue</Button>\n\n <Button size=\"sm\" onClick={() => {\n const msgType = when === 'response' ? sendMessageEnum.dropResponse : sendMessageEnum.dropRequest\n const msg = buildMessageEdit(msgType, flow)\n this.props.onMessage(msg)\n }}>Drop</Button>\n\n\n <Modal size=\"lg\" show={this.state.show} onHide={this.handleClose}>\n <Modal.Header closeButton>\n <Modal.Title>Edit {when === 'request' ? 'Request' : 'Response'}</Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Form.Group>\n <Form.Control as=\"textarea\" rows={10} value={this.state.content} onChange={e => { this.setState({ content: e.target.value }) }} />\n </Form.Group>\n {\n !alertMsg ? null : <Alert variant=\"danger\">{alertMsg}</Alert>\n }\n </Modal.Body>\n\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={this.handleClose}>\n Close\n </Button>\n <Button variant=\"primary\" onClick={this.handleSave}>\n Save\n </Button>\n </Modal.Footer>\n </Modal>\n\n </div>\n )\n }\n}\n\nexport default EditFlow\n","export class FlowManager {\n constructor() {\n this.items = []\n this._map = new Map()\n this.filterText = ''\n this.filterTimer = null\n this.num = 0\n\n this.max = 1000\n }\n\n showList() {\n if (!this.filterText) return this.items\n return this.items.filter(item => {\n return item.request.url.includes(this.filterText)\n })\n }\n\n add(item) {\n item.no = ++this.num\n this.items.push(item)\n this._map.set(item.id, item)\n \n if (this.items.length > this.max) {\n const oldest = this.items.shift()\n this._map.delete(oldest.id)\n }\n }\n\n get(id) {\n return this._map.get(id)\n }\n\n changeFilter(text) {\n this.filterText = text\n }\n\n changeFilterLazy(text, callback) {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer)\n this.filterTimer = null\n }\n\n this.filterTimer = setTimeout(() => {\n this.filterText = text\n callback()\n }, 300)\n }\n\n clear() {\n this.items = []\n this._map = new Map()\n }\n}\n","import React from 'react'\nimport Table from 'react-bootstrap/Table'\nimport Form from 'react-bootstrap/Form'\nimport Button from 'react-bootstrap/Button'\nimport './App.css'\n\nimport BreakPoint from './components/BreakPoint'\nimport EditFlow from './components/EditFlow'\n\nimport { FlowManager } from './flow'\nimport { isTextBody, getSize } from './utils'\nimport { parseMessage, sendMessageEnum, buildMessageMeta } from './message'\n\nclass App extends React.Component {\n\n constructor(props) {\n super(props)\n\n this.flowMgr = new FlowManager()\n\n this.state = {\n flows: this.flowMgr.showList(),\n flow: null,\n\n flowTab: 'Headers', // Headers, Preview, Response\n }\n\n this.ws = null\n }\n\n componentDidMount() {\n this.initWs()\n }\n\n componentWillUnmount() {\n if (this.ws) {\n this.ws.close()\n }\n }\n\n initWs() {\n if (this.ws) return\n\n let host\n if (process.env.NODE_ENV === 'development') {\n host = 'localhost:9081'\n } else {\n host = new URL(document.URL).host\n }\n this.ws = new WebSocket(`ws://${host}/echo`)\n this.ws.binaryType = 'arraybuffer'\n this.ws.onopen = () => { console.log('OPEN') }\n this.ws.onclose = () => { console.log('CLOSE') }\n this.ws.onmessage = evt => {\n const msg = parseMessage(evt.data)\n if (!msg) {\n console.error('parse error:', evt.data)\n return\n }\n // console.log('msg:', msg)\n\n if (msg.type === 'request') {\n const flow = { id: msg.id, request: msg.content, waitIntercept: msg.waitIntercept }\n this.flowMgr.add(flow)\n this.setState({ flows: this.flowMgr.showList() })\n }\n else if (msg.type === 'requestBody') {\n const flow = this.flowMgr.get(msg.id)\n if (!flow) return\n flow.waitIntercept = msg.waitIntercept\n flow.request.body = msg.content\n this.setState({ flows: this.state.flows })\n }\n else if (msg.type === 'response') {\n const flow = this.flowMgr.get(msg.id)\n if (!flow) return\n flow.waitIntercept = msg.waitIntercept\n flow.response = msg.content\n this.setState({ flows: this.state.flows })\n }\n else if (msg.type === 'responseBody') {\n const flow = this.flowMgr.get(msg.id)\n if (!flow || !flow.response) return\n flow.waitIntercept = msg.waitIntercept\n flow.response.body = msg.content\n this.setState({ flows: this.state.flows })\n }\n }\n this.ws.onerror = evt => {\n console.log('ERROR:', evt)\n }\n }\n\n renderFlow() {\n const { flow, flowTab } = this.state\n if (!flow) return null\n\n const request = flow.request\n const response = flow.response || {}\n\n return (\n <div className=\"flow-detail\">\n <div className=\"header-tabs\">\n <span onClick={() => { this.setState({ flow: null }) }}>x</span>\n <span className={flowTab === 'Headers' ? 'selected' : null} onClick={() => { this.setState({ flowTab: 'Headers' }) }}>Headers</span>\n <span className={flowTab === 'Preview' ? 'selected' : null} onClick={() => { this.setState({ flowTab: 'Preview' }) }}>Preview</span>\n <span className={flowTab === 'Response' ? 'selected' : null} onClick={() => { this.setState({ flowTab: 'Response' }) }}>Response</span>\n\n <EditFlow\n flow={flow}\n onChangeRequest={request => {\n flow.request.method = request.method\n flow.request.url = request.url\n flow.request.header = request.header\n if (isTextBody(flow.request)) flow.request.body = request.body\n this.setState({ flows: this.state.flows })\n }}\n onChangeResponse={response => {\n flow.response.statusCode = response.statusCode\n flow.response.header = response.header\n if (isTextBody(flow.response)) flow.response.body = response.body\n this.setState({ flows: this.state.flows })\n }}\n onMessage={msg => {\n this.ws.send(msg)\n flow.waitIntercept = false\n this.setState({ flows: this.state.flows })\n }}\n />\n\n </div>\n\n <div style={{ padding: '20px' }}>\n {\n !(flowTab === 'Headers') ? null :\n <div>\n <div className=\"header-block\">\n <p>General</p>\n <div className=\"header-block-content\">\n <p>Request URL: {request.url}</p>\n <p>Request Method: {request.method}</p>\n <p>Status Code: {`${response.statusCode || '(pending)'}`}</p>\n </div>\n </div>\n\n {\n !(response.header) ? null :\n <div className=\"header-block\">\n <p>Response Headers</p>\n <div className=\"header-block-content\">\n {\n Object.keys(response.header).map(key => {\n return (\n <p key={key}>{key}: {response.header[key].join(' ')}</p>\n )\n })\n }\n </div>\n </div>\n }\n\n <div className=\"header-block\">\n <p>Request Headers</p>\n <div className=\"header-block-content\">\n {\n !(request.header) ? null :\n Object.keys(request.header).map(key => {\n return (\n <p key={key}>{key}: {request.header[key].join(' ')}</p>\n )\n })\n }\n </div>\n </div>\n\n {\n !(request.body && request.body.byteLength) ? null :\n <div className=\"header-block\">\n <p>Request Body</p>\n <div className=\"header-block-content\">\n <p>\n {\n !(isTextBody(request)) ? \"Not text\" :\n new TextDecoder().decode(request.body)\n }\n </p>\n </div>\n </div>\n }\n\n </div>\n }\n\n {\n !(flowTab === 'Response') ? null :\n !(response.body && response.body.byteLength) ? <div>No response</div> :\n !(isTextBody(response)) ? <div>Not text response</div> :\n <div>\n {new TextDecoder().decode(response.body)}\n </div>\n }\n </div>\n\n </div>\n )\n }\n \n render() {\n const { flows } = this.state\n return (\n <div className=\"main-table-wrap\">\n <div className=\"top-control\">\n <div><Button size=\"sm\" onClick={() => {\n this.flowMgr.clear()\n this.setState({ flows: this.flowMgr.showList(), flow: null })\n }}>Clear</Button></div>\n <div>\n <Form.Control\n size=\"sm\" placeholder=\"Filter\"\n onChange={(e) => {\n const value = e.target.value\n this.flowMgr.changeFilterLazy(value, () => {\n this.setState({ flows: this.flowMgr.showList() })\n })\n }}\n >\n </Form.Control>\n </div>\n\n <BreakPoint onSave={rules => {\n const msg = buildMessageMeta(sendMessageEnum.changeBreakPointRules, rules)\n this.ws.send(msg)\n }} />\n </div>\n\n <Table striped bordered size=\"sm\">\n <thead>\n <tr>\n <th>No</th>\n <th>Host</th>\n <th>Path</th>\n <th>Method</th>\n <th>Status</th>\n <th>Size</th>\n </tr>\n </thead>\n <tbody>\n {\n flows.map(f => {\n const url = f.request.url\n const u = new URL(url)\n let host = u.host\n if (host.length > 35) host = host.slice(0, 35) + '...'\n let path = u.pathname + u.search\n if (path.length > 65) path = path.slice(0, 65) + '...'\n\n const request = f.request\n const response = f.response || {}\n\n const classNames = []\n if (this.state.flow && this.state.flow.id === f.id) classNames.push('tr-selected')\n if (f.waitIntercept) classNames.push('tr-wait-intercept')\n\n return (\n <tr className={classNames.length ? classNames.join(' ') : null} key={f.id}\n onClick={() => {\n this.setState({ flow: f })\n }}\n >\n <td>{f.no}</td>\n <td>{host}</td>\n <td>{path}</td>\n <td>{request.method}</td>\n <td>{response.statusCode || '(pending)'}</td>\n <td>{getSize(response)}</td>\n </tr>\n )\n })\n }\n </tbody>\n </Table>\n\n {this.renderFlow()}\n </div>\n )\n }\n}\n\nexport default App\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport 'bootstrap/dist/css/bootstrap.min.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root')\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}