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

965 lines 264 kB
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
import { errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9';
import * as _ from 'lodash-es';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { eventName, pageId, TelemetryType, Cardinality, QuestionType } from '../telemetry-constants';
import { DEFAULT_SCORE, COMPATABILITY_LEVEL } from '../player-constants';
import * as i0 from "@angular/core";
import * as i1 from "../services/viewer-service/viewer-service";
import * as i2 from "../util-service";
import * as i3 from "@project-sunbird/sunbird-player-sdk-v9";
import * as i4 from "@angular/common";
import * as i5 from "ngx-bootstrap/carousel";
import * as i6 from "../mcq/mcq.component";
import * as i7 from "../header/header.component";
import * as i8 from "../sa/sa.component";
import * as i9 from "../icon/ans/ans.component";
import * as i10 from "../startpage/startpage.component";
import * as i11 from "../alert/alert.component";
import * as i12 from "../mcq-solutions/mcq-solutions.component";
export class SectionPlayerComponent {
    constructor(viewerService, utilService, cdRef, errorService) {
        this.viewerService = viewerService;
        this.utilService = utilService;
        this.cdRef = cdRef;
        this.errorService = errorService;
        this.sectionIndex = 0;
        this.playerEvent = new EventEmitter();
        this.sectionEnd = new EventEmitter();
        this.showScoreBoard = new EventEmitter();
        this.destroy$ = new Subject();
        this.loadView = false;
        this.showContentError = false;
        this.noOfTimesApiCalled = 0;
        this.currentSlideIndex = 0;
        this.showStartPage = true;
        this.questions = [];
        this.progressBarClass = [];
        this.tryAgainClicked = false;
        this.carouselConfig = {
            NEXT: 1,
            PREV: 2
        };
        this.active = false;
        this.showQuestions = false;
        this.showZoomModal = false;
        this.imageZoomCount = 100;
        this.showRootInstruction = true;
        this.slideDuration = 0;
        this.isAssessEventRaised = false;
        this.isShuffleQuestions = false;
        this.playerContentCompatibiltyLevel = COMPATABILITY_LEVEL;
    }
    ngOnChanges(changes) {
        /* istanbul ignore else */
        if (changes && Object.values(changes)[0].firstChange) {
            this.subscribeToEvents();
        }
        this.viewerService.sectionConfig = this.sectionConfig;
        this.setConfig();
    }
    ngAfterViewInit() {
        this.viewerService.raiseStartEvent(0);
        this.viewerService.raiseHeartBeatEvent(eventName.startPageLoaded, 'impression', 0);
    }
    subscribeToEvents() {
        this.viewerService.qumlPlayerEvent
            .pipe(takeUntil(this.destroy$))
            .subscribe((res) => {
            this.playerEvent.emit(res);
        });
        this.viewerService.qumlQuestionEvent
            .pipe(takeUntil(this.destroy$))
            .subscribe((res) => {
            if (res?.error) {
                let traceId;
                if (_.has(this.sectionConfig, 'config')) {
                    traceId = this.sectionConfig.config;
                }
                if (navigator.onLine && this.viewerService.isAvailableLocally) {
                    this.viewerService.raiseExceptionLog(errorCode.contentLoadFails, errorMessage.contentLoadFails, new Error(errorMessage.contentLoadFails), traceId);
                }
                else {
                    this.viewerService.raiseExceptionLog(errorCode.internetConnectivity, errorMessage.internetConnectivity, new Error(errorMessage.internetConnectivity), traceId);
                }
                this.showContentError = true;
                return;
            }
            if (!res?.questions) {
                return;
            }
            const unCommonQuestions = _.xorBy(this.questions, res.questions, 'identifier');
            this.questions = _.uniqBy(this.questions.concat(unCommonQuestions), 'identifier');
            this.sortQuestions();
            this.viewerService.updateSectionQuestions(this.sectionConfig.metadata.identifier, this.questions);
            this.cdRef.detectChanges();
            this.noOfTimesApiCalled++;
            this.loadView = true;
            if (this.currentSlideIndex > 0 && this.myCarousel) {
                this.myCarousel.selectSlide(this.currentSlideIndex);
                if (this.questions[this.currentSlideIndex - 1]) {
                    this.currentQuestionsMedia = this.questions[this.currentSlideIndex - 1]?.media;
                    this.setImageZoom();
                    this.highlightQuestion();
                }
            }
            if (this.currentSlideIndex === 0) {
                if (this.showStartPage) {
                    this.active = this.sectionIndex === 0;
                }
                else {
                    setTimeout(() => { this.nextSlide(); });
                }
            }
            this.removeAttribute();
        });
    }
    setConfig() {
        this.noOfTimesApiCalled = 0;
        this.currentSlideIndex = 0;
        this.active = this.currentSlideIndex === 0 && this.sectionIndex === 0 && this.showStartPage;
        /* istanbul ignore else */
        if (this.myCarousel) {
            this.myCarousel.selectSlide(this.currentSlideIndex);
        }
        this.threshold = this.sectionConfig?.context?.threshold || 3;
        this.questionIds = _.cloneDeep(this.sectionConfig.metadata.childNodes);
        /* istanbul ignore else */
        if (this.parentConfig.isReplayed) {
            this.initializeTimer = true;
            this.viewerService.raiseStartEvent(0);
            this.viewerService.raiseHeartBeatEvent(eventName.startPageLoaded, 'impression', 0);
            this.disableNext = false;
            this.currentSlideIndex = 0;
            this.myCarousel.selectSlide(0);
            this.showRootInstruction = true;
            this.currentQuestionsMedia = _.get(this.questions[0], 'media');
            this.setImageZoom();
            this.loadView = true;
            this.removeAttribute();
            setTimeout(() => {
                const menuBtn = document.querySelector('#overlay-button');
                /* istanbul ignore else */
                if (menuBtn) {
                    menuBtn.focus({ preventScroll: true });
                }
            }, 200);
        }
        this.shuffleOptions = this.sectionConfig.config?.shuffleOptions;
        this.isShuffleQuestions = this.sectionConfig.metadata.shuffle;
        this.noOfQuestions = this.questionIds.length;
        this.viewerService.initialize(this.sectionConfig, this.threshold, this.questionIds, this.parentConfig);
        this.checkCompatibilityLevel(this.sectionConfig.metadata.compatibilityLevel);
        this.timeLimit = this.sectionConfig.metadata?.timeLimits?.questionSet?.max || 0;
        this.warningTime = this.timeLimit ? (this.timeLimit - (this.timeLimit * this.parentConfig.warningTime / 100)) : 0;
        this.showWarningTimer = this.parentConfig.showWarningTimer;
        this.showTimer = this.sectionConfig.metadata?.showTimer;
        if (this.sectionConfig.metadata?.showFeedback) {
            this.showFeedBack = this.sectionConfig.metadata?.showFeedback; // prioritize the section level config
        }
        else {
            this.showFeedBack = this.parentConfig.showFeedback; // Fallback to parent config
        }
        this.showUserSolution = this.sectionConfig.metadata?.showSolutions;
        this.startPageInstruction = this.sectionConfig.metadata?.instructions || this.parentConfig.instructions;
        this.linearNavigation = this.sectionConfig.metadata.navigationMode === 'non-linear' ? false : true;
        this.showHints = this.sectionConfig.metadata?.showHints;
        this.points = this.sectionConfig.metadata?.points;
        this.allowSkip = this.sectionConfig.metadata?.allowSkip?.toLowerCase() !== 'no';
        this.showStartPage = this.sectionConfig.metadata?.showStartPage?.toLowerCase() !== 'no';
        this.progressBarClass = this.parentConfig.isSectionsAvailable ? this.mainProgressBar.find(item => item.isActive)?.children :
            this.mainProgressBar;
        if (this.progressBarClass) {
            this.progressBarClass.forEach(item => item.showFeedback = this.showFeedBack);
        }
        this.questions = this.viewerService.getSectionQuestions(this.sectionConfig.metadata.identifier);
        this.sortQuestions();
        this.viewerService.updateSectionQuestions(this.sectionConfig.metadata.identifier, this.questions);
        this.resetQuestionState();
        if (this.jumpToQuestion) {
            this.goToQuestion(this.jumpToQuestion);
        }
        else if (this.threshold === 1) {
            this.viewerService.getQuestion();
        }
        else if (this.threshold > 1) {
            this.viewerService.getQuestions();
        }
        if (!this.sectionConfig.metadata?.children?.length) {
            this.loadView = true;
            this.disableNext = true;
        }
        if (!this.initializeTimer) {
            this.initializeTimer = true;
        }
        this.initialTime = this.initialSlideDuration = new Date().getTime();
    }
    removeAttribute() {
        setTimeout(() => {
            const firstSlide = document.querySelector('.carousel.slide');
            /* istanbul ignore else */
            if (firstSlide) {
                firstSlide.removeAttribute("tabindex");
            }
        }, 100);
    }
    sortQuestions() {
        /* istanbul ignore else */
        if (this.questions.length && this.questionIds.length) {
            const ques = [];
            this.questionIds.forEach((questionId) => {
                const que = this.questions.find(question => question.identifier === questionId);
                /* istanbul ignore else */
                if (que) {
                    ques.push(que);
                }
            });
            this.questions = ques;
        }
    }
    createSummaryObj() {
        const classObj = _.groupBy(this.progressBarClass, 'class');
        return {
            skipped: classObj?.skipped?.length || 0,
            correct: classObj?.correct?.length || 0,
            wrong: classObj?.wrong?.length || 0,
            partial: classObj?.partial?.length || 0
        };
    }
    nextSlide() {
        this.currentQuestionsMedia = _.get(this.questions[this.currentSlideIndex], 'media');
        this.getQuestion();
        this.viewerService.raiseHeartBeatEvent(eventName.nextClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex() + 1);
        this.viewerService.raiseHeartBeatEvent(eventName.nextClicked, TelemetryType.impression, this.myCarousel.getCurrentSlideIndex() + 1);
        /* istanbul ignore else */
        if (this.currentSlideIndex !== this.questions.length) {
            this.currentSlideIndex = this.currentSlideIndex + 1;
        }
        /* istanbul ignore else */
        if (this.myCarousel.isLast(this.myCarousel.getCurrentSlideIndex()) || this.noOfQuestions === this.myCarousel.getCurrentSlideIndex()) {
            this.calculateScore();
        }
        /* istanbul ignore else */
        if (this.myCarousel.getCurrentSlideIndex() > 0 &&
            this.questions[this.myCarousel.getCurrentSlideIndex() - 1].qType === QuestionType.mcq && this.currentOptionSelected) {
            const option = this.currentOptionSelected?.option ? this.currentOptionSelected['option'] : undefined;
            const identifier = this.questions[this.myCarousel.getCurrentSlideIndex() - 1].identifier;
            const qType = this.questions[this.myCarousel.getCurrentSlideIndex() - 1].qType;
            this.viewerService.raiseResponseEvent(identifier, qType, option);
        }
        /* istanbul ignore else */
        if (this.questions[this.myCarousel.getCurrentSlideIndex()]) {
            this.setSkippedClass(this.myCarousel.getCurrentSlideIndex());
        }
        /* istanbul ignore else */
        if (this.myCarousel.getCurrentSlideIndex() === this.noOfQuestions) {
            this.clearTimeInterval();
            this.emitSectionEnd();
            return;
        }
        this.myCarousel.move(this.carouselConfig.NEXT);
        this.setImageZoom();
        this.resetQuestionState();
        this.clearTimeInterval();
    }
    prevSlide() {
        this.disableNext = false;
        this.currentSolutions = undefined;
        this.viewerService.raiseHeartBeatEvent(eventName.prevClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex() - 1);
        this.showAlert = false;
        /* istanbul ignore else */
        if (this.currentSlideIndex !== this.questions.length) {
            this.currentSlideIndex = this.currentSlideIndex + 1;
        }
        if (this.myCarousel.getCurrentSlideIndex() + 1 === this.noOfQuestions && this.endPageReached) {
            this.endPageReached = false;
        }
        else {
            this.myCarousel.move(this.carouselConfig.PREV);
        }
        this.currentSlideIndex = this.myCarousel.getCurrentSlideIndex();
        this.active = this.currentSlideIndex === 0 && this.sectionIndex === 0 && this.showStartPage;
        this.currentQuestionsMedia = _.get(this.questions[this.myCarousel.getCurrentSlideIndex() - 1], 'media');
        this.setImageZoom();
        this.setSkippedClass(this.myCarousel.getCurrentSlideIndex() - 1);
    }
    getQuestion() {
        if (this.myCarousel.getCurrentSlideIndex() > 0
            && ((this.threshold * this.noOfTimesApiCalled) - 1) === this.myCarousel.getCurrentSlideIndex()
            && this.threshold * this.noOfTimesApiCalled >= this.questions.length && this.threshold > 1) {
            this.viewerService.getQuestions();
        }
        if (this.myCarousel.getCurrentSlideIndex() > 0
            && this.questions[this.myCarousel.getCurrentSlideIndex()] === undefined && this.threshold > 1) {
            this.viewerService.getQuestions();
        }
        if (this.threshold === 1 && this.myCarousel.getCurrentSlideIndex() >= 0) {
            this.viewerService.getQuestion();
        }
    }
    resetQuestionState() {
        this.active = false;
        this.showAlert = false;
        this.optionSelectedObj = undefined;
        this.currentOptionSelected = undefined;
        this.currentQuestion = undefined;
        this.currentOptions = undefined;
        this.currentSolutions = undefined;
    }
    activeSlideChange(event) {
        this.initialSlideDuration = new Date().getTime();
        this.isAssessEventRaised = false;
        const questionElement = document.querySelector('li.progressBar-border');
        const progressBarContainer = document.querySelector(".lanscape-mode-right");
        /* istanbul ignore else */
        if (progressBarContainer && questionElement && !this.parentConfig.isReplayed) {
            this.utilService.scrollParentToChild(progressBarContainer, questionElement);
        }
        const contentElement = document.querySelector(".landscape-content");
        if (contentElement) {
            contentElement.scrollTop = 0;
        }
        this.viewerService.pauseVideo();
    }
    nextSlideClicked(event) {
        if (this.showRootInstruction && this.parentConfig.isSectionsAvailable) {
            this.showRootInstruction = false;
            return;
        }
        if (this.myCarousel.getCurrentSlideIndex() === 0) {
            return this.nextSlide();
        }
        /* istanbul ignore else */
        if (event?.type === 'next') {
            this.validateSelectedOption(this.optionSelectedObj, 'next');
        }
    }
    previousSlideClicked(event) {
        /* istanbul ignore else */
        if (event.event === 'previous clicked') {
            if (this.optionSelectedObj && this.showFeedBack) {
                this.stopAutoNavigation = false;
                this.validateSelectedOption(this.optionSelectedObj, 'previous');
            }
            else {
                this.stopAutoNavigation = true;
                if (this.currentSlideIndex === 0 && this.parentConfig.isSectionsAvailable && this.getCurrentSectionIndex() > 0) {
                    const previousSectionId = this.mainProgressBar[this.getCurrentSectionIndex() - 1].identifier;
                    this.jumpToSection(previousSectionId);
                    return;
                }
                this.prevSlide();
            }
        }
    }
    updateScoreForShuffledQuestion() {
        const currentIndex = this.myCarousel.getCurrentSlideIndex() - 1;
        if (this.isShuffleQuestions) {
            this.updateScoreBoard(currentIndex, 'correct', undefined, DEFAULT_SCORE);
        }
    }
    getCurrentSectionIndex() {
        const currentSectionId = this.sectionConfig.metadata.identifier;
        return this.mainProgressBar.findIndex(section => section.identifier === currentSectionId);
    }
    goToSlideClicked(event, index) {
        /* istanbul ignore else */
        if (!this.progressBarClass?.length) {
            /* istanbul ignore else */
            if (index === 0) {
                this.jumpSlideIndex = 0;
                this.goToSlide(this.jumpSlideIndex);
            }
            return;
        }
        event.stopPropagation();
        this.active = false;
        this.jumpSlideIndex = index;
        if (this.optionSelectedObj && this.showFeedBack) {
            this.stopAutoNavigation = false;
            this.validateSelectedOption(this.optionSelectedObj, 'jump');
        }
        else {
            this.stopAutoNavigation = true;
            this.goToSlide(this.jumpSlideIndex);
        }
    }
    onEnter(event, index) {
        /* istanbul ignore else */
        if (event.keyCode === 13) {
            event.stopPropagation();
            this.goToSlideClicked(event, index);
        }
    }
    jumpToSection(identifier) {
        this.showRootInstruction = false;
        this.emitSectionEnd(false, identifier);
    }
    onSectionEnter(event, identifier) {
        /* istanbul ignore else */
        if (event.keyCode === 13) {
            event.stopPropagation();
            /* istanbul ignore else */
            if (this.optionSelectedObj) {
                this.validateSelectedOption(this.optionSelectedObj, 'jump');
            }
            this.jumpToSection(identifier);
        }
    }
    onScoreBoardClicked() {
        this.viewerService.updateSectionQuestions(this.sectionConfig.metadata.identifier, this.questions);
        this.showScoreBoard.emit();
    }
    onScoreBoardEnter(event) {
        event.stopPropagation();
        /* istanbul ignore else */
        if (event.key === 'Enter') {
            this.onScoreBoardClicked();
        }
    }
    focusOnNextButton() {
        setTimeout(() => {
            const nextBtn = document.querySelector('.quml-navigation__next');
            /* istanbul ignore else */
            if (nextBtn) {
                nextBtn.focus({ preventScroll: true });
            }
        }, 100);
    }
    getOptionSelected(optionSelected) {
        /* istanbul ignore else */
        if (optionSelected.cardinality === Cardinality.single && JSON.stringify(this.currentOptionSelected) === JSON.stringify(optionSelected)) {
            return; // Same option selected
        }
        this.focusOnNextButton();
        this.active = true;
        this.currentOptionSelected = optionSelected;
        const currentIndex = this.myCarousel.getCurrentSlideIndex() - 1;
        this.viewerService.raiseHeartBeatEvent(eventName.optionClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        // This optionSelected comes empty whenever the try again is clicked on feedback popup
        if (_.isEmpty(optionSelected?.option)) {
            this.optionSelectedObj = undefined;
            this.currentSolutions = undefined;
            this.updateScoreBoard(currentIndex, 'skipped');
        }
        else {
            this.optionSelectedObj = optionSelected;
            this.isAssessEventRaised = false;
            this.currentSolutions = !_.isEmpty(optionSelected.solutions) ? optionSelected.solutions : undefined;
        }
        this.currentQuestionIndetifier = this.questions[currentIndex].identifier;
        this.media = _.get(this.questions[currentIndex], 'media', []);
        /* istanbul ignore else */
        if (!this.showFeedBack) {
            this.validateSelectedOption(this.optionSelectedObj);
        }
    }
    durationEnds() {
        this.showSolution = false;
        this.showAlert = false;
        this.viewerService.pauseVideo();
        this.emitSectionEnd(true);
    }
    checkCompatibilityLevel(compatibilityLevel) {
        /* istanbul ignore else */
        if (compatibilityLevel) {
            // TODO: It is a temporary fix for IQ-679 or ED-3398
            // Before these changes we were calling errorService.checkContentCompatibility
            const checkContentCompatible = this.checkContentCompatibility(compatibilityLevel);
            /* istanbul ignore else */
            if (!checkContentCompatible.isCompitable) {
                this.viewerService.raiseExceptionLog(errorCode.contentCompatibility, errorMessage.contentCompatibility, checkContentCompatible.error, this.sectionConfig?.config?.traceId);
            }
        }
    }
    checkContentCompatibility(currentCompatibilityLevel) {
        if (currentCompatibilityLevel > this.playerContentCompatibiltyLevel) {
            const compatibilityError = new Error();
            compatibilityError.message = `Player supports ${this.playerContentCompatibiltyLevel}
      but content compatibility is ${currentCompatibilityLevel}`;
            compatibilityError.name = 'contentCompatibily';
            return { error: compatibilityError, isCompitable: false };
        }
        else {
            return { error: null, isCompitable: true };
        }
    }
    emitSectionEnd(isDurationEnded = false, jumpToSection) {
        const eventObj = {
            summary: this.createSummaryObj(),
            score: this.calculateScore(),
            durationSpent: this.utilService.getTimeSpentText(this.initialTime),
            slideIndex: this.myCarousel.getCurrentSlideIndex(),
            isDurationEnded,
        };
        if (jumpToSection) {
            eventObj.jumpToSection = jumpToSection;
        }
        this.viewerService.updateSectionQuestions(this.sectionConfig.metadata.identifier, this.questions);
        this.sectionEnd.emit(eventObj);
    }
    closeAlertBox(event) {
        if (event?.type === 'close') {
            this.viewerService.raiseHeartBeatEvent(eventName.closedFeedBack, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        }
        else if (event?.type === 'tryAgain') {
            this.tryAgainClicked = true;
            setTimeout(() => {
                this.tryAgainClicked = false;
            }, 2000);
            this.viewerService.raiseHeartBeatEvent(eventName.tryAgain, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        }
        this.showAlert = false;
    }
    setSkippedClass(index) {
        if (this.progressBarClass && _.get(this.progressBarClass[index], 'class') === 'unattempted') {
            this.progressBarClass[index].class = 'skipped';
        }
    }
    toggleScreenRotate(event) {
        this.viewerService.raiseHeartBeatEvent(eventName.deviceRotationClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex() + 1);
    }
    validateSelectedOption(option, type) {
        const selectedOptionValue = option?.option?.value;
        const currentIndex = this.myCarousel.getCurrentSlideIndex() - 1;
        const isQuestionSkipAllowed = !this.optionSelectedObj &&
            this.allowSkip && this.utilService.getQuestionType(this.questions, currentIndex) === QuestionType.mcq;
        const isSubjectiveQuestion = this.utilService.getQuestionType(this.questions, currentIndex) === QuestionType.sa;
        const onStartPage = this.startPageInstruction && this.myCarousel.getCurrentSlideIndex() === 0;
        const isActive = !this.optionSelectedObj && this.active;
        const selectedQuestion = this.questions[currentIndex];
        const key = selectedQuestion.responseDeclaration ? this.utilService.getKeyValue(Object.keys(selectedQuestion.responseDeclaration)) : '';
        this.slideDuration = Math.round((new Date().getTime() - this.initialSlideDuration) / 1000);
        const getParams = () => {
            if (selectedQuestion.qType.toUpperCase() === QuestionType.mcq && selectedQuestion?.editorState?.options) {
                return selectedQuestion.editorState.options;
            }
            else if (selectedQuestion.qType.toUpperCase() === QuestionType.mcq && !_.isEmpty(selectedQuestion?.editorState)) {
                return [selectedQuestion?.editorState];
            }
            else {
                return [];
            }
        };
        const edataItem = {
            'id': selectedQuestion.identifier,
            'title': selectedQuestion.name,
            'desc': selectedQuestion.description,
            'type': selectedQuestion.qType.toLowerCase(),
            'maxscore': key.length === 0 ? 0 : selectedQuestion.outcomeDeclaration.maxScore.defaultValue || 0,
            'params': getParams()
        };
        /* istanbul ignore else */
        if (edataItem && this.parentConfig.isSectionsAvailable) {
            edataItem.sectionId = this.sectionConfig.metadata.identifier;
        }
        /* istanbul ignore else */
        if (!this.optionSelectedObj && !this.isAssessEventRaised && selectedQuestion.qType.toUpperCase() !== QuestionType.sa) {
            this.isAssessEventRaised = true;
            this.viewerService.raiseAssesEvent(edataItem, currentIndex + 1, 'No', 0, [], this.slideDuration);
        }
        if (this.optionSelectedObj) {
            this.currentQuestion = selectedQuestion.body;
            this.currentOptions = selectedQuestion.interactions[key].options;
            if (option.cardinality === Cardinality.single) {
                const correctOptionValue = Number(selectedQuestion.responseDeclaration[key].correctResponse.value);
                this.showAlert = true;
                if (option.option?.value === correctOptionValue) {
                    const currentScore = this.getScore(currentIndex, key, true);
                    if (!this.isAssessEventRaised) {
                        this.isAssessEventRaised = true;
                        this.viewerService.raiseAssesEvent(edataItem, currentIndex + 1, 'Yes', currentScore, [option.option], this.slideDuration);
                    }
                    this.alertType = 'correct';
                    if (this.showFeedBack)
                        this.correctFeedBackTimeOut(type);
                    this.updateScoreBoard(currentIndex, 'correct', undefined, currentScore);
                }
                else {
                    const currentScore = this.getScore(currentIndex, key, false, option);
                    this.alertType = 'wrong';
                    const classType = this.progressBarClass[currentIndex].class === 'partial' ? 'partial' : 'wrong';
                    this.updateScoreBoard(currentIndex, classType, selectedOptionValue, currentScore);
                    /* istanbul ignore else */
                    if (!this.isAssessEventRaised) {
                        this.isAssessEventRaised = true;
                        this.viewerService.raiseAssesEvent(edataItem, currentIndex + 1, 'No', 0, [option.option], this.slideDuration);
                    }
                }
            }
            if (option.cardinality === Cardinality.multiple) {
                const responseDeclaration = this.questions[currentIndex].responseDeclaration;
                const outcomeDeclaration = this.questions[currentIndex].outcomeDeclaration;
                const currentScore = this.utilService.getMultiselectScore(option.option, responseDeclaration, this.isShuffleQuestions, outcomeDeclaration);
                this.showAlert = true;
                if (currentScore === 0) {
                    if (!this.isAssessEventRaised) {
                        this.isAssessEventRaised = true;
                        this.viewerService.raiseAssesEvent(edataItem, currentIndex + 1, 'No', 0, [option.option], this.slideDuration);
                    }
                    this.alertType = 'wrong';
                    this.updateScoreBoard(currentIndex, 'wrong');
                }
                else {
                    this.updateScoreBoard(currentIndex, 'correct', undefined, currentScore);
                    if (!this.isAssessEventRaised) {
                        this.isAssessEventRaised = true;
                        this.viewerService.raiseAssesEvent(edataItem, currentIndex + 1, 'Yes', currentScore, [option.option], this.slideDuration);
                    }
                    if (this.showFeedBack)
                        this.correctFeedBackTimeOut(type);
                    this.alertType = 'correct';
                }
            }
            this.optionSelectedObj = undefined;
        }
        else if ((isQuestionSkipAllowed) || isSubjectiveQuestion || onStartPage || isActive) {
            if (!_.isUndefined(type)) {
                this.nextSlide();
            }
        }
        else if (this.startPageInstruction && !this.optionSelectedObj && !this.active && !this.allowSkip &&
            this.myCarousel.getCurrentSlideIndex() > 0 && this.utilService.getQuestionType(this.questions, currentIndex) === QuestionType.mcq
            && this.utilService.canGo(this.progressBarClass[this.myCarousel.getCurrentSlideIndex()])) {
            this.infoPopupTimeOut();
        }
        else if (!this.optionSelectedObj && !this.active && !this.allowSkip && this.myCarousel.getCurrentSlideIndex() >= 0
            && this.utilService.getQuestionType(this.questions, currentIndex) === QuestionType.mcq
            && this.utilService.canGo(this.progressBarClass[this.myCarousel.getCurrentSlideIndex()])) {
            this.infoPopupTimeOut();
        }
    }
    infoPopupTimeOut() {
        this.infoPopup = true;
        setTimeout(() => {
            this.infoPopup = false;
        }, 2000);
    }
    correctFeedBackTimeOut(type) {
        this.intervalRef = setTimeout(() => {
            if (this.showAlert) {
                this.showAlert = false;
                if (!this.myCarousel.isLast(this.myCarousel.getCurrentSlideIndex()) && type === 'next') {
                    this.nextSlide();
                }
                else if (type === 'previous' && !this.stopAutoNavigation) {
                    this.prevSlide();
                }
                else if (type === 'jump' && !this.stopAutoNavigation) {
                    this.goToSlide(this.jumpSlideIndex);
                }
                else if (this.myCarousel.isLast(this.myCarousel.getCurrentSlideIndex())) {
                    this.endPageReached = true;
                    this.emitSectionEnd();
                }
            }
        }, 4000);
    }
    goToSlide(index) {
        this.viewerService.raiseHeartBeatEvent(eventName.goToQuestion, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        this.disableNext = false;
        this.currentSlideIndex = index;
        this.showRootInstruction = false;
        if (index === 0) {
            this.optionSelectedObj = undefined;
            this.myCarousel.selectSlide(0);
            this.active = this.currentSlideIndex === 0 && this.sectionIndex === 0 && this.showStartPage;
            this.showRootInstruction = true;
            /* istanbul ignore else */
            if (!this.sectionConfig.metadata?.children?.length) {
                this.disableNext = true;
            }
            return;
        }
        this.currentQuestionsMedia = _.get(this.questions[this.currentSlideIndex - 1], 'media');
        this.setSkippedClass(this.currentSlideIndex - 1);
        /* istanbul ignore else */
        if (!this.initializeTimer) {
            this.initializeTimer = true;
        }
        if (this.questions[index - 1] === undefined) {
            this.showQuestions = false;
            this.viewerService.getQuestions(0, index);
            this.currentSlideIndex = index;
        }
        else if (this.questions[index - 1] !== undefined) {
            this.myCarousel.selectSlide(index);
        }
        this.setImageZoom();
        this.currentSolutions = undefined;
        this.highlightQuestion();
    }
    goToQuestion(event) {
        this.active = false;
        this.showRootInstruction = false;
        this.disableNext = false;
        this.initializeTimer = true;
        const index = event.questionNo;
        this.viewerService.getQuestions(0, index);
        this.currentSlideIndex = index;
        this.myCarousel.selectSlide(index);
        this.highlightQuestion();
    }
    highlightQuestion() {
        const currentQuestion = this.questions[this.currentSlideIndex - 1];
        const questionType = currentQuestion?.qType?.toUpperCase();
        const element = document.getElementById(currentQuestion?.identifier);
        if (element && questionType) {
            let questionTitleElement;
            switch (questionType) {
                case QuestionType.mcq:
                    questionTitleElement = element.querySelector('.mcq-title');
                    break;
                default:
                    questionTitleElement = element.querySelector('.question-container');
            }
            if (questionTitleElement) {
                setTimeout(() => {
                    questionTitleElement.focus({ preventScroll: true });
                }, 0);
            }
        }
    }
    getSolutions() {
        this.showAlert = false;
        this.viewerService.raiseHeartBeatEvent(eventName.showAnswer, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        this.viewerService.raiseHeartBeatEvent(eventName.showAnswer, TelemetryType.impression, this.myCarousel.getCurrentSlideIndex());
        const currentIndex = this.myCarousel.getCurrentSlideIndex() - 1;
        this.currentQuestion = this.questions[currentIndex].body;
        this.currentOptions = this.questions[currentIndex].interactions.response1.options;
        this.currentQuestionsMedia = _.get(this.questions[currentIndex], 'media');
        setTimeout(() => {
            this.setImageZoom();
        });
        setTimeout(() => {
            this.setImageHeightWidthClass();
        }, 100);
        /* istanbul ignore else */
        if (this.currentSolutions) {
            this.showSolution = true;
        }
        this.clearTimeInterval();
    }
    viewSolution() {
        this.viewerService.raiseHeartBeatEvent(eventName.viewSolutionClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        this.showSolution = true;
        this.showAlert = false;
        this.currentQuestionsMedia = _.get(this.questions[this.myCarousel.getCurrentSlideIndex() - 1], 'media');
        setTimeout(() => {
            this.setImageZoom();
            this.setImageHeightWidthClass();
        });
        clearTimeout(this.intervalRef);
    }
    closeSolution() {
        this.setImageZoom();
        this.viewerService.raiseHeartBeatEvent(eventName.solutionClosed, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        this.showSolution = false;
        this.myCarousel.selectSlide(this.currentSlideIndex);
        this.focusOnNextButton();
    }
    viewHint() {
        this.viewerService.raiseHeartBeatEvent(eventName.viewHint, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
    }
    onAnswerKeyDown(event) {
        /* istanbul ignore else */
        if (event.key === 'Enter') {
            event.stopPropagation();
            this.getSolutions();
        }
    }
    showAnswerClicked(event, question) {
        /* istanbul ignore else */
        if (event?.showAnswer) {
            this.focusOnNextButton();
            this.active = true;
            this.progressBarClass[this.myCarousel.getCurrentSlideIndex() - 1].class = 'correct';
            this.updateScoreForShuffledQuestion();
            /* istanbul ignore else */
            if (question) {
                const index = this.questions.findIndex(que => que.identifier === question.identifier);
                /* istanbul ignore else */
                if (index > -1) {
                    this.questions[index].isAnswerShown = true;
                    this.viewerService.updateSectionQuestions(this.sectionConfig.metadata.identifier, this.questions);
                }
            }
            this.viewerService.raiseHeartBeatEvent(eventName.showAnswer, TelemetryType.interact, pageId.shortAnswer);
            this.viewerService.raiseHeartBeatEvent(eventName.pageScrolled, TelemetryType.impression, this.myCarousel.getCurrentSlideIndex() - 1);
        }
    }
    getScore(currentIndex, key, isCorrectAnswer, selectedOption) {
        /* istanbul ignore else */
        if (isCorrectAnswer) {
            if (this.isShuffleQuestions) {
                return DEFAULT_SCORE;
            }
            return this.questions[currentIndex].outcomeDeclaration.maxScore.defaultValue ?
                this.questions[currentIndex].outcomeDeclaration.maxScore.defaultValue : DEFAULT_SCORE;
        }
        else {
            const selectedOptionValue = selectedOption.option.value;
            const mapping = this.questions[currentIndex].responseDeclaration.mapping;
            let score = 0;
            /* istanbul ignore else */
            if (mapping) {
                mapping.forEach((val) => {
                    if (selectedOptionValue === val.value) {
                        score = val.score || 0;
                        if (val.score) {
                            this.progressBarClass[currentIndex].class = 'partial';
                        }
                    }
                });
            }
            return score;
        }
    }
    calculateScore() {
        return this.progressBarClass.reduce((accumulator, element) => accumulator + element.score, 0);
    }
    updateScoreBoard(index, classToBeUpdated, optionValue, score) {
        this.progressBarClass.forEach((ele) => {
            if (ele.index - 1 === index) {
                ele.class = classToBeUpdated;
                ele.score = score ? score : 0;
                /* istanbul ignore else */
                if (!this.showFeedBack) {
                    ele.value = optionValue;
                }
            }
        });
    }
    /* End of score methods  */
    /* Start of Image zoom related */
    setImageHeightWidthClass() {
        document.querySelectorAll('[data-asset-variable]').forEach(image => {
            image.removeAttribute('class');
            if (image.clientHeight > image.clientWidth) {
                image.setAttribute('class', 'portrait');
            }
            else if (image.clientHeight < image.clientWidth) {
                image.setAttribute('class', 'landscape');
            }
            // } else {
            //   image.setAttribute('class', 'neutral');
            // }
        });
    }
    setImageZoom() {
        const index = this.myCarousel.getCurrentSlideIndex() - 1;
        const currentQuestionId = this.questions[index]?.identifier;
        document.querySelectorAll('[data-asset-variable]').forEach(image => {
            if (image.nodeName.toLowerCase() !== 'img') {
                return;
            }
            const imageId = image.getAttribute('data-asset-variable');
            image.setAttribute('class', 'option-image');
            image.setAttribute('id', imageId);
            _.forEach(this.currentQuestionsMedia, (val) => {
                if (imageId === val.id) {
                    if (this.parentConfig.isAvailableLocally && this.parentConfig.baseUrl) {
                        let baseUrl = this.parentConfig.baseUrl;
                        baseUrl = `${baseUrl.substring(0, baseUrl.lastIndexOf('/'))}/${this.sectionConfig.metadata.identifier}`;
                        if (currentQuestionId) {
                            image['src'] = `${baseUrl}/${currentQuestionId}/${val.src}`;
                        }
                    }
                    else if (val.baseUrl) {
                        image['src'] = val.baseUrl + val.src;
                    }
                }
            });
            const divElement = document.createElement('div');
            divElement.setAttribute('class', 'magnify-icon');
            divElement.onclick = (event) => {
                this.viewerService.raiseHeartBeatEvent(eventName.zoomClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
                this.zoomImgSrc = image['src'];
                this.showZoomModal = true;
                const zoomImage = document.getElementById('imageModal');
                if (zoomImage.clientHeight > image.clientWidth) {
                    zoomImage.setAttribute('class', 'portrait');
                }
                else if (image.clientHeight < image.clientWidth) {
                    zoomImage.setAttribute('class', 'landscape');
                }
                else {
                    zoomImage.setAttribute('class', 'neutral');
                }
                event.stopPropagation();
            };
            image.parentNode.insertBefore(divElement, image.nextSibling);
        });
    }
    zoomIn() {
        this.viewerService.raiseHeartBeatEvent(eventName.zoomInClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        this.imageZoomCount = this.imageZoomCount + 10;
        this.setImageModalHeightWidth();
    }
    zoomOut() {
        this.viewerService.raiseHeartBeatEvent(eventName.zoomOutClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        /* istanbul ignore else */
        if (this.imageZoomCount > 100) {
            this.imageZoomCount = this.imageZoomCount - 10;
            this.setImageModalHeightWidth();
        }
    }
    setImageModalHeightWidth() {
        this.imageModal.nativeElement.style.width = `${this.imageZoomCount}%`;
        this.imageModal.nativeElement.style.height = `${this.imageZoomCount}%`;
    }
    closeZoom() {
        this.viewerService.raiseHeartBeatEvent(eventName.zoomCloseClicked, TelemetryType.interact, this.myCarousel.getCurrentSlideIndex());
        document.getElementById('imageModal').removeAttribute('style');
        this.showZoomModal = false;
    }
    /* End of Image zoom related */
    clearTimeInterval() {
        if (this.intervalRef) {
            clearTimeout(this.intervalRef);
        }
    }
    ngOnDestroy() {
        this.destroy$.next(true);
        this.destroy$.unsubscribe();
        this.errorService.getInternetConnectivityError.unsubscribe();
    }
    /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SectionPlayerComponent, deps: [{ token: i1.ViewerService }, { token: i2.UtilService }, { token: i0.ChangeDetectorRef }, { token: i3.ErrorService }], target: i0.ɵɵFactoryTarget.Component }); }
    /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SectionPlayerComponent, selector: "quml-section-player", inputs: { sectionConfig: "sectionConfig", attempts: "attempts", jumpToQuestion: "jumpToQuestion", mainProgressBar: "mainProgressBar", sectionIndex: "sectionIndex", parentConfig: "parentConfig" }, outputs: { playerEvent: "playerEvent", sectionEnd: "sectionEnd", showScoreBoard: "showScoreBoard" }, host: { listeners: { "window:beforeunload": "ngOnDestroy()" } }, viewQueries: [{ propertyName: "myCarousel", first: true, predicate: ["myCarousel"], descendants: true }, { propertyName: "imageModal", first: true, predicate: ["imageModal"], descendants: true, static: true }, { propertyName: "questionSlide", first: true, predicate: ["questionSlide"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"quml-container\" *ngIf=\"loadView\" [hidden]=\"showZoomModal\">\n  <div [hidden]=\"showSolution\" class=\"quml-landscape\">\n    <quml-header class=\"main-header\" (durationEnds)=\"durationEnds()\" [disablePreviousNavigation]=\"linearNavigation\"\n      [duration]=\"timeLimit\" [warningTime]=\"warningTime\" [showWarningTimer]=\"showWarningTimer\" [showTimer]=\"showTimer\" [showLegend]=\"parentConfig?.showLegend\"\n      (nextSlideClicked)=\"nextSlideClicked($event)\" (prevSlideClicked)=\"previousSlideClicked($event)\"\n      [currentSlideIndex]=\"currentSlideIndex\" [totalNoOfQuestions]=\"noOfQuestions\" [active]=\"active\"\n      [showFeedBack]=\"showFeedBack\" [currentSolutions]=\"currentSolutions\" (showSolution)=\"viewSolution()\"\n      [initializeTimer]=\"initializeTimer\" [replayed]=\"parentConfig?.isReplayed\" [disableNext]=\"disableNext\"\n      [startPageInstruction]=\"startPageInstruction\" [attempts]=\"attempts\" [showStartPage]=\"showStartPage\"\n      [showDeviceOrientation]=\"sectionConfig?.config?.showDeviceOrientation\" (toggleScreenRotate)=\"toggleScreenRotate()\">\n    </quml-header>\n\n    <div class=\"landscape-mode\">\n      <div class=\"lanscape-mode-left\">\n        <div class=\"current-slide\" *ngIf=\"currentSlideIndex !== 0\">\n          {{myCarousel.getCurrentSlideIndex()}}/{{noOfQuestions}}\n        </div>\n        <div *ngIf=\"currentSolutions && showUserSolution\">\n          <quml-ans (click)=\"getSolutions()\" (keydown)=\"onAnswerKeyDown($event)\"></quml-ans>\n        </div>\n      </div>\n      <div class=\"landscape-content\">\n        <carousel class=\"landscape-center\" [interval]=\"0\" [showIndicators]=\"false\" [noWrap]=\"true\" #myCarousel\n          (activeSlideChange)=\"activeSlideChange($event)\">\n          <slide>\n            <quml-startpage\n              [instructions]=\"showRootInstruction ? parentConfig?.instructions : sectionConfig.metadata?.instructions\"\n              [points]=\"points\" [time]=\"showRootInstruction ? timeLimit : null\" [showTimer]=\"showTimer\"\n              [totalNoOfQuestions]=\"showRootInstruction ? parentConfig?.questionCount : noOfQuestions\"\n              [contentName]=\"showRootInstruction ? parentConfig?.contentName : parentConfig?.isSectionsAvailable ? sectionConfig?.metadata?.name : parentConfig?.contentName\">\n            </quml-startpage>\n          </slide>\n          <slide *ngFor=\"let question of questions; let i= index\" #questionSlide>\n            <div [id]=\"question.identifier\">\n              <div *ngIf=\"question?.primaryCategory.toLowerCase() === 'multiple choice question'\">\n                <quml-mcq [shuffleOptions]='shuffleOptions' [question]='question' [replayed]=\"parentConfig?.isReplayed\"\n                  (optionSelected)=\"getOptionSelected($event)\" [identifier]=\"question.id\" [tryAgain]=\"tryAgainClicked\">\n                </quml-mcq>\n              </div>\n              <div *ngIf=\"question?.primaryCategory.toLowerCase() === 'subjective question'\">\n                <quml-sa [questions]='question' [replayed]=\"parentConfig?.isReplayed\" [baseUrl]=\"parentConfig?.baseUrl\"\n                  (showAnswerClicked)=\"showAnswerClicked($event, question)\">\n                </quml-sa>\n              </div>\n            </div>\n          </slide>\n        </carousel>\n      </div>\n      <div class=\"lanscape-mode-right\">\n        <ul>\n          <ng-container>\n            <li class=\"showFeedBack-progressBar info-page hover-effect\" tabindex=\"0\"\n              [ngClass]=\"(currentSlideIndex === 0) ? 'att-color progressBar-border': 'att-color' \"\n              (keydown)=\"onEnter($event, 0)\" (click)=\"goToSlideClicked($event, 0)\">i\n            </li>\n            <li>\n              <ul *ngIf=\"parentConfig?.isSectionsAvailable\" class=\"scoreboard-sections\">\n                <li class=\"section relative\" *ngFor=\"let section of mainProgressBar; let i=index;\"\n                  attr.aria-label=\"section {{section?.index}}\" (click)=\"jumpToSection(section?.identifier)\"\n                  (keydown)=\"onSectionEnter($event, section?.identifier)\"\n                  [ngClass]=\"{'attempted' : section.class === 'attempted', 'partial': section.class === 'partial'}\">\n                  <label for=\"list-item-{{i}}\" class=\"progressBar-border\"\n                    [ngClass]=\"{'active' : section?.isActive && !showRootInstruction && section.class !== 'attempted'}\"\n                    tabindex=\"0\">{{section?.index}}</label>\n                  <ul *ngIf=\"section?.isActive && showFeedBack\">\n                    <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                      attr.aria-label=\"question number {{question?.index}}\"\n                      (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                      class=\"showFeedBack-progressBar\"\n                      [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'progressBar-border ' + question.class) : question.class\">\n                      {{question?.index}}\n                    </li>\n                  </ul>\n                  <ul class=\"nonFeedback\" *ngIf=\"section?.isActive && !showFeedBack\">\n                    <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                      attr.aria-label=\"question number {{question?.index}}\"\n                      (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                      class=\"showFeedBack-progressBar\"\n                      [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'att-color progressBar-border') : question.class === 'skipped' ? question.class: question.class === 'unattempted' ? '' : 'att-color'\">\n                      {{question?.index}}\n                    </li>\n                  </ul>\n                </li>\n              </ul>\n            </li>\n            <li>\n              <ul class=\"singleContent\" *ngIf=\"!parentConfig?.isSectionsAvailable && showFeedBack\">\n                <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                  attr.aria-label=\"question number {{question?.index}}\"\n                  (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                  class=\"showFeedBack-progressBar hover-effect\"\n                  [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'progressBar-border ' + question.class) : question.class\">\n                  {{question?.index}}\n                </li>\n              </ul>\n            </li>\n            <li>\n              <ul class=\"singleContent nonFeedback\" *ngIf=\"!parentConfig?.isSectionsAvailable && !showFeedBack\">\n                <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                  attr.aria-label=\"question number {{question?.index}}\"\n                  (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                  class=\"showFeedBack-progressBar hover-effect\"\n                  [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'att-color progressBar-border') : question.class === 'skipped' ? question.class: question.class === 'unattempted' ? '' : 'att-color'\">\n                  {{question?.index}}\n                </li>\n              </ul>\n            </li>\n            <li class=\"requiresSubmit cursor-pointer showFeedBack-progressBar hover-effect\" tabindex=\"0\"\n              aria-label=\"scoreboard\" *ngIf=\"parentConfig.requiresSubmit && progressBarClass?.length\"\n              (click)=\"disableNext = true; onScoreBoardClicked()\" (keydown)=\"onScoreBoardEnter($event)\">\n              <img src=\"./assets/flag_inactive.svg\" alt=\"Flag logo: Show scoreboard\">\n            </li>\n            <!-- <li class=\"requiresSubmit\" *ngIf=\"loadScoreBoard && parentConfig.requiresSubmit\">\n              <img src=\"./assets/flag_active.svg\" alt=\"\">\n            </li> -->\n          </ng-container>\n        </ul>\n      </div>\n    </div>\n  </div>\n\n  <quml-alert *ngIf=\"showAlert && showFeedBack\" [alertType]=\"alertType\" [isHintAvailable]=\"showHints\"\n    [showSolutionButton]=\"showUserSolution && currentSolutions\" (showSolution)=\"viewSolution()\" (showHint)=\"viewHint()\"\n    (closeAlert)=\"closeAlertBox($event)\"></quml-alert>\n\n  <quml-mcq-solutions *ngIf=\"showSolution\" [question]=\"currentQuestion\" [options]=\"currentOptions\"\n    [solutions]=\"currentSolutions\" [baseUrl]=\"parentConfig?.baseUrl\" [media]=\"media\" [identifier]=\"currentQuestionIndetifier\" (close)=\"closeSolution()\"></quml-mcq-solutions>\n</div>\n\n<div class=\"info-popup\" *ngIf=\"infoPopup\">\n  Please attempt the question\n</div>\n\n<sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\n\n\n<!-- Zoom -->\n<div class=\"image-viewer__overlay\" [hidden]=\"!showZoomModal\">\n  <div class=\"image-viewer__close\" (click)=\"closeZoom()\">\n  </div>\n  <div class=\"image-viewer__container\">\n    <img #imageModal id=\"imageModal\" class=\"image-viewer__img\" [src]=\"zoomImgSrc\" alt=\"Zoomed image\">\n  </div>\n  <div class=\"image-viewer__zoom\">\n    <div class=\"image-viewer__zoomin\" (click)=\"zoomIn()\"></div>\n    <div class=\"image-viewer__zoomout\" (click)=\"zoomOut()\"></div>\n  </div>\n</div>", styles: ["@charset \"UTF-8\";::ng-deep :root{--quml-scoreboard-sub-title: #6d7278;--quml-scoreboard-skipped: #969696;--quml-scoreboard-unattempted: #575757;--quml-color-success: #08bc82;--quml-color-danger: #f1635d;--quml-color-primary-contrast: #333;--quml-btn-border: #ccc;--quml-heder-text-color: #6250f5;--quml-header-bg-color: #c2c2c2;--quml-mcq-title-txt: #131415;--quml-zoom-btn-txt: #eee;--quml-zoom-btn-hover: #f2f2f2;--quml-main-bg: #fff;--quml-btn-color: #fff;--quml-question-bg: #fff}.quml-header{background:var(--quml-header-bg-color);display:flow-root;height:2.25rem;position:fixed}.quml-container{overflow:hidden;width:100%;height:100%;position:relative}.quml-landscape{width:100%;height:100%}::ng-deep .carousel{outline:none}.col{padding-left:0;padding-right:0}.quml-button{background-color:var(--primary-color);border:none;color:var(--quml-btn-color);padding:.25rem;text-align:center;text-decoration:none;font-size:1rem;margin:.125rem .5rem .125rem .125rem;cursor:pointer;width:3rem;height:2.5rem;border-radius:10%}.landscape-mode{height:100%;width:100%;position:relative;background-color:var(--quml-main-bg)}.landscape-content{padding:2.5rem 4rem 0;overflow:auto;height:100%;width:100%}@media only screen and (max-width: 480px){.landscape-content{padding:5rem 1rem 0;height:calc(100% - 3rem)}}.lanscape-mode-left{position:absolute;left:0;top:3.5rem;text-align:center;z-index:1;width:4rem}.lanscape-mode-left div{padding-bottom:1.5rem}.landscape-center{width:100%}.lanscape-mode-right{-ms-overflow-style:none;scrollbar-width:none;position:absolute;padding:0 1rem;right:.5rem;color:var(--quml-scoreboard-unattempted);font-size:.75rem;height:calc(100% - 4rem);overflow-y:auto;top:3.5rem}.lanscape-mode-right ul{list-style:none;margin-top:.5rem;padding:0;text-align:center;position:relative}.lanscape-mode-right ul:before{content:\"\";width:.0625rem;height:100%;position:absolute;left:0;right:0;background-color:#cccccc80;z-index:1;margin:0 auto}.lanscape-mode-right ul li{position:relative;z-index:2}.lanscape-mode-right ul li.requiresSubmit{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted);border-radius:50%;width:1.25rem;height:1.25rem;background:var(--white)}.lanscape-mode-right ul li.requiresSubmit:hover{border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .singleContent.nonFeedback li:hover{border:1px solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul .singleContent.nonFeedback li.att-color{color:var(--white);background:var(--primary-color)}.lanscape-mode-right ul .section ul.nonFeedback li:hover{border:1px solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul .section ul.nonFeedback li.att-color{color:var(--white);background:var(--primary-color)}.lanscape-mode-right ul .section ul li:hover:after,.lanscape-mode-right ul .section ul li:focus:after,.lanscape-mode-right ul .section ul li.progressBar-border:after{border:1px solid var(--primary-color);content:\"\";width:1.65rem;height:1.65rem;border-radius:50%;padding:.25rem;position:absolute}.lanscape-mode-right ul .section.attempted:after{content:\"\";display:inline-block;transform:rotate(45deg);height:.6rem;width:.3rem;border-bottom:.12rem solid var(--primary-color);border-right:.12rem solid var(--primary-color);position:absolute;top:.25rem;right:-.7rem}.lanscape-mode-right ul .section.correct:after,.lanscape-mode-right ul .section.wrong:after,.lanscape-mode-right ul .section.partial:after{content:\"\";position:absolute;top:.525rem;right:-.7rem;height:.375rem;width:.375rem;border-radius:.375rem}.lanscape-mode-right ul .section.correct:after{--correct-bg: var(--quml-color-success);background:var(--correct-bg)}.lanscape-mode-right ul .section.wrong:after{--wrong-bg: var(--quml-color-danger);background:var(--wrong-bg)}.lanscape-mode-right ul .section.partial:after{--partial-bg: linear-gradient( 180deg, rgba(71, 164, 128, 1) 0%, rgba(71, 164, 128, 1) 50%, rgba(249, 122, 116, 1) 50%, rgba(249, 122, 116, 1) 100% );background:var(--partial-bg)}.lanscape-mode-right ul .section.attempted label,.lanscape-mode-right ul .section.partial label{color:var(--white)!important;background:var(--primary-color);border:.03125rem solid var(--primary-color)}.lanscape-mode-right ul .section label{background-color:var(--quml-question-bg);border-radius:.25rem;width:1.25rem;padding:.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted);margin-bottom:2.25rem;cursor:pointer}.lanscape-mode-right ul .section label.requiresSubmit{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted);border-radius:50%;background:var(--white)}.lanscape-mode-right ul .section label.requiresSubmit:hover{border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .section label.active,.lanscape-mode-right ul .section label:hover,.lanscape-mode-right ul .section label:focus{color:var(--primary-color);border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .section label.active:after,.lanscape-mode-right ul .section label:hover:after,.lanscape-mode-right ul .section label:focus:after{border:1px solid var(--primary-color);content:\"\";height:1.65rem;border-radius:.25rem;position:absolute;width:1.65rem;background:var(--quml-question-bg);z-index:-1}.lanscape-mode-right ul .section label.skipped{color:var(--white);background:var(--quml-scoreboard-skipped);border:.0625rem solid var(--quml-scoreboard-skipped)}.lanscape-mode-right ul .section label.unattempted{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted)}.lanscape-mode-right ul .section label.unattempted:hover{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul input[type=checkbox]{display:none}.lanscape-mode-right ul input[type=checkbox]~ul{height:0;transform:scaleY(0)}.lanscape-mode-right ul input[type=checkbox]:checked~ul{height:100%;transform-origin:top;transition:transform .2s ease-out;transform:scaleY(1)}.lanscape-mode-right ul .section input[type=checkbox]:checked~label{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar{background-color:var(--quml-question-bg);border-radius:50%;width:1.25rem;padding:.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;border:.0625rem solid rgb(204,204,204);margin-bottom:2.25rem;cursor:pointer}.lanscape-mode-right ul .showFeedBack-progressBar.requiresSubmit:hover{border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar.progressBar-border,.lanscape-mode-right ul .showFeedBack-progressBar .active,.lanscape-mode-right ul .showFeedBack-progressBar.att-color{color:var(--primary-color);border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar.info-page{color:var(--white);background:var(--primary-color);border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar.skipped{color:var(--white);background:var(--quml-scoreboard-skipped);border:.0625rem solid var(--quml-scoreboard-skipped)}.lanscape-mode-right ul .showFeedBack-progressBar.skipped:hover{color:var(--white)!important}.lanscape-mode-right ul .showFeedBack-progressBar.partial,.lanscape-mode-right ul .showFeedBack-progressBar.wrong,.lanscape-mode-right ul .showFeedBack-progressBar.correct{color:var(--white);border:0px solid transparent}.lanscape-mode-right ul .showFeedBack-progressBar.correct{--correct-bg: var(--quml-color-success);background:var(--correct-bg)}.lanscape-mode-right ul .showFeedBack-progressBar.wrong{--wrong-bg: var(--quml-color-danger);background:var(--wrong-bg)}.lanscape-mode-right ul .showFeedBack-progressBar.partial{--partial-bg: linear-gradient( 180deg, rgba(71, 164, 128, 1) 0%, rgba(71, 164, 128, 1) 50%, rgba(249, 122, 116, 1) 50%, rgba(249, 122, 116, 1) 100% );background:var(--partial-bg)}.lanscape-mode-right ul .showFeedBack-progressBar.unattempted{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted)}.lanscape-mode-right ul .showFeedBack-progressBar.unattempted:hover{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.current-slide{color:var(--quml-scoreboard-sub-title);font-size:.875rem;font-weight:900;letter-spacing:0}@media only screen and (max-width: 480px){.lanscape-mode-right{background:var(--white);display:flex;align-items:center;overflow-x:auto;overflow-y:hidden;width:90%;height:2.5rem;padding:1rem 0 0;margin:auto;left:0}.lanscape-mode-right ul{list-style:none;padding:0;text-align:center;position:relative;display:flex;height:1.5rem;margin-top:0}.lanscape-mode-right ul .showFeedBack-progressBar{margin-right:2.25rem;z-index:1}.lanscape-mode-right ul .showFeedBack-progressBar:last-child{margin-right:0}.lanscape-mode-right ul .singleContent{display:flex}.lanscape-mode-right ul .singleContent .showFeedBack-progressBar:last-child{margin-right:2.25rem}.lanscape-mode-right ul .section ul{top:-1.75rem;position:inherit;margin:.5rem 2.25rem;padding-left:1.25rem}.lanscape-mode-right ul .section ul:before{background:transparent}.lanscape-mode-right ul .section.attempted:after{content:\"\";top:-.8125rem;right:auto;left:.625rem}.lanscape-mode-right ul .section.correct:after{content:\"\";top:-.525rem;left:.5rem;right:auto}.lanscape-mode-right ul .section.wrong:after{content:\"\";top:-.525rem;left:.5rem;right:auto}.lanscape-mode-right ul .section.partial:after{content:\"\";top:-.525rem;left:.5rem;right:auto}.lanscape-mode-right ul .section label{margin-right:2.25rem;margin-bottom:0}.lanscape-mode-right ul:before{content:\"\";width:100%;height:.0625rem;position:absolute;left:0;top:50%;transform:translateY(-50%);right:0;background-color:#cccccc80;z-index:0;margin:0 auto}.lanscape-mode-right ul input[type=checkbox]~ul{width:0;transform:scaleX(0);margin:0}.lanscape-mode-right ul input[type=checkbox]:checked~ul{width:calc(100% - 4rem);transform-origin:left;transition:transform .2s ease-out;transform:scaleX(1);margin:-1.25rem 3rem 0 4rem}.landscape-center{margin-top:2rem}.lanscape-mode-left{display:none}.landscape-mode{grid-template-areas:\"right right right\" \"center center center\" \"left left left\"}}.quml-timer{padding:.5rem}.quml-header-text{margin:.5rem;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.quml-arrow-button{border-radius:28%;font-size:0%;outline:none;background-color:var(--primary-color);padding:.5rem}.info-popup{position:absolute;top:18%;right:10%;font-size:.875rem;box-shadow:0 .125rem .875rem #0000001a;padding:.75rem}.quml-menu{width:1.5rem;height:1.5rem}.quml-card{background-color:var(--white);padding:1.25rem;box-shadow:0 .25rem .5rem #0003;width:25%;position:absolute;left:37%;text-align:center;top:25%;z-index:2}.quml-card-title{font-size:1.25rem;text-align:center}.quml-card-body .wrong{color:red}.quml-card-body .right{color:green}.quml-card-button-section .button-container button{color:var(--white);background-color:var(--primary-color);border-color:var(--primary-color);outline:none;font-size:.875rem;padding:.25rem 1.5rem}.quml-card-button-section .button-container{width:40%;display:inline;padding-right:.75rem}::ng-deep .carousel.slide a.left.carousel-control.carousel-control-prev,::ng-deep .carousel.slide .carousel-control.carousel-control-next{display:none}::ng-deep .carousel-item{perspective:unset}.potrait-header-top{visibility:hidden;margin-top:-2.5rem}.potrait-header-top .wrapper{display:grid;grid-template-columns:1fr 15fr}.potrait-header-top .quml-menu{color:var(--quml-heder-text-color);font-size:1.5rem;padding-left:1.25rem;margin-top:.25rem}.potrait-header-top .quml-header-text{font-size:.875rem;color:var(--quml-heder-text-color)}.row{margin-right:0;margin-left:0}.portrait-header{visibility:hidden}.image-viewer__overlay,.image-viewer__container,.image-viewer__close,.image-viewer__zoom{position:absolute}.image-viewer__overlay{width:100%;height:100%;background:var(--quml-color-primary-contrast);z-index:11111}.image-viewer__container{background-color:var(--quml-color-primary-contrast);top:50%;left:50%;transform:translate(-50%,-50%);z-index:11111;width:80%;height:80%}.image-viewer__img{width:100%;height:100%}.image-viewer__close{top:1rem;right:1rem;text-align:center;cursor:pointer;z-index:999999;background:#00000080;border-radius:100%;width:3rem;height:3rem;position:inherit}.image-viewer__close:after{content:\"\\2715\";color:var(--white);font-size:2rem}.image-viewer__close:hover{background:#000}.image-viewer__zoom{bottom:1rem;right:1rem;width:2.5rem;height:auto;border-radius:.5rem;background:var(--white);display:flex;flex-direction:column;align-items:center;overflow:hidden;z-index:99999;position:inherit;border:.0625rem solid var(--quml-zoom-btn-txt)}.image-viewer__zoomin,.image-viewer__zoomout{text-align:center;height:2.5rem;position:relative;width:2.5rem;cursor:pointer}.image-viewer__zoomin:hover,.image-viewer__zoomout:hover{background-color:var(--quml-zoom-btn-hover)}.image-viewer__zoomin:after,.image-viewer__zoomout:after{font-size:1.5rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.image-viewer__zoomin{border-bottom:.0625rem solid var(--quml-btn-border)}.image-viewer__zoomin:after{content:\"+\"}.image-viewer__zoomout:after{content:\"\\2212\"}::ng-deep quml-ans{cursor:pointer}::ng-deep quml-ans svg circle{fill:var(--quml-zoom-btn-txt)}::ng-deep .magnify-icon{position:absolute;right:0;bottom:0;width:1.5rem;height:1.5rem;border-top-left-radius:.5rem;cursor:pointer;background-color:var(--quml-color-primary-contrast)}::ng-deep .magnify-icon:after{content:\"\";position:absolute;bottom:.125rem;right:.125rem;z-index:1;width:1rem;height:1rem;background-image:url(\"data:image/svg+xml,%3C%3Fxml version='1.0'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svgjs='http://svgjs.com/svgjs' version='1.1' width='512' height='512' x='0' y='0' viewBox='0 0 37.166 37.166' style='enable-background:new 0 0 512 512' xml:space='preserve' class=''%3E%3Cg%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M35.829,32.045l-6.833-6.833c-0.513-0.513-1.167-0.788-1.836-0.853c2.06-2.567,3.298-5.819,3.298-9.359 c0-8.271-6.729-15-15-15c-8.271,0-15,6.729-15,15c0,8.271,6.729,15,15,15c3.121,0,6.021-0.96,8.424-2.598 c0.018,0.744,0.305,1.482,0.872,2.052l6.833,6.833c0.585,0.586,1.354,0.879,2.121,0.879s1.536-0.293,2.121-0.879 C37.001,35.116,37.001,33.217,35.829,32.045z M15.458,25c-5.514,0-10-4.484-10-10c0-5.514,4.486-10,10-10c5.514,0,10,4.486,10,10 C25.458,20.516,20.972,25,15.458,25z M22.334,15c0,1.104-0.896,2-2,2h-2.75v2.75c0,1.104-0.896,2-2,2s-2-0.896-2-2V17h-2.75 c-1.104,0-2-0.896-2-2s0.896-2,2-2h2.75v-2.75c0-1.104,0.896-2,2-2s2,0.896,2,2V13h2.75C21.438,13,22.334,13.895,22.334,15z' fill='%23ffffff' data-original='%23000000' style='' class=''/%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A\");background-size:cover;background-repeat:no-repeat;background-position:center}::ng-deep .solution-options figure.image{border:.0625rem solid var(--quml-btn-border);overflow:hidden;border-radius:.25rem;position:relative}::ng-deep .solutions .solution-options figure.image,::ng-deep .image-viewer__overlay .image-viewer__container{display:flex;align-items:center;justify-content:center}::ng-deep .solutions .solution-options figure.image .portrait,::ng-deep .image-viewer__overlay .image-viewer__container .portrait{width:auto;height:100%}::ng-deep .solutions .solution-options figure.image .neutral,::ng-deep .image-viewer__overlay .image-viewer__container .neutral{width:auto;height:auto}@media only screen and (max-width: 768px){::ng-deep .solutions .solution-options figure.image .neutral,::ng-deep .image-viewer__overlay .image-viewer__container .neutral{width:100%}}@media only screen and (min-width: 768px){::ng-deep .solutions .solution-options figure.image .neutral,::ng-deep .image-viewer__overlay .image-viewer__container .neutral{height:100%}}::ng-deep .solutions .solution-options figure.image .landscape,::ng-deep .image-viewer__overlay .image-viewer__container .landscape{height:auto}::ng-deep .quml-mcq .mcq-title,::ng-deep .quml-sa .mcq-title,::ng-deep quml-sa .mcq-title,::ng-deep quml-mcq-solutions .mcq-title{color:var(--quml-mcq-title-txt)}::ng-deep .quml-mcq .mcq-title p,::ng-deep .quml-sa .mcq-title p,::ng-deep quml-sa .mcq-title p,::ng-deep quml-mcq-solutions .mcq-title p{word-break:break-word}@media only screen and (max-width: 480px){::ng-deep .quml-mcq .mcq-title,::ng-deep .quml-sa .mcq-title,::ng-deep quml-sa .mcq-title,::ng-deep quml-mcq-solutions .mcq-title{margin-top:1rem}}::ng-deep .quml-mcq .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep .quml-mcq .quml-mcq--option .quml-mcq-option-card p:last-child,::ng-deep .quml-sa .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep .quml-sa .quml-mcq--option .quml-mcq-option-card p:last-child,::ng-deep quml-sa .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep quml-sa .quml-mcq--option .quml-mcq-option-card p:last-child,::ng-deep quml-mcq-solutions .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep quml-mcq-solutions .quml-mcq--option .quml-mcq-option-card p:last-child{margin-bottom:0}::ng-deep quml-mcq-solutions figure.image,::ng-deep quml-mcq-solutions figure.image.resize-25,::ng-deep quml-mcq-solutions figure.image.resize-50,::ng-deep quml-mcq-solutions figure.image.resize-75,::ng-deep quml-mcq-solutions figure.image.resize-100,::ng-deep quml-mcq-solutions figure.image.resize-original{width:25%;height:auto}::ng-deep quml-mcq-solutions .solution-options p{margin-bottom:1rem}::ng-deep .quml-option .option p{word-break:break-word}.endPage-container-height{height:100%}.scoreboard-sections{display:contents}.scoreboard-sections li{position:relative;z-index:2}.hover-effect:hover:after,.hover-effect:focus:after,.hover-effect.progressBar-border:after{border:1px solid var(--primary-color);content:\"\";width:1.65rem;height:1.65rem;border-radius:50%;padding:.25rem;position:absolute}\n", "::ng-deep :root{--quml-mcq-title-txt: #131415}::ng-deep .startpage__instr-desc .mcq-title,::ng-deep .quml-mcq .mcq-title,::ng-deep .quml-sa .mcq-title,::ng-deep quml-sa .mcq-title,::ng-deep quml-mcq-solutions .mcq-title{color:var(--quml-mcq-title-txt)}::ng-deep .startpage__instr-desc .fs-8,::ng-deep .startpage__instr-desc .fs-9,::ng-deep .startpage__instr-desc .fs-10,::ng-deep .startpage__instr-desc .fs-11,::ng-deep .startpage__instr-desc .fs-12,::ng-deep .startpage__instr-desc .fs-13,::ng-deep .startpage__instr-desc .fs-14,::ng-deep .startpage__instr-desc .fs-15,::ng-deep .startpage__instr-desc .fs-16,::ng-deep .startpage__instr-desc .fs-17,::ng-deep .startpage__instr-desc .fs-18,::ng-deep .startpage__instr-desc .fs-19,::ng-deep .startpage__instr-desc .fs-20,::ng-deep .startpage__instr-desc .fs-21,::ng-deep .startpage__instr-desc .fs-22,::ng-deep .startpage__instr-desc .fs-23,::ng-deep .startpage__instr-desc .fs-24,::ng-deep .startpage__instr-desc .fs-25,::ng-deep .startpage__instr-desc .fs-26,::ng-deep .startpage__instr-desc .fs-27,::ng-deep .startpage__instr-desc .fs-28,::ng-deep .startpage__instr-desc .fs-29,::ng-deep .startpage__instr-desc .fs-30,::ng-deep .startpage__instr-desc .fs-36,::ng-deep .quml-mcq .fs-8,::ng-deep .quml-mcq .fs-9,::ng-deep .quml-mcq .fs-10,::ng-deep .quml-mcq .fs-11,::ng-deep .quml-mcq .fs-12,::ng-deep .quml-mcq .fs-13,::ng-deep .quml-mcq .fs-14,::ng-deep .quml-mcq .fs-15,::ng-deep .quml-mcq .fs-16,::ng-deep .quml-mcq .fs-17,::ng-deep .quml-mcq .fs-18,::ng-deep .quml-mcq .fs-19,::ng-deep .quml-mcq .fs-20,::ng-deep .quml-mcq .fs-21,::ng-deep .quml-mcq .fs-22,::ng-deep .quml-mcq .fs-23,::ng-deep .quml-mcq .fs-24,::ng-deep .quml-mcq .fs-25,::ng-deep .quml-mcq .fs-26,::ng-deep .quml-mcq .fs-27,::ng-deep .quml-mcq .fs-28,::ng-deep .quml-mcq .fs-29,::ng-deep .quml-mcq .fs-30,::ng-deep .quml-mcq .fs-36,::ng-deep .quml-sa .fs-8,::ng-deep .quml-sa .fs-9,::ng-deep .quml-sa .fs-10,::ng-deep .quml-sa .fs-11,::ng-deep .quml-sa .fs-12,::ng-deep .quml-sa .fs-13,::ng-deep .quml-sa .fs-14,::ng-deep .quml-sa .fs-15,::ng-deep .quml-sa .fs-16,::ng-deep .quml-sa .fs-17,::ng-deep .quml-sa .fs-18,::ng-deep .quml-sa .fs-19,::ng-deep .quml-sa .fs-20,::ng-deep .quml-sa .fs-21,::ng-deep .quml-sa .fs-22,::ng-deep .quml-sa .fs-23,::ng-deep .quml-sa .fs-24,::ng-deep .quml-sa .fs-25,::ng-deep .quml-sa .fs-26,::ng-deep .quml-sa .fs-27,::ng-deep .quml-sa .fs-28,::ng-deep .quml-sa .fs-29,::ng-deep .quml-sa .fs-30,::ng-deep .quml-sa .fs-36,::ng-deep quml-sa .fs-8,::ng-deep quml-sa .fs-9,::ng-deep quml-sa .fs-10,::ng-deep quml-sa .fs-11,::ng-deep quml-sa .fs-12,::ng-deep quml-sa .fs-13,::ng-deep quml-sa .fs-14,::ng-deep quml-sa .fs-15,::ng-deep quml-sa .fs-16,::ng-deep quml-sa .fs-17,::ng-deep quml-sa .fs-18,::ng-deep quml-sa .fs-19,::ng-deep quml-sa .fs-20,::ng-deep quml-sa .fs-21,::ng-deep quml-sa .fs-22,::ng-deep quml-sa .fs-23,::ng-deep quml-sa .fs-24,::ng-deep quml-sa .fs-25,::ng-deep quml-sa .fs-26,::ng-deep quml-sa .fs-27,::ng-deep quml-sa .fs-28,::ng-deep quml-sa .fs-29,::ng-deep quml-sa .fs-30,::ng-deep quml-sa .fs-36,::ng-deep quml-mcq-solutions .fs-8,::ng-deep quml-mcq-solutions .fs-9,::ng-deep quml-mcq-solutions .fs-10,::ng-deep quml-mcq-solutions .fs-11,::ng-deep quml-mcq-solutions .fs-12,::ng-deep quml-mcq-solutions .fs-13,::ng-deep quml-mcq-solutions .fs-14,::ng-deep quml-mcq-solutions .fs-15,::ng-deep quml-mcq-solutions .fs-16,::ng-deep quml-mcq-solutions .fs-17,::ng-deep quml-mcq-solutions .fs-18,::ng-deep quml-mcq-solutions .fs-19,::ng-deep quml-mcq-solutions .fs-20,::ng-deep quml-mcq-solutions .fs-21,::ng-deep quml-mcq-solutions .fs-22,::ng-deep quml-mcq-solutions .fs-23,::ng-deep quml-mcq-solutions .fs-24,::ng-deep quml-mcq-solutions .fs-25,::ng-deep quml-mcq-solutions .fs-26,::ng-deep quml-mcq-solutions .fs-27,::ng-deep quml-mcq-solutions .fs-28,::ng-deep quml-mcq-solutions .fs-29,::ng-deep quml-mcq-solutions .fs-30,::ng-deep quml-mcq-solutions .fs-36{line-height:normal}::ng-deep .startpage__instr-desc .fs-8,::ng-deep .quml-mcq .fs-8,::ng-deep .quml-sa .fs-8,::ng-deep quml-sa .fs-8,::ng-deep quml-mcq-solutions .fs-8{font-size:.5rem}::ng-deep .startpage__instr-desc .fs-9,::ng-deep .quml-mcq .fs-9,::ng-deep .quml-sa .fs-9,::ng-deep quml-sa .fs-9,::ng-deep quml-mcq-solutions .fs-9{font-size:.563rem}::ng-deep .startpage__instr-desc .fs-10,::ng-deep .quml-mcq .fs-10,::ng-deep .quml-sa .fs-10,::ng-deep quml-sa .fs-10,::ng-deep quml-mcq-solutions .fs-10{font-size:.625rem}::ng-deep .startpage__instr-desc .fs-11,::ng-deep .quml-mcq .fs-11,::ng-deep .quml-sa .fs-11,::ng-deep quml-sa .fs-11,::ng-deep quml-mcq-solutions .fs-11{font-size:.688rem}::ng-deep .startpage__instr-desc .fs-12,::ng-deep .quml-mcq .fs-12,::ng-deep .quml-sa .fs-12,::ng-deep quml-sa .fs-12,::ng-deep quml-mcq-solutions .fs-12{font-size:.75rem}::ng-deep .startpage__instr-desc .fs-13,::ng-deep .quml-mcq .fs-13,::ng-deep .quml-sa .fs-13,::ng-deep quml-sa .fs-13,::ng-deep quml-mcq-solutions .fs-13{font-size:.813rem}::ng-deep .startpage__instr-desc .fs-14,::ng-deep .quml-mcq .fs-14,::ng-deep .quml-sa .fs-14,::ng-deep quml-sa .fs-14,::ng-deep quml-mcq-solutions .fs-14{font-size:.875rem}::ng-deep .startpage__instr-desc .fs-15,::ng-deep .quml-mcq .fs-15,::ng-deep .quml-sa .fs-15,::ng-deep quml-sa .fs-15,::ng-deep quml-mcq-solutions .fs-15{font-size:.938rem}::ng-deep .startpage__instr-desc .fs-16,::ng-deep .quml-mcq .fs-16,::ng-deep .quml-sa .fs-16,::ng-deep quml-sa .fs-16,::ng-deep quml-mcq-solutions .fs-16{font-size:1rem}::ng-deep .startpage__instr-desc .fs-17,::ng-deep .quml-mcq .fs-17,::ng-deep .quml-sa .fs-17,::ng-deep quml-sa .fs-17,::ng-deep quml-mcq-solutions .fs-17{font-size:1.063rem}::ng-deep .startpage__instr-desc .fs-18,::ng-deep .quml-mcq .fs-18,::ng-deep .quml-sa .fs-18,::ng-deep quml-sa .fs-18,::ng-deep quml-mcq-solutions .fs-18{font-size:1.125rem}::ng-deep .startpage__instr-desc .fs-19,::ng-deep .quml-mcq .fs-19,::ng-deep .quml-sa .fs-19,::ng-deep quml-sa .fs-19,::ng-deep quml-mcq-solutions .fs-19{font-size:1.188rem}::ng-deep .startpage__instr-desc .fs-20,::ng-deep .quml-mcq .fs-20,::ng-deep .quml-sa .fs-20,::ng-deep quml-sa .fs-20,::ng-deep quml-mcq-solutions .fs-20{font-size:1.25rem}::ng-deep .startpage__instr-desc .fs-21,::ng-deep .quml-mcq .fs-21,::ng-deep .quml-sa .fs-21,::ng-deep quml-sa .fs-21,::ng-deep quml-mcq-solutions .fs-21{font-size:1.313rem}::ng-deep .startpage__instr-desc .fs-22,::ng-deep .quml-mcq .fs-22,::ng-deep .quml-sa .fs-22,::ng-deep quml-sa .fs-22,::ng-deep quml-mcq-solutions .fs-22{font-size:1.375rem}::ng-deep .startpage__instr-desc .fs-23,::ng-deep .quml-mcq .fs-23,::ng-deep .quml-sa .fs-23,::ng-deep quml-sa .fs-23,::ng-deep quml-mcq-solutions .fs-23{font-size:1.438rem}::ng-deep .startpage__instr-desc .fs-24,::ng-deep .quml-mcq .fs-24,::ng-deep .quml-sa .fs-24,::ng-deep quml-sa .fs-24,::ng-deep quml-mcq-solutions .fs-24{font-size:1.5rem}::ng-deep .startpage__instr-desc .fs-25,::ng-deep .quml-mcq .fs-25,::ng-deep .quml-sa .fs-25,::ng-deep quml-sa .fs-25,::ng-deep quml-mcq-solutions .fs-25{font-size:1.563rem}::ng-deep .startpage__instr-desc .fs-26,::ng-deep .quml-mcq .fs-26,::ng-deep .quml-sa .fs-26,::ng-deep quml-sa .fs-26,::ng-deep quml-mcq-solutions .fs-26{font-size:1.625rem}::ng-deep .startpage__instr-desc .fs-27,::ng-deep .quml-mcq .fs-27,::ng-deep .quml-sa .fs-27,::ng-deep quml-sa .fs-27,::ng-deep quml-mcq-solutions .fs-27{font-size:1.688rem}::ng-deep .startpage__instr-desc .fs-28,::ng-deep .quml-mcq .fs-28,::ng-deep .quml-sa .fs-28,::ng-deep quml-sa .fs-28,::ng-deep quml-mcq-solutions .fs-28{font-size:1.75rem}::ng-deep .startpage__instr-desc .fs-29,::ng-deep .quml-mcq .fs-29,::ng-deep .quml-sa .fs-29,::ng-deep quml-sa .fs-29,::ng-deep quml-mcq-solutions .fs-29{font-size:1.813rem}::ng-deep .startpage__instr-desc .fs-30,::ng-deep .quml-mcq .fs-30,::ng-deep .quml-sa .fs-30,::ng-deep quml-sa .fs-30,::ng-deep quml-mcq-solutions .fs-30{font-size:1.875rem}::ng-deep .startpage__instr-desc .fs-36,::ng-deep .quml-mcq .fs-36,::ng-deep .quml-sa .fs-36,::ng-deep quml-sa .fs-36,::ng-deep quml-mcq-solutions .fs-36{font-size:2.25rem}::ng-deep .startpage__instr-desc .text-left,::ng-deep .quml-mcq .text-left,::ng-deep .quml-sa .text-left,::ng-deep quml-sa .text-left,::ng-deep quml-mcq-solutions .text-left{text-align:left}::ng-deep .startpage__instr-desc .text-center,::ng-deep .quml-mcq .text-center,::ng-deep .quml-sa .text-center,::ng-deep quml-sa .text-center,::ng-deep quml-mcq-solutions .text-center{text-align:center}::ng-deep .startpage__instr-desc .text-right,::ng-deep .quml-mcq .text-right,::ng-deep .quml-sa .text-right,::ng-deep quml-sa .text-right,::ng-deep quml-mcq-solutions .text-right{text-align:right}::ng-deep .startpage__instr-desc .image-style-align-right,::ng-deep .quml-mcq .image-style-align-right,::ng-deep .quml-sa .image-style-align-right,::ng-deep quml-sa .image-style-align-right,::ng-deep quml-mcq-solutions .image-style-align-right{float:right;text-align:right;margin-left:.5rem}::ng-deep .startpage__instr-desc .image-style-align-left,::ng-deep .quml-mcq .image-style-align-left,::ng-deep .quml-sa .image-style-align-left,::ng-deep quml-sa .image-style-align-left,::ng-deep quml-mcq-solutions .image-style-align-left{float:left;text-align:left;margin-right:.5rem}::ng-deep .startpage__instr-desc .image,::ng-deep .startpage__instr-desc figure.image,::ng-deep .quml-mcq .image,::ng-deep .quml-mcq figure.image,::ng-deep .quml-sa .image,::ng-deep .quml-sa figure.image,::ng-deep quml-sa .image,::ng-deep quml-sa figure.image,::ng-deep quml-mcq-solutions .image,::ng-deep quml-mcq-solutions figure.image{display:table;clear:both;text-align:center;margin:.5rem auto;position:relative}::ng-deep .startpage__instr-desc figure.image.resize-original,::ng-deep .startpage__instr-desc figure.image,::ng-deep .quml-mcq figure.image.resize-original,::ng-deep .quml-mcq figure.image,::ng-deep .quml-sa figure.image.resize-original,::ng-deep .quml-sa figure.image,::ng-deep quml-sa figure.image.resize-original,::ng-deep quml-sa figure.image,::ng-deep quml-mcq-solutions figure.image.resize-original,::ng-deep quml-mcq-solutions figure.image{width:auto;height:auto;overflow:visible}::ng-deep .startpage__instr-desc figure.image img,::ng-deep .quml-mcq figure.image img,::ng-deep .quml-sa figure.image img,::ng-deep quml-sa figure.image img,::ng-deep quml-mcq-solutions figure.image img{width:auto}::ng-deep .startpage__instr-desc figure.image.resize-original img,::ng-deep .quml-mcq figure.image.resize-original img,::ng-deep .quml-sa figure.image.resize-original img,::ng-deep quml-sa figure.image.resize-original img,::ng-deep quml-mcq-solutions figure.image.resize-original img{width:auto;height:auto}::ng-deep .startpage__instr-desc .image img,::ng-deep .quml-mcq .image img,::ng-deep .quml-sa .image img,::ng-deep quml-sa .image img,::ng-deep quml-mcq-solutions .image img{display:block;margin:0 auto;max-width:100%;min-width:50px}::ng-deep .startpage__instr-desc figure.image.resize-25,::ng-deep .quml-mcq figure.image.resize-25,::ng-deep .quml-sa figure.image.resize-25,::ng-deep quml-sa figure.image.resize-25,::ng-deep quml-mcq-solutions figure.image.resize-25{width:25%;height:auto}::ng-deep .startpage__instr-desc figure.image.resize-50,::ng-deep .quml-mcq figure.image.resize-50,::ng-deep .quml-sa figure.image.resize-50,::ng-deep quml-sa figure.image.resize-50,::ng-deep quml-mcq-solutions figure.image.resize-50{width:50%;height:auto}::ng-deep .startpage__instr-desc figure.image.resize-75,::ng-deep .quml-mcq figure.image.resize-75,::ng-deep .quml-sa figure.image.resize-75,::ng-deep quml-sa figure.image.resize-75,::ng-deep quml-mcq-solutions figure.image.resize-75{width:75%;height:auto}::ng-deep .startpage__instr-desc figure.image.resize-100,::ng-deep .quml-mcq figure.image.resize-100,::ng-deep .quml-sa figure.image.resize-100,::ng-deep quml-sa figure.image.resize-100,::ng-deep quml-mcq-solutions figure.image.resize-100{width:100%;height:auto}::ng-deep .startpage__instr-desc figure.table table,::ng-deep .quml-mcq figure.table table,::ng-deep .quml-sa figure.table table,::ng-deep quml-sa figure.table table,::ng-deep quml-mcq-solutions figure.table table{border-right:.0625rem solid var(--gray-100)}::ng-deep .startpage__instr-desc figure.table table,::ng-deep .startpage__instr-desc figure.table table tr td,::ng-deep .startpage__instr-desc figure.table table tr th,::ng-deep .quml-mcq figure.table table,::ng-deep .quml-mcq figure.table table tr td,::ng-deep .quml-mcq figure.table table tr th,::ng-deep .quml-sa figure.table table,::ng-deep .quml-sa figure.table table tr td,::ng-deep .quml-sa figure.table table tr th,::ng-deep quml-sa figure.table table,::ng-deep quml-sa figure.table table tr td,::ng-deep quml-sa figure.table table tr th,::ng-deep quml-mcq-solutions figure.table table,::ng-deep quml-mcq-solutions figure.table table tr td,::ng-deep quml-mcq-solutions figure.table table tr th{border:.0625rem solid var(--black);border-collapse:collapse}::ng-deep .startpage__instr-desc figure.table table,::ng-deep .quml-mcq figure.table table,::ng-deep .quml-sa figure.table table,::ng-deep quml-sa figure.table table,::ng-deep quml-mcq-solutions figure.table table{width:100%;background:var(--white);border:.0625rem solid var(--gray-100);box-shadow:none;border-radius:.25rem .25rem 0 0;text-align:left;color:var(--gray);border-collapse:separate;border-spacing:0;table-layout:fixed}::ng-deep .startpage__instr-desc figure.table table thead tr th,::ng-deep .quml-mcq figure.table table thead tr th,::ng-deep .quml-sa figure.table table thead tr th,::ng-deep quml-sa figure.table table thead tr th,::ng-deep quml-mcq-solutions figure.table table thead tr th{font-size:.875rem;padding:1rem;background-color:var(--primary-100);position:relative;height:2.5rem;border:0px;border-bottom:.0625rem solid var(--gray-100);border-right:.0625rem solid var(--gray-100);font-weight:700;color:var(--primary-color);text-transform:uppercase}::ng-deep .startpage__instr-desc figure.table table thead tr th:first-child,::ng-deep .quml-mcq figure.table table thead tr th:first-child,::ng-deep .quml-sa figure.table table thead tr th:first-child,::ng-deep quml-sa figure.table table thead tr th:first-child,::ng-deep quml-mcq-solutions figure.table table thead tr th:first-child{border-top-left-radius:.25rem}::ng-deep .startpage__instr-desc figure.table table thead tr th:last-child,::ng-deep .quml-mcq figure.table table thead tr th:last-child,::ng-deep .quml-sa figure.table table thead tr th:last-child,::ng-deep quml-sa figure.table table thead tr th:last-child,::ng-deep quml-mcq-solutions figure.table table thead tr th:last-child{border-top-right-radius:.25rem;border-right:0rem solid var(--gray-100)}::ng-deep .startpage__instr-desc figure.table table tbody tr:nth-child(2n),::ng-deep .quml-mcq figure.table table tbody tr:nth-child(2n),::ng-deep .quml-sa figure.table table tbody tr:nth-child(2n),::ng-deep quml-sa figure.table table tbody tr:nth-child(2n),::ng-deep quml-mcq-solutions figure.table table tbody tr:nth-child(2n){background-color:var(--gray-0)}::ng-deep .startpage__instr-desc figure.table table tbody tr:hover,::ng-deep .quml-mcq figure.table table tbody tr:hover,::ng-deep .quml-sa figure.table table tbody tr:hover,::ng-deep quml-sa figure.table table tbody tr:hover,::ng-deep quml-mcq-solutions figure.table table tbody tr:hover{background:var(--primary-0);color:rgba(var(--rc-rgba-gray),.95);cursor:pointer}::ng-deep .startpage__instr-desc figure.table table tbody tr td,::ng-deep .quml-mcq figure.table table tbody tr td,::ng-deep .quml-sa figure.table table tbody tr td,::ng-deep quml-sa figure.table table tbody tr td,::ng-deep quml-mcq-solutions figure.table table tbody tr td{font-size:.875rem;padding:1rem;color:var(--gray);height:3.5rem;border:0px;border-bottom:.0625rem solid var(--gray-100);border-right:.0625rem solid var(--gray-100);word-break:break-word;line-height:normal}::ng-deep .startpage__instr-desc figure.table table tbody tr td:last-child,::ng-deep .quml-mcq figure.table table tbody tr td:last-child,::ng-deep .quml-sa figure.table table tbody tr td:last-child,::ng-deep quml-sa figure.table table tbody tr td:last-child,::ng-deep quml-mcq-solutions figure.table table tbody tr td:last-child{border-right:0rem solid var(--gray-100)}::ng-deep .startpage__instr-desc figure.table table tbody tr td p,::ng-deep .quml-mcq figure.table table tbody tr td p,::ng-deep .quml-sa figure.table table tbody tr td p,::ng-deep quml-sa figure.table table tbody tr td p,::ng-deep quml-mcq-solutions figure.table table tbody tr td p{margin-bottom:0!important}::ng-deep .startpage__instr-desc figure.table table tbody tr:last-child td,::ng-deep .quml-mcq figure.table table tbody tr:last-child td,::ng-deep .quml-sa figure.table table tbody tr:last-child td,::ng-deep quml-sa figure.table table tbody tr:last-child td,::ng-deep quml-mcq-solutions figure.table table tbody tr:last-child td{border-bottom:none}::ng-deep .startpage__instr-desc figure.table table tbody tr:last-child td:first-child,::ng-deep .quml-mcq figure.table table tbody tr:last-child td:first-child,::ng-deep .quml-sa figure.table table tbody tr:last-child td:first-child,::ng-deep quml-sa figure.table table tbody tr:last-child td:first-child,::ng-deep quml-mcq-solutions figure.table table tbody tr:last-child td:first-child{border-bottom-left-radius:.25rem}::ng-deep .startpage__instr-desc figure.table table tbody tr:last-child td:last-child,::ng-deep .quml-mcq figure.table table tbody tr:last-child td:last-child,::ng-deep .quml-sa figure.table table tbody tr:last-child td:last-child,::ng-deep quml-sa figure.table table tbody tr:last-child td:last-child,::ng-deep quml-mcq-solutions figure.table table tbody tr:last-child td:last-child{border-bottom-right-radius:.25rem}::ng-deep .startpage__instr-desc ul,::ng-deep .startpage__instr-desc ol,::ng-deep .quml-mcq ul,::ng-deep .quml-mcq ol,::ng-deep .quml-sa ul,::ng-deep .quml-sa ol,::ng-deep quml-sa ul,::ng-deep quml-sa ol,::ng-deep quml-mcq-solutions ul,::ng-deep quml-mcq-solutions ol{margin-top:.5rem}::ng-deep .startpage__instr-desc ul li,::ng-deep .startpage__instr-desc ol li,::ng-deep .quml-mcq ul li,::ng-deep .quml-mcq ol li,::ng-deep .quml-sa ul li,::ng-deep .quml-sa ol li,::ng-deep quml-sa ul li,::ng-deep quml-sa ol li,::ng-deep quml-mcq-solutions ul li,::ng-deep quml-mcq-solutions ol li{margin:.5rem;font-weight:400;line-height:normal}::ng-deep .startpage__instr-desc ul,::ng-deep .quml-mcq ul,::ng-deep .quml-sa ul,::ng-deep quml-sa ul,::ng-deep quml-mcq-solutions ul{list-style-type:disc}::ng-deep .startpage__instr-desc h1,::ng-deep .startpage__instr-desc h2,::ng-deep .startpage__instr-desc h3,::ng-deep .startpage__instr-desc h4,::ng-deep .startpage__instr-desc h5,::ng-deep .startpage__instr-desc h6,::ng-deep .quml-mcq h1,::ng-deep .quml-mcq h2,::ng-deep .quml-mcq h3,::ng-deep .quml-mcq h4,::ng-deep .quml-mcq h5,::ng-deep .quml-mcq h6,::ng-deep .quml-sa h1,::ng-deep .quml-sa h2,::ng-deep .quml-sa h3,::ng-deep .quml-sa h4,::ng-deep .quml-sa h5,::ng-deep .quml-sa h6,::ng-deep quml-sa h1,::ng-deep quml-sa h2,::ng-deep quml-sa h3,::ng-deep quml-sa h4,::ng-deep quml-sa h5,::ng-deep quml-sa h6,::ng-deep quml-mcq-solutions h1,::ng-deep quml-mcq-solutions h2,::ng-deep quml-mcq-solutions h3,::ng-deep quml-mcq-solutions h4,::ng-deep quml-mcq-solutions h5,::ng-deep quml-mcq-solutions h6{color:var(--primary-color);line-height:normal;margin-bottom:1rem}::ng-deep .startpage__instr-desc p,::ng-deep .startpage__instr-desc span,::ng-deep .quml-mcq p,::ng-deep .quml-mcq span,::ng-deep .quml-sa p,::ng-deep .quml-sa span,::ng-deep quml-sa p,::ng-deep quml-sa span,::ng-deep quml-mcq-solutions p,::ng-deep quml-mcq-solutions span{color:var(--quml-mcq-title-txt)}::ng-deep .startpage__instr-desc p strong,::ng-deep .startpage__instr-desc p span strong,::ng-deep .quml-mcq p strong,::ng-deep .quml-mcq p span strong,::ng-deep .quml-sa p strong,::ng-deep .quml-sa p span strong,::ng-deep quml-sa p strong,::ng-deep quml-sa p span strong,::ng-deep quml-mcq-solutions p strong,::ng-deep quml-mcq-solutions p span strong{font-weight:700}::ng-deep .startpage__instr-desc p span u,::ng-deep .startpage__instr-desc p u,::ng-deep .quml-mcq p span u,::ng-deep .quml-mcq p u,::ng-deep .quml-sa p span u,::ng-deep .quml-sa p u,::ng-deep quml-sa p span u,::ng-deep quml-sa p u,::ng-deep quml-mcq-solutions p span u,::ng-deep quml-mcq-solutions p u{text-decoration:underline}::ng-deep .startpage__instr-desc p span i,::ng-deep .startpage__instr-desc p i,::ng-deep .quml-mcq p span i,::ng-deep .quml-mcq p i,::ng-deep .quml-sa p span i,::ng-deep .quml-sa p i,::ng-deep quml-sa p span i,::ng-deep quml-sa p i,::ng-deep quml-mcq-solutions p span i,::ng-deep quml-mcq-solutions p i{font-style:italic}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.SlideComponent, selector: "slide", inputs: ["active"] }, { kind: "component", type: i5.CarouselComponent, selector: "carousel", inputs: ["noWrap", "noPause", "showIndicators", "pauseOnFocus", "indicatorsByChunk", "itemsPerSlide", "singleSlideOffset", "isAnimated", "activeSlide", "startFromIndex", "interval"], outputs: ["activeSlideChange", "slideRangeChange"] }, { kind: "component", type: i3.ContenterrorComponent, selector: "sb-player-contenterror", inputs: ["errorMsg"] }, { kind: "component", type: i6.McqComponent, selector: "quml-mcq", inputs: ["shuffleOptions", "question", "identifier", "layout", "replayed", "tryAgain"], outputs: ["componentLoaded", "answerChanged", "optionSelected"] }, { kind: "component", type: i7.HeaderComponent, selector: "quml-header", inputs: ["questions", "duration", "warningTime", "showWarningTimer", "disablePreviousNavigation", "showTimer", "totalNoOfQuestions", "currentSlideIndex", "active", "initializeTimer", "endPageReached", "loadScoreBoard", "replayed", "currentSolutions", "showFeedBack", "disableNext", "startPageInstruction", "showStartPage", "attempts", "showDeviceOrientation", "showLegend"], outputs: ["nextSlideClicked", "prevSlideClicked", "durationEnds", "showSolution", "toggleScreenRotate"] }, { kind: "component", type: i8.SaComponent, selector: "quml-sa", inputs: ["questions", "replayed", "baseUrl"], outputs: ["componentLoaded", "showAnswerClicked"] }, { kind: "component", type: i9.AnsComponent, selector: "quml-ans" }, { kind: "component", type: i10.StartpageComponent, selector: "quml-startpage", inputs: ["instructions", "totalNoOfQuestions", "points", "time", "contentName", "showTimer"] }, { kind: "component", type: i11.AlertComponent, selector: "quml-alert", inputs: ["alertType", "isHintAvailable", "showSolutionButton"], outputs: ["closeAlert", "showSolution", "showHint"] }, { kind: "component", type: i12.McqSolutionsComponent, selector: "quml-mcq-solutions", inputs: ["question", "options", "solutions", "baseUrl", "media", "identifier"], outputs: ["close"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SectionPlayerComponent, decorators: [{
            type: Component,
            args: [{ selector: 'quml-section-player', template: "<div class=\"quml-container\" *ngIf=\"loadView\" [hidden]=\"showZoomModal\">\n  <div [hidden]=\"showSolution\" class=\"quml-landscape\">\n    <quml-header class=\"main-header\" (durationEnds)=\"durationEnds()\" [disablePreviousNavigation]=\"linearNavigation\"\n      [duration]=\"timeLimit\" [warningTime]=\"warningTime\" [showWarningTimer]=\"showWarningTimer\" [showTimer]=\"showTimer\" [showLegend]=\"parentConfig?.showLegend\"\n      (nextSlideClicked)=\"nextSlideClicked($event)\" (prevSlideClicked)=\"previousSlideClicked($event)\"\n      [currentSlideIndex]=\"currentSlideIndex\" [totalNoOfQuestions]=\"noOfQuestions\" [active]=\"active\"\n      [showFeedBack]=\"showFeedBack\" [currentSolutions]=\"currentSolutions\" (showSolution)=\"viewSolution()\"\n      [initializeTimer]=\"initializeTimer\" [replayed]=\"parentConfig?.isReplayed\" [disableNext]=\"disableNext\"\n      [startPageInstruction]=\"startPageInstruction\" [attempts]=\"attempts\" [showStartPage]=\"showStartPage\"\n      [showDeviceOrientation]=\"sectionConfig?.config?.showDeviceOrientation\" (toggleScreenRotate)=\"toggleScreenRotate()\">\n    </quml-header>\n\n    <div class=\"landscape-mode\">\n      <div class=\"lanscape-mode-left\">\n        <div class=\"current-slide\" *ngIf=\"currentSlideIndex !== 0\">\n          {{myCarousel.getCurrentSlideIndex()}}/{{noOfQuestions}}\n        </div>\n        <div *ngIf=\"currentSolutions && showUserSolution\">\n          <quml-ans (click)=\"getSolutions()\" (keydown)=\"onAnswerKeyDown($event)\"></quml-ans>\n        </div>\n      </div>\n      <div class=\"landscape-content\">\n        <carousel class=\"landscape-center\" [interval]=\"0\" [showIndicators]=\"false\" [noWrap]=\"true\" #myCarousel\n          (activeSlideChange)=\"activeSlideChange($event)\">\n          <slide>\n            <quml-startpage\n              [instructions]=\"showRootInstruction ? parentConfig?.instructions : sectionConfig.metadata?.instructions\"\n              [points]=\"points\" [time]=\"showRootInstruction ? timeLimit : null\" [showTimer]=\"showTimer\"\n              [totalNoOfQuestions]=\"showRootInstruction ? parentConfig?.questionCount : noOfQuestions\"\n              [contentName]=\"showRootInstruction ? parentConfig?.contentName : parentConfig?.isSectionsAvailable ? sectionConfig?.metadata?.name : parentConfig?.contentName\">\n            </quml-startpage>\n          </slide>\n          <slide *ngFor=\"let question of questions; let i= index\" #questionSlide>\n            <div [id]=\"question.identifier\">\n              <div *ngIf=\"question?.primaryCategory.toLowerCase() === 'multiple choice question'\">\n                <quml-mcq [shuffleOptions]='shuffleOptions' [question]='question' [replayed]=\"parentConfig?.isReplayed\"\n                  (optionSelected)=\"getOptionSelected($event)\" [identifier]=\"question.id\" [tryAgain]=\"tryAgainClicked\">\n                </quml-mcq>\n              </div>\n              <div *ngIf=\"question?.primaryCategory.toLowerCase() === 'subjective question'\">\n                <quml-sa [questions]='question' [replayed]=\"parentConfig?.isReplayed\" [baseUrl]=\"parentConfig?.baseUrl\"\n                  (showAnswerClicked)=\"showAnswerClicked($event, question)\">\n                </quml-sa>\n              </div>\n            </div>\n          </slide>\n        </carousel>\n      </div>\n      <div class=\"lanscape-mode-right\">\n        <ul>\n          <ng-container>\n            <li class=\"showFeedBack-progressBar info-page hover-effect\" tabindex=\"0\"\n              [ngClass]=\"(currentSlideIndex === 0) ? 'att-color progressBar-border': 'att-color' \"\n              (keydown)=\"onEnter($event, 0)\" (click)=\"goToSlideClicked($event, 0)\">i\n            </li>\n            <li>\n              <ul *ngIf=\"parentConfig?.isSectionsAvailable\" class=\"scoreboard-sections\">\n                <li class=\"section relative\" *ngFor=\"let section of mainProgressBar; let i=index;\"\n                  attr.aria-label=\"section {{section?.index}}\" (click)=\"jumpToSection(section?.identifier)\"\n                  (keydown)=\"onSectionEnter($event, section?.identifier)\"\n                  [ngClass]=\"{'attempted' : section.class === 'attempted', 'partial': section.class === 'partial'}\">\n                  <label for=\"list-item-{{i}}\" class=\"progressBar-border\"\n                    [ngClass]=\"{'active' : section?.isActive && !showRootInstruction && section.class !== 'attempted'}\"\n                    tabindex=\"0\">{{section?.index}}</label>\n                  <ul *ngIf=\"section?.isActive && showFeedBack\">\n                    <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                      attr.aria-label=\"question number {{question?.index}}\"\n                      (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                      class=\"showFeedBack-progressBar\"\n                      [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'progressBar-border ' + question.class) : question.class\">\n                      {{question?.index}}\n                    </li>\n                  </ul>\n                  <ul class=\"nonFeedback\" *ngIf=\"section?.isActive && !showFeedBack\">\n                    <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                      attr.aria-label=\"question number {{question?.index}}\"\n                      (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                      class=\"showFeedBack-progressBar\"\n                      [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'att-color progressBar-border') : question.class === 'skipped' ? question.class: question.class === 'unattempted' ? '' : 'att-color'\">\n                      {{question?.index}}\n                    </li>\n                  </ul>\n                </li>\n              </ul>\n            </li>\n            <li>\n              <ul class=\"singleContent\" *ngIf=\"!parentConfig?.isSectionsAvailable && showFeedBack\">\n                <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                  attr.aria-label=\"question number {{question?.index}}\"\n                  (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                  class=\"showFeedBack-progressBar hover-effect\"\n                  [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'progressBar-border ' + question.class) : question.class\">\n                  {{question?.index}}\n                </li>\n              </ul>\n            </li>\n            <li>\n              <ul class=\"singleContent nonFeedback\" *ngIf=\"!parentConfig?.isSectionsAvailable && !showFeedBack\">\n                <li *ngFor=\"let question of progressBarClass; let j=index\" tabindex=\"0\"\n                  attr.aria-label=\"question number {{question?.index}}\"\n                  (click)=\"goToSlideClicked($event, question?.index)\" (keydown)=\"onEnter($event, question?.index)\"\n                  class=\"showFeedBack-progressBar hover-effect\"\n                  [ngClass]=\"(j+1) === myCarousel.getCurrentSlideIndex() ? (question.class === 'skipped' ? 'progressBar-border' : 'att-color progressBar-border') : question.class === 'skipped' ? question.class: question.class === 'unattempted' ? '' : 'att-color'\">\n                  {{question?.index}}\n                </li>\n              </ul>\n            </li>\n            <li class=\"requiresSubmit cursor-pointer showFeedBack-progressBar hover-effect\" tabindex=\"0\"\n              aria-label=\"scoreboard\" *ngIf=\"parentConfig.requiresSubmit && progressBarClass?.length\"\n              (click)=\"disableNext = true; onScoreBoardClicked()\" (keydown)=\"onScoreBoardEnter($event)\">\n              <img src=\"./assets/flag_inactive.svg\" alt=\"Flag logo: Show scoreboard\">\n            </li>\n            <!-- <li class=\"requiresSubmit\" *ngIf=\"loadScoreBoard && parentConfig.requiresSubmit\">\n              <img src=\"./assets/flag_active.svg\" alt=\"\">\n            </li> -->\n          </ng-container>\n        </ul>\n      </div>\n    </div>\n  </div>\n\n  <quml-alert *ngIf=\"showAlert && showFeedBack\" [alertType]=\"alertType\" [isHintAvailable]=\"showHints\"\n    [showSolutionButton]=\"showUserSolution && currentSolutions\" (showSolution)=\"viewSolution()\" (showHint)=\"viewHint()\"\n    (closeAlert)=\"closeAlertBox($event)\"></quml-alert>\n\n  <quml-mcq-solutions *ngIf=\"showSolution\" [question]=\"currentQuestion\" [options]=\"currentOptions\"\n    [solutions]=\"currentSolutions\" [baseUrl]=\"parentConfig?.baseUrl\" [media]=\"media\" [identifier]=\"currentQuestionIndetifier\" (close)=\"closeSolution()\"></quml-mcq-solutions>\n</div>\n\n<div class=\"info-popup\" *ngIf=\"infoPopup\">\n  Please attempt the question\n</div>\n\n<sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\n\n\n<!-- Zoom -->\n<div class=\"image-viewer__overlay\" [hidden]=\"!showZoomModal\">\n  <div class=\"image-viewer__close\" (click)=\"closeZoom()\">\n  </div>\n  <div class=\"image-viewer__container\">\n    <img #imageModal id=\"imageModal\" class=\"image-viewer__img\" [src]=\"zoomImgSrc\" alt=\"Zoomed image\">\n  </div>\n  <div class=\"image-viewer__zoom\">\n    <div class=\"image-viewer__zoomin\" (click)=\"zoomIn()\"></div>\n    <div class=\"image-viewer__zoomout\" (click)=\"zoomOut()\"></div>\n  </div>\n</div>", styles: ["@charset \"UTF-8\";::ng-deep :root{--quml-scoreboard-sub-title: #6d7278;--quml-scoreboard-skipped: #969696;--quml-scoreboard-unattempted: #575757;--quml-color-success: #08bc82;--quml-color-danger: #f1635d;--quml-color-primary-contrast: #333;--quml-btn-border: #ccc;--quml-heder-text-color: #6250f5;--quml-header-bg-color: #c2c2c2;--quml-mcq-title-txt: #131415;--quml-zoom-btn-txt: #eee;--quml-zoom-btn-hover: #f2f2f2;--quml-main-bg: #fff;--quml-btn-color: #fff;--quml-question-bg: #fff}.quml-header{background:var(--quml-header-bg-color);display:flow-root;height:2.25rem;position:fixed}.quml-container{overflow:hidden;width:100%;height:100%;position:relative}.quml-landscape{width:100%;height:100%}::ng-deep .carousel{outline:none}.col{padding-left:0;padding-right:0}.quml-button{background-color:var(--primary-color);border:none;color:var(--quml-btn-color);padding:.25rem;text-align:center;text-decoration:none;font-size:1rem;margin:.125rem .5rem .125rem .125rem;cursor:pointer;width:3rem;height:2.5rem;border-radius:10%}.landscape-mode{height:100%;width:100%;position:relative;background-color:var(--quml-main-bg)}.landscape-content{padding:2.5rem 4rem 0;overflow:auto;height:100%;width:100%}@media only screen and (max-width: 480px){.landscape-content{padding:5rem 1rem 0;height:calc(100% - 3rem)}}.lanscape-mode-left{position:absolute;left:0;top:3.5rem;text-align:center;z-index:1;width:4rem}.lanscape-mode-left div{padding-bottom:1.5rem}.landscape-center{width:100%}.lanscape-mode-right{-ms-overflow-style:none;scrollbar-width:none;position:absolute;padding:0 1rem;right:.5rem;color:var(--quml-scoreboard-unattempted);font-size:.75rem;height:calc(100% - 4rem);overflow-y:auto;top:3.5rem}.lanscape-mode-right ul{list-style:none;margin-top:.5rem;padding:0;text-align:center;position:relative}.lanscape-mode-right ul:before{content:\"\";width:.0625rem;height:100%;position:absolute;left:0;right:0;background-color:#cccccc80;z-index:1;margin:0 auto}.lanscape-mode-right ul li{position:relative;z-index:2}.lanscape-mode-right ul li.requiresSubmit{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted);border-radius:50%;width:1.25rem;height:1.25rem;background:var(--white)}.lanscape-mode-right ul li.requiresSubmit:hover{border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .singleContent.nonFeedback li:hover{border:1px solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul .singleContent.nonFeedback li.att-color{color:var(--white);background:var(--primary-color)}.lanscape-mode-right ul .section ul.nonFeedback li:hover{border:1px solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul .section ul.nonFeedback li.att-color{color:var(--white);background:var(--primary-color)}.lanscape-mode-right ul .section ul li:hover:after,.lanscape-mode-right ul .section ul li:focus:after,.lanscape-mode-right ul .section ul li.progressBar-border:after{border:1px solid var(--primary-color);content:\"\";width:1.65rem;height:1.65rem;border-radius:50%;padding:.25rem;position:absolute}.lanscape-mode-right ul .section.attempted:after{content:\"\";display:inline-block;transform:rotate(45deg);height:.6rem;width:.3rem;border-bottom:.12rem solid var(--primary-color);border-right:.12rem solid var(--primary-color);position:absolute;top:.25rem;right:-.7rem}.lanscape-mode-right ul .section.correct:after,.lanscape-mode-right ul .section.wrong:after,.lanscape-mode-right ul .section.partial:after{content:\"\";position:absolute;top:.525rem;right:-.7rem;height:.375rem;width:.375rem;border-radius:.375rem}.lanscape-mode-right ul .section.correct:after{--correct-bg: var(--quml-color-success);background:var(--correct-bg)}.lanscape-mode-right ul .section.wrong:after{--wrong-bg: var(--quml-color-danger);background:var(--wrong-bg)}.lanscape-mode-right ul .section.partial:after{--partial-bg: linear-gradient( 180deg, rgba(71, 164, 128, 1) 0%, rgba(71, 164, 128, 1) 50%, rgba(249, 122, 116, 1) 50%, rgba(249, 122, 116, 1) 100% );background:var(--partial-bg)}.lanscape-mode-right ul .section.attempted label,.lanscape-mode-right ul .section.partial label{color:var(--white)!important;background:var(--primary-color);border:.03125rem solid var(--primary-color)}.lanscape-mode-right ul .section label{background-color:var(--quml-question-bg);border-radius:.25rem;width:1.25rem;padding:.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted);margin-bottom:2.25rem;cursor:pointer}.lanscape-mode-right ul .section label.requiresSubmit{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted);border-radius:50%;background:var(--white)}.lanscape-mode-right ul .section label.requiresSubmit:hover{border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .section label.active,.lanscape-mode-right ul .section label:hover,.lanscape-mode-right ul .section label:focus{color:var(--primary-color);border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .section label.active:after,.lanscape-mode-right ul .section label:hover:after,.lanscape-mode-right ul .section label:focus:after{border:1px solid var(--primary-color);content:\"\";height:1.65rem;border-radius:.25rem;position:absolute;width:1.65rem;background:var(--quml-question-bg);z-index:-1}.lanscape-mode-right ul .section label.skipped{color:var(--white);background:var(--quml-scoreboard-skipped);border:.0625rem solid var(--quml-scoreboard-skipped)}.lanscape-mode-right ul .section label.unattempted{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted)}.lanscape-mode-right ul .section label.unattempted:hover{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul input[type=checkbox]{display:none}.lanscape-mode-right ul input[type=checkbox]~ul{height:0;transform:scaleY(0)}.lanscape-mode-right ul input[type=checkbox]:checked~ul{height:100%;transform-origin:top;transition:transform .2s ease-out;transform:scaleY(1)}.lanscape-mode-right ul .section input[type=checkbox]:checked~label{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar{background-color:var(--quml-question-bg);border-radius:50%;width:1.25rem;padding:.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;border:.0625rem solid rgb(204,204,204);margin-bottom:2.25rem;cursor:pointer}.lanscape-mode-right ul .showFeedBack-progressBar.requiresSubmit:hover{border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar.progressBar-border,.lanscape-mode-right ul .showFeedBack-progressBar .active,.lanscape-mode-right ul .showFeedBack-progressBar.att-color{color:var(--primary-color);border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar.info-page{color:var(--white);background:var(--primary-color);border:.0625rem solid var(--primary-color)}.lanscape-mode-right ul .showFeedBack-progressBar.skipped{color:var(--white);background:var(--quml-scoreboard-skipped);border:.0625rem solid var(--quml-scoreboard-skipped)}.lanscape-mode-right ul .showFeedBack-progressBar.skipped:hover{color:var(--white)!important}.lanscape-mode-right ul .showFeedBack-progressBar.partial,.lanscape-mode-right ul .showFeedBack-progressBar.wrong,.lanscape-mode-right ul .showFeedBack-progressBar.correct{color:var(--white);border:0px solid transparent}.lanscape-mode-right ul .showFeedBack-progressBar.correct{--correct-bg: var(--quml-color-success);background:var(--correct-bg)}.lanscape-mode-right ul .showFeedBack-progressBar.wrong{--wrong-bg: var(--quml-color-danger);background:var(--wrong-bg)}.lanscape-mode-right ul .showFeedBack-progressBar.partial{--partial-bg: linear-gradient( 180deg, rgba(71, 164, 128, 1) 0%, rgba(71, 164, 128, 1) 50%, rgba(249, 122, 116, 1) 50%, rgba(249, 122, 116, 1) 100% );background:var(--partial-bg)}.lanscape-mode-right ul .showFeedBack-progressBar.unattempted{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted)}.lanscape-mode-right ul .showFeedBack-progressBar.unattempted:hover{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.current-slide{color:var(--quml-scoreboard-sub-title);font-size:.875rem;font-weight:900;letter-spacing:0}@media only screen and (max-width: 480px){.lanscape-mode-right{background:var(--white);display:flex;align-items:center;overflow-x:auto;overflow-y:hidden;width:90%;height:2.5rem;padding:1rem 0 0;margin:auto;left:0}.lanscape-mode-right ul{list-style:none;padding:0;text-align:center;position:relative;display:flex;height:1.5rem;margin-top:0}.lanscape-mode-right ul .showFeedBack-progressBar{margin-right:2.25rem;z-index:1}.lanscape-mode-right ul .showFeedBack-progressBar:last-child{margin-right:0}.lanscape-mode-right ul .singleContent{display:flex}.lanscape-mode-right ul .singleContent .showFeedBack-progressBar:last-child{margin-right:2.25rem}.lanscape-mode-right ul .section ul{top:-1.75rem;position:inherit;margin:.5rem 2.25rem;padding-left:1.25rem}.lanscape-mode-right ul .section ul:before{background:transparent}.lanscape-mode-right ul .section.attempted:after{content:\"\";top:-.8125rem;right:auto;left:.625rem}.lanscape-mode-right ul .section.correct:after{content:\"\";top:-.525rem;left:.5rem;right:auto}.lanscape-mode-right ul .section.wrong:after{content:\"\";top:-.525rem;left:.5rem;right:auto}.lanscape-mode-right ul .section.partial:after{content:\"\";top:-.525rem;left:.5rem;right:auto}.lanscape-mode-right ul .section label{margin-right:2.25rem;margin-bottom:0}.lanscape-mode-right ul:before{content:\"\";width:100%;height:.0625rem;position:absolute;left:0;top:50%;transform:translateY(-50%);right:0;background-color:#cccccc80;z-index:0;margin:0 auto}.lanscape-mode-right ul input[type=checkbox]~ul{width:0;transform:scaleX(0);margin:0}.lanscape-mode-right ul input[type=checkbox]:checked~ul{width:calc(100% - 4rem);transform-origin:left;transition:transform .2s ease-out;transform:scaleX(1);margin:-1.25rem 3rem 0 4rem}.landscape-center{margin-top:2rem}.lanscape-mode-left{display:none}.landscape-mode{grid-template-areas:\"right right right\" \"center center center\" \"left left left\"}}.quml-timer{padding:.5rem}.quml-header-text{margin:.5rem;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.quml-arrow-button{border-radius:28%;font-size:0%;outline:none;background-color:var(--primary-color);padding:.5rem}.info-popup{position:absolute;top:18%;right:10%;font-size:.875rem;box-shadow:0 .125rem .875rem #0000001a;padding:.75rem}.quml-menu{width:1.5rem;height:1.5rem}.quml-card{background-color:var(--white);padding:1.25rem;box-shadow:0 .25rem .5rem #0003;width:25%;position:absolute;left:37%;text-align:center;top:25%;z-index:2}.quml-card-title{font-size:1.25rem;text-align:center}.quml-card-body .wrong{color:red}.quml-card-body .right{color:green}.quml-card-button-section .button-container button{color:var(--white);background-color:var(--primary-color);border-color:var(--primary-color);outline:none;font-size:.875rem;padding:.25rem 1.5rem}.quml-card-button-section .button-container{width:40%;display:inline;padding-right:.75rem}::ng-deep .carousel.slide a.left.carousel-control.carousel-control-prev,::ng-deep .carousel.slide .carousel-control.carousel-control-next{display:none}::ng-deep .carousel-item{perspective:unset}.potrait-header-top{visibility:hidden;margin-top:-2.5rem}.potrait-header-top .wrapper{display:grid;grid-template-columns:1fr 15fr}.potrait-header-top .quml-menu{color:var(--quml-heder-text-color);font-size:1.5rem;padding-left:1.25rem;margin-top:.25rem}.potrait-header-top .quml-header-text{font-size:.875rem;color:var(--quml-heder-text-color)}.row{margin-right:0;margin-left:0}.portrait-header{visibility:hidden}.image-viewer__overlay,.image-viewer__container,.image-viewer__close,.image-viewer__zoom{position:absolute}.image-viewer__overlay{width:100%;height:100%;background:var(--quml-color-primary-contrast);z-index:11111}.image-viewer__container{background-color:var(--quml-color-primary-contrast);top:50%;left:50%;transform:translate(-50%,-50%);z-index:11111;width:80%;height:80%}.image-viewer__img{width:100%;height:100%}.image-viewer__close{top:1rem;right:1rem;text-align:center;cursor:pointer;z-index:999999;background:#00000080;border-radius:100%;width:3rem;height:3rem;position:inherit}.image-viewer__close:after{content:\"\\2715\";color:var(--white);font-size:2rem}.image-viewer__close:hover{background:#000}.image-viewer__zoom{bottom:1rem;right:1rem;width:2.5rem;height:auto;border-radius:.5rem;background:var(--white);display:flex;flex-direction:column;align-items:center;overflow:hidden;z-index:99999;position:inherit;border:.0625rem solid var(--quml-zoom-btn-txt)}.image-viewer__zoomin,.image-viewer__zoomout{text-align:center;height:2.5rem;position:relative;width:2.5rem;cursor:pointer}.image-viewer__zoomin:hover,.image-viewer__zoomout:hover{background-color:var(--quml-zoom-btn-hover)}.image-viewer__zoomin:after,.image-viewer__zoomout:after{font-size:1.5rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.image-viewer__zoomin{border-bottom:.0625rem solid var(--quml-btn-border)}.image-viewer__zoomin:after{content:\"+\"}.image-viewer__zoomout:after{content:\"\\2212\"}::ng-deep quml-ans{cursor:pointer}::ng-deep quml-ans svg circle{fill:var(--quml-zoom-btn-txt)}::ng-deep .magnify-icon{position:absolute;right:0;bottom:0;width:1.5rem;height:1.5rem;border-top-left-radius:.5rem;cursor:pointer;background-color:var(--quml-color-primary-contrast)}::ng-deep .magnify-icon:after{content:\"\";position:absolute;bottom:.125rem;right:.125rem;z-index:1;width:1rem;height:1rem;background-image:url(\"data:image/svg+xml,%3C%3Fxml version='1.0'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svgjs='http://svgjs.com/svgjs' version='1.1' width='512' height='512' x='0' y='0' viewBox='0 0 37.166 37.166' style='enable-background:new 0 0 512 512' xml:space='preserve' class=''%3E%3Cg%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M35.829,32.045l-6.833-6.833c-0.513-0.513-1.167-0.788-1.836-0.853c2.06-2.567,3.298-5.819,3.298-9.359 c0-8.271-6.729-15-15-15c-8.271,0-15,6.729-15,15c0,8.271,6.729,15,15,15c3.121,0,6.021-0.96,8.424-2.598 c0.018,0.744,0.305,1.482,0.872,2.052l6.833,6.833c0.585,0.586,1.354,0.879,2.121,0.879s1.536-0.293,2.121-0.879 C37.001,35.116,37.001,33.217,35.829,32.045z M15.458,25c-5.514,0-10-4.484-10-10c0-5.514,4.486-10,10-10c5.514,0,10,4.486,10,10 C25.458,20.516,20.972,25,15.458,25z M22.334,15c0,1.104-0.896,2-2,2h-2.75v2.75c0,1.104-0.896,2-2,2s-2-0.896-2-2V17h-2.75 c-1.104,0-2-0.896-2-2s0.896-2,2-2h2.75v-2.75c0-1.104,0.896-2,2-2s2,0.896,2,2V13h2.75C21.438,13,22.334,13.895,22.334,15z' fill='%23ffffff' data-original='%23000000' style='' class=''/%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3Cg xmlns='http://www.w3.org/2000/svg'%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A\");background-size:cover;background-repeat:no-repeat;background-position:center}::ng-deep .solution-options figure.image{border:.0625rem solid var(--quml-btn-border);overflow:hidden;border-radius:.25rem;position:relative}::ng-deep .solutions .solution-options figure.image,::ng-deep .image-viewer__overlay .image-viewer__container{display:flex;align-items:center;justify-content:center}::ng-deep .solutions .solution-options figure.image .portrait,::ng-deep .image-viewer__overlay .image-viewer__container .portrait{width:auto;height:100%}::ng-deep .solutions .solution-options figure.image .neutral,::ng-deep .image-viewer__overlay .image-viewer__container .neutral{width:auto;height:auto}@media only screen and (max-width: 768px){::ng-deep .solutions .solution-options figure.image .neutral,::ng-deep .image-viewer__overlay .image-viewer__container .neutral{width:100%}}@media only screen and (min-width: 768px){::ng-deep .solutions .solution-options figure.image .neutral,::ng-deep .image-viewer__overlay .image-viewer__container .neutral{height:100%}}::ng-deep .solutions .solution-options figure.image .landscape,::ng-deep .image-viewer__overlay .image-viewer__container .landscape{height:auto}::ng-deep .quml-mcq .mcq-title,::ng-deep .quml-sa .mcq-title,::ng-deep quml-sa .mcq-title,::ng-deep quml-mcq-solutions .mcq-title{color:var(--quml-mcq-title-txt)}::ng-deep .quml-mcq .mcq-title p,::ng-deep .quml-sa .mcq-title p,::ng-deep quml-sa .mcq-title p,::ng-deep quml-mcq-solutions .mcq-title p{word-break:break-word}@media only screen and (max-width: 480px){::ng-deep .quml-mcq .mcq-title,::ng-deep .quml-sa .mcq-title,::ng-deep quml-sa .mcq-title,::ng-deep quml-mcq-solutions .mcq-title{margin-top:1rem}}::ng-deep .quml-mcq .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep .quml-mcq .quml-mcq--option .quml-mcq-option-card p:last-child,::ng-deep .quml-sa .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep .quml-sa .quml-mcq--option .quml-mcq-option-card p:last-child,::ng-deep quml-sa .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep quml-sa .quml-mcq--option .quml-mcq-option-card p:last-child,::ng-deep quml-mcq-solutions .quml-mcq--option .quml-mcq-option-card p:first-child,::ng-deep quml-mcq-solutions .quml-mcq--option .quml-mcq-option-card p:last-child{margin-bottom:0}::ng-deep quml-mcq-solutions figure.image,::ng-deep quml-mcq-solutions figure.image.resize-25,::ng-deep quml-mcq-solutions figure.image.resize-50,::ng-deep quml-mcq-solutions figure.image.resize-75,::ng-deep quml-mcq-solutions figure.image.resize-100,::ng-deep quml-mcq-solutions figure.image.resize-original{width:25%;height:auto}::ng-deep quml-mcq-solutions .solution-options p{margin-bottom:1rem}::ng-deep .quml-option .option p{word-break:break-word}.endPage-container-height{height:100%}.scoreboard-sections{display:contents}.scoreboard-sections li{position:relative;z-index:2}.hover-effect:hover:after,.hover-effect:focus:after,.hover-effect.progressBar-border:after{border:1px solid var(--primary-color);content:\"\";width:1.65rem;height:1.65rem;border-radius:50%;padding:.25rem;position:absolute}\n", "::ng-deep :root{--quml-mcq-title-txt: #131415}::ng-deep .startpage__instr-desc .mcq-title,::ng-deep .quml-mcq .mcq-title,::ng-deep .quml-sa .mcq-title,::ng-deep quml-sa .mcq-title,::ng-deep quml-mcq-solutions .mcq-title{color:var(--quml-mcq-title-txt)}::ng-deep .startpage__instr-desc .fs-8,::ng-deep .startpage__instr-desc .fs-9,::ng-deep .startpage__instr-desc .fs-10,::ng-deep .startpage__instr-desc .fs-11,::ng-deep .startpage__instr-desc .fs-12,::ng-deep .startpage__instr-desc .fs-13,::ng-deep .startpage__instr-desc .fs-14,::ng-deep .startpage__instr-desc .fs-15,::ng-deep .startpage__instr-desc .fs-16,::ng-deep .startpage__instr-desc .fs-17,::ng-deep .startpage__instr-desc .fs-18,::ng-deep .startpage__instr-desc .fs-19,::ng-deep .startpage__instr-desc .fs-20,::ng-deep .startpage__instr-desc .fs-21,::ng-deep .startpage__instr-desc .fs-22,::ng-deep .startpage__instr-desc .fs-23,::ng-deep .startpage__instr-desc .fs-24,::ng-deep .startpage__instr-desc .fs-25,::ng-deep .startpage__instr-desc .fs-26,::ng-deep .startpage__instr-desc .fs-27,::ng-deep .startpage__instr-desc .fs-28,::ng-deep .startpage__instr-desc .fs-29,::ng-deep .startpage__instr-desc .fs-30,::ng-deep .startpage__instr-desc .fs-36,::ng-deep .quml-mcq .fs-8,::ng-deep .quml-mcq .fs-9,::ng-deep .quml-mcq .fs-10,::ng-deep .quml-mcq .fs-11,::ng-deep .quml-mcq .fs-12,::ng-deep .quml-mcq .fs-13,::ng-deep .quml-mcq .fs-14,::ng-deep .quml-mcq .fs-15,::ng-deep .quml-mcq .fs-16,::ng-deep .quml-mcq .fs-17,::ng-deep .quml-mcq .fs-18,::ng-deep .quml-mcq .fs-19,::ng-deep .quml-mcq .fs-20,::ng-deep .quml-mcq .fs-21,::ng-deep .quml-mcq .fs-22,::ng-deep .quml-mcq .fs-23,::ng-deep .quml-mcq .fs-24,::ng-deep .quml-mcq .fs-25,::ng-deep .quml-mcq .fs-26,::ng-deep .quml-mcq .fs-27,::ng-deep .quml-mcq .fs-28,::ng-deep .quml-mcq .fs-29,::ng-deep .quml-mcq .fs-30,::ng-deep .quml-mcq .fs-36,::ng-deep .quml-sa .fs-8,::ng-deep .quml-sa .fs-9,::ng-deep .quml-sa .fs-10,::ng-deep .quml-sa .fs-11,::ng-deep .quml-sa .fs-12,::ng-deep .quml-sa .fs-13,::ng-deep .quml-sa .fs-14,::ng-deep .quml-sa .fs-15,::ng-deep .quml-sa .fs-16,::ng-deep .quml-sa .fs-17,::ng-deep .quml-sa .fs-18,::ng-deep .quml-sa .fs-19,::ng-deep .quml-sa .fs-20,::ng-deep .quml-sa .fs-21,::ng-deep .quml-sa .fs-22,::ng-deep .quml-sa .fs-23,::ng-deep .quml-sa .fs-24,::ng-deep .quml-sa .fs-25,::ng-deep .quml-sa .fs-26,::ng-deep .quml-sa .fs-27,::ng-deep .quml-sa .fs-28,::ng-deep .quml-sa .fs-29,::ng-deep .quml-sa .fs-30,::ng-deep .quml-sa .fs-36,::ng-deep quml-sa .fs-8,::ng-deep quml-sa .fs-9,::ng-deep quml-sa .fs-10,::ng-deep quml-sa .fs-11,::ng-deep quml-sa .fs-12,::ng-deep quml-sa .fs-13,::ng-deep quml-sa .fs-14,::ng-deep quml-sa .fs-15,::ng-deep quml-sa .fs-16,::ng-deep quml-sa .fs-17,::ng-deep quml-sa .fs-18,::ng-deep quml-sa .fs-19,::ng-deep quml-sa .fs-20,::ng-deep quml-sa .fs-21,::ng-deep quml-sa .fs-22,::ng-deep quml-sa .fs-23,::ng-deep quml-sa .fs-24,::ng-deep quml-sa .fs-25,::ng-deep quml-sa .fs-26,::ng-deep quml-sa .fs-27,::ng-deep quml-sa .fs-28,::ng-deep quml-sa .fs-29,::ng-deep quml-sa .fs-30,::ng-deep quml-sa .fs-36,::ng-deep quml-mcq-solutions .fs-8,::ng-deep quml-mcq-solutions .fs-9,::ng-deep quml-mcq-solutions .fs-10,::ng-deep quml-mcq-solutions .fs-11,::ng-deep quml-mcq-solutions .fs-12,::ng-deep quml-mcq-solutions .fs-13,::ng-deep quml-mcq-solutions .fs-14,::ng-deep quml-mcq-solutions .fs-15,::ng-deep quml-mcq-solutions .fs-16,::ng-deep quml-mcq-solutions .fs-17,::ng-deep quml-mcq-solutions .fs-18,::ng-deep quml-mcq-solutions .fs-19,::ng-deep quml-mcq-solutions .fs-20,::ng-deep quml-mcq-solutions .fs-21,::ng-deep quml-mcq-solutions .fs-22,::ng-deep quml-mcq-solutions .fs-23,::ng-deep quml-mcq-solutions .fs-24,::ng-deep quml-mcq-solutions .fs-25,::ng-deep quml-mcq-solutions .fs-26,::ng-deep quml-mcq-solutions .fs-27,::ng-deep quml-mcq-solutions .fs-28,::ng-deep quml-mcq-solutions .fs-29,::ng-deep quml-mcq-solutions .fs-30,::ng-deep quml-mcq-solutions .fs-36{line-height:normal}::ng-deep .startpage__instr-desc .fs-8,::ng-deep .quml-mcq .fs-8,::ng-deep .quml-sa .fs-8,::ng-deep quml-sa .fs-8,::ng-deep quml-mcq-solutions .fs-8{font-size:.5rem}::ng-deep .startpage__instr-desc .fs-9,::ng-deep .quml-mcq .fs-9,::ng-deep .quml-sa .fs-9,::ng-deep quml-sa .fs-9,::ng-deep quml-mcq-solutions .fs-9{font-size:.563rem}::ng-deep .startpage__instr-desc .fs-10,::ng-deep .quml-mcq .fs-10,::ng-deep .quml-sa .fs-10,::ng-deep quml-sa .fs-10,::ng-deep quml-mcq-solutions .fs-10{font-size:.625rem}::ng-deep .startpage__instr-desc .fs-11,::ng-deep .quml-mcq .fs-11,::ng-deep .quml-sa .fs-11,::ng-deep quml-sa .fs-11,::ng-deep quml-mcq-solutions .fs-11{font-size:.688rem}::ng-deep .startpage__instr-desc .fs-12,::ng-deep .quml-mcq .fs-12,::ng-deep .quml-sa .fs-12,::ng-deep quml-sa .fs-12,::ng-deep quml-mcq-solutions .fs-12{font-size:.75rem}::ng-deep .startpage__instr-desc .fs-13,::ng-deep .quml-mcq .fs-13,::ng-deep .quml-sa .fs-13,::ng-deep quml-sa .fs-13,::ng-deep quml-mcq-solutions .fs-13{font-size:.813rem}::ng-deep .startpage__instr-desc .fs-14,::ng-deep .quml-mcq .fs-14,::ng-deep .quml-sa .fs-14,::ng-deep quml-sa .fs-14,::ng-deep quml-mcq-solutions .fs-14{font-size:.875rem}::ng-deep .startpage__instr-desc .fs-15,::ng-deep .quml-mcq .fs-15,::ng-deep .quml-sa .fs-15,::ng-deep quml-sa .fs-15,::ng-deep quml-mcq-solutions .fs-15{font-size:.938rem}::ng-deep .startpage__instr-desc .fs-16,::ng-deep .quml-mcq .fs-16,::ng-deep .quml-sa .fs-16,::ng-deep quml-sa .fs-16,::ng-deep quml-mcq-solutions .fs-16{font-size:1rem}::ng-deep .startpage__instr-desc .fs-17,::ng-deep .quml-mcq .fs-17,::ng-deep .quml-sa .fs-17,::ng-deep quml-sa .fs-17,::ng-deep quml-mcq-solutions .fs-17{font-size:1.063rem}::ng-deep .startpage__instr-desc .fs-18,::ng-deep .quml-mcq .fs-18,::ng-deep .quml-sa .fs-18,::ng-deep quml-sa .fs-18,::ng-deep quml-mcq-solutions .fs-18{font-size:1.125rem}::ng-deep .startpage__instr-desc .fs-19,::ng-deep .quml-mcq .fs-19,::ng-deep .quml-sa .fs-19,::ng-deep quml-sa .fs-19,::ng-deep quml-mcq-solutions .fs-19{font-size:1.188rem}::ng-deep .startpage__instr-desc .fs-20,::ng-deep .quml-mcq .fs-20,::ng-deep .quml-sa .fs-20,::ng-deep quml-sa .fs-20,::ng-deep quml-mcq-solutions .fs-20{font-size:1.25rem}::ng-deep .startpage__instr-desc .fs-21,::ng-deep .quml-mcq .fs-21,::ng-deep .quml-sa .fs-21,::ng-deep quml-sa .fs-21,::ng-deep quml-mcq-solutions .fs-21{font-size:1.313rem}::ng-deep .startpage__instr-desc .fs-22,::ng-deep .quml-mcq .fs-22,::ng-deep .quml-sa .fs-22,::ng-deep quml-sa .fs-22,::ng-deep quml-mcq-solutions .fs-22{font-size:1.375rem}::ng-deep .startpage__instr-desc .fs-23,::ng-deep .quml-mcq .fs-23,::ng-deep .quml-sa .fs-23,::ng-deep quml-sa .fs-23,::ng-deep quml-mcq-solutions .fs-23{font-size:1.438rem}::ng-deep .startpage__instr-desc .fs-24,::ng-deep .quml-mcq .fs-24,::ng-deep .quml-sa .fs-24,::ng-deep quml-sa .fs-24,::ng-deep quml-mcq-solutions .fs-24{font-size:1.5rem}::ng-deep .startpage__instr-desc .fs-25,::ng-deep .quml-mcq .fs-25,::ng-deep .quml-sa .fs-25,::ng-deep quml-sa .fs-25,::ng-deep quml-mcq-solutions .fs-25{font-size:1.563rem}::ng-deep .startpage__instr-desc .fs-26,::ng-deep .quml-mcq .fs-26,::ng-deep .quml-sa .fs-26,::ng-deep quml-sa .fs-26,::ng-deep quml-mcq-solutions .fs-26{font-size:1.625rem}::ng-deep .startpage__instr-desc .fs-27,::ng-deep .quml-mcq .fs-27,::ng-deep .quml-sa .fs-27,::ng-deep quml-sa .fs-27,::ng-deep quml-mcq-solutions .fs-27{font-size:1.688rem}::ng-deep .startpage__instr-desc .fs-28,::ng-deep .quml-mcq .fs-28,::ng-deep .quml-sa .fs-28,::ng-deep quml-sa .fs-28,::ng-deep quml-mcq-solutions .fs-28{font-size:1.75rem}::ng-deep .startpage__instr-desc .fs-29,::ng-deep .quml-mcq .fs-29,::ng-deep .quml-sa .fs-29,::ng-deep quml-sa .fs-29,::ng-deep quml-mcq-solutions .fs-29{font-size:1.813rem}::ng-deep .startpage__instr-desc .fs-30,::ng-deep .quml-mcq .fs-30,::ng-deep .quml-sa .fs-30,::ng-deep quml-sa .fs-30,::ng-deep quml-mcq-solutions .fs-30{font-size:1.875rem}::ng-deep .startpage__instr-desc .fs-36,::ng-deep .quml-mcq .fs-36,::ng-deep .quml-sa .fs-36,::ng-deep quml-sa .fs-36,::ng-deep quml-mcq-solutions .fs-36{font-size:2.25rem}::ng-deep .startpage__instr-desc .text-left,::ng-deep .quml-mcq .text-left,::ng-deep .quml-sa .text-left,::ng-deep quml-sa .text-left,::ng-deep quml-mcq-solutions .text-left{text-align:left}::ng-deep .startpage__instr-desc .text-center,::ng-deep .quml-mcq .text-center,::ng-deep .quml-sa .text-center,::ng-deep quml-sa .text-center,::ng-deep quml-mcq-solutions .text-center{text-align:center}::ng-deep .startpage__instr-desc .text-right,::ng-deep .quml-mcq .text-right,::ng-deep .quml-sa .text-right,::ng-deep quml-sa .text-right,::ng-deep quml-mcq-solutions .text-right{text-align:right}::ng-deep .startpage__instr-desc .image-style-align-right,::ng-deep .quml-mcq .image-style-align-right,::ng-deep .quml-sa .image-style-align-right,::ng-deep quml-sa .image-style-align-right,::ng-deep quml-mcq-solutions .image-style-align-right{float:right;text-align:right;margin-left:.5rem}::ng-deep .startpage__instr-desc .image-style-align-left,::ng-deep .quml-mcq .image-style-align-left,::ng-deep .quml-sa .image-style-align-left,::ng-deep quml-sa .image-style-align-left,::ng-deep quml-mcq-solutions .image-style-align-left{float:left;text-align:left;margin-right:.5rem}::ng-deep .startpage__instr-desc .image,::ng-deep .startpage__instr-desc figure.image,::ng-deep .quml-mcq .image,::ng-deep .quml-mcq figure.image,::ng-deep .quml-sa .image,::ng-deep .quml-sa figure.image,::ng-deep quml-sa .image,::ng-deep quml-sa figure.image,::ng-deep quml-mcq-solutions .image,::ng-deep quml-mcq-solutions figure.image{display:table;clear:both;text-align:center;margin:.5rem auto;position:relative}::ng-deep .startpage__instr-desc figure.image.resize-original,::ng-deep .startpage__instr-desc figure.image,::ng-deep .quml-mcq figure.image.resize-original,::ng-deep .quml-mcq figure.image,::ng-deep .quml-sa figure.image.resize-original,::ng-deep .quml-sa figure.image,::ng-deep quml-sa figure.image.resize-original,::ng-deep quml-sa figure.image,::ng-deep quml-mcq-solutions figure.image.resize-original,::ng-deep quml-mcq-solutions figure.image{width:auto;height:auto;overflow:visible}::ng-deep .startpage__instr-desc figure.image img,::ng-deep .quml-mcq figure.image img,::ng-deep .quml-sa figure.image img,::ng-deep quml-sa figure.image img,::ng-deep quml-mcq-solutions figure.image img{width:auto}::ng-deep .startpage__instr-desc figure.image.resize-original img,::ng-deep .quml-mcq figure.image.resize-original img,::ng-deep .quml-sa figure.image.resize-original img,::ng-deep quml-sa figure.image.resize-original img,::ng-deep quml-mcq-solutions figure.image.resize-original img{width:auto;height:auto}::ng-deep .startpage__instr-desc .image img,::ng-deep .quml-mcq .image img,::ng-deep .quml-sa .image img,::ng-deep quml-sa .image img,::ng-deep quml-mcq-solutions .image img{display:block;margin:0 auto;max-width:100%;min-width:50px}::ng-deep .startpage__instr-desc figure.image.resize-25,::ng-deep .quml-mcq figure.image.resize-25,::ng-deep .quml-sa figure.image.resize-25,::ng-deep quml-sa figure.image.resize-25,::ng-deep quml-mcq-solutions figure.image.resize-25{width:25%;height:auto}::ng-deep .startpage__instr-desc figure.image.resize-50,::ng-deep .quml-mcq figure.image.resize-50,::ng-deep .quml-sa figure.image.resize-50,::ng-deep quml-sa figure.image.resize-50,::ng-deep quml-mcq-solutions figure.image.resize-50{width:50%;height:auto}::ng-deep .startpage__instr-desc figure.image.resize-75,::ng-deep .quml-mcq figure.image.resize-75,::ng-deep .quml-sa figure.image.resize-75,::ng-deep quml-sa figure.image.resize-75,::ng-deep quml-mcq-solutions figure.image.resize-75{width:75%;height:auto}::ng-deep .startpage__instr-desc figure.image.resize-100,::ng-deep .quml-mcq figure.image.resize-100,::ng-deep .quml-sa figure.image.resize-100,::ng-deep quml-sa figure.image.resize-100,::ng-deep quml-mcq-solutions figure.image.resize-100{width:100%;height:auto}::ng-deep .startpage__instr-desc figure.table table,::ng-deep .quml-mcq figure.table table,::ng-deep .quml-sa figure.table table,::ng-deep quml-sa figure.table table,::ng-deep quml-mcq-solutions figure.table table{border-right:.0625rem solid var(--gray-100)}::ng-deep .startpage__instr-desc figure.table table,::ng-deep .startpage__instr-desc figure.table table tr td,::ng-deep .startpage__instr-desc figure.table table tr th,::ng-deep .quml-mcq figure.table table,::ng-deep .quml-mcq figure.table table tr td,::ng-deep .quml-mcq figure.table table tr th,::ng-deep .quml-sa figure.table table,::ng-deep .quml-sa figure.table table tr td,::ng-deep .quml-sa figure.table table tr th,::ng-deep quml-sa figure.table table,::ng-deep quml-sa figure.table table tr td,::ng-deep quml-sa figure.table table tr th,::ng-deep quml-mcq-solutions figure.table table,::ng-deep quml-mcq-solutions figure.table table tr td,::ng-deep quml-mcq-solutions figure.table table tr th{border:.0625rem solid var(--black);border-collapse:collapse}::ng-deep .startpage__instr-desc figure.table table,::ng-deep .quml-mcq figure.table table,::ng-deep .quml-sa figure.table table,::ng-deep quml-sa figure.table table,::ng-deep quml-mcq-solutions figure.table table{width:100%;background:var(--white);border:.0625rem solid var(--gray-100);box-shadow:none;border-radius:.25rem .25rem 0 0;text-align:left;color:var(--gray);border-collapse:separate;border-spacing:0;table-layout:fixed}::ng-deep .startpage__instr-desc figure.table table thead tr th,::ng-deep .quml-mcq figure.table table thead tr th,::ng-deep .quml-sa figure.table table thead tr th,::ng-deep quml-sa figure.table table thead tr th,::ng-deep quml-mcq-solutions figure.table table thead tr th{font-size:.875rem;padding:1rem;background-color:var(--primary-100);position:relative;height:2.5rem;border:0px;border-bottom:.0625rem solid var(--gray-100);border-right:.0625rem solid var(--gray-100);font-weight:700;color:var(--primary-color);text-transform:uppercase}::ng-deep .startpage__instr-desc figure.table table thead tr th:first-child,::ng-deep .quml-mcq figure.table table thead tr th:first-child,::ng-deep .quml-sa figure.table table thead tr th:first-child,::ng-deep quml-sa figure.table table thead tr th:first-child,::ng-deep quml-mcq-solutions figure.table table thead tr th:first-child{border-top-left-radius:.25rem}::ng-deep .startpage__instr-desc figure.table table thead tr th:last-child,::ng-deep .quml-mcq figure.table table thead tr th:last-child,::ng-deep .quml-sa figure.table table thead tr th:last-child,::ng-deep quml-sa figure.table table thead tr th:last-child,::ng-deep quml-mcq-solutions figure.table table thead tr th:last-child{border-top-right-radius:.25rem;border-right:0rem solid var(--gray-100)}::ng-deep .startpage__instr-desc figure.table table tbody tr:nth-child(2n),::ng-deep .quml-mcq figure.table table tbody tr:nth-child(2n),::ng-deep .quml-sa figure.table table tbody tr:nth-child(2n),::ng-deep quml-sa figure.table table tbody tr:nth-child(2n),::ng-deep quml-mcq-solutions figure.table table tbody tr:nth-child(2n){background-color:var(--gray-0)}::ng-deep .startpage__instr-desc figure.table table tbody tr:hover,::ng-deep .quml-mcq figure.table table tbody tr:hover,::ng-deep .quml-sa figure.table table tbody tr:hover,::ng-deep quml-sa figure.table table tbody tr:hover,::ng-deep quml-mcq-solutions figure.table table tbody tr:hover{background:var(--primary-0);color:rgba(var(--rc-rgba-gray),.95);cursor:pointer}::ng-deep .startpage__instr-desc figure.table table tbody tr td,::ng-deep .quml-mcq figure.table table tbody tr td,::ng-deep .quml-sa figure.table table tbody tr td,::ng-deep quml-sa figure.table table tbody tr td,::ng-deep quml-mcq-solutions figure.table table tbody tr td{font-size:.875rem;padding:1rem;color:var(--gray);height:3.5rem;border:0px;border-bottom:.0625rem solid var(--gray-100);border-right:.0625rem solid var(--gray-100);word-break:break-word;line-height:normal}::ng-deep .startpage__instr-desc figure.table table tbody tr td:last-child,::ng-deep .quml-mcq figure.table table tbody tr td:last-child,::ng-deep .quml-sa figure.table table tbody tr td:last-child,::ng-deep quml-sa figure.table table tbody tr td:last-child,::ng-deep quml-mcq-solutions figure.table table tbody tr td:last-child{border-right:0rem solid var(--gray-100)}::ng-deep .startpage__instr-desc figure.table table tbody tr td p,::ng-deep .quml-mcq figure.table table tbody tr td p,::ng-deep .quml-sa figure.table table tbody tr td p,::ng-deep quml-sa figure.table table tbody tr td p,::ng-deep quml-mcq-solutions figure.table table tbody tr td p{margin-bottom:0!important}::ng-deep .startpage__instr-desc figure.table table tbody tr:last-child td,::ng-deep .quml-mcq figure.table table tbody tr:last-child td,::ng-deep .quml-sa figure.table table tbody tr:last-child td,::ng-deep quml-sa figure.table table tbody tr:last-child td,::ng-deep quml-mcq-solutions figure.table table tbody tr:last-child td{border-bottom:none}::ng-deep .startpage__instr-desc figure.table table tbody tr:last-child td:first-child,::ng-deep .quml-mcq figure.table table tbody tr:last-child td:first-child,::ng-deep .quml-sa figure.table table tbody tr:last-child td:first-child,::ng-deep quml-sa figure.table table tbody tr:last-child td:first-child,::ng-deep quml-mcq-solutions figure.table table tbody tr:last-child td:first-child{border-bottom-left-radius:.25rem}::ng-deep .startpage__instr-desc figure.table table tbody tr:last-child td:last-child,::ng-deep .quml-mcq figure.table table tbody tr:last-child td:last-child,::ng-deep .quml-sa figure.table table tbody tr:last-child td:last-child,::ng-deep quml-sa figure.table table tbody tr:last-child td:last-child,::ng-deep quml-mcq-solutions figure.table table tbody tr:last-child td:last-child{border-bottom-right-radius:.25rem}::ng-deep .startpage__instr-desc ul,::ng-deep .startpage__instr-desc ol,::ng-deep .quml-mcq ul,::ng-deep .quml-mcq ol,::ng-deep .quml-sa ul,::ng-deep .quml-sa ol,::ng-deep quml-sa ul,::ng-deep quml-sa ol,::ng-deep quml-mcq-solutions ul,::ng-deep quml-mcq-solutions ol{margin-top:.5rem}::ng-deep .startpage__instr-desc ul li,::ng-deep .startpage__instr-desc ol li,::ng-deep .quml-mcq ul li,::ng-deep .quml-mcq ol li,::ng-deep .quml-sa ul li,::ng-deep .quml-sa ol li,::ng-deep quml-sa ul li,::ng-deep quml-sa ol li,::ng-deep quml-mcq-solutions ul li,::ng-deep quml-mcq-solutions ol li{margin:.5rem;font-weight:400;line-height:normal}::ng-deep .startpage__instr-desc ul,::ng-deep .quml-mcq ul,::ng-deep .quml-sa ul,::ng-deep quml-sa ul,::ng-deep quml-mcq-solutions ul{list-style-type:disc}::ng-deep .startpage__instr-desc h1,::ng-deep .startpage__instr-desc h2,::ng-deep .startpage__instr-desc h3,::ng-deep .startpage__instr-desc h4,::ng-deep .startpage__instr-desc h5,::ng-deep .startpage__instr-desc h6,::ng-deep .quml-mcq h1,::ng-deep .quml-mcq h2,::ng-deep .quml-mcq h3,::ng-deep .quml-mcq h4,::ng-deep .quml-mcq h5,::ng-deep .quml-mcq h6,::ng-deep .quml-sa h1,::ng-deep .quml-sa h2,::ng-deep .quml-sa h3,::ng-deep .quml-sa h4,::ng-deep .quml-sa h5,::ng-deep .quml-sa h6,::ng-deep quml-sa h1,::ng-deep quml-sa h2,::ng-deep quml-sa h3,::ng-deep quml-sa h4,::ng-deep quml-sa h5,::ng-deep quml-sa h6,::ng-deep quml-mcq-solutions h1,::ng-deep quml-mcq-solutions h2,::ng-deep quml-mcq-solutions h3,::ng-deep quml-mcq-solutions h4,::ng-deep quml-mcq-solutions h5,::ng-deep quml-mcq-solutions h6{color:var(--primary-color);line-height:normal;margin-bottom:1rem}::ng-deep .startpage__instr-desc p,::ng-deep .startpage__instr-desc span,::ng-deep .quml-mcq p,::ng-deep .quml-mcq span,::ng-deep .quml-sa p,::ng-deep .quml-sa span,::ng-deep quml-sa p,::ng-deep quml-sa span,::ng-deep quml-mcq-solutions p,::ng-deep quml-mcq-solutions span{color:var(--quml-mcq-title-txt)}::ng-deep .startpage__instr-desc p strong,::ng-deep .startpage__instr-desc p span strong,::ng-deep .quml-mcq p strong,::ng-deep .quml-mcq p span strong,::ng-deep .quml-sa p strong,::ng-deep .quml-sa p span strong,::ng-deep quml-sa p strong,::ng-deep quml-sa p span strong,::ng-deep quml-mcq-solutions p strong,::ng-deep quml-mcq-solutions p span strong{font-weight:700}::ng-deep .startpage__instr-desc p span u,::ng-deep .startpage__instr-desc p u,::ng-deep .quml-mcq p span u,::ng-deep .quml-mcq p u,::ng-deep .quml-sa p span u,::ng-deep .quml-sa p u,::ng-deep quml-sa p span u,::ng-deep quml-sa p u,::ng-deep quml-mcq-solutions p span u,::ng-deep quml-mcq-solutions p u{text-decoration:underline}::ng-deep .startpage__instr-desc p span i,::ng-deep .startpage__instr-desc p i,::ng-deep .quml-mcq p span i,::ng-deep .quml-mcq p i,::ng-deep .quml-sa p span i,::ng-deep .quml-sa p i,::ng-deep quml-sa p span i,::ng-deep quml-sa p i,::ng-deep quml-mcq-solutions p span i,::ng-deep quml-mcq-solutions p i{font-style:italic}\n"] }]
        }], ctorParameters: function () { return [{ type: i1.ViewerService }, { type: i2.UtilService }, { type: i0.ChangeDetectorRef }, { type: i3.ErrorService }]; }, propDecorators: { sectionConfig: [{
                type: Input
            }], attempts: [{
                type: Input
            }], jumpToQuestion: [{
                type: Input
            }], mainProgressBar: [{
                type: Input
            }], sectionIndex: [{
                type: Input
            }], parentConfig: [{
                type: Input
            }], playerEvent: [{
                type: Output
            }], sectionEnd: [{
                type: Output
            }], showScoreBoard: [{
                type: Output
            }], myCarousel: [{
                type: ViewChild,
                args: ['myCarousel', { static: false }]
            }], imageModal: [{
                type: ViewChild,
                args: ['imageModal', { static: true }]
            }], questionSlide: [{
                type: ViewChild,
                args: ['questionSlide', { static: false }]
            }], ngOnDestroy: [{
                type: HostListener,
                args: ['window:beforeunload']
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvc2VjdGlvbi1wbGF5ZXIvc2VjdGlvbi1wbGF5ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvc2VjdGlvbi1wbGF5ZXIvc2VjdGlvbi1wbGF5ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQyxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEssT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQWdCLE1BQU0sd0NBQXdDLENBQUM7QUFDL0YsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFFL0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUXpFLE1BQU0sT0FBTyxzQkFBc0I7SUE4RWpDLFlBQ1MsYUFBNEIsRUFDNUIsV0FBd0IsRUFDdkIsS0FBd0IsRUFDekIsWUFBMEI7UUFIMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDekIsaUJBQVksR0FBWixZQUFZLENBQWM7UUE1RTFCLGlCQUFZLEdB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QyxXQUFXLEVBQUUsQ0FBQztJQUMvRCxDQUFDO2tJQXJnQ1Usc0JBQXNCO3NIQUF0QixzQkFBc0IsOHVCQ2pCbkMsNGhUQW1KTTs7NEZEbElPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxxQkFBcUI7eUxBTXRCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVxQyxVQUFVO3NCQUFyRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0MsVUFBVTtzQkFBcEQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNNLGFBQWE7c0JBQTNELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFrL0I3QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSwgRXJyb3JTZXJ2aWNlIH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjknO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQ2Fyb3VzZWxDb21wb25lbnQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nhcm91c2VsJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFF1bWxQbGF5ZXJDb25maWcsIElQYXJlbnRDb25maWcsIElBdHRlbXB0cyB9IGZyb20gJy4uL3F1bWwtbGlicmFyeS1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZpZXdlci1zZXJ2aWNlL3ZpZXdlci1zZXJ2aWNlJztcbmltcG9ydCB7IGV2ZW50TmFtZSwgcGFnZUlkLCBUZWxlbWV0cnlUeXBlLCBDYXJkaW5hbGl0eSwgUXVlc3Rpb25UeXBlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LWNvbnN0YW50cyc7XG5pbXBvcnQgeyBERUZBVUxUX1NDT1JFLCBDT01QQVRBQklMSVRZX0xFVkVMIH0gZnJvbSAnLi4vcGxheWVyLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4uL3V0aWwtc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3F1bWwtc2VjdGlvbi1wbGF5ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VjdGlvbi1wbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWN0aW9uLXBsYXllci5jb21wb25lbnQuc2NzcycsICcuLy4uL3N0YXJ0cGFnZS9zYi1ja2VkaXRvci1zdHlsZXMuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNlY3Rpb25QbGF5ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIHNlY3Rpb25Db25maWc6IFF1bWxQbGF5ZXJDb25maWc7XG4gIEBJbnB1dCgpIGF0dGVtcHRzOiBJQXR0ZW1wdHM7XG4gIEBJbnB1dCgpIGp1bXBUb1F1ZXN0aW9uO1xuICBASW5wdXQoKSBtYWluUHJvZ3Jlc3NCYXI7XG4gIEBJbnB1dCgpIHNlY3Rpb25JbmRleCA9IDA7XG4gIEBJbnB1dCgpIHBhcmVudENvbmZpZzogSVBhcmVudENvbmZpZztcblxuICBAT3V0cHV0KCkgcGxheWVyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlY3Rpb25FbmQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNob3dTY29yZUJvYXJkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbXlDYXJvdXNlbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBteUNhcm91c2VsOiBDYXJvdXNlbENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnaW1hZ2VNb2RhbCcsIHsgc3RhdGljOiB0cnVlIH0pIGltYWdlTW9kYWw6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uU2xpZGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgcXVlc3Rpb25TbGlkZTogRWxlbWVudFJlZjtcblxuICBkZXN0cm95JDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIGxvYWRWaWV3ID0gZmFsc2U7XG4gIHNob3dDb250ZW50RXJyb3IgPSBmYWxzZTtcbiAgbm9PZlRpbWVzQXBpQ2FsbGVkID0gMDtcbiAgY3VycmVudFNsaWRlSW5kZXggPSAwO1xuICBzaG93U3RhcnRQYWdlID0gdHJ1ZTtcbiAgdGhyZXNob2xkOiBudW1iZXI7XG4gIHF1ZXN0aW9ucyA9IFtdO1xuICBxdWVzdGlvbklkczogc3RyaW5nW107XG4gIG5vT2ZRdWVzdGlvbnM6IG51bWJlcjtcbiAgaW5pdGlhbFRpbWU6IG51bWJlcjtcbiAgdGltZUxpbWl0OiBhbnk7XG4gIHdhcm5pbmdUaW1lOiBudW1iZXI7XG4gIHNob3dXYXJuaW5nVGltZXI6IGJvb2xlYW47XG4gIHNob3dUaW1lcjogYW55O1xuICBzaG93RmVlZEJhY2s6IGJvb2xlYW47XG4gIHNob3dVc2VyU29sdXRpb246IGJvb2xlYW47XG4gIHN0YXJ0UGFnZUluc3RydWN0aW9uOiBzdHJpbmc7XG4gIG1heFNjb3JlOiBudW1iZXI7XG4gIHBvaW50czogbnVtYmVyO1xuICBpbml0aWFsaXplVGltZXI6IGJvb2xlYW47XG4gIGxpbmVhck5hdmlnYXRpb246IGJvb2xlYW47XG4gIHNob3dIaW50czogYW55O1xuICBhbGxvd1NraXA6IGJvb2xlYW47XG4gIHByb2dyZXNzQmFyQ2xhc3MgPSBbXTtcbiAgY3VycmVudFF1ZXN0aW9uc01lZGlhOiBhbnk7XG4gIGRpc2FibGVOZXh0OiBib29sZWFuO1xuICBlbmRQYWdlUmVhY2hlZDogYm9vbGVhbjtcbiAgdHJ5QWdhaW5DbGlja2VkID0gZmFsc2U7XG4gIGN1cnJlbnRPcHRpb25TZWxlY3RlZDogYW55O1xuICBjYXJvdXNlbENvbmZpZyA9IHtcbiAgICBORVhUOiAxLFxuICAgIFBSRVY6IDJcbiAgfTtcbiAgYWN0aXZlID0gZmFsc2U7XG4gIHNob3dBbGVydDogYm9vbGVhbjtcbiAgY3VycmVudE9wdGlvbnM6IGFueTtcbiAgY3VycmVudFF1ZXN0aW9uOiBhbnk7XG4gIGN1cnJlbnRRdWVzdGlvbkluZGV0aWZpZXI6IHN0cmluZztcbiAgbWVkaWE6IGFueTtcbiAgY3VycmVudFNvbHV0aW9uczogYW55O1xuICBzaG93U29sdXRpb246IGFueTtcbiAgb3B0aW9uU2VsZWN0ZWRPYmo6IGFueTtcbiAgaW50ZXJ2YWxSZWY6IGFueTtcbiAgYWxlcnRUeXBlOiBzdHJpbmc7XG4gIGluZm9Qb3B1cDogYm9vbGVhbjtcbiAgc3RvcEF1dG9OYXZpZ2F0aW9uOiBib29sZWFuO1xuICBqdW1wU2xpZGVJbmRleDogYW55O1xuICBzaG93UXVlc3Rpb25zID0gZmFsc2U7XG4gIHNob3dab29tTW9kYWwgPSBmYWxzZTtcbiAgem9vbUltZ1NyYzogc3RyaW5nO1xuICBpbWFnZVpvb21Db3VudCA9IDEwMDtcbiAgc2hvd1Jvb3RJbnN0cnVjdGlvbiA9IHRydWU7XG4gIHNsaWRlRHVyYXRpb24gPSAwO1xuICBpbml0aWFsU2xpZGVEdXJhdGlvbjogbnVtYmVyO1xuICBkaXNhYmxlZEhhbmRsZTogYW55O1xuICBpc0Fzc2Vzc0V2ZW50UmFpc2VkID0gZmFsc2U7XG4gIGlzU2h1ZmZsZVF1ZXN0aW9ucyA9IGZhbHNlO1xuICBzaHVmZmxlT3B0aW9uczogYm9vbGVhbjtcbiAgcGxheWVyQ29udGVudENvbXBhdGliaWx0eUxldmVsID0gQ09NUEFUQUJJTElUWV9MRVZFTDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICBwdWJsaWMgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyBlcnJvclNlcnZpY2U6IEVycm9yU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChjaGFuZ2VzICYmIE9iamVjdC52YWx1ZXMoY2hhbmdlcylbMF0uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHMoKTtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNlY3Rpb25Db25maWcgPSB0aGlzLnNlY3Rpb25Db25maWc7XG4gICAgdGhpcy5zZXRDb25maWcoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VTdGFydEV2ZW50KDApO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5zdGFydFBhZ2VMb2FkZWQsICdpbXByZXNzaW9uJywgMCk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyU2VydmljZS5xdW1sUGxheWVyRXZlbnRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQocmVzKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnF1bWxRdWVzdGlvbkV2ZW50XG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcblxuICAgICAgICBpZiAocmVzPy5lcnJvcikge1xuICAgICAgICAgIGxldCB0cmFjZUlkO1xuICAgICAgICAgIGlmIChfLmhhcyh0aGlzLnNlY3Rpb25Db25maWcsICdjb25maWcnKSkge1xuICAgICAgICAgICAgdHJhY2VJZCA9IHRoaXMuc2VjdGlvbkNvbmZpZy5jb25maWc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuYXZpZ2F0b3Iub25MaW5lICYmIHRoaXMudmlld2VyU2VydmljZS5pc0F2YWlsYWJsZUxvY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhlcnJvckNvZGUuY29udGVudExvYWRGYWlscywgZXJyb3JNZXNzYWdlLmNvbnRlbnRMb2FkRmFpbHMsXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlscyksIHRyYWNlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmludGVybmV0Q29ubmVjdGl2aXR5LCBlcnJvck1lc3NhZ2UuaW50ZXJuZXRDb25uZWN0aXZpdHksXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UuaW50ZXJuZXRDb25uZWN0aXZpdHkpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zaG93Q29udGVudEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlcz8ucXVlc3Rpb25zKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuQ29tbW9uUXVlc3Rpb25zID0gXy54b3JCeSh0aGlzLnF1ZXN0aW9ucywgcmVzLnF1ZXN0aW9ucywgJ2lkZW50aWZpZXInKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSBfLnVuaXFCeSh0aGlzLnF1ZXN0aW9ucy5jb25jYXQodW5Db21tb25RdWVzdGlvbnMpLCAnaWRlbnRpZmllcicpO1xuICAgICAgICB0aGlzLnNvcnRRdWVzdGlvbnMoKTtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnVwZGF0ZVNlY3Rpb25RdWVzdGlvbnModGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXIsIHRoaXMucXVlc3Rpb25zKTtcbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMubm9PZlRpbWVzQXBpQ2FsbGVkKys7XG4gICAgICAgIHRoaXMubG9hZFZpZXcgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2xpZGVJbmRleCA+IDAgJiYgdGhpcy5teUNhcm91c2VsKSB7XG4gICAgICAgICAgdGhpcy5teUNhcm91c2VsLnNlbGVjdFNsaWRlKHRoaXMuY3VycmVudFNsaWRlSW5kZXgpO1xuICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uc1t0aGlzLmN1cnJlbnRTbGlkZUluZGV4IC0gMV0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uc01lZGlhID0gdGhpcy5xdWVzdGlvbnNbdGhpcy5jdXJyZW50U2xpZGVJbmRleCAtIDFdPy5tZWRpYTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2Vab29tKCk7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFF1ZXN0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFNsaWRlSW5kZXggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93U3RhcnRQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuc2VjdGlvbkluZGV4ID09PSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5uZXh0U2xpZGUoKTsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29uZmlnKCkge1xuICAgIHRoaXMubm9PZlRpbWVzQXBpQ2FsbGVkID0gMDtcbiAgICB0aGlzLmN1cnJlbnRTbGlkZUluZGV4ID0gMDtcbiAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuY3VycmVudFNsaWRlSW5kZXggPT09IDAgJiYgdGhpcy5zZWN0aW9uSW5kZXggPT09IDAgJiYgdGhpcy5zaG93U3RhcnRQYWdlO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5teUNhcm91c2VsKSB7XG4gICAgICB0aGlzLm15Q2Fyb3VzZWwuc2VsZWN0U2xpZGUodGhpcy5jdXJyZW50U2xpZGVJbmRleCk7XG4gICAgfVxuICAgIHRoaXMudGhyZXNob2xkID0gdGhpcy5zZWN0aW9uQ29uZmlnPy5jb250ZXh0Py50aHJlc2hvbGQgfHwgMztcbiAgICB0aGlzLnF1ZXN0aW9uSWRzID0gXy5jbG9uZURlZXAodGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhLmNoaWxkTm9kZXMpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5wYXJlbnRDb25maWcuaXNSZXBsYXllZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplVGltZXIgPSB0cnVlO1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlU3RhcnRFdmVudCgwKTtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5zdGFydFBhZ2VMb2FkZWQsICdpbXByZXNzaW9uJywgMCk7XG4gICAgICB0aGlzLmRpc2FibGVOZXh0ID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZUluZGV4ID0gMDtcbiAgICAgIHRoaXMubXlDYXJvdXNlbC5zZWxlY3RTbGlkZSgwKTtcbiAgICAgIHRoaXMuc2hvd1Jvb3RJbnN0cnVjdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbnNNZWRpYSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25zWzBdLCAnbWVkaWEnKTtcbiAgICAgIHRoaXMuc2V0SW1hZ2Vab29tKCk7XG4gICAgICB0aGlzLmxvYWRWaWV3ID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW51QnRuOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNvdmVybGF5LWJ1dHRvbicpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVudUJ0bikge1xuICAgICAgICAgIG1lbnVCdG4uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIHRoaXMuc2h1ZmZsZU9wdGlvbnMgPSB0aGlzLnNlY3Rpb25Db25maWcuY29uZmlnPy5zaHVmZmxlT3B0aW9ucztcbiAgICB0aGlzLmlzU2h1ZmZsZVF1ZXN0aW9ucyA9IHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YS5zaHVmZmxlO1xuICAgIHRoaXMubm9PZlF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25JZHMubGVuZ3RoO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5pbml0aWFsaXplKHRoaXMuc2VjdGlvbkNvbmZpZywgdGhpcy50aHJlc2hvbGQsIHRoaXMucXVlc3Rpb25JZHMsIHRoaXMucGFyZW50Q29uZmlnKTtcbiAgICB0aGlzLmNoZWNrQ29tcGF0aWJpbGl0eUxldmVsKHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YS5jb21wYXRpYmlsaXR5TGV2ZWwpO1xuICAgIHRoaXMudGltZUxpbWl0ID0gdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy50aW1lTGltaXRzPy5xdWVzdGlvblNldD8ubWF4IHx8IDA7XG4gICAgdGhpcy53YXJuaW5nVGltZSA9IHRoaXMudGltZUxpbWl0ID8gKHRoaXMudGltZUxpbWl0IC0gKHRoaXMudGltZUxpbWl0ICogdGhpcy5wYXJlbnRDb25maWcud2FybmluZ1RpbWUgLyAxMDApKSA6IDA7XG4gICAgdGhpcy5zaG93V2FybmluZ1RpbWVyID0gdGhpcy5wYXJlbnRDb25maWcuc2hvd1dhcm5pbmdUaW1lcjtcbiAgICB0aGlzLnNob3dUaW1lciA9IHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YT8uc2hvd1RpbWVyO1xuXG4gICAgaWYgKHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YT8uc2hvd0ZlZWRiYWNrKSB7XG4gICAgICB0aGlzLnNob3dGZWVkQmFjayA9IHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YT8uc2hvd0ZlZWRiYWNrOyAvLyBwcmlvcml0aXplIHRoZSBzZWN0aW9uIGxldmVsIGNvbmZpZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dGZWVkQmFjayA9IHRoaXMucGFyZW50Q29uZmlnLnNob3dGZWVkYmFjazsgLy8gRmFsbGJhY2sgdG8gcGFyZW50IGNvbmZpZ1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1VzZXJTb2x1dGlvbiA9IHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YT8uc2hvd1NvbHV0aW9ucztcbiAgICB0aGlzLnN0YXJ0UGFnZUluc3RydWN0aW9uID0gdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy5pbnN0cnVjdGlvbnMgfHwgdGhpcy5wYXJlbnRDb25maWcuaW5zdHJ1Y3Rpb25zO1xuICAgIHRoaXMubGluZWFyTmF2aWdhdGlvbiA9IHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YS5uYXZpZ2F0aW9uTW9kZSA9PT0gJ25vbi1saW5lYXInID8gZmFsc2UgOiB0cnVlO1xuICAgIHRoaXMuc2hvd0hpbnRzID0gdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy5zaG93SGludHM7XG4gICAgdGhpcy5wb2ludHMgPSB0aGlzLnNlY3Rpb25Db25maWcubWV0YWRhdGE/LnBvaW50cztcblxuICAgIHRoaXMuYWxsb3dTa2lwID0gdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy5hbGxvd1NraXA/LnRvTG93ZXJDYXNlKCkgIT09ICdubyc7XG4gICAgdGhpcy5zaG93U3RhcnRQYWdlID0gdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy5zaG93U3RhcnRQYWdlPy50b0xvd2VyQ2FzZSgpICE9PSAnbm8nO1xuICAgIHRoaXMucHJvZ3Jlc3NCYXJDbGFzcyA9IHRoaXMucGFyZW50Q29uZmlnLmlzU2VjdGlvbnNBdmFpbGFibGUgPyB0aGlzLm1haW5Qcm9ncmVzc0Jhci5maW5kKGl0ZW0gPT4gaXRlbS5pc0FjdGl2ZSk/LmNoaWxkcmVuIDpcbiAgICAgIHRoaXMubWFpblByb2dyZXNzQmFyO1xuXG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJDbGFzcykge1xuICAgICAgdGhpcy5wcm9ncmVzc0JhckNsYXNzLmZvckVhY2goaXRlbSA9PiBpdGVtLnNob3dGZWVkYmFjayA9IHRoaXMuc2hvd0ZlZWRCYWNrKTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXN0aW9ucyA9IHRoaXMudmlld2VyU2VydmljZS5nZXRTZWN0aW9uUXVlc3Rpb25zKHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YS5pZGVudGlmaWVyKTtcbiAgICB0aGlzLnNvcnRRdWVzdGlvbnMoKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UudXBkYXRlU2VjdGlvblF1ZXN0aW9ucyh0aGlzLnNlY3Rpb25Db25maWcubWV0YWRhdGEuaWRlbnRpZmllciwgdGhpcy5xdWVzdGlvbnMpO1xuICAgIHRoaXMucmVzZXRRdWVzdGlvblN0YXRlKCk7XG4gICAgaWYgKHRoaXMuanVtcFRvUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuZ29Ub1F1ZXN0aW9uKHRoaXMuanVtcFRvUXVlc3Rpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy50aHJlc2hvbGQgPT09IDEpIHtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5nZXRRdWVzdGlvbigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50aHJlc2hvbGQgPiAxKSB7XG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UuZ2V0UXVlc3Rpb25zKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlY3Rpb25Db25maWcubWV0YWRhdGE/LmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9hZFZpZXcgPSB0cnVlO1xuICAgICAgdGhpcy5kaXNhYmxlTmV4dCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVUaW1lcikge1xuICAgICAgdGhpcy5pbml0aWFsaXplVGltZXIgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxUaW1lID0gdGhpcy5pbml0aWFsU2xpZGVEdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbiAgcmVtb3ZlQXR0cmlidXRlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZmlyc3RTbGlkZTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2Fyb3VzZWwuc2xpZGUnKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoZmlyc3RTbGlkZSkge1xuICAgICAgICBmaXJzdFNsaWRlLnJlbW92ZUF0dHJpYnV0ZShcInRhYmluZGV4XCIpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBzb3J0UXVlc3Rpb25zKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMucXVlc3Rpb25zLmxlbmd0aCAmJiB0aGlzLnF1ZXN0aW9uSWRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcXVlcyA9IFtdO1xuICAgICAgdGhpcy5xdWVzdGlvbklkcy5mb3JFYWNoKChxdWVzdGlvbklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZSA9IHRoaXMucXVlc3Rpb25zLmZpbmQocXVlc3Rpb24gPT4gcXVlc3Rpb24uaWRlbnRpZmllciA9PT0gcXVlc3Rpb25JZCk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChxdWUpIHtcbiAgICAgICAgICBxdWVzLnB1c2gocXVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnF1ZXN0aW9ucyA9IHF1ZXM7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU3VtbWFyeU9iaigpIHtcbiAgICBjb25zdCBjbGFzc09iaiA9IF8uZ3JvdXBCeSh0aGlzLnByb2dyZXNzQmFyQ2xhc3MsICdjbGFzcycpO1xuICAgIHJldHVybiB7XG4gICAgICBza2lwcGVkOiBjbGFzc09iaj8uc2tpcHBlZD8ubGVuZ3RoIHx8IDAsXG4gICAgICBjb3JyZWN0OiBjbGFzc09iaj8uY29ycmVjdD8ubGVuZ3RoIHx8IDAsXG4gICAgICB3cm9uZzogY2xhc3NPYmo/Lndyb25nPy5sZW5ndGggfHwgMCxcbiAgICAgIHBhcnRpYWw6IGNsYXNzT2JqPy5wYXJ0aWFsPy5sZW5ndGggfHwgMFxuICAgIH07XG4gIH1cblxuICBuZXh0U2xpZGUoKSB7XG4gICAgdGhpcy5jdXJyZW50UXVlc3Rpb25zTWVkaWEgPSBfLmdldCh0aGlzLnF1ZXN0aW9uc1t0aGlzLmN1cnJlbnRTbGlkZUluZGV4XSwgJ21lZGlhJyk7XG4gICAgdGhpcy5nZXRRdWVzdGlvbigpO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5uZXh0Q2xpY2tlZCwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgKyAxKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUubmV4dENsaWNrZWQsIFRlbGVtZXRyeVR5cGUuaW1wcmVzc2lvbiwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgKyAxKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlSW5kZXggIT09IHRoaXMucXVlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy5jdXJyZW50U2xpZGVJbmRleCA9IHRoaXMuY3VycmVudFNsaWRlSW5kZXggKyAxO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMubXlDYXJvdXNlbC5pc0xhc3QodGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkpIHx8IHRoaXMubm9PZlF1ZXN0aW9ucyA9PT0gdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlU2NvcmUoKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSA+IDAgJiZcbiAgICAgIHRoaXMucXVlc3Rpb25zW3RoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpIC0gMV0ucVR5cGUgPT09IFF1ZXN0aW9uVHlwZS5tY3EgJiYgdGhpcy5jdXJyZW50T3B0aW9uU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuY3VycmVudE9wdGlvblNlbGVjdGVkPy5vcHRpb24gPyB0aGlzLmN1cnJlbnRPcHRpb25TZWxlY3RlZFsnb3B0aW9uJ10gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5xdWVzdGlvbnNbdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgLSAxXS5pZGVudGlmaWVyO1xuICAgICAgY29uc3QgcVR5cGUgPSB0aGlzLnF1ZXN0aW9uc1t0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSAtIDFdLnFUeXBlO1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlUmVzcG9uc2VFdmVudChpZGVudGlmaWVyLCBxVHlwZSwgb3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uc1t0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKV0pIHtcbiAgICAgIHRoaXMuc2V0U2tpcHBlZENsYXNzKHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSA9PT0gdGhpcy5ub09mUXVlc3Rpb25zKSB7XG4gICAgICB0aGlzLmNsZWFyVGltZUludGVydmFsKCk7XG4gICAgICB0aGlzLmVtaXRTZWN0aW9uRW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXlDYXJvdXNlbC5tb3ZlKHRoaXMuY2Fyb3VzZWxDb25maWcuTkVYVCk7XG4gICAgdGhpcy5zZXRJbWFnZVpvb20oKTtcbiAgICB0aGlzLnJlc2V0UXVlc3Rpb25TdGF0ZSgpO1xuICAgIHRoaXMuY2xlYXJUaW1lSW50ZXJ2YWwoKTtcbiAgfVxuXG4gIHByZXZTbGlkZSgpIHtcbiAgICB0aGlzLmRpc2FibGVOZXh0ID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50U29sdXRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5wcmV2Q2xpY2tlZCwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgLSAxKTtcbiAgICB0aGlzLnNob3dBbGVydCA9IGZhbHNlO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGVJbmRleCAhPT0gdGhpcy5xdWVzdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZUluZGV4ID0gdGhpcy5jdXJyZW50U2xpZGVJbmRleCArIDE7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpICsgMSA9PT0gdGhpcy5ub09mUXVlc3Rpb25zICYmIHRoaXMuZW5kUGFnZVJlYWNoZWQpIHtcbiAgICAgIHRoaXMuZW5kUGFnZVJlYWNoZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5teUNhcm91c2VsLm1vdmUodGhpcy5jYXJvdXNlbENvbmZpZy5QUkVWKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U2xpZGVJbmRleCA9IHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpO1xuICAgIHRoaXMuYWN0aXZlID0gdGhpcy5jdXJyZW50U2xpZGVJbmRleCA9PT0gMCAmJiB0aGlzLnNlY3Rpb25JbmRleCA9PT0gMCAmJiB0aGlzLnNob3dTdGFydFBhZ2U7XG4gICAgdGhpcy5jdXJyZW50UXVlc3Rpb25zTWVkaWEgPSBfLmdldCh0aGlzLnF1ZXN0aW9uc1t0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSAtIDFdLCAnbWVkaWEnKTtcbiAgICB0aGlzLnNldEltYWdlWm9vbSgpO1xuICAgIHRoaXMuc2V0U2tpcHBlZENsYXNzKHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpIC0gMSk7XG4gIH1cblxuICBnZXRRdWVzdGlvbigpIHtcbiAgICBpZiAodGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgPiAwXG4gICAgICAmJiAoKHRoaXMudGhyZXNob2xkICogdGhpcy5ub09mVGltZXNBcGlDYWxsZWQpIC0gMSkgPT09IHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpXG4gICAgICAmJiB0aGlzLnRocmVzaG9sZCAqIHRoaXMubm9PZlRpbWVzQXBpQ2FsbGVkID49IHRoaXMucXVlc3Rpb25zLmxlbmd0aCAmJiB0aGlzLnRocmVzaG9sZCA+IDEpIHtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5nZXRRdWVzdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgPiAwXG4gICAgICAmJiB0aGlzLnF1ZXN0aW9uc1t0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKV0gPT09IHVuZGVmaW5lZCAmJiB0aGlzLnRocmVzaG9sZCA+IDEpIHtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5nZXRRdWVzdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aHJlc2hvbGQgPT09IDEgJiYgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgPj0gMCkge1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmdldFF1ZXN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRRdWVzdGlvblN0YXRlKCkge1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zaG93QWxlcnQgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvblNlbGVjdGVkT2JqID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudE9wdGlvblNlbGVjdGVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudE9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXJyZW50U29sdXRpb25zID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgYWN0aXZlU2xpZGVDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLmluaXRpYWxTbGlkZUR1cmF0aW9uID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5pc0Fzc2Vzc0V2ZW50UmFpc2VkID0gZmFsc2U7XG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpLnByb2dyZXNzQmFyLWJvcmRlcicpO1xuICAgIGNvbnN0IHByb2dyZXNzQmFyQ29udGFpbmVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubGFuc2NhcGUtbW9kZS1yaWdodFwiKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHByb2dyZXNzQmFyQ29udGFpbmVyICYmIHF1ZXN0aW9uRWxlbWVudCAmJiAhdGhpcy5wYXJlbnRDb25maWcuaXNSZXBsYXllZCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zY3JvbGxQYXJlbnRUb0NoaWxkKHByb2dyZXNzQmFyQ29udGFpbmVyLCBxdWVzdGlvbkVsZW1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubGFuZHNjYXBlLWNvbnRlbnRcIik7XG4gICAgaWYgKGNvbnRlbnRFbGVtZW50KSB7XG4gICAgICBjb250ZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cblxuICAgIHRoaXMudmlld2VyU2VydmljZS5wYXVzZVZpZGVvKCk7XG4gIH1cblxuICBuZXh0U2xpZGVDbGlja2VkKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2hvd1Jvb3RJbnN0cnVjdGlvbiAmJiB0aGlzLnBhcmVudENvbmZpZy5pc1NlY3Rpb25zQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnNob3dSb290SW5zdHJ1Y3Rpb24gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0U2xpZGUoKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXZlbnQ/LnR5cGUgPT09ICduZXh0Jykge1xuICAgICAgdGhpcy52YWxpZGF0ZVNlbGVjdGVkT3B0aW9uKHRoaXMub3B0aW9uU2VsZWN0ZWRPYmosICduZXh0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJldmlvdXNTbGlkZUNsaWNrZWQoZXZlbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudC5ldmVudCA9PT0gJ3ByZXZpb3VzIGNsaWNrZWQnKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25TZWxlY3RlZE9iaiAmJiB0aGlzLnNob3dGZWVkQmFjaykge1xuICAgICAgICB0aGlzLnN0b3BBdXRvTmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlU2VsZWN0ZWRPcHRpb24odGhpcy5vcHRpb25TZWxlY3RlZE9iaiwgJ3ByZXZpb3VzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3BBdXRvTmF2aWdhdGlvbiA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZUluZGV4ID09PSAwICYmIHRoaXMucGFyZW50Q29uZmlnLmlzU2VjdGlvbnNBdmFpbGFibGUgJiYgdGhpcy5nZXRDdXJyZW50U2VjdGlvbkluZGV4KCkgPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNTZWN0aW9uSWQgPSB0aGlzLm1haW5Qcm9ncmVzc0Jhclt0aGlzLmdldEN1cnJlbnRTZWN0aW9uSW5kZXgoKSAtIDFdLmlkZW50aWZpZXI7XG4gICAgICAgICAgdGhpcy5qdW1wVG9TZWN0aW9uKHByZXZpb3VzU2VjdGlvbklkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2U2xpZGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVTY29yZUZvclNodWZmbGVkUXVlc3Rpb24oKSB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgLSAxO1xuXG4gICAgaWYgKHRoaXMuaXNTaHVmZmxlUXVlc3Rpb25zKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNjb3JlQm9hcmQoY3VycmVudEluZGV4LCAnY29ycmVjdCcsIHVuZGVmaW5lZCwgREVGQVVMVF9TQ09SRSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFNlY3Rpb25JbmRleCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uSWQgPSB0aGlzLnNlY3Rpb25Db25maWcubWV0YWRhdGEuaWRlbnRpZmllcjtcbiAgICByZXR1cm4gdGhpcy5tYWluUHJvZ3Jlc3NCYXIuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5pZGVudGlmaWVyID09PSBjdXJyZW50U2VjdGlvbklkKTtcbiAgfVxuXG4gIGdvVG9TbGlkZUNsaWNrZWQoZXZlbnQsIGluZGV4KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXRoaXMucHJvZ3Jlc3NCYXJDbGFzcz8ubGVuZ3RoKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMuanVtcFNsaWRlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmdvVG9TbGlkZSh0aGlzLmp1bXBTbGlkZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmp1bXBTbGlkZUluZGV4ID0gaW5kZXg7XG4gICAgaWYgKHRoaXMub3B0aW9uU2VsZWN0ZWRPYmogJiYgdGhpcy5zaG93RmVlZEJhY2spIHtcbiAgICAgIHRoaXMuc3RvcEF1dG9OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLnZhbGlkYXRlU2VsZWN0ZWRPcHRpb24odGhpcy5vcHRpb25TZWxlY3RlZE9iaiwgJ2p1bXAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wQXV0b05hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgdGhpcy5nb1RvU2xpZGUodGhpcy5qdW1wU2xpZGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgb25FbnRlcihldmVudCwgaW5kZXgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLmdvVG9TbGlkZUNsaWNrZWQoZXZlbnQsIGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBqdW1wVG9TZWN0aW9uKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHRoaXMuc2hvd1Jvb3RJbnN0cnVjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFNlY3Rpb25FbmQoZmFsc2UsIGlkZW50aWZpZXIpO1xuICB9XG5cbiAgb25TZWN0aW9uRW50ZXIoZXZlbnQsIGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDEzKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5vcHRpb25TZWxlY3RlZE9iaikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlU2VsZWN0ZWRPcHRpb24odGhpcy5vcHRpb25TZWxlY3RlZE9iaiwgJ2p1bXAnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuanVtcFRvU2VjdGlvbihpZGVudGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBvblNjb3JlQm9hcmRDbGlja2VkKCkge1xuICAgIHRoaXMudmlld2VyU2VydmljZS51cGRhdGVTZWN0aW9uUXVlc3Rpb25zKHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YS5pZGVudGlmaWVyLCB0aGlzLnF1ZXN0aW9ucyk7XG4gICAgdGhpcy5zaG93U2NvcmVCb2FyZC5lbWl0KCk7XG4gIH1cblxuICBvblNjb3JlQm9hcmRFbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy5vblNjb3JlQm9hcmRDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNPbk5leHRCdXR0b24oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0QnRuOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdW1sLW5hdmlnYXRpb25fX25leHQnKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAobmV4dEJ0bikge1xuICAgICAgICBuZXh0QnRuLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZ2V0T3B0aW9uU2VsZWN0ZWQob3B0aW9uU2VsZWN0ZWQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChvcHRpb25TZWxlY3RlZC5jYXJkaW5hbGl0eSA9PT0gQ2FyZGluYWxpdHkuc2luZ2xlICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudE9wdGlvblNlbGVjdGVkKSA9PT0gSlNPTi5zdHJpbmdpZnkob3B0aW9uU2VsZWN0ZWQpKSB7XG4gICAgICByZXR1cm47IC8vIFNhbWUgb3B0aW9uIHNlbGVjdGVkXG4gICAgfVxuICAgIHRoaXMuZm9jdXNPbk5leHRCdXR0b24oKTtcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5jdXJyZW50T3B0aW9uU2VsZWN0ZWQgPSBvcHRpb25TZWxlY3RlZDtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSAtIDE7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLm9wdGlvbkNsaWNrZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcblxuICAgIC8vIFRoaXMgb3B0aW9uU2VsZWN0ZWQgY29tZXMgZW1wdHkgd2hlbmV2ZXIgdGhlIHRyeSBhZ2FpbiBpcyBjbGlja2VkIG9uIGZlZWRiYWNrIHBvcHVwXG4gICAgaWYgKF8uaXNFbXB0eShvcHRpb25TZWxlY3RlZD8ub3B0aW9uKSkge1xuICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZE9iaiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY3VycmVudFNvbHV0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudXBkYXRlU2NvcmVCb2FyZChjdXJyZW50SW5kZXgsICdza2lwcGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9uU2VsZWN0ZWRPYmogPSBvcHRpb25TZWxlY3RlZDtcbiAgICAgIHRoaXMuaXNBc3Nlc3NFdmVudFJhaXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jdXJyZW50U29sdXRpb25zID0gIV8uaXNFbXB0eShvcHRpb25TZWxlY3RlZC5zb2x1dGlvbnMpID8gb3B0aW9uU2VsZWN0ZWQuc29sdXRpb25zIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV0aWZpZXIgPSB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50SW5kZXhdLmlkZW50aWZpZXI7XG4gICAgdGhpcy5tZWRpYSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25zW2N1cnJlbnRJbmRleF0sICdtZWRpYScsIFtdKTtcbiAgIFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCF0aGlzLnNob3dGZWVkQmFjaykge1xuICAgICAgdGhpcy52YWxpZGF0ZVNlbGVjdGVkT3B0aW9uKHRoaXMub3B0aW9uU2VsZWN0ZWRPYmopO1xuICAgIH1cbiAgfVxuXG4gIGR1cmF0aW9uRW5kcygpIHtcbiAgICB0aGlzLnNob3dTb2x1dGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0FsZXJ0ID0gZmFsc2U7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnBhdXNlVmlkZW8oKTtcbiAgICB0aGlzLmVtaXRTZWN0aW9uRW5kKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0NvbXBhdGliaWxpdHlMZXZlbChjb21wYXRpYmlsaXR5TGV2ZWwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChjb21wYXRpYmlsaXR5TGV2ZWwpIHtcbiAgICAgIC8vIFRPRE86IEl0IGlzIGEgdGVtcG9yYXJ5IGZpeCBmb3IgSVEtNjc5IG9yIEVELTMzOThcbiAgICAgIC8vIEJlZm9yZSB0aGVzZSBjaGFuZ2VzIHdlIHdlcmUgY2FsbGluZyBlcnJvclNlcnZpY2UuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgY2hlY2tDb250ZW50Q29tcGF0aWJsZSA9IHRoaXMuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eShjb21wYXRpYmlsaXR5TGV2ZWwpO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKCFjaGVja0NvbnRlbnRDb21wYXRpYmxlLmlzQ29tcGl0YWJsZSkge1xuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBlcnJvck1lc3NhZ2UuY29udGVudENvbXBhdGliaWxpdHksXG4gICAgICAgICAgY2hlY2tDb250ZW50Q29tcGF0aWJsZS5lcnJvciwgdGhpcy5zZWN0aW9uQ29uZmlnPy5jb25maWc/LnRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrQ29udGVudENvbXBhdGliaWxpdHkoY3VycmVudENvbXBhdGliaWxpdHlMZXZlbDogbnVtYmVyKSB7XG4gICAgaWYgKGN1cnJlbnRDb21wYXRpYmlsaXR5TGV2ZWwgPiB0aGlzLnBsYXllckNvbnRlbnRDb21wYXRpYmlsdHlMZXZlbCkge1xuICAgICAgY29uc3QgY29tcGF0aWJpbGl0eUVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb21wYXRpYmlsaXR5RXJyb3IubWVzc2FnZSA9IGBQbGF5ZXIgc3VwcG9ydHMgJHt0aGlzLnBsYXllckNvbnRlbnRDb21wYXRpYmlsdHlMZXZlbH1cbiAgICAgIGJ1dCBjb250ZW50IGNvbXBhdGliaWxpdHkgaXMgJHtjdXJyZW50Q29tcGF0aWJpbGl0eUxldmVsfWA7XG4gICAgICBjb21wYXRpYmlsaXR5RXJyb3IubmFtZSA9ICdjb250ZW50Q29tcGF0aWJpbHknO1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGNvbXBhdGliaWxpdHlFcnJvciwgaXNDb21waXRhYmxlOiBmYWxzZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgaXNDb21waXRhYmxlOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgZW1pdFNlY3Rpb25FbmQoaXNEdXJhdGlvbkVuZGVkOiBib29sZWFuID0gZmFsc2UsIGp1bXBUb1NlY3Rpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudE9iajogYW55ID0ge1xuICAgICAgc3VtbWFyeTogdGhpcy5jcmVhdGVTdW1tYXJ5T2JqKCksXG4gICAgICBzY29yZTogdGhpcy5jYWxjdWxhdGVTY29yZSgpLFxuICAgICAgZHVyYXRpb25TcGVudDogdGhpcy51dGlsU2VydmljZS5nZXRUaW1lU3BlbnRUZXh0KHRoaXMuaW5pdGlhbFRpbWUpLFxuICAgICAgc2xpZGVJbmRleDogdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCksXG4gICAgICBpc0R1cmF0aW9uRW5kZWQsXG4gICAgfTtcbiAgICBpZiAoanVtcFRvU2VjdGlvbikge1xuICAgICAgZXZlbnRPYmouanVtcFRvU2VjdGlvbiA9IGp1bXBUb1NlY3Rpb247XG4gICAgfVxuICAgIHRoaXMudmlld2VyU2VydmljZS51cGRhdGVTZWN0aW9uUXVlc3Rpb25zKHRoaXMuc2VjdGlvbkNvbmZpZy5tZXRhZGF0YS5pZGVudGlmaWVyLCB0aGlzLnF1ZXN0aW9ucyk7XG4gICAgdGhpcy5zZWN0aW9uRW5kLmVtaXQoZXZlbnRPYmopO1xuICB9XG5cbiAgY2xvc2VBbGVydEJveChldmVudCkge1xuICAgIGlmIChldmVudD8udHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLmNsb3NlZEZlZWRCYWNrLCBUZWxlbWV0cnlUeXBlLmludGVyYWN0LCB0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSk7XG4gICAgfSBlbHNlIGlmIChldmVudD8udHlwZSA9PT0gJ3RyeUFnYWluJykge1xuICAgICAgdGhpcy50cnlBZ2FpbkNsaWNrZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJ5QWdhaW5DbGlja2VkID0gZmFsc2U7XG4gICAgICB9LCAyMDAwKTtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS50cnlBZ2FpbiwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkpO1xuICAgIH1cbiAgICB0aGlzLnNob3dBbGVydCA9IGZhbHNlO1xuICB9XG5cbiAgc2V0U2tpcHBlZENsYXNzKGluZGV4KSB7XG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJDbGFzcyAmJiBfLmdldCh0aGlzLnByb2dyZXNzQmFyQ2xhc3NbaW5kZXhdLCAnY2xhc3MnKSA9PT0gJ3VuYXR0ZW1wdGVkJykge1xuICAgICAgdGhpcy5wcm9ncmVzc0JhckNsYXNzW2luZGV4XS5jbGFzcyA9ICdza2lwcGVkJztcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTY3JlZW5Sb3RhdGUoZXZlbnQ/OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCkge1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5kZXZpY2VSb3RhdGlvbkNsaWNrZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpICsgMSk7XG4gIH1cblxuICB2YWxpZGF0ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbiwgdHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSBvcHRpb24/Lm9wdGlvbj8udmFsdWU7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgLSAxO1xuICAgIGNvbnN0IGlzUXVlc3Rpb25Ta2lwQWxsb3dlZCA9ICF0aGlzLm9wdGlvblNlbGVjdGVkT2JqICYmXG4gICAgICB0aGlzLmFsbG93U2tpcCAmJiB0aGlzLnV0aWxTZXJ2aWNlLmdldFF1ZXN0aW9uVHlwZSh0aGlzLnF1ZXN0aW9ucywgY3VycmVudEluZGV4KSA9PT0gUXVlc3Rpb25UeXBlLm1jcTtcbiAgICBjb25zdCBpc1N1YmplY3RpdmVRdWVzdGlvbiA9IHRoaXMudXRpbFNlcnZpY2UuZ2V0UXVlc3Rpb25UeXBlKHRoaXMucXVlc3Rpb25zLCBjdXJyZW50SW5kZXgpID09PSBRdWVzdGlvblR5cGUuc2E7XG4gICAgY29uc3Qgb25TdGFydFBhZ2UgPSB0aGlzLnN0YXJ0UGFnZUluc3RydWN0aW9uICYmIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpID09PSAwO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gIXRoaXMub3B0aW9uU2VsZWN0ZWRPYmogJiYgdGhpcy5hY3RpdmU7XG4gICAgY29uc3Qgc2VsZWN0ZWRRdWVzdGlvbiA9IHRoaXMucXVlc3Rpb25zW2N1cnJlbnRJbmRleF07XG4gICAgY29uc3Qga2V5ID0gc2VsZWN0ZWRRdWVzdGlvbi5yZXNwb25zZURlY2xhcmF0aW9uID8gdGhpcy51dGlsU2VydmljZS5nZXRLZXlWYWx1ZShPYmplY3Qua2V5cyhzZWxlY3RlZFF1ZXN0aW9uLnJlc3BvbnNlRGVjbGFyYXRpb24pKSA6ICcnO1xuICAgIHRoaXMuc2xpZGVEdXJhdGlvbiA9IE1hdGgucm91bmQoKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5pbml0aWFsU2xpZGVEdXJhdGlvbikgLyAxMDAwKTtcbiAgICBjb25zdCBnZXRQYXJhbXMgPSAoKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0ZWRRdWVzdGlvbi5xVHlwZS50b1VwcGVyQ2FzZSgpID09PSBRdWVzdGlvblR5cGUubWNxICYmIHNlbGVjdGVkUXVlc3Rpb24/LmVkaXRvclN0YXRlPy5vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFF1ZXN0aW9uLmVkaXRvclN0YXRlLm9wdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUXVlc3Rpb24ucVR5cGUudG9VcHBlckNhc2UoKSA9PT0gUXVlc3Rpb25UeXBlLm1jcSAmJiAhXy5pc0VtcHR5KHNlbGVjdGVkUXVlc3Rpb24/LmVkaXRvclN0YXRlKSkge1xuICAgICAgICByZXR1cm4gW3NlbGVjdGVkUXVlc3Rpb24/LmVkaXRvclN0YXRlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVkYXRhSXRlbTogYW55ID0ge1xuICAgICAgJ2lkJzogc2VsZWN0ZWRRdWVzdGlvbi5pZGVudGlmaWVyLFxuICAgICAgJ3RpdGxlJzogc2VsZWN0ZWRRdWVzdGlvbi5uYW1lLFxuICAgICAgJ2Rlc2MnOiBzZWxlY3RlZFF1ZXN0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgJ3R5cGUnOiBzZWxlY3RlZFF1ZXN0aW9uLnFUeXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAnbWF4c2NvcmUnOiBrZXkubGVuZ3RoID09PSAwID8gMCA6IHNlbGVjdGVkUXVlc3Rpb24ub3V0Y29tZURlY2xhcmF0aW9uLm1heFNjb3JlLmRlZmF1bHRWYWx1ZSB8fCAwLFxuICAgICAgJ3BhcmFtcyc6IGdldFBhcmFtcygpXG4gICAgfTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVkYXRhSXRlbSAmJiB0aGlzLnBhcmVudENvbmZpZy5pc1NlY3Rpb25zQXZhaWxhYmxlKSB7XG4gICAgICBlZGF0YUl0ZW0uc2VjdGlvbklkID0gdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXRoaXMub3B0aW9uU2VsZWN0ZWRPYmogJiYgIXRoaXMuaXNBc3Nlc3NFdmVudFJhaXNlZCAmJiBzZWxlY3RlZFF1ZXN0aW9uLnFUeXBlLnRvVXBwZXJDYXNlKCkgIT09IFF1ZXN0aW9uVHlwZS5zYSkge1xuICAgICAgdGhpcy5pc0Fzc2Vzc0V2ZW50UmFpc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUFzc2VzRXZlbnQoZWRhdGFJdGVtLCBjdXJyZW50SW5kZXggKyAxLCAnTm8nLCAwLCBbXSwgdGhpcy5zbGlkZUR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25TZWxlY3RlZE9iaikge1xuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24gPSBzZWxlY3RlZFF1ZXN0aW9uLmJvZHk7XG4gICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gc2VsZWN0ZWRRdWVzdGlvbi5pbnRlcmFjdGlvbnNba2V5XS5vcHRpb25zO1xuXG4gICAgICBpZiAob3B0aW9uLmNhcmRpbmFsaXR5ID09PSBDYXJkaW5hbGl0eS5zaW5nbGUpIHtcbiAgICAgICAgY29uc3QgY29ycmVjdE9wdGlvblZhbHVlID0gTnVtYmVyKHNlbGVjdGVkUXVlc3Rpb24ucmVzcG9uc2VEZWNsYXJhdGlvbltrZXldLmNvcnJlY3RSZXNwb25zZS52YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5zaG93QWxlcnQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9uLm9wdGlvbj8udmFsdWUgPT09IGNvcnJlY3RPcHRpb25WYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY29yZSA9IHRoaXMuZ2V0U2NvcmUoY3VycmVudEluZGV4LCBrZXksIHRydWUpO1xuICAgICAgICAgIGlmICghdGhpcy5pc0Fzc2Vzc0V2ZW50UmFpc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNzZXNzRXZlbnRSYWlzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlQXNzZXNFdmVudChlZGF0YUl0ZW0sIGN1cnJlbnRJbmRleCArIDEsICdZZXMnLCBjdXJyZW50U2NvcmUsIFtvcHRpb24ub3B0aW9uXSwgdGhpcy5zbGlkZUR1cmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hbGVydFR5cGUgPSAnY29ycmVjdCc7XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0ZlZWRCYWNrKVxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0RmVlZEJhY2tUaW1lT3V0KHR5cGUpO1xuICAgICAgICAgIHRoaXMudXBkYXRlU2NvcmVCb2FyZChjdXJyZW50SW5kZXgsICdjb3JyZWN0JywgdW5kZWZpbmVkLCBjdXJyZW50U2NvcmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY29yZSA9IHRoaXMuZ2V0U2NvcmUoY3VycmVudEluZGV4LCBrZXksIGZhbHNlLCBvcHRpb24pO1xuICAgICAgICAgIHRoaXMuYWxlcnRUeXBlID0gJ3dyb25nJztcbiAgICAgICAgICBjb25zdCBjbGFzc1R5cGUgPSB0aGlzLnByb2dyZXNzQmFyQ2xhc3NbY3VycmVudEluZGV4XS5jbGFzcyA9PT0gJ3BhcnRpYWwnID8gJ3BhcnRpYWwnIDogJ3dyb25nJztcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNjb3JlQm9hcmQoY3VycmVudEluZGV4LCBjbGFzc1R5cGUsIHNlbGVjdGVkT3B0aW9uVmFsdWUsIGN1cnJlbnRTY29yZSk7XG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmICghdGhpcy5pc0Fzc2Vzc0V2ZW50UmFpc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNzZXNzRXZlbnRSYWlzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlQXNzZXNFdmVudChlZGF0YUl0ZW0sIGN1cnJlbnRJbmRleCArIDEsICdObycsIDAsIFtvcHRpb24ub3B0aW9uXSwgdGhpcy5zbGlkZUR1cmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb24uY2FyZGluYWxpdHkgPT09IENhcmRpbmFsaXR5Lm11bHRpcGxlKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGVjbGFyYXRpb24gPSB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50SW5kZXhdLnJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICAgIGNvbnN0IG91dGNvbWVEZWNsYXJhdGlvbiA9IHRoaXMucXVlc3Rpb25zW2N1cnJlbnRJbmRleF0ub3V0Y29tZURlY2xhcmF0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50U2NvcmUgPSB0aGlzLnV0aWxTZXJ2aWNlLmdldE11bHRpc2VsZWN0U2NvcmUob3B0aW9uLm9wdGlvbiwgcmVzcG9uc2VEZWNsYXJhdGlvbiwgdGhpcy5pc1NodWZmbGVRdWVzdGlvbnMsIG91dGNvbWVEZWNsYXJhdGlvbik7XG4gICAgICAgIHRoaXMuc2hvd0FsZXJ0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKGN1cnJlbnRTY29yZSA9PT0gMCkge1xuICAgICAgICAgIGlmICghdGhpcy5pc0Fzc2Vzc0V2ZW50UmFpc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNzZXNzRXZlbnRSYWlzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlQXNzZXNFdmVudChlZGF0YUl0ZW0sIGN1cnJlbnRJbmRleCArIDEsICdObycsIDAsIFtvcHRpb24ub3B0aW9uXSwgdGhpcy5zbGlkZUR1cmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hbGVydFR5cGUgPSAnd3JvbmcnO1xuICAgICAgICAgIHRoaXMudXBkYXRlU2NvcmVCb2FyZChjdXJyZW50SW5kZXgsICd3cm9uZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2NvcmVCb2FyZChjdXJyZW50SW5kZXgsICdjb3JyZWN0JywgdW5kZWZpbmVkLCBjdXJyZW50U2NvcmUpO1xuICAgICAgICAgIGlmICghdGhpcy5pc0Fzc2Vzc0V2ZW50UmFpc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNzZXNzRXZlbnRSYWlzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlQXNzZXNFdmVudChlZGF0YUl0ZW0sIGN1cnJlbnRJbmRleCArIDEsICdZZXMnLCBjdXJyZW50U2NvcmUsIFtvcHRpb24ub3B0aW9uXSwgdGhpcy5zbGlkZUR1cmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0ZlZWRCYWNrKVxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0RmVlZEJhY2tUaW1lT3V0KHR5cGUpO1xuICAgICAgICAgIHRoaXMuYWxlcnRUeXBlID0gJ2NvcnJlY3QnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9wdGlvblNlbGVjdGVkT2JqID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoKGlzUXVlc3Rpb25Ta2lwQWxsb3dlZCkgfHwgaXNTdWJqZWN0aXZlUXVlc3Rpb24gfHwgb25TdGFydFBhZ2UgfHwgaXNBY3RpdmUpIHtcbiAgICAgIGlmKCFfLmlzVW5kZWZpbmVkKHR5cGUpKSB7XG4gICAgICAgIHRoaXMubmV4dFNsaWRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0UGFnZUluc3RydWN0aW9uICYmICF0aGlzLm9wdGlvblNlbGVjdGVkT2JqICYmICF0aGlzLmFjdGl2ZSAmJiAhdGhpcy5hbGxvd1NraXAgJiZcbiAgICAgIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpID4gMCAmJiB0aGlzLnV0aWxTZXJ2aWNlLmdldFF1ZXN0aW9uVHlwZSh0aGlzLnF1ZXN0aW9ucywgY3VycmVudEluZGV4KSA9PT0gUXVlc3Rpb25UeXBlLm1jcVxuICAgICAgJiYgdGhpcy51dGlsU2VydmljZS5jYW5Hbyh0aGlzLnByb2dyZXNzQmFyQ2xhc3NbdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCldKSkge1xuICAgICAgdGhpcy5pbmZvUG9wdXBUaW1lT3V0KCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25TZWxlY3RlZE9iaiAmJiAhdGhpcy5hY3RpdmUgJiYgIXRoaXMuYWxsb3dTa2lwICYmIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpID49IDBcbiAgICAgICYmIHRoaXMudXRpbFNlcnZpY2UuZ2V0UXVlc3Rpb25UeXBlKHRoaXMucXVlc3Rpb25zLCBjdXJyZW50SW5kZXgpID09PSBRdWVzdGlvblR5cGUubWNxXG4gICAgICAmJiB0aGlzLnV0aWxTZXJ2aWNlLmNhbkdvKHRoaXMucHJvZ3Jlc3NCYXJDbGFzc1t0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKV0pKSB7XG4gICAgICB0aGlzLmluZm9Qb3B1cFRpbWVPdXQoKTtcbiAgICB9XG4gIH1cblxuICBpbmZvUG9wdXBUaW1lT3V0KCkge1xuICAgIHRoaXMuaW5mb1BvcHVwID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5mb1BvcHVwID0gZmFsc2U7XG4gICAgfSwgMjAwMCk7XG4gIH1cblxuICBjb3JyZWN0RmVlZEJhY2tUaW1lT3V0KHR5cGU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmludGVydmFsUmVmID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93QWxlcnQpIHtcbiAgICAgICAgdGhpcy5zaG93QWxlcnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLm15Q2Fyb3VzZWwuaXNMYXN0KHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKSAmJiB0eXBlID09PSAnbmV4dCcpIHtcbiAgICAgICAgICB0aGlzLm5leHRTbGlkZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwcmV2aW91cycgJiYgIXRoaXMuc3RvcEF1dG9OYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgdGhpcy5wcmV2U2xpZGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnanVtcCcgJiYgIXRoaXMuc3RvcEF1dG9OYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgdGhpcy5nb1RvU2xpZGUodGhpcy5qdW1wU2xpZGVJbmRleCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5teUNhcm91c2VsLmlzTGFzdCh0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSkpIHtcbiAgICAgICAgICB0aGlzLmVuZFBhZ2VSZWFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmVtaXRTZWN0aW9uRW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCA0MDAwKTtcbiAgfVxuXG4gIGdvVG9TbGlkZShpbmRleCkge1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5nb1RvUXVlc3Rpb24sIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgICB0aGlzLmRpc2FibGVOZXh0ID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50U2xpZGVJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuc2hvd1Jvb3RJbnN0cnVjdGlvbiA9IGZhbHNlO1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZE9iaiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubXlDYXJvdXNlbC5zZWxlY3RTbGlkZSgwKTtcbiAgICAgIHRoaXMuYWN0aXZlID0gdGhpcy5jdXJyZW50U2xpZGVJbmRleCA9PT0gMCAmJiB0aGlzLnNlY3Rpb25JbmRleCA9PT0gMCAmJiB0aGlzLnNob3dTdGFydFBhZ2U7XG4gICAgICB0aGlzLnNob3dSb290SW5zdHJ1Y3Rpb24gPSB0cnVlO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICghdGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU5leHQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbnNNZWRpYSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25zW3RoaXMuY3VycmVudFNsaWRlSW5kZXggLSAxXSwgJ21lZGlhJyk7XG4gICAgdGhpcy5zZXRTa2lwcGVkQ2xhc3ModGhpcy5jdXJyZW50U2xpZGVJbmRleCAtIDEpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVUaW1lcikge1xuICAgICAgdGhpcy5pbml0aWFsaXplVGltZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uc1tpbmRleCAtIDFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2hvd1F1ZXN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmdldFF1ZXN0aW9ucygwLCBpbmRleCk7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZUluZGV4ID0gaW5kZXg7XG4gICAgfSBlbHNlIGlmICh0aGlzLnF1ZXN0aW9uc1tpbmRleCAtIDFdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubXlDYXJvdXNlbC5zZWxlY3RTbGlkZShpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuc2V0SW1hZ2Vab29tKCk7XG4gICAgdGhpcy5jdXJyZW50U29sdXRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGlnaGxpZ2h0UXVlc3Rpb24oKTtcbiAgfVxuXG4gIGdvVG9RdWVzdGlvbihldmVudCkge1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Um9vdEluc3RydWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5kaXNhYmxlTmV4dCA9IGZhbHNlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRpbWVyID0gdHJ1ZTtcbiAgICBjb25zdCBpbmRleCA9IGV2ZW50LnF1ZXN0aW9uTm87XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmdldFF1ZXN0aW9ucygwLCBpbmRleCk7XG4gICAgdGhpcy5jdXJyZW50U2xpZGVJbmRleCA9IGluZGV4O1xuICAgIHRoaXMubXlDYXJvdXNlbC5zZWxlY3RTbGlkZShpbmRleCk7XG4gICAgdGhpcy5oaWdobGlnaHRRdWVzdGlvbigpO1xuICB9XG5cbiAgaGlnaGxpZ2h0UXVlc3Rpb24oKSB7XG4gICAgY29uc3QgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbnNbdGhpcy5jdXJyZW50U2xpZGVJbmRleCAtIDFdO1xuICAgIGNvbnN0IHF1ZXN0aW9uVHlwZSA9IGN1cnJlbnRRdWVzdGlvbj8ucVR5cGU/LnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50UXVlc3Rpb24/LmlkZW50aWZpZXIpO1xuICAgIGlmIChlbGVtZW50ICYmIHF1ZXN0aW9uVHlwZSkge1xuICAgICAgbGV0IHF1ZXN0aW9uVGl0bGVFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgICAgc3dpdGNoIChxdWVzdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSBRdWVzdGlvblR5cGUubWNxOlxuICAgICAgICAgIHF1ZXN0aW9uVGl0bGVFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubWNxLXRpdGxlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcXVlc3Rpb25UaXRsZUVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdWVzdGlvbi1jb250YWluZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXN0aW9uVGl0bGVFbGVtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHF1ZXN0aW9uVGl0bGVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0U29sdXRpb25zKCkge1xuICAgIHRoaXMuc2hvd0FsZXJ0ID0gZmFsc2U7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLnNob3dBbnN3ZXIsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuc2hvd0Fuc3dlciwgVGVsZW1ldHJ5VHlwZS5pbXByZXNzaW9uLCB0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSk7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgLSAxO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbnNbY3VycmVudEluZGV4XS5ib2R5O1xuICAgIHRoaXMuY3VycmVudE9wdGlvbnMgPSB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50SW5kZXhdLmludGVyYWN0aW9ucy5yZXNwb25zZTEub3B0aW9ucztcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbnNNZWRpYSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25zW2N1cnJlbnRJbmRleF0sICdtZWRpYScpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRJbWFnZVpvb20oKTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0SW1hZ2VIZWlnaHRXaWR0aENsYXNzKCk7XG4gICAgfSwgMTAwKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmN1cnJlbnRTb2x1dGlvbnMpIHtcbiAgICAgIHRoaXMuc2hvd1NvbHV0aW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jbGVhclRpbWVJbnRlcnZhbCgpO1xuICB9XG5cbiAgdmlld1NvbHV0aW9uKCkge1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS52aWV3U29sdXRpb25DbGlja2VkLCBUZWxlbWV0cnlUeXBlLmludGVyYWN0LCB0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSk7XG4gICAgdGhpcy5zaG93U29sdXRpb24gPSB0cnVlO1xuICAgIHRoaXMuc2hvd0FsZXJ0ID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50UXVlc3Rpb25zTWVkaWEgPSBfLmdldCh0aGlzLnF1ZXN0aW9uc1t0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSAtIDFdLCAnbWVkaWEnKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0SW1hZ2Vab29tKCk7XG4gICAgICB0aGlzLnNldEltYWdlSGVpZ2h0V2lkdGhDbGFzcygpO1xuICAgIH0pO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmludGVydmFsUmVmKTtcbiAgfVxuXG4gIGNsb3NlU29sdXRpb24oKSB7XG4gICAgdGhpcy5zZXRJbWFnZVpvb20oKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuc29sdXRpb25DbG9zZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgICB0aGlzLnNob3dTb2x1dGlvbiA9IGZhbHNlO1xuICAgIHRoaXMubXlDYXJvdXNlbC5zZWxlY3RTbGlkZSh0aGlzLmN1cnJlbnRTbGlkZUluZGV4KTtcbiAgICB0aGlzLmZvY3VzT25OZXh0QnV0dG9uKCk7XG4gIH1cblxuICB2aWV3SGludCgpIHtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUudmlld0hpbnQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgfVxuXG4gIG9uQW5zd2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLmdldFNvbHV0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dBbnN3ZXJDbGlja2VkKGV2ZW50LCBxdWVzdGlvbj8pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudD8uc2hvd0Fuc3dlcikge1xuICAgICAgdGhpcy5mb2N1c09uTmV4dEJ1dHRvbigpO1xuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5wcm9ncmVzc0JhckNsYXNzW3RoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpIC0gMV0uY2xhc3MgPSAnY29ycmVjdCc7XG4gICAgICB0aGlzLnVwZGF0ZVNjb3JlRm9yU2h1ZmZsZWRRdWVzdGlvbigpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucXVlc3Rpb25zLmZpbmRJbmRleChxdWUgPT4gcXVlLmlkZW50aWZpZXIgPT09IHF1ZXN0aW9uLmlkZW50aWZpZXIpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zW2luZGV4XS5pc0Fuc3dlclNob3duID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UudXBkYXRlU2VjdGlvblF1ZXN0aW9ucyh0aGlzLnNlY3Rpb25Db25maWcubWV0YWRhdGEuaWRlbnRpZmllciwgdGhpcy5xdWVzdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuc2hvd0Fuc3dlciwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgcGFnZUlkLnNob3J0QW5zd2VyKTtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5wYWdlU2Nyb2xsZWQsIFRlbGVtZXRyeVR5cGUuaW1wcmVzc2lvbiwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgLSAxKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY29yZShjdXJyZW50SW5kZXgsIGtleSwgaXNDb3JyZWN0QW5zd2VyLCBzZWxlY3RlZE9wdGlvbj8pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpc0NvcnJlY3RBbnN3ZXIpIHtcbiAgICAgIGlmICh0aGlzLmlzU2h1ZmZsZVF1ZXN0aW9ucykge1xuICAgICAgICByZXR1cm4gREVGQVVMVF9TQ09SRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50SW5kZXhdLm91dGNvbWVEZWNsYXJhdGlvbi5tYXhTY29yZS5kZWZhdWx0VmFsdWUgP1xuICAgICAgICB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50SW5kZXhdLm91dGNvbWVEZWNsYXJhdGlvbi5tYXhTY29yZS5kZWZhdWx0VmFsdWUgOiBERUZBVUxUX1NDT1JFO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9wdGlvblZhbHVlID0gc2VsZWN0ZWRPcHRpb24ub3B0aW9uLnZhbHVlO1xuICAgICAgY29uc3QgbWFwcGluZyA9IHRoaXMucXVlc3Rpb25zW2N1cnJlbnRJbmRleF0ucmVzcG9uc2VEZWNsYXJhdGlvbi5tYXBwaW5nO1xuICAgICAgbGV0IHNjb3JlID0gMDtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICAgIG1hcHBpbmcuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uVmFsdWUgPT09IHZhbC52YWx1ZSkge1xuICAgICAgICAgICAgc2NvcmUgPSB2YWwuc2NvcmUgfHwgMDtcbiAgICAgICAgICAgIGlmICh2YWwuc2NvcmUpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0JhckNsYXNzW2N1cnJlbnRJbmRleF0uY2xhc3MgPSAncGFydGlhbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzY29yZTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVTY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzc0JhckNsYXNzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGVsZW1lbnQpID0+IGFjY3VtdWxhdG9yICsgZWxlbWVudC5zY29yZSwgMCk7XG4gIH1cblxuICB1cGRhdGVTY29yZUJvYXJkKGluZGV4LCBjbGFzc1RvQmVVcGRhdGVkLCBvcHRpb25WYWx1ZT8sIHNjb3JlPykge1xuICAgIHRoaXMucHJvZ3Jlc3NCYXJDbGFzcy5mb3JFYWNoKChlbGUpID0+IHtcbiAgICAgIGlmIChlbGUuaW5kZXggLSAxID09PSBpbmRleCkge1xuICAgICAgICBlbGUuY2xhc3MgPSBjbGFzc1RvQmVVcGRhdGVkO1xuICAgICAgICBlbGUuc2NvcmUgPSBzY29yZSA/IHNjb3JlIDogMDtcblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoIXRoaXMuc2hvd0ZlZWRCYWNrKSB7XG4gICAgICAgICAgZWxlLnZhbHVlID0gb3B0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qIEVuZCBvZiBzY29yZSBtZXRob2RzICAqL1xuXG4gIC8qIFN0YXJ0IG9mIEltYWdlIHpvb20gcmVsYXRlZCAqL1xuICBzZXRJbWFnZUhlaWdodFdpZHRoQ2xhc3MoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXNzZXQtdmFyaWFibGVdJykuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgICBpZiAoaW1hZ2UuY2xpZW50SGVpZ2h0ID4gaW1hZ2UuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKCdjbGFzcycsICdwb3J0cmFpdCcpO1xuICAgICAgfSBlbHNlIGlmIChpbWFnZS5jbGllbnRIZWlnaHQgPCBpbWFnZS5jbGllbnRXaWR0aCkge1xuICAgICAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2xhbmRzY2FwZScpO1xuICAgICAgfVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgaW1hZ2Uuc2V0QXR0cmlidXRlKCdjbGFzcycsICduZXV0cmFsJyk7XG4gICAgICAvLyB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRJbWFnZVpvb20oKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSAtIDE7XG4gICAgY29uc3QgY3VycmVudFF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uc1tpbmRleF0/LmlkZW50aWZpZXI7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXNzZXQtdmFyaWFibGVdJykuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICBpZihpbWFnZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnaW1nJykgeyByZXR1cm4gO31cbiAgICAgIGNvbnN0IGltYWdlSWQgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXNzZXQtdmFyaWFibGUnKTtcbiAgICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnb3B0aW9uLWltYWdlJyk7XG4gICAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoJ2lkJywgaW1hZ2VJZCk7XG4gICAgICBfLmZvckVhY2godGhpcy5jdXJyZW50UXVlc3Rpb25zTWVkaWEsICh2YWwpID0+IHtcbiAgICAgICAgaWYgKGltYWdlSWQgPT09IHZhbC5pZCkge1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudENvbmZpZy5pc0F2YWlsYWJsZUxvY2FsbHkgJiYgdGhpcy5wYXJlbnRDb25maWcuYmFzZVVybCkge1xuICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB0aGlzLnBhcmVudENvbmZpZy5iYXNlVXJsO1xuICAgICAgICAgICAgYmFzZVVybCA9IGAke2Jhc2VVcmwuc3Vic3RyaW5nKDAsIGJhc2VVcmwubGFzdEluZGV4T2YoJy8nKSl9LyR7dGhpcy5zZWN0aW9uQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXJ9YDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVlc3Rpb25JZCkge1xuICAgICAgICAgICAgICBpbWFnZVsnc3JjJ10gPSBgJHtiYXNlVXJsfS8ke2N1cnJlbnRRdWVzdGlvbklkfS8ke3ZhbC5zcmN9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbC5iYXNlVXJsKSB7XG4gICAgICAgICAgICBpbWFnZVsnc3JjJ10gPSB2YWwuYmFzZVVybCArIHZhbC5zcmM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdkVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsICdtYWduaWZ5LWljb24nKTtcbiAgICAgIGRpdkVsZW1lbnQub25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuem9vbUNsaWNrZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgICAgICAgdGhpcy56b29tSW1nU3JjID0gaW1hZ2VbJ3NyYyddO1xuICAgICAgICB0aGlzLnNob3dab29tTW9kYWwgPSB0cnVlO1xuICAgICAgICBjb25zdCB6b29tSW1hZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2VNb2RhbCcpO1xuICAgICAgICBpZiAoem9vbUltYWdlLmNsaWVudEhlaWdodCA+IGltYWdlLmNsaWVudFdpZHRoKSB7XG4gICAgICAgICAgem9vbUltYWdlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncG9ydHJhaXQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZS5jbGllbnRIZWlnaHQgPCBpbWFnZS5jbGllbnRXaWR0aCkge1xuICAgICAgICAgIHpvb21JbWFnZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2xhbmRzY2FwZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHpvb21JbWFnZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ25ldXRyYWwnKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH07XG4gICAgICBpbWFnZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXZFbGVtZW50LCBpbWFnZS5uZXh0U2libGluZyk7XG4gICAgfSk7XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLnpvb21JbkNsaWNrZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpKTtcbiAgICB0aGlzLmltYWdlWm9vbUNvdW50ID0gdGhpcy5pbWFnZVpvb21Db3VudCArIDEwO1xuICAgIHRoaXMuc2V0SW1hZ2VNb2RhbEhlaWdodFdpZHRoKCk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS56b29tT3V0Q2xpY2tlZCwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuaW1hZ2Vab29tQ291bnQgPiAxMDApIHtcbiAgICAgIHRoaXMuaW1hZ2Vab29tQ291bnQgPSB0aGlzLmltYWdlWm9vbUNvdW50IC0gMTA7XG4gICAgICB0aGlzLnNldEltYWdlTW9kYWxIZWlnaHRXaWR0aCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldEltYWdlTW9kYWxIZWlnaHRXaWR0aCgpIHtcbiAgICB0aGlzLmltYWdlTW9kYWwubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuaW1hZ2Vab29tQ291bnR9JWA7XG4gICAgdGhpcy5pbWFnZU1vZGFsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5pbWFnZVpvb21Db3VudH0lYDtcbiAgfVxuXG4gIGNsb3NlWm9vbSgpIHtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuem9vbUNsb3NlQ2xpY2tlZCwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgdGhpcy5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZU1vZGFsJykucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgIHRoaXMuc2hvd1pvb21Nb2RhbCA9IGZhbHNlO1xuICB9XG4gIC8qIEVuZCBvZiBJbWFnZSB6b29tIHJlbGF0ZWQgKi9cblxuICBjbGVhclRpbWVJbnRlcnZhbCgpIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbFJlZikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaW50ZXJ2YWxSZWYpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpiZWZvcmV1bmxvYWQnKVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZXJyb3JTZXJ2aWNlLmdldEludGVybmV0Q29ubmVjdGl2aXR5RXJyb3IudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInF1bWwtY29udGFpbmVyXCIgKm5nSWY9XCJsb2FkVmlld1wiIFtoaWRkZW5dPVwic2hvd1pvb21Nb2RhbFwiPlxuICA8ZGl2IFtoaWRkZW5dPVwic2hvd1NvbHV0aW9uXCIgY2xhc3M9XCJxdW1sLWxhbmRzY2FwZVwiPlxuICAgIDxxdW1sLWhlYWRlciBjbGFzcz1cIm1haW4taGVhZGVyXCIgKGR1cmF0aW9uRW5kcyk9XCJkdXJhdGlvbkVuZHMoKVwiIFtkaXNhYmxlUHJldmlvdXNOYXZpZ2F0aW9uXT1cImxpbmVhck5hdmlnYXRpb25cIlxuICAgICAgW2R1cmF0aW9uXT1cInRpbWVMaW1pdFwiIFt3YXJuaW5nVGltZV09XCJ3YXJuaW5nVGltZVwiIFtzaG93V2FybmluZ1RpbWVyXT1cInNob3dXYXJuaW5nVGltZXJcIiBbc2hvd1RpbWVyXT1cInNob3dUaW1lclwiIFtzaG93TGVnZW5kXT1cInBhcmVudENvbmZpZz8uc2hvd0xlZ2VuZFwiXG4gICAgICAobmV4dFNsaWRlQ2xpY2tlZCk9XCJuZXh0U2xpZGVDbGlja2VkKCRldmVudClcIiAocHJldlNsaWRlQ2xpY2tlZCk9XCJwcmV2aW91c1NsaWRlQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgIFtjdXJyZW50U2xpZGVJbmRleF09XCJjdXJyZW50U2xpZGVJbmRleFwiIFt0b3RhbE5vT2ZRdWVzdGlvbnNdPVwibm9PZlF1ZXN0aW9uc1wiIFthY3RpdmVdPVwiYWN0aXZlXCJcbiAgICAgIFtzaG93RmVlZEJhY2tdPVwic2hvd0ZlZWRCYWNrXCIgW2N1cnJlbnRTb2x1dGlvbnNdPVwiY3VycmVudFNvbHV0aW9uc1wiIChzaG93U29sdXRpb24pPVwidmlld1NvbHV0aW9uKClcIlxuICAgICAgW2luaXRpYWxpemVUaW1lcl09XCJpbml0aWFsaXplVGltZXJcIiBbcmVwbGF5ZWRdPVwicGFyZW50Q29uZmlnPy5pc1JlcGxheWVkXCIgW2Rpc2FibGVOZXh0XT1cImRpc2FibGVOZXh0XCJcbiAgICAgIFtzdGFydFBhZ2VJbnN0cnVjdGlvbl09XCJzdGFydFBhZ2VJbnN0cnVjdGlvblwiIFthdHRlbXB0c109XCJhdHRlbXB0c1wiIFtzaG93U3RhcnRQYWdlXT1cInNob3dTdGFydFBhZ2VcIlxuICAgICAgW3Nob3dEZXZpY2VPcmllbnRhdGlvbl09XCJzZWN0aW9uQ29uZmlnPy5jb25maWc/LnNob3dEZXZpY2VPcmllbnRhdGlvblwiICh0b2dnbGVTY3JlZW5Sb3RhdGUpPVwidG9nZ2xlU2NyZWVuUm90YXRlKClcIj5cbiAgICA8L3F1bWwtaGVhZGVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImxhbmRzY2FwZS1tb2RlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFuc2NhcGUtbW9kZS1sZWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LXNsaWRlXCIgKm5nSWY9XCJjdXJyZW50U2xpZGVJbmRleCAhPT0gMFwiPlxuICAgICAgICAgIHt7bXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpfX0ve3tub09mUXVlc3Rpb25zfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U29sdXRpb25zICYmIHNob3dVc2VyU29sdXRpb25cIj5cbiAgICAgICAgICA8cXVtbC1hbnMgKGNsaWNrKT1cImdldFNvbHV0aW9ucygpXCIgKGtleWRvd24pPVwib25BbnN3ZXJLZXlEb3duKCRldmVudClcIj48L3F1bWwtYW5zPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxhbmRzY2FwZS1jb250ZW50XCI+XG4gICAgICAgIDxjYXJvdXNlbCBjbGFzcz1cImxhbmRzY2FwZS1jZW50ZXJcIiBbaW50ZXJ2YWxdPVwiMFwiIFtzaG93SW5kaWNhdG9yc109XCJmYWxzZVwiIFtub1dyYXBdPVwidHJ1ZVwiICNteUNhcm91c2VsXG4gICAgICAgICAgKGFjdGl2ZVNsaWRlQ2hhbmdlKT1cImFjdGl2ZVNsaWRlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8c2xpZGU+XG4gICAgICAgICAgICA8cXVtbC1zdGFydHBhZ2VcbiAgICAgICAgICAgICAgW2luc3RydWN0aW9uc109XCJzaG93Um9vdEluc3RydWN0aW9uID8gcGFyZW50Q29uZmlnPy5pbnN0cnVjdGlvbnMgOiBzZWN0aW9uQ29uZmlnLm1ldGFkYXRhPy5pbnN0cnVjdGlvbnNcIlxuICAgICAgICAgICAgICBbcG9pbnRzXT1cInBvaW50c1wiIFt0aW1lXT1cInNob3dSb290SW5zdHJ1Y3Rpb24gPyB0aW1lTGltaXQgOiBudWxsXCIgW3Nob3dUaW1lcl09XCJzaG93VGltZXJcIlxuICAgICAgICAgICAgICBbdG90YWxOb09mUXVlc3Rpb25zXT1cInNob3dSb290SW5zdHJ1Y3Rpb24gPyBwYXJlbnRDb25maWc/LnF1ZXN0aW9uQ291bnQgOiBub09mUXVlc3Rpb25zXCJcbiAgICAgICAgICAgICAgW2NvbnRlbnROYW1lXT1cInNob3dSb290SW5zdHJ1Y3Rpb24gPyBwYXJlbnRDb25maWc/LmNvbnRlbnROYW1lIDogcGFyZW50Q29uZmlnPy5pc1NlY3Rpb25zQXZhaWxhYmxlID8gc2VjdGlvbkNvbmZpZz8ubWV0YWRhdGE/Lm5hbWUgOiBwYXJlbnRDb25maWc/LmNvbnRlbnROYW1lXCI+XG4gICAgICAgICAgICA8L3F1bWwtc3RhcnRwYWdlPlxuICAgICAgICAgIDwvc2xpZGU+XG4gICAgICAgICAgPHNsaWRlICpuZ0Zvcj1cImxldCBxdWVzdGlvbiBvZiBxdWVzdGlvbnM7IGxldCBpPSBpbmRleFwiICNxdWVzdGlvblNsaWRlPlxuICAgICAgICAgICAgPGRpdiBbaWRdPVwicXVlc3Rpb24uaWRlbnRpZmllclwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24/LnByaW1hcnlDYXRlZ29yeS50b0xvd2VyQ2FzZSgpID09PSAnbXVsdGlwbGUgY2hvaWNlIHF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgICAgIDxxdW1sLW1jcSBbc2h1ZmZsZU9wdGlvbnNdPSdzaHVmZmxlT3B0aW9ucycgW3F1ZXN0aW9uXT0ncXVlc3Rpb24nIFtyZXBsYXllZF09XCJwYXJlbnRDb25maWc/LmlzUmVwbGF5ZWRcIlxuICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cImdldE9wdGlvblNlbGVjdGVkKCRldmVudClcIiBbaWRlbnRpZmllcl09XCJxdWVzdGlvbi5pZFwiIFt0cnlBZ2Fpbl09XCJ0cnlBZ2FpbkNsaWNrZWRcIj5cbiAgICAgICAgICAgICAgICA8L3F1bWwtbWNxPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy5wcmltYXJ5Q2F0ZWdvcnkudG9Mb3dlckNhc2UoKSA9PT0gJ3N1YmplY3RpdmUgcXVlc3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgPHF1bWwtc2EgW3F1ZXN0aW9uc109J3F1ZXN0aW9uJyBbcmVwbGF5ZWRdPVwicGFyZW50Q29uZmlnPy5pc1JlcGxheWVkXCIgW2Jhc2VVcmxdPVwicGFyZW50Q29uZmlnPy5iYXNlVXJsXCJcbiAgICAgICAgICAgICAgICAgIChzaG93QW5zd2VyQ2xpY2tlZCk9XCJzaG93QW5zd2VyQ2xpY2tlZCgkZXZlbnQsIHF1ZXN0aW9uKVwiPlxuICAgICAgICAgICAgICAgIDwvcXVtbC1zYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NsaWRlPlxuICAgICAgICA8L2Nhcm91c2VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFuc2NhcGUtbW9kZS1yaWdodFwiPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cInNob3dGZWVkQmFjay1wcm9ncmVzc0JhciBpbmZvLXBhZ2UgaG92ZXItZWZmZWN0XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGN1cnJlbnRTbGlkZUluZGV4ID09PSAwKSA/ICdhdHQtY29sb3IgcHJvZ3Jlc3NCYXItYm9yZGVyJzogJ2F0dC1jb2xvcicgXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwib25FbnRlcigkZXZlbnQsIDApXCIgKGNsaWNrKT1cImdvVG9TbGlkZUNsaWNrZWQoJGV2ZW50LCAwKVwiPmlcbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDx1bCAqbmdJZj1cInBhcmVudENvbmZpZz8uaXNTZWN0aW9uc0F2YWlsYWJsZVwiIGNsYXNzPVwic2NvcmVib2FyZC1zZWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNlY3Rpb24gcmVsYXRpdmVcIiAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBtYWluUHJvZ3Jlc3NCYXI7IGxldCBpPWluZGV4O1wiXG4gICAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJzZWN0aW9uIHt7c2VjdGlvbj8uaW5kZXh9fVwiIChjbGljayk9XCJqdW1wVG9TZWN0aW9uKHNlY3Rpb24/LmlkZW50aWZpZXIpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VjdGlvbkVudGVyKCRldmVudCwgc2VjdGlvbj8uaWRlbnRpZmllcilcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhdHRlbXB0ZWQnIDogc2VjdGlvbi5jbGFzcyA9PT0gJ2F0dGVtcHRlZCcsICdwYXJ0aWFsJzogc2VjdGlvbi5jbGFzcyA9PT0gJ3BhcnRpYWwnfVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImxpc3QtaXRlbS17e2l9fVwiIGNsYXNzPVwicHJvZ3Jlc3NCYXItYm9yZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUnIDogc2VjdGlvbj8uaXNBY3RpdmUgJiYgIXNob3dSb290SW5zdHJ1Y3Rpb24gJiYgc2VjdGlvbi5jbGFzcyAhPT0gJ2F0dGVtcHRlZCd9XCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCI+e3tzZWN0aW9uPy5pbmRleH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInNlY3Rpb24/LmlzQWN0aXZlICYmIHNob3dGZWVkQmFja1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIHByb2dyZXNzQmFyQ2xhc3M7IGxldCBqPWluZGV4XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJxdWVzdGlvbiBudW1iZXIge3txdWVzdGlvbj8uaW5kZXh9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9TbGlkZUNsaWNrZWQoJGV2ZW50LCBxdWVzdGlvbj8uaW5kZXgpXCIgKGtleWRvd24pPVwib25FbnRlcigkZXZlbnQsIHF1ZXN0aW9uPy5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hvd0ZlZWRCYWNrLXByb2dyZXNzQmFyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoaisxKSA9PT0gbXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpID8gKHF1ZXN0aW9uLmNsYXNzID09PSAnc2tpcHBlZCcgPyAncHJvZ3Jlc3NCYXItYm9yZGVyJyA6ICdwcm9ncmVzc0Jhci1ib3JkZXIgJyArIHF1ZXN0aW9uLmNsYXNzKSA6IHF1ZXN0aW9uLmNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3txdWVzdGlvbj8uaW5kZXh9fVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5vbkZlZWRiYWNrXCIgKm5nSWY9XCJzZWN0aW9uPy5pc0FjdGl2ZSAmJiAhc2hvd0ZlZWRCYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2YgcHJvZ3Jlc3NCYXJDbGFzczsgbGV0IGo9aW5kZXhcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInF1ZXN0aW9uIG51bWJlciB7e3F1ZXN0aW9uPy5pbmRleH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1NsaWRlQ2xpY2tlZCgkZXZlbnQsIHF1ZXN0aW9uPy5pbmRleClcIiAoa2V5ZG93bik9XCJvbkVudGVyKCRldmVudCwgcXVlc3Rpb24/LmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93RmVlZEJhY2stcHJvZ3Jlc3NCYXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihqKzEpID09PSBteUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgPyAocXVlc3Rpb24uY2xhc3MgPT09ICdza2lwcGVkJyA/ICdwcm9ncmVzc0Jhci1ib3JkZXInIDogJ2F0dC1jb2xvciBwcm9ncmVzc0Jhci1ib3JkZXInKSA6IHF1ZXN0aW9uLmNsYXNzID09PSAnc2tpcHBlZCcgPyBxdWVzdGlvbi5jbGFzczogcXVlc3Rpb24uY2xhc3MgPT09ICd1bmF0dGVtcHRlZCcgPyAnJyA6ICdhdHQtY29sb3InXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3txdWVzdGlvbj8uaW5kZXh9fVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2luZ2xlQ29udGVudFwiICpuZ0lmPVwiIXBhcmVudENvbmZpZz8uaXNTZWN0aW9uc0F2YWlsYWJsZSAmJiBzaG93RmVlZEJhY2tcIj5cbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIHByb2dyZXNzQmFyQ2xhc3M7IGxldCBqPWluZGV4XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInF1ZXN0aW9uIG51bWJlciB7e3F1ZXN0aW9uPy5pbmRleH19XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvU2xpZGVDbGlja2VkKCRldmVudCwgcXVlc3Rpb24/LmluZGV4KVwiIChrZXlkb3duKT1cIm9uRW50ZXIoJGV2ZW50LCBxdWVzdGlvbj8uaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hvd0ZlZWRCYWNrLXByb2dyZXNzQmFyIGhvdmVyLWVmZmVjdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoaisxKSA9PT0gbXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpID8gKHF1ZXN0aW9uLmNsYXNzID09PSAnc2tpcHBlZCcgPyAncHJvZ3Jlc3NCYXItYm9yZGVyJyA6ICdwcm9ncmVzc0Jhci1ib3JkZXIgJyArIHF1ZXN0aW9uLmNsYXNzKSA6IHF1ZXN0aW9uLmNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICB7e3F1ZXN0aW9uPy5pbmRleH19XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNpbmdsZUNvbnRlbnQgbm9uRmVlZGJhY2tcIiAqbmdJZj1cIiFwYXJlbnRDb25maWc/LmlzU2VjdGlvbnNBdmFpbGFibGUgJiYgIXNob3dGZWVkQmFja1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2YgcHJvZ3Jlc3NCYXJDbGFzczsgbGV0IGo9aW5kZXhcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwicXVlc3Rpb24gbnVtYmVyIHt7cXVlc3Rpb24/LmluZGV4fX1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9TbGlkZUNsaWNrZWQoJGV2ZW50LCBxdWVzdGlvbj8uaW5kZXgpXCIgKGtleWRvd24pPVwib25FbnRlcigkZXZlbnQsIHF1ZXN0aW9uPy5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93RmVlZEJhY2stcHJvZ3Jlc3NCYXIgaG92ZXItZWZmZWN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihqKzEpID09PSBteUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgPyAocXVlc3Rpb24uY2xhc3MgPT09ICdza2lwcGVkJyA/ICdwcm9ncmVzc0Jhci1ib3JkZXInIDogJ2F0dC1jb2xvciBwcm9ncmVzc0Jhci1ib3JkZXInKSA6IHF1ZXN0aW9uLmNsYXNzID09PSAnc2tpcHBlZCcgPyBxdWVzdGlvbi5jbGFzczogcXVlc3Rpb24uY2xhc3MgPT09ICd1bmF0dGVtcHRlZCcgPyAnJyA6ICdhdHQtY29sb3InXCI+XG4gICAgICAgICAgICAgICAgICB7e3F1ZXN0aW9uPy5pbmRleH19XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJyZXF1aXJlc1N1Ym1pdCBjdXJzb3ItcG9pbnRlciBzaG93RmVlZEJhY2stcHJvZ3Jlc3NCYXIgaG92ZXItZWZmZWN0XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cInNjb3JlYm9hcmRcIiAqbmdJZj1cInBhcmVudENvbmZpZy5yZXF1aXJlc1N1Ym1pdCAmJiBwcm9ncmVzc0JhckNsYXNzPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGlzYWJsZU5leHQgPSB0cnVlOyBvblNjb3JlQm9hcmRDbGlja2VkKClcIiAoa2V5ZG93bik9XCJvblNjb3JlQm9hcmRFbnRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZmxhZ19pbmFjdGl2ZS5zdmdcIiBhbHQ9XCJGbGFnIGxvZ286IFNob3cgc2NvcmVib2FyZFwiPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwhLS0gPGxpIGNsYXNzPVwicmVxdWlyZXNTdWJtaXRcIiAqbmdJZj1cImxvYWRTY29yZUJvYXJkICYmIHBhcmVudENvbmZpZy5yZXF1aXJlc1N1Ym1pdFwiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2ZsYWdfYWN0aXZlLnN2Z1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgPC9saT4gLS0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPHF1bWwtYWxlcnQgKm5nSWY9XCJzaG93QWxlcnQgJiYgc2hvd0ZlZWRCYWNrXCIgW2FsZXJ0VHlwZV09XCJhbGVydFR5cGVcIiBbaXNIaW50QXZhaWxhYmxlXT1cInNob3dIaW50c1wiXG4gICAgW3Nob3dTb2x1dGlvbkJ1dHRvbl09XCJzaG93VXNlclNvbHV0aW9uICYmIGN1cnJlbnRTb2x1dGlvbnNcIiAoc2hvd1NvbHV0aW9uKT1cInZpZXdTb2x1dGlvbigpXCIgKHNob3dIaW50KT1cInZpZXdIaW50KClcIlxuICAgIChjbG9zZUFsZXJ0KT1cImNsb3NlQWxlcnRCb3goJGV2ZW50KVwiPjwvcXVtbC1hbGVydD5cblxuICA8cXVtbC1tY3Etc29sdXRpb25zICpuZ0lmPVwic2hvd1NvbHV0aW9uXCIgW3F1ZXN0aW9uXT1cImN1cnJlbnRRdWVzdGlvblwiIFtvcHRpb25zXT1cImN1cnJlbnRPcHRpb25zXCJcbiAgICBbc29sdXRpb25zXT1cImN1cnJlbnRTb2x1dGlvbnNcIiBbYmFzZVVybF09XCJwYXJlbnRDb25maWc/LmJhc2VVcmxcIiBbbWVkaWFdPVwibWVkaWFcIiBbaWRlbnRpZmllcl09XCJjdXJyZW50UXVlc3Rpb25JbmRldGlmaWVyXCIgKGNsb3NlKT1cImNsb3NlU29sdXRpb24oKVwiPjwvcXVtbC1tY3Etc29sdXRpb25zPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpbmZvLXBvcHVwXCIgKm5nSWY9XCJpbmZvUG9wdXBcIj5cbiAgUGxlYXNlIGF0dGVtcHQgdGhlIHF1ZXN0aW9uXG48L2Rpdj5cblxuPHNiLXBsYXllci1jb250ZW50ZXJyb3IgKm5nSWY9XCJzaG93Q29udGVudEVycm9yXCI+PC9zYi1wbGF5ZXItY29udGVudGVycm9yPlxuXG5cbjwhLS0gWm9vbSAtLT5cbjxkaXYgY2xhc3M9XCJpbWFnZS12aWV3ZXJfX292ZXJsYXlcIiBbaGlkZGVuXT1cIiFzaG93Wm9vbU1vZGFsXCI+XG4gIDxkaXYgY2xhc3M9XCJpbWFnZS12aWV3ZXJfX2Nsb3NlXCIgKGNsaWNrKT1cImNsb3NlWm9vbSgpXCI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiaW1hZ2Utdmlld2VyX19jb250YWluZXJcIj5cbiAgICA8aW1nICNpbWFnZU1vZGFsIGlkPVwiaW1hZ2VNb2RhbFwiIGNsYXNzPVwiaW1hZ2Utdmlld2VyX19pbWdcIiBbc3JjXT1cInpvb21JbWdTcmNcIiBhbHQ9XCJab29tZWQgaW1hZ2VcIj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJpbWFnZS12aWV3ZXJfX3pvb21cIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utdmlld2VyX196b29taW5cIiAoY2xpY2spPVwiem9vbUluKClcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utdmlld2VyX196b29tb3V0XCIgKGNsaWNrKT1cInpvb21PdXQoKVwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==