1 line
599 KiB
Plaintext
1 line
599 KiB
Plaintext
{"version":3,"sources":["../../loader/bootstrap.js","css!taoQtiTestCss/new-test-runner","../controller/runner/runner.js","../runner/config/assetManager.js","../runner/config/qtiServiceConfig.js","../runner/config/states.js","../runner/helpers/currentItem.js","../runner/helpers/getTimerMessage.js","../runner/helpers/map.js","../runner/helpers/isReviewPanelEnabled.js","../runner/helpers/stats.js","../runner/helpers/messages.js","../runner/helpers/navigation.js","../runner/helpers/offlineErrorHelper.js","../runner/helpers/offlineSyncModal.js","../runner/helpers/testContextBuilder.js","../runner/navigator/navigator.js","../runner/branchRule/helpers/branchRuleHelper.js","../runner/branchRule/types/match.js","../runner/branchRule/types/or.js","../runner/branchRule/types/and.js","../runner/branchRule/types/not.js","../runner/branchRule/branchRuleMapper.js","../runner/branchRule/branchRule.js","../runner/services/offlineJumpTable.js","../runner/navigator/offlineNavigator.js","../runner/provider/dataUpdater.js","../runner/provider/toolStateBridge.js","../runner/ui/toolbox/entry.js","../runner/ui/toolbox/menu.js","../runner/ui/toolbox/text.js","../runner/ui/toolbox/toolbox.js","../runner/provider/stopwatch.js","../runner/provider/qti.js","../runner/proxy/cache/actionStore.js","../runner/proxy/cache/preloaders/assets/audio.js","../runner/proxy/cache/preloaders/assets/image.js","../runner/proxy/cache/preloaders/assets/stylesheet.js","../runner/proxy/cache/preloaders/assets/preloaders.js","../runner/proxy/cache/preloaderManager.js","../runner/proxy/cache/assetPreloader.js","../runner/proxy/cache/preloaders/interactions/extendedText.js","../runner/proxy/cache/preloaders/interactions/preloaders.js","../runner/proxy/cache/interactionPreloader.js","../runner/proxy/cache/itemPreloader.js","../runner/proxy/cache/itemStore.js","../runner/proxy/qtiServiceProxy.js","../runner/proxy/cache/proxy.js","../runner/proxy/loader.js","../runner/services/responseStore.js","../runner/proxy/offline/proxy.js","onLayerEnd0.js","module-create.js","/home/maria/project/nfer-enot/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","\ndefine('css!taoQtiTestCss/new-test-runner',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner controller entry\n *\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/runner/runner',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'context',\n 'module',\n 'core/router',\n 'core/logger',\n 'layout/loading-bar',\n 'ui/feedback',\n 'util/url',\n 'util/locale',\n 'taoTests/runner/providerLoader',\n 'taoTests/runner/runner',\n 'css!taoQtiTestCss/new-test-runner'\n], function (\n $,\n _,\n __,\n context,\n module,\n router,\n loggerFactory,\n loadingBar,\n feedback,\n urlUtil,\n locale,\n providerLoader,\n runner\n) {\n 'use strict';\n\n /**\n * List of options required by the controller\n * @type {String[]}\n */\n const requiredOptions = [\n 'testDefinition',\n 'testCompilation',\n 'serviceCallId',\n 'bootstrap',\n 'options',\n 'providers'\n ];\n\n /**\n * The runner controller\n */\n return {\n\n /**\n * Controller entry point\n *\n * @param {Object} config - the testRunner config\n * @param {String} config.testDefinition - the test definition id\n * @param {String} config.testCompilation - the test compilation id\n * @param {String} config.serviceCallId - the service call id\n * @param {Object} config.bootstrap - contains the extension and the controller to call\n * @param {Object} config.options - the full URL where to return at the final end of the test\n * @param {Object[]} config.providers - the collection of providers to load\n */\n start(config) {\n let exitReason;\n const $container = $('.runner');\n\n const logger = loggerFactory('controller/runner', {\n serviceCallId : config.serviceCallId,\n plugins : config && config.providers && Object.keys(config.providers.plugins)\n });\n\n let preventFeedback = false;\n let errorFeedback = null;\n\n /**\n * Exit the test runner using the configured exitUrl\n * @param {String} [reason] - to add a warning once left\n * @param {String} [level] - error level\n */\n const exit = function exit(reason, level){\n let url = config.options.exitUrl;\n const params = {};\n if (reason) {\n if (!level) {\n level = 'warning';\n }\n params[level] = reason;\n url = urlUtil.build(url, params);\n }\n window.location = url;\n };\n\n /**\n * Handles errors\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onError = function onError(err, displayMessage) {\n onFeedback(err, displayMessage, \"error\");\n };\n\n /**\n * Handles warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onWarning = function onWarning(err, displayMessage) {\n onFeedback(err, displayMessage, \"warning\");\n };\n\n /**\n * Handles errors & warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n * @param {String} [type] - \"error\" or \"warning\"\n */\n const onFeedback = function onFeedback(err, displayMessage, type) {\n const typeMap = {\n warning: {\n logger: \"warn\",\n feedback: \"warning\"\n },\n error: {\n logger: \"error\",\n feedback: \"error\"\n }\n };\n const loggerByType = logger[typeMap[type].logger];\n const feedbackByType = feedback()[typeMap[type].feedback];\n\n displayMessage = displayMessage || err.message;\n\n if(!_.isString(displayMessage)){\n displayMessage = JSON.stringify(displayMessage);\n }\n loadingBar.stop();\n\n loggerByType({ displayMessage : displayMessage }, err);\n\n if(type === \"error\" && (err.code === 403 || err.code === 500)) {\n displayMessage = `${__('An error occurred during the test, please content your administrator.')} ${displayMessage}`;\n return exit(displayMessage, 'error');\n }\n if (!preventFeedback) {\n errorFeedback = feedbackByType(displayMessage, {timeout: -1});\n }\n };\n\n const moduleConfig = module.config();\n\n loadingBar.start();\n\n // adding attr for RTL languages\n $('.delivery-scope').attr({dir: locale.getLanguageDirection(context.locale)});\n\n // verify required config\n if ( ! requiredOptions.every( option => typeof config[option] !== 'undefined') ) {\n return onError(new TypeError(__('Missing required configuration option %s', name)));\n }\n\n // dispatch any extra registered routes\n if (moduleConfig && _.isArray(moduleConfig.extraRoutes) && moduleConfig.extraRoutes.length) {\n router.dispatch(moduleConfig.extraRoutes);\n }\n\n //for the qti provider to be selected here\n config.provider = Object.assign( config.provider || {}, { runner: 'qti' });\n\n //load the plugins and the proxy provider\n providerLoader(config.providers, context.bundle)\n .then(function (results) {\n\n const testRunnerConfig = _.omit(config, ['providers']);\n testRunnerConfig.renderTo = $container;\n\n if (results.proxy && typeof results.proxy.getAvailableProviders === 'function') {\n const loadedProxies = results.proxy.getAvailableProviders();\n testRunnerConfig.provider.proxy = loadedProxies[0];\n }\n\n logger.debug({\n config: testRunnerConfig,\n providers : config.providers\n }, 'Start test runner');\n\n //instantiate the QtiTestRunner\n runner(config.provider.runner, results.plugins, testRunnerConfig)\n .on('error', onError)\n .on('warning', onWarning)\n .on('ready', function () {\n _.defer(function () {\n $container.removeClass('hidden');\n });\n })\n .on('pause', function(data) {\n if (data && data.reason) {\n exitReason = data.reason;\n }\n })\n .after('destroy', function () {\n this.removeAllListeners();\n\n // at the end, we are redirected to the exit URL\n exit(exitReason);\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('disablefeedbackalerts', function() {\n if (errorFeedback) {\n errorFeedback.close();\n }\n preventFeedback = true;\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('enablefeedbackalerts', function() {\n preventFeedback = false;\n })\n .init();\n })\n .catch(function(err){\n onError(err, __('An error occurred during the test initialization!'));\n });\n }\n };\n});\n\n","define('taoQtiTest/runner/config/assetManager',['taoItems/assets/manager', 'taoItems/assets/strategies', 'taoQtiItem/portableElementRegistry/assetManager/portableAssetStrategy'], function (assetManagerFactory, assetStrategies, assetPortableElement) { 'use strict';\n\n assetManagerFactory = assetManagerFactory && Object.prototype.hasOwnProperty.call(assetManagerFactory, 'default') ? assetManagerFactory['default'] : assetManagerFactory;\n assetStrategies = assetStrategies && Object.prototype.hasOwnProperty.call(assetStrategies, 'default') ? assetStrategies['default'] : assetStrategies;\n assetPortableElement = assetPortableElement && Object.prototype.hasOwnProperty.call(assetPortableElement, 'default') ? assetPortableElement['default'] : assetPortableElement;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA ;\n */\n /**\n * The default strategies\n */\n\n var defaultStrategies = [assetStrategies.packedUrl, assetStrategies.external, assetStrategies.base64, assetStrategies.baseUrl, assetPortableElement]; //keep reference per test id\n\n var assetManagers = {};\n /**\n * Gives access to a configured assetManagerFactory\n * @param {String} testId - a unique identifier for the test instance\n * @returns {assetManagerFactory}\n */\n\n function getAssetManager(testId) {\n var assetManager;\n\n if (typeof assetManagers[testId] !== 'undefined') {\n assetManager = assetManagers[testId];\n } else {\n assetManager = assetManagerFactory(defaultStrategies, {\n baseUrl: ''\n });\n assetManagers[testId] = assetManager;\n }\n\n return assetManager;\n }\n\n return getAssetManager;\n\n});\n\n","define('taoQtiTest/runner/config/qtiServiceConfig',['lodash', 'util/url', 'util/config'], function (_, urlUtil, configHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n urlUtil = urlUtil && Object.prototype.hasOwnProperty.call(urlUtil, 'default') ? urlUtil['default'] : urlUtil;\n configHelper = configHelper && Object.prototype.hasOwnProperty.call(configHelper, 'default') ? configHelper['default'] : configHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n\n var _defaults = {\n bootstrap: {\n serviceController: 'Runner',\n serviceExtension: 'taoQtiTest'\n }\n };\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n\n var _entries = {\n testDefinition: true,\n testCompilation: true,\n serviceCallId: true,\n bootstrap: false,\n timeout: false\n };\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {String} [config.serviceController] - The name of the service controller\n * @param {String} [config.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n\n function configFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef; // convert some values from seconds to milliseconds\n\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n } // returns only a proxy storage object : no direct access to data is provided\n\n\n return {\n /**\n * Gets the URI of the test\n * @returns {String}\n */\n getTestDefinition: function getTestDefinition() {\n return storage.testDefinition;\n },\n\n /**\n * Gets the URI of the compiled delivery\n * @returns {String}\n */\n getTestCompilation: function getTestCompilation() {\n return storage.testCompilation;\n },\n\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId: function getServiceCallId() {\n return storage.serviceCallId;\n },\n\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController: function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension: function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action related to the test\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl: function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n serviceCallId: this.getServiceCallId()\n });\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl: function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n testServiceCallId: this.getServiceCallId(),\n itemDefinition: itemIdentifier\n });\n },\n\n /**\n * Gets an URL of a telemetry signal related to a particular item\n * @param {String} itemIdentifier - The URI of the item\n * @param {String} signal - the name of the signal to request\n * @returns {String} - Returns the URL\n */\n getTelemetryUrl: function getTelemetryUrl(itemIdentifier, signal) {\n return urlUtil.route(signal, this.getServiceController(), this.getServiceExtension(), {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n testServiceCallId: this.getServiceCallId(),\n itemDefinition: itemIdentifier\n });\n },\n\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout: function getTimeout() {\n return storage.timeout;\n },\n\n /**\n * Gets the config for the communication channel\n * @returns {Object}\n */\n getCommunicationConfig: function getCommunicationConfig() {\n var communication = storage.bootstrap.communication || {};\n var extension = communication.extension || this.getServiceExtension();\n var controller = communication.controller || this.getServiceController();\n var action = communication.action;\n var syncActions = communication.syncActions || []; // build the service address from the provided config\n // it can be overwritten by a full url from the config\n\n var service = urlUtil.route(action || 'message', controller, extension, {\n testDefinition: this.getTestDefinition(),\n testCompilation: this.getTestCompilation(),\n serviceCallId: this.getServiceCallId()\n }); // append the address of the remote service to target\n\n var params = _.merge({}, communication.params || {}, {\n service: communication.service || service\n }); // convert some values from seconds to milliseconds\n\n\n if (params.timeout) {\n params.timeout *= 1000;\n } else {\n params.timeout = storage.timeout;\n }\n\n if (params.interval) {\n params.interval *= 1000;\n }\n\n return {\n enabled: communication.enabled,\n type: communication.type,\n params: params,\n syncActions: syncActions\n };\n }\n };\n }\n\n return configFactory;\n\n});\n\n","define('taoQtiTest/runner/config/states',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * The possible states\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\n var states = {\n //the test session states\n testSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n }),\n //the item session states\n itemSession: Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4,\n solution: 5,\n notSelected: 255\n })\n };\n\n return states;\n\n});\n\n","define('taoQtiTest/runner/helpers/currentItem',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n /**\n * List of QTI model cardinalities\n * @type {Object}\n */\n\n var responseCardinalities = {\n single: 'base',\n multiple: 'list',\n ordered: 'list',\n record: 'record'\n };\n /**\n * List of QTI interaction minConstraint properties\n * @type {Object}\n */\n\n var interactionMinConstraintProperties = {\n matchInteraction: 'minAssociations',\n choiceInteraction: 'minChoices',\n orderInteraction: 'minChoices',\n associateInteraction: 'minAssociations',\n hottextInteraction: 'minChoices',\n hotspotInteraction: 'minChoices',\n graphicOrderInteraction: 'minChoices',\n graphicAssociateInteraction: 'minAssociations',\n selectPointInteraction: 'minChoices'\n };\n /**\n * @typedef {currentItemHelper}\n */\n\n var currentItemHelper = {\n /**\n * Gets the responses declarations of the current item.\n * @param {Object} runner - testRunner instance\n * @returns {Object}\n */\n getDeclarations: function getDeclarations(runner) {\n var itemRunner = runner.itemRunner;\n return itemRunner._item && itemRunner._item.responses;\n },\n\n /**\n * Gets a response declaration by the identifier of the response\n * @param {Object} runner - testRunner instance\n * @param {String} identifier - The identifier of the response\n * @returns {Object|null}\n */\n getResponseDeclaration: function getResponseDeclaration(runner, identifier) {\n var found = null;\n\n _.forEach(currentItemHelper.getDeclarations(runner), function (declaration) {\n var attributes = declaration.attributes || {};\n\n if (attributes.identifier === identifier) {\n found = declaration;\n return false;\n }\n });\n\n return found;\n },\n\n /**\n * Convert a value to a response object\n * @param {Array|String} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {Object}\n */\n toResponse: function toResponse(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n var response = {};\n\n if (_.isString(value)) {\n value = [value];\n }\n\n var transform = function transform(v) {\n return v;\n };\n\n if (baseType === 'boolean') {\n transform = function transform(v) {\n return v === true || v === 'true';\n };\n } else if (baseType === 'directedPair' || baseType === 'pair') {\n transform = function transform(v) {\n if (_.isString(v)) {\n return v.split(' ');\n }\n\n return v;\n };\n }\n\n value = _.map(value || [], transform);\n\n if (mappedCardinality) {\n if (mappedCardinality === 'base') {\n if (value.length === 0) {\n //return empty response:\n response.base = null;\n } else {\n response.base = {};\n response.base[baseType] = value[0];\n }\n } else {\n response[mappedCardinality] = {};\n response[mappedCardinality][baseType] = value;\n }\n }\n\n return response;\n },\n\n /**\n * Checks if the provided value can be considered as null\n * @param {Object} value\n * @param {String} baseType\n * @param {String} cardinality\n * @returns {boolean}\n */\n isQtiValueNull: function isQtiValueNull(value, baseType, cardinality) {\n var mappedCardinality = responseCardinalities[cardinality];\n\n if (_.isObject(value) && value[mappedCardinality] === null) {\n value = null;\n }\n\n if (_.isObject(value) && value[mappedCardinality] && 'undefined' !== typeof value[mappedCardinality][baseType]) {\n value = value[mappedCardinality][baseType];\n }\n\n return null === value || 'string' === baseType && _.isEmpty(value) || cardinality !== 'single' && _.isEmpty(value);\n },\n\n /**\n * Tells if an item question has been answered or not\n * @param {Object} response\n * @param {String} baseType\n * @param {String} cardinality\n * @param {Object} [defaultValue]\n * @param {Object} constraintValue\n * @returns {*}\n */\n isQuestionAnswered: function isQuestionAnswered(response, baseType, cardinality, defaultValue, constraintValue) {\n var answered, currentCardinality, responses;\n var fullyAnswered = true;\n defaultValue = defaultValue || null;\n constraintValue = constraintValue || 0;\n\n if (currentItemHelper.isQtiValueNull(response, baseType, cardinality)) {\n answered = false;\n } else {\n answered = !_.isEqual(response, currentItemHelper.toResponse(defaultValue, baseType, cardinality));\n\n if (constraintValue !== 0) {\n currentCardinality = responseCardinalities[cardinality];\n responses = response[currentCardinality][baseType] || [];\n fullyAnswered = responses && responses.length >= constraintValue;\n }\n\n answered = answered && fullyAnswered;\n }\n\n return answered;\n },\n guessInteractionConstraintValues: function guessInteractionConstraintValues(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n var constraintValues = {};\n\n _.forEach(interactions, function (interaction) {\n var attributes = interaction.attributes || {};\n var qtiClass = interaction.__proto__.qtiClass;\n var constraintProperty;\n\n if (Object.prototype.hasOwnProperty.call(interactionMinConstraintProperties, qtiClass)) {\n constraintProperty = interactionMinConstraintProperties[qtiClass];\n constraintValues[attributes.responseIdentifier] = attributes[constraintProperty];\n }\n });\n\n return constraintValues;\n },\n\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n * @param {Object} runner - testRunner instance\n * @param {Boolean} [partially=true] - if false all questions must have been answered\n * @returns {Boolean}\n */\n isAnswered: function isAnswered(runner, partially) {\n var itemRunner = runner.itemRunner;\n var responses = itemRunner && itemRunner.getResponses();\n var count = 0;\n var empty = 0;\n var declarations, constraintValues;\n\n if (itemRunner) {\n declarations = currentItemHelper.getDeclarations(runner);\n constraintValues = currentItemHelper.guessInteractionConstraintValues(runner);\n\n _.forEach(declarations, function (declaration) {\n var attributes = declaration.attributes || {};\n var response = responses[attributes.identifier];\n var baseType = attributes.baseType;\n var cardinality = attributes.cardinality;\n count++;\n\n if (!currentItemHelper.isQuestionAnswered(response, baseType, cardinality, declaration.defaultValue, constraintValues[attributes.identifier])) {\n empty++;\n }\n });\n }\n\n if (partially === false) {\n return count > 0 && empty === 0;\n }\n\n return count > 0 && empty < count;\n },\n\n /**\n * Gets list of shared stimuli hrefs in the current item\n *\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getStimuliHrefs: function getStimuliHrefs(runner) {\n var itemRunner = runner.itemRunner;\n var itemBody = itemRunner._item && itemRunner._item.bdy || {};\n var interactions = itemBody.elements || {};\n return _(interactions).values().filter(function (element) {\n return element.qtiClass === 'include';\n }).pluck('attributes').pluck('href').value();\n },\n\n /**\n * Find the list of text stimulus ids in the current item\n * Depends on the DOM already being loaded\n * @param {Object} runner - testRunner instance\n * @returns {Array}\n */\n getTextStimuliHrefs: function getTextStimuliHrefs(runner) {\n var stimuli = this.getStimuliHrefs(runner);\n var textStimuli;\n\n if (stimuli.length > 0) {\n // Filter the ones containing text:\n textStimuli = stimuli.filter(function (stimulusHref) {\n var domNode = document.querySelector(\".qti-include[data-href=\\\"\".concat(stimulusHref, \"\\\"]\"));\n return _(domNode.childNodes).some(function (child) {\n return child.nodeType === child.TEXT_NODE;\n });\n });\n return textStimuli;\n }\n\n return [];\n }\n };\n\n return currentItemHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/getTimerMessage',['i18n'], function (__) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * Returns timer information string\n * @returns {Boolean}\n */\n\n function getTimerMessage(hours, minutes, seconds, unansweredQuestions, scope) {\n var timerMessage;\n var timeArr = [hours, minutes, seconds];\n var timeArgArr = [];\n [__('hours'), __('minutes'), __('seconds')].forEach(function (unit, idx) {\n if (timeArr[idx] > 0) {\n timeArgArr.push(\"\".concat(timeArr[idx], \" \").concat(unit));\n }\n });\n var answeredMessage;\n\n if (!unansweredQuestions || scope === 'item') {\n answeredMessage = __('the current question');\n } else {\n var questionsMessage = __('questions');\n\n if (unansweredQuestions === 1) {\n questionsMessage = __('question');\n }\n\n answeredMessage = __('remaining %s %s', unansweredQuestions, questionsMessage);\n }\n\n if (timeArgArr.length === 0) {\n timerMessage = __('%s to answer %s', 'no time left', answeredMessage);\n } else {\n timerMessage = __('%s to answer %s', timeArgArr.join(', '), answeredMessage);\n }\n\n return timerMessage;\n }\n\n return getTimerMessage;\n\n});\n\n","define('taoQtiTest/runner/helpers/map',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n /**\n * @typedef {Object} itemStats\n * @property {Number} questions - the number of questions items\n * @property {Number} answered - the number of answered questions\n * @property {Number} flagged - the number of items flagged for review\n * @property {Number} viewed - the number of viewed items\n * @property {Number} total - the total number of items\n * @property {Number} questionsViewed - the number of viewed questions\n */\n\n /**\n * Gets an empty stats record\n * @returns {itemStats}\n */\n\n function getEmptyStats() {\n return {\n questions: 0,\n answered: 0,\n flagged: 0,\n viewed: 0,\n total: 0,\n questionsViewed: 0\n };\n }\n /**\n * Defines a helper that provides extractors for an assessment test map\n */\n\n\n var map = {\n /**\n * Gets the jumps table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getJumps: function getJumps(map) {\n return map && map.jumps;\n },\n\n /**\n * Gets the parts table\n * @param {Object} map - The assessment test map\n * @returns {Object}\n */\n getParts: function getParts(map) {\n return map && map.parts;\n },\n\n /**\n * Get sections table\n * @param {Object} map - The assessment test map\n * @returns {Object} the sections\n */\n getSections: function getSections(map) {\n var parts = this.getParts(map),\n result = {};\n\n _.forEach(parts, function (part) {\n var sections = part.sections;\n\n if (sections) {\n _.forEach(sections, function (section) {\n result[section.id] = section;\n });\n }\n });\n\n return result;\n },\n\n /**\n * Get active item from the test map\n * @param {Object} map - The assessment test map\n * @returns {Object} the active item\n */\n getActiveItem: function getActiveItem(map) {\n var parts = this.getParts(map),\n result = {};\n\n _.forEach(parts, function (part) {\n var sections = part.sections;\n\n if (sections) {\n _.forEach(sections, function (section) {\n if (section.active) {\n var items = section.items;\n\n _.forEach(items, function (item) {\n if (item.active) {\n result = item;\n }\n });\n }\n });\n }\n });\n\n return result;\n },\n\n /**\n * Return the list of remaining sections.\n * @param {Object} map - The assessment test map\n * @param {String} sectionId - The next sections will be gathered once this sectionId has been reached\n * @returns {Object} the next sections\n */\n getNextSections: function getNextSections(map, sectionId) {\n var sections = this.getSections(map),\n result = {},\n canList = false;\n\n _.forEach(sections, function (section) {\n if (canList) {\n result[section.id] = section;\n }\n\n if (section.id === sectionId) {\n canList = true;\n }\n });\n\n return result;\n },\n\n /**\n * Gets the jump at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getJump: function getJump(map, position) {\n var jumps = this.getJumps(map);\n return jumps && jumps[position];\n },\n\n /**\n * Gets a test part by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {Object}\n */\n getPart: function getPart(map, partName) {\n var parts = this.getParts(map);\n return parts && parts[partName];\n },\n\n /**\n * Gets a test section by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {Object}\n */\n getSection: function getSection(map, sectionName) {\n var parts = this.getParts(map);\n var section = null;\n\n _.forEach(parts, function (part) {\n var sections = part.sections;\n\n if (sections && sections[sectionName]) {\n section = sections[sectionName];\n return false;\n }\n });\n\n return section;\n },\n\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {Object}\n */\n getItem: function getItem(map, itemIdentifier) {\n var jump = _.find(this.getJumps(map), {\n identifier: itemIdentifier\n });\n\n return this.getItemAt(map, jump && jump.position);\n },\n\n /**\n * Gets a test item by its identifier\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @returns {String[]} the raw list of categories\n */\n getItemCategories: function getItemCategories(map, itemIdentifier) {\n var item = this.getItem(map, itemIdentifier);\n\n if (item && Array.isArray(item.categories)) {\n return item.categories;\n }\n\n return [];\n },\n\n /**\n * Check if an item has a category\n * @param {Object} map - The assessment test map\n * @param {String} itemIdentifier - The identifier of the test item\n * @param {String} category - the category to check\n * @param {Boolean} [fuzzyMatch=false] - if true the prefix or the case doesn't matter\n * @returns {String[]} the raw list of categories\n */\n hasItemCategory: function hasItemCategory(map, itemIdentifier, category) {\n var fuzzyMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var taoPrefix = 'x-tao-option-';\n var categories = this.getItemCategories(map, itemIdentifier);\n\n if (!category || !category.length) {\n return false;\n }\n\n var exactMatch = categories.includes(category);\n\n if (exactMatch) {\n return true;\n }\n\n if (fuzzyMatch) {\n //check by adding the prefix first\n if (!category.startsWith(taoPrefix) && category.includes(\"\".concat(taoPrefix).concat(category))) {\n return true;\n } //compare without the prefix and any case system\n\n\n var normalize = function normalize(elt) {\n return elt.replace(taoPrefix, '').replace(/[-_\\s]/g, '').toLowerCase();\n };\n\n return categories.some(function (itemCategory) {\n return normalize(itemCategory) === normalize(category);\n });\n }\n\n return false;\n },\n\n /**\n * Gets the global stats of the assessment test\n * @param {Object} map - The assessment test map\n * @returns {itemStats}\n */\n getTestStats: function getTestStats(map) {\n return map && map.stats;\n },\n\n /**\n * Gets the stats of the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} partName - The identifier of the test part\n * @returns {itemStats}\n */\n getPartStats: function getPartStats(map, partName) {\n var part = this.getPart(map, partName);\n return part && part.stats;\n },\n\n /**\n * Gets the stats of the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {String} sectionName - The identifier of the test section\n * @returns {itemStats}\n */\n getSectionStats: function getSectionStats(map, sectionName) {\n var section = this.getSection(map, sectionName);\n return section && section.stats;\n },\n\n /**\n * Gets the stats related to a particular scope\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {itemStats}\n */\n getScopeStats: function getScopeStats(map, position, scope) {\n var jump = this.getJump(map, position);\n\n switch (scope) {\n case 'section':\n case 'testSection':\n return this.getSectionStats(map, jump && jump.section);\n\n case 'part':\n case 'testPart':\n return this.getPartStats(map, jump && jump.part);\n // During calculation stats for this case,\n // we are considiring all unanswered inaccessible items as answered\n\n case 'testWithoutInaccessibleItems':\n {\n var testStats = this.getTestStats(map);\n\n var _this$getPart = this.getPart(map, jump && jump.part),\n currentPartPosition = _this$getPart.position,\n isCurrentPartLinear = _this$getPart.isLinear;\n\n var parts = Object.values(this.getParts(map)).filter(function (_ref) {\n var partPosition = _ref.position;\n return partPosition < currentPartPosition;\n }).sort(function (a, b) {\n return b - a;\n }); // Find the neirest part to which test taker can not navigate\n\n var linearPartIndex = isCurrentPartLinear ? 0 : parts.findIndex(function (_ref2) {\n var isLinear = _ref2.isLinear;\n return isLinear;\n });\n\n if (linearPartIndex === -1) {\n return testStats;\n } // Calculate all unanswered and flagged questions in inaccessible parts\n\n\n var inaccessibleParts = parts.slice(linearPartIndex);\n var countOfInaccessibleUnasweredQestions = inaccessibleParts.reduce(function (acc, _ref3) {\n var _ref3$stats = _ref3.stats,\n questions = _ref3$stats.questions,\n answered = _ref3$stats.answered;\n return acc + (questions - answered);\n }, 0);\n var countOfInaccessibleFlaggedQestions = inaccessibleParts.reduce(function (acc, _ref4) {\n var flagged = _ref4.stats.flagged;\n return acc + flagged;\n }, 0);\n return Object.assign({}, testStats, {\n answered: testStats.answered + countOfInaccessibleUnasweredQestions,\n flagged: testStats.flagged - countOfInaccessibleFlaggedQestions\n });\n }\n\n default:\n case 'test':\n return this.getTestStats(map);\n }\n },\n\n /**\n * Gets the map of a particular scope from a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The current position\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMap: function getScopeMap(map, position, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {}); // gets the current part and section\n\n\n var jump = this.getJump(scopeMap, position);\n var part = this.getPart(scopeMap, jump && jump.part);\n var section = this.getSection(scopeMap, jump && jump.section); // reduce the map to the scope part\n\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n\n if (part) {\n scopeMap.parts[jump.part] = part;\n }\n } // reduce the map to the scope section\n\n\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n\n if (section) {\n part.sections[jump.section] = section;\n }\n } // update the stats to reflect the scope\n\n\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n\n /**\n * Gets the map of a particular scope from a current context\n * @param {Object} map - The assessment test map\n * @param {Object} context - The current session context\n * @param {String} [scope] - The name of the scope. Can be: test, part, section (default: test)\n * @returns {object} The scoped map\n */\n getScopeMapFromContext: function getScopeMapFromContext(map, context, scope) {\n // need a clone of the map as we will change some properties\n var scopeMap = _.cloneDeep(map || {});\n\n var part;\n var section; // gets the current part and section\n\n if (context && context.testPartId) {\n part = this.getPart(scopeMap, context.testPartId);\n }\n\n if (context && context.sectionId) {\n section = this.getSection(scopeMap, context.sectionId);\n } // reduce the map to the scope part\n\n\n if (scope && scope !== 'test') {\n scopeMap.parts = {};\n\n if (part) {\n scopeMap.parts[context.testPartId] = part;\n }\n } // reduce the map to the scope section\n\n\n if (part && (scope === 'section' || scope === 'testSection')) {\n part.sections = {};\n\n if (section) {\n part.sections[context.sectionId] = section;\n }\n } // update the stats to reflect the scope\n\n\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n\n scopeMap.stats = this.computeStats(scopeMap.parts);\n return scopeMap;\n },\n\n /**\n * Gets the test part containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemPart: function getItemPart(map, position) {\n var jump = this.getJump(map, position);\n return this.getPart(map, jump && jump.part);\n },\n\n /**\n * Gets the test section containing a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemSection: function getItemSection(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n return sections && sections[jump && jump.section];\n },\n\n /**\n * Gets the item located at a particular position\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n getItemAt: function getItemAt(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n var items = section && section.items;\n return items && items[jump && jump.identifier];\n },\n\n /**\n * Gets the identifier of an existing item\n * @param {Object} map - The assessment test map\n * @param {Number|String} position - The position of the item, can already be the identifier\n * @returns {String}\n */\n getItemIdentifier: function getItemIdentifier(map, position) {\n var item;\n\n if (_.isFinite(position)) {\n item = this.getItemAt(map, position);\n } else {\n item = this.getItem(map, position);\n }\n\n return item && item.id;\n },\n\n /**\n * Applies a callback on each item of the provided map\n * @param {Object} map - The assessment test map\n * @param {Function} callback(item, section, part, map) - A callback to apply on each item\n * @returns {Object}\n */\n each: function each(map, callback) {\n if (_.isFunction(callback)) {\n _.forEach(map && map.parts, function (part) {\n _.forEach(part && part.sections, function (section) {\n _.forEach(section && section.items, function (item) {\n callback(item, section, part, map);\n });\n });\n });\n }\n\n return map;\n },\n\n /**\n * Update the map stats from a particular item\n * @param {Object} map - The assessment test map\n * @param {Number} position - The position of the item\n * @returns {Object}\n */\n updateItemStats: function updateItemStats(map, position) {\n var jump = this.getJump(map, position);\n var part = this.getPart(map, jump && jump.part);\n var sections = part && part.sections;\n var section = sections && sections[jump && jump.section];\n\n if (section) {\n section.stats = this.computeItemStats(section.items);\n }\n\n if (part) {\n part.stats = this.computeStats(part.sections);\n }\n\n if (map) {\n map.stats = this.computeStats(map.parts);\n }\n\n return map;\n },\n\n /**\n * Computes the stats for a list of items\n * @param {Object} items\n * @returns {itemStats}\n */\n computeItemStats: function computeItemStats(items) {\n return _.reduce(items, function accStats(acc, item) {\n if (!item.informational) {\n acc.questions++;\n\n if (item.answered) {\n acc.answered++;\n }\n\n if (item.viewed) {\n acc.questionsViewed++;\n }\n }\n\n if (item.flagged) {\n acc.flagged++;\n }\n\n if (item.viewed) {\n acc.viewed++;\n }\n\n acc.total++;\n return acc;\n }, getEmptyStats());\n },\n\n /**\n * Computes the global stats of a collection of stats\n * @param {Object} collection\n * @returns {itemStats}\n */\n computeStats: function computeStats(collection) {\n return _.reduce(collection, function accStats(acc, item) {\n acc.questions += item.stats.questions;\n acc.answered += item.stats.answered;\n acc.flagged += item.stats.flagged;\n acc.viewed += item.stats.viewed;\n acc.total += item.stats.total;\n acc.questionsViewed += item.stats.questionsViewed;\n return acc;\n }, getEmptyStats());\n },\n\n /**\n * Patch a testMap with a partial testMap.\n *\n * If the currentMap is null or the scope is test,\n * we just use the partialMap as it is.\n *\n * Indexes, position and stats will be (re)built.\n *\n * @param {Object} currentMap - the map to patch\n * @param {Object} partialMap - the patch\n * @param {String} partialMap.scope - indicate the scope of the patch (test, part or section)\n * @returns {Object} the patched testMap\n * @throws {TypeError} if the partialMap is no a map\n */\n patch: function patch(currentMap, partialMap) {\n var self = this;\n var targetMap;\n\n if (!_.isPlainObject(partialMap) || !partialMap.parts) {\n throw new TypeError('Invalid test map format');\n }\n\n if (!currentMap || partialMap.scope === 'test') {\n targetMap = _.cloneDeep(partialMap);\n } else {\n targetMap = _.cloneDeep(currentMap);\n\n _.forEach(partialMap.parts, function (partialPart, targetPartId) {\n if (partialMap.scope === 'part') {\n //replace the target part\n targetMap.parts[targetPartId] = _.cloneDeep(partialPart);\n }\n\n if (partialMap.scope === 'section') {\n _.forEach(partialPart.sections, function (partialSection, targetSectionId) {\n //replace the target section\n targetMap.parts[targetPartId].sections[targetSectionId] = _.cloneDeep(partialSection); //compte new section stats\n\n targetMap.parts[targetPartId].sections[targetSectionId].stats = self.computeItemStats(targetMap.parts[targetPartId].sections[targetSectionId].items);\n });\n } //compte new/updated part stats\n\n\n targetMap.parts[targetPartId].stats = self.computeStats(targetMap.parts[targetPartId].sections);\n }); //compte updated test stats\n\n\n targetMap.stats = this.computeStats(targetMap.parts);\n } //the updated map can have a different size than the original\n\n\n targetMap = this.reindex(targetMap);\n return targetMap;\n },\n\n /**\n * Rebuild the indexes, positions of all map parts.\n * Then recreate the jump table.\n *\n * @param {Object} map - the map to reindex\n * @returns {Object} the brand new map\n * @throws {TypeError} if the map is no a map\n */\n reindex: function reindex(map) {\n var offset = 0;\n var offsetPart = 0;\n var offsetSection = 0;\n var lastPartId;\n var lastSectionId;\n\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n } //remove the jump table\n\n\n map.jumps = []; //browse the test map, by position\n\n _.sortBy(map && map.parts, 'position').forEach(function (part) {\n _.sortBy(part && part.sections, 'position').forEach(function (section) {\n _.sortBy(section && section.items, 'position').forEach(function (item) {\n if (lastPartId !== part.id) {\n offsetPart = 0;\n lastPartId = part.id;\n part.position = offset;\n }\n\n if (lastSectionId !== section.id) {\n offsetSection = 0;\n lastSectionId = section.id;\n section.position = offset;\n }\n\n item.position = offset;\n item.index = offsetSection + 1;\n item.positionInPart = offsetPart;\n item.positionInSection = offsetSection;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n offset++;\n offsetSection++;\n offsetPart++;\n });\n });\n });\n\n return map;\n },\n\n /**\n * Create the jump table for a test map\n *\n * @param {Object} map - the map\n * @returns {Object} the brand new map with a jump table\n * @throws {TypeError} if the map is no a map\n */\n createJumpTable: function createJumpTable(map) {\n if (!_.isPlainObject(map) || !map.parts) {\n throw new TypeError('Invalid test map format');\n }\n\n map.jumps = [];\n this.each(map, function (item, section, part) {\n var offset = item.position;\n map.jumps[offset] = {\n identifier: item.id,\n section: section.id,\n part: part.id,\n position: offset\n };\n });\n return map;\n }\n };\n\n return map;\n\n});\n\n","define('taoQtiTest/runner/helpers/isReviewPanelEnabled',['taoQtiTest/runner/helpers/map'], function (mapHelper) { 'use strict';\n\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * Tells if the review panel is enabled\n * @returns {Boolean}\n */\n\n function isReviewPanelEnabled(runner) {\n var reviewEnabled = mapHelper.hasItemCategory(runner.getTestMap(), runner.getTestContext().itemIdentifier, 'reviewScreen', true);\n var itemReviewEnabled = runner.getOptions().review.enabled;\n return reviewEnabled && itemReviewEnabled;\n }\n\n return isReviewPanelEnabled;\n\n});\n\n","define('taoQtiTest/runner/helpers/stats',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/currentItem'], function (_, mapHelper, currentItemHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n var stats = {\n /**\n * Return scope stats that takes into account any test taker interaction made since the item has been loaded\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {Object} the stats\n */\n getInstantStats: function getInstantStats(scope, runner, sync) {\n var map = runner.getTestMap();\n var context = runner.getTestContext();\n var item = runner.getCurrentItem();\n var testPart = runner.getCurrentPart();\n\n var stats = _.clone(mapHelper.getScopeStats(map, context.itemPosition, scope));\n\n if (!item.informational) {\n var isItemCurrentlyAnswered = currentItemHelper.isAnswered(runner);\n\n if (!isItemCurrentlyAnswered && item.answered) {\n stats.answered--;\n } else if ((isItemCurrentlyAnswered || sync) && !item.answered) {\n stats.answered++;\n } else if (sync && !isItemCurrentlyAnswered && item.answered && testPart.isLinear) {\n stats.answered++;\n }\n }\n\n return stats;\n }\n };\n\n return stats;\n\n});\n\n","define('taoQtiTest/runner/helpers/messages',['i18n', 'taoQtiTest/runner/helpers/stats', 'handlebars'], function (__, statsHelper, Handlebars) { 'use strict';\n\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n statsHelper = statsHelper && Object.prototype.hasOwnProperty.call(statsHelper, 'default') ? statsHelper['default'] : statsHelper;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"<b>\";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</b><br><br>\";\n return buffer;\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n function messageHeaderTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Completes an exit message\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {String} message - custom message that will be appended to the unanswered stats count\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox\n * @param {String|undefined} submitButtonLabel - point the user to the submit button\n * @returns {String} Returns the message text\n */\n\n function getExitMessage(scope, runner) {\n var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var sync = arguments.length > 3 ? arguments[3] : undefined;\n var submitButtonLabel = arguments.length > 4 ? arguments[4] : undefined;\n var itemsCountMessage = '';\n var testRunnerOptions = runner.getOptions();\n var messageEnabled = testRunnerOptions.enableUnansweredItemsWarning;\n\n if (messageEnabled) {\n itemsCountMessage = getUnansweredItemsWarning(scope, runner, sync).trim();\n\n if (itemsCountMessage) {\n itemsCountMessage += '.';\n }\n }\n\n return \"\".concat(getHeader(scope)).concat(itemsCountMessage, \" \").concat(getActionMessage(scope, submitButtonLabel)).concat(message).trim();\n }\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @returns {String} Returns the message text\n */\n\n\n function getHeader(scope) {\n var header = '';\n\n if (scope === 'section' || scope === 'testSection') {\n header = __('You are about to leave this section.');\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n header = __('You are about to submit the test.');\n } else if (scope === 'part') {\n header = __('You are about to submit this test part.');\n }\n\n return messageHeaderTpl({\n header: header.trim()\n });\n }\n /**\n * Generates the message to help users perform the action\n * @param {String} scope - scope to consider for calculating the stats\n * @param {String} [submitButtonLabel] - Pointed user perform click on given button\n * @returns {String} Returns the message text\n */\n\n\n function getActionMessage(scope) {\n var submitButtonLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __('OK');\n var msg;\n\n switch (scope) {\n case 'section':\n case 'testSection':\n case 'part':\n msg = __('Click \"%s\" to continue', submitButtonLabel).trim();\n\n if (msg) {\n msg += '.';\n }\n\n return msg;\n\n case 'test':\n case 'testWithoutInaccessibleItems':\n return \"\".concat(__('You will not be able to access this test once submitted. Click \"%s\" to continue and submit the test.', submitButtonLabel));\n }\n\n return '';\n }\n /**\n * Build message for the flagged items if any.\n * @param {Object} stats - The stats for the current context\n * @param {String} [message] - The existing message to complete\n * @returns {string|*}\n */\n\n\n function getFlaggedItemsWarning(stats) {\n var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var flaggedCount = stats && stats.flagged;\n\n if (!flaggedCount) {\n return message;\n }\n\n if (message) {\n return \"\".concat(message, \" \").concat(__('and you flagged %s item(s) that you can review now', flaggedCount.toString()));\n }\n\n return __('You flagged %s item(s) that you can review now', flaggedCount.toString());\n }\n /**\n * Build message if not all items have answers\n * @param {String} scope - scope to consider for calculating the stats\n * @param {Object} runner - testRunner instance\n * @param {Boolean} sync - flag for sync the unanswered stats in exit message and the unanswered stats in the toolbox. Default false\n * @returns {String} Returns the message text\n */\n\n\n function getUnansweredItemsWarning(scope, runner, sync) {\n var stats = statsHelper.getInstantStats(scope, runner, sync);\n var unansweredCount = stats && stats.questions - stats.answered;\n var flaggedCount = stats && stats.flagged;\n var itemsCountMessage = '';\n\n if (scope === 'section' || scope === 'testSection') {\n itemsCountMessage = __('You answered %s of %s question(s) for this section of the test', stats.answered.toString(), stats.questions.toString());\n\n if (flaggedCount) {\n itemsCountMessage += \", \".concat(__('and flagged %s of them', flaggedCount.toString()));\n }\n } else if (scope === 'test' || scope === 'testWithoutInaccessibleItems') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question', unansweredCount.toString());\n }\n\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n } else if (scope === 'part') {\n if (unansweredCount > 1) {\n itemsCountMessage = __('There are %s unanswered questions in this part of the test', unansweredCount.toString());\n } else if (unansweredCount === 1) {\n itemsCountMessage = __('There is %s unanswered question in this part of the test', unansweredCount.toString());\n }\n\n if (flaggedCount) {\n itemsCountMessage = getFlaggedItemsWarning(stats, itemsCountMessage);\n }\n }\n\n itemsCountMessage = itemsCountMessage.trim();\n return itemsCountMessage;\n }\n\n var messages = {\n getExitMessage: getExitMessage\n };\n\n return messages;\n\n});\n\n","define('taoQtiTest/runner/helpers/navigation',['lodash', 'taoQtiTest/runner/helpers/map'], function (_, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n /**\n * @typedef {Object} navigationHelper\n */\n\n var navigationHelper = {\n /**\n * Check whether the test taker is leaving a section\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingSection: function isLeavingSection(testContext, testMap, direction, scope, position) {\n var section;\n var sectionStats;\n var nbItems;\n var item;\n\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n nbItems = sectionStats && sectionStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n return scope === 'section' || scope === 'testPart' || direction === 'next' && item.positionInSection + 1 === nbItems || direction === 'previous' && item.positionInSection === 0 || direction === 'jump' && position > 0 && (position < section.position || position >= section.position + nbItems);\n }\n\n throw new TypeError('Invalid test context and test map');\n },\n\n /**\n * Check whether the test taker is leaving a test part\n *\n * @param {Object} testContext - the actual test context\n * @param {String} testContext.itemIdentifier - the id of the current item\n * @param {String} testContext.sectionId - the id of the current section\n * @param {String} testContext.testPartId - the id of the current testPart\n * @param {Object} testMap - the actual test map\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Boolean} true if the action leads to a section leave\n * @throws {TypeError} if the context or the map are incorrect\n */\n isLeavingTestPart: function isLeavingTestPart(testContext, testMap, direction, scope, position) {\n var testPart;\n var testPartStats;\n var nbItems;\n var item;\n var section;\n var sectionStats;\n\n if (_.isPlainObject(testContext) && _.isPlainObject(testMap) && !_.isEmpty(testContext.testPartId) && !_.isEmpty(testContext.sectionId) && !_.isEmpty(testContext.itemIdentifier)) {\n testPart = mapHelper.getPart(testMap, testContext.testPartId);\n testPartStats = mapHelper.getPartStats(testMap, testContext.testPartId);\n nbItems = testPartStats && testPartStats.total;\n item = mapHelper.getItem(testMap, testContext.itemIdentifier);\n\n if (scope === 'section') {\n section = mapHelper.getSection(testMap, testContext.sectionId);\n sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n }\n\n return scope === 'testPart' || direction === 'next' && scope === 'item' && item.positionInPart + 1 === nbItems || direction === 'next' && scope === 'section' && section.position + sectionStats.total >= nbItems || direction === 'previous' && scope === 'item' && item.positionInPart === 0 || direction === 'previous' && scope === 'section' && section.position === testPart.position || direction === 'jump' && position > 0 && (position < testPart.position || position >= testPart.position + nbItems);\n }\n\n throw new TypeError('Invalid test context and test map');\n },\n\n /**\n * Check if the given item is the last of the test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the last one\n */\n isLast: function isLast(testMap, itemIdentifier) {\n return this.isLastOf(testMap, itemIdentifier, 'test');\n },\n\n /**\n * Check if the given item is the first of a test\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @returns {Boolean} true if the item is the first one\n */\n isFirst: function isFirst(testMap, itemIdentifier) {\n return this.isFirstOf(testMap, itemIdentifier, 'test');\n },\n\n /**\n * Check if the given item is the last of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the last one\n */\n isLastOf: function isLastOf(testMap, itemIdentifier, scope) {\n var item;\n var stats;\n\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n stats = mapHelper.getScopeStats(testMap, item.position, scope);\n\n if (stats && _.isNumber(stats.total)) {\n if (scope === 'test') {\n return item.position + 1 === stats.total;\n }\n\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection + 1 === stats.total;\n }\n\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart + 1 === stats.total;\n }\n }\n\n return false;\n },\n\n /**\n * Check if the given item is the first of a the given scope\n * @param {Object} testMap - the test map\n * @param {String} itemIdentifier - the identifier of the item\n * @param {String} [scope = 'test'] - the target scope\n * @returns {Boolean} true if the item is the first one\n */\n isFirstOf: function isFirstOf(testMap, itemIdentifier, scope) {\n var item;\n\n if (!_.isPlainObject(testMap)) {\n throw new TypeError('Invalid test map');\n }\n\n if (_.isEmpty(itemIdentifier)) {\n throw new TypeError('Invalid item identifier');\n }\n\n scope = scope || 'test';\n item = mapHelper.getItem(testMap, itemIdentifier);\n\n if (scope === 'test') {\n return item.position === 0;\n }\n\n if (scope === 'section' || scope === 'assessmentSection' || scope === 'testSection') {\n return item.positionInSection === 0;\n }\n\n if (scope === 'part' || scope === 'testPart') {\n return item.positionInPart === 0;\n }\n\n return false;\n },\n\n /**\n * Gets the map descriptors of the sibling items\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @param {String} [direction='both'] - previous/next/both\n * @param {Number} [size=3] - will be 2xsize if direction is both\n * @returns {Object[]} the collections of items\n */\n getSiblingItems: function getSiblingItems(testMap, itemPosition, direction, size) {\n var itemId = mapHelper.getItemIdentifier(testMap, itemPosition);\n var previous = null;\n var siblings = [];\n var directions;\n\n var itemChain = _.reduce(testMap && testMap.jumps, function (map, jump) {\n var ref = jump.identifier;\n\n if (previous) {\n map[previous].next = ref;\n }\n\n map[ref] = {\n identifier: ref,\n previous: previous,\n next: null\n };\n previous = ref;\n return map;\n }, {});\n\n size = _.isFinite(size) ? parseInt(size, 10) : 3;\n\n if (!direction || direction === 'both') {\n directions = ['previous', 'next'];\n } else {\n directions = [direction];\n }\n\n _.forEach(directions, function walkDirection(link) {\n var id = itemId;\n\n _.times(size, function getNeighbor() {\n id = itemChain[id] && itemChain[id][link];\n\n if (id) {\n siblings.push(mapHelper.getItem(testMap, id));\n } else {\n return false;\n }\n });\n });\n\n return siblings;\n },\n\n /**\n * Gets the map descriptor of the next item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getNextItem: function getNextItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'next', 1);\n\n if (siblings.length) {\n return siblings[0];\n }\n\n return null;\n },\n\n /**\n * Gets the map descriptor of the previous item\n * @param {Object} testMap\n * @param {Number|String} itemPosition - (could be also the item id)\n * @returns {Object}\n */\n getPreviousItem: function getPreviousItem(testMap, itemPosition) {\n var siblings = navigationHelper.getSiblingItems(testMap, itemPosition, 'previous', 1);\n\n if (siblings.length) {\n return siblings[0];\n }\n\n return null;\n },\n\n /**\n * Checks if an action will move forward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToNextItem: function isMovingToNextItem(action, params) {\n params = params || {};\n return action === 'timeout' || action === 'skip' || action === 'move' && params.direction === 'next' && params.scope === 'item';\n },\n\n /**\n * Checks if an action will move backward.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isMovingToPreviousItem: function isMovingToPreviousItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'previous' && params.scope === 'item';\n },\n\n /**\n * Checks if an action will jump on another item.\n * @param {String} action - the name of the action that will be performed\n * @param {Object} [params] - some optional parameters that apply to the action\n * @returns {Boolean}\n */\n isJumpingToItem: function isJumpingToItem(action, params) {\n params = params || {};\n return action === 'move' && params.direction === 'jump' && params.scope === 'item';\n }\n };\n\n return navigationHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/offlineErrorHelper',['lodash', 'i18n'], function (_, __) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * @typedef {Object} OfflineErrorObject\n * @property {string} message\n * @property {Object} data\n * @property {boolean} data.success\n * @property {string} data.source\n * @property {string} data.purpose\n * @property {string} data.type\n * @property {number} data.code\n */\n\n var offlineErrorHelper = {\n /**\n * Builds a new Error object from the given context and returns it\n * @param {Object} errorData\n * @param {Object} [context]\n * @returns {Object}\n */\n buildErrorFromContext: function buildErrorFromContext(errorData, context) {\n var err = _.assign(new Error(errorData.message), errorData.data);\n\n return _.assign(err, context || {});\n },\n\n /**\n * Returns an object which contains the required data to compose an OfflineNavigationError.\n * This error get triggered in case when the test taker is unable to navigate offline.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflineNavError: function getOfflineNavError() {\n return {\n message: __('We are unable to connect to the server to retrieve the next item.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'nav',\n code: 404\n }\n };\n },\n\n /**\n * Returns an object which contains the required data to compose an OfflineExitError.\n * This error get triggered in case when the test taker is unable to exit the test offline.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflineExitError: function getOfflineExitError() {\n return {\n message: __('We are unable to connect the server to submit your results.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'finish',\n code: 404\n }\n };\n },\n\n /**\n * Returns an object which contains the required data to compose an OfflinePauseError.\n * This error get triggered in case when the test get paused in offline mode.\n *\n * @returns {OfflineErrorObject}\n */\n getOfflinePauseError: function getOfflinePauseError() {\n return {\n message: __('The test has been paused, we are unable to connect to the server.'),\n data: {\n success: false,\n source: 'navigator',\n purpose: 'proxy',\n type: 'pause',\n code: 404\n }\n };\n }\n };\n\n return offlineErrorHelper;\n\n});\n\n","define('taoQtiTest/runner/helpers/offlineSyncModal',['jquery', 'i18n', 'core/polling', 'ui/hider', 'ui/waitingDialog/waitingDialog', 'handlebars', 'util/shortcut/registry', 'util/shortcut'], function ($$1, __, polling, hider, waitingDialogFactory, Handlebars, shortcutRegistry, globalShortcut) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n polling = polling && Object.prototype.hasOwnProperty.call(polling, 'default') ? polling['default'] : polling;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n waitingDialogFactory = waitingDialogFactory && Object.prototype.hasOwnProperty.call(waitingDialogFactory, 'default') ? waitingDialogFactory['default'] : waitingDialogFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n shortcutRegistry = shortcutRegistry && Object.prototype.hasOwnProperty.call(shortcutRegistry, 'default') ? shortcutRegistry['default'] : shortcutRegistry;\n globalShortcut = globalShortcut && Object.prototype.hasOwnProperty.call(globalShortcut, 'default') ? globalShortcut['default'] : globalShortcut;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"<p class=\\\"button-subtext\\\"></p>\\n\";\n });\n function offlineSyncModalCountdownTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"<div class=\\\"wait-content\\\">\\n <p>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"It is not possible to save your responses while working offline.\", options) : helperMissing.call(depth0, \"__\", \"It is not possible to save your responses while working offline.\", options)))\n + \"</p>\\n <p class=\\\"wait-content_text\\\"><strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Option A\", options) : helperMissing.call(depth0, \"__\", \"Option A\", options)))\n + \"</strong></p>\\n <ul class=\\\"wait-content_actions-list\\\">\\n <li>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Wait for your connection to come back online.\", options) : helperMissing.call(depth0, \"__\", \"Wait for your connection to come back online.\", options)))\n + \"</li>\\n <li>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.\", options) : helperMissing.call(depth0, \"__\", \"Try connecting the machine to the internet via cable, or move to an area with a better wifi signal.\", options)))\n + \"</li>\\n <li>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the connection cannot be restored, see option B.\", options) : helperMissing.call(depth0, \"__\", \"If the connection cannot be restored, see option B.\", options)))\n + \"</li>\\n </ul>\\n <p class=\\\"wait-content_text\\\"><strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Option B\", options) : helperMissing.call(depth0, \"__\", \"Option B\", options)))\n + \"</strong></p>\\n <ul class=\\\"wait-content_actions-list\\\">\\n <li>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Download the pupil responses and submit manually.\", options) : helperMissing.call(depth0, \"__\", \"Download the pupil responses and submit manually.\", options)))\n + \"</li>\\n </ul>\\n <p>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 1: Download the file (see below when available).\", options) : helperMissing.call(depth0, \"__\", \"Step 1: Download the file (see below when available).\", options)))\n + \" <strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Do not rename it.\", options) : helperMissing.call(depth0, \"__\", \"Do not rename it.\", options)))\n + \"</strong></p>\\n <p>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the \", options) : helperMissing.call(depth0, \"__\", \"Step 2: When you are online again, please send the downloaded file to receptionbaseline@nfer.ac.uk together with the \", options)))\n + \"\\n <strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"name of the pupil\", options) : helperMissing.call(depth0, \"__\", \"name of the pupil\", options)))\n + \"</strong> \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"and\", options) : helperMissing.call(depth0, \"__\", \"and\", options)))\n + \" <strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"the assessment (LCL or Mathematics)\", options) : helperMissing.call(depth0, \"__\", \"the assessment (LCL or Mathematics)\", options)))\n + \"</strong> \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"that was being taken.\", options) : helperMissing.call(depth0, \"__\", \"that was being taken.\", options)))\n + \"\\n </p>\\n <p>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \\\"in progress\\\"; the status will be updated once the helpline has uploaded the file.\", options) : helperMissing.call(depth0, \"__\", \"Step 3: Once you have downloaded the file you can close the browser window. Do not do anything further with the assessment whilst it shows as \\\"in progress\\\"; the status will be updated once the helpline has uploaded the file.\", options)))\n + \"</p>\\n <br />\\n <p>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If you need help, please contact our Helpline on 0330 088 4171.\", options) : helperMissing.call(depth0, \"__\", \"If you need help, please contact our Helpline on 0330 088 4171.\", options)))\n + \"</p>\\n</div>\";\n return buffer;\n });\n function offlineSyncModalWaitContentTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Display the waiting dialog, while waiting the connection to be back\n * @param {Object} [proxy] - test runner proxy\n * @returns {waitingDialog} resolves once the wait is over and the user click on 'proceed'\n */\n\n function offlineSyncModalFactory(proxy) {\n var waitingConfig = {\n message: __('You are currently working offline.'),\n waitContent: offlineSyncModalWaitContentTpl(),\n proceedContent: __('Your connection seems to be back, please proceed.'),\n proceedButtonText: __('PROCEED & END ASSESSMENT'),\n showSecondary: true,\n secondaryButtonText: __('Download'),\n secondaryButtonIcon: 'download',\n buttonSeparatorText: __('or'),\n width: '600px'\n };\n var $secondaryButton;\n var betweenButtonTextSelector = '.between-buttons-text';\n var secondaryButtonWait = 60; // seconds to wait until it enables\n\n var delaySec;\n var $countdown = $$1(offlineSyncModalCountdownTpl());\n var countdownPolling;\n var dialogShortcut = shortcutRegistry($$1('body'), {\n propagate: false,\n prevent: true\n }); // starts with shortcuts disabled, prevents the TAB key to be used to move outside the dialog box\n\n dialogShortcut.disable().set('Tab Shift+Tab'); //creates the waiting modal dialog\n\n var waitingDialog = waitingDialogFactory(waitingConfig);\n\n var getDialogEl = function getDialogEl(selector) {\n return waitingDialog.dialog.getDom().find(selector);\n };\n\n waitingDialog.on('render', function () {\n delaySec = secondaryButtonWait;\n $secondaryButton = getDialogEl('button[data-control=\"secondary\"]');\n $countdown.insertAfter($secondaryButton);\n proxy.after('reconnect.waiting', function () {\n waitingDialog.endWait();\n hider.hide(getDialogEl('p.message'));\n });\n proxy.before('disconnect.waiting', function () {\n // need to open dialog again if it is closed\n waitingDialog.dialog.show();\n waitingDialog.beginWait();\n }); // if render comes before beginWait:\n\n if (waitingDialog.is('waiting')) {\n waitingDialog.trigger('begincountdown');\n }\n\n globalShortcut.disable();\n dialogShortcut.enable();\n }).on('destroy', function () {\n proxy.off('.waiting');\n globalShortcut.enable();\n dialogShortcut.disable();\n dialogShortcut.clear();\n }).on('wait', function () {\n hider.show(getDialogEl(betweenButtonTextSelector));\n hider.show(getDialogEl('p.message')); // if beginWait comes before render:\n\n if (waitingDialog.is('rendered')) {\n waitingDialog.trigger('begincountdown');\n }\n }).on('begincountdown', function () {\n // Set up secondary button time delay:\n // it can only be clicked after 60 seconds have passed\n // if disconnect-reconnect delay will be left seconds\n $secondaryButton.prop('disabled', true);\n countdownPolling = polling({\n action: function countdownAction() {\n delaySec--;\n $countdown.html(__('The download will be available in <strong>%d</strong> seconds', delaySec));\n\n if (delaySec < 1) {\n this.stop();\n $secondaryButton.removeProp('disabled');\n $countdown.html('');\n }\n },\n interval: 1000,\n autoStart: true\n });\n }).on('unwait', function () {\n countdownPolling.stop();\n $secondaryButton.prop('disabled', true);\n $countdown.html('');\n hider.hide(getDialogEl(betweenButtonTextSelector));\n });\n return waitingDialog;\n }\n\n return offlineSyncModalFactory;\n\n});\n\n","define('taoQtiTest/runner/helpers/testContextBuilder',['lodash', 'util/capitalize', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation'], function (_, capitalize, mapHelper, navigationHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n capitalize = capitalize && Object.prototype.hasOwnProperty.call(capitalize, 'default') ? capitalize['default'] : capitalize;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Returns the updated test context from an item in the given position.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Integer} position\n * @returns {Object}\n */\n\n function buildTestContextFromPosition(testContext, testMap, position, attempt) {\n var updatedMap = mapHelper.updateItemStats(testMap, position),\n item = mapHelper.getItemAt(updatedMap, position),\n section = mapHelper.getItemSection(updatedMap, position),\n part = mapHelper.getItemPart(updatedMap, position);\n\n if (!item) {\n return false;\n }\n\n return getTestContext(testContext, testMap, item, section, part, position, attempt);\n }\n /**\n * Returns the updated test context from a jump table entry.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Object} jump\n * @param {String} jump.item\n * @param {String} jump.section\n * @param {String} jump.part\n * @param {Integer} jump.position\n * @returns {Object}\n */\n\n\n function buildTestContextFromJump(testContext, testMap, jump, attempt) {\n var part = testMap.parts[jump.part],\n section = part.sections[jump.section],\n item = section.items[jump.item];\n return getTestContext(testContext, testMap, item, section, part, jump.position, attempt);\n }\n /**\n * Returns the updated test context.\n *\n * @param {Object} testContext\n * @param {Object} testMap\n * @param {Object} item\n * @param {String} item.id\n * @param {Boolean} item.answered\n * @param {Integer} item.remainingAttempts\n * @param {Object} item.timeConstraint\n * @param {String[]} item.categories\n * @param {Object} section\n * @param {String} section.id\n * @param {String} section.label\n * @param {Object} section.timeConstraint\n * @param {Object} part\n * @param {String} part.id\n * @param {Boolean} part.isLinear\n * @param {Object} part.timeConstraint\n * @param {Integer} position\n * @returns {Object} the new test context\n * @private\n */\n\n\n function getTestContext(testContext, testMap, item, section, part, position, attempt) {\n var isLeavingSection = section.id !== testContext.sectionId,\n isLeavingPart = part.id !== testContext.testPartId,\n newTestContext = _.defaults({\n itemIdentifier: item.id,\n itemPosition: position,\n remainingAttempts: Math.max(-1, item.remainingAttempts - 1),\n sectionId: section.id,\n sectionTitle: section.label,\n testPartId: part.id,\n canMoveBackward: !part.isLinear && !navigationHelper.isFirst(testMap, item.id)\n }, testContext);\n\n if (attempt) {\n newTestContext.attempt = attempt + 1;\n }\n\n if (isLeavingSection) {\n newTestContext.numberRubrics = 0;\n newTestContext.rubrics = '';\n }\n\n newTestContext.timeConstraints = _.reject(testContext.timeConstraints, function (constraint) {\n return constraint.qtiClassName === 'assessmentItemRef' || isLeavingSection && constraint.qtiClassName === 'assessmentSection' || isLeavingPart && constraint.qtiClassName === 'testPart';\n });\n\n if (item.timeConstraint) {\n newTestContext.timeConstraints.push(item.timeConstraint);\n }\n\n if (isLeavingSection && section.timeConstraint) {\n newTestContext.timeConstraints.push(section.timeConstraint);\n }\n\n if (isLeavingPart && part.timeConstraint) {\n newTestContext.timeConstraints.push(part.timeConstraint);\n }\n\n newTestContext.options = _.defaults(getOptionsFromCategories(item.categories || []), _.pick(testContext.options, ['allowComment', 'allowSkipping', 'exitButton', 'logoutButton']));\n return newTestContext;\n }\n /**\n * Transforms the categories into context options.\n *\n * @param {String[]} categories - the list of categories\n * @returns {Object} the options object like <optionName : Boolean>\n * @private\n */\n\n\n function getOptionsFromCategories(categories) {\n if (!_.isArray(categories) || !categories.length) {\n return {};\n }\n\n return _.reduce(categories, function (acc, category) {\n var categoryName;\n\n if (_.isString(category) && !_.isEmpty(category)) {\n // transfrom the category name in an option name:\n // x-tao-option-review-screen to reviewScreen\n categoryName = category.replace('x-tao-option-', '').split(/[-_]+/g).map(function (name, index) {\n if (index === 0) {\n return name;\n }\n\n if (name.length) {\n return capitalize(name);\n }\n\n return '';\n }).join('');\n\n if (categoryName) {\n acc[categoryName] = true;\n }\n }\n\n return acc;\n }, {});\n }\n\n var testContextBuilder = {\n buildTestContextFromPosition: buildTestContextFromPosition,\n buildTestContextFromJump: buildTestContextFromJump\n };\n\n return testContextBuilder;\n\n});\n\n","define('taoQtiTest/runner/navigator/navigator',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/testContextBuilder'], function (_, mapHelper, testContextBuilder) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n testContextBuilder = testContextBuilder && Object.prototype.hasOwnProperty.call(testContextBuilder, 'default') ? testContextBuilder['default'] : testContextBuilder;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Gives you a navigator\n * @param {Object} testContext\n * @param {Object} testMap\n * @returns {Object} the navigator\n * @throws {TypeError} if the given parameters aren't objects\n */\n\n var navigatorFactory = function navigatorFactory(testContext, testMap) {\n if (!_.all([testContext, testMap], _.isPlainObject)) {\n throw new TypeError('The navigator must be built with a testData, a testContext and a testMap');\n }\n\n return {\n /**\n * Selects and execute the navigation method based on the direction/scope.\n *\n * @param {String} direction - the move direction (next, previous or jump)\n * @param {String} scope - the move scope (item, section, testPart)\n * @param {Number} [position] - the position in case of jump\n * @returns {Object|Boolean} - false if we can't navigate, otherwise the result of the nav\n */\n navigate: function navigate(direction, scope, position) {\n var methodName = direction.toLowerCase() + scope.substr(0, 1).toUpperCase() + scope.substr(1).toLowerCase();\n\n if (_.isFunction(this[methodName])) {\n return this[methodName](position);\n }\n },\n\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n nextItem: function nextItem() {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, testContext.itemPosition + 1);\n },\n\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n previousItem: function previsousItem() {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, testContext.itemPosition - 1);\n },\n\n /**\n * Navigate to the next item\n * @returns {Object} the new test context\n */\n nextSection: function nextSection() {\n var sectionStats = mapHelper.getSectionStats(testMap, testContext.sectionId);\n var section = mapHelper.getSection(testMap, testContext.sectionId);\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, section.position + sectionStats.total);\n },\n\n /**\n * Navigate to the given position\n * @param {Number} position - the position\n * @returns {Object} the new test context\n */\n jumpItem: function jumpItem(position) {\n return testContextBuilder.buildTestContextFromPosition(testContext, testMap, position);\n }\n };\n };\n\n return navigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/helpers/branchRuleHelper',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Parses sub branch rules and returns an array of results\n *\n * @param {Object} branchRuleDefinition\n * @param {Object} item\n * @param {Object} navigationParams\n * @param {Function} branchRuleMapper\n * @param {Object} responseStore\n * @returns {Promise<boolean[]>}\n */\n\n function evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return new Promise(function (resolve, reject) {\n var subBranchRuleResults = [],\n promises = []; // Remove the @attributes from the branch rule definition\n\n branchRuleDefinition = _.omit(branchRuleDefinition, ['@attributes']);\n promises = _.map(branchRuleDefinition, function (subBranchRule, subBranchRuleName) {\n return branchRuleMapper(subBranchRuleName, branchRuleDefinition[subBranchRuleName], item, navigationParams, responseStore).validate();\n });\n Promise.all(promises).then(function (results) {\n _.forEach(results, function (subBranchRuleResult) {\n // if the result is an array (e.g. in case of NOT), add all elements of it to the results\n if (Array.isArray(subBranchRuleResult)) {\n subBranchRuleResult.forEach(function (value) {\n subBranchRuleResults.push(value);\n }); // otherwise add the single value to the results\n } else {\n subBranchRuleResults.push(subBranchRuleResult);\n }\n });\n\n resolve(subBranchRuleResults);\n }).catch(function (err) {\n reject(err);\n });\n });\n }\n\n var branchRuleHelper = {\n evaluateSubBranchRules: evaluateSubBranchRules\n };\n\n return branchRuleHelper;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/match',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * MATCH branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n\n function matchBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n var variableIdentifier = branchRuleDefinition.variable['@attributes'].identifier;\n var correctIdentifier = branchRuleDefinition.correct['@attributes'].identifier;\n return {\n /**\n * Evaluates that the value of given variable is matching or not of the value of the given correct response\n * @returns {boolean}\n */\n validate: function validate() {\n return Promise.all([responseStore.getCorrectResponse(correctIdentifier), responseStore.getResponse(variableIdentifier)]).then(function (result) {\n return _.contains(result[0], result[1]);\n });\n }\n };\n }\n\n return matchBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/or',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper'], function (branchRuleHelper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * OR branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n\n function orBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return {\n /**\n * Evaluates an OR expression on all the given expressions and returns the result\n * @returns {Promise<boolean>}\n */\n validate: function validate() {\n return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (subBranchRuleResults) {\n return subBranchRuleResults.some(function (value) {\n return value;\n });\n });\n }\n };\n }\n\n return orBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/and',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper'], function (branchRuleHelper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * AND branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n\n function andBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n return {\n /**\n * Evaluates an AND expression on all the given expressions and returns the result\n * @returns {Promise<boolean>}\n */\n validate: function validate() {\n return branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (subBranchRuleResults) {\n return subBranchRuleResults.every(function (value) {\n return value;\n });\n });\n }\n };\n }\n\n return andBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/types/not',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * NOT branching rule\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {branchRuleMapper} branchRuleMapper\n * @param {responseStore} responseStore\n */\n\n function notBranchRuleFactory(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore) {\n // If the NOT branching rule has only one child, cast it as an array\n if (!Array.isArray(branchRuleDefinition)) {\n branchRuleDefinition = [branchRuleDefinition];\n }\n\n return {\n /**\n * Evaluates a NOT expression on the given expressions and returns an array of results\n * @returns {Promise<boolean[]>}\n */\n validate: function validate() {\n var promises = branchRuleDefinition.map(function (expression) {\n var subBranchRuleName = _.head(_.keys(expression)),\n subBranchRuleDefinition = expression[subBranchRuleName];\n\n return branchRuleMapper(subBranchRuleName, subBranchRuleDefinition, item, navigationParams, responseStore).validate();\n });\n return Promise.all(promises).then(function (results) {\n return _.map(results, function (result) {\n return !result;\n });\n });\n }\n };\n }\n\n return notBranchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/branchRuleMapper',['taoQtiTest/runner/branchRule/types/match', 'taoQtiTest/runner/branchRule/types/or', 'taoQtiTest/runner/branchRule/types/and', 'taoQtiTest/runner/branchRule/types/not'], function (matchBranchRule, orBranchRule, andBranchRule, notBranchRule) { 'use strict';\n\n matchBranchRule = matchBranchRule && Object.prototype.hasOwnProperty.call(matchBranchRule, 'default') ? matchBranchRule['default'] : matchBranchRule;\n orBranchRule = orBranchRule && Object.prototype.hasOwnProperty.call(orBranchRule, 'default') ? orBranchRule['default'] : orBranchRule;\n andBranchRule = andBranchRule && Object.prototype.hasOwnProperty.call(andBranchRule, 'default') ? andBranchRule['default'] : andBranchRule;\n notBranchRule = notBranchRule && Object.prototype.hasOwnProperty.call(notBranchRule, 'default') ? notBranchRule['default'] : notBranchRule;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n var branchRuleMap = {\n match: matchBranchRule,\n or: orBranchRule,\n and: andBranchRule,\n not: notBranchRule\n };\n /**\n * Returns the proper branching rule based on the given name\n *\n * @param {string} branchRuleName\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules also\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {responseStore} responseStore\n */\n\n function branchRuleMapperFactory(branchRuleName, branchRuleDefinition, item, navigationParams, responseStore) {\n if (!(branchRuleName in branchRuleMap)) {\n throw new Error(\"Invalid branch rule name: \".concat(branchRuleName));\n }\n\n return branchRuleMap[branchRuleName](branchRuleDefinition, item, navigationParams, branchRuleMapperFactory, responseStore);\n }\n\n return branchRuleMapperFactory;\n\n});\n\n","define('taoQtiTest/runner/branchRule/branchRule',['taoQtiTest/runner/branchRule/helpers/branchRuleHelper', 'taoQtiTest/runner/branchRule/branchRuleMapper'], function (branchRuleHelper, branchRuleMapper) { 'use strict';\n\n branchRuleHelper = branchRuleHelper && Object.prototype.hasOwnProperty.call(branchRuleHelper, 'default') ? branchRuleHelper['default'] : branchRuleHelper;\n branchRuleMapper = branchRuleMapper && Object.prototype.hasOwnProperty.call(branchRuleMapper, 'default') ? branchRuleMapper['default'] : branchRuleMapper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Evaluates all the branch rules and returns the `@attributes.target` if the evaluation returns true, null otherwise\n *\n * @param {Object} branchRuleDefinition the definition object of the branch rule, which contains additional branching rules, and also the target\n * @param {Object} item item object from the itemStore\n * @param {Object} navigationParams object of navigation parameters which got passed to the navigation action\n * @param {responseStore} responseStore\n * @returns {Promise<string|null>}\n */\n\n function branchRuleFactory(branchRuleDefinition, item, navigationParams, responseStore) {\n return new Promise(function (resolve) {\n var result;\n\n if (typeof branchRuleDefinition['@attributes'] === 'undefined' || typeof branchRuleDefinition['@attributes']['target'] === 'undefined') {\n return resolve(null);\n }\n\n branchRuleHelper.evaluateSubBranchRules(branchRuleDefinition, item, navigationParams, branchRuleMapper, responseStore).then(function (branchRuleResults) {\n result = branchRuleResults.every(function (branchRuleResult) {\n return branchRuleResult;\n });\n\n if (result) {\n return resolve(branchRuleDefinition['@attributes']['target']);\n }\n\n resolve(null);\n });\n });\n }\n\n return branchRuleFactory;\n\n});\n\n","define('taoQtiTest/runner/services/offlineJumpTable',['lodash', 'taoQtiTest/runner/branchRule/branchRule', 'taoQtiTest/runner/helpers/map'], function (_, branchRule, mapHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n branchRule = branchRule && Object.prototype.hasOwnProperty.call(branchRule, 'default') ? branchRule['default'] : branchRule;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Jump table entry definition.\n *\n * @typedef Jump\n * @property {string} item - the identifier of the item\n * @property {string} section - the identifier of the section\n * @property {string} part - the identifier of the part\n * @property {integer} position - the position of the jump entry, starting from 0\n */\n\n /**\n * Helper class for the offline version of the jump table which helps the navigation of the test taker.\n */\n\n var offlineJumpTableFactory = function offlineJumpTableFactory(itemStore, responseStore) {\n var testMap = {};\n var jumpTable = [];\n /**\n * Put all the responses from the navigation parameters into the responseStore\n *\n * @param {Object} params\n */\n\n function addResponsesToResponseStore(params) {\n if (params.itemResponse) {\n _.forEach(params.itemResponse, function (response, itemResponseIdentifier) {\n var responseIdentifier = \"\".concat(params.itemDefinition, \".\").concat(itemResponseIdentifier);\n\n _.forEach(response, function (responseEntry) {\n var responseId = responseEntry && responseEntry.identifier;\n\n if (Array.isArray(responseId)) {\n responseId.forEach(function (id) {\n responseStore.addResponse(responseIdentifier, id);\n });\n } else {\n responseStore.addResponse(responseIdentifier, responseId);\n }\n });\n });\n }\n }\n /**\n * Returns all the item identifiers in order.\n *\n * @param {Object} map\n * @returns {Array}\n */\n\n\n function getItems(map) {\n return _.uniq(_.map(getSimplifiedTestMap(map), function (row) {\n return row.item;\n }));\n }\n /**\n * Returns all the section identifiers in order.\n *\n * @param {Object} map\n * @returns {Array}\n */\n\n\n function getSections(map) {\n return _.uniq(_.map(getSimplifiedTestMap(map), function (row) {\n return row.section;\n }));\n }\n /**\n * Returns a simplified test map array, which will contain the item, section and part identifiers.\n *\n * @param {Object} map\n * @returns {Array}\n */\n\n\n function getSimplifiedTestMap(map) {\n var simplifiedTestMap = [];\n mapHelper.each(map, function (item, section, part) {\n simplifiedTestMap.push({\n item: item.id,\n itemHasBranchRule: !_.isEmpty(item.branchRule),\n itemBranchRule: item.branchRule,\n section: section.id,\n sectionHasBranchRule: !_.isEmpty(section.branchRule),\n sectionBranchRule: section.branchRule,\n part: part.id,\n partHasBranchRule: !_.isEmpty(part.branchRule),\n partBranchRule: part.branchRule\n });\n });\n return simplifiedTestMap;\n }\n\n return {\n /**\n * Setter for test map\n *\n * @param {Object} map\n * @returns {offlineJumpTableFactory}\n */\n setTestMap: function setTestMap(map) {\n testMap = map;\n return this;\n },\n\n /**\n * Build jumpTable\n *\n * @param {Object} testContext\n * @returns {Promise}\n */\n buildJumpTable: function buildJumpTable(testContext) {\n var self = this;\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var contextItemId = testContext ? testContext.itemIdentifier : null;\n var contextItemPosition = contextItemId ? testContext.itemPosition : null;\n var firstJumpItem = simplifiedTestMap[0];\n\n if (firstJumpItem) {\n this.addJump(firstJumpItem.part, firstJumpItem.section, firstJumpItem.item);\n }\n\n if (!contextItemPosition) {\n return Promise.resolve();\n }\n\n function calculateNextJump() {\n var lastJumpItem = self.getLastJump().item || null;\n\n if (contextItemId !== lastJumpItem) {\n return itemStore.get(lastJumpItem).then(function (item) {\n var itemResponse = {};\n\n _.forEach(item.itemState, function (state, itemStateIdentifier) {\n itemResponse[itemStateIdentifier] = state.response;\n });\n\n return self.jumpToNextItem(Object.assign({}, item, {\n itemResponse: itemResponse,\n itemDefinition: item.itemIdentifier\n })).then(calculateNextJump);\n });\n }\n\n return Promise.resolve();\n }\n\n return calculateNextJump();\n },\n\n /**\n * Put all correct responses to the responseStore\n *\n * @param {Object} testContext\n * @returns {Promise}\n */\n putCorrectResponsesInStore: function putCorrectResponsesInStore() {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var promises = [];\n simplifiedTestMap.forEach(function (row) {\n promises.push(itemStore.get(row.item).then(function (item) {\n if (item) {\n _.forEach(item.itemData.data.responses, function (response) {\n var responseIdentifier = \"\".concat(item.itemIdentifier, \".\").concat(response.identifier);\n responseStore.addCorrectResponse(responseIdentifier, response.correctResponses);\n });\n }\n }).catch(function (err) {\n return Promise.reject(err);\n }));\n });\n return Promise.all(promises);\n },\n\n /**\n * Initialization method for the offline jump table, which is responsible to add the first item as the first\n * jump and collect the correct responses for the branching rules.\n * @param {Object} [testContext] - current test context is needed in order to continue test after interruption\n * @returns {Promise}\n */\n init: function init(testContext) {\n var _this = this;\n\n return this.putCorrectResponsesInStore().then(function () {\n return _this.buildJumpTable(testContext);\n });\n },\n\n /**\n * Clears the jump table\n *\n * @returns {offlineJumpTableFactory}\n */\n clearJumpTable: function clearJumpTable() {\n jumpTable = [];\n return this;\n },\n\n /**\n * Adds a new jump into the end of the jump table\n *\n * @param {String} partIdentifier\n * @param {String} sectionIdentifier\n * @param {String} itemIdentifier\n */\n addJump: function addJump(partIdentifier, sectionIdentifier, itemIdentifier) {\n var self = this;\n return new Promise(function (resolve) {\n var lastJump = self.getLastJump();\n var nextPosition = typeof lastJump.position !== 'undefined' ? lastJump.position + 1 : 0;\n jumpTable.push({\n item: itemIdentifier,\n part: partIdentifier,\n section: sectionIdentifier,\n position: nextPosition\n });\n resolve();\n });\n },\n\n /**\n * Jumps into a specific position inside the jump table. The jump entry in the given position\n * will be the last element of the jump table, every other entry after this entry will get deleted\n *\n * @param {Integer} position\n * @returns {offlineJumpTableFactory}\n */\n jumpTo: function jumpTo(position) {\n jumpTable = jumpTable.filter(function (jump) {\n return jump.position <= position;\n });\n return this;\n },\n\n /**\n * Jumps to the next item without taking the branching rules into account\n *\n * @returns {Promise}\n */\n jumpToSkipItem: function jumpToSkipItem() {\n var self = this;\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpItem = self.getLastJump().item || null;\n var items = getItems(testMap);\n var itemSliceIndex = items.indexOf(lastJumpItem);\n var itemIdentifierToAdd = items.slice(itemSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAdd;\n }).shift();\n\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n });\n },\n\n /**\n * Adds the next item to the end of the jump table\n *\n * @param {Object} params\n * @returns {Promise}\n */\n jumpToNextItem: function jumpToNextItem(params) {\n var self = this;\n addResponsesToResponseStore(params);\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpItem = self.getLastJump().item || null;\n var items = getItems(testMap);\n var itemSliceIndex = items.indexOf(lastJumpItem);\n var itemIdentifierToAdd = items.slice(itemSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAdd;\n }).shift();\n var lastJumpItemData = simplifiedTestMap.filter(function (row) {\n return row.item === lastJumpItem;\n }).shift();\n\n if (lastJumpItemData && lastJumpItemData.itemHasBranchRule) {\n return itemStore.get(lastJumpItem).then(function (item) {\n branchRule(lastJumpItemData.itemBranchRule, item, params, responseStore).then(function (itemIdentifierToAddd) {\n if (itemIdentifierToAddd !== null) {\n itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.item === itemIdentifierToAddd;\n }).shift();\n }\n\n self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n } else {\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n }\n });\n },\n\n /**\n * Adds the first item of the next section to the end of the jump table\n *\n * @returns {Promise}\n */\n jumpToNextSection: function jumpToNextSection() {\n var self = this;\n return new Promise(function (resolve) {\n var simplifiedTestMap = getSimplifiedTestMap(testMap);\n var lastJumpSection = self.getLastJump().section || null;\n var sections = getSections(testMap);\n var sectionSliceIndex = sections.indexOf(lastJumpSection);\n var sectionIdentifierToAdd = sections.slice(sectionSliceIndex + 1).shift();\n var itemToAdd = simplifiedTestMap.filter(function (row) {\n return row.section === sectionIdentifierToAdd;\n }).shift();\n\n if (itemToAdd) {\n return self.addJump(itemToAdd.part, itemToAdd.section, itemToAdd.item).then(resolve);\n } else {\n return resolve();\n }\n });\n },\n\n /**\n * Jumps to the previous item by deleting the last entry of the jump table.\n *\n * @returns {Promise}\n */\n jumpToPreviousItem: function jumpToPreviousItem() {\n return new Promise(function (resolve) {\n jumpTable.pop();\n resolve();\n });\n },\n\n /**\n * Returns the jump table.\n *\n * @returns {Jump[]}\n */\n getJumpTable: function getJumpTable() {\n return jumpTable;\n },\n\n /**\n * Returns the last entry of the jump table which represent the current state of the navigation.\n *\n * @returns {Jump}\n */\n getLastJump: function getLastJump() {\n return jumpTable.length > 0 ? jumpTable[jumpTable.length - 1] : {};\n }\n };\n };\n\n return offlineJumpTableFactory;\n\n});\n\n","define('taoQtiTest/runner/navigator/offlineNavigator',['util/capitalize', 'taoQtiTest/runner/services/offlineJumpTable', 'taoQtiTest/runner/helpers/testContextBuilder'], function (capitalize, offlineJumpTableFactory, testContextBuilder) { 'use strict';\n\n capitalize = capitalize && Object.prototype.hasOwnProperty.call(capitalize, 'default') ? capitalize['default'] : capitalize;\n offlineJumpTableFactory = offlineJumpTableFactory && Object.prototype.hasOwnProperty.call(offlineJumpTableFactory, 'default') ? offlineJumpTableFactory['default'] : offlineJumpTableFactory;\n testContextBuilder = testContextBuilder && Object.prototype.hasOwnProperty.call(testContextBuilder, 'default') ? testContextBuilder['default'] : testContextBuilder;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * @param {itemStore} itemStore\n * @param {responseStore} responseStore\n * @returns {Object}\n */\n\n function offlineNavigatorFactory(itemStore, responseStore) {\n var testContext,\n testMap,\n offlineJumpTableHelper = offlineJumpTableFactory(itemStore, responseStore);\n return {\n /**\n * @deprecated\n * @param {Object} data\n * @returns {this}\n */\n setTestData: function setTestData() {\n return this;\n },\n\n /**\n * @param {Object} context\n * @returns {this}\n */\n setTestContext: function setTestContext(context) {\n testContext = context;\n return this;\n },\n\n /**\n * @param {Object} map\n * @returns {this}\n */\n setTestMap: function setTestMap(map) {\n testMap = map;\n return this;\n },\n\n /**\n * Initialization method for the offline navigator component\n * It get called in proxy init function \n *\n * @returns {Promise}\n */\n init: function init() {\n offlineJumpTableHelper.setTestMap(testMap);\n return offlineJumpTableHelper.init(testContext);\n },\n\n /**\n * Helper function to clear the jump table\n * It's used only in tests\n *\n * @returns {this}\n */\n clearJumpTable: function clearJumpTable() {\n offlineJumpTableHelper.clearJumpTable();\n return this;\n },\n\n /**\n * Performs the navigation action and returns the new test context.\n *\n * @param {String} direction\n * @param {String} scope\n * @param {Integer} position\n * @param {Object} params\n * @returns {Promise} the new test context\n */\n navigate: function navigate(direction, scope, position, params) {\n return new Promise(function (resolve, reject) {\n var lastJump,\n navigationActionName = \"jumpTo\".concat(capitalize(direction)).concat(capitalize(scope));\n\n if (typeof offlineJumpTableHelper[navigationActionName] === 'undefined' || typeof offlineJumpTableHelper[navigationActionName] !== 'function') {\n throw new Error('Invalid navigation action');\n }\n\n offlineJumpTableHelper[navigationActionName](params).then(function () {\n lastJump = offlineJumpTableHelper.getLastJump(); // new textContext doesn't know about item attempt\n // attempt is stored in itemStore\n // 1. get attempt from itemStore and increase it\n // 2. set it in new textContext\n // 3. store new attempt in itemStore\n // 4. return new textContext with right attempt\n\n itemStore.get(lastJump.item).then(function (itemFromStore) {\n var newTestContext = testContextBuilder.buildTestContextFromJump(testContext, testMap, lastJump, itemFromStore.attempt);\n itemStore.update(newTestContext.itemIdentifier, 'attempt', newTestContext.attempt).then(function () {\n return resolve(newTestContext);\n });\n });\n }).catch(function (err) {\n reject(err);\n });\n });\n }\n };\n }\n\n return offlineNavigatorFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/dataUpdater',['lodash', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/config/states'], function (_, mapHelper, states) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA\n *\n */\n /**\n * Get the updater\n * @param {Map} testDataHolder - the data holder\n * @returns {dataUpdater}\n * @throws {TypeError} if the data holder is not or incorrectly set\n */\n\n function dataUpdaterFactory(testDataHolder) {\n if (!testDataHolder || !_.isFunction(testDataHolder.get) || !_.isFunction(testDataHolder.set)) {\n throw new TypeError('A data holder is mandatory for the udpater');\n }\n /**\n * Exposes the methods to update test data\n * @typedef {Object} dataUpdater\n */\n\n\n return {\n /**\n * Update test data from a dataSet (usually their raw data given by the proxy).\n * If the dataSet is a collection, we use only the last matching object.\n * @param {Object|Object[]} dataSet - object[s] that contains or not testData, testContext & testMap\n */\n update: function update(dataSet) {\n var self = this;\n /**\n * Check if a collection's item contains test contextual data\n * @param {Object} contextualData\n * @returns {Boolean}\n */\n\n var isContextual = function isContextual(contextualData) {\n return contextualData && (_.isPlainObject(contextualData.testContext) || _.isPlainObject(contextualData.testData) || _.isPlainObject(contextualData.testMap));\n };\n /**\n * Update the test data from contextual data\n * @param {Object} contextualData\n */\n\n\n var updateData = function updateData(contextualData) {\n var builtTestMap;\n var updatedTestMap;\n\n if (contextualData) {\n if (_.isPlainObject(contextualData.testData)) {\n testDataHolder.set('testData', contextualData.testData);\n }\n\n if (_.isPlainObject(contextualData.testContext)) {\n testDataHolder.set('testContext', contextualData.testContext);\n }\n\n if (_.isPlainObject(contextualData.testMap)) {\n //the received map is not complete and should be \"built\"\n builtTestMap = self.buildTestMap(contextualData.testMap);\n\n if (builtTestMap) {\n testDataHolder.set('testMap', builtTestMap);\n }\n } //always update the map stats\n\n\n updatedTestMap = self.updateStats();\n\n if (updatedTestMap) {\n testDataHolder.set('testMap', updatedTestMap);\n }\n }\n };\n\n if (isContextual(dataSet)) {\n updateData(dataSet);\n } else {\n updateData(_.findLast(dataSet, isContextual));\n }\n },\n\n /**\n * - reindex and build the jump table\n * - patch the current testMap if a partial map is set\n *\n * @param {Object} testMap - the testMap to build\n * @returns {Object} the built testMap\n */\n buildTestMap: function buildTestMap(testMap) {\n var newMap = null;\n\n if (testMap) {\n if (testMap.scope && testMap.scope !== 'test') {\n newMap = mapHelper.patch(testDataHolder.get('testMap'), testMap);\n } else {\n newMap = mapHelper.reindex(testMap);\n }\n }\n\n return newMap;\n },\n\n /**\n * Update current map stats based on the context\n *\n * @returns {Object} the updated testMap\n */\n updateStats: function updateStats() {\n var testMap = testDataHolder.get('testMap');\n var testContext = testDataHolder.get('testContext');\n var updatedTestMap = null;\n\n if (testMap && testContext && _.isNumber(testContext.itemPosition)) {\n var item = mapHelper.getItemAt(testMap, testContext.itemPosition);\n\n if (item && testContext.state === states.testSession.interacting) {\n var testPart = mapHelper.getPart(testMap, testContext.testPartId); //flag as viewed, always\n\n item.viewed = true;\n\n if (testPart && testPart.isLinear) {\n item.answered = true;\n }\n\n updatedTestMap = mapHelper.updateItemStats(testMap, testContext.itemPosition);\n }\n }\n\n return updatedTestMap;\n },\n\n /**\n * Let's you update the plugins configuration from when filling testData\n * @param {plugin[]} plugins - the test runner plugins\n * @param {Objectt} [pluginsConfig] - the configuration to set on the plugins\n */\n updatePluginsConfig: function updatePluginsConfig(plugins, pluginsConfig) {\n //to keep backward compatibility with the deprecated testData\n if (!pluginsConfig) {\n var testData = testDataHolder.get('testData');\n pluginsConfig = testData && testData.config && testData.config.plugins;\n }\n\n if (plugins && pluginsConfig) {\n _.forEach(pluginsConfig, function (config, pluginName) {\n if (_.isPlainObject(plugins[pluginName]) && _.isFunction(plugins[pluginName].setConfig) && _.isPlainObject(config)) {\n plugins[pluginName].setConfig(config);\n }\n });\n }\n }\n };\n }\n\n return dataUpdaterFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/toolStateBridge',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA\n *\n */\n /**\n * Merge each item of a collection with the next\n * @param {Object[]} collection\n * @return {Object} the merged collection\n */\n\n var mergeCollection = function mergeCollection(collection) {\n return _.reduce(collection, function (acc, value) {\n if (value) {\n return _.merge(acc, value);\n }\n\n return acc;\n }, {});\n };\n /**\n * Build the toolStateBridge instance.\n *\n *\n * In order to allow state management for a tool the matching plugin\n * needs to be activated.\n *\n * @param {testStore} testStore - the testStore instance\n * @param {String[]} activePlugins - the list of active plugins\n * @returns {toolStateBridge}\n */\n\n\n function toolStateBridgeFactory(testStore, activePlugins) {\n var tools = [];\n\n if (!testStore || !_.isFunction(testStore.getStore)) {\n throw new TypeError('The toolStateBridge should be initialized with a testStore');\n }\n\n if (!_.isArray(activePlugins) || !activePlugins.length) {\n throw new TypeError('The toolStateBridge should be initialized with a the list of active plugins');\n }\n /**\n * @typedef {Object} toolStateBridge\n */\n\n\n return {\n /**\n * Set the tools to manage the states.\n * Each toolName MUST match a plugin name.\n *\n * This trigger the change tracking in the testStore for the\n * stores with the tool/plugin name.\n *\n * @param {String[]} toolNames - the list of tool names\n * @returns {toolStateBridge} chains\n */\n setTools: function setTools(toolNames) {\n tools = _(toolNames).filter(function (toolName) {\n return _.contains(activePlugins, toolName);\n }).map(function (toolName) {\n testStore.startChangeTracking(toolName);\n return toolName;\n }).value();\n return this;\n },\n\n /**\n * Get the list of tools\n * @returns {String[]} the list of configured tools\n */\n getTools: function getTools() {\n return tools;\n },\n\n /**\n * Restore the state of the given tool\n * @param {String} toolName - the name of the tool\n * @param {Object} toolState - the state to restore\n * @returns {Promise<Boolean>} resolves with true if restored\n */\n restoreState: function restoreState(toolName, toolState) {\n if (_.contains(tools, toolName) && _.isPlainObject(toolState)) {\n return testStore.getStore(toolName).then(function (toolStore) {\n return toolStore.clear().then(function () {\n return toolStore;\n });\n }).then(function (toolStore) {\n return Promise.all(_.map(toolState, function (value, key) {\n return toolStore.setItem(key, value);\n }));\n }).then(function () {\n testStore.resetChanges(toolName);\n return true;\n });\n }\n\n return Promise.resolve(false);\n },\n\n /**\n * Restore the states of multiple tools\n * @param {Object} states - key is the toolName and the value the state to resolve\n * @returns {Promise<Object>} key is the restored toolName and the value is the status\n */\n restoreStates: function restoreStates(states) {\n var self = this;\n return Promise.all(_.map(states, function (toolState, toolName) {\n return self.restoreState(toolName, toolState).then(function (result) {\n var formattedResult = {};\n formattedResult[toolName] = result;\n return formattedResult;\n });\n })).then(mergeCollection);\n },\n\n /**\n * Get the state of a given tool\n * @param {String} toolName - the name of the tool\n * @param {Boolean} [reset] - do we reset the change tracking ?\n * @returns {Promise<Object|Boolean>} resolves with the state\n */\n getState: function getState(toolName, reset) {\n if (_.contains(tools, toolName) && testStore.hasChanges(toolName)) {\n return testStore.getStore(toolName).then(function (toolStore) {\n if (reset !== false) {\n testStore.resetChanges(toolName);\n }\n\n return toolStore.getItems();\n });\n }\n\n return Promise.resolve(false);\n },\n\n /**\n * Get the state for all tools with changes\n * @returns {Promise<Object>} resolves with the states\n */\n getStates: function getStates() {\n var self = this;\n return Promise.all(_.map(tools, function (toolName) {\n return self.getState(toolName).then(function (toolState) {\n //format the state to keep the tool identifier\n var formattedState = {};\n\n if (toolState) {\n formattedState[toolName] = toolState;\n return formattedState;\n }\n\n return false;\n });\n })).then(mergeCollection);\n }\n };\n }\n\n return toolStateBridgeFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/entry',['lodash', 'ui/component', 'handlebars'], function (_, componentFactory, Handlebars) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"<span class=\\\"icon icon-\";\n if (helper = helpers.icon) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.icon); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\"></span>\";\n return buffer;\n }\n function program6(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"<span class=\\\"text\\\">\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\";\n return buffer;\n }\n\n buffer += \"<li\\n data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n class=\\\"small btn-info action\";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.className), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\"\\n title=\\\"\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n role=\\\"button\\\"\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.aria), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n>\\n <a class=\\\"li-inner\\\" href=\\\"#\\\" onclick=\\\"return false\\\" aria-hidden=\\\"true\\\" >\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </a>\\n</li>\\n\";\n return buffer;\n });\n function entryTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var itemComponentApi = {\n /**\n * Initialise the item\n */\n initItem: function initItem() {\n this.id = this.config.control;\n this.menu = null;\n },\n\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'entry';\n },\n\n /**\n * Get the item Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n },\n\n /**\n * Set the menu to whom the item belong\n * @param {String} menuId\n * @returns {String}\n */\n setMenuId: function setMenuId(menuId) {\n this.menuId = menuId;\n },\n\n /**\n * Get the id of the menu to whom the item belong\n * @returns {String}\n */\n getMenuId: function getMenuId() {\n return this.menuId;\n },\n\n /**\n * Set the item as active. For example, if it opens a tool,\n * the item should be represented 'on' as long as the tool remains opened\n */\n turnOn: function turnOn() {\n this.setState('active', true);\n var element = this.getElement();\n\n if (!element || element.attr('role') !== 'option') {\n // Not pretty bit quick\n return;\n }\n\n element.attr('aria-selected', 'true') // JAWS ignores aria-selected attribute\n .attr('aria-checked', 'true'); // NVDA not read aria-selected=\"true\"\n },\n\n /**\n * Set the item as inactive\n */\n turnOff: function turnOff() {\n this.setState('active', false);\n var element = this.getElement();\n\n if (!element || element.attr('role') !== 'option') {\n // Not pretty bit quick\n return;\n }\n\n element.attr('aria-selected', 'false') // NVDA + Chrome ignores aria-checked=\"false\"\n .attr('aria-checked', 'false');\n },\n\n /**\n * Set the item as hovered, whether by the mouse or by keyboard navigation\n */\n hoverOn: function hoverOn() {\n this.setState('hover', true);\n },\n\n /**\n * Turn off the hovered style\n */\n hoverOff: function hoverOff() {\n this.setState('hover', false);\n }\n };\n /**\n * The item factory\n */\n\n function itemComponentFactory(specs, defaults) {\n var itemComponent;\n specs = _.defaults(specs || {}, itemComponentApi);\n itemComponent = componentFactory(specs, defaults).setTemplate(entryTpl).on('enable', function () {\n if (this.is('rendered')) {\n this.$component.removeProp('disabled');\n }\n }).on('disable', function () {\n if (this.is('rendered')) {\n this.$component.prop('disabled', true);\n this.turnOff();\n }\n }).on('init', function () {\n this.initItem();\n }).on('render', function () {\n var self = this;\n this.disable(); // we always render disabled by default\n // forward DOM events to the component object\n\n this.$component.on('mousedown', function (event) {\n self.trigger('mousedown', event);\n }).on('click', function (event) {\n self.trigger('click', event);\n });\n });\n return itemComponent;\n }\n\n return itemComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/menu',['jquery', 'lodash', 'ui/component', 'ui/hider', 'ui/stacker', 'handlebars'], function ($$1, _, componentFactory, hider, stackerFactory, Handlebars) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n hider = hider && Object.prototype.hasOwnProperty.call(hider, 'default') ? hider['default'] : hider;\n stackerFactory = stackerFactory && Object.prototype.hasOwnProperty.call(stackerFactory, 'default') ? stackerFactory['default'] : stackerFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"<span class=\\\"icon icon-\";\n if (helper = helpers.icon) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.icon); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(4, program4, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\"></span>\";\n return buffer;\n }\n function program4(depth0,data) {\n \n \n return \" no-label\";\n }\n\n function program6(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"<span class=\\\"text\\\">\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\";\n return buffer;\n }\n\n buffer += \"<li\\n data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n class=\\\"small btn-info action \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.className), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\"\\n title=\\\"\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n aria-label=\\\"\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n aria-haspopup=\\\"listbox\\\"\\n role=\\\"button\\\"\\n>\\n <a class=\\\"li-inner\\\" data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"-button\\\" href=\\\"#\\\" aria-hidden=\\\"true\\\">\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.icon), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.text), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n <span class=\\\"icon icon-up\\\"></span>\\n </a>\\n <div data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"-menu\\\" class=\\\"hidden \";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"-menu\\\" tabindex=\\\"1\\\">\\n <ul\\n data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"-list\\\"\\n class=\\\"menu \";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"-list\\\"\\n role=\\\"listbox\\\"\\n ></ul>\\n </div>\\n</li>\\n\";\n return buffer;\n });\n function menuTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" \";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n role=\\\"\";\n if (helper = helpers.role) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.role); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n return buffer;\n }\n\n buffer += \"<li\\n class=\\\"small action menu-item \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.className), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\"\\n data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n tabindex=\\\"-1\\\"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.role), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n>\\n <a class=\\\"li-inner menu-inner\\\">\\n <span class=\\\"icon icon-checkbox\\\"></span><span class=\\\"icon icon-checkbox-checked\\\"></span>\\n <span class=\\\"label\\\">\";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\\n </a>\\n</li>\";\n return buffer;\n });\n function menuItemTpl(data, options, asString) {\n var html = Template$1(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2020 (original work) Open Assessment Technologies SA;\n */\n var keyCodes = {\n TAB: 9,\n ESC: 27,\n ENTER: 13,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n };\n var stacker = stackerFactory('test-runner');\n var menuComponentApi = {\n /**\n * Initialise the menu\n */\n initMenu: function initMenu() {\n this.id = this.config.control;\n this.navType = this.config.navType ? this.config.navType : 'fromLast';\n this.menuItems = [];\n },\n\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'menu';\n },\n\n /**\n * Get the menu Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n },\n\n /**\n * Set the menu as active, essentially meaning that the menu panel is opened\n */\n turnOn: function turnOn() {\n this.setState('active', true);\n },\n\n /**\n * Set the menu as inactive\n */\n turnOff: function turnOff() {\n this.setState('active', false);\n },\n\n /**\n * =====================\n * Actions on menu panel\n * =====================\n */\n\n /**\n * open/close the menu\n */\n toggleMenu: function showMenu() {\n if (!this.is('disabled')) {\n if (this.is('opened')) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n }\n },\n\n /**\n * It needs to find closest visible item.\n *\n * @param {Number} last - index to stop.\n * @param {-1|1} inc - incrementor. -1 - navigate to the top, 1 - to the bottom.\n *\n * @returns {Number} returns index > 0 if a visible item was found and -1 otherwise.\n */\n indexOfClosestVisibleItem: function indexOfClosestVisibleItem(inc, last) {\n if (!this.menuItems.length) {\n return -1;\n }\n\n var elem;\n var position = this.hoverIndex;\n\n do {\n position += inc;\n\n if (position === last) {\n return -1;\n }\n\n elem = this.menuItems[position].getElement();\n } while (elem && elem.hasClass('hidden'));\n\n return position;\n },\n\n /**\n * Changes hoverIndex and hover item.\n *\n * @param {Number} index - item index to hover.\n *\n * @returns the menu item.\n */\n hoverByIndex: function hoverByIndex(index) {\n var elem = this.menuItems[index];\n this.hoverIndex = index;\n\n if (elem) {\n this.hoverItem(elem.id);\n }\n\n return elem;\n },\n hoverNextVisibleItem: function hoverNextVisibleItem() {\n var index = this.indexOfClosestVisibleItem(1, this.menuItems.length);\n var elem = this.hoverByIndex(index);\n return elem;\n },\n hoverPreviousVisibleItem: function hoverPreviousVisibleItem() {\n var index = this.indexOfClosestVisibleItem(-1, -1);\n var elem = this.hoverByIndex(index);\n return elem;\n },\n\n /**\n * open the menu\n */\n openMenu: function openMenu() {\n // show the DOM element\n hider.show(this.$menuContainer);\n stacker.bringToFront(this.$menuContent); // change the menu button icon\n\n this.$menuStateIcon.removeClass('icon-up');\n this.$menuStateIcon.addClass('icon-down'); // turn on the menu button\n\n this.turnOn(); // setup keyboard navigation & highlighting\n\n this.enableShortcuts();\n this.hoverOffAll();\n\n if (document.activeElement) {\n document.activeElement.blur();\n }\n\n var activeItemIndex = _.findIndex(this.menuItems, function (item) {\n return item.is('active');\n });\n\n if (activeItemIndex >= 0) {\n this.hoverIndex = activeItemIndex;\n this.$menuItems[this.hoverIndex].focus();\n this.hoverItem(this.menuItems[activeItemIndex].id);\n } else if (this.navType === 'fromLast') {\n // fromLast (default) navigation: focus on button and then using UP go to last item\n this.hoverIndex = this.menuItems.length; // we start on the button, not at the max array index\n // which would be menuItems.length-1\n\n this.hoverPreviousVisibleItem();\n } else if (this.navType === 'fromFirst') {\n // fromFirst navigation: focus on button and then using DOWN go to first item\n this.hoverIndex = -1; // we start on the button, not the first element\n // which would be 0\n\n this.hoverNextVisibleItem();\n } // component inner state\n\n\n this.setState('opened', true);\n this.trigger('openmenu', this);\n },\n\n /**\n * close the menu\n */\n closeMenu: function closeMenu() {\n // hide the DOM element\n hider.hide(this.$menuContainer); // change the menu button icon\n\n this.$menuStateIcon.removeClass('icon-down');\n this.$menuStateIcon.addClass('icon-up'); // turn off the button\n\n this.turnOff(); // disable keyboard navigation & highlighting\n\n this.disableShortcuts();\n this.hoverOffAll(); // component inner state\n\n this.setState('opened', false);\n this.trigger('closemenu', this); // Move focus if the menu wasn't disabled before the close action was launched.\n\n if (!this.is('disabled') && !this.$component.prop('disabled')) {\n this.$menuButton.parent().focus(); // It needs for screenreaders to correctly read menu button after submenu was closed\n }\n },\n\n /**\n * =====================\n * Actions on menu items\n * =====================\n */\n\n /**\n * Look for a item in the internal item registry\n * @param {String} itemId\n * @returns {Object|undefined}\n */\n getItemById: function getItemById(itemId) {\n return _.find(this.menuItems, function (item) {\n return item.getId() === itemId;\n });\n },\n\n /**\n * Adds an item to the menu\n * @param {Component} item\n */\n addItem: function addItem(item) {\n if (item) {\n this.menuItems.push(item);\n }\n },\n\n /**\n * Render menu items into the menu panel\n */\n renderItems: function renderItems() {\n var self = this;\n this.menuItems.forEach(function (item) {\n item.setTemplate(menuItemTpl); // the item has been created as generic. Let's give him now the menu entry template\n\n item.render(self.$menuContent);\n item.enable();\n }); // bind mouse behavior on menu items\n\n this.$menuItems = this.$menuContent.find('.menu-item');\n this.$menuItems.on('mouseenter', function highlightHoveredEntry(e) {\n var itemId = e.currentTarget.getAttribute('data-control');\n self.mouseOverItem(itemId);\n });\n },\n\n /**\n * Highlight the currently hovered item\n * @param {String} itemId\n */\n mouseOverItem: function mouseOverItem(itemId) {\n var self = this; // look for item index\n\n this.menuItems.forEach(function (item, index) {\n if (item.id === itemId) {\n self.hoverIndex = index;\n }\n });\n this.hoverItem(itemId);\n },\n\n /**\n * Check that the menu has at least one of its entries displayed\n * @returns {boolean}\n */\n hasDisplayedItems: function hasDisplayedItems() {\n return this.menuItems.some(function (item) {\n return !item.is('disabled') && !item.is('hidden');\n });\n },\n\n /**\n * Set all entries in the menu to inactive\n */\n turnOffAll: function turnOffAll() {\n this.menuItems.forEach(function (current) {\n current.turnOff();\n });\n },\n\n /**\n * =====================\n * Menu items navigation\n * =====================\n */\n\n /**\n * register the event handlers for keyboard navigation\n */\n enableShortcuts: function enableShortcuts() {\n var self = this;\n this.$menuContainer.on('keydown.menuNavigation', function (e) {\n var currentKeyCode = e.keyCode ? e.keyCode : e.charCode;\n e.preventDefault();\n\n switch (currentKeyCode) {\n case keyCodes.ESC:\n case keyCodes.TAB:\n self.closeMenu();\n break;\n\n case keyCodes.SPACE:\n case keyCodes.ENTER:\n self.triggerHighlightedItem();\n e.stopPropagation();\n break;\n\n case keyCodes.LEFT:\n case keyCodes.UP:\n self.moveUp();\n e.stopPropagation();\n break;\n\n case keyCodes.RIGHT:\n case keyCodes.DOWN:\n self.moveDown();\n e.stopPropagation();\n break;\n }\n });\n this.$menuButton.on('keydown.menuNavigation', function (e) {\n var currentKeyCode = e.keyCode ? e.keyCode : e.charCode;\n\n function setFocusToItem(index) {\n self.hoverIndex = index;\n self.$menuContainer.focus();\n self.hoverItem(self.menuItems[self.hoverIndex].id);\n }\n\n if (currentKeyCode === keyCodes.UP && self.navType === 'fromLast') {\n e.stopPropagation();\n setFocusToItem(self.menuItems.length - 1);\n }\n\n if (currentKeyCode === keyCodes.DOWN && self.navType === 'fromFirst') {\n e.stopPropagation();\n setFocusToItem(0);\n }\n });\n },\n\n /**\n * remove the event handlers for keyboard navigation\n */\n disableShortcuts: function disableShortcuts() {\n this.$menuContainer.off('.menuNavigation');\n this.$menuButton.off('.menuNavigation');\n },\n\n /**\n * Move the highlight to the previous not hidden item\n */\n moveUp: function moveUp() {\n if (this.hoverIndex > 0) {\n var elem = this.hoverPreviousVisibleItem();\n\n if (!elem) {\n this.closeMenu();\n } // move to the menu button\n\n } else if (this.hoverIndex === 0) {\n this.hoverIndex--;\n this.closeMenu();\n }\n },\n\n /**\n * Move the highlight to the next not hidden item, or to the menu button if we are on the last item\n */\n moveDown: function moveDown() {\n // move to the next item\n if (this.hoverIndex < this.menuItems.length - 1) {\n var elem = this.hoverNextVisibleItem();\n\n if (!elem) {\n this.closeMenu();\n } // move to the menu button\n\n } else if (this.hoverIndex === this.menuItems.length - 1) {\n this.hoverIndex++;\n this.closeMenu();\n }\n },\n\n /**\n * Highlight the given item\n * @param {String} itemId\n */\n hoverItem: function hoverItem(itemId) {\n var itemToHover = this.getItemById(itemId);\n this.hoverOffAll();\n\n if (itemToHover) {\n itemToHover.hoverOn();\n itemToHover.getElement().focus();\n }\n },\n\n /**\n * Remove highlight from all items\n */\n hoverOffAll: function hoverOffAll() {\n this.menuItems.forEach(function (current) {\n if (current) {\n current.hoverOff();\n }\n });\n },\n\n /**\n * Run a click event on the DOM element of the currently highlighted item\n */\n triggerHighlightedItem: function triggerHighlightedItem() {\n var activeItem;\n\n if (this.menuItems[this.hoverIndex]) {\n activeItem = this.menuItems[this.hoverIndex];\n activeItem.getElement().trigger('click');\n this.closeMenu(); // give back the focus\n\n this.$component.focus();\n }\n },\n\n /**\n * Set navigation type\n * @param {String} type - 'fromLast', 'fromFirst'\n */\n setNavigationType: function setNavigationType(type) {\n if (['fromLast', 'fromFirst'].includes(type)) {\n this.navType = type;\n }\n }\n };\n /**\n * The menu component factory\n */\n\n function menuComponentFactory(specs, defaults) {\n var _defaults, menuComponent;\n\n _defaults = {\n $component: $$1(),\n $menuButton: $$1(),\n $menuContainer: $$1(),\n $menuContent: $$1(),\n $menuItems: $$1(),\n $menuStateIcon: $$1(),\n hoverIndex: null,\n id: null,\n menuItems: []\n };\n specs = _.defaults(specs || {}, menuComponentApi);\n menuComponent = componentFactory(specs, defaults).setTemplate(menuTpl).on('enable', function enable() {\n if (this.is('rendered')) {\n this.$component.removeProp('disabled');\n }\n }).on('disable', function disable() {\n if (this.is('rendered')) {\n this.$component.prop('disabled', true);\n this.closeMenu();\n this.turnOff();\n }\n }).on('hide', function disable() {\n if (this.is('rendered')) {\n this.closeMenu();\n }\n }).on('init', function init() {\n this.initMenu();\n }).on('render', function render() {\n var self = this; // get access to DOM elements\n\n this.$menuButton = this.$component.find(\"[data-control=\\\"\".concat(this.config.control, \"-button\\\"]\"));\n this.$menuContainer = this.$component.find(\"[data-control=\\\"\".concat(this.config.control, \"-menu\\\"]\"));\n this.$menuContent = this.$component.find(\"[data-control=\\\"\".concat(this.config.control, \"-list\\\"]\"));\n this.$menuStateIcon = this.$menuButton.find('.icon-up');\n this.disable(); // always render disabled by default\n // add behavior\n\n this.$component.on('click', function toggleMenu(e) {\n e.preventDefault();\n\n if (!self.is('opened')) {\n e.stopPropagation(); // prevent higher handler to auto-close the menu on click\n }\n\n self.toggleMenu();\n });\n this.$menuContainer.on('click', function closeMenuOnItemClick(e) {\n e.preventDefault();\n e.stopPropagation(); // so the menu doesn't get toggled again when the event bubble to the component\n\n self.closeMenu();\n });\n this.$menuContent.on('mouseleave', this.hoverOffAll);\n }).on('destroy', function () {\n if (this.is('rendered')) {\n this.$menuContainer.off('.menuNavigation');\n this.$menuButton.off('.menuNavigation');\n }\n }); // Apply default properties to the menuComponent\n\n _.defaults(menuComponent, _defaults);\n\n return menuComponent;\n }\n\n return menuComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/text',['lodash', 'ui/component', 'handlebars'], function (_, componentFactory, Handlebars) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\n function program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"class=\\\"\";\n if (helper = helpers.className) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.className); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n return buffer;\n }\n\n function program3(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n aria-\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.key)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"=\\\"\"\n + escapeExpression((typeof depth0 === functionType ? depth0.apply(depth0) : depth0))\n + \"\\\"\\n \";\n return buffer;\n }\n\n buffer += \"<li\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.className), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \" data-control=\\\"\";\n if (helper = helpers.control) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.control); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.aria), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n>\\n \";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n</li>\\n\";\n return buffer;\n });\n function textTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var textComponentApi = {\n /**\n * Initialise text\n * @returns {String}\n */\n initText: function initText() {\n this.id = this.config.control;\n },\n\n /**\n * Get the type of the component\n */\n getType: function getType() {\n return 'text';\n },\n\n /**\n * Get the item Id\n * @returns {String}\n */\n getId: function getId() {\n return this.id;\n }\n };\n /**\n * The text factory\n */\n\n function textComponentFactory(specs, defaults) {\n var textComponent;\n specs = _.defaults(specs || {}, textComponentApi);\n textComponent = componentFactory(specs, defaults).setTemplate(textTpl).on('init', function () {\n this.initText();\n }).on('render', function () {\n this.disable(); // always render disabled first\n });\n return textComponent;\n }\n\n return textComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/ui/toolbox/toolbox',['lodash', 'jquery', 'ui/component', 'taoQtiTest/runner/ui/toolbox/entry', 'taoQtiTest/runner/ui/toolbox/menu', 'taoQtiTest/runner/ui/toolbox/text', 'handlebars'], function (_, $$1, componentFactory, entryFactory, menuFactory, textFactory, Handlebars) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n componentFactory = componentFactory && Object.prototype.hasOwnProperty.call(componentFactory, 'default') ? componentFactory['default'] : componentFactory;\n entryFactory = entryFactory && Object.prototype.hasOwnProperty.call(entryFactory, 'default') ? entryFactory['default'] : entryFactory;\n menuFactory = menuFactory && Object.prototype.hasOwnProperty.call(menuFactory, 'default') ? menuFactory['default'] : menuFactory;\n textFactory = textFactory && Object.prototype.hasOwnProperty.call(textFactory, 'default') ? textFactory['default'] : textFactory;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"<ul class=\\\"plain tools-box-list\\\"></ul>\";\n });\n function toolboxTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n var toolboxComponentApi = {\n /**\n * Initialize the toolbox\n */\n initToolbox: function initToolbox() {\n this.allItems = [];\n this.allMenus = [];\n },\n\n /**\n * Create a menu component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.title - will be used in the title html attribute\n * @param {String} config.icon - the icon for the button\n * @param {String} config.text - the button label\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createMenu: function createMenu(config) {\n var self = this,\n menu = menuFactory().init(config);\n this.allItems.push(menu);\n this.allMenus.push(menu); // add an event handler to close all opened menu when opening\n\n menu.on('openmenu', function closeAllMenuExcept(openedMenu) {\n self.allMenus.forEach(function (current) {\n if (openedMenu.getId() !== current.getId() && current.is('opened')) {\n current.closeMenu();\n }\n });\n });\n return menu;\n },\n\n /**\n * Create a entry component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.title - will be used in the title html attribute\n * @param {String} config.icon - the icon for the button\n * @param {String} config.text - the button label\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createEntry: function createEntry(config) {\n var extendedConfig = Object.assign({\n role: \"option\"\n }, config);\n var item = entryFactory().init(extendedConfig);\n this.allItems.push(item);\n return item;\n },\n\n /**\n * Create a text component instance\n * @param {Object} config\n * @param {String} config.control - will be used as the instance id and in the data-control html attribute\n * @param {String} config.text - the text content\n * @param {String} config.className - an extra class\n * @returns {Component} the create instance\n */\n createText: function createText(config) {\n var text = textFactory().init(config);\n this.allItems.push(text);\n return text;\n },\n\n /**\n * If the given item belongs to a menu\n * @param {Object} item\n * @returns {Boolean}\n */\n hasMenu: function hasMenu(item) {\n return item && _.isFunction(item.getMenuId) && item.getMenuId();\n }\n };\n /**\n * Default renderer. It simply appends all the registered items in the toolbox, one after the other\n * @param {jQuery} $container - where to render\n */\n\n function defaultRenderer($container) {\n var self = this,\n menuEntries = []; // render first level\n\n if (_.isArray(this.allItems)) {\n this.allItems.forEach(function (item) {\n // items belonging to menus will be processed later\n if (!self.hasMenu(item)) {\n item.render($container);\n }\n });\n } // Render each menu\n\n\n this.allMenus.forEach(function (menu) {\n var menuId = menu.getId(); // first, we gather all items relevant to the current menu\n\n menuEntries = self.allItems.filter(function (item) {\n return item.getType() === 'entry' && item.getMenuId() === menuId;\n }); // we then add entries to the current menu\n\n menuEntries.forEach(function (item) {\n menu.addItem(item);\n }); // and finally render the whole menu\n\n menu.renderItems();\n });\n }\n /**\n * The toolbox factory\n */\n\n\n function toolboxComponentFactory(specs, defaults) {\n var $document = $$1(document),\n toolboxComponent;\n specs = _.defaults(specs || {}, toolboxComponentApi);\n toolboxComponent = componentFactory(specs, defaults).on('init', function () {\n this.initToolbox();\n }) // overridable renderer\n .on('render.defaultRenderer', defaultRenderer) // non-overridable renderer\n .on('render', function () {\n var self = this; // fixme: try to bind this behavior on the blur event of each menu\n\n $document.off('.toolboxmenu');\n $document.on('click.toolboxmenu', function () {\n self.allMenus.forEach(function (menu) {\n if (menu.is('opened')) {\n menu.closeMenu();\n }\n });\n });\n }).on('destroy', function () {\n $document.off('.toolboxmenu');\n this.allItems.forEach(function (item) {\n item.destroy();\n });\n }).setTemplate(toolboxTpl);\n return toolboxComponent;\n }\n\n return toolboxComponentFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/stopwatch',['core/eventifier', 'core/polling', 'core/timer'], function (eventifier, pollingFactory, timerFactory) { 'use strict';\n\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n pollingFactory = pollingFactory && Object.prototype.hasOwnProperty.call(pollingFactory, 'default') ? pollingFactory['default'] : pollingFactory;\n timerFactory = timerFactory && Object.prototype.hasOwnProperty.call(timerFactory, 'default') ? timerFactory['default'] : timerFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA\n *\n */\n var defaultOptions = {\n interval: 1000\n };\n /**\n * The stopwatch factory\n * @param {Object} options\n * @param {Number} [options.interval]\n * @returns {Object} stopwatch instance\n */\n\n function stopwatchFactory() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var config = Object.assign({}, defaultOptions, options);\n var initialized = false;\n var polling;\n var stopwatch;\n return eventifier({\n /**\n * Is this instance initialized\n * @returns {Boolean}\n */\n isInitialized: function isInitialized() {\n return initialized;\n },\n\n /**\n * Initialize stopwatch\n */\n init: function init() {\n var _this = this;\n\n stopwatch = timerFactory({\n autoStart: false\n });\n /**\n * @fires tick - every time when interval is elapsed\n */\n\n polling = pollingFactory({\n action: function action() {\n return _this.trigger('tick', stopwatch.tick());\n },\n interval: config.interval,\n autoStart: false\n });\n initialized = true;\n },\n\n /**\n * Start stopwatch\n */\n start: function start() {\n if (this.isInitialized()) {\n stopwatch.resume();\n polling.start();\n }\n },\n\n /**\n * Stop stopwatch\n */\n stop: function stop() {\n if (this.isInitialized()) {\n stopwatch.pause();\n polling.stop();\n }\n },\n\n /**\n * Destory stopwatch by stoping the timer\n */\n destroy: function destroy() {\n if (this.isInitialized()) {\n initialized = false;\n polling.stop();\n polling = null;\n stopwatch.stop();\n stopwatch = null;\n }\n }\n });\n }\n\n return stopwatchFactory;\n\n});\n\n","define('taoQtiTest/runner/provider/qti',['jquery', 'lodash', 'i18n', 'core/cachedStore', 'taoTests/runner/areaBroker', 'taoTests/runner/proxy', 'taoTests/runner/probeOverseer', 'taoTests/runner/testStore', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/provider/toolStateBridge', 'taoQtiTest/runner/helpers/currentItem', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/ui/toolbox/toolbox', 'taoQtiItem/runner/qtiItemRunner', 'taoQtiTest/runner/config/assetManager', 'handlebars', 'taoQtiTest/runner/config/states', 'taoQtiTest/runner/provider/stopwatch'], function ($$1, _, __, cachedStore, areaBrokerFactory, proxyFactory, probeOverseerFactory, testStoreFactory, dataUpdater, toolStateBridgeFactory, currentItemHelper, mapHelper, toolboxFactory, qtiItemRunner, getAssetManager, Handlebars, states, stopwatchFactory) { 'use strict';\n\n $$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n __ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;\n cachedStore = cachedStore && Object.prototype.hasOwnProperty.call(cachedStore, 'default') ? cachedStore['default'] : cachedStore;\n areaBrokerFactory = areaBrokerFactory && Object.prototype.hasOwnProperty.call(areaBrokerFactory, 'default') ? areaBrokerFactory['default'] : areaBrokerFactory;\n proxyFactory = proxyFactory && Object.prototype.hasOwnProperty.call(proxyFactory, 'default') ? proxyFactory['default'] : proxyFactory;\n probeOverseerFactory = probeOverseerFactory && Object.prototype.hasOwnProperty.call(probeOverseerFactory, 'default') ? probeOverseerFactory['default'] : probeOverseerFactory;\n testStoreFactory = testStoreFactory && Object.prototype.hasOwnProperty.call(testStoreFactory, 'default') ? testStoreFactory['default'] : testStoreFactory;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n toolStateBridgeFactory = toolStateBridgeFactory && Object.prototype.hasOwnProperty.call(toolStateBridgeFactory, 'default') ? toolStateBridgeFactory['default'] : toolStateBridgeFactory;\n currentItemHelper = currentItemHelper && Object.prototype.hasOwnProperty.call(currentItemHelper, 'default') ? currentItemHelper['default'] : currentItemHelper;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n toolboxFactory = toolboxFactory && Object.prototype.hasOwnProperty.call(toolboxFactory, 'default') ? toolboxFactory['default'] : toolboxFactory;\n qtiItemRunner = qtiItemRunner && Object.prototype.hasOwnProperty.call(qtiItemRunner, 'default') ? qtiItemRunner['default'] : qtiItemRunner;\n getAssetManager = getAssetManager && Object.prototype.hasOwnProperty.call(getAssetManager, 'default') ? getAssetManager['default'] : getAssetManager;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n stopwatchFactory = stopwatchFactory && Object.prototype.hasOwnProperty.call(stopwatchFactory, 'default') ? stopwatchFactory['default'] : stopwatchFactory;\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"<main aria-labelledby=\\\"test-title-header\\\" class=\\\"test-runner-scope\\\">\\n <div class=\\\"action-bar content-action-bar horizontal-action-bar top-action-bar\\\">\\n <div class=\\\"control-box size-wrapper\\\"></div>\\n </div>\\n\\n <div class=\\\"test-runner-sections\\\">\\n\\n <aside class=\\\"test-sidebar test-sidebar-left\\\" aria-labelledby=\\\"test-sidebar-left-header\\\">\\n <h2 id=\\\"test-sidebar-left-header\\\" class=\\\"landmark-title-hidden\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test status and review structure\", options) : helperMissing.call(depth0, \"__\", \"Test status and review structure\", options)))\n + \"</h2>\\n </aside>\\n\\n <section class=\\\"content-wrapper\\\" aria-labelledby=\\\"test-title-header\\\">\\n <h2 id=\\\"test-title-header\\\" class=\\\"landmark-title-hidden\\\"></h2>\\n <div id=\\\"qti-content\\\"></div>\\n </section>\\n </div>\\n\\n <div class=\\\"action-bar content-action-bar horizontal-action-bar bottom-action-bar\\\">\\n <div class=\\\"control-box size-wrapper\\\">\\n <aside class=\\\"lft tools-box\\\" aria-labelledby=\\\"toolboxheader\\\">\\n <h2 id=\\\"toolboxheader\\\" class=\\\"landmark-title-hidden\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Tool box and flagging for review\", options) : helperMissing.call(depth0, \"__\", \"Tool box and flagging for review\", options)))\n + \"</h2>\\n </aside>\\n <nav class=\\\"rgt navi-box\\\" aria-labelledby=\\\"navheader\\\">\\n <h2 id=\\\"navheader\\\" class=\\\"landmark-title-hidden\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Main navigation\", options) : helperMissing.call(depth0, \"__\", \"Main navigation\", options)))\n + \"</h2>\\n <ul class=\\\"plain navi-box-list\\\"></ul>\\n </div>\\n </div>\\n </div>\\n\\n</main>\\n\";\n return buffer;\n });\n function layoutTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\n /**\n * A Test runner provider to be registered against the runner\n */\n\n var qtiProvider = {\n //provider name\n name: 'qti',\n\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker: function loadAreaBroker() {\n var $layout = $$1(layoutTpl());\n return areaBrokerFactory($layout, {\n content: $$1('#qti-content', $layout),\n toolbox: $$1('.tools-box', $layout),\n navigation: $$1('.navi-box-list', $layout),\n mainLandmark: $$1('#test-title-header', $layout),\n control: $$1('.top-action-bar .control-box', $layout),\n actionsBar: $$1('.bottom-action-bar .control-box', $layout),\n panel: $$1('.test-sidebar-left', $layout),\n header: $$1('.title-box', $layout)\n });\n },\n\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy: function loadProxy() {\n var config = this.getConfig();\n var proxyProvider = config.provider.proxy || 'qtiServiceProxy';\n\n var proxyConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId', 'bootstrap', 'options']);\n\n return proxyFactory(proxyProvider, proxyConfig);\n },\n\n /**\n * Initialize and load the probe overseer\n * @returns {probeOverseer}\n */\n loadProbeOverseer: function loadProbeOverseer() {\n //the test run needs to be identified uniquely\n return probeOverseerFactory(this);\n },\n\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore: function loadTestStore() {\n var config = this.getConfig(); //the test run needs to be identified uniquely\n\n var identifier = config.serviceCallId || \"test-\".concat(Date.now());\n return testStoreFactory(identifier);\n },\n\n /**\n * Loads the persistent states storage\n *\n * @returns {Promise}\n */\n loadPersistentStates: function loadPersistentStates() {\n var self = this;\n var config = this.getConfig();\n var persistencePromise = cachedStore(\"test-states-\".concat(config.serviceCallId), 'states');\n persistencePromise.catch(function (err) {\n self.trigger('error', err);\n });\n return persistencePromise.then(function (storage) {\n self.stateStorage = storage;\n });\n },\n\n /**\n * Checks a runner persistent state\n *\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n */\n getPersistentState: function getPersistentState(name) {\n if (this.stateStorage) {\n return this.stateStorage.getItem(name);\n }\n },\n\n /**\n * Defines a runner persistent state\n *\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {Promise} Returns a promise that:\n * - will be resolved once the state is fully stored\n * - will be rejected if any error occurs or if the state name is not a valid string\n */\n setPersistentState: function setPersistentState(name, active) {\n var self = this;\n var setPromise;\n\n if (this.stateStorage) {\n setPromise = this.stateStorage.setItem(name, active);\n setPromise.catch(function (err) {\n self.trigger('error', err);\n });\n return setPromise;\n }\n },\n\n /**\n * Install step : install new methods/behavior\n *\n * @this {runner} the runner context, not the provider\n */\n install: function install() {\n /**\n * Delegates the update of testMap, testContext and testData\n * to a 3rd part component, the dataUpdater.\n */\n this.dataUpdater = dataUpdater(this.getDataHolder());\n /**\n * The tool state bridge manages the state of the tools (plugins)\n * it updated directly the store of the plugins when configured to resume their values\n */\n\n this.toolStateBridge = toolStateBridgeFactory(this.getTestStore(), _.keys(this.getPlugins()));\n /**\n * Convenience function to load the current item from the testMap\n * @returns {Object?} the current item if any or falsy\n */\n\n this.getCurrentItem = function getCurrentItem() {\n var testContext = this.getTestContext();\n var testMap = this.getTestMap();\n\n if (testContext && testMap && testContext.itemIdentifier) {\n return mapHelper.getItem(testMap, testContext.itemIdentifier);\n }\n };\n /**\n * Convenience function to load the current section from the testMap\n * @returns {Object?} the current section if any or falsy\n */\n\n\n this.getCurrentSection = function getCurrentSection() {\n var testContext = this.getTestContext();\n var testMap = this.getTestMap();\n\n if (testContext && testMap && testContext.sectionId) {\n return mapHelper.getSection(testMap, testContext.sectionId);\n }\n };\n /**\n * Convenience function to load the current part from the testMap\n * @returns {Object?} the current part if any or falsy\n */\n\n\n this.getCurrentPart = function getCurrentPart() {\n var testContext = this.getTestContext();\n var testMap = this.getTestMap();\n\n if (testContext && testMap && testContext.testPartId) {\n return mapHelper.getPart(testMap, testContext.testPartId);\n }\n };\n },\n\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init: function init() {\n var self = this;\n var config = this.getConfig();\n var areaBroker = this.getAreaBroker();\n /**\n * Retrieve the item results\n * @returns {Object} the results\n */\n\n function getItemResults() {\n var results = {};\n var context = self.getTestContext();\n\n if (context && self.itemRunner && context.itemSessionState <= states.itemSession.interacting) {\n results = {\n itemResponse: self.itemRunner.getResponses(),\n itemState: self.itemRunner.getState()\n };\n }\n\n return results;\n }\n /**\n * Compute the next item for the given action\n * @param {String} action - item action like move/next, skip, etc.\n * @param {Object} [params] - the item action additional params\n * @param {Promise} [loadPromise] - wait this Promise to resolve before loading the item.\n */\n\n\n function computeNext(action, params, loadPromise) {\n var context = self.getTestContext();\n var currentItem = self.getCurrentItem(); //catch server errors\n\n var submitError = function submitError(err) {\n if (err && err.unrecoverable) {\n self.trigger('alert.error', __('An unrecoverable error occurred. Your test session will be paused.'));\n self.trigger('pause', {\n message: err.message\n });\n } else if (err.code === 200) {\n //some server errors are valid, so we don't fail (prevent empty responses)\n self.trigger('alert.submitError', err.message || __('An error occurred during results submission. Please retry.'), load);\n } else {\n self.trigger('error', err);\n }\n }; //if we have to display modal feedbacks, we submit the responses before the move\n\n\n var feedbackPromise = new Promise(function (resolve) {\n //@deprecated feedbacks from testContext\n if ((currentItem.hasFeedbacks || context.hasFeedbacks) && context.itemSessionState <= states.itemSession.interacting) {\n params = _.omit(params, ['itemState', 'itemResponse']);\n self.getProxy().submitItem(context.itemIdentifier, self.itemRunner.getState(), self.itemRunner.getResponses(), params).then(function (results) {\n if (results.itemSession) {\n currentItem.answered = results.itemSession.itemAnswered;\n\n if (results.displayFeedbacks === true && results.feedbacks) {\n self.itemRunner.renderFeedbacks(results.feedbacks, results.itemSession, function (queue) {\n self.trigger('modalFeedbacks', queue, resolve);\n });\n return;\n }\n }\n\n return resolve();\n }).catch(submitError);\n } else {\n if (action === 'skip') {\n currentItem.answered = false;\n } else {\n // when the test part is linear, the item is always answered as we cannot come back to it\n var testPart = self.getCurrentPart();\n var isLinear = testPart && testPart.isLinear;\n currentItem.answered = isLinear || currentItemHelper.isAnswered(self);\n }\n\n resolve();\n }\n });\n feedbackPromise.then(function () {\n return self.toolStateBridge.getStates();\n }).then(function (toolStates) {\n if (toolStates && _.size(toolStates) > 0) {\n params.toolStates = toolStates;\n } // ensure the answered state of the current item is correctly set and the stats are aligned\n\n\n self.setTestMap(self.dataUpdater.updateStats()); //to be sure load start after unload...\n //we add an intermediate ns event on unload\n\n self.on(\"unloaditem.\".concat(action), function () {\n self.off(\".\".concat(action));\n self.getProxy().callItemAction(context.itemIdentifier, action, params).then(function (results) {\n loadPromise = loadPromise || Promise.resolve();\n return loadPromise.then(function () {\n return results;\n });\n }).then(function (results) {\n //update testData, testContext and build testMap\n self.dataUpdater.update(results);\n load();\n }).catch(submitError);\n });\n self.unloadItem(context.itemIdentifier);\n }).catch(submitError);\n }\n /**\n * Load the next action: load the current item or call finish based the test state\n */\n\n\n function load() {\n var context = self.getTestContext();\n\n if (context.state <= states.testSession.interacting) {\n self.loadItem(context.itemIdentifier);\n } else if (context.state === states.testSession.closed) {\n self.finish();\n }\n }\n\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n var stopwatch = stopwatchFactory({});\n stopwatch.init();\n stopwatch.spread(this, 'tick');\n\n var isTimerClientMode = function isTimerClientMode() {\n return config.options.timer && config.options.timer.restoreTimerFromClient;\n };\n /*\n * Install behavior on events\n */\n\n\n this.on('ready', function () {\n //load the 1st item\n load();\n }).on('move', function (direction, scope, position) {\n // get the item results/state before disabling the tools\n // otherwise the state could be partially lost for tools that clean up when disabling\n var itemResults = getItemResults();\n this.trigger('disablenav disabletools');\n computeNext('move', _.merge(itemResults, {\n direction: direction,\n scope: scope || 'item',\n ref: position\n }));\n }).on('skip', function (scope) {\n this.trigger('disablenav disabletools');\n computeNext('skip', {\n scope: scope || 'item'\n });\n }).on('exit', function (reason) {\n var context = self.getTestContext();\n this.disableItem(context.itemIdentifier);\n this.getProxy().callTestAction('exitTest', _.merge(getItemResults(), {\n itemDefinition: context.itemIdentifier,\n reason: reason\n })).then(function () {\n return self.finish();\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }).on('timeout', function (scope, ref, timer) {\n var context = self.getTestContext();\n var noAlertTimeout = mapHelper.hasItemCategory(self.getTestMap(), context.itemIdentifier, 'noAlertTimeout', true);\n context.isTimeout = true;\n this.setTestContext(context);\n\n if (timer && timer.allowLateSubmission) {\n self.trigger('alert.timeout', __('Time limit reached, this part of the test has ended. However you are allowed to finish the current item.'));\n self.before('move.latetimeout', function () {\n self.off('move.latetimeout');\n computeNext('timeout', _.merge(getItemResults(), {\n scope: scope,\n ref: ref,\n late: true\n }));\n return Promise.reject({\n cancel: true\n });\n });\n } else {\n this.disableItem(context.itemIdentifier);\n computeNext('timeout', _.merge(getItemResults(), {\n scope: scope,\n ref: ref\n }), new Promise(function (resolve) {\n if (noAlertTimeout) {\n resolve();\n } else {\n self.trigger('alert.timeout', __('The time limit has been reached for this part of the test.'), function () {\n self.trigger('timeoutAccepted');\n resolve();\n });\n }\n }));\n }\n }).on('pause', function (data) {\n var testContext = self.getTestContext();\n this.setState('closedOrSuspended', true);\n this.getProxy().callTestAction('pause', {\n itemDefinition: testContext.itemIdentifier,\n itemState: self.itemRunner.getState(),\n reason: {\n reasons: data && data.reasons,\n comment: data && (data.originalMessage || data.message)\n }\n }).then(function () {\n self.trigger('leave', {\n code: states.testSession.suspended,\n message: data && data.message\n });\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }).on('move skip exit timeout pause', function () {\n stopwatch.stop();\n }).on('loaditem', function () {\n var context = this.getTestContext();\n var warning = false;\n /**\n * Get the label of the current item\n * @returns {String} the label (fallback to the item identifier);\n */\n\n var getItemLabel = function getItemLabel() {\n var item = self.getCurrentItem();\n return item && item.label ? item.label : context.itemIdentifier;\n }; //The item is rendered but in a state that prevents us from interacting\n\n\n if (context.isTimeout) {\n warning = __('Time limit reached for item \"%s\".', getItemLabel());\n } else if (context.itemSessionState > states.itemSession.interacting) {\n if (context.remainingAttempts === 0) {\n warning = __('No more attempts allowed for item \"%s\".', getItemLabel());\n } else {\n warning = __('Item \"%s\" is completed.', getItemLabel());\n }\n } //we disable the item and warn the user\n\n\n if (warning) {\n self.disableItem(context.itemIdentifier);\n self.trigger('warning', warning);\n }\n }).on('renderitem', function () {\n var context = this.getTestContext();\n\n if (!this.getItemState(context.itemIdentifier, 'disabled')) {\n this.trigger('enabletools');\n }\n\n this.trigger('enablenav');\n }).after('renderitem', function () {\n stopwatch.start();\n }).on('resumeitem', function () {\n this.trigger('enableitem enablenav');\n }).on('disableitem', function () {\n if (isTimerClientMode()) {\n stopwatch.stop();\n }\n\n this.trigger('disabletools');\n }).on('enableitem', function () {\n if (isTimerClientMode()) {\n stopwatch.start();\n }\n\n this.trigger('enabletools');\n }).on('error', function () {\n stopwatch.stop();\n this.trigger('disabletools enablenav');\n }).on('finish', function () {\n this.flush();\n }).on('leave', function () {\n this.trigger('endsession');\n this.flush();\n }).on('flush', function () {\n this.destroy();\n stopwatch.destroy();\n }); //starts the event collection\n\n if (this.getProbeOverseer()) {\n this.getProbeOverseer().start();\n } //get the current store identifier to send it along with the init call\n\n\n return this.getTestStore().getStorageIdentifier().then(function (storeId) {\n //load data and current context in parallel at initialization\n return self.getProxy().init({\n storeId: storeId\n }).then(function (response) {\n //handle backward compatibility with testData\n if (response.testData) {\n Object.assign(config.options, response.testData.config);\n } //fill the dataHolder, build the jump table, etc.\n\n\n self.dataUpdater.update(response); //set the plugin config\n\n self.dataUpdater.updatePluginsConfig(self.getPlugins(), self.getPluginsConfig()); //this checks the received storeId and clear the volatiles stores\n\n return self.getTestStore().clearVolatileIfStoreChange(response.lastStoreId).then(function () {\n return response;\n });\n }).then(function (response) {\n var isNewStore = !response.lastStoreId || response.lastStoreId !== storeId;\n\n if (response.toolStates && isNewStore) {\n return self.toolStateBridge.setTools(_.keys(response.toolStates)).restoreStates(response.toolStates);\n }\n });\n });\n },\n\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render: function render() {\n var config = this.getConfig();\n var areaBroker = this.getAreaBroker();\n config.renderTo.append(areaBroker.getContainer());\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem: function loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier).then(function (_ref) {\n var itemData = _ref.itemData,\n baseUrl = _ref.baseUrl,\n itemState = _ref.itemState,\n portableElements = _ref.portableElements,\n flags = _ref.flags;\n return {\n content: itemData,\n baseUrl: baseUrl,\n state: itemState,\n portableElements: portableElements,\n flags: flags\n };\n });\n },\n\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem: function renderItem(itemIdentifier, itemData) {\n var self = this;\n var config = this.getConfig();\n var assetManager = getAssetManager(config.serviceCallId);\n\n var changeState = function changeState() {\n self.setItemState(itemIdentifier, 'changed', true);\n };\n\n return new Promise(function (resolve, reject) {\n assetManager.setData('baseUrl', itemData.baseUrl);\n assetManager.setData('itemIdentifier', itemIdentifier);\n assetManager.setData('assets', itemData.content.assets);\n itemData.content = itemData.content || {};\n self.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, {\n assetManager: assetManager\n }).on('error', function (err) {\n if (err && err.unrecoverable) {\n self.trigger('pause', {\n message: err.message\n });\n } else {\n self.trigger('enablenav');\n reject(err);\n }\n }).on('init', function () {\n var itemContainer = self.getAreaBroker().getContentArea();\n\n var itemRenderingOptions = _.pick(itemData, ['state', 'portableElements']);\n\n this.render(itemContainer, itemRenderingOptions);\n }).on('render', function () {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n }).on('warning', function (err) {\n self.trigger('warning', err);\n }).init();\n });\n },\n\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem: function unloadItem() {\n var self = this;\n self.trigger('beforeunloaditem disablenav disabletools');\n return new Promise(function (resolve) {\n if (self.itemRunner) {\n self.itemRunner.on('clear', resolve).clear();\n return;\n }\n\n resolve();\n });\n },\n\n /**\n * Finish phase of the test runner\n *\n * Calls proxy.finish to close the test\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} proxy.finish\n */\n finish: function finish() {\n if (!this.getState('finish')) {\n this.trigger('disablenav disabletools');\n\n if (this.stateStorage) {\n return this.stateStorage.removeStore();\n }\n }\n },\n\n /**\n * Flushes the test variables before leaving the runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise}\n */\n flush: function flush() {\n var self = this;\n var probeOverseer = this.getProbeOverseer();\n var proxy = this.getProxy();\n var flushPromise; //if there is trace data collected by the probes\n\n if (probeOverseer && !this.getState('disconnected')) {\n flushPromise = probeOverseer.flush().then(function (data) {\n var traceData = {}; //we reformat the time set into a trace variables\n\n if (data && data.length) {\n _.forEach(data, function (entry) {\n var id = \"\".concat(entry.type, \"-\").concat(entry.id);\n\n if (entry.marker) {\n id = \"\".concat(entry.marker, \"-\").concat(id);\n }\n\n traceData[id] = entry;\n }); //and send them\n\n\n return self.getProxy().sendVariables(traceData);\n }\n }).then(function () {\n probeOverseer.stop();\n }).catch(function () {\n probeOverseer.stop();\n });\n } else {\n flushPromise = Promise.resolve();\n }\n\n return flushPromise.then(function () {\n // safely stop the communicator to prevent inconsistent communication while leaving\n if (proxy.hasCommunicator()) {\n proxy.getCommunicator().then(function (communicator) {\n return communicator.close();\n }) // Silently catch the potential errors to avoid polluting the console.\n // The code above is present to close an already open communicator in order to avoid later\n // communication while the test is destroying. So if any error occurs here it is not very important,\n // the most time it will be a missing communicator error, due to disabled config.\n .catch(_.noop);\n }\n });\n },\n\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns void\n */\n destroy: function destroy() {\n var areaBroker = this.getAreaBroker(); // prevent the item to be displayed while test runner is destroying\n\n if (this.itemRunner) {\n this.itemRunner.clear();\n }\n\n this.itemRunner = null;\n\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\n } //we remove the store(s) only if the finish step was reached\n\n\n if (this.getState('finish')) {\n return this.getTestStore().remove();\n }\n }\n };\n\n return qtiProvider;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/actionStore',['lodash', 'taoTests/runner/testStore'], function (_, testStore) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n testStore = testStore && Object.prototype.hasOwnProperty.call(testStore, 'default') ? testStore['default'] : testStore;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 Open Assessment Technologies SA\n */\n var storeName = 'actions';\n var storeKey = 'queue';\n /**\n * Create an action store\n *\n * @param {String} id - the store id, to identify a test\n * @returns {actionStore}\n */\n\n function actionStoreFatory(id) {\n var actionQueue = [];\n /**\n * Load the store from the testStore\n * @returns {Promise<storage>} the storage instance\n */\n\n var loadStore = function loadStore() {\n return testStore(id).getStore(storeName);\n };\n\n if (_.isEmpty(id)) {\n throw new TypeError('Please specify the action store id');\n }\n /**\n * @typedef {actionStore}\n */\n\n\n return {\n /**\n * Push an action to the store\n * @param {String} action - the action name\n * @param {Object} params - the action parameters\n * @returns {Promise} resolves when the action is stored\n */\n push: function push(action, params, timestamp) {\n actionQueue.push({\n action: action,\n timestamp: timestamp || Date.now(),\n parameters: params\n });\n return loadStore().then(function (actionStore) {\n return actionStore.setItem(storeKey, actionQueue);\n });\n },\n\n /**\n * Flush the action store and retrieve the data\n * @returns {Promise} resolves with the flushed data\n */\n flush: function flush() {\n return loadStore().then(function (actionStore) {\n return actionStore.getItem(storeKey).then(function (queue) {\n actionQueue = [];\n return actionStore.setItem(storeKey, actionQueue).then(function () {\n return queue;\n });\n });\n });\n },\n\n /**\n * Update action parameters. Action to update will be defined by params.actionId parameter value.\n * @param {Object} params - the action parameters\n * @returns {Promise} resolves when the action is stored\n */\n update: function update(params) {\n _.forEach(actionQueue, function (action) {\n if (action.parameters.actionId === params.actionId) {\n action.parameters = params;\n }\n });\n\n return loadStore().then(function (actionStore) {\n return actionStore.setItem(storeKey, actionQueue);\n });\n }\n };\n }\n\n return actionStoreFatory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/audio',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n /**\n * (Pre)load audio content.\n *\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\n\n var audio = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'audio',\n\n /**\n * Manages the preloading of audio files\n * @param assetManager - A reference to the assetManager\n * @returns {assetPreloader}\n */\n init: function init(assetManager) {\n //keep references to preloaded audio blobs\n var audioBlobs = {}; //prepend a strategy to resolves cached assets\n\n assetManager.prependStrategy({\n name: 'precaching-audio',\n handle: function handle(url, data) {\n var sourceUrl = url.toString(); //resolves precached audio files\n\n if (data.itemIdentifier && audioBlobs[data.itemIdentifier] && 'undefined' !== typeof audioBlobs[data.itemIdentifier][sourceUrl]) {\n //creates an internal URL to link the audio blob\n return URL.createObjectURL(audioBlobs[data.itemIdentifier][sourceUrl]);\n }\n }\n });\n return {\n /**\n * Tells whether an audio file was preloaded or not\n * @param {string} url - the url of the audio file to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded: function loaded(url, sourceUrl, itemIdentifier) {\n return !!(audioBlobs[itemIdentifier] && audioBlobs[itemIdentifier][sourceUrl]);\n },\n\n /**\n * Preloads audio files : save the blobs for later use in the asset manager\n * @param {string} url - the url of the audio file to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load: function load(url, sourceUrl, itemIdentifier) {\n return new Promise(function (resolve) {\n audioBlobs[itemIdentifier] = audioBlobs[itemIdentifier] || {};\n\n if ('undefined' === typeof audioBlobs[itemIdentifier][sourceUrl]) {\n //direct XHR to benefit from the \"blob\" response type\n var request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.responseType = 'blob';\n request.onerror = resolve;\n request.onabort = resolve;\n\n request.onload = function () {\n if (request.status === 200) {\n //save the blob, directly\n audioBlobs[itemIdentifier][sourceUrl] = request.response;\n }\n\n resolve();\n }; //ignore failed requests, best effort only\n\n\n request.send();\n } else {\n resolve();\n }\n });\n },\n\n /**\n * Removes loaded audio files\n * @param {string} url - the url of the audio file to unload\n * @param {string} sourceUrl - the unresolved URL\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload: function unload(url, sourceUrl, itemIdentifier) {\n if (audioBlobs[itemIdentifier]) {\n audioBlobs[itemIdentifier] = _.omit(audioBlobs[itemIdentifier], sourceUrl);\n }\n\n return Promise.resolve();\n }\n };\n }\n };\n\n return audio;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/image',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n /**\n * (Pre)load images.\n *\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\n\n var image = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'img',\n\n /**\n * Manages the preloading of images\n * @returns {assetPreloader}\n */\n init: function init() {\n //keep references to preloaded images attached\n //in order to prevent garbage collection of cached images\n var images = {};\n return {\n /**\n * Tells whether an image was preloaded or not\n * @param {string} url - the url of the image to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded: function loaded(url, sourceUrl, itemIdentifier) {\n return !!(images[itemIdentifier] && images[itemIdentifier][sourceUrl]);\n },\n\n /**\n * Preloads an image, using the in memory Image object\n * @param {string} url - the url of the image to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load: function load(url, sourceUrl, itemIdentifier) {\n images[itemIdentifier] = images[itemIdentifier] || {};\n\n if ('Image' in window && !images[itemIdentifier][sourceUrl]) {\n images[itemIdentifier][sourceUrl] = new Image();\n images[itemIdentifier][sourceUrl].src = url;\n }\n\n return Promise.resolve();\n },\n\n /**\n * Removes images ref so they can be garbage collected\n * @param {string} url - the url of the image to unload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload: function unload(url, sourceUrl, itemIdentifier) {\n if (images[itemIdentifier]) {\n images[itemIdentifier] = _.omit(images[itemIdentifier], sourceUrl);\n }\n\n return Promise.resolve();\n }\n };\n }\n };\n\n return image;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet',['lodash'], function (_) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n /**\n * Test the support of possible `<link rel>` values.\n * @param {string} feature - the value to test\n * @returns {boolean}\n * @private\n */\n\n var relSupport = function relSupport(feature) {\n var fakeLink = document.createElement('link');\n\n try {\n if (fakeLink.relList && 'function' === typeof fakeLink.relList.supports) {\n return fakeLink.relList.supports(feature);\n }\n } catch (err) {\n return false;\n }\n };\n /**\n * Does the current env supports `<link ref=\"preload\">`\n * @type {boolean}\n * @private\n */\n\n\n var supportPreload = relSupport('preload');\n /**\n * Does the current env supports `<link ref=\"prefetch\">`\n * @type {boolean}\n * @private\n */\n\n var supportPrefetch = relSupport('prefetch');\n /**\n * (Pre)load stylesheets.\n *\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\n\n var stylesheet = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'css',\n\n /**\n * Manages the preloading of stylesheets\n * @returns {assetPreloader}\n */\n init: function init() {\n //keep references to preloaded CSS files\n var stylesheets = {};\n return {\n /**\n * Tells whether a stylesheet was preloaded or not\n * @param {string} url - the url of the stylesheet to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {boolean}\n */\n loaded: function loaded(url, sourceUrl, itemIdentifier) {\n return !!(stylesheets[itemIdentifier] && stylesheets[itemIdentifier][sourceUrl]);\n },\n\n /**\n * Preloads a stylesheet\n * @param {string} url - the url of the stylesheet to preload\n * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n load: function load(url, sourceUrl, itemIdentifier) {\n stylesheets[itemIdentifier] = stylesheets[itemIdentifier] || {};\n\n if (!stylesheets[itemIdentifier][sourceUrl]) {\n var link = document.createElement('link');\n\n if (supportPreload) {\n link.setAttribute('rel', 'preload');\n link.setAttribute('as', 'style');\n } else if (supportPrefetch) {\n link.setAttribute('rel', 'prefetch');\n link.setAttribute('as', 'style');\n } else {\n link.disabled = true;\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('type', 'text/css');\n }\n\n link.setAttribute('data-preload', true);\n link.setAttribute('href', url);\n document.querySelector('head').appendChild(link);\n stylesheets[itemIdentifier][sourceUrl] = link;\n }\n\n return Promise.resolve();\n },\n\n /**\n * Removes the prefetched stylesheet\n * @param {string} url - the url of the stylesheet to unload\n * * @param {string} sourceUrl - the unresolved URL (used to index)\n * @param {string} itemIdentifier - the id of the item the asset belongs to\n * @returns {Promise}\n */\n unload: function unload(url, sourceUrl, itemIdentifier) {\n if (stylesheets[itemIdentifier]) {\n var link = stylesheets[itemIdentifier][sourceUrl] || document.querySelector(\"head link[data-preload][href=\\\"\".concat(url, \"\\\"]\"));\n\n if (link) {\n document.querySelector('head').removeChild(link);\n }\n\n stylesheets[itemIdentifier] = _.omit(stylesheets[itemIdentifier], sourceUrl);\n }\n\n return Promise.resolve();\n }\n };\n }\n };\n\n return stylesheet;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders',['taoQtiTest/runner/proxy/cache/preloaders/assets/audio', 'taoQtiTest/runner/proxy/cache/preloaders/assets/image', 'taoQtiTest/runner/proxy/cache/preloaders/assets/stylesheet'], function (audioPreloader, imagePreloader, stylesheetPreloader) { 'use strict';\n\n\taudioPreloader = audioPreloader && Object.prototype.hasOwnProperty.call(audioPreloader, 'default') ? audioPreloader['default'] : audioPreloader;\n\timagePreloader = imagePreloader && Object.prototype.hasOwnProperty.call(imagePreloader, 'default') ? imagePreloader['default'] : imagePreloader;\n\tstylesheetPreloader = stylesheetPreloader && Object.prototype.hasOwnProperty.call(stylesheetPreloader, 'default') ? stylesheetPreloader['default'] : stylesheetPreloader;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\t/**\n\t * The list of asset loader factories\n\t * @type {Function[]}\n\t */\n\n\tvar preloaders = [audioPreloader, imagePreloader, stylesheetPreloader];\n\n\treturn preloaders;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaderManager',['core/providerRegistry'], function (providerRegistry) { 'use strict';\n\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2021 Open Assessment Technologies SA\n */\n /**\n * @typedef {object} preloaderManager\n * @property {Function} has - Tells whether an asset is loaded or not\n * @property {preloaderManagerAction} loaded - Tells whether an asset is loaded or not\n * @property {preloaderManagerAction} load - Preload an asset\n * @property {preloaderManagerAction} unload - Unload an asset\n */\n\n /**\n * @callback preloaderManagerAction\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {any}\n */\n\n /**\n * Creates a preloader manager.\n * @return {Function}\n */\n\n function preloaderManagerFactory() {\n /**\n * Manages the preloading of assets\n * @param assetManager - A reference to the assetManager\n * @return {preloaderManager}\n */\n function preloaderFactory(assetManager) {\n var preloaders = {};\n preloaderFactory.getAvailableProviders().forEach(function (name) {\n preloaders[name] = preloaderFactory.getProvider(name).init(assetManager);\n });\n /**\n * @typedef preloaderManager\n */\n\n return {\n /**\n * Checks whether or not an asset preloader exists for a particular type\n * @param {string} name\n * @returns {boolean}\n */\n has: function has(name) {\n return !!preloaders[name];\n },\n\n /**\n * Tells whether an asset was preloaded or not\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {boolean}\n */\n loaded: function loaded(name) {\n var preloader = preloaders[name];\n\n if (preloader && 'function' === typeof preloader.loaded) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return !!preloader.loaded.apply(preloader, args);\n }\n\n return false;\n },\n\n /**\n * Preloads an asset with respect to it type\n * @param {string} name - The type of asset to preload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {Promise}\n */\n load: function load(name) {\n var preloader = preloaders[name];\n\n if (preloader && 'function' === typeof preloader.load) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return Promise.resolve(preloader.load.apply(preloader, args));\n }\n\n return Promise.resolve();\n },\n\n /**\n * Unloads an asset with respect to it type\n * @param {string} name - The type of asset to unload\n * @param {...any} args - The list of args related to the preloader.\n * @returns {Promise}\n */\n unload: function unload(name) {\n var preloader = preloaders[name];\n\n if (preloader && 'function' === typeof preloader.unload) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return Promise.resolve(preloader.unload.apply(preloader, args));\n }\n\n return Promise.resolve();\n }\n };\n }\n\n return providerRegistry(preloaderFactory);\n }\n\n return preloaderManagerFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/assetPreloader',['taoQtiTest/runner/proxy/cache/preloaders/assets/preloaders', 'taoQtiTest/runner/proxy/cache/preloaderManager'], function (preloaders, preloaderManagerFactory) { 'use strict';\n\n\tpreloaders = preloaders && Object.prototype.hasOwnProperty.call(preloaders, 'default') ? preloaders['default'] : preloaders;\n\tpreloaderManagerFactory = preloaderManagerFactory && Object.prototype.hasOwnProperty.call(preloaderManagerFactory, 'default') ? preloaderManagerFactory['default'] : preloaderManagerFactory;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\t/**\n\t * @callback assetPreloaderManagerAction\n\t * @param {string} type - The type of asset to preload\n\t * @param {string} url - the url of the asset to load/unload\n\t * @param {string} [sourceUrl] - the unresolved URL (used to index)\n\t * @param {string} [itemIdentifier] - the id of the item the asset belongs to\n\t */\n\n\t/**\n\t * @callback assetPreloaderAction\n\t * @param {string} url - the url of the asset to load/unload\n\t * @param {string} [sourceUrl] - the unresolved URL (used to index)\n\t * @param {string} [itemIdentifier] - the id of the item the asset belongs to\n\t */\n\n\t/**\n\t * @typedef {object} assetPreloaderManager\n\t * @property {string} name - The name of the preloader\n\t * @property {assetPreloaderManagerAction} loaded - Tells whether an asset is loaded or not\n\t * @property {assetPreloaderManagerAction} load - Preload an asset\n\t * @property {assetPreloaderManagerAction} unload - Unload an asset\n\t */\n\n\t/**\n\t * @typedef {object} assetPreloader\n\t * @property {string} name - The name of the preloader\n\t * @property {assetPreloaderAction} loaded - Tells whether an asset is loaded or not\n\t * @property {assetPreloaderAction} load - Preload an asset\n\t * @property {assetPreloaderAction} unload - Unload an asset\n\t */\n\n\t/**\n\t * Manages the preloading of assets\n\t * @function assetPreloaderFactory\n\t * @param assetManager - A reference to the assetManager\n\t * @return {assetPreloaderManager}\n\t */\n\n\tvar assetPreloaderFactory = preloaderManagerFactory();\n\tpreloaders.forEach(function (preloader) {\n\t return assetPreloaderFactory.registerProvider(preloader.name, preloader);\n\t});\n\n\treturn assetPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText',['ckeditor', 'taoQtiItem/qtiCommonRenderer/helpers/ckConfigurator'], function (ckEditor, ckConfigurator) { 'use strict';\n\n ckEditor = ckEditor && Object.prototype.hasOwnProperty.call(ckEditor, 'default') ? ckEditor['default'] : ckEditor;\n ckConfigurator = ckConfigurator && Object.prototype.hasOwnProperty.call(ckConfigurator, 'default') ? ckConfigurator['default'] : ckConfigurator;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2021 Open Assessment Technologies SA\n */\n /**\n * Preloads CKEditor runtimes for a particular language\n * @param {string} language\n * @returns {Promise}\n */\n\n function preloadCKEditor(language) {\n return new Promise(function (resolve) {\n var placeholder = document.createElement('div');\n var ckOptions = {\n resize_enabled: true,\n secure: location.protocol === 'https:',\n forceCustomDomain: true,\n language: language\n };\n var editor = ckEditor.inline(placeholder, ckOptions);\n editor.on('instanceReady', function () {\n resolve(editor);\n });\n editor.on('configLoaded', function () {\n editor.config = ckConfigurator.getConfig(editor, 'extendedText', ckOptions);\n });\n\n if (editor.status === 'ready' || editor.status === 'loaded') {\n resolve(editor);\n }\n }).then(function (editor) {\n editor.destroy();\n });\n }\n /**\n * The default item language\n * @type {string}\n * @private\n */\n\n\n var defaultLang = 'en';\n /**\n * Gets the item's language\n * @param {object} itemData - The item data\n * @returns {string}\n * @private\n */\n\n var getItemLanguage = function getItemLanguage(itemData) {\n var lang = itemData && itemData.data && itemData.data.attributes && itemData.data.attributes['xml:lang'];\n\n if (!lang) {\n lang = window.document.documentElement.getAttribute('lang');\n }\n\n return lang && lang.split('-')[0] || defaultLang;\n };\n /**\n * Preloads the runtimes for an extendedText interaction\n */\n\n\n var extendedText = {\n /**\n * The name of the preloader\n * @type {string}\n */\n name: 'extendedTextInteraction',\n\n /**\n * Manages the preloading of the extendedText interaction runtimes\n * @returns {interactionPreloader}\n */\n init: function init() {\n var preloadedLanguages = {};\n return {\n /**\n * Tells whether the runtimes has been preloaded or not\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {boolean}\n */\n loaded: function loaded(interaction, itemData, itemIdentifier) {\n if (interaction.attributes && interaction.attributes.format === 'xhtml') {\n var lang = getItemLanguage(itemData);\n return preloadedLanguages[lang];\n }\n\n return true;\n },\n\n /**\n * Preloads runtimes for an extendedText interaction\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {Promise}\n */\n load: function load(interaction, itemData, itemIdentifier) {\n if (interaction.attributes && interaction.attributes.format === 'xhtml') {\n var lang = getItemLanguage(itemData);\n\n if (!preloadedLanguages[lang]) {\n preloadedLanguages[lang] = true;\n return preloadCKEditor(lang);\n }\n }\n\n return Promise.resolve();\n },\n\n /**\n * Unloads runtimes for an extendedText interaction\n * @param {object} interaction - The interaction\n * @param {object} itemData - The item data\n * @param {string} itemIdentifier - the id of the item the interaction belongs to\n * @returns {Promise}\n */\n unload: function unload(interaction, itemData, itemIdentifier) {\n // nothing to do actually\n return Promise.resolve();\n }\n };\n }\n };\n\n return extendedText;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders',['taoQtiTest/runner/proxy/cache/preloaders/interactions/extendedText'], function (extendedTextPreloader) { 'use strict';\n\n\textendedTextPreloader = extendedTextPreloader && Object.prototype.hasOwnProperty.call(extendedTextPreloader, 'default') ? extendedTextPreloader['default'] : extendedTextPreloader;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\t/**\n\t * The list of asset loader factories\n\t * @type {Function[]}\n\t */\n\n\tvar preloaders = [extendedTextPreloader];\n\n\treturn preloaders;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/interactionPreloader',['taoQtiTest/runner/proxy/cache/preloaders/interactions/preloaders', 'taoQtiTest/runner/proxy/cache/preloaderManager'], function (preloaders, preloaderManagerFactory) { 'use strict';\n\n\tpreloaders = preloaders && Object.prototype.hasOwnProperty.call(preloaders, 'default') ? preloaders['default'] : preloaders;\n\tpreloaderManagerFactory = preloaderManagerFactory && Object.prototype.hasOwnProperty.call(preloaderManagerFactory, 'default') ? preloaderManagerFactory['default'] : preloaderManagerFactory;\n\n\t/*\n\t * This program is free software; you can redistribute it and/or\n\t * modify it under the terms of the GNU General Public License\n\t * as published by the Free Software Foundation; under version 2\n\t * of the License (non-upgradable).\n\t *\n\t * This program is distributed in the hope that it will be useful,\n\t * but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t * GNU General Public License for more details.\n\t *\n\t * You should have received a copy of the GNU General Public License\n\t * along with this program; if not, write to the Free Software\n\t * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\t *\n\t * Copyright (c) 2021 Open Assessment Technologies SA\n\t */\n\t/**\n\t * @callback interactionPreloaderManagerAction\n\t * @param {string} type - The type of asset to preload\n\t * @param {object} interaction - The interaction\n\t * @param {object} itemData - The item data\n\t * @param {string} itemIdentifier - the id of the item the interaction belongs to\n\t */\n\n\t/**\n\t * @callback interactionPreloaderAction\n\t * @param {object} interaction - The interaction\n\t * @param {object} itemData - The item data\n\t * @param {string} itemIdentifier - the id of the item the interaction belongs to\n\t */\n\n\t/**\n\t * @typedef {object} interactionPreloaderManager\n\t * @property {string} name - The name of the preloader\n\t * @property {interactionPreloaderManagerAction} loaded - Tells whether an interaction is loaded or not\n\t * @property {interactionPreloaderManagerAction} load - Preload an interaction\n\t * @property {interactionPreloaderManagerAction} unload - Unload an interaction\n\t */\n\n\t/**\n\t * @typedef {object} interactionPreloader\n\t * @property {string} name - The name of the preloader\n\t * @property {interactionPreloaderAction} loaded - Tells whether an interaction is loaded or not\n\t * @property {interactionPreloaderAction} load - Preload an interaction\n\t * @property {interactionPreloaderAction} unload - Unload an interaction\n\t */\n\n\t/**\n\t * Manages the preloading of assets\n\t * @function assetPreloaderFactory\n\t * @param assetManager - A reference to the assetManager\n\t * @return {assetPreloaderManager}\n\t */\n\n\tvar interactionPreloaderFactory = preloaderManagerFactory();\n\tpreloaders.forEach(function (preloader) {\n\t return interactionPreloaderFactory.registerProvider(preloader.name, preloader);\n\t});\n\n\treturn interactionPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/itemPreloader',['lodash', 'core/logger', 'taoQtiItem/runner/qtiItemRunner', 'taoQtiTest/runner/config/assetManager', 'taoQtiTest/runner/proxy/cache/assetPreloader', 'taoQtiTest/runner/proxy/cache/interactionPreloader', 'util/url'], function (_, loggerFactory, qtiItemRunner, getAssetManager, assetPreloaderFactory, interactionPreloaderFactory, urlUtil) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n qtiItemRunner = qtiItemRunner && Object.prototype.hasOwnProperty.call(qtiItemRunner, 'default') ? qtiItemRunner['default'] : qtiItemRunner;\n getAssetManager = getAssetManager && Object.prototype.hasOwnProperty.call(getAssetManager, 'default') ? getAssetManager['default'] : getAssetManager;\n assetPreloaderFactory = assetPreloaderFactory && Object.prototype.hasOwnProperty.call(assetPreloaderFactory, 'default') ? assetPreloaderFactory['default'] : assetPreloaderFactory;\n interactionPreloaderFactory = interactionPreloaderFactory && Object.prototype.hasOwnProperty.call(interactionPreloaderFactory, 'default') ? interactionPreloaderFactory['default'] : interactionPreloaderFactory;\n urlUtil = urlUtil && Object.prototype.hasOwnProperty.call(urlUtil, 'default') ? urlUtil['default'] : urlUtil;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 Open Assessment Technologies SA\n */\n /**\n * @type {logger}\n * @private\n */\n\n var logger = loggerFactory('taoQtiTest/runner/proxy/cache/itemPreloader');\n /**\n * Check if the given item object matches the expectations\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {boolean}\n * @private\n */\n\n var isItemObjectValid = function isItemObjectValid(item) {\n return _.isPlainObject(item) && _.isString(item.baseUrl) && _.isString(item.itemIdentifier) && !_.isEmpty(item.itemIdentifier) && _.isPlainObject(item.itemData);\n };\n /**\n * Sets a flag onto an item\n * @param {object} item - The item to flag\n * @param {string} flag - The flag name to set\n */\n\n\n var setItemFlag = function setItemFlag(item, flag) {\n item.flags = item.flags || {};\n item.flags[flag] = true;\n };\n /**\n * Extracts the list of interactions from the item\n * @param {object} itemData\n * @returns {object[]}\n */\n\n\n var getItemInteractions = function getItemInteractions(itemData) {\n var interactions = [];\n\n if (itemData.data && itemData.data.body && itemData.data.body.elements) {\n _.forEach(itemData.data.body.elements, function (elements) {\n return interactions.push(elements);\n });\n }\n\n return interactions;\n };\n /**\n * Create an instance of an item preloader\n * @param {object} options\n * @param {string} options.testId - the unique identifier of the test instance, required to get the asset manager\n * @returns {itemPreloader}\n * @throws {TypeError} if the testId is not defined\n */\n\n\n function itemPreloaderFactory(options) {\n //we also have a specific instance of the asset manager to\n //resolve assets of a next item (we can't use the test asset manager).\n var preloadAssetManager = getAssetManager('item-preloader');\n /**\n * Resolves assets URLS using the assetManager\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise<Object>} assets with URLs resolved\n * @private\n */\n\n var resolveAssets = function resolveAssets(item) {\n return new Promise(function (resolve) {\n var assets = item.itemData.assets;\n preloadAssetManager.setData('baseUrl', item.baseUrl);\n preloadAssetManager.setData('assets', assets);\n return resolve(_.reduce(assets, function (acc, assetList, type) {\n var resolved = {};\n\n _.forEach(assetList, function (url) {\n //filter base64 (also it seems sometimes we just have base64 data, without the protocol...)\n if (!urlUtil.isBase64(url)) {\n resolved[url] = preloadAssetManager.resolve(url);\n }\n });\n\n if (_.size(resolved) > 0) {\n acc[type] = resolved;\n }\n\n return acc;\n }, {}));\n });\n };\n\n if (!options || !options.testId) {\n throw new TypeError('The test identifier is mandatory to start the item preloader');\n } //this is the test asset manager, referenced under options.testId\n\n\n var testAssetManager = getAssetManager(options.testId); //mechanisms to preload assets and runtimes\n\n var assetPreloader = assetPreloaderFactory(testAssetManager);\n var interactionPreloader = interactionPreloaderFactory();\n /**\n * Preload the item runner\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n\n var itemLoad = function itemLoad(item) {\n logger.debug(\"Start preloading of item \".concat(item.itemIdentifier));\n return new Promise(function (resolve, reject) {\n qtiItemRunner(item.itemData.type, item.itemData.data, {\n assetManager: preloadAssetManager,\n preload: true\n }).on('init', function () {\n logger.debug(\"Preloading of item \".concat(item.itemIdentifier, \" done\"));\n resolve(true);\n }).on('error', reject).init();\n });\n };\n /**\n * Preload the interactions\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {object} item.itemData.data - item data\n * @returns {Promise}\n * @private\n */\n\n\n var interactionLoad = function interactionLoad(item) {\n return Promise.all(getItemInteractions(item.itemData).map(function (interaction) {\n if (interactionPreloader.has(interaction.qtiClass)) {\n logger.debug(\"Loading interaction \".concat(interaction.serial, \"(\").concat(interaction.qtiClass, \") for item \").concat(item.itemIdentifier));\n return interactionPreloader.load(interaction.qtiClass, interaction, item.itemData, item.itemIdentifier);\n }\n\n return Promise.resolve();\n }));\n };\n /**\n * Unload the interactions\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {object} item.itemData.data - item data\n * @returns {Promise}\n * @private\n */\n\n\n var interactionUnload = function interactionUnload(item) {\n return Promise.all(getItemInteractions(item.itemData).map(function (interaction) {\n if (interactionPreloader.has(interaction.qtiClass)) {\n logger.debug(\"Unloading interaction \".concat(interaction.serial, \"(\").concat(interaction.qtiClass, \") for item \").concat(item.itemIdentifier));\n return interactionPreloader.unload(interaction.qtiClass, interaction, item.itemData, item.itemIdentifier);\n }\n\n return Promise.resolve();\n }));\n };\n /**\n * Preload the item assets\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n\n\n var assetLoad = function assetLoad(item) {\n return resolveAssets(item).then(function (resolved) {\n _.forEach(resolved, function (assets, type) {\n if (assetPreloader.has(type)) {\n _.forEach(assets, function (url, sourceUrl) {\n logger.debug(\"Loading asset \".concat(sourceUrl, \"(\").concat(type, \") for item \").concat(item.itemIdentifier));\n assetPreloader.load(type, url, sourceUrl, item.itemIdentifier);\n });\n } else {\n setItemFlag(item, 'containsNonPreloadedAssets');\n }\n });\n\n return true;\n });\n };\n /**\n * Unload the item assets\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n * @private\n */\n\n\n var assetUnload = function assetUnload(item) {\n return resolveAssets(item).then(function (resolved) {\n _.forEach(resolved, function (assets, type) {\n if (assetPreloader.has(type)) {\n _.forEach(assets, function (url, sourceUrl) {\n logger.debug(\"Unloading asset \".concat(sourceUrl, \"(\").concat(type, \") for item \").concat(item.itemIdentifier));\n assetPreloader.unload(type, url, sourceUrl, item.itemIdentifier);\n });\n }\n });\n\n return true;\n });\n };\n /**\n * @typedef {object} itemPreloader\n */\n\n\n return {\n /**\n * Preload the given item (runtime and assets)\n *\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise<Boolean>} resolves with true if the item is loaded\n */\n preload: function preload(item) {\n var loading = [];\n\n if (isItemObjectValid(item)) {\n loading.push(itemLoad(item));\n loading.push(interactionLoad(item));\n\n if (_.size(item.itemData.data && item.itemData.data.feedbacks)) {\n setItemFlag(item, 'hasFeedbacks');\n }\n\n if (_.size(item.itemData.assets) > 0) {\n loading.push(assetLoad(item));\n }\n }\n\n return Promise.all(loading).then(function (results) {\n return results.length > 0 && _.all(results, _.isTrue);\n });\n },\n\n /**\n * Unload the assets for the given item\n *\n * @param {object} item\n * @param {string} item.itemIdentifier - the item identifier\n * @param {string} item.baseUrl - item baseUrl\n * @param {string} item.itemData.type - type of item\n * @param {object} item.itemData.data - item data\n * @param {object} item.itemData.assets - assets per types : img : ['url1', 'url2' ]\n * @returns {Promise}\n */\n unload: function unload(item) {\n var loading = [];\n\n if (isItemObjectValid(item)) {\n loading.push(interactionUnload(item));\n\n if (_.size(item.itemData.assets) > 0) {\n loading.push(assetUnload(item));\n }\n }\n\n return Promise.all(loading).then(function (results) {\n return results.length > 0 && _.all(results, _.isTrue);\n });\n }\n };\n }\n\n return itemPreloaderFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/itemStore',['lodash', 'core/store', 'taoQtiTest/runner/proxy/cache/itemPreloader'], function (_, store, itemPreloaderFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n itemPreloaderFactory = itemPreloaderFactory && Object.prototype.hasOwnProperty.call(itemPreloaderFactory, 'default') ? itemPreloaderFactory['default'] : itemPreloaderFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 Open Assessment Technologies SA\n */\n /**\n * The default number of items to store\n */\n\n var defaultConfig = {\n maxSize: 10,\n preload: false\n };\n /**\n * Create an item store\n * @param {Object} [options]\n * @param {Number} [options.maxSize = 10] - the store limit\n * @param {Boolean} [options.preload] - do we preload items when storing them\n * @param {String} [options.testId] - the unique identifier of the test instance, required if preload is true\n *\n * @returns {itemStore}\n */\n\n function itemStoreFactory(options) {\n var config = _.defaults(options || {}, defaultConfig); //in memory storage\n\n\n var getStore = function getStore() {\n return store('item-cache', store.backends.memory);\n }; //maintain an index to resolve existence synchronously\n\n\n var index = [];\n var itemPreloader;\n\n if (config.preload) {\n itemPreloader = itemPreloaderFactory(_.pick(config, ['testId']));\n }\n /**\n * @typedef itemStore\n */\n\n\n return {\n /**\n * Setter to override the cache size\n *\n * @param {number} cacheSize\n */\n setCacheSize: function setCacheSize(cacheSize) {\n config.maxSize = cacheSize;\n },\n\n /**\n * Get the item form the given key/id/uri\n * @param {String} key - something identifier\n * @returns {Promise<Object>} the item\n */\n get: function get(key) {\n return getStore().then(function (itemStorage) {\n return itemStorage.getItem(key);\n });\n },\n\n /**\n * Check whether the given item is in the store\n * @param {String} key - something identifier\n * @returns {Boolean}\n */\n has: function has(key) {\n return _.contains(index, key);\n },\n\n /**\n * Add/Set an item into the store, under the given key\n * @param {String} key - something identifier\n * @param {Object} item - the item\n * @returns {Promise<Boolean>} chains\n */\n set: function set(key, item) {\n var self = this;\n return getStore().then(function (itemStorage) {\n return itemStorage.setItem(key, item).then(function (updated) {\n if (updated) {\n if (!_.contains(index, key)) {\n index.push(key);\n }\n\n if (config.preload) {\n _.defer(function () {\n itemPreloader.preload(item);\n });\n }\n } //do we reach the limit ? then remove one\n\n\n if (index.length > 1 && index.length > config.maxSize) {\n return self.remove(index[0]).then(function (removed) {\n return updated && removed;\n });\n }\n\n return updated;\n });\n });\n },\n\n /**\n * Update some data of a store item\n * @param {String} key - something identifier\n * @param {String} updateKey - key to update\n * @param {*} updateValue - new data for the updateKey\n * @returns {Promise<Boolean>} resolves with the update status\n */\n update: function update(key, updateKey, updateValue) {\n if (this.has(key) && _.isString(updateKey)) {\n return getStore().then(function (itemStorage) {\n return itemStorage.getItem(key).then(function (itemData) {\n if (_.isPlainObject(itemData)) {\n itemData[updateKey] = updateValue;\n return itemStorage.setItem(key, itemData);\n }\n });\n });\n }\n\n return Promise.resolve(false);\n },\n\n /**\n * Remove the item from the store\n * @param {String} key - something identifier\n * @returns {Promise<Boolean>} resolves once removed\n */\n remove: function remove(key) {\n if (this.has(key)) {\n return getStore().then(function (itemStorage) {\n index = _.without(index, key);\n return itemStorage.getItem(key).then(function (item) {\n if (config.preload) {\n _.defer(function () {\n itemPreloader.unload(item);\n });\n }\n }).then(function () {\n return itemStorage.removeItem(key);\n });\n });\n }\n\n return Promise.resolve(false);\n },\n\n /**\n * Clear the store\n * @returns {Promise}\n */\n clear: function clear() {\n return getStore().then(function (itemStorage) {\n index = [];\n return itemStorage.clear();\n });\n }\n };\n }\n\n return itemStoreFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/qtiServiceProxy',['lodash', 'core/promiseQueue', 'core/communicator', 'taoQtiTest/runner/config/qtiServiceConfig', 'core/request'], function (_, promiseQueue, communicatorFactory, configFactory, coreRequest) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n promiseQueue = promiseQueue && Object.prototype.hasOwnProperty.call(promiseQueue, 'default') ? promiseQueue['default'] : promiseQueue;\n communicatorFactory = communicatorFactory && Object.prototype.hasOwnProperty.call(communicatorFactory, 'default') ? communicatorFactory['default'] : communicatorFactory;\n configFactory = configFactory && Object.prototype.hasOwnProperty.call(configFactory, 'default') ? configFactory['default'] : configFactory;\n coreRequest = coreRequest && Object.prototype.hasOwnProperty.call(coreRequest, 'default') ? coreRequest['default'] : coreRequest;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n\n var qtiServiceProxy = {\n name: 'qtiServiceProxy',\n\n /**\n * Installs the proxy\n */\n install: function install() {\n var self = this;\n /**\n * A promise queue to ensure requests run sequentially\n */\n\n this.queue = promiseQueue();\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n\n this.prepareParams = function prepareParams(actionParams) {\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse', 'toolStates'];\n\n if (_.isPlainObject(actionParams)) {\n return _.mapValues(actionParams, function (value, key) {\n if (_.contains(stringifyParams, key)) {\n return JSON.stringify(value);\n }\n\n return value;\n });\n }\n\n return actionParams;\n };\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n\n\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n }).then(function (response) {\n self.setOnline();\n\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n }).catch(function (error) {\n if (self.isConnectivityError(error)) {\n self.setOffline('request');\n }\n\n return Promise.reject(error);\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {}); // request for initialization\n\n return this.request(this.configStorage.getTestActionUrl('init'), params);\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null; // the method must return a promise\n\n return Promise.resolve();\n },\n\n /**\n * Gets the test definition data\n * @returns {Promise} - Returns a promise. The test definition data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestData: function getTestData() {\n return this.request(this.configStorage.getTestActionUrl('getTestData'));\n },\n\n /**\n * Gets the test context\n * @returns {Promise} - Returns a promise. The context object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestContext: function getTestContext() {\n return this.request(this.configStorage.getTestActionUrl('getTestContext'));\n },\n\n /**\n * Gets the test map\n * @returns {Promise} - Returns a promise. The test map object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestMap: function getTestMap() {\n return this.request(this.configStorage.getTestActionUrl('getTestMap'));\n },\n\n /**\n * Sends the test variables\n * @param {Object} variables\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables) {\n return this.request(this.configStorage.getTestActionUrl('storeTraceData'), {\n traceData: JSON.stringify(variables)\n });\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params, void 0, true);\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'), body);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n\n /**\n * Sends a telemetry signal\n * @param {String} itemIdentifier - The identifier of the item for which sends the telemetry signal\n * @param {String} signal - The name of the signal to send\n * @param {Object} [params] - Some optional parameters to join to the signal\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires telemetry\n */\n telemetry: function telemetry(itemIdentifier, signal, params) {\n return this.request(this.configStorage.getTelemetryUrl(itemIdentifier, signal), params, null, true);\n },\n\n /**\n * Builds the communication channel\n * @returns {communicator|null} the communication channel\n */\n loadCommunicator: function loadCommunicator() {\n var config = this.configStorage.getCommunicationConfig();\n\n if (config.enabled) {\n return communicatorFactory(config.type, config.params);\n }\n\n return null;\n }\n };\n\n return qtiServiceProxy;\n\n});\n\n","define('taoQtiTest/runner/proxy/cache/proxy',['lodash', 'taoQtiTest/runner/navigator/navigator', 'taoQtiTest/runner/helpers/map', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/proxy/qtiServiceProxy', 'taoQtiTest/runner/proxy/cache/itemStore', 'taoQtiTest/runner/proxy/cache/actionStore', 'taoQtiTest/runner/helpers/offlineErrorHelper'], function (_, testNavigatorFactory, mapHelper, navigationHelper, dataUpdater, qtiServiceProxy, itemStoreFactory, actionStoreFactory, offlineErrorHelper) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n testNavigatorFactory = testNavigatorFactory && Object.prototype.hasOwnProperty.call(testNavigatorFactory, 'default') ? testNavigatorFactory['default'] : testNavigatorFactory;\n mapHelper = mapHelper && Object.prototype.hasOwnProperty.call(mapHelper, 'default') ? mapHelper['default'] : mapHelper;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n qtiServiceProxy = qtiServiceProxy && Object.prototype.hasOwnProperty.call(qtiServiceProxy, 'default') ? qtiServiceProxy['default'] : qtiServiceProxy;\n itemStoreFactory = itemStoreFactory && Object.prototype.hasOwnProperty.call(itemStoreFactory, 'default') ? itemStoreFactory['default'] : itemStoreFactory;\n actionStoreFactory = actionStoreFactory && Object.prototype.hasOwnProperty.call(actionStoreFactory, 'default') ? actionStoreFactory['default'] : actionStoreFactory;\n offlineErrorHelper = offlineErrorHelper && Object.prototype.hasOwnProperty.call(offlineErrorHelper, 'default') ? offlineErrorHelper['default'] : offlineErrorHelper;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA\n */\n /**\n * The number of items to keep in the cache\n * @type {Number}\n */\n\n var cacheSize = 20;\n /**\n * The number of ms to wait after an item is loaded\n * to start loading the next.\n * This value is more or less the time needed to render an item.\n * @type {Number}\n */\n\n var loadNextDelay = 450;\n /**\n * Overrides the qtiServiceProxy with the precaching behavior\n * @extends taoQtiTest/runner/proxy/qtiServiceProxy\n */\n\n var proxy = _.defaults({\n name: 'precaching',\n\n /**\n * Installs the proxy\n * @param {Object} config\n */\n install: function install(config) {\n var self = this; //install the parent proxy\n\n qtiServiceProxy.install.call(this); //we keep items here\n\n this.itemStore = itemStoreFactory({\n maxSize: cacheSize,\n preload: true,\n testId: config.serviceCallId\n }); //where we keep actions\n\n this.actiontStore = null; //can we load the next item from the cache/store ?\n\n this.getItemFromStore = false; //configuration params, that comes on every request/params\n\n this.requestConfig = {}; //scheduled action promises which supposed to be resolved after action synchronization.\n\n this.actionPromises = {}; //scheduled action reject promises which supposed to be rejected in case of failed synchronization.\n\n this.actionRejectPromises = {}; //let's you update test data (testContext and testMap)\n\n this.dataUpdater = dataUpdater(this.getDataHolder());\n /**\n * Get the item cache size from the test data\n * @returns {Number} the cache size\n */\n\n this.getCacheAmount = function getCacheAmount() {\n var cacheAmount = 1;\n\n if (config && config.options && config.options.itemCaching) {\n cacheAmount = parseInt(config.options.itemCaching.amount, 10) || cacheAmount;\n }\n\n return cacheAmount;\n };\n /**\n * Check whether we have the item in the store\n * @param {String} itemIdentifier - the item identifier\n * @returns {Boolean}\n */\n\n\n this.hasItem = function hasItem(itemIdentifier) {\n return itemIdentifier && self.itemStore.has(itemIdentifier);\n };\n /**\n * Check whether we have the next item in the store\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n\n\n this.hasNextItem = function hasNextItem(itemIdentifier) {\n var sibling = navigationHelper.getNextItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n /**\n * Check whether we have the previous item in the store\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n\n\n this.hasPreviousItem = function hasPreviousItem(itemIdentifier) {\n var sibling = navigationHelper.getPreviousItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n /**\n * Offline ? We try to navigate offline, or just say 'ok'\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Object} action result\n */\n\n\n this.offlineAction = function offlineAction(action, actionParams) {\n var testNavigator;\n var newTestContext;\n var result = {\n success: true\n };\n var blockingActions = ['exitTest', 'timeout'];\n var testContext = this.getDataHolder().get('testContext');\n var testMap = this.getDataHolder().get('testMap');\n\n if (action === 'pause') {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflinePauseError(), {\n reason: actionParams.reason\n });\n } //we just block those actions and the end of the test\n\n\n if (_.contains(blockingActions, action) || actionParams.direction === 'next' && navigationHelper.isLast(testMap, testContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineExitError());\n } // try the navigation if the actionParams context meaningful data\n\n\n if (actionParams.direction && actionParams.scope) {\n testNavigator = testNavigatorFactory(testContext, testMap);\n newTestContext = testNavigator.navigate(actionParams.direction, actionParams.scope, actionParams.ref); //we are really not able to navigate\n\n if (!newTestContext || !newTestContext.itemIdentifier || !self.hasItem(newTestContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());\n }\n\n result.testContext = newTestContext;\n }\n\n self.markActionAsOffline(actionParams);\n return result;\n };\n /**\n * Process action which should be sent using message channel.\n *\n * @param {String} action\n * @param {Object} actionParams\n * @param {Boolean} deferred\n *\n * @returns {Promise} resolves with the action result\n */\n\n\n this.processSyncAction = function processSyncAction(action, actionParams, deferred) {\n return new Promise(function (resolve, reject) {\n self.scheduleAction(action, actionParams).then(function (actionData) {\n self.actionPromises[actionData.params.actionId] = resolve;\n self.actionRejectPromises[actionData.params.actionId] = reject;\n\n if (!deferred) {\n self.syncData().then(function (result) {\n if (self.isOnline()) {\n _.forEach(result, function (actionResult) {\n var actionId = actionResult.requestParameters && actionResult.requestParameters.actionId ? actionResult.requestParameters.actionId : null;\n\n if (!actionResult.success && self.actionRejectPromises[actionId]) {\n var error = new Error(actionResult.message);\n error.unrecoverable = true;\n return reject(error);\n }\n\n if (actionId && self.actionPromises[actionId]) {\n self.actionPromises[actionId](actionResult);\n }\n });\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n }).catch(function (reason) {\n reject(reason);\n });\n });\n };\n /**\n * Schedule an action do be done with next call\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Promise} resolves with the action data\n */\n\n\n this.scheduleAction = function scheduleAction(action, actionParams) {\n actionParams.actionId = \"\".concat(action, \"_\").concat(new Date().getTime());\n return self.actiontStore.push(action, self.prepareParams(_.defaults(actionParams || {}, self.requestConfig))).then(function () {\n return {\n action: action,\n params: actionParams\n };\n });\n };\n /**\n * Request/Offline strategy :\n *\n * ├─ Online\n * │ └─ run the request\n * │ ├─ request ok\n * │ └─ request fails\n * │ └─ run the offline action\n * └── Offline\n * └─ send a telemetry request (connection could be back)\n * ├─ request ok\n * │ └─ sync data\n * │ └─ run the request (back to the tree root)\n * └─ request fails\n * └─ run the offline action\n *\n * @param {String} url\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @param {Boolean} noToken whether the request should be sent with a CSRF token or not\n *\n * @returns {Promise} resolves with the action result\n */\n\n\n this.requestNetworkThenOffline = function requestNetworkThenOffline(url, action, actionParams, deferred, noToken) {\n var testContext = this.getDataHolder().get('testContext');\n var communicationConfig = self.configStorage.getCommunicationConfig(); //perform the request, but fallback on offline if the request itself fails\n\n var runRequestThenOffline = function runRequestThenOffline() {\n var request;\n\n if (communicationConfig.syncActions && communicationConfig.syncActions.indexOf(action) >= 0) {\n request = self.processSyncAction(action, actionParams, deferred);\n } else {\n //action is not synchronizable\n //fallback to direct request\n request = self.request(url, actionParams, void 0, noToken || false);\n request.then(function (result) {\n if (self.isOffline()) {\n return self.scheduleAction(action, actionParams);\n }\n\n return result;\n });\n }\n\n return request.then(function (result) {\n if (self.isOffline()) {\n return self.offlineAction(action, actionParams);\n }\n\n return result;\n }).catch(function (error) {\n if (self.isConnectivityError(error) && self.isOffline()) {\n return self.offlineAction(action, actionParams);\n }\n\n throw error;\n });\n };\n\n if (this.isOffline()) {\n //try the telemetry action, just in case\n return this.telemetry(testContext.itemIdentifier, 'up').then(function () {\n //if the up request succeed, we run the request\n if (self.isOnline()) {\n return runRequestThenOffline();\n }\n\n return self.scheduleAction(action, actionParams).then(function () {\n return self.offlineAction(action, actionParams);\n });\n }).catch(function (err) {\n if (self.isConnectivityError(err)) {\n return self.scheduleAction(action, actionParams).then(function () {\n return self.offlineAction(action, actionParams);\n });\n }\n\n throw err;\n });\n } //by default we try to run the request first\n\n\n return runRequestThenOffline();\n };\n /**\n * Flush and synchronize actions collected while offline\n * @returns {Promise} resolves with the action result\n */\n\n\n this.syncData = function syncData() {\n var actions;\n return this.queue.serie(function () {\n return self.actiontStore.flush().then(function (data) {\n actions = data;\n\n if (data && data.length) {\n return self.send('sync', data);\n }\n }).catch(function (err) {\n if (self.isConnectivityError(err)) {\n self.setOffline('communicator');\n\n _.forEach(actions, function (action) {\n self.actiontStore.push(action.action, action.parameters);\n });\n }\n\n throw err;\n });\n });\n };\n /**\n * Flush the offline actions from the actionStore before reinserting them.\n * The exported copy can be used for file download.\n * The retained copy can still be synced as the test progresses.\n *\n * @returns {Promise} resolves with the store contents\n */\n\n\n this.exportActions = function exportActions() {\n var actions;\n return this.queue.serie(function () {\n return self.actiontStore.flush().then(function (data) {\n actions = data;\n\n _.forEach(actions, function (action) {\n self.actiontStore.push(action.action, action.parameters);\n });\n\n return data;\n });\n });\n };\n /**\n * Mark action as performed in offline mode\n * Action to mark as offline will be defined by actionParams.actionId parameter value.\n *\n * @param {Object} actionParams - the action parameters\n * @returns {Promise}\n */\n\n\n this.markActionAsOffline = function markActionAsOffline(actionParams) {\n actionParams.offline = true;\n return this.queue.serie(function () {\n return self.actiontStore.update(self.prepareParams(_.defaults(actionParams || {}, self.requestConfig)));\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n var self = this;\n\n if (!this.getDataHolder()) {\n throw new Error('Unable to retrieve test runners data holder');\n } //those needs to be in each request params.\n\n\n this.requestConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId']); //set up the action store for the current service call\n\n this.actiontStore = actionStoreFactory(config.serviceCallId); //we resync as soon as the connection is back\n\n this.on('reconnect', function () {\n return this.syncData().then(function (responses) {\n self.dataUpdater.update(responses);\n }).catch(function (err) {\n self.trigger('error', err);\n });\n }); //if some actions remains unsynced\n\n this.syncData(); //run the init\n\n return qtiServiceProxy.init.call(this, config, params);\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n this.itemStore.clear();\n this.getItemFromStore = false;\n return qtiServiceProxy.destroy.call(this);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n var self = this;\n /**\n * try to load the next items\n */\n\n var loadNextItem = function loadNextItem() {\n var testMap = self.getDataHolder().get('testMap');\n var siblings = navigationHelper.getSiblingItems(testMap, itemIdentifier, 'both', self.getCacheAmount());\n\n var missing = _.reduce(siblings, function (list, sibling) {\n if (!self.hasItem(sibling.id)) {\n list.push(sibling.id);\n }\n\n return list;\n }, []); //don't run a request if not needed\n\n\n if (self.isOnline() && missing.length) {\n _.delay(function () {\n self.requestNetworkThenOffline(self.configStorage.getTestActionUrl('getNextItemData'), 'getNextItemData', {\n itemDefinition: missing\n }, false, true).then(function (response) {\n if (response && response.items) {\n _.forEach(response.items, function (item) {\n if (item && item.itemIdentifier) {\n //store the response and start caching assets\n self.itemStore.set(item.itemIdentifier, item);\n }\n });\n }\n }).catch(_.noop);\n }, loadNextDelay);\n }\n }; //resolve from the store\n\n\n if (this.getItemFromStore && this.itemStore.has(itemIdentifier)) {\n loadNextItem();\n return this.itemStore.get(itemIdentifier);\n }\n\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params, void 0, true).then(function (response) {\n if (response && response.success) {\n self.itemStore.set(itemIdentifier, response);\n }\n\n loadNextItem();\n return response;\n });\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var self = this;\n return this.itemStore.update(itemIdentifier, 'itemState', state).then(function () {\n return qtiServiceProxy.submitItem.call(self, itemIdentifier, state, response, params);\n });\n },\n\n /**\n * Sends the test variables\n * @param {Object} variables\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables, deferred) {\n var action = 'storeTraceData';\n var actionParams = {\n traceData: JSON.stringify(variables)\n };\n return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action), action, actionParams, deferred);\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params, deferred) {\n return this.requestNetworkThenOffline(this.configStorage.getTestActionUrl(action), action, params, deferred);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params, deferred) {\n var self = this;\n var updateStatePromise = Promise.resolve();\n var testMap = this.getDataHolder().get('testMap'); //update the item state\n\n if (params.itemState) {\n updateStatePromise = this.itemStore.update(itemIdentifier, 'itemState', params.itemState);\n } //check if we have already the item for the action we are going to perform\n\n\n self.getItemFromStore = navigationHelper.isMovingToNextItem(action, params) && self.hasNextItem(itemIdentifier) || navigationHelper.isMovingToPreviousItem(action, params) && self.hasPreviousItem(itemIdentifier) || navigationHelper.isJumpingToItem(action, params) && self.hasItem(mapHelper.getItemIdentifier(testMap, params.ref)); //If item action is move to another item ensure the next request will start the timer\n\n if (navigationHelper.isMovingToNextItem(action, params) || navigationHelper.isMovingToPreviousItem(action, params) || navigationHelper.isJumpingToItem(action, params)) {\n params.start = true;\n }\n\n return updateStatePromise.then(function () {\n return self.requestNetworkThenOffline(self.configStorage.getItemActionUrl(itemIdentifier, action), action, _.merge({\n itemDefinition: itemIdentifier\n }, params), deferred);\n });\n }\n }, qtiServiceProxy);\n\n return proxy;\n\n});\n\n","define('taoQtiTest/runner/proxy/loader',['lodash', 'module', 'taoTests/runner/proxy'], function (_, module, proxy) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n module = module && Object.prototype.hasOwnProperty.call(module, 'default') ? module['default'] : module;\n proxy = proxy && Object.prototype.hasOwnProperty.call(proxy, 'default') ? proxy['default'] : proxy;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 Open Assessment Technologies SA ;\n */\n /**\n * The configuration of the provider to use with it's AMD module\n */\n\n var config = _.defaults(module.config(), {\n providerName: 'qtiServiceProxy',\n module: 'taoQtiTest/runner/proxy/qtiServiceProxy'\n });\n /**\n * Load and register the configured providers\n * @returns {Promise} resolves with the regsitered provider name\n */\n\n\n function load() {\n return new Promise(function (resolve, reject) {\n require([config.module], function (proxyProvider) {\n proxy.registerProvider(config.providerName, proxyProvider);\n resolve(config.providerName);\n }, reject);\n });\n }\n\n return load;\n\n});\n\n","define('taoQtiTest/runner/services/responseStore',['lodash', 'core/store'], function (_, store) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n var defaultConfig = {\n responseStoreName: 'response',\n correctResponseStoreName: 'correct-response'\n };\n /**\n * @param {Object} options\n * @param {string} options.responseStoreName\n * @param {string} options.correctResponseStoreName\n */\n\n function responseStoreFactory(options) {\n var config = _.defaults(options || {}, defaultConfig);\n /**\n * @returns {Promise}\n */\n\n\n var getResponseStore = function getResponseStore() {\n return store(config.responseStoreName, store.backends.memory);\n };\n /**\n * @returns {Promise}\n */\n\n\n var getCorrectResponseStore = function getCorrectResponseStore() {\n return store(config.correctResponseStoreName, store.backends.memory);\n };\n\n return {\n /**\n * @returns {Promise}\n */\n getResponses: function getResponses() {\n return getResponseStore().then(function (storage) {\n return storage.getItems();\n });\n },\n\n /**\n * @returns {Promise}\n */\n getCorrectResponses: function getCorrectResponses() {\n return getCorrectResponseStore().then(function (storage) {\n return storage.getItems();\n });\n },\n\n /**\n * @param {string} key\n * @returns {Promise}\n */\n getResponse: function getResponse(key) {\n return getResponseStore().then(function (storage) {\n return storage.getItem(key);\n });\n },\n\n /**\n * @param {string} key\n * @returns {Promise}\n */\n getCorrectResponse: function getCorrectResponse(key) {\n return getCorrectResponseStore().then(function (storage) {\n return storage.getItem(key).then(function (result) {\n return new Promise(function (resolve) {\n if (typeof result === 'undefined') {\n return resolve([]);\n }\n\n return resolve(result);\n });\n });\n });\n },\n\n /**\n * @param {string} key\n * @param {string} value\n * @returns {Promise}\n */\n addResponse: function addResponse(key, value) {\n return getResponseStore().then(function (storage) {\n return storage.setItem(key, value).then(function (updated) {\n return updated;\n });\n });\n },\n\n /**\n * @param {string} key\n * @param {string[]} value\n * @returns {Promise}\n */\n addCorrectResponse: function addCorrectResponse(key, value) {\n return getCorrectResponseStore().then(function (storage) {\n return storage.setItem(key, value).then(function (updated) {\n return updated;\n });\n });\n },\n\n /**\n * @returns {Promise}\n */\n clearResponses: function clearResponses() {\n return getResponseStore().then(function (storage) {\n return storage.clear();\n });\n },\n\n /**\n * @returns {Promise}\n */\n clearCorrectResponses: function clearCorrectResponses() {\n return getCorrectResponseStore().then(function (storage) {\n return storage.clear();\n });\n }\n };\n }\n\n return responseStoreFactory;\n\n});\n\n","define('taoQtiTest/runner/proxy/offline/proxy',['lodash', 'taoQtiTest/runner/navigator/offlineNavigator', 'taoQtiTest/runner/helpers/navigation', 'taoQtiTest/runner/provider/dataUpdater', 'taoQtiTest/runner/proxy/qtiServiceProxy', 'taoQtiTest/runner/proxy/cache/itemStore', 'taoQtiTest/runner/proxy/cache/actionStore', 'taoQtiTest/runner/helpers/offlineErrorHelper', 'taoQtiTest/runner/helpers/offlineSyncModal', 'taoQtiTest/runner/services/responseStore', 'util/download', 'taoQtiTest/runner/config/states'], function (_, offlineNavigatorFactory, navigationHelper, dataUpdater, qtiServiceProxy, itemStoreFactory, actionStoreFactory, offlineErrorHelper, offlineSyncModal, responseStoreFactory, download, states) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n offlineNavigatorFactory = offlineNavigatorFactory && Object.prototype.hasOwnProperty.call(offlineNavigatorFactory, 'default') ? offlineNavigatorFactory['default'] : offlineNavigatorFactory;\n navigationHelper = navigationHelper && Object.prototype.hasOwnProperty.call(navigationHelper, 'default') ? navigationHelper['default'] : navigationHelper;\n dataUpdater = dataUpdater && Object.prototype.hasOwnProperty.call(dataUpdater, 'default') ? dataUpdater['default'] : dataUpdater;\n qtiServiceProxy = qtiServiceProxy && Object.prototype.hasOwnProperty.call(qtiServiceProxy, 'default') ? qtiServiceProxy['default'] : qtiServiceProxy;\n itemStoreFactory = itemStoreFactory && Object.prototype.hasOwnProperty.call(itemStoreFactory, 'default') ? itemStoreFactory['default'] : itemStoreFactory;\n actionStoreFactory = actionStoreFactory && Object.prototype.hasOwnProperty.call(actionStoreFactory, 'default') ? actionStoreFactory['default'] : actionStoreFactory;\n offlineErrorHelper = offlineErrorHelper && Object.prototype.hasOwnProperty.call(offlineErrorHelper, 'default') ? offlineErrorHelper['default'] : offlineErrorHelper;\n offlineSyncModal = offlineSyncModal && Object.prototype.hasOwnProperty.call(offlineSyncModal, 'default') ? offlineSyncModal['default'] : offlineSyncModal;\n responseStoreFactory = responseStoreFactory && Object.prototype.hasOwnProperty.call(responseStoreFactory, 'default') ? responseStoreFactory['default'] : responseStoreFactory;\n download = download && Object.prototype.hasOwnProperty.call(download, 'default') ? download['default'] : download;\n states = states && Object.prototype.hasOwnProperty.call(states, 'default') ? states['default'] : states;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Overrides the qtiServiceProxy with the offline behavior\n * @extends taoQtiTest/runner/proxy/qtiServiceProxy\n */\n\n var proxy = _.defaults({\n name: 'offline',\n\n /**\n * Installs the proxy\n * @param {object} config\n */\n install: function install(config) {\n var self = this;\n var maxSyncAttempts = 3; // install the parent proxy\n\n qtiServiceProxy.install.call(this); // we keep items here\n\n this.itemStore = itemStoreFactory({\n preload: true,\n testId: config.serviceCallId\n });\n this.responseStore = responseStoreFactory();\n this.offlineNavigator = offlineNavigatorFactory(this.itemStore, this.responseStore); // where we keep actions\n\n this.actionStore = null; // configuration params, that comes on every request/params\n\n this.requestConfig = {}; // scheduled action promises which supposed to be resolved after action synchronization.\n\n this.actionPromises = {};\n this.syncInProgress = false; // is data synchronization in progress\n // let's you update test data (testContext and testMap)\n\n this.dataUpdater = dataUpdater(this.getDataHolder());\n /**\n * Check whether we have the item in the store\n *\n * @param {String} itemIdentifier - the item identifier\n * @returns {Boolean}\n */\n\n this.hasItem = function hasItem(itemIdentifier) {\n return itemIdentifier && self.itemStore.has(itemIdentifier);\n };\n /**\n * Check whether we have the next item in the store\n *\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n\n\n this.hasNextItem = function hasNextItem(itemIdentifier) {\n var sibling = navigationHelper.getNextItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n /**\n * Check whether we have the previous item in the store\n *\n * @param {String} itemIdentifier - the CURRENT item identifier\n * @returns {Boolean}\n */\n\n\n this.hasPreviousItem = function hasPreviousItem(itemIdentifier) {\n var sibling = navigationHelper.getPreviousItem(this.getDataHolder().get('testMap'), itemIdentifier);\n return sibling && self.hasItem(sibling.id);\n };\n /**\n * Offline navigation\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Object} action result\n */\n\n\n this.offlineAction = function offlineAction(action, actionParams) {\n return new Promise(function (resolve, reject) {\n var result = {\n success: true\n };\n var blockingActions = ['exitTest', 'timeout', 'pause'];\n var dataHolder = self.getDataHolder();\n var testContext = dataHolder.get('testContext');\n var testMap = dataHolder.get('testMap');\n var isLast = testContext && testMap ? navigationHelper.isLast(testMap, testContext.itemIdentifier) : false;\n var isOffline = self.isOffline();\n\n var isBlocked = _.contains(blockingActions, action);\n\n var isNavigationAction = actionParams.direction === 'next' || action === 'skip';\n var isDirectionDefined;\n var isMeaningfullScope = !!actionParams.scope;\n /***\n * performs navigation trough items of given test parameters according to action parameters\n * doesent need active internet connection\n * @param navigator - navigator helper used with this proxy\n * @param {Object} options - options to manage the navigation\n * @param {Object} options.testContext - current test testContext dataset\n * @param {Object} results - navigtion result output object\n */\n\n var navigate = function navigate(navigator, options, results) {\n var newTestContext;\n navigator.setTestContext(options.testContext).setTestMap(options.testMap).navigate(actionParams.direction, actionParams.scope, actionParams.ref, actionParams).then(function (res) {\n newTestContext = res;\n\n if (!newTestContext || !newTestContext.itemIdentifier || !self.hasItem(newTestContext.itemIdentifier)) {\n throw offlineErrorHelper.buildErrorFromContext(offlineErrorHelper.getOfflineNavError());\n }\n\n results.testContext = newTestContext;\n resolve(results);\n }).catch(function (err) {\n reject(err);\n });\n };\n\n if (action === 'skip') {\n actionParams.direction = action;\n }\n\n isDirectionDefined = !!actionParams.direction;\n\n if (isBlocked || isNavigationAction && isLast) {\n // the last item of the test\n result.testContext = {\n state: states.testSession.closed\n };\n\n var offlineSync = function offlineSync() {\n offlineSyncModal(self).on('proceed', function () {\n self.syncData().then(function () {\n // if is online resolve promise \n if (self.isOnline()) {\n return resolve(result);\n }\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }).on('secondaryaction', function () {\n self.initiateDownload().catch(function () {\n return resolve({\n success: false\n });\n });\n });\n };\n\n if (isOffline) {\n return offlineSync();\n } else {\n return self.syncData().then(function () {\n if (self.isOffline()) {\n // in case last request was failed and connection lost\n // show offlineWaitingDialog\n return offlineSync();\n }\n\n return resolve(result);\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }\n } else if (isDirectionDefined && isMeaningfullScope) {\n //navigation actions\n if (isOffline) {\n navigate(self.offlineNavigator, {\n testContext: testContext,\n testMap: testMap\n }, result);\n } else {\n return self.syncData().then(function () {\n navigate(self.offlineNavigator, {\n testContext: testContext,\n testMap: testMap\n }, result);\n }).catch(function () {\n return resolve({\n success: false\n });\n });\n }\n } else {\n //common behaviour\n resolve(result);\n }\n });\n };\n /**\n * Schedule an action do be done with next call\n *\n * @param {String} action - the action name (ie. move, skip, timeout)\n * @param {Object} actionParams - the parameters sent along the action\n * @returns {Promise} resolves with the action data\n */\n\n\n this.scheduleAction = function scheduleAction(action, actionParams) {\n actionParams = _.assign(actionParams, {\n actionId: \"\".concat(action, \"_\").concat(new Date().getTime()),\n offline: true\n });\n return self.actionStore.push(action, self.prepareParams(_.defaults(actionParams || {}, self.requestConfig))).then(function () {\n return {\n action: action,\n params: actionParams\n };\n });\n };\n /**\n * Try to sync data until reached max attempts\n *\n * @param {Object} data - sync payload\n * @param {Number} attempt - current attempt\n * @returns {Promise} resolves with the action result\n */\n\n\n this.sendSyncData = function sendSyncData(data) {\n var attempt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n return self.send('sync', data).then(resolve).catch(function (err) {\n if (self.isConnectivityError(err) && attempt < maxSyncAttempts) {\n return self.sendSyncData(data, attempt + 1).then(resolve).catch(reject);\n }\n\n return reject(err);\n });\n });\n };\n /**\n * Flush and synchronize actions collected while offline\n *\n * @returns {Promise} resolves with the action result\n */\n\n\n this.syncData = function syncData() {\n var actions;\n this.syncInProgress = true;\n return this.queue.serie(function () {\n return self.actionStore.flush().then(function (data) {\n actions = data;\n\n if (data && data.length) {\n return self.sendSyncData(data);\n }\n }).catch(function (err) {\n if (self.isConnectivityError(err)) {\n self.setOffline('communicator');\n\n _.forEach(actions, function (action) {\n self.actionStore.push(action.action, action.parameters, action.timestamp);\n });\n\n return;\n }\n\n self.syncInProgress = false;\n self.trigger('error', err);\n throw err;\n }).then(function (data) {\n self.syncInProgress = false;\n return data;\n });\n });\n };\n\n this.prepareDownload = function prepareDownload(actions) {\n var timestamp = Date.now();\n var dateTime = new Date(timestamp).toISOString(); //@deprecated\n\n var testData = self.getDataHolder().get('testData');\n var testMap = self.getDataHolder().get('testMap');\n var niceFilename = \"Download of \".concat(testMap.title, \" at \").concat(dateTime, \".json\");\n var isExitTest = actions.some(function (elem) {\n return elem.action === 'exitTest';\n });\n return {\n filename: niceFilename,\n content: JSON.stringify({\n isExitTest: isExitTest,\n timestamp: timestamp,\n testData: testData,\n actionQueue: actions,\n testConfig: self.requestConfig\n })\n };\n };\n\n this.initiateDownload = function initiateDownload() {\n return this.queue.serie(function () {\n return self.actionStore.flush().then(function (actions) {\n _.forEach(actions, function (action) {\n self.actionStore.push(action.action, action.parameters, action.timestamp);\n });\n\n return actions;\n }).then(self.prepareDownload).then(function (data) {\n return download(data.filename, data.content);\n });\n });\n };\n },\n\n /**\n * Initializes the proxy\n *\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n var self = this; // run the init\n\n var InitCallPromise = qtiServiceProxy.init.call(this, config, params);\n\n if (!this.getDataHolder()) {\n throw new Error('Unable to retrieve test runners data holder');\n } // those needs to be in each request params.\n\n\n this.requestConfig = _.pick(config, ['testDefinition', 'testCompilation', 'serviceCallId']); // set up the action store for the current service call\n\n this.actionStore = actionStoreFactory(config.serviceCallId); // stop error event propagation if sync is in progress\n\n this.before('error', function (e, error) {\n if (self.isConnectivityError(error) && self.syncInProgress) {\n return false;\n }\n\n return true;\n });\n return InitCallPromise.then(function (response) {\n var promises = [];\n\n if (!response.items) {\n response.items = {};\n }\n\n self.itemStore.setCacheSize(_.size(response.items));\n\n _.forEach(response.items, function (item, itemIdentifier) {\n promises.push(self.itemStore.set(itemIdentifier, item));\n });\n\n return Promise.all(promises).then(function () {\n return self.offlineNavigator.setTestContext(response.testContext).setTestMap(response.testMap).init();\n }).then(function () {\n return response;\n });\n });\n },\n\n /**\n * Uninstalls the proxy\n *\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n var self = this;\n return this.itemStore.clear().then(function () {\n return qtiServiceProxy.destroy.call(self);\n });\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n *\n * @param {String} itemIdentifier\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier) {\n return this.itemStore.get(itemIdentifier);\n },\n\n /**\n * Submits the state and the response of a particular item\n *\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var self = this;\n return this.itemStore.update(itemIdentifier, 'itemState', state).then(function () {\n return qtiServiceProxy.submitItem.call(self, itemIdentifier, state, response, params);\n });\n },\n\n /**\n * Sends the test variables\n *\n * @param {Object} variables\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables) {\n var self = this,\n action = 'storeTraceData',\n actionParams = {\n traceData: JSON.stringify(variables)\n };\n return self.scheduleAction(action, actionParams).then(function () {\n return self.offlineAction(action, actionParams);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n },\n\n /**\n * Calls an action related to the test\n *\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n var self = this;\n return self.scheduleAction(action, params).then(function () {\n return self.offlineAction(action, params);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n },\n\n /**\n * Calls an action related to a particular item\n *\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n var self = this,\n updateStatePromise = Promise.resolve(); //update the item state\n\n if (params.itemState) {\n updateStatePromise = this.itemStore.update(itemIdentifier, 'itemState', params.itemState);\n } // If item action is move to another item ensure the next request will start the timer\n\n\n if (navigationHelper.isMovingToNextItem(action, params) || navigationHelper.isMovingToPreviousItem(action, params) || navigationHelper.isJumpingToItem(action, params)) {\n params.start = true;\n }\n\n return updateStatePromise.then(function () {\n params = _.assign({\n itemDefinition: itemIdentifier\n }, params);\n return self.scheduleAction(action, params).then(function () {\n return self.offlineAction(action, params);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n }, qtiServiceProxy);\n\n return proxy;\n\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.qti-navigator{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator span{display:inline-block}.qti-navigator .collapsed .collapsible-panel{display:none !important}.qti-navigator .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator .collapsible>.qti-navigator-label,.qti-navigator .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator .qti-navigator-label .icon-up,.qti-navigator .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator .qti-navigator-label .icon-down{display:none}.qti-navigator .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator .qti-navigator-icon,.qti-navigator .icon{position:relative;top:1px;display:inline-block;width:2rem;line-height:2.8rem}.qti-navigator .unseen .qti-navigator-icon{cursor:default}.qti-navigator.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator .icon-answered:before{content:\\\"\\\\e69a\\\"}.qti-navigator .icon-viewed:before{content:\\\"\\\\e631\\\"}.qti-navigator .icon-flagged:before{content:\\\"\\\\e64e\\\"}.qti-navigator .icon-unanswered:before,.qti-navigator .icon-unseen:before{content:\\\"\\\\e6a5\\\"}.qti-navigator .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator .qti-navigator-actions{text-align:center}.qti-navigator .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator .qti-navigator-info{height:calc(5 * (3rem + 1px));overflow:hidden}.qti-navigator .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator .qti-navigator-info ul{padding:0 4px}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator .qti-navigator-filters li{display:block}.qti-navigator .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator .qti-navigator-linear,.qti-navigator .qti-navigator-linear-part{padding:8px}.qti-navigator .qti-navigator-linear .icon,.qti-navigator .qti-navigator-linear-part .icon{display:none}.qti-navigator .qti-navigator-linear .qti-navigator-label,.qti-navigator .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator .qti-navigator-linear .qti-navigator-title,.qti-navigator .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator .qti-navigator-linear .qti-navigator-message,.qti-navigator .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator .qti-navigator-item:first-child{margin-top:0}.qti-navigator .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator.collapsible .qti-navigator-collapsible{display:block}.qti-navigator.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator.collapsed ul{padding:0 !important}.qti-navigator.collapsed .qti-navigator-text,.qti-navigator.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-message{display:none !important}.qti-navigator.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator.collapsed .qti-navigator-icon,.qti-navigator.collapsed .icon{width:auto}.qti-navigator.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator.collapsed .qti-navigator-info{height:calc(4 * (3rem + 1px))}.qti-navigator.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator.collapsed .qti-navigator-filter span{display:none}.qti-navigator.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator.collapsed .qti-navigator-item,.qti-navigator.collapsed .qti-navigator-linear,.qti-navigator.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator.collapsed .qti-navigator-linear,.qti-navigator.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator.collapsed .qti-navigator-linear .icon,.qti-navigator.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator .qti-navigator-info>.qti-navigator-label{background-color:#D4D5D7;color:#222;border-top:1px solid #D4D5D7}.qti-navigator .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator .qti-navigator-linear,.qti-navigator .qti-navigator-linear-part{background:#fff}.qti-navigator .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator .qti-navigator-item{background:#fff}.qti-navigator .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator .qti-navigator-collapsible .icon{color:#fff}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:\\'tao\\' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\\e643\\\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:\\'tao\\' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\\e631\\\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:transparent}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:transparent;border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent;opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,0.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,0.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:transparent;border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:transparent;border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,0.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0E5D91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,0.8);border-color:rgba(14,93,145,0.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0E5D91;border-bottom:2px solid #0E5D91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0E5D91;border-bottom:1px solid #0E5D91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0E5D91;border-bottom:1px solid #0E5D91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0E5D91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:transparent;border:1px solid rgba(14,93,145,0.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,0.8);background-color:transparent;position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0E5D91;color:#0E5D91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0E5D91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:transparent;color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0E5D91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0E5D91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:transparent}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:transparent;border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:transparent;color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\\\"x\\\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:transparent}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,0.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:0.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-ms-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-o-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);box-shadow:0 2px 3px 1px rgba(0,0,0,0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:transparent}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-o-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-o-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:transparent}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:transparent !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:0.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px transparent}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=\\\"exit\\\"]{margin-left:20px}.test-runner-scope [data-control=\\\"comment-toggle\\\"]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=\\\"qti-comment\\\"]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-moz-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-ms-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-o-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);box-shadow:0 0 15px 1px rgba(0,0,0,0.2)}.test-runner-scope [data-control=\\\"qti-comment\\\"] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=\\\"feedback-\\\"].small,body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=\\\"feedback-\\\"].small>[class^=\\\"icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class^=\\\"feedback-\\\"].small>[class*=\\\" icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class^=\\\"icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class*=\\\" icon-\\\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:\\' \\'}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,0.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276D9B;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:transparent;box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276D9B;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\\n\\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */');\n","\ndefine(\"taoQtiTest/loader/taoQtiTestRunner.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\"]);\n"]} |