UNPKG

@tekdi/sunbird-quml-player

Version:

The QuML player library components are powered by Angular. This player is primarily designed to be used on Sunbird consumption platforms (mobile app, web portal, offline desktop app) to drive reusability and maintainability, hence reducing the redundant d

121 lines 19.1 kB
import { Injectable } from '@angular/core'; import * as _ from 'lodash-es'; import { DEFAULT_SCORE } from './player-constants'; import * as i0 from "@angular/core"; export class UtilService { uniqueId(length = 32) { let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } getTimeSpentText(pdfPlayerStartTime) { const duration = new Date().getTime() - pdfPlayerStartTime; const minutes = Math.floor(duration / 60000); const seconds = Number(((duration % 60000) / 1000).toFixed(0)); return (minutes + ':' + (seconds < 10 ? '0' : '') + seconds); } getKeyValue(keys) { let key = keys.find((k) => { return k.includes('response'); }); return key; } getMultiselectScore(options, responseDeclaration, isShuffleQuestions, outcomeDeclaration) { let key = this.getKeyValue(Object.keys(responseDeclaration)); const selectedOptionValue = options.map(option => option.value); let score; let mapping = responseDeclaration[key]['mapping']; if (isShuffleQuestions) { score = DEFAULT_SCORE; const scoreForEachMapping = _.round(1 / mapping.length, 2); _.forEach(mapping, (map) => { map.score = scoreForEachMapping; }); } else { score = _.get(outcomeDeclaration, 'maxScore.defaultValue'); } let correctValues = responseDeclaration[key].correctResponse.value.map((ele) => Number(ele)); if (_.isEqual(correctValues.sort(), selectedOptionValue.sort())) { return score; } else if (!_.isEqual(correctValues.sort(), selectedOptionValue.sort())) { let sum = 0; _.forEach(mapping, (map, index) => { if (_.includes(selectedOptionValue, map.value)) { sum += (map?.score ? map.score : 0); } }); return sum; } } hasDuplicates(selectedOptions, option) { let duplicate = selectedOptions.find((o) => { return o.value === option.value; }); return duplicate; } getQuestionType(questions, currentIndex) { let index = currentIndex - 1 === -1 ? 0 : currentIndex - 1; return questions[index]['qType']; } canGo(progressBarClass) { let attemptedParams = ['correct', 'wrong', 'attempted']; return attemptedParams.includes(progressBarClass); } sumObjectsByKey(...objects) { return objects.reduce((accumulator, currentValue) => { for (const key in currentValue) { /* istanbul ignore else */ if (currentValue.hasOwnProperty(key)) { accumulator[key] = (accumulator[key] || 0) + currentValue[key]; } } return accumulator; }, {}); } scrollParentToChild(parent, child) { const isMobilePortrait = window.matchMedia("(max-width: 480px)").matches; const parentRect = parent.getBoundingClientRect(); const childRect = child.getBoundingClientRect(); if (isMobilePortrait) { parent.scrollLeft = childRect.left + parent.scrollLeft - parentRect.left; } else { parent.scrollTop = (childRect.top + parent.scrollTop) - parentRect.top; } } // fetches the element using its tag video and sets the value of the “src” attribute of source element and poster attribute. updateSourceOfVideoElement(baseUrl, media, identifier) { const elements = Array.from(document.getElementsByTagName('video')); _.forEach(elements, (element) => { const videoId = element.getAttribute('data-asset-variable'); if (!videoId) { return; } const asset = _.filter(media, ['id', videoId]); const posterSrc = element.getAttribute('poster'); if (!_.isEmpty(asset) && posterSrc) { element['poster'] = baseUrl ? `${baseUrl}/${identifier}/${posterSrc}` : asset[0].baseUrl + posterSrc; } if (!_.isEmpty(asset)) { const sourceElement = Array.from(element.getElementsByTagName('source')); _.forEach(sourceElement, (element) => { const sourceSrc = element.getAttribute('src'); element['src'] = baseUrl ? `${baseUrl}/${identifier}/${sourceSrc}` : asset[0].baseUrl + sourceSrc; }); } }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvdXRpbC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBOztBQUtsRCxNQUFNLE9BQU8sV0FBVztJQUViLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUN2QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxVQUFVLEdBQUcsZ0VBQWdFLENBQUM7UUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLGtCQUFrQjtRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDO1FBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FB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WUFFRCxJQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUE4QixDQUFDLENBQUM7Z0JBQ3RHLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBb0IsRUFBRSxFQUFFO29CQUM5QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxVQUFVLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO2dCQUN0RyxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO2tJQW5IUSxXQUFXO3NJQUFYLFdBQVcsY0FGUixNQUFNOzs0RkFFVCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IERFRkFVTFRfU0NPUkUgfSBmcm9tICcuL3BsYXllci1jb25zdGFudHMnXG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVXRpbFNlcnZpY2Uge1xuXG4gICAgcHVibGljIHVuaXF1ZUlkKGxlbmd0aCA9IDMyKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gICAgICAgIGNvbnN0IGNoYXJhY3RlcnNMZW5ndGggPSBjaGFyYWN0ZXJzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXJhY3RlcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnNMZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaW1lU3BlbnRUZXh0KHBkZlBsYXllclN0YXJ0VGltZSkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gcGRmUGxheWVyU3RhcnRUaW1lO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAvIDYwMDAwKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcigoKGR1cmF0aW9uICUgNjAwMDApIC8gMTAwMCkudG9GaXhlZCgwKSk7XG4gICAgICAgIHJldHVybiAobWludXRlcyArICc6JyArIChzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJykgKyBzZWNvbmRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0S2V5VmFsdWUoa2V5cykge1xuICAgICAgICBsZXQga2V5ID0ga2V5cy5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gay5pbmNsdWRlcygncmVzcG9uc2UnKTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TXVsdGlzZWxlY3RTY29yZShvcHRpb25zLCByZXNwb25zZURlY2xhcmF0aW9uLCBpc1NodWZmbGVRdWVzdGlvbnMsIG91dGNvbWVEZWNsYXJhdGlvbikge1xuICAgICAgICBsZXQga2V5OiBhbnkgPSB0aGlzLmdldEtleVZhbHVlKE9iamVjdC5rZXlzKHJlc3BvbnNlRGVjbGFyYXRpb24pKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IG9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUpO1xuICAgICAgICBsZXQgc2NvcmU7XG4gICAgICAgIGxldCBtYXBwaW5nID0gcmVzcG9uc2VEZWNsYXJhdGlvbltrZXldWydtYXBwaW5nJ107XG4gICAgICAgIGlmIChpc1NodWZmbGVRdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIHNjb3JlID0gREVGQVVMVF9TQ09SRTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3JlRm9yRWFjaE1hcHBpbmcgPSBfLnJvdW5kKDEvbWFwcGluZy5sZW5ndGgsIDIpO1xuICAgICAgICAgICAgXy5mb3JFYWNoKG1hcHBpbmcsIChtYXApID0+IHtcbiAgICAgICAgICAgICAgICBtYXAuc2NvcmUgPSBzY29yZUZvckVhY2hNYXBwaW5nO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3JlID0gXy5nZXQob3V0Y29tZURlY2xhcmF0aW9uLCAnbWF4U2NvcmUuZGVmYXVsdFZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvcnJlY3RWYWx1ZXMgPSByZXNwb25zZURlY2xhcmF0aW9uW2tleV0uY29ycmVjdFJlc3BvbnNlLnZhbHVlLm1hcCgoZWxlKSA9PiBOdW1iZXIoZWxlKSk7XG4gICAgICAgIGlmIChfLmlzRXF1YWwoY29ycmVjdFZhbHVlcy5zb3J0KCksIHNlbGVjdGVkT3B0aW9uVmFsdWUuc29ydCgpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNFcXVhbChjb3JyZWN0VmFsdWVzLnNvcnQoKSwgc2VsZWN0ZWRPcHRpb25WYWx1ZS5zb3J0KCkpKSB7XG4gICAgICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgICAgIF8uZm9yRWFjaChtYXBwaW5nLCAobWFwLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKF8uaW5jbHVkZXMoc2VsZWN0ZWRPcHRpb25WYWx1ZSwgbWFwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKG1hcD8uc2NvcmUgPyBtYXAuc2NvcmUgOiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzdW07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNEdXBsaWNhdGVzKHNlbGVjdGVkT3B0aW9ucywgb3B0aW9uKSB7XG4gICAgICAgIGxldCBkdXBsaWNhdGUgPSBzZWxlY3RlZE9wdGlvbnMuZmluZCgobykgPT4geyByZXR1cm4gby52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gZHVwbGljYXRlO1xuICAgIH1cblxuICAgIGdldFF1ZXN0aW9uVHlwZShxdWVzdGlvbnMsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICBsZXQgaW5kZXggPSBjdXJyZW50SW5kZXggLSAxID09PSAtMSA/IDAgOiBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICByZXR1cm4gcXVlc3Rpb25zW2luZGV4XVsncVR5cGUnXTtcblxuICAgIH1cblxuICAgIGNhbkdvKHByb2dyZXNzQmFyQ2xhc3MpIHtcbiAgICAgICAgbGV0IGF0dGVtcHRlZFBhcmFtcyA9IFsnY29ycmVjdCcsICd3cm9uZycsICdhdHRlbXB0ZWQnXTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRlZFBhcmFtcy5pbmNsdWRlcyhwcm9ncmVzc0JhckNsYXNzKTtcbiAgICB9XG5cbiAgICBzdW1PYmplY3RzQnlLZXkoLi4ub2JqZWN0cykge1xuICAgICAgICByZXR1cm4gb2JqZWN0cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSAoYWNjdW11bGF0b3Jba2V5XSB8fCAwKSArIGN1cnJlbnRWYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHNjcm9sbFBhcmVudFRvQ2hpbGQocGFyZW50OiBIVE1MRWxlbWVudCwgY2hpbGQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGlzTW9iaWxlUG9ydHJhaXQgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihtYXgtd2lkdGg6IDQ4MHB4KVwiKS5tYXRjaGVzO1xuICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjaGlsZFJlY3QgPSBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAoaXNNb2JpbGVQb3J0cmFpdCkge1xuICAgICAgICAgICAgcGFyZW50LnNjcm9sbExlZnQgPSBjaGlsZFJlY3QubGVmdCArIHBhcmVudC5zY3JvbGxMZWZ0IC0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LnNjcm9sbFRvcCA9IChjaGlsZFJlY3QudG9wICsgcGFyZW50LnNjcm9sbFRvcCkgLSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZldGNoZXMgdGhlIGVsZW1lbnQgdXNpbmcgaXRzIHRhZyB2aWRlbyBhbmQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIOKAnHNyY+KAnSBhdHRyaWJ1dGUgb2Ygc291cmNlIGVsZW1lbnQgYW5kIHBvc3RlciBhdHRyaWJ1dGUuXG4gICAgdXBkYXRlU291cmNlT2ZWaWRlb0VsZW1lbnQoYmFzZVVybDogc3RyaW5nLCBtZWRpYTogYW55W10sIGlkZW50aWZpZXI6IHN0cmluZykgIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpIGFzIEhUTUxDb2xsZWN0aW9uT2Y8RWxlbWVudD4pO1xuICAgICAgICBfLmZvckVhY2goZWxlbWVudHMsIChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWFzc2V0LXZhcmlhYmxlJyk7XG4gICAgICAgICAgICBpZighdmlkZW9JZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gXy5maWx0ZXIobWVkaWEsIFsnaWQnLCB2aWRlb0lkXSk7XG4gICAgICAgICAgICBjb25zdCBwb3N0ZXJTcmMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgncG9zdGVyJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKCFfLmlzRW1wdHkoYXNzZXQpICYmIHBvc3RlclNyYykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3Bvc3RlciddID0gYmFzZVVybCA/IGAke2Jhc2VVcmx9LyR7aWRlbnRpZmllcn0vJHtwb3N0ZXJTcmN9YCA6IGFzc2V0WzBdLmJhc2VVcmwgKyBwb3N0ZXJTcmM7XG4gICAgICAgICAgICB9ICBcblxuICAgICAgICAgICAgaWYoIV8uaXNFbXB0eShhc3NldCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gQXJyYXkuZnJvbShlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzb3VyY2UnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEVsZW1lbnQ+KTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goc291cmNlRWxlbWVudCwgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFsnc3JjJ10gPSBiYXNlVXJsID8gYCR7YmFzZVVybH0vJHtpZGVudGlmaWVyfS8ke3NvdXJjZVNyY31gIDogYXNzZXRbMF0uYmFzZVVybCArIHNvdXJjZVNyYztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBcblxufVxuIl19