{"version":3,"file":"prefix-730.47cf8a43b281f2a7.bundle.js","mappings":"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","sources":["webpack://WebComponents/./runestone/parsons/js/hammer.min.js","webpack://WebComponents/./runestone/parsons/js/parsons-i18n.en.js","webpack://WebComponents/./runestone/parsons/js/parsons-i18n.pt-br.js","webpack://WebComponents/./runestone/parsons/js/prettify.js","webpack://WebComponents/./runestone/parsons/js/lineGrader.js","webpack://WebComponents/./runestone/parsons/js/dagHelpers.js","webpack://WebComponents/./runestone/parsons/js/dagGrader.js","webpack://WebComponents/./runestone/parsons/js/parsonsLine.js","webpack://WebComponents/./runestone/parsons/js/parsonsBlock.js","webpack://WebComponents/./runestone/parsons/js/parsons.js","webpack://WebComponents/./runestone/parsons/js/timedparsons.js"],"sourcesContent":["/*! Hammer.JS - v2.0.8 - 2016-04-23\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n!function(a,b,c,d){\"use strict\";function e(a,b,c){return setTimeout(j(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function h(b,c,d){var e=\"DEPRECATED METHOD: \"+c+\"\\n\"+d+\" AT \\n\";return function(){var c=new Error(\"get-stack-trace\"),d=c&&c.stack?c.stack.replace(/^[^\\(]+?[\\n$]/gm,\"\").replace(/^\\s+at\\s+/gm,\"\").replace(/^Object.<anonymous>\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function s(a){return Array.prototype.slice.call(a,0)}function t(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];r(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g<ma.length;){if(c=ma[g],e=c?c+f:b,e in a)return e;g++}return d}function v(){return ua++}function w(b){var c=b.ownerDocument||b;return c.defaultView||c.parentWindow||a}function x(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){k(a.options.enable,[a])&&c.handler(b)},this.init()}function y(a){var b,c=a.options.inputClass;return new(b=c?c:xa?M:ya?P:wa?R:L)(a,z)}function z(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&Ea&&d-e===0,g=b&(Ga|Ha)&&d-e===0;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,A(a,c),a.emit(\"hammer.input\",c),a.recognize(c),a.session.prevInput=c}function A(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=D(b)),e>1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:pa(a.pointers[c].clientX),clientY:pa(a.pointers[c].clientY)},c++;return{timeStamp:ra(),pointers:b,center:E(b),deltaX:a.deltaX,deltaY:a.deltaY}}function E(a){var b=a.length;if(1===b)return{x:pa(a[0].clientX),y:pa(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(a,b,c){return{x:b/a||0,y:c/a||0}}function G(a,b){return a===b?Ia:qa(a)>=qa(b)?0>a?Ja:Ka:0>b?La:Ma}function H(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function I(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function J(a,b){return I(b[1],b[0],Ra)+I(a[1],a[0],Ra)}function K(a,b){return H(b[0],b[1],Ra)/H(a[0],a[1],Ra)}function L(){this.evEl=Ta,this.evWin=Ua,this.pressed=!1,x.apply(this,arguments)}function M(){this.evEl=Xa,this.evWin=Ya,x.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function N(){this.evTarget=$a,this.evWin=_a,this.started=!1,x.apply(this,arguments)}function O(a,b){var c=s(a.touches),d=s(a.changedTouches);return b&(Ga|Ha)&&(c=t(c.concat(d),\"identifier\",!0)),[c,d]}function P(){this.evTarget=bb,this.targetIds={},x.apply(this,arguments)}function Q(a,b){var c=s(a.touches),d=this.targetIds;if(b&(Ea|Fa)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=s(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return o(a.target,i)}),b===Ea)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Ga|Ha)&&delete d[g[e].identifier],e++;return h.length?[t(f.concat(h),\"identifier\",!0),h]:void 0}function R(){x.apply(this,arguments);var a=j(this.handler,this);this.touch=new P(this.manager,a),this.mouse=new L(this.manager,a),this.primaryTouch=null,this.lastTouches=[]}function S(a,b){a&Ea?(this.primaryTouch=b.changedPointers[0].identifier,T.call(this,b)):a&(Ga|Ha)&&T.call(this,b)}function T(a){var b=a.changedPointers[0];if(b.identifier===this.primaryTouch){var c={x:b.clientX,y:b.clientY};this.lastTouches.push(c);var d=this.lastTouches,e=function(){var a=d.indexOf(c);a>-1&&d.splice(a,1)};setTimeout(e,cb)}}function U(a){for(var b=a.srcEvent.clientX,c=a.srcEvent.clientY,d=0;d<this.lastTouches.length;d++){var e=this.lastTouches[d],f=Math.abs(b-e.x),g=Math.abs(c-e.y);if(db>=f&&db>=g)return!0}return!1}function V(a,b){this.manager=a,this.set(b)}function W(a){if(p(a,jb))return jb;var b=p(a,kb),c=p(a,lb);return b&&c?jb:b||c?b?kb:lb:p(a,ib)?ib:hb}function X(){if(!fb)return!1;var b={},c=a.CSS&&a.CSS.supports;return[\"auto\",\"manipulation\",\"pan-y\",\"pan-x\",\"pan-x pan-y\",\"none\"].forEach(function(d){b[d]=c?a.CSS.supports(\"touch-action\",d):!0}),b}function Y(a){this.options=la({},this.defaults,a||{}),this.id=v(),this.manager=null,this.options.enable=l(this.options.enable,!0),this.state=nb,this.simultaneous={},this.requireFail=[]}function Z(a){return a&sb?\"cancel\":a&qb?\"end\":a&pb?\"move\":a&ob?\"start\":\"\"}function $(a){return a==Ma?\"down\":a==La?\"up\":a==Ja?\"left\":a==Ka?\"right\":\"\"}function _(a,b){var c=b.manager;return c?c.get(a):a}function aa(){Y.apply(this,arguments)}function ba(){aa.apply(this,arguments),this.pX=null,this.pY=null}function ca(){aa.apply(this,arguments)}function da(){Y.apply(this,arguments),this._timer=null,this._input=null}function ea(){aa.apply(this,arguments)}function fa(){aa.apply(this,arguments)}function ga(){Y.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ha(a,b){return b=b||{},b.recognizers=l(b.recognizers,ha.defaults.preset),new ia(a,b)}function ia(a,b){this.options=la({},ha.defaults,b||{}),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=a,this.input=y(this),this.touchAction=new V(this,this.options.touchAction),ja(this,!0),g(this.options.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ja(a,b){var c=a.element;if(c.style){var d;g(a.options.cssProps,function(e,f){d=u(c.style,f),b?(a.oldCssProps[d]=c.style[d],c.style[d]=e):c.style[d]=a.oldCssProps[d]||\"\"}),b||(a.oldCssProps={})}}function ka(a,c){var d=b.createEvent(\"Event\");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var la,ma=[\"\",\"webkit\",\"Moz\",\"MS\",\"ms\",\"o\"],na=b.createElement(\"div\"),oa=\"function\",pa=Math.round,qa=Math.abs,ra=Date.now;la=\"function\"!=typeof Object.assign?function(a){if(a===d||null===a)throw new TypeError(\"Cannot convert undefined or null to object\");for(var b=Object(a),c=1;c<arguments.length;c++){var e=arguments[c];if(e!==d&&null!==e)for(var f in e)e.hasOwnProperty(f)&&(b[f]=e[f])}return b}:Object.assign;var sa=h(function(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a},\"extend\",\"Use `assign`.\"),ta=h(function(a,b){return sa(a,b,!0)},\"merge\",\"Use `assign`.\"),ua=1,va=/mobile|tablet|ip(ad|hone|od)|android/i,wa=\"ontouchstart\"in a,xa=u(a,\"PointerEvent\")!==d,ya=wa&&va.test(navigator.userAgent),za=\"touch\",Aa=\"pen\",Ba=\"mouse\",Ca=\"kinect\",Da=25,Ea=1,Fa=2,Ga=4,Ha=8,Ia=1,Ja=2,Ka=4,La=8,Ma=16,Na=Ja|Ka,Oa=La|Ma,Pa=Na|Oa,Qa=[\"x\",\"y\"],Ra=[\"clientX\",\"clientY\"];x.prototype={handler:function(){},init:function(){this.evEl&&m(this.element,this.evEl,this.domHandler),this.evTarget&&m(this.target,this.evTarget,this.domHandler),this.evWin&&m(w(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&n(this.element,this.evEl,this.domHandler),this.evTarget&&n(this.target,this.evTarget,this.domHandler),this.evWin&&n(w(this.element),this.evWin,this.domHandler)}};var Sa={mousedown:Ea,mousemove:Fa,mouseup:Ga},Ta=\"mousedown\",Ua=\"mousemove mouseup\";i(L,x,{handler:function(a){var b=Sa[a.type];b&Ea&&0===a.button&&(this.pressed=!0),b&Fa&&1!==a.which&&(b=Ga),this.pressed&&(b&Ga&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:Ba,srcEvent:a}))}});var Va={pointerdown:Ea,pointermove:Fa,pointerup:Ga,pointercancel:Ha,pointerout:Ha},Wa={2:za,3:Aa,4:Ba,5:Ca},Xa=\"pointerdown\",Ya=\"pointermove pointerup pointercancel\";a.MSPointerEvent&&!a.PointerEvent&&(Xa=\"MSPointerDown\",Ya=\"MSPointerMove MSPointerUp MSPointerCancel\"),i(M,x,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace(\"ms\",\"\"),e=Va[d],f=Wa[a.pointerType]||a.pointerType,g=f==za,h=r(b,a.pointerId,\"pointerId\");e&Ea&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Ga|Ha)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Za={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},$a=\"touchstart\",_a=\"touchstart touchmove touchend touchcancel\";i(N,x,{handler:function(a){var b=Za[a.type];if(b===Ea&&(this.started=!0),this.started){var c=O.call(this,a,b);b&(Ga|Ha)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}}});var ab={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},bb=\"touchstart touchmove touchend touchcancel\";i(P,x,{handler:function(a){var b=ab[a.type],c=Q.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}});var cb=2500,db=25;i(R,x,{handler:function(a,b,c){var d=c.pointerType==za,e=c.pointerType==Ba;if(!(e&&c.sourceCapabilities&&c.sourceCapabilities.firesTouchEvents)){if(d)S.call(this,b,c);else if(e&&U.call(this,c))return;this.callback(a,b,c)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var eb=u(na.style,\"touchAction\"),fb=eb!==d,gb=\"compute\",hb=\"auto\",ib=\"manipulation\",jb=\"none\",kb=\"pan-x\",lb=\"pan-y\",mb=X();V.prototype={set:function(a){a==gb&&(a=this.compute()),fb&&this.manager.element.style&&mb[a]&&(this.manager.element.style[eb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){k(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),W(a.join(\" \"))},preventDefaults:function(a){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=p(d,jb)&&!mb[jb],f=p(d,lb)&&!mb[lb],g=p(d,kb)&&!mb[kb];if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}return g&&f?void 0:e||f&&c&Na||g&&c&Oa?this.preventSrc(b):void 0},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var nb=1,ob=2,pb=4,qb=8,rb=qb,sb=16,tb=32;Y.prototype={defaults:{},set:function(a){return la(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,\"recognizeWith\",this))return this;var b=this.simultaneous;return a=_(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,\"dropRecognizeWith\",this)?this:(a=_(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,\"requireFailure\",this))return this;var b=this.requireFail;return a=_(a,this),-1===r(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,\"dropRequireFailure\",this))return this;a=_(a,this);var b=r(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;qb>d&&b(c.options.event+Z(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=qb&&b(c.options.event+Z(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=tb)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(tb|nb)))return!1;a++}return!0},recognize:function(a){var b=la({},a);return k(this.options.enable,[this,b])?(this.state&(rb|sb|tb)&&(this.state=nb),this.state=this.process(b),void(this.state&(ob|pb|qb|sb)&&this.tryEmit(b))):(this.reset(),void(this.state=tb))},process:function(a){},getTouchAction:function(){},reset:function(){}},i(aa,Y,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(ob|pb),e=this.attrTest(a);return d&&(c&Ha||!e)?b|sb:d||e?c&Ga?b|qb:b&ob?b|pb:ob:tb}}),i(ba,aa,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:Pa},getTouchAction:function(){var a=this.options.direction,b=[];return a&Na&&b.push(lb),a&Oa&&b.push(kb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&Na?(e=0===f?Ia:0>f?Ja:Ka,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ia:0>g?La:Ma,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return aa.prototype.attrTest.call(this,a)&&(this.state&ob||!(this.state&ob)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),i(ca,aa,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&ob)},emit:function(a){if(1!==a.scale){var b=a.scale<1?\"in\":\"out\";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),i(da,Y,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[hb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Ga|Ha)&&!f)this.reset();else if(a.eventType&Ea)this.reset(),this._timer=e(function(){this.state=rb,this.tryEmit()},b.time,this);else if(a.eventType&Ga)return rb;return tb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===rb&&(a&&a.eventType&Ga?this.manager.emit(this.options.event+\"up\",a):(this._input.timeStamp=ra(),this.manager.emit(this.options.event,this._input)))}}),i(ea,aa,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&ob)}}),i(fa,aa,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:Na|Oa,pointers:1},getTouchAction:function(){return ba.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Na|Oa)?b=a.overallVelocity:c&Na?b=a.overallVelocityX:c&Oa&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&qa(b)>this.options.velocity&&a.eventType&Ga},emit:function(a){var b=$(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),i(ga,Y,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ib]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime<b.time;if(this.reset(),a.eventType&Ea&&0===this.count)return this.failTimeout();if(d&&f&&c){if(a.eventType!=Ga)return this.failTimeout();var g=this.pTime?a.timeStamp-this.pTime<b.interval:!0,h=!this.pCenter||H(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,h&&g?this.count+=1:this.count=1,this._input=a;var i=this.count%b.taps;if(0===i)return this.hasRequireFailures()?(this._timer=e(function(){this.state=rb,this.tryEmit()},b.interval,this),ob):rb}return tb},failTimeout:function(){return this._timer=e(function(){this.state=tb},this.options.interval,this),tb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==rb&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),ha.VERSION=\"2.0.8\",ha.defaults={domEvents:!1,touchAction:gb,enable:!0,inputTarget:null,inputClass:null,preset:[[ea,{enable:!1}],[ca,{enable:!1},[\"rotate\"]],[fa,{direction:Na}],[ba,{direction:Na},[\"swipe\"]],[ga],[ga,{event:\"doubletap\",taps:2},[\"tap\"]],[da]],cssProps:{userSelect:\"none\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};var ub=1,vb=2;ia.prototype={set:function(a){return la(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?vb:ub},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&rb)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===vb||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(ob|pb|qb)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof Y)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(f(a,\"add\",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(f(a,\"remove\",this))return this;if(a=this.get(a)){var b=this.recognizers,c=r(b,a);-1!==c&&(b.splice(c,1),this.touchAction.update())}return this},on:function(a,b){if(a!==d&&b!==d){var c=this.handlers;return g(q(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this}},off:function(a,b){if(a!==d){var c=this.handlers;return g(q(a),function(a){b?c[a]&&c[a].splice(r(c[a],b),1):delete c[a]}),this}},emit:function(a,b){this.options.domEvents&&ka(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&ja(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},la(ha,{INPUT_START:Ea,INPUT_MOVE:Fa,INPUT_END:Ga,INPUT_CANCEL:Ha,STATE_POSSIBLE:nb,STATE_BEGAN:ob,STATE_CHANGED:pb,STATE_ENDED:qb,STATE_RECOGNIZED:rb,STATE_CANCELLED:sb,STATE_FAILED:tb,DIRECTION_NONE:Ia,DIRECTION_LEFT:Ja,DIRECTION_RIGHT:Ka,DIRECTION_UP:La,DIRECTION_DOWN:Ma,DIRECTION_HORIZONTAL:Na,DIRECTION_VERTICAL:Oa,DIRECTION_ALL:Pa,Manager:ia,Input:x,TouchAction:V,TouchInput:P,MouseInput:L,PointerEventInput:M,TouchMouseInput:R,SingleTouchInput:N,Recognizer:Y,AttrRecognizer:aa,Tap:ga,Pan:ba,Swipe:fa,Pinch:ca,Rotate:ea,Press:da,on:m,off:n,each:g,merge:ta,extend:sa,assign:la,inherit:i,bindFn:j,prefixed:u});var wb=\"undefined\"!=typeof a?a:\"undefined\"!=typeof self?self:{};wb.Hammer=ha,\"function\"==typeof define&&define.amd?define(function(){return ha}):\"undefined\"!=typeof module&&module.exports?module.exports=ha:a[c]=ha}(window,document,\"Hammer\");\n//# sourceMappingURL=hammer.min.js.map","$.i18n().load({\n    en: {\n        msg_parson_check_me: \"Check\",\n        msg_parson_reset: \"Reset\",\n        msg_parson_help: \"Help me\",\n        msg_parson_too_short: \"Your answer is too short. Add more blocks.\",\n        msg_parson_drag_from_here: \"Drag from here\",\n        msg_parson_drag_to_here: \"Drop blocks here\",\n        msg_parson_correct_first_try:\n            \"Perfect!  It took you only one try to solve this.  Great job!\",\n        msg_parson_correct:\n            \"Perfect!  It took you $1 tries to solve this.  Click Reset to try to solve it in one attempt.\",\n        msg_parson_wrong_indent:\n            \"This block is not indented correctly. Either indent it more by dragging it right or reduce the indention by dragging it left.\",\n        msg_parson_wrong_indents:\n            \"These blocks are not indented correctly. To indent a block more, drag it to the right. To reduce the indention, drag it to the left.\",\n        msg_parson_wrong_order:\n            \"Highlighted blocks in your answer are wrong or are in the wrong order. This can be fixed by moving, removing, or replacing highlighted blocks.\",\n        msg_parson_arrow_navigate:\n            \"Arrow keys to navigate. Space to select / deselect block to move.\",\n        msg_parson_help_info:\n            \"Click on the Help Me button if you want to make the problem easier\",\n        msg_parson_not_solution:\n            \"Disabled an unneeded code block (one that is not part of the solution).\",\n        msg_parson_provided_indent: \"Provided the indentation.\",\n        msg_parson_combined_blocks: \"Combined two code blocks into one.\",\n        msg_parson_remove_incorrect:\n            \"Will remove an incorrect code block from answer area\",\n        msg_parson_will_combine: \"Will combine two blocks\",\n        msg_parson_atleast_three_attempts:\n            \"You must make at least three distinct full attempts at a solution before you can get help\",\n        msg_parson_three_blocks_left:\n            \"There are only 3 correct blocks left.  You should be able to put them in order\",\n        msg_parson_will_provide_indent: \"Will provide indentation\",\n    },\n});\n","$.i18n().load({\n    \"pt-br\": {\n        msg_parson_check_me: \"Verificar\",\n        msg_parson_reset: \"Resetar\",\n        msg_parson_help:\"Ajuda\",\n        msg_parson_too_short: \"Seu programa é muito curto. Adicione mais blocos.\",\n        msg_parson_drag_from_here: \"Arraste daqui\",\n        msg_parson_drag_to_here: \"Largue os blocos aqui\",\n        msg_parson_correct_first_try:\n            \"Perfeito! Você levou apenas uma tentativa para resolver. Bom trabalho!\",\n        msg_parson_correct:\n            \"Perfeito! Você levou $1 tentativas para resolver. Clique em Resetar para tentar resolver em uma tentativa.\" ,\n        msg_parson_wrong_indent:\n            \"Este bloco não está indentado corretamente. Indente mais arrastando-o para a direita ou reduza a indentação arrastando para a esquerda.\",\n        msg_parson_wrong_indents:\n            \"Estes blocos não estão indentados corretamente. Para indentar mais, arraste o bloco para a direita. Para reduzir a indentação, arraste para a esquerda.\",\n        msg_parson_wrong_order:\n            \"Blocos destacados no seu programa estão errados ou estão na ordem errada. Isso pode ser resolvido movendo, excluindo ou substituindo os blocos destacados.\",\n        msg_parson_arrow_navigate:\n            \"Use as teclas de setas para navegar. Espaço para selecionar/ desmarcar blocos para mover.\",\n        msg_parson_help_info:\n            \"Clique no botão Ajuda se você quiser facilitar o problema\",\n        msg_parson_not_solution:\n            \"Foi desabilitado um bloco de código desnecessário (que não faz parte da solução).\",\n        msg_parson_provided_indent:\"Foi fornecida a indentação.\",\n        msg_parson_combined_blocks:\"Dois blocos de códigos foram combinados em um.\",\n        msg_parson_remove_incorrect:\n            \"Será removido um bloco de código incorreto da área de resposta\",\n        msg_parson_will_combine:\"Serão combinados dois blocos\",\n        msg_parson_atleast_three_attempts:\n            \"Você deve tentar pelo menos três vezes antes de pedir ajuda\",\n        msg_parson_three_blocks_left:\n            \"Restam apenas 3 blocos corretos. Você deve colocá-los em ordem\",\n        msg_parson_will_provide_indent: \"Será fornecida a indentação\"\n    },\n});\n","function H() {\n    var x =\n        navigator &&\n        navigator.userAgent &&\n        /\\bMSIE 6\\./.test(navigator.userAgent);\n    H = function() {\n        return x;\n    };\n    return x;\n}\n(function() {\n    function x(b) {\n        b = b.split(/ /g);\n        var a = {};\n        for (var c = b.length; --c >= 0; ) {\n            var d = b[c];\n            if (d) a[d] = null;\n        }\n        return a;\n    }\n    var y = \"break continue do else for if return while \",\n        U =\n            y +\n            \"auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile \",\n        D =\n            U +\n            \"catch class delete false import new operator private protected public this throw true try \",\n        I =\n            D +\n            \"alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where \",\n        J =\n            D +\n            \"boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient \",\n        V =\n            J +\n            \"as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var \",\n        K =\n            D +\n            \"debugger eval export function get null set undefined var with Infinity NaN \",\n        L =\n            \"caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END \",\n        M =\n            y +\n            \"and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None \",\n        N =\n            y +\n            \"alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END \",\n        O = y + \"case done elif esac eval fi function in local set then until \",\n        W = I + V + K + L + M + N + O;\n    function X(b) {\n        return (b >= \"a\" && b <= \"z\") || (b >= \"A\" && b <= \"Z\");\n    }\n    function u(b, a, c, d) {\n        b.unshift(c, d || 0);\n        try {\n            a.splice.apply(a, b);\n        } finally {\n            b.splice(0, 2);\n        }\n    }\n    var Y = (function() {\n            var b = [\n                    \"!\",\n                    \"!=\",\n                    \"!==\",\n                    \"#\",\n                    \"%\",\n                    \"%=\",\n                    \"&\",\n                    \"&&\",\n                    \"&&=\",\n                    \"&=\",\n                    \"(\",\n                    \"*\",\n                    \"*=\",\n                    \"+=\",\n                    \",\",\n                    \"-=\",\n                    \"->\",\n                    \"/\",\n                    \"/=\",\n                    \":\",\n                    \"::\",\n                    \";\",\n                    \"<\",\n                    \"<<\",\n                    \"<<=\",\n                    \"<=\",\n                    \"=\",\n                    \"==\",\n                    \"===\",\n                    \">\",\n                    \">=\",\n                    \">>\",\n                    \">>=\",\n                    \">>>\",\n                    \">>>=\",\n                    \"?\",\n                    \"@\",\n                    \"[\",\n                    \"^\",\n                    \"^=\",\n                    \"^^\",\n                    \"^^=\",\n                    \"{\",\n                    \"|\",\n                    \"|=\",\n                    \"||\",\n                    \"||=\",\n                    \"~\",\n                    \"break\",\n                    \"case\",\n                    \"continue\",\n                    \"delete\",\n                    \"do\",\n                    \"else\",\n                    \"finally\",\n                    \"instanceof\",\n                    \"return\",\n                    \"throw\",\n                    \"try\",\n                    \"typeof\"\n                ],\n                a =\n                    \"(?:(?:(?:^|[^0-9.])\\\\.{1,3})|(?:(?:^|[^\\\\+])\\\\+)|(?:(?:^|[^\\\\-])-)\";\n            for (var c = 0; c < b.length; ++c) {\n                var d = b[c];\n                a += X(d.charAt(0))\n                    ? \"|\\\\b\" + d\n                    : \"|\" + d.replace(/([^=<>:&])/g, \"\\\\$1\");\n            }\n            a += \"|^)\\\\s*$\";\n            return new RegExp(a);\n        })(),\n        P = /&/g,\n        Q = /</g,\n        R = />/g,\n        Z = /\\\"/g;\n    function $(b) {\n        return b\n            .replace(P, \"&amp;\")\n            .replace(Q, \"&lt;\")\n            .replace(R, \"&gt;\")\n            .replace(Z, \"&quot;\");\n    }\n    function E(b) {\n        return b\n            .replace(P, \"&amp;\")\n            .replace(Q, \"&lt;\")\n            .replace(R, \"&gt;\");\n    }\n    var aa = /&lt;/g,\n        ba = /&gt;/g,\n        ca = /&apos;/g,\n        da = /&quot;/g,\n        ea = /&amp;/g,\n        fa = /&nbsp;/g;\n    function ga(b) {\n        var a = b.indexOf(\"&\");\n        if (a < 0) return b;\n        for (--a; (a = b.indexOf(\"&#\", a + 1)) >= 0; ) {\n            var c = b.indexOf(\";\", a);\n            if (c >= 0) {\n                var d = b.substring(a + 3, c),\n                    g = 10;\n                if (d && d.charAt(0) === \"x\") {\n                    d = d.substring(1);\n                    g = 16;\n                }\n                var e = parseInt(d, g);\n                if (!isNaN(e))\n                    b =\n                        b.substring(0, a) +\n                        String.fromCharCode(e) +\n                        b.substring(c + 1);\n            }\n        }\n        return b\n            .replace(aa, \"<\")\n            .replace(ba, \">\")\n            .replace(ca, \"'\")\n            .replace(da, '\"')\n            .replace(ea, \"&\")\n            .replace(fa, \" \");\n    }\n    function S(b) {\n        return \"XMP\" === b.tagName;\n    }\n    function z(b, a) {\n        switch (b.nodeType) {\n            case 1:\n                var c = b.tagName.toLowerCase();\n                a.push(\"<\", c);\n                for (var d = 0; d < b.attributes.length; ++d) {\n                    var g = b.attributes[d];\n                    if (!g.specified) continue;\n                    a.push(\" \");\n                    z(g, a);\n                }\n                a.push(\">\");\n                for (var e = b.firstChild; e; e = e.nextSibling) z(e, a);\n                if (b.firstChild || !/^(?:br|link|img)$/.test(c))\n                    a.push(\"</\", c, \">\");\n                break;\n            case 2:\n                a.push(b.name.toLowerCase(), '=\"', $(b.value), '\"');\n                break;\n            case 3:\n            case 4:\n                a.push(E(b.nodeValue));\n                break;\n        }\n    }\n    var F = null;\n    function ha(b) {\n        if (null === F) {\n            var a = document.createElement(\"PRE\");\n            a.appendChild(\n                document.createTextNode(\n                    '<!DOCTYPE foo PUBLIC \"foo bar\">\\n<foo />'\n                )\n            );\n            F = !/</.test(a.innerHTML);\n        }\n        if (F) {\n            var c = b.innerHTML;\n            if (S(b)) c = E(c);\n            return c;\n        }\n        var d = [];\n        for (var g = b.firstChild; g; g = g.nextSibling) z(g, d);\n        return d.join(\"\");\n    }\n    function ia(b) {\n        var a = 0;\n        return function(c) {\n            var d = null,\n                g = 0;\n            for (var e = 0, h = c.length; e < h; ++e) {\n                var f = c.charAt(e);\n                switch (f) {\n                    case \"\\t\":\n                        if (!d) d = [];\n                        d.push(c.substring(g, e));\n                        var i = b - (a % b);\n                        a += i;\n                        for (; i >= 0; i -= \"                \".length)\n                            d.push(\"                \".substring(0, i));\n                        g = e + 1;\n                        break;\n                    case \"\\n\":\n                        a = 0;\n                        break;\n                    default:\n                        ++a;\n                }\n            }\n            if (!d) return c;\n            d.push(c.substring(g));\n            return d.join(\"\");\n        };\n    }\n    var ja = /(?:[^<]+|<!--[\\s\\S]*?--\\>|<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>|<\\/?[a-zA-Z][^>]*>|<)/g,\n        ka = /^<!--/,\n        la = /^<\\[CDATA\\[/,\n        ma = /^<br\\b/i;\n    function na(b) {\n        var a = b.match(ja),\n            c = [],\n            d = 0,\n            g = [];\n        if (a)\n            for (var e = 0, h = a.length; e < h; ++e) {\n                var f = a[e];\n                if (f.length > 1 && f.charAt(0) === \"<\") {\n                    if (ka.test(f)) continue;\n                    if (la.test(f)) {\n                        c.push(f.substring(9, f.length - 3));\n                        d += f.length - 12;\n                    } else if (ma.test(f)) {\n                        c.push(\"\\n\");\n                        ++d;\n                    } else g.push(d, f);\n                } else {\n                    var i = ga(f);\n                    c.push(i);\n                    d += i.length;\n                }\n            }\n        return {\n            source: c.join(\"\"),\n            tags: g\n        };\n    }\n    function v(b, a) {\n        var c = {};\n        (function() {\n            var g = b.concat(a);\n            for (var e = g.length; --e >= 0; ) {\n                var h = g[e],\n                    f = h[3];\n                if (f) for (var i = f.length; --i >= 0; ) c[f.charAt(i)] = h;\n            }\n        })();\n        var d = a.length;\n        return function(g, e) {\n            e = e || 0;\n            var h = [e, \"pln\"],\n                f = \"\",\n                i = 0,\n                j = g;\n            while (j.length) {\n                var o,\n                    m = null,\n                    k,\n                    l = c[j.charAt(0)];\n                if (l) {\n                    k = j.match(l[1]);\n                    m = k[0];\n                    o = l[0];\n                } else {\n                    for (var n = 0; n < d; ++n) {\n                        l = a[n];\n                        var p = l[2];\n                        if (p && !p.test(f)) continue;\n                        k = j.match(l[1]);\n                        if (k) {\n                            m = k[0];\n                            o = l[0];\n                            break;\n                        }\n                    }\n                    if (!m) {\n                        o = \"pln\";\n                        m = j.substring(0, 1);\n                    }\n                }\n                h.push(e + i, o);\n                i += m.length;\n                j = j.substring(m.length);\n                if (o !== \"com\" && /\\S/.test(m)) f = m;\n            }\n            return h;\n        };\n    }\n    var oa = v(\n        [],\n        [\n            [\"pln\", /^[^<]+/, null],\n            [\"dec\", /^<!\\w[^>]*(?:>|$)/, null],\n            [\"com\", /^<!--[\\s\\S]*?(?:--\\>|$)/, null],\n            [\"src\", /^<\\?[\\s\\S]*?(?:\\?>|$)/, null],\n            [\"src\", /^<%[\\s\\S]*?(?:%>|$)/, null],\n            [\"src\", /^<(script|style|xmp)\\b[^>]*>[\\s\\S]*?<\\/\\1\\b[^>]*>/i, null],\n            [\"tag\", /^<\\/?\\w[^<>]*>/, null]\n        ]\n    );\n    function pa(b) {\n        var a = oa(b);\n        for (var c = 0; c < a.length; c += 2)\n            if (a[c + 1] === \"src\") {\n                var d, g;\n                d = a[c];\n                g = c + 2 < a.length ? a[c + 2] : b.length;\n                var e = b.substring(d, g),\n                    h = e.match(/^(<[^>]*>)([\\s\\S]*)(<\\/[^>]*>)$/);\n                if (h)\n                    a.splice(\n                        c,\n                        2,\n                        d,\n                        \"tag\",\n                        d + h[1].length,\n                        \"src\",\n                        d + h[1].length + (h[2] || \"\").length,\n                        \"tag\"\n                    );\n            }\n        return a;\n    }\n    var qa = v(\n        [\n            [\"atv\", /^\\'[^\\']*(?:\\'|$)/, null, \"'\"],\n            [\"atv\", /^\\\"[^\\\"]*(?:\\\"|$)/, null, '\"'],\n            [\"pun\", /^[<>\\/=]+/, null, \"<>/=\"]\n        ],\n        [\n            [\"tag\", /^[\\w:\\-]+/, /^</],\n            [\"atv\", /^[\\w\\-]+/, /^=/],\n            [\"atn\", /^[\\w:\\-]+/, null],\n            [\"pln\", /^\\s+/, null, \" \\t\\r\\n\"]\n        ]\n    );\n    function ra(b, a) {\n        for (var c = 0; c < a.length; c += 2) {\n            var d = a[c + 1];\n            if (d === \"tag\") {\n                var g, e;\n                g = a[c];\n                e = c + 2 < a.length ? a[c + 2] : b.length;\n                var h = b.substring(g, e),\n                    f = qa(h, g);\n                u(f, a, c, 2);\n                c += f.length - 2;\n            }\n        }\n        return a;\n    }\n    function r(b) {\n        var a = [],\n            c = [];\n        if (b.tripleQuotedStrings)\n            a.push([\n                \"str\",\n                /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n                null,\n                \"'\\\"\"\n            ]);\n        else if (b.multiLineStrings)\n            a.push([\n                \"str\",\n                /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n                null,\n                \"'\\\"`\"\n            ]);\n        else\n            a.push([\n                \"str\",\n                /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n                null,\n                \"\\\"'\"\n            ]);\n        c.push([\"pln\", /^(?:[^\\'\\\"\\`\\/\\#]+)/, null, \" \\r\\n\"]);\n        if (b.hashComments) a.push([\"com\", /^#[^\\r\\n]*/, null, \"#\"]);\n        if (b.cStyleComments) c.push([\"com\", /^\\/\\/[^\\r\\n]*/, null]);\n        if (b.regexLiterals)\n            c.push([\n                \"str\",\n                /^\\/(?:[^\\\\\\*\\/\\[]|\\\\[\\s\\S]|\\[(?:[^\\]\\\\]|\\\\.)*(?:\\]|$))+(?:\\/|$)/,\n                Y\n            ]);\n        if (b.cStyleComments) c.push([\"com\", /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n        var d = x(b.keywords);\n        b = null;\n        var g = v(a, c),\n            e = v(\n                [],\n                [\n                    [\"pln\", /^\\s+/, null, \" \\r\\n\"],\n                    [\"pln\", /^[a-z_$@][a-z_$@0-9]*/i, null],\n                    [\"lit\", /^0x[a-f0-9]+[a-z]/i, null],\n                    [\n                        \"lit\",\n                        /^(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d+)(?:e[+\\-]?\\d+)?[a-z]*/i,\n                        null,\n                        \"123456789\"\n                    ],\n                    [\"pun\", /^[^\\s\\w\\.$@]+/, null]\n                ]\n            );\n        function h(f, i) {\n            for (var j = 0; j < i.length; j += 2) {\n                var o = i[j + 1];\n                if (o === \"pln\") {\n                    var m, k, l, n;\n                    m = i[j];\n                    k = j + 2 < i.length ? i[j + 2] : f.length;\n                    l = f.substring(m, k);\n                    n = e(l, m);\n                    for (var p = 0, t = n.length; p < t; p += 2) {\n                        var w = n[p + 1];\n                        if (w === \"pln\") {\n                            var A = n[p],\n                                B = p + 2 < t ? n[p + 2] : l.length,\n                                s = f.substring(A, B);\n                            if (s === \".\") n[p + 1] = \"pun\";\n                            else if (s in d) n[p + 1] = \"kwd\";\n                            else if (/^@?[A-Z][A-Z$]*[a-z][A-Za-z$]*$/.test(s))\n                                n[p + 1] = s.charAt(0) === \"@\" ? \"lit\" : \"typ\";\n                        }\n                    }\n                    u(n, i, j, 2);\n                    j += n.length - 2;\n                }\n            }\n            return i;\n        }\n        return function(f) {\n            var i = g(f);\n            i = h(f, i);\n            return i;\n        };\n    }\n    var G = r({\n        keywords: W,\n        hashComments: true,\n        cStyleComments: true,\n        multiLineStrings: true,\n        regexLiterals: true\n    });\n    function sa(b, a) {\n        for (var c = 0; c < a.length; c += 2) {\n            var d = a[c + 1];\n            if (d === \"src\") {\n                var g, e;\n                g = a[c];\n                e = c + 2 < a.length ? a[c + 2] : b.length;\n                var h = G(b.substring(g, e));\n                for (var f = 0, i = h.length; f < i; f += 2) h[f] += g;\n                u(h, a, c, 2);\n                c += h.length - 2;\n            }\n        }\n        return a;\n    }\n    function ta(b, a) {\n        var c = false;\n        for (var d = 0; d < a.length; d += 2) {\n            var g = a[d + 1],\n                e,\n                h;\n            if (g === \"atn\") {\n                e = a[d];\n                h = d + 2 < a.length ? a[d + 2] : b.length;\n                c = /^on|^style$/i.test(b.substring(e, h));\n            } else if (g === \"atv\") {\n                if (c) {\n                    e = a[d];\n                    h = d + 2 < a.length ? a[d + 2] : b.length;\n                    var f = b.substring(e, h),\n                        i = f.length,\n                        j =\n                            i >= 2 &&\n                            /^[\\\"\\']/.test(f) &&\n                            f.charAt(0) === f.charAt(i - 1),\n                        o,\n                        m,\n                        k;\n                    if (j) {\n                        m = e + 1;\n                        k = h - 1;\n                        o = f;\n                    } else {\n                        m = e + 1;\n                        k = h - 1;\n                        o = f.substring(1, f.length - 1);\n                    }\n                    var l = G(o);\n                    for (var n = 0, p = l.length; n < p; n += 2) l[n] += m;\n                    if (j) {\n                        l.push(k, \"atv\");\n                        u(l, a, d + 2, 0);\n                    } else u(l, a, d, 2);\n                }\n                c = false;\n            }\n        }\n        return a;\n    }\n    function ua(b) {\n        var a = pa(b);\n        a = ra(b, a);\n        a = sa(b, a);\n        a = ta(b, a);\n        return a;\n    }\n    function va(b, a, c) {\n        var d = [],\n            g = 0,\n            e = null,\n            h = null,\n            f = 0,\n            i = 0,\n            j = ia(8);\n        function o(k) {\n            if (k > g) {\n                if (e && e !== h) {\n                    d.push(\"</span>\");\n                    e = null;\n                }\n                if (!e && h) {\n                    e = h;\n                    d.push('<span class=\"', e, '\">');\n                }\n                var l = E(j(b.substring(g, k)))\n                    .replace(/(\\r\\n?|\\n| ) /g, \"$1&nbsp;\")\n                    .replace(/\\r\\n?|\\n/g, \"<br />\");\n                d.push(l);\n                g = k;\n            }\n        }\n        while (true) {\n            var m;\n            m = f < a.length ? (i < c.length ? a[f] <= c[i] : true) : false;\n            if (m) {\n                o(a[f]);\n                if (e) {\n                    d.push(\"</span>\");\n                    e = null;\n                }\n                d.push(a[f + 1]);\n                f += 2;\n            } else if (i < c.length) {\n                o(c[i]);\n                h = c[i + 1];\n                i += 2;\n            } else break;\n        }\n        o(b.length);\n        if (e) d.push(\"</span>\");\n        return d.join(\"\");\n    }\n    var C = {};\n    function q(b, a) {\n        for (var c = a.length; --c >= 0; ) {\n            var d = a[c];\n            if (!C.hasOwnProperty(d)) C[d] = b;\n            else if (\"console\" in window)\n                console.log(\"cannot override language handler %s\", d);\n        }\n    }\n    q(G, [\"default-code\"]);\n    q(ua, [\"default-markup\", \"html\", \"htm\", \"xhtml\", \"xml\", \"xsl\"]);\n    q(\n        r({\n            keywords: I,\n            hashComments: true,\n            cStyleComments: true\n        }),\n        [\"c\", \"cc\", \"cpp\", \"cs\", \"cxx\", \"cyc\"]\n    );\n    q(\n        r({\n            keywords: J,\n            cStyleComments: true\n        }),\n        [\"java\"]\n    );\n    q(\n        r({\n            keywords: O,\n            hashComments: true,\n            multiLineStrings: true\n        }),\n        [\"bsh\", \"csh\", \"sh\"]\n    );\n    q(\n        r({\n            keywords: M,\n            hashComments: true,\n            multiLineStrings: true,\n            tripleQuotedStrings: true\n        }),\n        [\"cv\", \"py\"]\n    );\n    q(\n        r({\n            keywords: L,\n            hashComments: true,\n            multiLineStrings: true,\n            regexLiterals: true\n        }),\n        [\"perl\", \"pl\", \"pm\"]\n    );\n    q(\n        r({\n            keywords: N,\n            hashComments: true,\n            multiLineStrings: true,\n            regexLiterals: true\n        }),\n        [\"rb\"]\n    );\n    q(\n        r({\n            keywords: K,\n            cStyleComments: true,\n            regexLiterals: true\n        }),\n        [\"js\"]\n    );\n    function T(b, a) {\n        try {\n            var c = na(b),\n                d = c.source,\n                g = c.tags;\n            if (!C.hasOwnProperty(a))\n                a = /^\\s*</.test(d) ? \"default-markup\" : \"default-code\";\n            var e = C[a].call({}, d);\n            return va(d, g, e);\n        } catch (h) {\n            if (\"console\" in window) {\n                console.log(h);\n                console.trace();\n            }\n            return b;\n        }\n    }\n    function wa(b) {\n        var a = H(),\n            c = [\n                document.getElementsByTagName(\"pre\"),\n                document.getElementsByTagName(\"code\"),\n                document.getElementsByTagName(\"li\"),\n                document.getElementsByTagName(\"xmp\")\n            ],\n            d = [];\n        for (var g = 0; g < c.length; ++g)\n            for (var e = 0; e < c[g].length; ++e) d.push(c[g][e]);\n        c = null;\n        var h = 0;\n        function f() {\n            var i = new Date().getTime() + 250;\n            for (; h < d.length && new Date().getTime() < i; h++) {\n                var j = d[h];\n                if (j.className && j.className.indexOf(\"prettyprint\") >= 0) {\n                    var o = j.className.match(/\\blang-(\\w+)\\b/);\n                    if (o) o = o[1];\n                    var m = false;\n                    for (var k = j.parentNode; k; k = k.parentNode)\n                        if (\n                            (k.tagName === \"pre\" ||\n                                k.tagName === \"code\" ||\n                                k.tagName === \"xmp\") &&\n                            k.className &&\n                            k.className.indexOf(\"prettyprint\") >= 0\n                        ) {\n                            m = true;\n                            break;\n                        }\n                    if (!m) {\n                        var l = ha(j);\n                        l = l.replace(/(?:\\r\\n?|\\n)$/, \"\");\n                        var n = T(l, o);\n                        if (!S(j)) j.innerHTML = n;\n                        else {\n                            var p = document.createElement(\"PRE\");\n                            for (var t = 0; t < j.attributes.length; ++t) {\n                                var w = j.attributes[t];\n                                if (w.specified)\n                                    p.setAttribute(w.name, w.value);\n                            }\n                            p.innerHTML = n;\n                            j.parentNode.replaceChild(p, j);\n                            p = j;\n                        }\n                        if (a && j.tagName === \"PRE\") {\n                            var A = j.getElementsByTagName(\"br\");\n                            for (var B = A.length; --B >= 0; ) {\n                                var s = A[B];\n                                s.parentNode.replaceChild(\n                                    document.createTextNode(\"\\r\\n\"),\n                                    s\n                                );\n                            }\n                        }\n                    }\n                }\n            }\n            if (h < d.length) setTimeout(f, 250);\n            else if (b) b();\n        }\n        f();\n    }\n    window.PR_normalizedHtml = z;\n    window.prettyPrintOne = T;\n    window.prettyPrint = wa;\n    window.PR = {\n        createSimpleLexer: v,\n        registerLangHandler: q,\n        sourceDecorator: r,\n        PR_ATTRIB_NAME: \"atn\",\n        PR_ATTRIB_VALUE: \"atv\",\n        PR_COMMENT: \"com\",\n        PR_DECLARATION: \"dec\",\n        PR_KEYWORD: \"kwd\",\n        PR_LITERAL: \"lit\",\n        PR_PLAIN: \"pln\",\n        PR_PUNCTUATION: \"pun\",\n        PR_SOURCE: \"src\",\n        PR_STRING: \"str\",\n        PR_TAG: \"tag\",\n        PR_TYPE: \"typ\"\n    };\n})();\n","export default class LineBasedGrader {\n    constructor(problem) {\n        this.problem = problem;\n    }\n    // Use a LIS (Longest Increasing Subsequence) algorithm to return the indexes\n    // that are not part of that subsequence.\n    inverseLISIndices(arr) {\n        // Get all subsequences\n        var allSubsequences = [];\n        for (var i = 0; i < arr.length; i++) {\n            var subsequenceForCurrent = [arr[i]],\n                current = arr[i],\n                lastElementAdded = -1;\n            for (var j = i; j < arr.length; j++) {\n                var subsequent = arr[j];\n                if (subsequent > current && lastElementAdded < subsequent) {\n                    subsequenceForCurrent.push(subsequent);\n                    lastElementAdded = subsequent;\n                }\n            }\n            allSubsequences.push(subsequenceForCurrent);\n        }\n        // Figure out the longest one\n        var longestSubsequenceLength = -1;\n        var longestSubsequence;\n        for (let i in allSubsequences) {\n            var subs = allSubsequences[i];\n            if (subs.length > longestSubsequenceLength) {\n                longestSubsequenceLength = subs.length;\n                longestSubsequence = subs;\n            }\n        }\n        // Create the inverse indexes\n        var indexes = [];\n        var lIndex = 0;\n        for (let i = 0; i < arr.length; i++) {\n            if (lIndex > longestSubsequence.length) {\n                indexes.push(i);\n            } else {\n                if (arr[i] == longestSubsequence[lIndex]) {\n                    lIndex += 1;\n                } else {\n                    indexes.push(i);\n                }\n            }\n        }\n        return indexes;\n    }\n    // grade that element, returning the state\n    grade() {\n        var problem = this.problem;\n        problem.clearFeedback();\n        this.correctLines = 0;\n        this.percentLines = 0;\n        this.incorrectIndents = 0;\n        var solutionLines = problem.solution;\n        var answerLines = problem.answerLines();\n        var i;\n        var state;\n        this.percentLines =\n            Math.min(answerLines.length, solutionLines.length) /\n            Math.max(answerLines.length, solutionLines.length);\n        if (answerLines.length < solutionLines.length) {\n            state = \"incorrectTooShort\";\n            this.correctLength = false;\n        } else if (answerLines.length == solutionLines.length) {\n            this.correctLength = true;\n        } else {\n            state = \"incorrectMoveBlocks\";\n            this.correctLength = false;\n        }\n\n        // Determine whether the code **that is there** is in the correct order\n        // If there is too much or too little code this only matters for\n        // calculating a percentage score.\n        let isCorrectOrder = this.checkCorrectOrdering(solutionLines, answerLines)\n\n        // Determine whether blocks are indented correctly\n        let isCorrectIndents = this.checkCorrectIndentation(solutionLines, answerLines);\n\n        if (\n            isCorrectIndents &&\n            isCorrectOrder &&\n            this.correctLength\n        ) {\n            // Perfect\n            state = \"correct\";\n        } else if (this.correctLength && isCorrectOrder) {\n            state = \"incorrectIndent\";\n        } else if (!isCorrectOrder && state != \"incorrectTooShort\") {\n            state = \"incorrectMoveBlocks\";\n        }\n        this.calculatePercent();\n        this.graderState = state;\n\n        return state;\n    }\n\n    checkCorrectIndentation(solutionLines, answerLines) {\n        this.indentLeft = [];\n        this.indentRight = [];\n        let loopLimit = Math.min(solutionLines.length, answerLines.length);\n        for (let i = 0; i < loopLimit; i++) {\n            if (answerLines[i].viewIndent() < answerLines[i].indent) {\n                this.indentRight.push(answerLines[i]);\n            } else if (answerLines[i].viewIndent() > solutionLines[i].indent) {\n                this.indentLeft.push(answerLines[i]);\n            }\n        }\n        this.incorrectIndents =\n            this.indentLeft.length + this.indentRight.length;\n\n        return this.incorrectIndents == 0;\n    }\n\n    checkCorrectOrdering(solutionLines, answerLines) {\n        let isCorrectOrder = true;\n        this.correctLines = 0;\n        this.solutionLength = solutionLines.length;\n        let loopLimit = Math.min(solutionLines.length, answerLines.length);\n        for (let i = 0; i < loopLimit; i++) {\n            if (answerLines[i].text !== solutionLines[i].text) {\n                isCorrectOrder = false;\n            } else {\n                this.correctLines += 1;\n            }\n        }\n        return isCorrectOrder\n    }\n\n    calculatePercent() {\n        let numLines = this.percentLines * 0.2;\n        let lines = this.problem.answerLines().length;\n        let numCorrectBlocks = (this.correctLines / lines) * 0.4;\n        let numCorrectIndents =\n            ((this.correctLines - this.incorrectIndents) / lines) * 0.4;\n\n        let score = numLines + numCorrectBlocks + numCorrectIndents;\n        score = Math.max(score, 0);\n        this.problem.percent = score;\n    }\n}\n","\"use strict\";\n/**\n * This file adapted from JSNetworkX: https://github.com/fkling/JSNetworkX\n * Copyright (C) 2012 Felix Kling <felix.kling@gmx.net>\n * JSNetworkX is distributed with the BSD license\n */\n\nexport function hasPath(G, { source, target }) {\n  try {\n    bidirectionalShortestPath(G, source, target);\n  } catch (error) {\n    if (error instanceof JSNetworkXNoPath) {\n      return false;\n    }\n    throw error;\n  }\n  return true;\n}\n\nfunction nodesAreEqual(a, b) {\n  return a === b || (typeof a === \"object\" && a.toString() === b.toString());\n}\n\nfunction bidirectionalShortestPath(G, source, target) {\n  // call helper to do the real work\n  var [pred, succ, w] = bidirectionalPredSucc(G, source, target);\n\n  // build path from pred+w+succ\n  var path = [];\n  // from source to w\n  while (w != null) {\n    path.push(w);\n    w = pred.get(w);\n  }\n  w = succ.get(path[0]);\n  path.reverse();\n  // from w to target\n  while (w != null) {\n    path.push(w);\n    w = succ.get(w);\n  }\n  return path;\n}\n\nfunction bidirectionalPredSucc(G, source, target) {\n  // does BFS from both source and target and meets in the middle\n  if (nodesAreEqual(source, target)) {\n    return [new Map([[source, null]]), new Map([[target, null]]), source];\n  }\n\n  // handle either directed or undirected\n  var gpred, gsucc;\n  gpred = G.predecessorsIter.bind(G);\n  gsucc = G.successorsIter.bind(G);\n\n  // predecesssor and successors in search\n  var pred = new Map([[source, null]]);\n  var succ = new Map([[target, null]]);\n  //\n  // initialize fringes, start with forward\n  var forwardFringe = [source];\n  var reverseFringe = [target];\n  var thisLevel;\n\n  /*jshint newcap:false*/\n  while (forwardFringe.length > 0 && reverseFringe.length > 0) {\n    if (forwardFringe.length <= reverseFringe.length) {\n      thisLevel = forwardFringe;\n      forwardFringe = [];\n      for (let v of thisLevel) {\n        for (let w of gsucc(v)) {\n          if (!pred.has(w)) {\n            forwardFringe.push(w);\n            pred.set(w, v);\n          }\n          if (succ.has(w)) {\n            return [pred, succ, w]; // found path\n          }\n        }\n      }\n    } else {\n      thisLevel = reverseFringe;\n      reverseFringe = [];\n      for (let v of thisLevel) {\n        for (let w of gpred(v)) {\n          if (!succ.has(w)) {\n            reverseFringe.push(w);\n            succ.set(w, v);\n          }\n          if (pred.has(w)) {\n            return [pred, succ, w]; // found path\n          }\n        }\n      }\n    }\n  }\n  throw new JSNetworkXNoPath(\n    \"No path between \" + source.toString() + \" and \" + target.toString() + \".\"\n  );\n}\n\nfunction topologicalSort(G, optNbunch) {\n  // nonrecursive version\n  var seen = new Set();\n  var orderExplored = []; // provide order and\n  // fast search without more general priorityDictionary\n  var explored = new Set();\n\n  if (optNbunch == null) {\n    optNbunch = G.nodesIter();\n  }\n\n  for (let v of optNbunch) {\n    // process all vertices in G\n    if (explored.has(v)) {\n      return; // continue\n    }\n\n    var fringe = [v]; // nodes yet to look at\n    while (fringe.length > 0) {\n      var w = fringe[fringe.length - 1]; // depth first search\n      if (explored.has(w)) {\n        // already looked down this branch\n        fringe.pop();\n        continue;\n      }\n      seen.add(w); // mark as seen\n      // Check successors for cycles for new nodes\n      var newNodes = [];\n      /*eslint-disable no-loop-func*/\n      G.get(w).forEach(function (_, n) {\n        if (!explored.has(n)) {\n          if (seen.has(n)) {\n            // CYCLE !!\n            throw new JSNetworkXUnfeasible(\"Graph contains a cycle.\");\n          }\n          newNodes.push(n);\n        }\n      });\n      /*eslint-enable no-loop-func*/\n      if (newNodes.length > 0) {\n        // add new nodes to fringe\n        fringe.push.apply(fringe, newNodes);\n      } else {\n        explored.add(w);\n        orderExplored.unshift(w);\n      }\n    }\n  }\n\n  return orderExplored;\n}\n\nexport function isDirectedAcyclicGraph(G) {\n  try {\n    topologicalSort(G);\n    return true;\n  } catch (ex) {\n    if (ex instanceof JSNetworkXUnfeasible) {\n      return false;\n    }\n    throw ex;\n  }\n}\n\nexport class DiGraph {\n  constructor() {\n    this.graph = {}; // dictionary for graph attributes\n    this.node = new Map(); // dictionary for node attributes\n    // We store two adjacency lists:\n    // the predecessors of node n are stored in the dict self.pred\n    // the successors of node n are stored in the dict self.succ=self.adj\n    this.adj = new Map(); // empty adjacency dictionary\n    this.pred = new Map(); // predecessor\n    this.succ = this.adj; // successor\n\n    this.edge = this.adj;\n  }\n\n  addNode(n) {\n    if (!this.succ.has(n)) {\n      this.succ.set(n, new Map());\n      this.pred.set(n, new Map());\n      this.node.set(n);\n    }\n  }\n\n  addEdge(u, v) {\n    // add nodes\n    if (!this.succ.has(u)) {\n      this.succ.set(u, new Map());\n      this.pred.set(u, new Map());\n      this.node.set(u, {});\n    }\n\n    if (!this.succ.has(v)) {\n      this.succ.set(v, new Map());\n      this.pred.set(v, new Map());\n      this.node.set(v, {});\n    }\n\n    // add the edge\n    var datadict = this.adj.get(u).get(v) || {};\n    this.succ.get(u).set(v, datadict);\n    this.pred.get(v).set(u, datadict);\n  }\n\n  nodes(optData = false) {\n    return Array.from(optData ? this.node.entries() : this.node.keys());\n  }\n\n  edges(optNbunch, optData = false) {\n    return Array.from(this.edgesIter(optNbunch, optData));\n  }\n\n  nodesIter(optData = false) {\n    if (optData) {\n      return toIterator(this.node);\n    }\n    return this.node.keys();\n  }\n\n  get(n) {\n    var value = this.adj.get(n);\n    if (typeof value === \"undefined\") {\n      throw new KeyError(\"Graph does not contain node \" + n + \".\");\n    }\n    return value;\n  }\n\n  numberOfNodes() {\n    return this.node.size;\n  }\n\n  *nbunchIter(optNbunch) {\n    if (optNbunch == null) {\n      // include all nodes\n      /*jshint expr:true*/\n      yield* this.adj.keys();\n    } else if (this.hasNode(optNbunch)) {\n      // if nbunch is a single node\n      yield optNbunch;\n    } else {\n      // if nbunch is a sequence of nodes\n      var adj = this.adj;\n\n      try {\n        for (var n of toIterator(optNbunch)) {\n          if (adj.has(n)) {\n            yield n;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof TypeError) {\n          throw new JSNetworkXError(\n            \"nbunch is not a node or a sequence of nodes\"\n          );\n        }\n      }\n    }\n  }\n\n  *edgesIter(optNbunch, optData = false) {\n    // handle calls with opt_data being the only argument\n    if (isBoolean(optNbunch)) {\n      optData = optNbunch;\n      optNbunch = undefined;\n    }\n\n    var nodesNbrs;\n\n    if (optNbunch === undefined) {\n      nodesNbrs = this.adj;\n    } else {\n      nodesNbrs = mapIterator(this.nbunchIter(optNbunch), (n) =>\n        tuple2(n, this.adj.get(n))\n      );\n    }\n\n    for (var nodeNbrs of nodesNbrs) {\n      for (var nbrData of nodeNbrs[1]) {\n        var result = [nodeNbrs[0], nbrData[0]];\n        if (optData) {\n          result[2] = nbrData[1];\n        }\n        yield result;\n      }\n    }\n  }\n\n  reverse(optCopy = true) {\n    var H;\n    if (optCopy) {\n      H = new this.constructor(null, {\n        name: \"Reverse of (\" + this.name + \")\",\n      });\n      H.addNodesFrom(this);\n      H.addEdgesFrom(\n        mapIterator(this.edgesIter(null, true), (edge) =>\n          tuple3c(edge[1], edge[0], deepcopy(edge[2]), edge)\n        )\n      );\n      H.graph = deepcopy(this.graph);\n      H.node = deepcopy(this.node);\n    } else {\n      var thisPred = this.pred;\n      var thisSucc = this.succ;\n\n      this.succ = thisPred;\n      this.pred = thisSucc;\n      this.adj = this.succ;\n      H = this;\n    }\n    return H;\n  }\n\n  successorsIter(n) {\n    var nbrs = this.succ.get(n);\n    if (nbrs !== undefined) {\n      return nbrs.keys();\n    }\n    throw new JSNetworkXError(\n      sprintf('The node \"%j\" is not in the digraph.', n)\n    );\n  }\n\n  predecessorsIter(n) {\n    var nbrs = this.pred.get(n);\n    if (nbrs !== undefined) {\n      return nbrs.keys();\n    }\n    throw new JSNetworkXError(\n      sprintf('The node \"%j\" is not in the digraph.', n)\n    );\n  }\n\n  successors(n) {\n    return Array.from(this.successorsIter(n));\n  }\n\n  predecessors(n) {\n    return Array.from(this.predecessorsIter(n));\n  }\n}\n\nclass JSNetworkXException {\n  constructor(message) {\n    this.name = \"JSNetworkXException\";\n    this.message = message;\n  }\n}\n\nclass JSNetworkXAlgorithmError extends JSNetworkXException {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXAlgorithmError\";\n  }\n}\n\nclass JSNetworkXError extends JSNetworkXException {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXError\";\n  }\n}\n\nclass JSNetworkXUnfeasible extends JSNetworkXAlgorithmError {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXUnfeasible\";\n  }\n}\n\nclass JSNetworkXNoPath extends JSNetworkXUnfeasible {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXNoPath\";\n  }\n}\n\n// function from LoDash, needed by functions from JSNetworkX\nfunction isObjectLike(value) {\n  return !!value && typeof value == \"object\";\n}\n\n// function from LoDash, needed by functions from JSNetworkX\nfunction isBoolean(value) {\n  var boolTag = \"[object Boolean]\";\n  return (\n    value === true ||\n    value === false ||\n    (isObjectLike(value) && Object.prototype.toString.call(value) == boolTag)\n  );\n}\n","import LineBasedGrader from \"./lineGrader\";\nimport { DiGraph, hasPath, isDirectedAcyclicGraph } from \"./dagHelpers\";\n\nfunction graphToNX(answerLines) {\n  var graph = new DiGraph();\n  for (let line1 of answerLines) {\n    graph.addNode(line1.tag);\n    for (let line2tag of line1.depends) {\n      // the depends graph lists the *incoming* edges of a node\n      graph.addEdge(line2tag, line1.tag);\n    }\n  }\n  return graph;\n}\n\nfunction isVertexCover(graph, vertexCover) {\n  for (let edge of graph.edges()) {\n    if (!(vertexCover.has(edge[0]) || vertexCover.has(edge[1]))) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// Find all subsets of the set using the correspondence of subsets of\n// a set to binary string whose length are the size of the set\nfunction allSubsets(arr) {\n  let subsets = {};\n  for (let i = 0; i <= arr.length; i++) {\n    subsets[i] = [];\n  }\n  for (let i = 0; i < Math.pow(2, arr.length); i++) {\n    let bin = i.toString(2);\n    while (bin.length < arr.length) {\n      bin = \"0\" + bin;\n    }\n    let subset = new Set();\n    for (let j = 0; j < bin.length; j++) {\n      if (bin[j] == \"1\") {\n        subset.add(arr[j]);\n      }\n    }\n    subsets[subset.size].push(subset);\n  }\n  return subsets;\n}\n\nexport default class DAGGrader extends LineBasedGrader {\n  inverseLISIndices(arr, inSolution) {\n    // For more details and a proof of the correctness of the algorithm, see the paper: https://arxiv.org/abs/2204.04196\n\n    var solution = this.problem.solution;\n    var answerLines = inSolution.map((block) => block.lines[0]); // assume NOT adaptive for DAG grading (for now)\n\n    let graph = graphToNX(solution);\n\n    let seen = new Set();\n    let problematicSubgraph = new DiGraph();\n    for (let line1 of answerLines) {\n      for (let line2 of seen) {\n        let problematic = hasPath(graph, {\n          source: line1.tag,\n          target: line2.tag,\n        });\n        if (problematic) {\n          problematicSubgraph.addEdge(line1.tag, line2.tag);\n        }\n      }\n\n      seen.add(line1);\n    }\n\n    let mvc = null;\n    let subsets = allSubsets(problematicSubgraph.nodes());\n    for (let i = 0; i <= problematicSubgraph.numberOfNodes(); i++) {\n      for (let subset of subsets[i]) {\n        if (isVertexCover(problematicSubgraph, subset)) {\n          mvc = subset;\n          break;\n        }\n      }\n      if (mvc != null) {\n        break;\n      }\n    }\n\n    let indices = [...mvc].map((tag) => {\n      for (let i = 0; i < answerLines.length; i++) {\n        if (answerLines[i].tag === tag) return i;\n      }\n    });\n    return indices;\n  }\n\n  checkCorrectIndentation(solutionLines, answerLines) {\n      this.indentLeft = [];\n      this.indentRight = [];\n\n      let indentationByTag = {};\n      for (let i = 0; i < solutionLines.length; i++) {\n        const line = solutionLines[i];\n        indentationByTag[line.tag] = line.indent;\n      }\n\n      let loopLimit = Math.min(solutionLines.length, answerLines.length);\n      for (let i = 0; i < loopLimit; i++) {\n          let solutionIndent = indentationByTag[answerLines[i].tag];\n          if (answerLines[i].viewIndent() < solutionIndent) {\n              this.indentRight.push(answerLines[i]);\n          } else if (answerLines[i].viewIndent() > solutionIndent) {\n              this.indentLeft.push(answerLines[i]);\n          }\n      }\n      this.incorrectIndents =\n          this.indentLeft.length + this.indentRight.length;\n\n      return this.incorrectIndents == 0;\n  }\n\n  checkCorrectOrdering(solutionLines, answerLines) {\n    if (!isDirectedAcyclicGraph(graphToNX(solutionLines))) {\n      throw \"Dependency between blocks does not form a Directed Acyclic Graph; Problem unsolvable.\";\n    }\n\n    let seen = new Set();\n    let isCorrectOrder = true;\n    this.correctLines = 0;\n    this.solutionLength = solutionLines.length;\n    let loopLimit = Math.min(solutionLines.length, answerLines.length);\n    for (let i = 0; i < loopLimit; i++) {\n      let line = answerLines[i];\n      if (line.distractor) {\n        isCorrectOrder = false;\n      } else {\n        for (let j = 0; j < line.depends.length; j++) {\n          if (!seen.has(line.depends[j])) {\n            isCorrectOrder = false;\n          }\n        }\n      }\n      if (isCorrectOrder) {\n        this.correctLines += 1;\n      }\n      seen.add(line.tag);\n    }\n    return isCorrectOrder;\n  }\n}\n","/* =====================================================================\n==== ParsonsLine Object ================================================\n======== The model and view of a line of code.\n======== Based on what is specified in the problem.\n======== ParsonBlock objects have one or more of these.\n==== PROPERTIES ========================================================\n======== problem: the Parsons problem\n======== index: the index of the line in the problem\n======== text: the text of the code line\n======== indent: the indent level\n======== view: an element for viewing this object\n======== distractor: whether it is a distractor\n======== paired: whether it is a paired distractor\n======== groupWithNext: whether it is grouped with the following line\n======== width: the pixel width when rendered\n============ in the initial grouping\n===================================================================== */\n// Initialize from codestring\n\nexport default class ParsonsLine {\n    constructor(problem, codestring, displaymath) {\n        this.problem = problem;\n        this.index = problem.lines.length;\n        var trimmed = codestring.replace(/\\s*$/, \"\");\n        this.text = trimmed.replace(/^\\s*/, \"\");\n        this.indent = trimmed.length - this.text.length;\n        // Create the View\n        var view;\n        // TODO: this does not work with display math... Perhaps with pretext we should have html as a language and do nothing?\n        \n        if (problem.options.language == \"natural\" || problem.options.language == \"math\") {\n            if (! displaymath) {\n                view = document.createElement(\"p\");\n            } else {\n                view = document.createElement(\"div\");\n            }\n        } else {\n            view = document.createElement(\"code\");\n            $(view).addClass(problem.options.prettifyLanguage);\n        }\n        view.id = problem.counterId + \"-line-\" + this.index;\n        view.innerHTML += this.text;\n        this.view = view;\n        problem.lines.push(this);\n    }\n    // Initialize what width the line would naturally have (without indent)\n    initializeWidth() {\n        // this.width does not appear to be used anywhere later\n        // since changing the value of this.width appears to have no effect. - Vincent Qiu (September 2020)\n        this.width =\n            $(this.view).outerWidth(true) -\n            this.problem.options.pixelsPerIndent * this.indent;\n\n        // Pass this information on to be used in class Parsons function initializeAreas\n        // to manually determine appropriate widths - Vincent Qiu (September 2020)\n        this.view.fontSize = window\n            .getComputedStyle(this.view, null)\n            .getPropertyValue(\"font-size\");\n        this.view.pixelsPerIndent = this.problem.options.pixelsPerIndent;\n        this.view.indent = this.indent;\n\n        // Figure out which typeface will be rendered by comparing text widths to browser default - Vincent Qiu (September 2020)\n        var tempCanvas = document.createElement(\"canvas\");\n        var tempCanvasCtx = tempCanvas.getContext(\"2d\");\n        var possibleFonts = window\n            .getComputedStyle(this.view, null)\n            .getPropertyValue(\"font-family\")\n            .split(\", \");\n        var fillerText = \"abcdefghijklmnopqrstuvwxyz0123456789,./!@#$%^&*-+\";\n        tempCanvasCtx.font = this.view.fontSize + \" serif\";\n        var serifWidth = tempCanvasCtx.measureText(fillerText).width;\n        for (let i = 0; i < possibleFonts.length; i++) {\n            if (possibleFonts[i].includes('\"')) {\n                possibleFonts[i] = possibleFonts[i].replaceAll('\"', \"\");\n            }\n            if (possibleFonts[i].includes(\"'\")) {\n                possibleFonts[i] = possibleFonts[i].replaceAll(\"'\", \"\");\n            }\n            tempCanvasCtx.font = this.view.fontSize + \" \" + possibleFonts[i];\n            if (tempCanvasCtx.measureText(fillerText).width !== serifWidth) {\n                this.view.fontFamily = possibleFonts[i];\n                break;\n            }\n        }\n    }\n    // Answer the block that this line is currently in\n    block() {\n        for (let i = 0; i < this.problem.blocks.length; i++) {\n            var block = this.problem.blocks[i];\n            for (var j = 0; j < block.lines.length; j++) {\n                if (block.lines[j] === this) {\n                    return block;\n                }\n            }\n        }\n        return undefined;\n    }\n    // Answer the indent based on the view\n    viewIndent() {\n        if (this.problem.noindent) {\n            return this.indent;\n        } else {\n            var block = this.block();\n            return this.indent - block.solutionIndent() + block.indent;\n        }\n    }\n}\n","/* =====================================================================\n==== ParsonsBlock Object ===============================================\n======== The model and view of a code block.\n==== PROPERTIES ========================================================\n======== problem: the Parsons problem\n======== lines: an array of ParsonsLine in this block\n======== indent: indent based on movement\n======== view: an element for viewing this object\n======== labels: [label, line] the labels numbering the block and the lines they go on\n======== hammer: the controller based on hammer.js\n===================================================================== */\n\nimport Hammer from \"./hammer.min.js\";\n\n// Initialize based on the problem and the lines\nexport default class ParsonsBlock {\n    constructor(problem, lines) {\n        this.problem = problem;\n        this.lines = lines;\n        this.indent = 0;\n        this.labels = [];\n        // Create view, adding view of lines and updating indent\n        var view = document.createElement(\"div\");\n        view.id = problem.counterId + \"-block-\" + problem.blockIndex;\n        problem.blockIndex += 1;\n        $(view).addClass(\"block\");\n        var sharedIndent = lines[0].indent;\n        for (let i = 1; i < lines.length; i++) {\n            sharedIndent = Math.min(sharedIndent, lines[i].indent);\n        }\n        var lineDiv = document.createElement(\"div\");\n        $(lineDiv).addClass(\"lines\");\n        $(view).append(lineDiv);\n        for (let i = 0; i < lines.length; i++) {\n            var line = lines[i];\n            var lineIndent;\n            if (problem.noindent) {\n                lineIndent = line.indent;\n            } else {\n                lineIndent = line.indent - sharedIndent;\n            }\n            $(line.view).removeClass(\"indent1 indent2 indent3 indent4\");\n            if (\n                this.problem.options.language != \"natural\" &&\n                this.problem.options.language != \"math\"\n            ) {\n                if (lineIndent > 0) {\n                    $(line.view).addClass(\"indent\" + lineIndent);\n                }\n            }\n            lineDiv.appendChild(line.view);\n        }\n        var labelDiv = document.createElement(\"div\");\n        $(labelDiv).addClass(\"labels\");\n        if (this.problem.options.numbered == \"left\") {\n            $(lineDiv).addClass(\"border_left\");\n            $(view).prepend(labelDiv);\n            $(view).css({\n                \"justify-content\": \"flex-start\",\n            });\n        } else if (this.problem.options.numbered == \"right\") {\n            $(labelDiv).addClass(\"border_left\");\n            $(labelDiv).css({\n                float: \"right\",\n            });\n            $(view).css({\n                \"justify-content\": \"space-between\",\n            });\n            $(view).append(labelDiv);\n        }\n        this.view = view;\n    }\n    // Add a line (from another block) to this block\n    addLine(line) {\n        $(line.view).removeClass(\"indent1 indent2 indent3 indent4\");\n        if (this.problem.noindent) {\n            if (line.indent > 0) {\n                $(line.view).addClass(\"indent\" + line.indent);\n            }\n        } else {\n            var lines = this.lines;\n            var sharedIndent = lines[0].indent;\n            for (let i = 1; i < lines.length; i++) {\n                sharedIndent = Math.min(sharedIndent, lines[i].indent);\n            }\n            if (sharedIndent < line.indent) {\n                $(line.view).addClass(\"indent\" + (line.indent - sharedIndent));\n            } else if (sharedIndent > line.indent) {\n                for (let i = 0; i < lines.length; i++) {\n                    $(lines[i].view).removeClass(\n                        \"indent1 indent2 indent3 indent4\"\n                    );\n                    // todo: if language is natural or math then don't do this\n                    if (\n                        this.options.language !== \"natural\" &&\n                        this.options.language !== \"math\"\n                    ) {\n                        $(lines[i].view).addClass(\n                            \"indent\" + (lines[i].indent - line.indent)\n                        );\n                    }\n                }\n            }\n        }\n        this.lines.push(line);\n        $(this.view).children(\".lines\")[0].appendChild(line.view);\n    }\n    // Add the contents of that block to myself and then delete that block\n    consumeBlock(block) {\n        for (let i = 0; i < block.lines.length; i++) {\n            this.addLine(block.lines[i]);\n        }\n        if ($(block.view).attr(\"tabindex\") == \"0\") {\n            this.makeTabIndex();\n        }\n        $(block.view).detach();\n        var newBlocks = [];\n        for (let i = 0; i < this.problem.blocks.length; i++) {\n            if (this.problem.blocks[i] !== block) {\n                newBlocks.push(this.problem.blocks[i]);\n            }\n        }\n        for (let i = 0; i < block.labels.length; i++) {\n            this.addLabel(\n                block.labels[i][0],\n                this.lines.length - block.lines.length + block.labels[i][1]\n            );\n        }\n        this.problem.blocks = newBlocks;\n        this.problem.state = undefined;\n        this.problem.updateView();\n    }\n    // Update the model and view when block is converted to contain indent\n    addIndent() {\n        // Update the lines model / view\n        for (let i = 0; i < this.lines.length; i++) {\n            var line = this.lines[i];\n            if (line.indent > 0) {\n                $(line.view).removeClass(\"indent1 indent2 indent3 indent4\");\n                $(line.view).addClass(\"indent\" + line.indent);\n            }\n        }\n        // Update the block model / view\n        this.indent = 0;\n        $(this.view).css({\n            \"padding-left\": \"\",\n            width: this.problem.areaWidth - 22,\n        });\n    }\n    // Add a label to block and update its view\n    addLabel(label, line) {\n        var div = document.createElement(\"div\");\n        $(div).addClass(\"block-label\");\n        if (this.problem.options.numbered == \"right\") {\n            $(div).addClass(\"right-label\");\n        }\n        if (this.problem.options.numbered == \"left\") {\n            $(div).addClass(\"left-label\");\n        }\n        $(div).append(document.createTextNode(label));\n        $(this.view).children(\".labels\")[0].append(div);\n        if (this.labels.length != 0) {\n            $(div).css(\n                \"margin-top\",\n                (line - this.labels[this.labels.length - 1][1] - 1) *\n                    this.lines[line].view.offsetHeight\n            );\n        }\n        this.labels.push([label, line]);\n    }\n    // Initialize Interactivity\n    initializeInteractivity() {\n        if ($(this.view).hasClass(\"disabled\")) {\n            return this;\n        }\n        $(this.view).attr(\"tabindex\", \"-1\");\n        this.hammer = new Hammer.Manager(this.view, {\n            recognizers: [\n                [\n                    Hammer.Pan,\n                    {\n                        direction: Hammer.DIRECTION_ALL,\n                        threshold: 0,\n                        pointers: 1,\n                    },\n                ],\n            ],\n        });\n        var that = this;\n        this.hammer.on(\"panstart\", function (event) {\n            that.panStart(event);\n        });\n        this.hammer.on(\"panend\", function (event) {\n            that.panEnd(event);\n        });\n        this.hammer.on(\"panmove\", function (event) {\n            that.panMove(event);\n        });\n    }\n    // Return a boolean as to whether this block is able to be selected\n    enabled() {\n        return $(this.view).attr(\"tabindex\") !== undefined;\n    }\n    // Return a boolean as to whether this block is a distractor\n    isDistractor() {\n        return this.lines[0].distractor;\n    }\n    // Return a boolean as to whether this block is in the source area\n    inSourceArea() {\n        var children = this.problem.sourceArea.childNodes;\n        for (let i = 0; i < children.length; i++) {\n            var item = children[i];\n            if (item.id == this.view.id) {\n                return true;\n            }\n        }\n        return false;\n    }\n    // Return the page X position of the center of the view\n    pageXCenter() {\n        var boundingRect = this.view.getBoundingClientRect();\n        var pageXCenter =\n            window.pageXOffset + boundingRect.left + boundingRect.width / 2;\n        return pageXCenter;\n    }\n    // Return the page Y position of the center of the view\n    pageYCenter() {\n        var boundingRect = this.view.getBoundingClientRect();\n        var pageYCenter =\n            window.pageYOffset + boundingRect.top + boundingRect.height / 2;\n        return pageYCenter;\n    }\n    // Of all the line indents, return the minimum value\n    minimumLineIndent() {\n        var minimumLineIndent = this.lines[0].indent;\n        for (let i = 1; i < this.lines.length; i++) {\n            minimumLineIndent = Math.min(\n                this.lines[i].indent,\n                minimumLineIndent\n            );\n        }\n        return minimumLineIndent;\n    }\n    // Return the last block in the source area that matches the paired bin it is in\n    slideUnderBlock() {\n        var sourceBlocks = this.problem.sourceBlocks();\n        if (sourceBlocks.length == 0) {\n            return undefined;\n        }\n        var pairedBin = this.pairedBin();\n        if (pairedBin == -1) {\n            return sourceBlocks[sourceBlocks.length - 1];\n        }\n        for (let i = sourceBlocks.length - 1; i >= 0; i--) {\n            var block = sourceBlocks[i];\n            if (block.pairedBin() == pairedBin) {\n                return block;\n            }\n        }\n        return sourceBlocks[sourceBlocks.length - 1];\n    }\n    // Return which paired bin it is in (-1) if not\n    pairedBin() {\n        var pairedBins = this.problem.pairedBins;\n        for (var i = 0; i < pairedBins.length; i++) {\n            if (this.matchesBin(pairedBins[i])) {\n                return i;\n            }\n        }\n        return -1;\n    }\n    // Return true if all lines are in that bin\n    matchesBin(bin) {\n        for (var i = 0; i < this.lines.length; i++) {\n            var test = this.lines[i].index;\n            if (bin.indexOf(test) == -1) {\n                return false;\n            }\n        }\n        return true;\n    }\n    // Return a list of indexes where this block could be inserted before\n    validSourceIndexes() {\n        var blocks = this.problem.sourceBlocks();\n        var indexes = [];\n        var pairedBin = this.pairedBin();\n        var i, lastBin;\n        if (pairedBin >= 0) {\n            for (i = 0; i < blocks.length; i++) {\n                var block = blocks[i];\n                if (block.view.id !== this.view.id) {\n                    var blockBin = block.pairedBin();\n                    if (blockBin == pairedBin) {\n                        indexes.push(i);\n                    } else if (lastBin == pairedBin) {\n                        indexes.push(i);\n                    }\n                    lastBin = blockBin;\n                }\n            }\n            if (lastBin == pairedBin) {\n                indexes.push(blocks.length);\n            }\n            if (indexes.length > 0) {\n                return indexes;\n            }\n        }\n        for (i = 0; i < blocks.length; i++) {\n            let block = blocks[i];\n            if (block.view.id !== this.view.id) {\n                let blockBin = block.pairedBin();\n                if (blockBin !== lastBin) {\n                    indexes.push(i);\n                } else if (blockBin == -1) {\n                    indexes.push(i);\n                }\n                lastBin = blockBin;\n            }\n        }\n        indexes.push(blocks.length);\n        return indexes;\n    }\n    // A measure of how far the middle of this block is vertically positioned\n    verticalOffset() {\n        var verticalOffset;\n        if (this.inSourceArea()) {\n            verticalOffset =\n                this.problem.sourceArea.getBoundingClientRect().top;\n        } else {\n            verticalOffset =\n                this.problem.answerArea.getBoundingClientRect().top;\n        }\n        verticalOffset =\n            this.view.getBoundingClientRect().top +\n            this.view.getBoundingClientRect().bottom -\n            verticalOffset * 2;\n        return verticalOffset;\n    }\n    // This block just gained textual focus\n    newFocus() {\n        if (this.problem.textFocus == undefined) {\n            this.problem.enterKeyboardMode();\n            this.problem.textFocus = this;\n            this.problem.textMove = false;\n            $(this.view).addClass(\"down\");\n        } else if (this.problem.textFocus == this) {\n            if (this.problem.textMove) {\n                $(this.view).addClass(\"up\");\n            } else {\n                $(this.view).addClass(\"down\");\n            }\n        } else {\n            // already in keyboard mode\n            this.problem.textFocus = this;\n            this.problem.textMove = false;\n            $(this.view).addClass(\"down\");\n        }\n        this.problem.textMoving = false;\n    }\n    // This block just lost textual focus\n    releaseFocus() {\n        $(this.view).removeClass(\"down up\");\n        if (this.problem.textFocus == this) {\n            if (!this.problem.textMoving) {\n                // exit out of problem but stay way into problem\n                this.problem.textFocus = undefined;\n                if (this.problem.textMove) {\n                    this.problem.logMove(\"kmove\");\n                    this.problem.textMove = false;\n                }\n                this.problem.exitKeyboardMode();\n            }\n        } else {\n            // become selectable, but not active\n            $(this.view).attr(\"tabindex\", \"-1\");\n            $(this.view).unbind(\"focus\");\n            $(this.view).unbind(\"blur\");\n            $(this.view).unbind(\"keydown\");\n        }\n    }\n    // Make this block into the keyboard entry point\n    makeTabIndex() {\n        $(this.view).attr(\"tabindex\", \"0\");\n        var that = this;\n        $(this.view).focus(function () {\n            that.newFocus();\n        });\n        $(this.view).blur(function () {\n            that.releaseFocus();\n        });\n        $(this.view).keydown(function (event) {\n            that.keyDown(event);\n        });\n    }\n    // Called to disable interaction for the future\n    disable() {\n        if (this.hammer !== undefined) {\n            this.hammer.set({ enable: false });\n        }\n        if ($(this.view).attr(\"tabindex\") == \"0\") {\n            this.releaseFocus();\n            $(this.view).removeAttr(\"tabindex\");\n            this.problem.initializeTabIndex();\n        } else {\n            $(this.view).removeAttr(\"tabindex\");\n        }\n    }\n    // Enable functionality after reset button has been pressed\n    resetView() {\n        if (this.hammer !== undefined) {\n            this.hammer.set({ enable: true });\n        }\n        if (!$(this.view)[0].hasAttribute(\"tabindex\")) {\n            $(this.view).attr(\"tabindex\", \"-1\");\n        }\n        $(this.view).css({ opacity: \"\" });\n    }\n    // Called to destroy interaction for the future\n    destroy() {\n        if (this.hammer !== undefined) {\n            this.hammer.destroy();\n            delete this.hammer;\n        }\n        if ($(this.view).attr(\"tabindex\") == \"0\") {\n            this.releaseFocus();\n        }\n        $(this.view).removeAttr(\"tabindex\");\n    }\n    // Called when a block is picked up\n    panStart(event) {\n        this.problem.clearFeedback();\n        if (this.problem.started == undefined) {\n            // log the first time that something gets moved\n            this.problem.started = true;\n            this.problem.logMove(\"start\");\n        }\n        if (this.problem.textFocus !== undefined) {\n            // stop text focus when dragging\n            this.problem.textFocus.releaseFocus();\n        }\n        this.problem.moving = this;\n        // Update the view\n        this.problem.movingX = event.srcEvent.pageX;\n        this.problem.movingY = event.srcEvent.pageY;\n        this.problem.updateView();\n    }\n    // Called when a block is dropped\n    panEnd(event) {\n        this.problem.isAnswered = true;\n        delete this.problem.moving;\n        delete this.problem.movingX;\n        delete this.problem.movingY;\n        this.problem.updateView();\n        this.problem.logMove(\"move\");\n    }\n    // Called when a block is moved\n    panMove(event) {\n        // Update the view\n        this.problem.movingX = event.srcEvent.pageX;\n        this.problem.movingY = event.srcEvent.pageY;\n        this.problem.updateView();\n    }\n    // Handle a keypress event when in focus\n    keyDown(event) {\n        if (this.problem.started == undefined) {\n            // log the first time that something gets moved\n            this.problem.started = true;\n            this.problem.logMove(\"kstart\");\n        }\n        switch (event.keyCode) {\n            case 37: // left\n                if (this.problem.textMove) {\n                    this.moveLeft();\n                } else {\n                    this.selectLeft();\n                }\n                break;\n            case 38: // up\n                if (this.problem.textMove) {\n                    this.moveUp();\n                } else {\n                    this.selectUp();\n                }\n                event.preventDefault();\n                break;\n            case 39: // right\n                if (this.problem.textMove) {\n                    this.moveRight();\n                } else {\n                    this.selectRight();\n                }\n                event.preventDefault();\n                break;\n            case 40: // down\n                if (this.problem.textMove) {\n                    this.moveDown();\n                } else {\n                    this.selectDown();\n                }\n                event.preventDefault();\n                break;\n            case 32: // space\n                this.toggleMove();\n                event.preventDefault();\n                break;\n            case 13: // enter\n                this.toggleMove();\n                event.preventDefault();\n                break;\n        }\n    }\n    // Move block left\n    moveLeft() {\n        var index, block;\n        if (!this.inSourceArea()) {\n            if (this.indent == 0) {\n                // move to source area\n                var blocks = this.problem.sourceBlocks();\n                var offset = this.verticalOffset();\n                var validSourceIndexes = this.validSourceIndexes();\n                for (var i = 0; i < validSourceIndexes.length; i++) {\n                    index = validSourceIndexes[i];\n                    if (index == blocks.length) {\n                        this.problem.textMoving = true;\n                        this.problem.sourceArea.appendChild(this.view);\n                        $(this.view).focus();\n                        this.problem.state = undefined;\n                        this.problem.updateView();\n                        return this;\n                    } else {\n                        block = blocks[index];\n                        if (block.verticalOffset() >= offset) {\n                            break;\n                        }\n                    }\n                }\n                this.problem.textMoving = true;\n                this.problem.sourceArea.insertBefore(this.view, block.view);\n                $(this.view).focus();\n            } else {\n                // reduce indent\n                this.indent = this.indent - 1;\n            }\n            this.problem.state = undefined;\n            this.problem.updateView();\n        }\n    }\n    // Move block up\n    moveUp() {\n        if (this.inSourceArea()) {\n            let blocks = this.problem.sourceBlocks();\n            var offset = this.verticalOffset();\n            var validSourceIndexes = this.validSourceIndexes();\n            for (let i = 0; i < validSourceIndexes.length; i++) {\n                var index =\n                    validSourceIndexes[validSourceIndexes.length - 1 - i];\n                if (index < blocks.length) {\n                    var block = blocks[index];\n                    if (block.verticalOffset() < offset) {\n                        this.problem.textMoving = true;\n                        this.problem.sourceArea.insertBefore(\n                            this.view,\n                            block.view\n                        );\n                        $(this.view).focus();\n                        this.problem.state = undefined;\n                        this.problem.updateView();\n                        return this;\n                    }\n                }\n            }\n        } else {\n            let blocks = this.problem.answerBlocks();\n            for (let i = 0; i < blocks.length; i++) {\n                if (blocks[i].view.id == this.view.id) {\n                    if (i == 0) {\n                        return this;\n                    }\n                    this.problem.textMoving = true;\n                    this.problem.answerArea.insertBefore(\n                        this.view,\n                        blocks[i - 1].view\n                    );\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                }\n            }\n        }\n    }\n    // Move block right\n    moveRight() {\n        if (this.inSourceArea()) {\n            // move to answer area\n            this.indent = 0;\n            var offset = this.verticalOffset();\n            var answerBlocks = this.problem.answerBlocks();\n            for (var i = 0; i < answerBlocks.length; i++) {\n                var item = answerBlocks[i];\n                var itemOffset = item.verticalOffset();\n                if (itemOffset >= offset) {\n                    this.problem.textMoving = true;\n                    this.problem.answerArea.insertBefore(this.view, item.view);\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                    return this;\n                }\n            }\n            this.problem.textMoving = true;\n            this.problem.answerArea.appendChild(this.view);\n            $(this.view).focus();\n            this.problem.state = undefined;\n            this.problem.updateView();\n        } else {\n            // in answer area: increase the indent\n            if (this.indent !== this.problem.indent) {\n                this.indent = this.indent + 1;\n                this.problem.state = undefined;\n                this.problem.updateView();\n            }\n        }\n    }\n    // Move block down\n    moveDown() {\n        if (this.inSourceArea()) {\n            let blocks = this.problem.sourceBlocks();\n            var validSourceIndexes = this.validSourceIndexes();\n            for (let i = 0; i < blocks.length; i++) {\n                if (blocks[i].view.id == this.view.id) {\n                    var myIndex = i;\n                }\n            }\n            for (let i = 0; i < validSourceIndexes.length; i++) {\n                var index = validSourceIndexes[i];\n                if (index == blocks.length) {\n                    this.problem.textMoving = true;\n                    this.problem.sourceArea.appendChild(this.view);\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                    return this;\n                } else if (index - myIndex > 1) {\n                    this.problem.textMoving = true;\n                    this.problem.sourceArea.insertBefore(\n                        this.view,\n                        blocks[index].view\n                    );\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                    return this;\n                }\n            }\n        } else {\n            let blocks = this.problem.answerBlocks();\n            for (var i = 0; i < blocks.length; i++) {\n                if (blocks[i].view.id == this.view.id) {\n                    if (i == blocks.length - 1) {\n                        return this;\n                    } else if (i == blocks.length - 2) {\n                        this.problem.textMoving = true;\n                        this.problem.answerArea.appendChild(this.view);\n                    } else {\n                        this.problem.textMoving = true;\n                        this.problem.answerArea.insertBefore(\n                            this.view,\n                            blocks[i + 2].view\n                        );\n                    }\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                }\n            }\n        }\n    }\n    // Move selection left\n    selectLeft() {\n        if (!this.inSourceArea()) {\n            var offset = this.verticalOffset();\n            var sourceBlocks = this.problem.enabledSourceBlocks();\n            if (sourceBlocks.length == 0) {\n                return this;\n            }\n            var chooseNext = sourceBlocks[0];\n            var chooseOffset = chooseNext.verticalOffset() - offset;\n            for (var i = 1; i < sourceBlocks.length; i++) {\n                var item = sourceBlocks[i];\n                var itemOffset = item.verticalOffset() - offset;\n                if (Math.abs(itemOffset) < Math.abs(chooseOffset)) {\n                    chooseNext = item;\n                    chooseOffset = itemOffset;\n                }\n            }\n            this.problem.textFocus = chooseNext;\n            chooseNext.makeTabIndex();\n            $(chooseNext.view).focus();\n        }\n    }\n    // Move selection up\n    selectUp() {\n        var chooseNext = false;\n        var blocks;\n        if (this.inSourceArea()) {\n            blocks = this.problem.enabledSourceBlocks();\n        } else {\n            blocks = this.problem.enabledAnswerBlocks();\n        }\n        for (var i = blocks.length - 1; i >= 0; i--) {\n            var item = blocks[i];\n            if (chooseNext) {\n                this.problem.textFocus = item;\n                item.makeTabIndex();\n                $(item.view).focus();\n                return this;\n            } else {\n                if (item.view.id == this.view.id) {\n                    chooseNext = true;\n                }\n            }\n        }\n    }\n    // Move selection right\n    selectRight() {\n        if (this.inSourceArea()) {\n            var offset = this.verticalOffset();\n            var blocks = this.problem.enabledAnswerBlocks();\n            if (blocks.length == 0) {\n                return this;\n            }\n            var chooseNext = blocks[0];\n            var chooseOffset = chooseNext.verticalOffset() - offset;\n            for (var i = 1; i < blocks.length; i++) {\n                var item = blocks[i];\n                var itemOffset = item.verticalOffset() - offset;\n                if (Math.abs(itemOffset) < Math.abs(chooseOffset)) {\n                    chooseNext = item;\n                    chooseOffset = itemOffset;\n                }\n            }\n            this.problem.textFocus = chooseNext;\n            chooseNext.makeTabIndex();\n            $(chooseNext.view).focus();\n        }\n    }\n    // Move selection down\n    selectDown() {\n        var chooseNext = false;\n        var blocks;\n        if (this.inSourceArea()) {\n            blocks = this.problem.enabledSourceBlocks();\n        } else {\n            blocks = this.problem.enabledAnswerBlocks();\n        }\n        for (var i = 0; i < blocks.length; i++) {\n            var item = blocks[i];\n            if (chooseNext) {\n                this.problem.textFocus = item;\n                item.makeTabIndex();\n                $(item.view).focus();\n                return this;\n            } else {\n                if (item.view.id == this.view.id) {\n                    chooseNext = true;\n                }\n            }\n        }\n    }\n    // Toggle whether to move this block\n    toggleMove() {\n        if (this.problem.textMove) {\n            $(this.view).removeClass(\"up\");\n            $(this.view).addClass(\"down\");\n            this.problem.textMove = false;\n            this.problem.logMove(\"kmove\");\n        } else {\n            $(this.view).removeClass(\"down\");\n            $(this.view).addClass(\"up\");\n            this.problem.textMove = true;\n        }\n    }\n    // Answer a string that represents this codeblock for saving\n    hash() {\n        var hash = \"\";\n        for (var i = 0; i < this.lines.length; i++) {\n            hash += this.lines[i].index + \"_\";\n        }\n        hash += this.indent;\n        return hash;\n    }\n    // Answer what the indent should be for the solution\n    solutionIndent() {\n        var sharedIndent = this.lines[0].indent;\n        for (var i = 1; i < this.lines.length; i++) {\n            sharedIndent = Math.min(sharedIndent, this.lines[i].indent);\n        }\n        return sharedIndent;\n    }\n}\n","/* =====================================================================\n==== Parsons Runestone Directive Javascript ============================\n======== Renders a Parsons problem based on the HTML created by the\n======== parsons.py script and the RST file.\n==== CONTRIBUTORS ======================================================\n======== Isaiah Mayerchak\n======== Jeff Rick\n======== Barbara Ericson\n======== Cole Bowers\n==== Adapted form the original JS Parsons by ===========================\n======== Ville Karavirta\n======== Petri Ihantola\n======== Juha Helminen\n======== Mike Hewner\n===================================================================== */\n/* =====================================================================\n==== LineBasedGrader Object ============================================\n======== Used for grading a Parsons problem.\n==== PROPERTIES ========================================================\n======== problem: the Parsons problem\n===================================================================== */\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"./parsons-i18n.en.js\";\nimport \"./parsons-i18n.pt-br.js\";\nimport \"./prettify.js\";\nimport \"../css/parsons.less\";\nimport \"../css/prettify.css\";\nimport LineBasedGrader from \"./lineGrader\";\nimport DAGGrader from \"./dagGrader\";\nimport ParsonsLine from \"./parsonsLine\";\nimport ParsonsBlock from \"./parsonsBlock\";\n\n/* =====================================================================\n==== Parsons Object ====================================================\n======== The model and view of a Parsons problem based on what is\n======== specified in the HTML, which is based on what is specified\n======== in the RST file\n==== PROPERTIES ========================================================\n======== options: options largely specified from the HTML\n======== grader: a LineGrader for grading the problem\n======== lines: an array of all ParsonsLine as specified in the problem\n======== solution: an array of ParsonsLine in the solution\n======== blocks: the current blocks\n======== sourceArea: the element that contains the source blocks\n======== answerArea: the element that contains the answer blocks\n===================================================================== */\n\n/* =====================================================================\n==== INITIALIZATION ====================================================\n===================================================================== */\n\nexport default class Parsons extends RunestoneBase {\n    constructor(opts) {\n        super(opts);\n        var orig = opts.orig; // entire <pre> element that will be replaced by new HTML\n        this.containerDiv = orig;\n        this.origElem = $(orig).find(\"pre.parsonsblocks\")[0];\n        // Find the question text and store it in .question\n        this.question = $(orig).find(`.parsons_question`)[0];\n        this.useRunestoneServices = opts.useRunestoneServices;\n        this.divid = opts.orig.id;\n        // Set the storageId (key for storing data)\n        var storageId = super.localStorageKey();\n        this.storageId = storageId;\n        this.children = this.origElem.childNodes; // this contains all of the child elements of the entire tag...\n        this.contentArray = [];\n        Parsons.counter++; //    Unique identifier\n        this.counterId = \"parsons-\" + Parsons.counter;\n\n        // for (var i = 0; i < this.children.length; i++) {\n        //     if ($(this.children[i]).is(\"[data-question]\")) {\n        //         this.question = this.children[i];\n        //         break;\n        //     }\n        // }\n        this.initializeOptions();\n        this.grader =\n            this.options.grader === \"dag\"\n                ? new DAGGrader(this)\n                : new LineBasedGrader(this);\n        this.grader.showfeedback = this.showfeedback;\n        var fulltext = $(this.origElem).html();\n        this.blockIndex = 0;\n        this.checkCount = 0;\n        this.numDistinct = 0;\n        this.hasSolved = false;\n        this.initializeLines(fulltext.trim());\n        this.initializeView();\n        this.caption = \"Parsons\";\n        this.addCaption(\"runestone\");\n        // Check the server for an answer to complete things\n        this.checkServer(\"parsons\", true);\n        if (typeof Prism !== \"undefined\") {\n            Prism.highlightAllUnder(this.containerDiv);\n        }\n    }\n    // Based on the data-fields in the original HTML, initialize options\n    initializeOptions() {\n        var options = {\n            pixelsPerIndent: 30,\n        };\n        // add maxdist and order if present\n        var maxdist = $(this.origElem).data(\"maxdist\");\n        var order = $(this.origElem).data(\"order\");\n        var noindent = $(this.origElem).data(\"noindent\");\n        var adaptive = $(this.origElem).data(\"adaptive\");\n        var numbered = $(this.origElem).data(\"numbered\");\n        var grader = $(this.origElem).data(\"grader\");\n        options[\"numbered\"] = numbered;\n        options[\"grader\"] = grader;\n        if (maxdist !== undefined) {\n            options[\"maxdist\"] = maxdist;\n        }\n        if (order !== undefined) {\n            // convert order string to array of numbers\n            order = order.match(/\\d+/g);\n            for (var i = 0; i < order.length; i++) {\n                order[i] = parseInt(order[i]);\n            }\n            options[\"order\"] = order;\n        }\n        if (noindent == undefined) {\n            noindent = false;\n        }\n        options[\"noindent\"] = noindent;\n        this.noindent = noindent;\n        if (adaptive == undefined) {\n            adaptive = false;\n        } else if (adaptive) {\n            this.initializeAdaptive();\n        }\n        options[\"adaptive\"] = adaptive;\n        // add locale and language\n        var locale = eBookConfig.locale;\n        if (locale == undefined) {\n            locale = \"en\";\n        }\n        options[\"locale\"] = locale;\n        var language = $(this.origElem).data(\"language\");\n        if (language == undefined) {\n            language = eBookConfig.language;\n            if (language == undefined) {\n                language = \"python\";\n            }\n        }\n        options[\"language\"] = language;\n        var prettifyLanguage = {\n            python: \"prettyprint lang-py\",\n            java: \"prettyprint lang-java\",\n            javascript: \"prettyprint lang-js\",\n            html: \"prettyprint lang-html\",\n            c: \"prettyprint lang-c\",\n            \"c++\": \"prettyprint lang-cpp\",\n            ruby: \"prettyprint lang-rb\",\n        }[language];\n        if (prettifyLanguage == undefined) {\n            prettifyLanguage = \"\";\n        }\n        options[\"prettifyLanguage\"] = prettifyLanguage;\n        this.options = options;\n    }\n    // Based on what is specified in the original HTML, create the HTML view\n    initializeView() {\n        this.outerDiv = document.createElement(\"div\");\n        $(this.outerDiv).addClass(\"parsons\");\n        this.outerDiv.id = this.counterId;\n        this.parsTextDiv = document.createElement(\"div\");\n        $(this.parsTextDiv).addClass(\"parsons-text\");\n        this.keyboardTip = document.createElement(\"div\");\n        $(this.keyboardTip).attr(\"role\", \"tooltip\");\n        this.keyboardTip.id = this.counterId + \"-tip\";\n        this.keyboardTip.innerHTML = $.i18n(\"msg_parson_arrow_navigate\");\n        this.outerDiv.appendChild(this.keyboardTip);\n        $(this.keyboardTip).hide();\n        this.sortContainerDiv = document.createElement(\"div\");\n        $(this.sortContainerDiv).addClass(\"sortable-code-container\");\n        $(this.sortContainerDiv).attr(\n            \"aria-describedby\",\n            this.counterId + \"-tip\"\n        );\n        this.outerDiv.appendChild(this.sortContainerDiv);\n        this.sourceRegionDiv = document.createElement(\"div\");\n        this.sourceRegionDiv.id = this.counterId + \"-sourceRegion\";\n        $(this.sourceRegionDiv).addClass(\"sortable-code\");\n        this.sourceLabel = document.createElement(\"div\");\n        $(this.sourceLabel).attr(\"role\", \"tooltip\");\n        this.sourceLabel.id = this.counterId + \"-sourceTip\";\n        this.sourceLabel.innerHTML = $.i18n(\"msg_parson_drag_from_here\");\n        this.sourceRegionDiv.appendChild(this.sourceLabel);\n        this.sortContainerDiv.appendChild(this.sourceRegionDiv);\n        this.sourceArea = document.createElement(\"div\");\n        this.sourceArea.id = this.counterId + \"-source\";\n        $(this.sourceArea).addClass(\"source\");\n        $(this.sourceArea).attr(\n            \"aria-describedby\",\n            this.counterId + \"-sourceTip\"\n        );\n        // set the source width to its max value.  This allows the blocks to be created\n        // at their \"natural\" size. As long as that is smaller than the max.\n        // This allows us to use sensible functions to determine the correct heights\n        // and widths for the drag and drop areas.\n        this.sourceArea.style.width = \"425px\"; // The max it will be resized later.\n        this.sourceRegionDiv.appendChild(this.sourceArea);\n        this.answerRegionDiv = document.createElement(\"div\");\n        this.answerRegionDiv.id = this.counterId + \"-answerRegion\";\n        $(this.answerRegionDiv).addClass(\"sortable-code\");\n        this.answerLabel = document.createElement(\"div\");\n        $(this.answerLabel).attr(\"role\", \"tooltip\");\n        this.answerLabel.id = this.counterId + \"-answerTip\";\n        this.answerLabel.innerHTML = $.i18n(\"msg_parson_drag_to_here\");\n        this.answerRegionDiv.appendChild(this.answerLabel);\n        this.sortContainerDiv.appendChild(this.answerRegionDiv);\n        this.answerArea = document.createElement(\"div\");\n        this.answerArea.id = this.counterId + \"-answer\";\n        $(this.answerArea).attr(\n            \"aria-describedby\",\n            this.counterId + \"-answerTip\"\n        );\n        this.answerRegionDiv.appendChild(this.answerArea);\n        this.parsonsControlDiv = document.createElement(\"div\");\n        $(this.parsonsControlDiv).addClass(\"parsons-controls\");\n        this.outerDiv.appendChild(this.parsonsControlDiv);\n        var that = this;\n        this.checkButton = document.createElement(\"button\");\n        $(this.checkButton).attr(\"class\", \"btn btn-success\");\n        this.checkButton.textContent = $.i18n(\"msg_parson_check_me\");\n        this.checkButton.id = this.counterId + \"-check\";\n        this.parsonsControlDiv.appendChild(this.checkButton);\n        this.checkButton.type = \"button\";\n        this.checkButton.addEventListener(\"click\", function (event) {\n            event.preventDefault();\n            that.checkCurrentAnswer();\n            that.logCurrentAnswer();\n            that.renderFeedback();\n        });\n        this.resetButton = document.createElement(\"button\");\n        $(this.resetButton).attr(\"class\", \"btn btn-default\");\n        this.resetButton.textContent = $.i18n(\"msg_parson_reset\");\n        this.resetButton.id = this.counterId + \"-reset\";\n        this.resetButton.type = \"button\";\n        this.parsonsControlDiv.appendChild(this.resetButton);\n        this.resetButton.addEventListener(\"click\", function (event) {\n            event.preventDefault();\n            that.clearFeedback();\n            $(that.checkButton).prop(\"disabled\", false);\n            that.resetView();\n            that.checkCount = 0;\n            that.logMove(\"reset\");\n            that.setLocalStorage();\n        });\n        if (this.options.adaptive) {\n            this.helpButton = document.createElement(\"button\");\n            $(this.helpButton).attr(\"class\", \"btn btn-primary\");\n            this.helpButton.textContent = $.i18n(\"msg_parson_help\");\n            this.helpButton.id = this.counterId + \"-help\";\n            this.helpButton.disabled = false; // bje\n            this.parsonsControlDiv.appendChild(this.helpButton);\n            this.helpButton.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                that.helpMe();\n            });\n        }\n        this.messageDiv = document.createElement(\"div\");\n        this.messageDiv.id = this.counterId + \"-message\";\n        this.parsonsControlDiv.appendChild(this.messageDiv);\n        $(this.messageDiv).hide();\n        $(this.origElem).replaceWith(this.outerDiv);\n        $(this.outerDiv).closest(\".sqcontainer\").css(\"max-width\", \"none\");\n        if (this.outerDiv) {\n            if ($(this.question).html().match(/^\\s+$/)) {\n                $(this.question).remove();\n            } else {\n                $(this.outerDiv).prepend(this.question);\n            }\n        }\n    }\n    // Initialize lines and solution properties\n    initializeLines(text) {\n        this.lines = [];\n        // Create the initial blocks\n        var textBlocks = text.split(\"---\");\n        if (textBlocks.length === 1) {\n            // If there are no ---, then every line is its own block\n            textBlocks = text.split(\"\\n\");\n        }\n        var solution = [];\n        var indents = [];\n        for (var i = 0; i < textBlocks.length; i++) {\n            var textBlock = textBlocks[i];\n            // Figure out options based on the #option\n            // Remove the options from the code\n            // only options are #paired or #distractor\n            var options = {};\n            var distractIndex;\n            var distractHelptext = \"\";\n            var tagIndex;\n            var tag;\n            var dependsIndex;\n            var depends = [];\n            if (textBlock.includes(\"#paired:\")) {\n                distractIndex = textBlock.indexOf(\"#paired:\");\n                distractHelptext = textBlock\n                    .substring(distractIndex + 8, textBlock.length)\n                    .trim();\n                textBlock = textBlock.substring(0, distractIndex + 7);\n            } else if (textBlock.includes(\"#distractor:\")) {\n                distractIndex = textBlock.indexOf(\"#distractor:\");\n                distractHelptext = textBlock\n                    .substring(distractIndex + 12, textBlock.length)\n                    .trim();\n                textBlock = textBlock.substring(0, distractIndex + 11);\n            } else if (textBlock.includes(\"#tag:\")) {\n                textBlock = textBlock.replace(/#tag:.*;.*;/, (s) =>\n                    s.replace(/\\s+/g, \"\")\n                ); // remove whitespace in tag and depends list\n                tagIndex = textBlock.indexOf(\"#tag:\");\n                tag = textBlock.substring(\n                    tagIndex + 5,\n                    textBlock.indexOf(\";\", tagIndex + 5)\n                );\n                if (tag == \"\") tag = \"block-\" + i;\n                dependsIndex = textBlock.indexOf(\";depends:\");\n                let dependsString = textBlock.substring(\n                    dependsIndex + 9,\n                    textBlock.indexOf(\";\", dependsIndex + 9)\n                );\n                depends =\n                    dependsString.length > 0 ? dependsString.split(\",\") : [];\n            }\n            if (textBlock.includes('class=\"displaymath')) {\n                options[\"displaymath\"] = true;\n            } else {\n                options[\"displaymath\"] = false;\n            }\n            textBlock = textBlock.replace(\n                /#(paired|distractor|tag:.*;.*;)/,\n                function (mystring, arg1) {\n                    options[arg1] = true;\n                    return \"\";\n                }\n            );\n            // Create lines\n            var lines = [];\n            if (!options[\"displaymath\"]) {\n                var split = textBlock.split(\"\\n\");\n            } else {\n                var split = [textBlock];\n            }\n            for (var j = 0; j < split.length; j++) {\n                var code = split[j];\n                // discard blank rows\n                if (!/^\\s*$/.test(code)) {\n                    var line = new ParsonsLine(\n                        this,\n                        code,\n                        options[\"displaymath\"]\n                    );\n                    lines.push(line);\n                    if (options[\"paired\"]) {\n                        line.distractor = true;\n                        line.paired = true;\n                        line.distractHelptext = distractHelptext;\n                    } else if (options[\"distractor\"]) {\n                        line.distractor = true;\n                        line.paired = false;\n                        line.distractHelptext = distractHelptext;\n                    } else {\n                        line.distractor = false;\n                        line.paired = false;\n                        if (this.options.grader === \"dag\") {\n                            line.tag = tag;\n                            line.depends = depends;\n                        }\n                        solution.push(line);\n                    }\n                    if ($.inArray(line.indent, indents) == -1) {\n                        indents.push(line.indent);\n                    }\n                }\n            }\n            if (lines.length > 0) {\n                // Add groupWithNext\n                for (j = 0; j < lines.length - 1; j++) {\n                    lines[j].groupWithNext = true;\n                }\n                lines[lines.length - 1].groupWithNext = false;\n            }\n        }\n        // Normalize the indents\n        indents = indents.sort(function (a, b) {\n            return a - b;\n        });\n        for (i = 0; i < this.lines.length; i++) {\n            line = this.lines[i];\n            line.indent = indents.indexOf(line.indent);\n        }\n        this.solution = solution;\n    }\n    // Based on the blocks, create the source and answer areas\n    async initializeAreas(sourceBlocks, answerBlocks, options) {\n        // Create blocks property as the sum of the two\n        var blocks = [];\n        var i, block;\n        for (i = 0; i < sourceBlocks.length; i++) {\n            block = sourceBlocks[i];\n            blocks.push(block);\n            this.sourceArea.appendChild(block.view);\n        }\n        for (i = 0; i < answerBlocks.length; i++) {\n            block = answerBlocks[i];\n            blocks.push(block);\n            this.answerArea.appendChild(block.view);\n        }\n        this.blocks = blocks;\n        // If present, disable some blocks\n        var disabled = options.disabled;\n        if (disabled !== undefined) {\n            for (i = 0; i < blocks.length; i++) {\n                block = blocks[i];\n                if (disabled.includes(block.lines[0].index)) {\n                    $(block.view).addClass(\"disabled\");\n                }\n            }\n        }\n        // Determine how much indent should be possible in the answer area\n        var indent = 0;\n        if (!this.noindent) {\n            if (this.options.language == \"natural\") {\n                indent = this.solutionIndent();\n            } else {\n                indent = Math.max(0, this.solutionIndent());\n            }\n        }\n        this.indent = indent;\n        // For rendering, place in an onscreen position\n        var isHidden = this.outerDiv.offsetParent == null;\n        var replaceElement;\n        if (isHidden) {\n            replaceElement = document.createElement(\"div\");\n            replaceElement.classList.add(\"runestone-sphinx\");\n            $(this.outerDiv).replaceWith(replaceElement);\n            // add runestone-sphinx class so the css rules for parsons will apply\n            $(this.outerDiv).addClass(\"runestone-sphinx\");\n            document.body.appendChild(this.outerDiv);\n        }\n        if (this.options.prettifyLanguage !== \"\") {\n            prettyPrint();\n        }\n        for (let i = 0; i < this.lines.length; i++) {\n            this.lines[i].initializeWidth();\n        }\n        // Layout the areas\n        var areaWidth, areaHeight;\n        // Establish the width and height of the droppable areas\n        var item, maxFunction;\n        areaHeight = 20;\n        var height_add = 0;\n        if (this.options.numbered != undefined) {\n            height_add = 1;\n        }\n        // Warning -- all of this is just a bit of pixie dust discovered by trial\n        // and error to try to get the height of the drag and drop boxes.\n        // item is a jQuery object\n        // outerHeight can be unreliable if elements are not yet visible\n        // outerHeight will return bad results if MathJax has not rendered the math\n        areaWidth = 300;\n        let self = this;\n        maxFunction = async function (item) {\n            if (\n                this.options.language == \"natural\" ||\n                this.options.language == \"math\"\n            ) {\n                if (typeof runestoneMathready !== \"undefined\") {\n                    await runestoneMathReady.then(\n                        async () => await self.queueMathJax(item[0])\n                    );\n                } else {\n                    // this is for older rst builds not ptx\n                    if (typeof MathJax.startup !== \"undefined\") {\n                        await self.queueMathJax(item[0]);\n                    }\n                }\n            }\n            areaWidth = Math.max(areaWidth, item.outerWidth(true));\n            item.width(areaWidth - 22);\n            var addition = 3.8;\n            let outerH = item.outerHeight(true);\n            if (outerH != 38) {\n                addition = (3.1 * (outerH - 38)) / 21;\n            }\n            areaHeight += outerH + height_add * addition;\n        }.bind(this);\n        for (i = 0; i < blocks.length; i++) {\n            await maxFunction($(blocks[i].view));\n        }\n        // sometimes we have a problem with hidden elements not getting the right height\n        // just make sure that we have a reasonable height. There must be a better way to\n        // do this.\n        if (this.isTimed && areaHeight < blocks.length * 38) {\n            areaHeight = blocks.length * 50;\n        }\n        this.areaWidth = areaWidth;\n        if (this.options.numbered != undefined) {\n            this.areaWidth += 25;\n            //areaHeight += (blocks.length);\n        }\n        // + 40 to areaHeight to provide some additional buffer in case any text overflow still happens - Vincent Qiu (September 2020)\n        if (indent > 0 && indent <= 4) {\n            $(this.answerArea).addClass(\"answer\" + indent);\n        } else {\n            $(this.answerArea).addClass(\"answer\");\n        }\n        // Initialize paired distractor decoration\n        var bins = [];\n        var bin = [];\n        for (i = 0; i < this.lines.length; i++) {\n            var line = this.lines[i];\n            if (line.block() == undefined) {\n                if (bin.length > 0) {\n                    bins.push(bin);\n                    bin = [];\n                }\n            } else {\n                bin.push(line);\n                if (!line.groupWithNext) {\n                    bins.push(bin);\n                    bin = [];\n                }\n            }\n        }\n        var pairedBins = [];\n        var lineNumbers = [];\n        var pairedDivs = [];\n        var j;\n        if (this.pairDistractors || !this.options.adaptive) {\n            for (i = bins.length - 1; i > -1; i--) {\n                bin = bins[i];\n                if (bin[0].paired) {\n                    // Add all in bin to line numbers\n                    for (j = bin.length - 1; j > -1; j--) {\n                        lineNumbers.unshift(bin[j].index);\n                    }\n                } else {\n                    if (lineNumbers.length > 0) {\n                        // Add all in bin to line numbers\n                        for (j = bin.length - 1; j > -1; j--) {\n                            lineNumbers.unshift(bin[j].index);\n                        }\n                        pairedBins.unshift(lineNumbers);\n                        lineNumbers = [];\n                    }\n                }\n            }\n            for (i = 0; i < pairedBins.length; i++) {\n                var pairedDiv = document.createElement(\"div\");\n                $(pairedDiv).addClass(\"paired\");\n                $(pairedDiv).html(\n                    \"<span id= 'st' style = 'vertical-align: middle; font-weight: bold'>or{</span>\"\n                );\n                pairedDivs.push(pairedDiv);\n                this.sourceArea.appendChild(pairedDiv);\n            }\n        } else {\n            pairedBins = [];\n        }\n        areaHeight += pairedBins.length * 10; // the paired bins take up extra space which can\n        // cause the blocks to spill out.  This\n        // corrects that by adding a little extra\n        this.areaHeight = areaHeight + 40;\n        $(this.sourceArea).css({\n            width: this.areaWidth + 2,\n            height: areaHeight,\n        });\n        $(this.answerArea).css({\n            width: this.options.pixelsPerIndent * indent + this.areaWidth + 2,\n            height: areaHeight,\n        });\n\n        this.pairedBins = pairedBins;\n        this.pairedDivs = pairedDivs;\n        if (this.options.numbered != undefined) {\n            this.addBlockLabels(sourceBlocks.concat(answerBlocks));\n        }\n        // Update the view\n        this.state = undefined; // needs to be here for loading from storage\n        this.updateView();\n        // Put back into the offscreen position\n        if (isHidden) {\n            $(replaceElement).replaceWith(this.outerDiv);\n        }\n    }\n    // Make blocks interactive (both drag-and-drop and keyboard)\n    initializeInteractivity() {\n        for (var i = 0; i < this.blocks.length; i++) {\n            this.blocks[i].initializeInteractivity();\n        }\n        this.initializeTabIndex();\n        let self = this;\n        if (\n            this.options.language == \"natural\" ||\n            this.options.language == \"math\"\n        ) {\n            if (typeof MathJax.startup !== \"undefined\") {\n                self.queueMathJax(self.outerDiv);\n            }\n        }\n    }\n    // Make one block be keyboard accessible\n    initializeTabIndex() {\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            if (block.enabled()) {\n                block.makeTabIndex();\n                return this;\n            }\n        }\n    }\n    /* =====================================================================\n    ==== SERVER COMMUNICATION ==============================================\n    ===================================================================== */\n    // Return the argument that is newer based on the timestamp\n    newerData(dataA, dataB) {\n        var dateA = dataA.timestamp;\n        var dateB = dataB.timestamp;\n        if (dateA == undefined) {\n            return dataB;\n        }\n        if (dateB == undefined) {\n            return dataA;\n        }\n        dateA = this.dateFromTimestamp(dateA);\n        dateB = this.dateFromTimestamp(dateB);\n        if (dateA > dateB) {\n            return dataA;\n        } else {\n            return dataB;\n        }\n    }\n    // Based on the data, load\n    async loadData(data) {\n        var sourceHash = data.source;\n        if (sourceHash == undefined) {\n            // maintain backwards compatibility\n            sourceHash = data.trash;\n        }\n        var answerHash = data.answer;\n        var adaptiveHash = data.adaptive;\n        var options;\n        if (adaptiveHash == undefined) {\n            options = {};\n        } else {\n            options = this.optionsFromHash(adaptiveHash);\n        }\n        if (options.noindent !== undefined) {\n            this.noindent = true;\n        }\n        if (options.checkCount !== undefined) {\n            this.checkCount = options.checkCount;\n        }\n        if (options.hasSolved !== undefined) {\n            this.hasSolved = options.hasSolved;\n        }\n        if (\n            sourceHash == undefined ||\n            answerHash == undefined ||\n            answerHash.length == 1\n        ) {\n            await this.initializeAreas(this.blocksFromSource(), [], options);\n        } else {\n            this.initializeAreas(\n                this.blocksFromHash(sourceHash),\n                this.blocksFromHash(answerHash),\n                options\n            );\n            this.grade = this.grader.grade();\n            this.correct = this.grade;\n        }\n        // Start the interface\n        if (this.needsReinitialization !== true) {\n            this.initializeInteractivity();\n            // This is a bit of a hack to get the blocks to be in the right place\n            // when the page loads.  It is needed because the blocks are not\n            // visible when the page loads, so the size is off.  This forces\n            // a realignment.\n            if (this.isTimed && !this.assessmentTaken) {\n                this.resetView();\n            }\n        }\n    }\n    // Return what is stored in local storage\n    localData() {\n        var data = localStorage.getItem(this.storageId);\n        if (data !== null) {\n            if (data.charAt(0) == \"{\") {\n                data = JSON.parse(data);\n            } else {\n                data = {};\n            }\n        } else {\n            data = {};\n        }\n        return data;\n    }\n    // RunestoneBase: Sent when the server has data\n    restoreAnswers(serverData) {\n        this.loadData(serverData);\n    }\n    // RunestoneBase: Load what is in local storage\n    checkLocalStorage() {\n        if (this.graderactive) {\n            return;\n        }\n        this.loadData(this.localData());\n    }\n    // RunestoneBase: Set the state of the problem in local storage\n    setLocalStorage(data) {\n        var toStore;\n        if (data == undefined) {\n            toStore = {\n                source: this.sourceHash(),\n                answer: this.answerHash(),\n                timestamp: new Date(),\n            };\n            var adaptiveHash = this.adaptiveHash();\n            if (adaptiveHash.length > 0) {\n                toStore.adaptive = adaptiveHash;\n            }\n        } else {\n            toStore = data;\n        }\n        localStorage.setItem(this.storageId, JSON.stringify(toStore));\n    }\n    /* =====================================================================\n    ==== LOGGING ===========================================================\n    ===================================================================== */\n    // Log the interaction with the problem to the server:\n    //   start: the user started interacting with this problem\n    //   move: the user moved a block to a new position\n    //   reset: the reset button was pressed\n    //   removeDistractor: \"Help Me\" removed a distractor\n    //   removeIndentation: \"Help Me\" removed indentation\n    //   combineBlocks: \"Help Me\" combined blocks\n    logMove(activity) {\n        var event = {\n            event: \"parsonsMove\",\n            div_id: this.divid,\n            storageid: super.localStorageKey(),\n        };\n        var act = activity + \"|\" + this.sourceHash() + \"|\" + this.answerHash();\n        var adaptiveHash = this.adaptiveHash();\n        if (adaptiveHash !== \"\") {\n            act = act + \"|\" + adaptiveHash;\n        }\n        event.act = act;\n        this.logBookEvent(event);\n    }\n    // Log the answer to the problem\n    //   correct: The answer given matches the solution\n    //   incorrect*: The answer is wrong for various reasons\n    async logCurrentAnswer(sid) {\n        var event = {\n            event: \"parsons\",\n            div_id: this.divid,\n        };\n        var answerHash = this.answerHash();\n        event.answer = answerHash;\n        var sourceHash = this.sourceHash();\n        event.source = sourceHash;\n        var act = sourceHash + \"|\" + answerHash;\n        var adaptiveHash = this.adaptiveHash();\n        if (adaptiveHash !== \"\") {\n            event.adaptive = adaptiveHash;\n            act = act + \"|\" + adaptiveHash;\n        }\n        if (this.grade == \"correct\") {\n            act = \"correct|\" + act;\n            event.correct = \"T\";\n        } else {\n            act = \"incorrect|\" + act;\n            event.correct = \"F\";\n        }\n        event.act = act;\n\n        if (typeof sid !== \"undefined\") {\n            event.sid = sid;\n        }\n\n        await this.logBookEvent(event);\n    }\n    /* =====================================================================\n    ==== ACCESSING =========================================================\n    ===================================================================== */\n    // Answer the hash of the adaptive state\n    adaptiveHash() {\n        if (!this.options.adaptive) {\n            return \"\";\n        }\n        var hash = [];\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            if (!block.enabled()) {\n                hash.push(\"d\" + block.lines[0].index);\n            }\n        }\n        if (this.noindent !== this.options.noindent) {\n            hash.push(\"i\");\n        }\n        hash.push(\"c\" + this.checkCount);\n        if (this.hasSolved) {\n            hash.push(\"s\");\n        }\n        return hash.join(\"-\");\n    }\n    // Create options for creating blocks based on a hash\n    optionsFromHash(hash) {\n        var split;\n        if (hash === \"-\" || hash === \"\" || hash === null) {\n            split = [];\n        } else {\n            split = hash.split(\"-\");\n        }\n        var options = {};\n        var disabled = [];\n        for (var i = 0; i < split.length; i++) {\n            var key = split[i];\n            if (key[0] == \"i\") {\n                options.noindent = true;\n            } else if (key[0] == \"d\") {\n                disabled.push(parseInt(key.slice(1)));\n            } else if (key[0] == \"s\") {\n                options.hasSolved = true;\n            } else if (key[0] == \"c\") {\n                options.checkCount = parseInt(key.slice(1));\n            }\n        }\n        if (disabled.length > 0) {\n            options.disabled = disabled;\n        }\n        return options;\n    }\n    // Answer the hash of the answer area\n    answerHash() {\n        var hash = [];\n        var blocks = this.answerBlocks();\n        for (var i = 0; i < blocks.length; i++) {\n            hash.push(blocks[i].hash());\n        }\n        if (hash.length === 0) {\n            return \"-\";\n        } else {\n            return hash.join(\"-\");\n        }\n    }\n    // Answer the hash of the source area\n    sourceHash() {\n        var hash = [];\n        var blocks = this.sourceBlocks();\n        for (var i = 0; i < blocks.length; i++) {\n            hash.push(blocks[i].hash());\n        }\n        if (hash.length === 0) {\n            return \"-\";\n        } else {\n            return hash.join(\"-\");\n        }\n    }\n    // Inter-problem adaptive changes\n    // Based on the recentAttempts, remove distractors, add indent, combine blocks\n    adaptBlocks(input) {\n        var blocks = [];\n        var distractors = [];\n        var block;\n        for (var i = 0; i < input.length; i++) {\n            block = input[i];\n            if (block.isDistractor()) {\n                distractors.push(block);\n            } else {\n                blocks.push(block);\n            }\n        }\n        this.recentAttempts = localStorage.getItem(\n            this.adaptiveId + \"recentAttempts\"\n        );\n        if (this.recentAttempts == undefined || this.recentAttempts == \"NaN\") {\n            this.recentAttempts = 3;\n        }\n        var lastestAttemptCount = this.recentAttempts;\n        var nBlocks = blocks.length;\n        var nBlocksToCombine = 0;\n        var nDistractors = distractors.length;\n        var nToRemove = 0;\n        this.pairDistractors = true;\n        var giveIndentation = false;\n        if (lastestAttemptCount < 2) {\n            // 1 Try\n            this.pairDistractors = false;\n            this.limitDistractors = false;\n        } else if (lastestAttemptCount < 4) {\n            // 2-3 Tries\n            // Do nothing they are doing normal\n            this.pairDistractors = true;\n        } else if (lastestAttemptCount < 6) {\n            // 4-5 Tries\n            // pair distractors\n            this.pairDistractors = true;\n        } else if (lastestAttemptCount < 8) {\n            // 6-7 Tries\n            // Remove 50% of distractors\n            nToRemove = 0.5 * nDistractors;\n            this.pairDistractors = true;\n        } else {\n            // 8+ Tries\n            // Remove all of distractors\n            nToRemove = nDistractors;\n            this.pairDistractors = true;\n        }\n        /*\n        else if(lastestAttemptCount < 12) { //10-11\n            // Remove all distractors and give indentation\n            nToRemove = nDistractors;\n            giveIndentation = true;\n            this.pairDistractors = true;\n        } else if(lastestAttemptCount < 14) { // 12-13 Tries\n            // Remove all of distractors\n            // give indentation\n            // reduce problem to 3/4 size\n            giveIndentation = true;\n            nToRemove = nDistractors;\n            nBlocksToCombine = .25 * nBlocks;\n            this.pairDistractors = true;\n        } else { // >= 14 Tries\n            // Remove all of distractors\n            // give indentation\n            // reduce problem to 1/2 size\n            giveIndentation = true;\n            nToRemove = nDistractors;\n            nBlocksToCombine = .5 * nBlocks;\n            this.pairDistractors = true;\n        }\n        */\n        nBlocksToCombine = Math.min(nBlocksToCombine, nBlocks - 3);\n        // Never combine so where there are less than three blocks left\n        // Remove distractors\n        distractors = this.shuffled(distractors);\n        distractors = distractors.slice(0, nToRemove);\n        var output = [];\n        for (i = 0; i < input.length; i++) {\n            block = input[i];\n            if (!block.isDistractor()) {\n                output.push(block);\n            } else if ($.inArray(block, distractors) == -1) {\n                output.push(block);\n            }\n        }\n        //var output = input;\n        if (giveIndentation) {\n            for (let i = 0; i < output.length; i++) {\n                output[i].addIndent();\n            }\n            this.indent = 0;\n            this.noindent = true;\n        }\n        // combine blocks\n        var solution = [];\n        for (i = 0; i < this.lines.length; i++) {\n            for (var j = 0; j < output.length; j++) {\n                if (output[j].lines[0].index == i) {\n                    solution.push(output[j]);\n                }\n            }\n        }\n        for (let i = 0; i < nBlocksToCombine; i++) {\n            // combine one set of blocks\n            var best = -10;\n            var combineIndex = -10;\n            for (j = 0; j < solution.length - 1; j++) {\n                block = solution[j];\n                var next = solution[j + 1];\n                var rating = 10 - block.lines.length - next.lines.length;\n                var blockIndent = block.minimumLineIndent();\n                var nextIndent = next.minimumLineIndent();\n                if (blockIndent == nextIndent) {\n                    rating += 2;\n                } else if (blockIndent > nextIndent) {\n                    rating -= 1;\n                }\n                if (\n                    block.lines[block.lines.length - 1].indent ==\n                    next.lines[0].indent\n                ) {\n                    rating += 1;\n                }\n                if (rating >= best) {\n                    best = rating;\n                    combineIndex = j;\n                }\n            }\n            block = solution[combineIndex];\n            next = solution[combineIndex + 1];\n            for (j = 0; j < next.lines.length; j++) {\n                block.addLine(next.lines[j]);\n            }\n            var newSolution = [];\n            for (j = 0; j < solution.length; j++) {\n                if (j !== combineIndex + 1) {\n                    newSolution.push(solution[j]);\n                }\n            }\n            var solution = newSolution;\n        }\n        // reorder\n        var combinedOutput = [];\n        for (i = 0; i < output.length; i++) {\n            for (j = 0; j < solution.length; j++) {\n                if (output[i].lines[0].index == solution[j].lines[0].index) {\n                    combinedOutput.push(solution[j]);\n                }\n            }\n        }\n        return combinedOutput;\n    }\n    // Return an array of code blocks based on what is specified in the problem\n    blocksFromSource() {\n        var unorderedBlocks = [];\n        var originalBlocks = [];\n        var blocks = [];\n        var lines = [];\n        var block, line, i;\n        for (i = 0; i < this.lines.length; i++) {\n            line = this.lines[i];\n            lines.push(line);\n            if (!line.groupWithNext) {\n                unorderedBlocks.push(new ParsonsBlock(this, lines));\n                lines = [];\n            }\n        }\n        originalBlocks = unorderedBlocks;\n        // Trim the distractors\n        var removedBlocks = [];\n        if (this.options.maxdist !== undefined) {\n            var maxdist = this.options.maxdist;\n            var distractors = [];\n            for (i = 0; i < unorderedBlocks.length; i++) {\n                block = unorderedBlocks[i];\n                if (block.lines[0].distractor) {\n                    distractors.push(block);\n                }\n            }\n            if (maxdist < distractors.length) {\n                distractors = this.shuffled(distractors);\n                distractors = distractors.slice(0, maxdist);\n                for (i = 0; i < unorderedBlocks.length; i++) {\n                    block = unorderedBlocks[i];\n                    if (block.lines[0].distractor) {\n                        if ($.inArray(block, distractors) > -1) {\n                            blocks.push(block);\n                        } else {\n                            removedBlocks.push(i);\n                        }\n                    } else {\n                        blocks.push(block);\n                    }\n                }\n                unorderedBlocks = blocks;\n                blocks = [];\n            }\n        }\n\n        // This is necessary, set the pairDistractors value before blocks get shuffled - William Li (August 2020)\n        if (this.recentAttempts < 2) {\n            // 1 Try\n            this.pairDistractors = false;\n        } else {\n            this.pairDistractors = true;\n        }\n\n        if (this.options.order === undefined) {\n            // Shuffle, respecting paired distractors\n            var chunks = [],\n                chunk = [];\n            for (i = 0; i < unorderedBlocks.length; i++) {\n                block = unorderedBlocks[i];\n                if (block.lines[0].paired && this.pairDistractors) {\n                    // William Li (August 2020)\n                    chunk.push(block);\n                } else {\n                    chunk = [];\n                    chunk.push(block);\n                    chunks.push(chunk);\n                }\n            }\n            chunks = this.shuffled(chunks);\n            for (i = 0; i < chunks.length; i++) {\n                chunk = chunks[i];\n                if (chunk.length > 1) {\n                    // shuffle paired distractors\n                    chunk = this.shuffled(chunk);\n                    for (j = 0; j < chunk.length; j++) {\n                        blocks.push(chunk[j]);\n                    }\n                } else {\n                    blocks.push(chunk[0]);\n                }\n            }\n        } else {\n            // Order according to order specified\n            for (i = 0; i < this.options.order.length; i++) {\n                block = originalBlocks[this.options.order[i]];\n                if (\n                    block !== undefined &&\n                    $.inArray(this.options.order[i], removedBlocks) < 0\n                ) {\n                    blocks.push(block);\n                }\n            }\n        }\n        this.pairDistractors = true;\n        if (this.options.adaptive) {\n            this.limitDistractors = true;\n            blocks = this.adaptBlocks(blocks);\n            if (!this.limitDistractors) {\n                for (i = 0; i < removedBlocks.length; i++) {\n                    var index =\n                        this.options.order == undefined\n                            ? Math.random(0, blocks.length)\n                            : $.inArray(removedBlocks[i], this.options.order);\n                    blocks.splice(index, 0, originalBlocks[removedBlocks[i]]);\n                }\n            }\n        }\n        if (this.pairDistractors && this.options.order != undefined) {\n            //move pairs together\n            //Go through array looking for ditractor and its pair\n            for (i = 1; i < originalBlocks.length; i++) {\n                if (\n                    originalBlocks[i].lines[0].paired &&\n                    $.inArray(originalBlocks[i], blocks) >= 0\n                ) {\n                    var j = i;\n                    while ($.inArray(originalBlocks[j - 1], blocks) < 0) {\n                        // find the paired distractor or solution block it will be next to\n                        j--;\n                    }\n                    var indexTo = $.inArray(originalBlocks[j - 1], blocks);\n                    var indexFrom = $.inArray(originalBlocks[i], blocks);\n                    blocks.splice(indexFrom, 1);\n                    blocks.splice(indexTo, 0, originalBlocks[i]);\n                }\n            }\n        }\n        return blocks;\n    }\n    // Return a codeblock that corresponds to the hash\n    blockFromHash(hash) {\n        var split = hash.split(\"_\");\n        var lines = [];\n        for (var i = 0; i < split.length - 1; i++) {\n            lines.push(this.lines[split[i]]);\n        }\n        var block = new ParsonsBlock(this, lines);\n        if (this.noindent) {\n            block.indent = 0;\n        } else {\n            block.indent = Number(split[split.length - 1]);\n        }\n        return block;\n    }\n    // Return an array of codeblocks that corresponds to the hash\n    blocksFromHash(hash) {\n        var split;\n        if (hash === \"-\" || hash === \"\" || hash === null) {\n            split = [];\n        } else {\n            split = hash.split(\"-\");\n        }\n        var blocks = [];\n        for (var i = 0; i < split.length; i++) {\n            blocks.push(this.blockFromHash(split[i]));\n        }\n        if (this.options.adaptive) {\n            return this.adaptBlocks(blocks);\n        } else {\n            return blocks;\n        }\n    }\n    // Return a block object by the full id including id prefix\n    getBlockById(id) {\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            if (block.view.id == id) {\n                return block;\n            }\n        }\n        return undefined;\n    }\n    // Return array of codeblocks that are the solution\n    solutionBlocks() {\n        var solutionBlocks = [];\n        var solutionLines = [];\n        for (var i = 0; i < this.lines.length; i++) {\n            if (!this.lines[i].distractor) {\n                solutionLines.push(this.lines[i]);\n            }\n        }\n        var block = solutionLines[0].block();\n        solutionBlocks.push(block);\n        for (let i = 1; i < solutionLines.length; i++) {\n            var nextBlock = solutionLines[i].block();\n            if (block !== nextBlock) {\n                block = nextBlock;\n                solutionBlocks.push(block);\n            }\n        }\n        return solutionBlocks;\n    }\n    // Return array of codeblocks based on what is in the source field\n    sourceBlocks() {\n        var sourceBlocks = [];\n        var children = this.sourceArea.childNodes;\n        for (var i = 0; i < children.length; i++) {\n            var child = children[i];\n            if ($(child).hasClass(\"block\")) {\n                sourceBlocks.push(this.getBlockById(child.id));\n            }\n        }\n        return sourceBlocks;\n    }\n    // Return array of enabled codeblocks based on what is in the source field\n    enabledSourceBlocks() {\n        var all = this.sourceBlocks();\n        var enabled = [];\n        for (var i = 0; i < all.length; i++) {\n            var block = all[i];\n            if (block.enabled()) {\n                enabled.push(block);\n            }\n        }\n        return enabled;\n    }\n    // Return array of codeblocks based on what is in the answer field\n    answerBlocks() {\n        var answerBlocks = [];\n        var children = this.answerArea.childNodes;\n        for (var i = 0; i < children.length; i++) {\n            var block = this.getBlockById(children[i].id);\n            if (block !== undefined) {\n                answerBlocks.push(block);\n            }\n        }\n        return answerBlocks;\n    }\n    // Return array of enabled codeblocks based on what is in the answer field\n    enabledAnswerBlocks() {\n        var all = this.answerBlocks();\n        var enabled = [];\n        for (var i = 0; i < all.length; i++) {\n            var block = all[i];\n            if (block.enabled()) {\n                enabled.push(block);\n            }\n        }\n        return enabled;\n    }\n    // Return array of codelines based on what is in the answer field\n    answerLines() {\n        var answerLines = [];\n        var blocks = this.answerBlocks();\n        for (var i = 0; i < blocks.length; i++) {\n            var block = blocks[i];\n            for (var j = 0; j < block.lines.length; j++) {\n                answerLines.push(block.lines[j]);\n            }\n        }\n        return answerLines;\n    }\n    // Go up the hierarchy until you get to a block; return that block element\n    getBlockFor(element) {\n        var check = element;\n        while (!check.classList.contains(\"block\")) {\n            check = check.parentElement;\n        }\n        return check;\n    }\n    // Return the maximum indent for the solution\n    solutionIndent() {\n        var indent = 0;\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            indent = Math.max(indent, block.solutionIndent());\n        }\n        return indent;\n    }\n    /* =====================================================================\n    ==== ACTION ============================================================\n    ===================================================================== */\n    // The \"Check Me\" button was pressed.\n    checkCurrentAnswer() {\n        if (!this.hasSolved) {\n            this.checkCount++;\n            this.clearFeedback();\n            if (this.adaptiveId == undefined) {\n                this.adaptiveId = this.storageId;\n            }\n            // TODO - rendering feedback is buried in the grader.grade method.\n            // to disable feedback set this.grader.showfeedback boolean\n            this.grader.showfeedback = false;\n            this.grade = this.grader.grade();\n            if (this.grade == \"correct\") {\n                this.hasSolved = true;\n                this.correct = true;\n                $(this.checkButton).prop(\"disabled\", true);\n                localStorage.setItem(this.adaptiveId + \"Solved\", true);\n                this.recentAttempts = this.checkCount;\n                localStorage.setItem(\n                    this.adaptiveId + \"recentAttempts\",\n                    this.recentAttempts\n                );\n            }\n            localStorage.setItem(\n                this.adaptiveId + this.divid + \"Count\",\n                this.checkCount\n            );\n            this.setLocalStorage();\n            // if not solved and not too short then check if should provide help\n            if (!this.hasSolved && this.grade !== \"incorrectTooShort\") {\n                if (this.canHelp) {\n                    // only count the attempt if the answer is different (to prevent gaming)\n                    var answerHash = this.answerHash();\n                    if (this.lastAnswerHash !== answerHash) {\n                        this.numDistinct++;\n                        this.lastAnswerHash = answerHash;\n                    }\n                    // if time to offer help\n                    if (this.numDistinct == 3 && !this.gotHelp) {\n                        alert($.i18n(\"msg_parson_help_info\"));\n                    } // end if\n                } // end if can help\n            } // end if not solved\n        } // end outer if not solved\n    }\n\n    renderFeedback() {\n        this.grader.showfeedback = true;\n        this.grade = this.grader.graderState;\n        var feedbackArea;\n        var answerArea = $(this.answerArea);\n\n        if (this.showfeedback === true) {\n            feedbackArea = $(this.messageDiv);\n        } else {\n            feedbackArea = $(\"#doesnotexist\");\n        }\n\n        if (this.grade === \"correct\") {\n            answerArea.addClass(\"correct\");\n            feedbackArea.fadeIn(100);\n            feedbackArea.attr(\"class\", \"alert alert-info\");\n            if (this.checkCount > 1) {\n                feedbackArea.html(\n                    $.i18n(\"msg_parson_correct\", this.checkCount)\n                );\n            } else {\n                feedbackArea.html($.i18n(\"msg_parson_correct_first_try\"));\n            }\n        }\n\n        if (this.grade === \"incorrectTooShort\") {\n            // too little code\n            answerArea.addClass(\"incorrect\");\n            feedbackArea.fadeIn(500);\n            feedbackArea.attr(\"class\", \"alert alert-danger\");\n            feedbackArea.html($.i18n(\"msg_parson_too_short\"));\n        }\n\n        if (this.grade === \"incorrectIndent\") {\n            var incorrectBlocks = [];\n            for (let i = 0; i < this.grader.indentLeft.length; i++) {\n                block = this.grader.indentLeft[i].block();\n                if (incorrectBlocks.indexOf(block) == -1) {\n                    incorrectBlocks.push(block);\n                    $(block.view).addClass(\"indentLeft\");\n                }\n            }\n            for (let i = 0; i < this.grader.indentRight.length; i++) {\n                block = this.grader.indentRight[i].block();\n                if (incorrectBlocks.indexOf(block) == -1) {\n                    incorrectBlocks.push(block);\n                    $(block.view).addClass(\"indentRight\");\n                }\n            }\n            feedbackArea.fadeIn(500);\n            feedbackArea.attr(\"class\", \"alert alert-danger\");\n            if (incorrectBlocks.length == 1) {\n                feedbackArea.html($.i18n(\"msg_parson_wrong_indent\"));\n            } else {\n                feedbackArea.html($.i18n(\"msg_parson_wrong_indents\"));\n            }\n        }\n\n        if (this.grade === \"incorrectMoveBlocks\") {\n            var answerBlocks = this.answerBlocks();\n            var inSolution = [];\n            var inSolutionIndexes = [];\n            var notInSolution = [];\n            for (let i = 0; i < answerBlocks.length; i++) {\n                var block = answerBlocks[i];\n                var index = this.solution.indexOf(block.lines[0]);\n                if (index == -1) {\n                    notInSolution.push(block);\n                } else {\n                    inSolution.push(block);\n                    inSolutionIndexes.push(index);\n                }\n            }\n            var lisIndexes = this.grader.inverseLISIndices(\n                inSolutionIndexes,\n                inSolution\n            );\n            for (let i = 0; i < lisIndexes.length; i++) {\n                notInSolution.push(inSolution[lisIndexes[i]]);\n            }\n            answerArea.addClass(\"incorrect\");\n            feedbackArea.fadeIn(500);\n            feedbackArea.attr(\"class\", \"alert alert-danger\");\n            if (this.showfeedback === true) {\n                for (let i = 0; i < notInSolution.length; i++) {\n                    $(notInSolution[i].view).addClass(\"incorrectPosition\");\n                }\n            }\n            feedbackArea.html($.i18n(\"msg_parson_wrong_order\"));\n        }\n    }\n\n    /* =====================================================================\n    ==== ADAPTIVE ==========================================================\n    ===================================================================== */\n    // Initialize this problem as adaptive\n    //    helpCount = number of checks before help is given (negative)\n    //    canHelp = boolean as to whether help can be provided\n    //    checkCount = how many times it has been checked before correct\n    //    userRating = 0..100 how good the person is at solving problems\n    initializeAdaptive() {\n        this.adaptiveId = super.localStorageKey();\n        this.canHelp = true;\n        //this.helpCount = -3; // Number of checks before help is offered\n        this.checkCount = 0;\n        this.numDistinct = 0; // number of distinct solution attempts (different from previous)\n        this.gotHelp = false;\n        // Initialize the userRating\n        var storageProblem = localStorage.getItem(this.adaptiveId + \"Problem\");\n        if (storageProblem == this.divid) {\n            // Already in this problem\n            this.checkCount = localStorage.getItem(\n                this.adaptiveId + this.divid + \"Count\"\n            );\n            if (this.checkCount == undefined) {\n                this.checkCount = 0;\n            }\n            return this;\n        }\n        var count = localStorage.getItem(\n            this.adaptiveId + this.divid + \"Count\"\n        );\n        if (count == undefined || count == \"NaN\") {\n            count = 0;\n        }\n        this.checkCount = count;\n        this.recentAttempts = localStorage.getItem(\n            this.adaptiveId + \"recentAttempts\"\n        );\n        if (this.recentAttempts == undefined || this.recentAttempts == \"NaN\") {\n            this.recentAttempts = 3;\n        }\n        localStorage.setItem(\n            this.adaptiveId + \"recentAttempts\",\n            this.recentAttempts\n        );\n        localStorage.setItem(this.adaptiveId + \"Problem\", this.divid);\n        localStorage.setItem(\n            this.adaptiveId + this.divid + \"Count\",\n            this.checkCount\n        );\n        localStorage.setItem(this.adaptiveId + \"Solved\", false);\n    }\n    // Return a boolean of whether the user must deal with indentation\n    usesIndentation() {\n        if (this.noindent || this.solutionIndent() == 0) {\n            // was $(this.answerArea).hasClass(\"answer\") - bje changed\n            return false;\n        } else {\n            return true;\n        }\n    }\n    // Find a distractor to remove to make the problem easier\n    //  * try first in the answer area\n    //  * if not, try the source area\n    //  * if not, return undefined\n    distractorToRemove() {\n        var blocks = this.enabledAnswerBlocks();\n        var block;\n        for (let i = 0; i < blocks.length; i++) {\n            block = blocks[i];\n            if (block.isDistractor()) {\n                return block;\n            }\n        }\n        blocks = this.enabledSourceBlocks();\n        for (let i = 0; i < blocks.length; i++) {\n            block = blocks[i];\n            if (block.isDistractor()) {\n                return block;\n            }\n        }\n        return undefined;\n    }\n    // Return the number of blocks that exist\n    numberOfBlocks(fIncludeDistractors = true) {\n        var numberOfBlocks = 0;\n        for (var i = 0; i < this.blocks.length; i++) {\n            if (\n                this.blocks[i].enabled() &&\n                (fIncludeDistractors || !this.blocks[i].isDistractor())\n            ) {\n                numberOfBlocks += 1;\n            }\n        }\n        return numberOfBlocks;\n    }\n    // Remove this distractors to make the problem easier\n    removeDistractor(block) {\n        // Alert the user to what is happening\n        var feedbackArea = $(this.messageDiv);\n        feedbackArea.fadeIn(500);\n        feedbackArea.attr(\"class\", \"alert alert-info\");\n        feedbackArea.html($.i18n(\"msg_parson_not_solution\"));\n        // Stop ability to select\n        if (block.lines[0].distractHelptext) {\n            block.view.setAttribute(\"data-toggle\", \"tooltip\");\n            block.view.setAttribute(\"title\", block.lines[0].distractHelptext);\n        }\n        block.disable();\n        // If in answer area, move to source area\n        if (!block.inSourceArea()) {\n            var sourceRect = this.sourceArea.getBoundingClientRect();\n            var startX = block.pageXCenter() - 1;\n            var startY = block.pageYCenter();\n            var endX =\n                sourceRect.left + window.pageXOffset + sourceRect.width / 2;\n            var endY =\n                sourceRect.top +\n                window.pageYOffset +\n                block.view.getBoundingClientRect().height / 2;\n            var slideUnderBlock = block.slideUnderBlock();\n            if (slideUnderBlock !== undefined) {\n                endY +=\n                    slideUnderBlock.view.getBoundingClientRect().height + 20;\n                endY += parseInt($(slideUnderBlock.view).css(\"top\"));\n            }\n            var that = this;\n            $(block.view).css({\n                \"border-color\": \"#000\",\n                \"background-color\": \"#fff\",\n            });\n            $(block.view).animate(\n                {\n                    opacity: 1.0,\n                },\n                {\n                    duration:\n                        Math.sqrt(\n                            Math.pow(endY - startY, 2) +\n                                Math.pow(endX - startX, 2)\n                        ) *\n                            4 +\n                        500,\n                    start: function () {\n                        that.moving = block;\n                        that.movingX = startX;\n                        that.movingY = startY;\n                        that.updateView();\n                    },\n                    progress: function (a, p, c) {\n                        that.movingX = startX * (1 - p) + endX * p;\n                        that.movingY = startY * (1 - p) + endY * p;\n                        that.updateView();\n                    },\n                    complete: function () {\n                        delete that.moving;\n                        delete that.movingX;\n                        delete that.movingY;\n                        that.updateView();\n                        $(block.view).animate(\n                            {\n                                opacity: 0.3,\n                                \"border-color\": \"#d3d3d3\",\n                                \"background-color\": \"#efefef\",\n                            },\n                            {\n                                duration: 1000,\n                                complete: function () {\n                                    $(block.view).css({\n                                        opacity: \"\",\n                                        \"border-color\": \"\",\n                                        \"background-color\": \"\",\n                                    });\n                                    $(block.view).addClass(\"disabled\");\n                                },\n                            }\n                        );\n                    },\n                }\n            );\n        } else {\n            $(block.view).css({\n                \"border-color\": \"#000\",\n                \"background-color\": \"#fff\",\n            });\n            $(block.view).animate(\n                {\n                    opacity: 0.3,\n                    \"border-color\": \"#d3d3d3\",\n                    \"background-color\": \"#efefef\",\n                },\n                {\n                    duration: 2000,\n                    complete: function () {\n                        $(block.view).css({\n                            \"border-color\": \"\",\n                            \"background-color\": \"\",\n                        });\n                    },\n                }\n            );\n        }\n    }\n    // Give the user the indentation\n    removeIndentation() {\n        // Alert the user to what is happening\n        var feedbackArea = $(this.messageDiv);\n        feedbackArea.fadeIn(500);\n        feedbackArea.attr(\"class\", \"alert alert-info\");\n        feedbackArea.html($.i18n(\"msg_parson_provided_indent\"));\n        // Move and resize blocks\n        var blockWidth = 200;\n        for (var i = 0; i < this.lines.length; i++) {\n            var line = this.lines[i];\n            var expandedWidth =\n                line.width + line.indent * this.options.pixelsPerIndent + 30;\n            blockWidth = Math.max(blockWidth, expandedWidth);\n        }\n        if (this.options.numbered != undefined) {\n            blockWidth += 25;\n        }\n        this.areaWidth = blockWidth + 22;\n        var block, indent;\n        var sourceBlocks = this.sourceBlocks();\n        for (let i = 0; i < sourceBlocks.length; i++) {\n            block = sourceBlocks[i];\n            indent = block.solutionIndent();\n            if (indent == 0) {\n                $(block.view).animate(\n                    {\n                        width: blockWidth,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            } else {\n                $(block.view).animate(\n                    {\n                        width:\n                            blockWidth - indent * this.options.pixelsPerIndent,\n                        \"padding-left\":\n                            indent * this.options.pixelsPerIndent + 10,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            }\n        }\n        for (let i = 0; i < this.pairedDivs.length; i++) {\n            $(this.pairedDivs[i]).animate(\n                {\n                    width: blockWidth + 34,\n                },\n                {\n                    duration: 1000,\n                }\n            );\n        }\n        var answerBlocks = this.answerBlocks();\n        for (let i = 0; i < answerBlocks.length; i++) {\n            block = answerBlocks[i];\n            indent = block.solutionIndent();\n            if (indent == 0) {\n                $(block.view).animate(\n                    {\n                        left: 0,\n                        width: blockWidth,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            } else {\n                $(block.view).animate(\n                    {\n                        left: 0,\n                        width:\n                            blockWidth - indent * this.options.pixelsPerIndent,\n                        \"padding-left\":\n                            indent * this.options.pixelsPerIndent + 10,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            }\n        }\n        // Resize answer and source area\n        $(this.answerArea).removeClass(\"answer1 answer2 answer3 answer4\");\n        $(this.answerArea).addClass(\"answer\");\n        this.indent = 0;\n        this.noindent = true;\n        $(this.sourceArea).animate(\n            {\n                width: this.areaWidth + 2,\n            },\n            {\n                duration: 1000,\n            }\n        );\n        $(this.answerArea).animate(\n            {\n                width: this.areaWidth + 2,\n            },\n            {\n                duration: 1000,\n            }\n        );\n        // Change the model (with view)\n        $(this.answerArea).animate(\n            {\n                opacity: 1.0,\n            },\n            {\n                duration: 1100,\n                complete: function () {\n                    $(this.answerArea).css({\n                        opacity: \"\",\n                    });\n                    // Update the model\n                    for (let i = 0; i < sourceBlocks.length; i++) {\n                        sourceBlocks[i].addIndent();\n                    }\n                    for (let i = 0; i < answerBlocks.length; i++) {\n                        answerBlocks[i].addIndent();\n                    }\n                },\n            }\n        );\n    }\n\n    // first check if any solution blocks are in the source still (left side) and not\n    // in the answer\n    getSolutionBlockInSource() {\n        var solutionBlocks = this.solutionBlocks();\n        var answerBlocks = this.answerBlocks();\n        var sourceBlocks = this.sourceBlocks();\n        var solBlock = null;\n        var currBlock = null;\n\n        // loop through sourceBlocks and return a block if it is not in the solution\n        for (var i = 0; i < sourceBlocks.length; i++) {\n            // get the current block from the source\n            currBlock = sourceBlocks[i];\n\n            // if currBlock is in the solution and isn't the first block and isn't in the answer\n            if (\n                solutionBlocks.indexOf(currBlock) > 0 &&\n                answerBlocks.indexOf(currBlock) < 0\n            ) {\n                return currBlock;\n            }\n        }\n        // didn't find any block in the source that is in the solution\n        return null;\n    }\n\n    // Find a block2 that is furthest from block1 in the answer\n    // don't use the very first block in the solution as block2\n    getFurthestBlock() {\n        var solutionBlocks = this.solutionBlocks();\n        var answerBlocks = this.answerBlocks();\n        var maxDist = 0;\n        var dist = 0;\n        var maxBlock = null;\n        var currBlock = null;\n        var indexSol = 0;\n        var prevBlock = null;\n        var indexPrev = 0;\n\n        // loop through the blocks in the answer\n        for (var i = 0; i < answerBlocks.length; i++) {\n            currBlock = answerBlocks[i];\n            indexSol = solutionBlocks.indexOf(currBlock);\n            if (indexSol > 0) {\n                prevBlock = solutionBlocks[indexSol - 1];\n                indexPrev = answerBlocks.indexOf(prevBlock);\n                //alert(\"my index \" + i + \" index prev \" + indexPrev);\n\n                // calculate the distance in the answer\n                dist = Math.abs(i - indexPrev);\n                if (dist > maxDist) {\n                    maxDist = dist;\n                    maxBlock = currBlock;\n                }\n            }\n        }\n        return maxBlock;\n    }\n\n    // Combine blocks together\n    combineBlocks() {\n        var solutionBlocks = this.solutionBlocks();\n        var answerBlocks = this.answerBlocks();\n        var sourceBlocks = this.sourceBlocks();\n\n        // Alert the user to what is happening\n        var feedbackArea = $(this.messageDiv);\n        feedbackArea.fadeIn(500);\n        feedbackArea.attr(\"class\", \"alert alert-info\");\n        feedbackArea.html($.i18n(\"msg_parson_combined_blocks\"));\n        var block1 = null;\n        var block2 = null;\n\n        // get a solution block that is still in source (not answer), if any\n        block2 = this.getSolutionBlockInSource();\n\n        // if none in source get block that is furthest from block1\n        if (block2 == null) {\n            block2 = this.getFurthestBlock();\n        }\n\n        // get block1 (above block2) in solution\n        var index = solutionBlocks.indexOf(block2);\n        block1 = solutionBlocks[index - 1];\n\n        // get index of each in answer\n        var index1 = answerBlocks.indexOf(block1);\n        var index2 = answerBlocks.indexOf(block2);\n        var move = false;\n\n        // if both in answer set move based on if directly above each other\n        if (index1 >= 0 && index2 >= 0) {\n            move = index1 + 1 !== index2;\n\n            // else if both in source set move again based on if above each other\n        } else if (index1 < 0 && index2 < 0) {\n            index1 = sourceBlocks.indexOf(block1);\n            index2 = sourceBlocks.indexOf(block2);\n            move = index1 + 1 !== index2;\n\n            // one in source and one in answer so must move\n        } else {\n            move = true;\n            if (index1 < 0) {\n                index1 = sourceBlocks.indexOf(block1);\n            }\n            if (index2 < 0) {\n                index2 = sourceBlocks.indexOf(block2);\n            }\n        }\n\n        var subtract = index2 < index1; // is block2 higher\n\n        if (move) {\n            // Move the block\n            var startX = block2.pageXCenter() - 1;\n            var startY = block2.pageYCenter();\n            var endX = block1.pageXCenter() - 1;\n            var endY =\n                block1.pageYCenter() +\n                block1.view.getBoundingClientRect().height / 2 +\n                5;\n            if (subtract) {\n                endY -= block2.view.getBoundingClientRect().height / 2;\n            } else {\n                endY += block2.view.getBoundingClientRect().height / 2;\n            }\n            var that = this;\n            $(block2.view).animate(\n                {\n                    opacity: 1,\n                },\n                {\n                    duration: 1000, // 1 seccond\n                    start: function () {\n                        $(block1.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                        $(block2.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                        block2.lines[0].index += 1000;\n                        that.moving = block2;\n                        that.movingX = startX;\n                        that.movingY = startY;\n                        that.updateView();\n                    },\n                    progress: function (a, p, c) {\n                        that.movingX = startX * (1 - p) + endX * p;\n                        that.movingY = startY * (1 - p) + endY * p;\n                        that.updateView();\n                    },\n                    complete: function () {\n                        delete that.moving;\n                        delete that.movingX;\n                        delete that.movingY;\n                        that.updateView();\n                        block2.lines[0].index -= 1000;\n                        block1.consumeBlock(block2);\n                        $(block1.view).animate(\n                            {\n                                \"border-color\": \"#d3d3d3\",\n                                \"background-color\": \"#efefef\",\n                            },\n                            {\n                                duration: 1000,\n                                complete: function () {\n                                    $(block1.view).css({\n                                        \"border-color\": \"\",\n                                        \"background-color\": \"\",\n                                    });\n                                },\n                            }\n                        );\n                    },\n                }\n            );\n        } else {\n            $(block2.view).animate(\n                {\n                    opacity: 1,\n                },\n                {\n                    duration: 1000,\n                    start: function () {\n                        $(block1.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                        $(block2.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                    },\n                    complete: function () {\n                        block1.consumeBlock(block2);\n                        $(block1.view).animate(\n                            {\n                                \"border-color\": \"#d3d3d3\",\n                                \"background-color\": \"#efefef\",\n                            },\n                            {\n                                duration: 1000,\n                                complete: function () {\n                                    $(block1.view).css({\n                                        \"border-color\": \"\",\n                                        \"background-color\": \"\",\n                                    });\n                                },\n                            }\n                        );\n                    },\n                }\n            );\n        }\n    }\n    // Adapt the problem to be easier\n    //  * remove a distractor until none are present\n    //  * combine blocks until 3 are left\n    makeEasier() {\n        var distractorToRemove = this.distractorToRemove();\n        if (\n            distractorToRemove !== undefined &&\n            !distractorToRemove.inSourceArea()\n        ) {\n            alert($.i18n(\"msg_parson_remove_incorrect\"));\n            this.removeDistractor(distractorToRemove);\n            this.logMove(\"removedDistractor-\" + distractorToRemove.hash());\n        } else {\n            var numberOfBlocks = this.numberOfBlocks(false);\n            if (numberOfBlocks > 3) {\n                alert($.i18n(\"msg_parson_will_combine\"));\n                this.combineBlocks();\n                this.logMove(\"combinedBlocks\");\n            } else {\n                /*else if(this.numberOfBlocks(true) > 3 && distractorToRemove !==  undefined) {\n                           alert(\"Will remove an incorrect code block from source area\");\n                           this.removeDistractor(distractorToRemove);\n                           this.logMove(\"removedDistractor-\" + distractorToRemove.hash());\n                       } */\n                alert($.i18n(\"msg_parson_three_blocks_left\"));\n                this.canHelp = false;\n            }\n            //if (numberOfBlocks < 5) {\n            //\tthis.canHelp = false;\n            //\tthis.helpButton.disabled = true;\n            //}\n        }\n    }\n    // The \"Help Me\" button was pressed and the problem should be simplified\n    helpMe() {\n        this.clearFeedback();\n        //this.helpCount = -1; // amount to allow for multiple helps in a row\n        //if (this.helpCount < 0) {\n        //\tthis.helpCount = Math.max(this.helpCount, -1); // min 1 attempt before more help\n        //this.helpButton.disabled = true;\n        //}\n        // if less than 3 attempts\n        if (this.numDistinct < 3) {\n            alert($.i18n(\"msg_parson_atleast_three_attempts\"));\n        }\n        // otherwise give help\n        else {\n            this.gotHelp = true;\n            this.makeEasier();\n        }\n    }\n    /* =====================================================================\n    ==== UTILITY ===========================================================\n    ===================================================================== */\n    // Return a date from a timestamp (either mySQL or JS format)\n    dateFromTimestamp(timestamp) {\n        var date = new Date(timestamp);\n        if (isNaN(date.getTime())) {\n            var t = timestamp.split(/[- :]/);\n            date = new Date(t[0], t[1] - 1, t[2], t[3], t[4], t[5]);\n        }\n        return date;\n    }\n    // A function for returning a shuffled version of an array\n    shuffled(array) {\n        var currentIndex = array.length;\n        var returnArray = array.slice();\n        var temporaryValue, randomIndex;\n        // While there remain elements to shuffle...\n        while (0 !== currentIndex) {\n            // Pick a remaining element...\n            randomIndex = Math.floor(Math.random() * currentIndex);\n            currentIndex -= 1;\n            // And swap it with the current element.\n            temporaryValue = returnArray[currentIndex];\n            returnArray[currentIndex] = returnArray[randomIndex];\n            returnArray[randomIndex] = temporaryValue;\n        }\n        return returnArray;\n    }\n    /* =====================================================================\n    ==== KEYBOARD INTERACTION ==============================================\n    ===================================================================== */\n    // When the user has entered the Parsons problem via keyboard mode\n    enterKeyboardMode() {\n        $(this.keyboardTip).show();\n        $(this.sourceLabel).hide();\n        $(this.answerLabel).hide();\n        this.clearFeedback();\n    }\n    // When the user leaves the Parsons problem via keyboard mode\n    exitKeyboardMode() {\n        $(this.keyboardTip).hide();\n        $(this.sourceLabel).show();\n        $(this.answerLabel).show();\n    }\n    /* =====================================================================\n    ==== VIEW ==============================================================\n    ===================================================================== */\n    // Clear any feedback from the answer area\n    clearFeedback() {\n        $(this.answerArea).removeClass(\"incorrect correct\");\n        var children = this.answerArea.childNodes;\n        for (var i = 0; i < children.length; i++) {\n            $(children[i]).removeClass(\n                \"correctPosition incorrectPosition indentLeft indentRight\"\n            );\n        }\n        $(this.messageDiv).hide();\n    }\n    // Disable the interface\n    async disableInteraction() {\n        // Disable blocks\n        await this.checkServerComplete;\n        console.log(\"disabling blocks\");\n        if (this.blocks !== undefined) {\n            for (var i = 0; i < this.blocks.length; i++) {\n                var block = this.blocks[i];\n                block.disable();\n            }\n        }\n        // Hide buttons\n        $(this.checkButton).hide();\n        $(this.resetButton).hide();\n    }\n    // Based on the moving element, etc., establish the moving state\n    //   rest: not moving\n    //   source: moving inside source area\n    //   answer: moving inside answer area\n    //   moving: moving outside areas\n    movingState() {\n        if (this.moving == undefined) {\n            return \"rest\";\n        }\n        var x = this.movingX - window.pageXOffset;\n        var y = this.movingY - window.pageYOffset;\n        // Check if in answer area\n        var bounds = this.answerArea.getBoundingClientRect();\n        if (\n            x >= bounds.left &&\n            x <= bounds.right &&\n            y >= bounds.top &&\n            y <= bounds.bottom\n        ) {\n            return \"answer\";\n        }\n        // Check if in source area\n        bounds = this.sourceArea.getBoundingClientRect();\n        if (\n            x >= bounds.left &&\n            x <= bounds.right &&\n            y >= bounds.top &&\n            y <= bounds.bottom\n        ) {\n            return \"source\";\n        }\n        return \"moving\";\n    }\n    // Update the Parsons view\n    // This gets called when dragging a block\n    updateView() {\n        // Based on the new and the old state, figure out what to update\n        var state = this.state;\n        var newState = this.movingState();\n        var updateSource = true;\n        var updateAnswer = true;\n        var updateMoving = newState == \"moving\";\n        if (state == newState) {\n            if (newState == \"rest\") {\n                updateSource = false;\n                updateAnswer = false;\n            } else if (newState == \"source\") {\n                updateAnswer = false;\n            } else if (newState == \"answer\") {\n                updateSource = false;\n            } else if (newState == \"moving\") {\n                updateAnswer = false;\n                updateSource = false;\n            }\n        }\n        var movingHeight;\n        if (this.moving !== undefined) {\n            // Must get height here as detached items don't have height\n            movingHeight = $(this.moving.view).outerHeight(true);\n            $(this.moving.view).detach();\n        }\n        var positionTop, width;\n        var baseWidth = this.areaWidth - 22;\n        // Update the Source Area\n        if (updateSource) {\n            positionTop = 0;\n            var blocks = this.sourceBlocks();\n            if (newState == \"source\") {\n                var hasInserted = false;\n                var movingBin = this.moving.pairedBin();\n                var binForBlock = [];\n                for (i = 0; i < blocks.length; i++) {\n                    binForBlock.push(blocks[i].pairedBin());\n                }\n                if (!binForBlock.includes(movingBin)) {\n                    movingBin = -1;\n                }\n                var insertPositions = [];\n                if (binForBlock.length == 0) {\n                    insertPositions.push(0);\n                } else {\n                    if (movingBin == -1) {\n                        insertPositions.push(0);\n                    } else if (binForBlock[0] == movingBin) {\n                        insertPositions.push(0);\n                    }\n                    for (i = 1; i < blocks.length; i++) {\n                        if (binForBlock[i - 1] == movingBin) {\n                            insertPositions.push(i);\n                        } else if (binForBlock[i] == movingBin) {\n                            insertPositions.push(i);\n                        } else if (\n                            movingBin == -1 &&\n                            binForBlock[i - 1] != binForBlock[i]\n                        ) {\n                            insertPositions.push(i);\n                        }\n                    }\n                    if (movingBin == -1) {\n                        insertPositions.push(binForBlock.length);\n                    } else if (\n                        binForBlock[binForBlock.length - 1] == movingBin\n                    ) {\n                        insertPositions.push(binForBlock.length);\n                    }\n                }\n                var x =\n                    this.movingX -\n                    this.sourceArea.getBoundingClientRect().left -\n                    window.pageXOffset -\n                    baseWidth / 2 -\n                    11;\n                var y =\n                    this.movingY -\n                    this.sourceArea.getBoundingClientRect().top -\n                    window.pageYOffset;\n                for (i = 0; i < blocks.length; i++) {\n                    var item = blocks[i];\n                    var j;\n                    if (!hasInserted && insertPositions.includes(i)) {\n                        var testHeight = $(item.view).outerHeight(true);\n                        for (j = i + 1; j < blocks.length; j++) {\n                            if (insertPositions.includes(j)) {\n                                break;\n                            }\n                            testHeight += $(blocks[j].view).outerHeight(true);\n                        }\n                        if (\n                            y - positionTop < movingHeight + testHeight / 2 ||\n                            i == insertPositions[insertPositions.length - 1]\n                        ) {\n                            hasInserted = true;\n                            this.sourceArea.insertBefore(\n                                this.moving.view,\n                                item.view\n                            );\n                            $(this.moving.view).css({\n                                left: x,\n                                top: y - movingHeight / 2,\n                                width: baseWidth,\n                                \"z-index\": 3,\n                            });\n                            positionTop = positionTop + movingHeight;\n                        }\n                    }\n                    $(item.view).css({\n                        left: 0,\n                        top: positionTop,\n                        width: baseWidth,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(item.view).outerHeight(true);\n                }\n                if (!hasInserted) {\n                    $(this.moving.view).appendTo(\n                        \"#\" + this.counterId + \"-source\"\n                    );\n                    $(this.moving.view).css({\n                        left: x,\n                        top: y - $(this.moving.view).outerHeight(true) / 2,\n                        width: baseWidth,\n                        \"z-index\": 3,\n                    });\n                }\n            } else {\n                for (var i = 0; i < blocks.length; i++) {\n                    item = blocks[i];\n                    $(item.view).css({\n                        left: 0,\n                        top: positionTop,\n                        width: baseWidth,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(item.view).outerHeight(true);\n                }\n            }\n            // Update the Paired Distractor Indicators\n            for (i = 0; i < this.pairedBins.length; i++) {\n                var bin = this.pairedBins[i];\n                var matching = [];\n                for (j = 0; j < blocks.length; j++) {\n                    block = blocks[j];\n                    if (block.matchesBin(bin)) {\n                        matching.push(block);\n                    }\n                }\n                var div = this.pairedDivs[i];\n                if (matching.length == 0) {\n                    $(div).hide();\n                } else {\n                    $(div).show();\n                    var height = -5;\n                    height += parseInt(\n                        $(matching[matching.length - 1].view).css(\"top\")\n                    );\n                    height -= parseInt($(matching[0].view).css(\"top\"));\n                    height += $(matching[matching.length - 1].view).outerHeight(\n                        true\n                    );\n                    $(div).css({\n                        left: -6,\n                        top: $(matching[0].view).css(\"top\"),\n                        width: baseWidth + 34,\n                        height: height,\n                        \"z-index\": 1,\n                        \"text-indent\": -30,\n                        \"padding-top\": (height - 70) / 2,\n                        overflow: \"visible\",\n                        \"font-size\": 43,\n                        \"vertical-align\": \"middle\",\n                        color: \"#7e7ee7\",\n                    });\n                    $(div).html(\n                        \"<span id= 'st' style = 'vertical-align: middle; font-weight: bold; font-size: 15px'>or</span>{\"\n                    );\n                }\n                if (matching.length == 1) {\n                    $(div).html(\"\");\n                }\n            }\n        }\n        // Update the Answer Area\n        if (updateAnswer) {\n            var block, indent;\n            positionTop = 0;\n            width =\n                this.areaWidth +\n                this.indent * this.options.pixelsPerIndent -\n                22;\n            var blocks = this.answerBlocks();\n            if (newState == \"answer\") {\n                var hasInserted = false;\n                var x =\n                    this.movingX -\n                    this.answerArea.getBoundingClientRect().left -\n                    window.pageXOffset -\n                    baseWidth / 2 -\n                    11;\n                var movingIndent = Math.round(x / this.options.pixelsPerIndent);\n                if (movingIndent < 0) {\n                    movingIndent = 0;\n                } else if (movingIndent > this.indent) {\n                    movingIndent = this.indent;\n                } else {\n                    x = movingIndent * this.options.pixelsPerIndent;\n                }\n                var y =\n                    this.movingY -\n                    this.answerArea.getBoundingClientRect().top -\n                    window.pageYOffset;\n                this.moving.indent = movingIndent;\n                for (i = 0; i < blocks.length; i++) {\n                    block = blocks[i];\n                    if (!hasInserted) {\n                        if (\n                            y - positionTop <\n                            (movingHeight + $(block.view).outerHeight(true)) / 2\n                        ) {\n                            hasInserted = true;\n                            this.answerArea.insertBefore(\n                                this.moving.view,\n                                block.view\n                            );\n                            $(this.moving.view).css({\n                                left: x,\n                                top: y - movingHeight / 2,\n                                width: baseWidth,\n                                \"z-index\": 3,\n                            });\n                            positionTop = positionTop + movingHeight;\n                        }\n                    }\n                    indent = block.indent * this.options.pixelsPerIndent;\n                    $(block.view).css({\n                        left: indent,\n                        top: positionTop,\n                        width: width - indent,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(block.view).outerHeight(true);\n                }\n                if (!hasInserted) {\n                    $(this.moving.view).appendTo(\n                        \"#\" + this.counterId + \"-answer\"\n                    );\n                    $(this.moving.view).css({\n                        left: x,\n                        top: y - $(this.moving.view).outerHeight(true) / 2,\n                        width: baseWidth,\n                        \"z-index\": 3,\n                    });\n                }\n            } else {\n                for (let i = 0; i < blocks.length; i++) {\n                    block = blocks[i];\n                    indent = block.indent * this.options.pixelsPerIndent;\n                    $(block.view).css({\n                        left: indent,\n                        top: positionTop,\n                        width: width - indent,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(block.view).outerHeight(true);\n                }\n            }\n        }\n        // Update the Moving Area\n        if (updateMoving) {\n            // Add it to the lowest place in the source area\n            movingBin = this.moving.pairedBin();\n            if (movingBin == -1) {\n                $(this.moving.view).appendTo(\"#\" + this.counterId + \"-source\");\n            } else {\n                var before;\n                blocks = this.sourceBlocks;\n                for (i = 0; i < blocks.length; i++) {\n                    block = blocks[i];\n                    if (block.pairedBin() == movingBin) {\n                        before = i + 1;\n                    }\n                }\n                if (before == undefined || before == blocks.length) {\n                    $(this.moving.view).appendTo(\n                        \"#\" + this.counterId + \"-source\"\n                    );\n                } else {\n                    this.sourceArea.insertBefore(\n                        this.moving.view,\n                        blocks[before].view\n                    );\n                }\n            }\n            // Place in the middle of the mouse cursor\n            $(this.moving.view).css({\n                left:\n                    this.movingX -\n                    this.sourceArea.getBoundingClientRect().left -\n                    window.pageXOffset -\n                    $(this.moving.view).outerWidth(true) / 2,\n                top:\n                    this.movingY -\n                    this.sourceArea.getBoundingClientRect().top -\n                    window.pageYOffset -\n                    movingHeight / 2,\n                width: baseWidth,\n                \"z-index\": 3,\n            });\n        }\n        state = newState;\n        this.state = state;\n    }\n    addBlockLabels(blocks) {\n        var bin = -1;\n        var binCount = 0;\n        var binChildren = 0;\n        var blocksNotInBins = 0;\n        for (let i = 0; i < blocks.length; i++) {\n            if (blocks[i].pairedBin() == -1) {\n                blocksNotInBins++;\n            }\n        }\n        for (let i = 0; i < blocks.length; i++) {\n            var currentBin = blocks[i].pairedBin();\n            if (currentBin == -1 || currentBin != bin) {\n                bin = currentBin;\n                binChildren = 0;\n                binCount++;\n            }\n            var label =\n                \"\" +\n                binCount +\n                (currentBin != -1\n                    ? String.fromCharCode(97 + binChildren)\n                    : \" \");\n            if (\n                binCount < 10 &&\n                blocksNotInBins + this.pairedBins.length >= 10\n            ) {\n                label += \" \";\n            }\n            blocks[i].addLabel(label, 0);\n            binChildren++;\n        }\n        if (blocksNotInBins + this.pairedBins.length >= 10) {\n            this.areaWidth += 5;\n            $(this.sourceArea).css({\n                width: $(this.sourceArea).width() + 5,\n            });\n            $(this.answerArea).css({\n                width: $(this.answerArea).width() + 5,\n            });\n        }\n    }\n    // Put all the blocks back into the source area, reshuffling as necessary\n    resetView() {\n        // Clear everything\n        this.clearFeedback();\n        var scrollTop = document.body.scrollTop;\n        var block;\n        for (let i = 0; i < this.blocks.length; i++) {\n            block = this.blocks[i];\n            for (var j = 0; j < block.lines.length; j++) {\n                var children = $(block.lines[j].view).find(\".block-label\");\n                for (var c = 0; c < children.length; c++) {\n                    children[c].remove();\n                }\n            }\n            block.destroy();\n            $(this.blocks[i].view).detach();\n        }\n        delete this.blocks;\n        this.blockIndex = 0;\n        if (this.pairedDivs) {\n            for (let i = 0; i < this.pairedDivs.length; i++) {\n                $(this.pairedDivs[i]).detach();\n            }\n        }\n        $(this.sourceArea).attr(\"style\", \"\");\n        $(this.answerArea).removeClass();\n        $(this.answerArea).attr(\"style\", \"\");\n        this.noindent = this.options.noindent;\n        // Reinitialize\n        if (this.hasSolved) {\n            this.checkCount = 0;\n            this.numDistinct = 0;\n            this.hasSolved = false;\n            if (this.options.adaptive) {\n                this.canHelp = true;\n            }\n            //this.helpCount = -3; // enable after 3 failed attempts\n            //this.helpButton.disabled = true;\n            localStorage.setItem(this.adaptiveId + \"Problem\", this.divid);\n            localStorage.setItem(\n                this.adaptiveId + this.divid + \"Count\",\n                this.checkCount\n            );\n            localStorage.setItem(this.adaptiveId + \"Solved\", false);\n        }\n        this.initializeAreas(this.blocksFromSource(), [], {});\n        this.initializeInteractivity();\n        document.body.scrollTop = scrollTop;\n    }\n}\n\nParsons.counter = 0;\n\n$(document).on(\"runestone:login-complete\", function () {\n    $(\"[data-component=parsons]\").each(function (index) {\n        if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n            try {\n                window.componentMap[this.id] = new Parsons({\n                    orig: this,\n                    useRunestoneServices: eBookConfig.useRunestoneServices,\n                });\n            } catch (err) {\n                console.log(`Error rendering Parsons Problem ${this.id}\n                             Details: ${err}`);\n                console.log(err.stack);\n            }\n        }\n    });\n});\n","import Parsons from \"./parsons\";\n\nexport default class TimedParsons extends Parsons {\n    constructor(opts) {\n        super(opts);\n        // todo -- make this configurable\n        if (opts.timedfeedback) {\n            this.showfeedback = true;\n        } else {\n            this.showfeedback = false;\n        }\n        this.grader.showfeedback = this.showfeedback;\n        this.hideFeedback();\n        $(this.checkButton).hide();\n        $(this.helpButton).hide();\n        $(this.resetButton).hide();\n    }\n    checkCorrectTimed() {\n        return this.correct ? \"T\" : \"F\";\n    }\n    hideFeedback() {\n        $(this.messageDiv).hide();\n    }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n    window.component_factory = {};\n}\nwindow.component_factory[\"parsons\"] = function (opts) {\n    if (opts.timed) {\n        return new TimedParsons(opts);\n    }\n    return new Parsons(opts);\n};\n"],"names":["a","b","c","d","e","setTimeout","j","f","Array","isArray","g","forEach","length","call","hasOwnProperty","h","Error","stack","replace","console","warn","log","apply","this","arguments","i","prototype","Object","create","constructor","_super","la","k","oa","l","m","q","addEventListener","n","removeEventListener","o","parentNode","p","indexOf","trim","split","r","s","slice","t","push","sort","u","toUpperCase","ma","w","ownerDocument","defaultView","parentWindow","x","manager","callback","element","target","options","inputTarget","domHandler","enable","handler","init","z","pointers","changedPointers","Ea","Ga","Ha","isFirst","isFinal","session","eventType","firstInput","D","firstMultiple","center","E","timeStamp","ra","deltaTime","angle","I","distance","H","offsetDelta","prevDelta","prevInput","deltaX","y","deltaY","B","offsetDirection","G","F","overallVelocityX","overallVelocityY","overallVelocity","qa","scale","Ra","K","rotation","J","maxPointers","C","srcEvent","A","emit","recognize","lastInterval","Da","velocity","velocityX","velocityY","direction","clientX","pa","clientY","Ia","Ja","Ka","La","Ma","Qa","Math","sqrt","atan2","PI","L","evEl","Ta","evWin","Ua","pressed","M","Xa","Ya","store","pointerEvents","N","evTarget","$a","_a","started","O","touches","changedTouches","concat","P","bb","targetIds","Q","Fa","identifier","filter","R","touch","mouse","primaryTouch","lastTouches","S","T","splice","cb","U","abs","db","V","set","Y","defaults","id","ua","state","nb","simultaneous","requireFail","Z","sb","qb","pb","ob","$","_","get","aa","ba","pX","pY","ca","da","_timer","_input","ea","fa","ga","pTime","pCenter","count","ha","recognizers","preset","ia","handlers","oldCssProps","input","inputClass","xa","ya","wa","touchAction","ja","add","recognizeWith","requireFailure","style","cssProps","ka","createEvent","initEvent","gesture","dispatchEvent","na","createElement","round","Date","now","assign","TypeError","sa","keys","ta","test","navigator","userAgent","za","Ba","Na","Oa","Pa","destroy","Sa","mousedown","mousemove","mouseup","type","button","which","pointerType","Va","pointerdown","pointermove","pointerup","pointercancel","pointerout","Wa","MSPointerEvent","PointerEvent","toLowerCase","pointerId","Za","touchstart","touchmove","touchend","touchcancel","ab","sourceCapabilities","firesTouchEvents","eb","fb","gb","hb","ib","jb","kb","lb","mb","CSS","supports","X","compute","actions","update","getTouchAction","W","join","preventDefaults","prevented","preventSrc","preventDefault","rb","tb","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","additionalEvent","tryEmit","canEmit","process","reset","attrTest","threshold","directionTest","time","clearTimeout","taps","interval","posThreshold","failTimeout","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","stopped","curRecognizer","remove","on","off","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","Manager","Input","TouchAction","TouchInput","MouseInput","PointerEventInput","TouchMouseInput","SingleTouchInput","Recognizer","AttrRecognizer","Tap","Pan","Swipe","Pinch","Rotate","Press","each","merge","extend","inherit","bindFn","prefixed","self","Hammer","window","document","i18n","load","en","msg_parson_check_me","msg_parson_reset","msg_parson_help","msg_parson_too_short","msg_parson_drag_from_here","msg_parson_drag_to_here","msg_parson_correct_first_try","msg_parson_correct","msg_parson_wrong_indent","msg_parson_wrong_indents","msg_parson_wrong_order","msg_parson_arrow_navigate","msg_parson_help_info","msg_parson_not_solution","msg_parson_provided_indent","msg_parson_combined_blocks","msg_parson_remove_incorrect","msg_parson_will_combine","msg_parson_atleast_three_attempts","msg_parson_three_blocks_left","msg_parson_will_provide_indent","unshift","charAt","RegExp","substring","parseInt","isNaN","String","fromCharCode","tagName","nodeType","attributes","specified","firstChild","nextSibling","name","value","nodeValue","appendChild","createTextNode","innerHTML","v","match","tripleQuotedStrings","multiLineStrings","hashComments","cStyleComments","regexLiterals","keywords","source","tags","va","trace","PR_normalizedHtml","prettyPrintOne","prettyPrint","getElementsByTagName","getTime","className","setAttribute","replaceChild","PR","createSimpleLexer","registerLangHandler","sourceDecorator","PR_ATTRIB_NAME","PR_ATTRIB_VALUE","PR_COMMENT","PR_DECLARATION","PR_KEYWORD","PR_LITERAL","PR_PLAIN","PR_PUNCTUATION","PR_SOURCE","PR_STRING","PR_TAG","PR_TYPE","LineBasedGrader","problem","inverseLISIndices","arr","allSubsequences","subsequenceForCurrent","current","lastElementAdded","subsequent","longestSubsequence","longestSubsequenceLength","subs","indexes","lIndex","grade","clearFeedback","correctLines","percentLines","incorrectIndents","solutionLines","solution","answerLines","min","max","correctLength","isCorrectOrder","checkCorrectOrdering","checkCorrectIndentation","calculatePercent","graderState","indentLeft","indentRight","loopLimit","viewIndent","indent","solutionLength","text","numLines","lines","score","percent","hasPath","pred","succ","toString","Map","gpred","gsucc","predecessorsIter","bind","successorsIter","thisLevel","forwardFringe","reverseFringe","has","JSNetworkXNoPath","bidirectionalPredSucc","path","reverse","bidirectionalShortestPath","error","DiGraph","graph","node","adj","edge","addNode","addEdge","datadict","nodes","optData","from","entries","edges","optNbunch","edgesIter","nodesIter","toIterator","KeyError","numberOfNodes","size","nbunchIter","hasNode","ex","JSNetworkXError","nodeNbrs","isObjectLike","undefined","mapIterator","tuple2","nbrData","result","optCopy","addNodesFrom","addEdgesFrom","tuple3c","deepcopy","thisPred","thisSucc","nbrs","sprintf","successors","predecessors","JSNetworkXException","message","JSNetworkXAlgorithmError","super","JSNetworkXUnfeasible","graphToNX","line1","tag","line2tag","depends","isVertexCover","vertexCover","DAGGrader","inSolution","map","block","seen","Set","problematicSubgraph","line2","mvc","subsets","pow","bin","subset","allSubsets","indentationByTag","line","solutionIndent","orderExplored","explored","fringe","pop","newNodes","topologicalSort","isDirectedAcyclicGraph","distractor","ParsonsLine","codestring","displaymath","index","view","trimmed","language","addClass","prettifyLanguage","counterId","initializeWidth","width","outerWidth","pixelsPerIndent","fontSize","getComputedStyle","getPropertyValue","tempCanvasCtx","getContext","possibleFonts","fillerText","font","serifWidth","measureText","includes","replaceAll","fontFamily","blocks","noindent","ParsonsBlock","labels","blockIndex","sharedIndent","lineDiv","append","lineIndent","removeClass","labelDiv","numbered","prepend","css","float","addLine","children","consumeBlock","attr","makeTabIndex","detach","newBlocks","addLabel","updateView","addIndent","areaWidth","label","div","offsetHeight","initializeInteractivity","hasClass","hammer","that","panStart","panEnd","panMove","enabled","isDistractor","inSourceArea","sourceArea","childNodes","pageXCenter","boundingRect","getBoundingClientRect","pageXOffset","left","pageYCenter","pageYOffset","top","height","minimumLineIndent","slideUnderBlock","sourceBlocks","pairedBin","pairedBins","matchesBin","validSourceIndexes","lastBin","blockBin","verticalOffset","answerArea","bottom","newFocus","textFocus","enterKeyboardMode","textMove","textMoving","releaseFocus","logMove","exitKeyboardMode","unbind","focus","blur","keydown","keyDown","disable","removeAttr","initializeTabIndex","resetView","hasAttribute","opacity","moving","movingX","pageX","movingY","pageY","isAnswered","keyCode","moveLeft","selectLeft","moveUp","selectUp","moveRight","selectRight","moveDown","selectDown","toggleMove","offset","insertBefore","answerBlocks","item","myIndex","enabledSourceBlocks","chooseNext","chooseOffset","itemOffset","enabledAnswerBlocks","hash","Parsons","opts","orig","containerDiv","origElem","find","question","useRunestoneServices","divid","storageId","localStorageKey","contentArray","counter","initializeOptions","grader","showfeedback","fulltext","html","checkCount","numDistinct","hasSolved","initializeLines","initializeView","caption","addCaption","checkServer","Prism","highlightAllUnder","maxdist","data","order","adaptive","initializeAdaptive","locale","eBookConfig","python","java","javascript","ruby","outerDiv","parsTextDiv","keyboardTip","hide","sortContainerDiv","sourceRegionDiv","sourceLabel","answerRegionDiv","answerLabel","parsonsControlDiv","checkButton","textContent","checkCurrentAnswer","logCurrentAnswer","renderFeedback","resetButton","prop","setLocalStorage","helpButton","disabled","helpMe","messageDiv","replaceWith","closest","textBlocks","indents","distractIndex","tagIndex","dependsIndex","textBlock","distractHelptext","dependsString","mystring","arg1","code","paired","inArray","groupWithNext","initializeAreas","replaceElement","areaHeight","maxFunction","isHidden","offsetParent","classList","body","height_add","async","runestoneMathready","runestoneMathReady","then","queueMathJax","MathJax","startup","addition","outerH","outerHeight","isTimed","bins","lineNumbers","pairedDivs","pairDistractors","pairedDiv","addBlockLabels","newerData","dataA","dataB","dateA","timestamp","dateB","dateFromTimestamp","loadData","sourceHash","trash","answerHash","answer","adaptiveHash","optionsFromHash","blocksFromSource","blocksFromHash","correct","needsReinitialization","assessmentTaken","localData","localStorage","getItem","JSON","parse","restoreAnswers","serverData","checkLocalStorage","graderactive","toStore","setItem","stringify","activity","div_id","storageid","act","logBookEvent","sid","key","adaptBlocks","distractors","recentAttempts","adaptiveId","lastestAttemptCount","nBlocks","nBlocksToCombine","nDistractors","nToRemove","limitDistractors","shuffled","output","best","combineIndex","next","rating","blockIndent","nextIndent","newSolution","combinedOutput","originalBlocks","unorderedBlocks","removedBlocks","chunks","chunk","random","indexTo","indexFrom","blockFromHash","Number","getBlockById","solutionBlocks","nextBlock","child","all","getBlockFor","check","contains","parentElement","canHelp","lastAnswerHash","gotHelp","alert","feedbackArea","fadeIn","incorrectBlocks","inSolutionIndexes","notInSolution","lisIndexes","usesIndentation","distractorToRemove","numberOfBlocks","fIncludeDistractors","removeDistractor","animate","duration","complete","sourceRect","startX","startY","endX","endY","start","progress","removeIndentation","blockWidth","expandedWidth","getSolutionBlockInSource","currBlock","getFurthestBlock","maxDist","dist","maxBlock","indexSol","prevBlock","indexPrev","combineBlocks","block1","block2","index1","index2","move","subtract","makeEasier","date","array","temporaryValue","randomIndex","currentIndex","returnArray","floor","show","disableInteraction","checkServerComplete","movingState","bounds","right","movingHeight","positionTop","newState","updateSource","updateAnswer","updateMoving","baseWidth","hasInserted","movingBin","binForBlock","insertPositions","testHeight","appendTo","matching","overflow","color","movingIndent","before","binCount","binChildren","blocksNotInBins","currentBin","scrollTop","componentMap","err","TimedParsons","timedfeedback","hideFeedback","checkCorrectTimed","component_factory","timed"],"sourceRoot":""}