{"semantics":[{"name":"presentation","type":"group","importance":"high","widget":"coursepresentation","fields":[{"name":"slides","importance":"high","type":"list","field":{"name":"slide","importance":"high","type":"group","fields":[{"name":"elements","importance":"high","type":"list","field":{"name":"element","importance":"high","type":"group","fields":[{"name":"x","importance":"low","type":"number","widget":"none"},{"name":"y","importance":"low","type":"number","widget":"none"},{"name":"width","importance":"low","type":"number","widget":"none","optional":true},{"name":"height","importance":"low","type":"number","widget":"none","optional":true},{"name":"action","type":"library","importance":"high","options":["H5P.AdvancedText 1.1","H5P.Link 1.3","H5P.Image 1.0","H5P.Video 1.3","H5P.Audio 1.2","H5P.Blanks 1.8","H5P.SingleChoiceSet 1.9","H5P.MultiChoice 1.10","H5P.TrueFalse 1.2","H5P.DragQuestion 1.11","H5P.Summary 1.8","H5P.DragText 1.6","H5P.MarkTheWords 1.7","H5P.Dialogcards 1.6","H5P.ContinuousText 1.2","H5P.ExportableTextArea 1.2","H5P.Table 1.1","H5P.InteractiveVideo 1.17","H5P.TwitterUserFeed 1.0"],"optional":true},{"name":"solution","type":"text","widget":"html","optional":true,"label":"Comments","importance":"low","description":"The comments are shown when the user displays the suggested answers for all slides.","enterMode":"p","tags":["strong","em","del","a","ul","ol","h2","h3","hr"]},{"name":"alwaysDisplayComments","type":"boolean","label":"Always display comments","importance":"low","optional":true},{"name":"backgroundOpacity","type":"number","label":"Background Opacity","importance":"low","min":0,"max":100,"step":5,"default":0,"optional":true},{"name":"displayAsButton","type":"boolean","label":"Display as button","importance":"medium","default":false,"optional":true},{"name":"buttonSize","type":"select","label":"Button size","importance":"low","optional":false,"default":"big","options":[{"value":"small","label":"Small"},{"value":"big","label":"Big"}]},{"name":"title","type":"text","optional":true,"label":"Title","importance":"medium"},{"name":"goToSlideType","type":"select","label":"Go to","importance":"medium","optional":false,"options":[{"value":"specified","label":"Specific slide number"},{"value":"next","label":"Next slide"},{"value":"previous","label":"Previous slide"}],"default":"specified"},{"name":"goToSlide","type":"number","label":"Specific slide number","description":"Only applicable when 'Specific slide number' is selected","importance":"low","min":1,"optional":true},{"name":"invisible","type":"boolean","label":"Invisible","importance":"low","description":"Default cursor, no title and no tab index. Warning: Users with disabilities or keyboard only users will have trouble using this element.","default":false},{"name":"metadata","type":"group","label":"Metadata","importance":"low","optional":true,"deprecated":true,"fields":[{"name":"title","type":"text","optional":true,"label":"Title"},{"name":"author","type":"text","optional":true,"label":"Author"},{"name":"lisence","type":"text","optional":true,"label":"License"}]}]}},{"name":"keywords","importance":"low","type":"list","optional":true,"field":{"name":"keyword","importance":"low","type":"group","optional":true,"fields":[{"name":"main","importance":"low","type":"text","optional":true},{"name":"subs","importance":"low","type":"list","optional":true,"field":{"name":"keyword","importance":"low","type":"text"}}]}},{"name":"slideBackgroundSelector","importance":"medium","type":"group","widget":"radioSelector","fields":[{"name":"imageSlideBackground","type":"image","label":"Image","importance":"medium","optional":true,"description":"Image background should have a 2:1 width to height ratio to avoid stretching. High resolution images will display better on larger screens."},{"name":"fillSlideBackground","importance":"medium","type":"text","widget":"colorSelector","label":"Pick a color","spectrum":{"flat":true,"showInput":true,"allowEmpty":true,"showButtons":false},"default":null,"optional":true}]}]}},{"name":"ct","importance":"low","type":"text","widget":"none","optional":true,"tags":["strong","em","del","br","p","a","h2","h3"]},{"name":"keywordListEnabled","type":"boolean","label":"Keyword list","importance":"low","default":true},{"name":"keywordListAlwaysShow","type":"boolean","label":"Always show","importance":"low","default":false},{"name":"keywordListAutoHide","type":"boolean","label":"Auto hide","importance":"low","default":false},{"name":"keywordListOpacity","type":"number","label":"Opacity","importance":"low","min":0,"max":100,"default":90},{"name":"globalBackgroundSelector","importance":"medium","type":"group","widget":"radioSelector","fields":[{"name":"imageGlobalBackground","type":"image","label":"Image","importance":"medium","optional":true,"description":"Image background should have a 2:1 width to height ratio to avoid stretching. High resolution images will display better on larger screens."},{"name":"fillGlobalBackground","type":"text","widget":"colorSelector","label":"Pick a color","importance":"medium","spectrum":{"flat":true,"showInput":true,"allowEmpty":true,"showButtons":false},"default":null,"optional":true}]}]},{"name":"l10n","type":"group","label":"Localize","importance":"low","common":true,"fields":[{"name":"slide","type":"text","label":"Translation for \"Slide\"","importance":"low","default":"Slide"},{"name":"yourScore","type":"text","label":"Translation for \"Your Score\"","importance":"low","default":"Your Score"},{"name":"maxScore","type":"text","label":"Translation for \"Max Score\"","importance":"low","default":"Max Score"},{"name":"goodScore","type":"text","label":"Greeting given for GOOD score","importance":"low","default":"Congratulations! You got @percent correct!","description":"@percent is replaced by the real user score in percent"},{"name":"okScore","type":"text","label":"Greeting given for OK score","importance":"low","default":"Nice effort! You got @percent correct!","description":"@percent is replaced by the real user score in percent"},{"name":"badScore","type":"text","label":"Greeting given for BAD score","importance":"low","default":"You got @percent correct.","description":"@percent is replaced by the real user score in percent"},{"name":"total","type":"text","label":"Translation for \"Total\"","importance":"low","default":"TOTAL"},{"name":"showSolutions","type":"text","label":"Title for show solutions button","importance":"low","default":"Show solutions"},{"name":"retry","type":"text","label":"Text for the retry button","importance":"low","default":"Retry","optional":true},{"name":"title","type":"text","label":"Translation for \"Title\"","importance":"low","default":"Title"},{"name":"author","type":"text","label":"Translation for \"Author\/supplier\"","importance":"low","default":"Author"},{"name":"lisence","type":"text","label":"Translation for \"License\"","importance":"low","default":"License","deprecated":true,"optional":true},{"name":"license","type":"text","label":"Translation for \"License\"","importance":"low","default":"License"},{"name":"exportAnswers","type":"text","label":"Text for the export text button","importance":"low","default":"Export text"},{"name":"copyright","type":"text","label":"Text for the \"Rights of use\" button","importance":"low","default":"Rights of use"},{"name":"hideKeywords","type":"text","label":"Hide keywords list button title","importance":"low","default":"Hide keywords list"},{"name":"showKeywords","type":"text","label":"Show keywords list button title","importance":"low","default":"Show keywords list"},{"name":"fullscreen","type":"text","label":"Fullscreen label","importance":"low","default":"Fullscreen"},{"name":"exitFullscreen","type":"text","label":"Exit fullscreen label","importance":"low","default":"Exit fullscreen"},{"name":"prevSlide","type":"text","label":"Previous slide label","importance":"low","default":"Previous slide"},{"name":"nextSlide","type":"text","label":"Next slide label","importance":"low","default":"Next slide"},{"name":"currentSlide","type":"text","label":"Current slide label","importance":"low","default":"Current slide"},{"name":"lastSlide","type":"text","label":"Last slide label","importance":"low","default":"Last slide"},{"name":"solutionModeTitle","type":"text","label":"Exit solution mode text","importance":"low","default":"Exit solution mode"},{"name":"solutionModeText","type":"text","label":"Solution mode text","importance":"low","default":"Solution Mode"},{"name":"summaryMultipleTaskText","type":"text","label":"Text when multiple tasks on a page","importance":"low","default":"Multiple tasks"},{"name":"scoreMessage","type":"text","label":"Score message text","importance":"low","default":"You achieved:"},{"name":"shareFacebook","type":"text","label":"Share to Facebook text","importance":"low","default":"Share on Facebook"},{"name":"shareTwitter","type":"text","label":"Share to Twitter text","importance":"low","default":"Share on Twitter"},{"name":"shareGoogle","type":"text","label":"Share to Google text","importance":"low","default":"Share on Google+"},{"name":"summary","type":"text","label":"Title for summary slide","importance":"low","default":"Summary"},{"name":"solutionsButtonTitle","type":"text","label":"Title for the comments icon","importance":"low","default":"Show comments"},{"name":"printTitle","type":"text","label":"Title for print button","importance":"low","default":"Print"},{"name":"printIngress","type":"text","label":"Print dialog ingress","importance":"low","default":"How would you like to print this presentation?"},{"name":"printAllSlides","type":"text","label":"Label for \"Print all slides\" button","importance":"low","default":"Print all slides"},{"name":"printCurrentSlide","type":"text","label":"Label for \"Print current slide\" button","importance":"low","default":"Print current slide"},{"name":"noTitle","type":"text","label":"Label for slides without a title","importance":"low","default":"No title"},{"name":"accessibilitySlideNavigationExplanation","type":"text","label":"Explanation of slide navigation for assistive technologies","importance":"low","default":"Use left and right arrow to change slide in that direction whenever canvas is selected."},{"name":"accessibilityCanvasLabel","type":"text","label":"Canvas label for assistive technologies","importance":"low","default":"Presentation canvas. Use left and right arrow to move between slides."},{"name":"containsNotCompleted","type":"text","label":"Label for uncompleted interactions","importance":"low","default":"@slideName contains not completed interaction"},{"name":"containsCompleted","type":"text","label":"Label for completed interactions","importance":"low","default":"@slideName contains completed interaction"},{"name":"slideCount","type":"text","label":"Label for slide counter. Variables are @index, @total","importance":"low","default":"Slide @index of @total"},{"name":"containsOnlyCorrect","type":"text","label":"Label for slides that only contains correct answers","importance":"low","default":"@slideName only has correct answers"},{"name":"containsIncorrectAnswers","type":"text","label":"Label for slides that has incorrect answers","importance":"low","default":"@slideName has incorrect answers"}]},{"name":"override","type":"group","label":"Behaviour settings.","importance":"low","description":"These options will let you override behaviour settings.","optional":true,"fields":[{"name":"activeSurface","type":"boolean","widget":"disposableBoolean","label":"Activate Active Surface Mode","importance":"low","description":"Removes navigation controls for the end user. Use Go To Slide to navigate.","default":false},{"name":"hideSummarySlide","type":"boolean","label":"Hide Summary Slide","importance":"low","description":"Hides the summary slide.","default":false},{"name":"showSolutionButton","type":"select","label":"Override \"Show Solution\" button","importance":"low","description":"This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.","optional":true,"options":[{"value":"on","label":"Enabled"},{"value":"off","label":"Disabled"}]},{"name":"retryButton","type":"select","label":"Override \"Retry\" button","importance":"low","description":"This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.","optional":true,"options":[{"value":"on","label":"Enabled"},{"value":"off","label":"Disabled"}]},{"name":"enablePrintButton","type":"boolean","label":"Enable print button","importance":"low","description":"Enables the print button.","default":false},{"name":"social","type":"group","label":"Social Settings","widget":"showWhen","showWhen":{"rules":[{"field":"hideSummarySlide","equals":false}]},"importance":"low","description":"These options will let you override social behaviour settings. Empty values will be filled in automatically if a link is provided, otherwise all values will be generated.","optional":true,"fields":[{"name":"showFacebookShare","type":"boolean","label":"Display Facebook share icon","importance":"low","default":true},{"name":"facebookShare","importance":"low","type":"group","expanded":true,"label":"Facebook share settings","widget":"showWhen","showWhen":{"rules":[{"field":"showFacebookShare","equals":true}]},"fields":[{"name":"url","type":"text","label":"Share to Facebook link","importance":"low","default":"@currentpageurl"},{"name":"quote","type":"text","label":"Share to Facebook quote","importance":"low","default":"I scored @percentage on a task at @currentpageurl."}]},{"name":"showTwitterShare","type":"boolean","label":"Display Twitter share icon","importance":"low","default":false},{"name":"twitterShare","importance":"low","type":"group","expanded":true,"label":"Twitter share settings","widget":"showWhen","showWhen":{"rules":[{"field":"showTwitterShare","equals":true}]},"fields":[{"name":"statement","type":"text","label":"Share to Twitter statement","importance":"low","default":"I scored @percentage on a task at @currentpageurl."},{"name":"url","type":"text","label":"Share to Twitter link","importance":"low","default":"@currentpageurl"},{"name":"hashtags","type":"text","label":"Share to Twitter hashtags","importance":"low","default":"h5p, course"}]},{"name":"showGoogleShare","type":"boolean","label":"Display Google+ share icon","importance":"low","default":false},{"name":"googleShareUrl","type":"text","label":"Share to Google link","importance":"low","default":"@currentpageurl","widget":"showWhen","showWhen":{"rules":[{"field":"showGoogleShare","equals":true}]}}]}]}],"language":"{\n  \"semantics\": [\n    {\n      \"fields\": [\n        {\n          \"field\": {\n            \"fields\": [\n              {\n                \"field\": {\n                  \"fields\": [\n                    {},\n                    {},\n                    {},\n                    {},\n                    {},\n                    {\n                      \"label\": \"Opmerkingen\",\n                      \"description\": \"De opmerkingen worden getoond wanneer de gebruiker de voorgestelde antwoorden voor alle slides toont.\"\n                    },\n                    {\n                      \"label\": \"Altijd opmerkingen tonen\"\n                    },\n                    {\n                      \"label\": \"Ondoorzichtigheid achtergrond\"\n                    },\n                    {\n                      \"label\": \"Tonen als knop\"\n                    },\n                    {\n                      \"label\": \"Button size\",\n                      \"options\": [\n                        {\n                          \"label\": \"Small\"\n                        },\n                        {\n                          \"label\": \"Big\"\n                        }\n                      ]\n                    },\n                    {\n                      \"label\": \"Titel\"\n                    },\n                    {\n                      \"label\": \"Go to to\",\n                      \"options\": [\n                        {\n                          \"label\": \"Specific slide number\"\n                        },\n                        {\n                          \"label\": \"Volgende slide\"\n                        },\n                        {\n                          \"label\": \"Vorige slide\"\n                        }\n                      ]\n                    },\n                    {\n                      \"label\": \"Ga naar slide\",\n                      \"description\": \"Only applicable when 'Specific slide number' is selected\"\n                    },\n                    {\n                      \"label\": \"Onzichtbaar\",\n                      \"description\": \"Standaard cursor, geen titel en geen tab index. Let op: gebruikers met een beperking of gebruikers die alleen een toetsenbord gebruiken, zullen problemen ervaren met dit element.\"\n                    },\n                    {\n                      \"label\": \"Metadata\",\n                      \"fields\": [\n                        {\n                          \"label\": \"Titel\"\n                        },\n                        {\n                          \"label\": \"Auteur\/Leverancier\"\n                        },\n                        {\n                          \"label\": \"Licentie\"\n                        }\n                      ]\n                    }\n                  ]\n                }\n              },\n              {},\n              {\n                \"fields\": [\n                  {\n                    \"label\": \"Afbeelding\",\n                    \"description\": \"Achtergrondafbeelding moet een ratio van 2:1 breedte:hoogte hebben om te voorkomen dat deze wordt uitgerekt. Afbeeldingen met hoge resolutie worden beter getoond op grotere schermen.\"\n                  },\n                  {\n                    \"label\": \"Kies een kleur\",\n                    \"default\": \"\"\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        {},\n        {\n          \"label\": \"Lijst met sleutelwoorden\"\n        },\n        {\n          \"label\": \"Altijd tonen\"\n        },\n        {\n          \"label\": \"Automatisch verbergen\"\n        },\n        {\n          \"label\": \"Ondoorzichtigheid\"\n        },\n        {\n          \"fields\": [\n            {\n              \"label\": \"Afbeelding\",\n              \"description\": \"Achtergrondafbeelding moet een ratio van 2:1 breedte:hoogte hebben om te voorkomen dat deze wordt uitgerekt. Afbeeldingen met hoge resolutie worden beter getoond op grotere schermen.\"\n            },\n            {\n              \"label\": \"Kies een kleur\",\n              \"default\": \"\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"label\": \"Localiseren\",\n      \"fields\": [\n        {\n          \"label\": \"Vertaling voor \\\"Slide\\\"\",\n          \"default\": \"Slide\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Jouw score\\\"\",\n          \"default\": \"Jouw score\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Maximale score\\\"\",\n          \"default\": \"Max score\"\n        },\n        {\n          \"label\": \"Melding voor een GOEDE score\",\n          \"default\": \"Gefeliciteerd! Je hebt @percent correct!\",\n          \"description\": \"@percent wordt vervangen door de werkelijke score van de gebruiker, in procenten\"\n        },\n        {\n          \"label\": \"Melding voor een REDELIJKE score\",\n          \"default\": \" Goed gedaan! Je hebt @percent correct!\",\n          \"description\": \"@percent wordt vervangen door de werkelijke score van de gebruiker, in procenten\"\n        },\n        {\n          \"label\": \"Melding voor een SLECHTE score\",\n          \"default\": \"Je hebt @percent correct.\",\n          \"description\": \"@percent wordt vervangen door de werkelijke score van de gebruiker, in procenten\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Totaal\\\"\",\n          \"default\": \"Totaal\"\n        },\n        {\n          \"label\": \"Tekst voor \\\"Toon oplossing\\\"-knop\",\n          \"default\": \"Toon oplossing\"\n        },\n        {\n          \"label\": \"Tekst voor de knop Opnieuw\",\n          \"default\": \"Opnieuw proberen\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Titel\\\"\",\n          \"default\": \"Titel\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Auteur\/Leverancier\\\"\",\n          \"default\": \"Auteur\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Licentie\\\"\",\n          \"default\": \"Licentie\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Licentie\\\"\",\n          \"default\": \"Licentie\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Exporteer tekst\\\"\",\n          \"default\": \"Exporteer tekst\"\n        },\n        {\n          \"label\": \"Tekst voor Gebruiksrechten-knop\",\n          \"default\": \"Gebruiksrechten\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Verberg sleutelwoordenlijst\\\"-knop\",\n          \"default\": \"Verberg sleutelwoordenlijst\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Toon sleutelwoordenlijst\\\"-knop\",\n          \"default\": \"Toon sleutelwoordenlijst\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volledig scherm\\\"-knop\",\n          \"default\": \"Volledig scherm\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volledig scherm afsluiten\\\"-knop\",\n          \"default\": \"Volledig scherm afsluiten\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Vorige slide\\\"-knop\",\n          \"default\": \"Vorige slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volgende slide\\\"-knop\",\n          \"default\": \"Volgende slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Huidige slide\\\"-knop\",\n          \"default\": \"Huidige slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Laatste slide\\\"-knop\",\n          \"default\": \"Laatste slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Oplossingsmodus afsluiten\\\"-knop\",\n          \"default\": \"Oplossingsmodus afsluiten\"\n        },\n        {\n          \"label\": \"Tekst oplossingsmodus\",\n          \"default\": \"Oplossingsmodus\"\n        },\n        {\n          \"label\": \"Tekst wanneer er meerdere taken op een pagina zijn\",\n          \"default\": \"Meerdere taken\"\n        },\n        {\n          \"label\": \"Scoretekst\",\n          \"default\": \"Je hebt gescoord:\"\n        },\n        {\n          \"label\": \"Deel op Facebook tekst\",\n          \"default\": \"Deel op Facebook\"\n        },\n        {\n          \"label\": \"Deel op Twitter tekst\",\n          \"default\": \"Deel op Twitter\"\n        },\n        {\n          \"label\": \"Share to Google text\",\n          \"default\": \"Share on Google+\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Samenvatting\\\" slide\",\n          \"default\": \"Samenvatting\"\n        },\n        {\n          \"label\": \"Titel voor opmerkingenicoon\",\n          \"default\": \"Toon opmerkingen\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Afdrukken\\\"-knop\",\n          \"default\": \"Afdrukken\"\n        },\n        {\n          \"label\": \"Afdrukken dialoog ingress\",\n          \"default\": \"Hoe wil je deze presentatie afdrukken?\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Druk alle slides af\\\"-knop\",\n          \"default\": \"Druk alle slides af\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Druk huidige slide af\\\"-knop\",\n          \"default\": \"Druk huidige slide af\"\n        },\n        {\n          \"label\": \"Label for slides without a title\",\n          \"default\": \"No title\"\n        },\n        {\n          \"label\": \"Explanation of slide navigation for assistive technologies\",\n          \"default\": \"Use left and right arrow to change slide in that direction whenever canvas is selected\"\n        },\n        {\n          \"label\": \"Canvas label for assistive technologies\",\n          \"default\": \"Presentation canvas. Use left and right arrow to move between slides.\"\n        },\n        {\n          \"label\": \"Label for uncompleted interactions\",\n          \"default\": \"@slideName contains not completed interaction\"\n        },\n        {\n          \"label\": \"Label for completed interactions\",\n          \"default\": \"@slideName contains completed interaction\"\n        },\n        {\n          \"label\": \"Label for slide counter. Variables are @index, @total\",\n          \"default\": \"Slide @index of @total\"\n        },\n        {\n          \"label\": \"Label for slides that only contains correct answers\",\n          \"default\": \"@slideName only has correct answers\"\n        },\n        {\n          \"label\": \"Label for slides that has incorrect answers\",\n          \"default\": \"@slideName has incorrect answers\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Met deze opties kun je de gedragsinstellingen overschrijven.\",\n      \"fields\": [\n        {\n          \"label\": \"Activeer Active Surface Mode\",\n          \"description\": \"Verwijdert navigatieregelaars voor de eindgebruiker. Gebruik 'Ga naar Slide' om te navigeren.\"\n        },\n        {\n          \"label\": \"Verberg samenvatting\",\n          \"description\": \"Verbergt de samenvattingsslide.\"\n        },\n        {\n          \"label\": \"\\\"Toon oplossing\\\" knop instellen\",\n          \"description\": \"Deze optie bepaalt of de \\\"Toon oplossing\\\" knop voor alle vragen wordt getoond, uitgeschakeld of voor iedere vraag afzonderlijk wordt geconfigureerd.\",\n          \"options\": [\n            {\n              \"label\": \"Ingeschakeld\"\n            },\n            {\n              \"label\": \"Uitgeschakeld\"\n            }\n          ]\n        },\n        {\n          \"label\": \"\\\"Opnieuw proberen\\\" knop instellen\",\n          \"description\": \"Deze optie bepaalt of de \\\"Opnieuw proberen\\\" knop voor alle vragen wordt getoond, uitgeschakeld of voor iedere vraag afzonderlijk wordt geconfigureerd.\",\n          \"options\": [\n            {\n              \"label\": \"Ingeschakeld\"\n            },\n            {\n              \"label\": \"Uitgeschakeld\"\n            }\n          ]\n        },\n        {\n          \"label\": \"Printknop inschakelen\",\n          \"description\": \"Schakelt printknop in\"\n        },\n        {\n          \"label\": \"Social Settings\",\n          \"description\": \"These options will let you override social behaviour settings. Empty values will be filled in automatically if a link is provided, otherwise all values will be generated.\",\n          \"fields\": [\n            {\n              \"label\": \"Display Facebook share icon\"\n            },\n            {\n              \"label\": \"Facebook share settings\",\n              \"fields\": [\n                {\n                  \"label\": \"Share to Facebook link\",\n                  \"default\": \"@currentpageurl\"\n                },\n                {\n                  \"label\": \"Share to Facebook quote\",\n                  \"default\": \"I scored @percentage on a task at @currentpageurl.\"\n                }\n              ]\n            },\n            {\n              \"label\": \"Display Twitter share icon\"\n            },\n            {\n              \"label\": \"Twitter share settings\",\n              \"fields\": [\n                {\n                  \"label\": \"Share to Twitter statement\",\n                  \"default\": \"I scored @percentage on a task at @currentpageurl.\"\n                },\n                {\n                  \"label\": \"Share to Twitter link\",\n                  \"default\": \"@currentpageurl\"\n                },\n                {\n                  \"label\": \"Share to Twitter hashtags\",\n                  \"default\": \"h5p, course\"\n                }\n              ]\n            },\n            {\n              \"label\": \"Display Google+ share icon\"\n            },\n            {\n              \"label\": \"Share to Google link\",\n              \"default\": \"@currentpageurl\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}","javascript":{"https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNDrop-1.1\/drag-n-drop.js?ver=1.1.5":"\nvar H5P = H5P || {};\n\n\/**\n * A class that easily helps your create awesome drag and drop.\n *\n * @param {H5P.DragNBar} DnB\n * @param {jQuery} $container\n * @returns {undefined}\n *\/\nH5P.DragNDrop = function (dnb, $container) {\n  H5P.EventDispatcher.call(this);\n  this.dnb = dnb;\n  this.$container = $container;\n  this.scrollLeft = 0;\n  this.scrollTop = 0;\n};\n\n\/\/ Inherit support for events\nH5P.DragNDrop.prototype = Object.create(H5P.EventDispatcher.prototype);\nH5P.DragNDrop.prototype.constructor = H5P.DragNDrop;\n\n\/**\n * Set the current element\n * \n * @method setElement\n * @param  {j@uery} $element\n *\/\nH5P.DragNDrop.prototype.setElement = function ($element) {\n  this.$element = $element;\n};\n\n\/**\n * Start tracking the mouse.\n *\n * @param {jQuery} $element\n * @param {Number} x Start X coordinate\n * @param {Number} y Start Y coordinate\n * @returns {undefined}\n *\/\nH5P.DragNDrop.prototype.press = function ($element, x, y) {\n  var that = this;\n  var eventData = {\n    instance: this\n  };\n\n  H5P.$window\n    .mousemove(eventData, H5P.DragNDrop.moveHandler)\n    .bind('mouseup', eventData, H5P.DragNDrop.release);\n\n  H5P.$body\n    \/\/ With user-select: none uncommented, after moving a drag and drop element, if I hover over something that changes transparancy on hover IE10 on WIN7 crashes\n    \/\/ TODO: Add user-select and -ms-user-select later if IE10 stops bugging\n    .css({'-moz-user-select': 'none', '-webkit-user-select': 'none'\/*, 'user-select': 'none', '-ms-user-select': 'none'*\/})\n    .attr('unselectable', 'on')[0]\n    .onselectstart = H5P.$body[0].ondragstart = function () {\n      return false;\n    };\n\n  that.containerOffset = $element.offsetParent().offset();\n\n  this.$element = $element;\n  this.moving = false;\n  this.startX = x;\n  this.startY = y;\n\n  this.marginX = parseInt($element.css('marginLeft')) + parseInt($element.css('marginRight'));\n  this.marginY = parseInt($element.css('marginTop')) + parseInt($element.css('marginBottom'));\n\n  var offset = $element.offset();\n  this.adjust = {\n    x: x - offset.left + this.marginX,\n    y: y - offset.top - this.marginY\n  };\n\n  if (that.dnb && that.dnb.newElement) {\n    this.move(x, y);\n  }\n};\n\n\/**\n * Handles mouse move events.\n *\n * @param {Event} event\n *\/\nH5P.DragNDrop.moveHandler = function (event) {\n  event.stopPropagation();\n  event.data.instance.move(event.pageX, event.pageY);\n};\n\n\/**\n * Handles mouse movements.\n *\n * @param {number} x\n * @param {number} y\n *\/\nH5P.DragNDrop.prototype.move = function (x, y) {\n  var that = this;\n\n  if (!that.moving) {\n    if (that.startMovingCallback !== undefined && !that.startMovingCallback(x, y)) {\n      return;\n    }\n\n    \/\/ Start moving\n    that.moving = true;\n    that.$element.addClass('h5p-moving');\n  }\n\n  x -= that.adjust.x;\n  y -= that.adjust.y;\n\n  var posX = x - that.containerOffset.left + that.scrollLeft;\n  var posY = y - that.containerOffset.top + that.scrollTop;\n\n  if (that.snap !== undefined) {\n    posX = Math.round(posX \/ that.snap) * that.snap;\n    posY = Math.round(posY \/ that.snap) * that.snap;\n  }\n\n  \/\/ Do not move outside of minimum values.\n  if (that.min !== undefined) {\n    if (posX < that.min.x) {\n      posX = that.min.x;\n      x = that.min.x + that.containerOffset.left - that.scrollLeft;\n    }\n    if (posY < that.min.y) {\n      posY = that.min.y;\n      y = that.min.y + that.containerOffset.top - that.scrollTop;\n    }\n  }\n\n\n  if (that.dnb && that.dnb.newElement && posY >= 0) {\n    that.min.y = 0;\n  }\n\n  \/\/ Do not move outside of maximum values.\n  if (that.max !== undefined) {\n    if (posX > that.max.x) {\n      posX = that.max.x;\n      x = that.max.x + that.containerOffset.left - that.scrollLeft;\n    }\n    if (posY > that.max.y) {\n      posY = that.max.y;\n      y = that.max.y + that.containerOffset.top - that.scrollTop;\n    }\n  }\n\n  \/\/ Show transform panel if element has moved\n  var startX = that.startX - that.adjust.x - that.containerOffset.left + that.scrollLeft;\n  var startY = that.startY - that.adjust.y - that.containerOffset.top + that.scrollTop;\n  if (!that.snap && (posX !== startX || posY !== startY)) {\n    that.trigger('showTransformPanel');\n  }\n  else if (that.snap) {\n    var xChanged = (Math.round(posX \/ that.snap) * that.snap) !==\n      (Math.round(startX \/ that.snap) * that.snap);\n    var yChanged = (Math.round(posY \/ that.snap) * that.snap) !==\n      (Math.round(startY \/ that.snap) * that.snap);\n    if (xChanged || yChanged) {\n      that.trigger('showTransformPanel');\n    }\n  }\n\n  that.$element.css({left: posX, top: posY});\n\n  if (that.dnb) {\n    that.dnb.updateCoordinates();\n  }\n\n  if (that.moveCallback !== undefined) {\n    that.moveCallback(x, y, that.$element);\n  }\n};\n\n\/**\n * Stop tracking the mouse.\n *\n * @param {Object} event\n * @returns {undefined}\n *\/\nH5P.DragNDrop.release = function (event) {\n  var that = event.data.instance;\n\n  H5P.$window\n    .unbind('mousemove', H5P.DragNDrop.moveHandler)\n    .unbind('mouseup', H5P.DragNDrop.release);\n\n  H5P.$body\n    .css({'-moz-user-select': '', '-webkit-user-select': ''\/*, 'user-select': '', '-ms-user-select': ''*\/})\n    .removeAttr('unselectable')[0]\n    .onselectstart = H5P.$body[0].ondragstart = null;\n\n  if (that.releaseCallback !== undefined) {\n    that.releaseCallback();\n  }\n\n  if (that.moving) {\n    that.$element.removeClass('h5p-moving');\n    if (that.stopMovingCallback !== undefined) {\n      that.stopMovingCallback(event);\n    }\n  }\n\n  \/\/ trigger to hide the transform panel unless it was activated\n  \/\/ through the context menu\n  that.trigger('hideTransformPanel');\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNResize-1.2\/H5P.DragNResize.js?ver=1.2.5":"\n\/*global H5P*\/\nH5P.DragNResize = (function ($, EventDispatcher) {\n\n  \/**\n   * Constructor!\n   *\n   * @class H5P.DragNResize\n   * @param {H5P.jQuery} $container\n   *\/\n  function C($container) {\n    var self = this;\n    this.$container = $container;\n    self.disabledModifiers = false;\n\n    EventDispatcher.call(this);\n\n    \/\/ Override settings for snapping to grid, and locking aspect ratio.\n    H5P.$body.keydown(function (event) {\n      if (self.disabledModifiers) {\n        return;\n      }\n\n      if (event.keyCode === 17) {\n        \/\/ Ctrl\n        self.revertSnap = true;\n      }\n      else if (event.keyCode === 16) {\n        \/\/ Shift\n        self.revertLock = true;\n      }\n    }).keyup(function (event) {\n      if (self.disabledModifiers) {\n        return;\n      }\n\n      if (event.keyCode === 17) {\n        \/\/ Ctrl\n        self.revertSnap = false;\n      }\n      else if (event.keyCode === 16) {\n        \/\/ Shift\n        self.revertLock = false;\n      }\n    });\n  }\n\n  \/\/ Inheritance\n  C.prototype = Object.create(EventDispatcher.prototype);\n  C.prototype.constructor = C;\n\n  \/**\n   * Gives the given element a resize handle.\n   *\n   * @param {H5P.jQuery} $element\n   * @param {Object} [options]\n   * @param {boolean} [options.lock]\n   * @param {boolean} [options.cornerLock]\n   *\/\n  C.prototype.add = function ($element, options) {\n    var that = this;\n\n    \/\/ Array with position of handles\n    var cornerPositions = ['nw', 'ne', 'sw', 'se'];\n    var edgePositions = ['n', 'w', 'e', 's'];\n\n    var addResizeHandle = function (position, corner) {\n      $('<div>', {\n        'class': 'h5p-dragnresize-handle ' + position\n      }).mousedown(function (event) {\n        that.lock = (options && (options.lock || corner && options.cornerLock));\n        if (options.cornerLock) {\n          that.isImage = true;\n        }\n        that.$element = $element;\n        that.press(event.clientX, event.clientY, position);\n      }).data('position', position)\n        .appendTo($element);\n    };\n\n    cornerPositions.forEach(function (pos) {\n      addResizeHandle(pos, true);\n    });\n\n    \/\/ Add edge handles\n    if (!options || !options.lock) {\n      edgePositions.forEach(function (pos) {\n        addResizeHandle(pos);\n      });\n    }\n  };\n\n  \/**\n   * Get paddings for the element\n   *\/\n  C.prototype.getElementPaddings = function () {\n    return {\n      horizontal: Number(this.$element.css('padding-left').replace(\"px\", \"\")) + Number(this.$element.css('padding-right').replace(\"px\", \"\")),\n      vertical: Number(this.$element.css('padding-top').replace(\"px\", \"\")) + Number(this.$element.css('padding-bottom').replace(\"px\", \"\"))\n    };\n  };\n\n  \/**\n   * Get borders for the element\n   * @returns {{horizontal: number, vertical: number}}\n   *\/\n  C.prototype.getElementBorders = function () {\n    return {\n      horizontal: Number(this.$element.css('border-left-width').replace('px', '')) + Number(this.$element.css('border-right-width').replace('px', '')),\n      vertical: Number(this.$element.css('border-top-width').replace('px', '')) + Number(this.$element.css('border-bottom-width').replace('px', ''))\n    };\n  };\n\n  C.prototype.setContainerEm = function (containerEm) {\n    this.containerEm = containerEm;\n  };\n\n  \/**\n   * Start resizing\n   *\n   * @param {number} x\n   * @param {number} y\n   * @param {String} [direction] Direction of resize\n   *\/\n  C.prototype.press = function (x, y, direction) {\n    this.active = true;\n    var eventData = {\n      instance: this,\n      direction: direction\n    };\n\n    H5P.$window\n      .bind('mouseup', eventData, C.release)\n      .mousemove(eventData, C.move);\n\n    H5P.$body\n      .css({\n        '-moz-user-select': 'none',\n        '-webkit-user-select': 'none',\n        'user-select': 'none',\n        '-ms-user-select': 'none'\n      })\n      .attr('unselectable', 'on')[0]\n      .onselectstart = H5P.$body[0].ondragstart = function () {\n        return false;\n      };\n\n    this.startX = x;\n    this.startY = y;\n    this.padding = this.getElementPaddings();\n    this.borders = this.getElementBorders();\n    this.startWidth = this.$element.outerWidth();\n    this.startHeight = this.$element.outerHeight();\n    this.ratio = (this.startWidth \/ this.startHeight);\n    var position = this.$element.position();\n    this.left = position.left;\n    this.top = position.top;\n    this.containerWidth = this.$container.width();\n    this.containerHeight = this.$container.height();\n\n    \/\/ Set default values\n    this.newLeft = this.left;\n    this.newTop = this.top;\n    this.newWidth = this.startWidth;\n    this.newHeight = this.startHeight;\n\n    this.trigger('startResizing', eventData);\n\n    \/\/ Show transform panel\n    this.trigger('showTransformPanel');\n  };\n\n  \/**\n   * Resize events\n   *\n   * @param {Event} event\n   *\/\n  C.move = function (event) {\n    var direction = (event.data.direction ? event.data.direction : 'se');\n    var that = event.data.instance;\n    var moveW = (direction === 'nw' || direction === 'sw' || direction === 'w');\n    var moveN = (direction === 'nw' || direction === 'ne' || direction === 'n');\n    var moveDiagonally = (direction === 'nw' || direction === 'ne' || direction === 'sw' || direction === 'se');\n    var movesHorizontal = (direction === 'w' || direction === 'e');\n    var movesVertical = (direction === 'n' || direction === 's');\n    var deltaX = that.startX - event.clientX;\n    var deltaY = that.startY - event.clientY;\n\n    that.minLeft = that.left + that.startWidth - H5P.DragNResize.MIN_SIZE;\n    that.minTop = that.top + that.startHeight - H5P.DragNResize.MIN_SIZE;\n\n    \/\/ Moving west\n    if (moveW) {\n      that.newLeft = that.left - deltaX;\n      that.newWidth = that.startWidth + deltaX;\n\n      \/\/ Check edge cases\n      if (that.newLeft < 0) {\n        that.newLeft = 0;\n        that.newWidth = that.left + that.startWidth;\n      }\n      else if (that.newLeft > that.minLeft) {\n        that.newLeft = that.minLeft;\n        that.newWidth = that.left - that.minLeft + that.startWidth;\n      }\n\n      \/\/ Snap west side\n      if (that.snap && !that.revertSnap) {\n        that.newLeft = Math.round(that.newLeft \/ that.snap) * that.snap;\n\n        \/\/ Make sure element does not snap east\n        if (that.newLeft > that.minLeft) {\n          that.newLeft = Math.floor(that.minLeft \/ that.snap) * that.snap;\n        }\n\n        that.newWidth = (that.left - that.newLeft) + that.startWidth;\n      }\n    }\n    else if (!movesVertical) {\n      that.newWidth = that.startWidth - deltaX;\n\n      \/\/ Snap width\n      if (that.snap && !that.revertSnap) {\n        that.newWidth = Math.round(that.newWidth \/ that.snap) * that.snap;\n      }\n\n      if (that.left + that.newWidth > that.containerWidth) {\n        that.newWidth = that.containerWidth - that.left;\n      }\n    }\n\n    \/\/ Moving north\n    if (moveN) {\n      that.newTop = that.top - deltaY;\n      that.newHeight = that.startHeight + deltaY;\n\n      \/\/ Check edge cases\n      if (that.newTop < 0) {\n        that.newTop = 0;\n        that.newHeight = that.top + that.startHeight;\n      }\n      else if (that.newTop > that.minTop) {\n        that.newTop = that.minTop;\n        that.newHeight = that.top - that.minTop + that.startHeight;\n      }\n\n      \/\/ Snap north\n      if (that.snap && !that.revertSnap) {\n        that.newTop = Math.round(that.newTop \/ that.snap) * that.snap;\n\n        \/\/ Make sure element does not snap south\n        if (that.newTop > that.minTop) {\n          that.newTop = Math.floor(that.minTop \/ that.snap) * that.snap;\n        }\n\n        that.newHeight = (that.top - that.newTop) + that.startHeight;\n      }\n    }\n    else if (!movesHorizontal) {\n      that.newHeight = that.startHeight - deltaY;\n\n      \/\/ Snap height\n      if (that.snap && !that.revertSnap) {\n        that.newHeight = Math.round(that.newHeight \/ that.snap) * that.snap;\n      }\n\n      if (that.top + that.newHeight > that.containerHeight) {\n        that.newHeight = that.containerHeight - that.top;\n      }\n    }\n\n    \/\/ Set min size\n    if (that.newWidth <= H5P.DragNResize.MIN_SIZE) {\n      that.newWidth = H5P.DragNResize.MIN_SIZE;\n    }\n\n    if (that.newHeight <= H5P.DragNResize.MIN_SIZE) {\n      that.newHeight = H5P.DragNResize.MIN_SIZE;\n    }\n\n    \/\/ Apply ratio lock for elements except images, they have a their own specific for corner cases\n    var lock = (that.revertLock ? !that.lock : that.lock);\n    if (lock && (moveDiagonally || !that.isImage)) {\n      that.lockDimensions(moveW, moveN, movesVertical, movesHorizontal);\n    }\n\n    \/\/ Reduce size by padding and borders\n    that.finalWidth = that.newWidth;\n    that.finalHeight = that.newHeight;\n    if (that.$element.css('boxSizing') !== 'border-box') {\n      that.finalWidth -= (that.padding.horizontal + that.borders.horizontal);\n      that.finalHeight -= (that.padding.vertical + that.borders.vertical);\n    }\n\n    that.$element.css({\n      width: (that.finalWidth \/ that.containerEm) + 'em',\n      height: (that.finalHeight \/ that.containerEm) + 'em',\n      left: ((that.newLeft \/ that.containerWidth) * 100) + '%',\n      top: ((that.newTop \/ that.containerHeight) * 100) + '%'\n    });\n\n    that.trigger('moveResizing');\n  };\n\n  \/**\n   * Changes element values depending on moving direction of the element\n   * @param isMovingWest\n   * @param isMovingNorth\n   * @param movesVertical\n   * @param movesHorizontal\n   *\/\n  C.prototype.lockDimensions = function (isMovingWest, isMovingNorth, movesVertical, movesHorizontal) {\n    var self = this;\n\n    \/\/ Cap movement at top\n    var lockTop = function (isMovingNorth) {\n      if (!isMovingNorth) {\n        return;\n      }\n\n      self.newTop = self.top - (self.newHeight - self.startHeight);\n\n      \/\/ Edge case\n      if (self.newTop <= 0) {\n        self.newTop = 0;\n      }\n    };\n\n    \/\/ Expand to longest edge\n    if (movesVertical) {\n      this.newWidth = this.newHeight * this.ratio;\n\n      \/\/ Make sure locked ratio does not cause size to go below min size\n      if (this.newWidth < H5P.DragNResize.MIN_SIZE) {\n        this.newWidth = H5P.DragNResize.MIN_SIZE;\n        this.newHeight = H5P.DragNResize.MIN_SIZE \/ this.ratio;\n      }\n    }\n    else if (movesHorizontal) {\n      this.newHeight = this.newWidth \/ this.ratio;\n\n      \/\/ Make sure locked ratio does not cause size to go below min size\n      if (this.newHeight < H5P.DragNResize.MIN_SIZE) {\n        this.newHeight = H5P.DragNResize.MIN_SIZE;\n        this.newWidth = H5P.DragNResize.MIN_SIZE * this.ratio;\n      }\n    }\n    else if (this.newWidth \/ this.startWidth > this.newHeight \/ this.startHeight) {\n      \/\/ Expand to width\n      this.newHeight = this.newWidth \/ this.ratio;\n    }\n    else {\n      \/\/ Expand to height\n      this.newWidth = this.newHeight * this.ratio;\n    }\n\n    \/\/ Change top to match new height\n    if (isMovingNorth) {\n      lockTop(isMovingNorth);\n\n      if (self.newTop <= 0) {\n        self.newHeight = self.top + self.startHeight;\n        self.newWidth = self.newHeight * self.ratio;\n      }\n    }\n    else {\n      \/\/ Too high\n      if (this.top + this.newHeight > this.containerHeight) {\n        this.newHeight = this.containerHeight - this.top;\n        this.newWidth = this.newHeight * this.ratio;\n      }\n    }\n\n    \/\/ Change left to match new width\n    if (isMovingWest) {\n      this.newLeft = this.left - (this.newWidth - this.startWidth);\n      \/\/ Edge case\n      if (this.newLeft <= 0) {\n        this.newLeft = 0;\n        this.newWidth = this.left + this.startWidth;\n        this.newHeight = this.newWidth \/ this.ratio;\n      }\n    }\n    else {\n      \/\/ Too wide\n      if (this.left + this.newWidth > this.containerWidth) {\n        this.newWidth = this.containerWidth - this.left;\n        this.newHeight = this.newWidth \/ this.ratio;\n      }\n    }\n\n    \/\/ Need to re-lock top in case height changed\n    lockTop(isMovingNorth);\n  };\n\n  \/**\n   * Stop resizing\n   *\n   * @param {Event} event\n   *\/\n  C.release = function (event) {\n    var that = event.data.instance;\n    that.active = false;\n\n    H5P.$window\n      .unbind('mouseup', C.release)\n      .unbind('mousemove', C.move);\n\n    H5P.$body\n      .css({\n        '-moz-user-select': '',\n        '-webkit-user-select': '',\n        'user-select': '',\n        '-ms-user-select': ''\n      })\n      .removeAttr('unselectable')[0]\n      .onselectstart = H5P.$body[0].ondragstart = null;\n\n    if (that.newWidth !== that.startWidth ||\n        that.newHeight !== that.startHeight) {\n      \/\/ Stopped resizing send width and height in Ems\n      that.trigger('stoppedResizing', {\n        left: that.newLeft,\n        top: that.newTop,\n        width: that.finalWidth \/ that.containerEm,\n        height: that.finalHeight \/ that.containerEm\n      });\n    }\n\n    \/\/ Refocus element after resizing it. Apply timeout since focus is lost at the end of mouse event.\n    setTimeout(function () {\n      that.$element.focus();\n    }, 0);\n\n    \/\/ trigger to hide the transform panel unless it was activated\n    \/\/ through the context menu\n    that.trigger('hideTransformPanel');\n  };\n\n  \/**\n   * Toggle modifiers when we are not interacting with drag objects.\n   * @param {boolean} [enable]\n   *\/\n  C.prototype.toggleModifiers = function (enable) {\n    this.disabledModifiers = enable === undefined ? !this.disabledModifiers : !enable;\n  };\n\n  C.MIN_SIZE = 24;\n\n  return C;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/scripts\/drag-n-bar.js?ver=1.4.6":"\n\nH5P.DragNBar = (function (EventDispatcher) {\n  var nextInstanceIndex = 0;\n\n  \/**\n   * Constructor. Initializes the drag and drop menu bar.\n   *\n   * @class\n   * @param {Array} buttons\n   * @param {H5P.jQuery} $container\n   * @param {H5P.jQuery} $dialogContainer\n   * @param {object} [options] Collection of options\n   * @param {boolean} [options.disableEditor=false] Determines if DragNBar should be displayed in view or editor mode\n   * @param {H5P.jQuery} [options.$blurHandlers] When clicking these element(s) dnb focus will be lost\n   *\/\n  function DragNBar(buttons, $container, $dialogContainer, options) {\n    var self = this;\n\n    EventDispatcher.call(this);\n    this.overflowThreshold = 13; \/\/ How many buttons to display before we add the more button.\n    this.buttons = buttons;\n    this.$container = $container;\n    this.$dialogContainer = $dialogContainer;\n    this.dnd = new H5P.DragNDrop(this, $container);\n    this.dnd.snap = 10;\n    this.newElement = false;\n    var defaultOptions = {\n      disableEditor: false\n    };\n    options = H5P.jQuery.extend(defaultOptions, options);\n    this.isEditor = !options.disableEditor;\n    this.$blurHandlers = options.$blurHandlers ? options.$blurHandlers : undefined;\n    this.instanceIndex = nextInstanceIndex++;\n\n    \/**\n     * Keeps track of created DragNBar elements\n     * @type {Array}\n     *\/\n    this.elements = [];\n\n    \/\/ Create a popup dialog\n    this.dialog = new H5P.DragNBarDialog($dialogContainer, $container);\n\n    \/\/ Fix for forcing redraw on $container, to avoid \"artifcats\" on safari\n    this.$container.addClass('hardware-accelerated');\n\n    if (this.isEditor) {\n      this.transformButtonActive = false;\n      this.initEditor();\n      this.initClickListeners();\n\n      H5P.$window.resize(function () {\n        self.resize();\n      });\n    }\n  }\n\n  \/\/ Inherit support for events\n  DragNBar.prototype = Object.create(EventDispatcher.prototype);\n  DragNBar.prototype.constructor = DragNBar;\n\n  return DragNBar;\n})(H5P.EventDispatcher);\n\n\/**\n * Initializes editor functionality of DragNBar\n *\/\nH5P.DragNBar.prototype.initEditor = function () {\n  var that = this;\n  this.dnr = new H5P.DragNResize(this.$container);\n  this.dnr.snap = 10;\n\n  \/\/ Update coordinates when element is resized\n  this.dnr.on('moveResizing', function () {\n    var offset = that.$element.offset();\n    var position = that.$element.position();\n    that.updateCoordinates(offset.left, offset.top, position.left, position.top);\n  });\n\n  \/\/ Set pressed to not lose focus at the end of resize\n  this.dnr.on('stoppedResizing', function () {\n    that.pressed = true;\n\n    \/\/ Delete pressed after dnbelement has been refocused so it will lose focus on single click.\n    setTimeout(function () {\n      delete that.pressed;\n    }, 10);\n  });\n\n  \/**\n   * Show transform panel listeners\n   *\/\n  this.dnr.on('showTransformPanel', function () {\n    transformPanel(true);\n  });\n  this.dnd.on('showTransformPanel', function () {\n    transformPanel(true);\n  });\n\n  \/**\n   * Hide transform panel listeners\n   *\/\n  this.dnr.on('hideTransformPanel', function () {\n    if(!that.transformButtonActive) {\n      transformPanel(false);\n    }\n  });\n  this.dnd.on('hideTransformPanel', function () {\n    if(!that.transformButtonActive) {\n      transformPanel(false);\n    }\n  });\n\n  \/**\n   * Trigger a context menu transform to either show or hide\n   * the transform panel.\n   *\n   * @param {boolean} show\n   *\/\n  function transformPanel(show) {\n    if (that.focusedElement) {\n      that.focusedElement.contextMenu.trigger('contextMenuTransform', {showTransformPanel: show});\n    }\n  }\n\n  this.dnd.startMovingCallback = function () {\n    that.dnd.min = {x: 0, y: 0};\n    that.dnd.max = {\n      x: that.$container.width() - that.$element.outerWidth(),\n      y: that.$container.height() - that.$element.outerHeight()\n    };\n\n    if (that.newElement) {\n      that.dnd.adjust.x = 10;\n      that.dnd.adjust.y = 10;\n      that.dnd.min.y -= that.$list.height();\n    }\n\n    return true;\n  };\n\n  this.dnd.stopMovingCallback = function () {\n    var pos = {};\n\n    if (that.newElement) {\n      that.$container.css('overflow', '');\n      if (Math.round(parseFloat(that.$element.css('top'))) < 0) {\n        \/\/ Try to center element, but avoid overlapping\n        pos.x = (that.dnd.max.x \/ 2);\n        pos.y = (that.dnd.max.y \/ 2);\n        that.avoidOverlapping(pos, that.$element);\n      }\n    }\n\n    if (pos.x === undefined || pos.y === undefined ) {\n      pos.x = Math.round(parseFloat(that.$element.css('left')));\n      pos.y = Math.round(parseFloat(that.$element.css('top')));\n    }\n\n    that.stopMoving(pos.x, pos.y);\n    that.newElement = false;\n\n    delete that.dnd.min;\n    delete that.dnd.max;\n  };\n};\n\n\/**\n * Tries to position the given element close to the requested coordinates.\n * Element can be skipped to check if spot is available.\n *\n * @param {object} pos\n * @param {number} pos.x\n * @param {number} pos.y\n * @param {(H5P.jQuery|Object)} element object with width&height if ran before insertion.\n *\/\nH5P.DragNBar.prototype.avoidOverlapping = function (pos, $element) {\n  \/\/ Determine size of element\n  var size = $element;\n  if (size instanceof H5P.jQuery) {\n    size = window.getComputedStyle(size[0]);\n    size = {\n      width: parseFloat(size.width),\n      height: parseFloat(size.height)\n    };\n  }\n  else {\n    $element = undefined;\n  }\n\n  \/\/ Determine how much they can be manuvered\n  var containerStyle = window.getComputedStyle(this.$container[0]);\n  var manX = parseFloat(containerStyle.width) - size.width;\n  var manY = parseFloat(containerStyle.height) - size.height;\n\n  var limit = 16;\n  var attempts = 0;\n\n  while (attempts < limit && this.elementOverlaps(pos.x, pos.y, $element)) {\n    \/\/ Try to place randomly inside container\n    if (manX > 0) {\n      pos.x = Math.floor(Math.random() * manX);\n    }\n    if (manY > 0) {\n      pos.y = Math.floor(Math.random() * manY);\n    }\n    attempts++;\n  }\n};\n\n\/**\n * Determine if moving the given element to its new position will cause it to\n * cover another element. This can make new or pasted elements difficult to see.\n * Element can be skipped to check if spot is available.\n *\n * @param {number} x\n * @param {number} y\n * @param {H5P.jQuery} [$element]\n * @returns {boolean}\n *\/\nH5P.DragNBar.prototype.elementOverlaps = function (x, y, $element) {\n  var self = this;\n\n  \/\/ Use snap grid\n  x = Math.round(x \/ 10);\n  y = Math.round(y \/ 10);\n\n  for (var i = 0; i < self.elements.length; i++) {\n    var element = self.elements[i];\n    if ($element !== undefined && element.$element === $element) {\n      continue;\n    }\n\n    if (x === Math.round(parseFloat(element.$element.css('left')) \/ 10) &&\n        y === Math.round(parseFloat(element.$element.css('top')) \/ 10)) {\n      return true; \/\/ Stop loop\n    }\n  }\n\n  return false;\n};\n\n\/\/ Key coordinates\nvar SHIFT = 16;\nvar CTRL = 17;\nvar DELETE = 46;\nvar BACKSPACE = 8;\nvar C = 67;\nvar V = 86;\nvar LEFT = 37;\nvar UP = 38;\nvar RIGHT = 39;\nvar DOWN = 40;\n\n\/\/ Keep track of key state\nvar ctrlDown = false;\n\n\/\/ How many pixels to move\nvar snapAmount = 1;\n\n\/**\n * Handle keydown events for the entire frame\n *\/\nH5P.DragNBar.keydownHandler = function (event) {\n  var self = event.data.instance;\n  var activeElement = document.activeElement;\n\n  if (event.which === CTRL) {\n    ctrlDown = true;\n\n    if (self.dnd.snap !== undefined) {\n      \/\/ Disable snapping\n      delete self.dnd.snap;\n    }\n  }\n\n  if (event.which === SHIFT) {\n    snapAmount = self.dnd.snap;\n  }\n\n  if (event.which === LEFT && self.focusedElement) {\n    if (activeElement.contentEditable === 'true' || activeElement.value !== undefined) {\n      return;\n    }\n    event.preventDefault();\n    self.moveWithKeys(-snapAmount, 0);\n  }\n  else if (event.which === UP && self.focusedElement) {\n    if (activeElement.contentEditable === 'true' || activeElement.value !== undefined) {\n      return;\n    }\n    event.preventDefault();\n    self.moveWithKeys(0, -snapAmount);\n  }\n  else if (event.which === RIGHT && self.focusedElement) {\n    if (activeElement.contentEditable === 'true' || activeElement.value !== undefined) {\n      return;\n    }\n    event.preventDefault();\n    self.moveWithKeys(snapAmount, 0);\n  }\n  else if (event.which === DOWN && self.focusedElement) {\n    if (activeElement.contentEditable === 'true' || activeElement.value !== undefined) {\n      return;\n    }\n    event.preventDefault();\n    self.moveWithKeys(0, snapAmount);\n  }\n  else if (event.which === C && ctrlDown && self.focusedElement && self.$container.is(':visible')) {\n    \/\/ Copy element params to clipboard\n    var elementSize = window.getComputedStyle(self.focusedElement.$element[0]);\n    var width = parseFloat(elementSize.width);\n    var height = parseFloat(elementSize.height) \/ width;\n    width = width \/ (parseFloat(window.getComputedStyle(self.$container[0]).width) \/ 100);\n    height *= width;\n\n    self.focusedElement.toClipboard(width, height);\n  }\n  else if (event.which === V && ctrlDown && window.localStorage && self.$container.is(':visible')) {\n    if (self.preventPaste || self.dialog.isOpen() || activeElement.contentEditable === 'true' || activeElement.value !== undefined) {\n      \/\/ Don't allow paste if dialog is open or active element can be modified\n      return;\n    }\n\n    var clipboardData = localStorage.getItem('h5pClipboard');\n    if (clipboardData) {\n      \/\/ Parse\n      try {\n        clipboardData = JSON.parse(clipboardData);\n      }\n      catch (err) {\n        console.error('Unable to parse JSON from clipboard.', err);\n        return;\n      }\n\n      \/\/ Update file URLs\n      H5P.DragNBar.updateFileUrls(clipboardData.specific, function (path) {\n        var isTmpFile = (path.substr(-4,4) === '#tmp');\n        if (!isTmpFile && clipboardData.contentId) {\n          \/\/ Comes from existing content\n\n          if (H5PEditor.contentId) {\n            \/\/ .. to existing content\n            return '..\/' + clipboardData.contentId + '\/' + path;\n          }\n          else {\n            \/\/ .. to new content\n            return (H5PEditor.contentRelUrl ? H5PEditor.contentRelUrl : '..\/content\/') + clipboardData.contentId + '\/' + path;\n          }\n        }\n        return path; \/\/ Will automatically be looked for in tmp folder\n      });\n\n      if (clipboardData.generic) {\n        \/\/ Use reference instead of key\n        clipboardData.generic = clipboardData.specific[clipboardData.generic];\n\n        \/\/ Avoid multiple content with same ID\n        delete clipboardData.generic.subContentId;\n      }\n\n      self.trigger('paste', clipboardData);\n    }\n  }\n  else if ((event.which === DELETE || event.which === BACKSPACE) && self.focusedElement && self.$container.is(':visible') && activeElement.tagName.toLowerCase() !== 'input') {\n    if (self.pressed === undefined) {\n      self.focusedElement.contextMenu.trigger('contextMenuRemove');\n      event.preventDefault(); \/\/ Prevent browser navigating back\n    }\n  }\n};\n\n\/**\n * Handle keypress events for the entire frame\n *\/\nH5P.DragNBar.keypressHandler = function (event) {\n  var self = event.data.instance;\n  if (event.which === BACKSPACE && self.focusedElement && self.$container.is(':visible') && document.activeElement.tagName.toLowerCase() !== 'input') {\n    event.preventDefault(); \/\/ Prevent browser navigating back\n  }\n};\n\n\/**\n * Handle keyup events for the entire frame\n *\/\nH5P.DragNBar.keyupHandler = function (event) {\n  var self = event.data.instance;\n\n  if (event.which === CTRL) {\n    \/\/ Update key state\n    ctrlDown = false;\n\n    \/\/ Enable snapping\n    self.dnd.snap = 10;\n  }\n  if (event.which === SHIFT) {\n    snapAmount = 1;\n  }\n\n  if (self.focusedElement && (event.which === LEFT || event.which === UP || event.which === RIGHT || event.which === DOWN)) {\n    \/\/ Store position of element after moving\n    var position = self.getElementSizeNPosition();\n    self.stopMoving(Math.round(position.left), Math.round(position.top));\n  }\n};\n\n\/**\n * Handle click events for the entire frame\n *\/\nH5P.DragNBar.clickHandler = function (event) {\n  var self = event.data.instance;\n\n  \/\/ Remove pressed on click\n  delete self.pressed;\n};\n\n\/**\n * Initialize click listeners\n *\/\nH5P.DragNBar.prototype.initClickListeners = function () {\n  var self = this;\n  var index = self.instanceIndex;\n\n  \/\/ Register event listeners\n  var eventData = {\n    instance: self\n  };\n  H5P.$body.on('keydown.dnb' + index, eventData, H5P.DragNBar.keydownHandler)\n           .on('keypress.dnb' + index, eventData, H5P.DragNBar.keypressHandler)\n           .on('keyup.dnb' + index, eventData, H5P.DragNBar.keyupHandler)\n           .on('click.dnb' + index,eventData, H5P.DragNBar.clickHandler);\n\n  \/\/ Set blur handler element if option has been specified\n  var $blurHandlers = this.$container;\n  if (this.$blurHandlers) {\n    $blurHandlers = this.$blurHandlers;\n  }\n\n  function handleBlur() {\n    \/\/ Remove coordinates picker if we didn't press an element.\n    if (self.pressed !== undefined) {\n      delete self.pressed;\n    }\n    else {\n      self.blurAll();\n      if (self.focusedElement !== undefined) {\n        delete self.focusedElement;\n      }\n    }\n  }\n\n  $blurHandlers\n    .keydown(function (e) {\n      if (e.which === 9) { \/\/ pressed tab\n        handleBlur();\n      }\n    })\n    .click(handleBlur);\n};\n\n\/**\n * Update file URLs. Useful when copying between different contents.\n *\n * @param {object} params Reference\n * @param {function} handler Modifies the path to work when pasted\n *\/\nH5P.DragNBar.updateFileUrls = function (params, handler) {\n  for (var prop in params) {\n    if (params.hasOwnProperty(prop) && params[prop] instanceof Object) {\n      var obj = params[prop];\n      if (obj.path !== undefined && obj.mime !== undefined) {\n        obj.path = handler(obj.path);\n      }\n      else {\n        H5P.DragNBar.updateFileUrls(obj, handler);\n      }\n    }\n  }\n};\n\n\/**\n * Attaches the menu bar to the given wrapper.\n *\n * @param {jQuery} $wrapper\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.attach = function ($wrapper) {\n  $wrapper.html('');\n  $wrapper.addClass('h5peditor-dragnbar');\n\n  var $list = H5P.jQuery('<ul class=\"h5p-dragnbar-ul\"><\/ul>').appendTo($wrapper);\n  this.$list = $list;\n\n  for (var i = 0; i < this.buttons.length; i++) {\n    var button = this.buttons[i];\n\n    if (i === this.overflowThreshold) {\n      $list = H5P.jQuery('<li class=\"h5p-dragnbar-li\"><a href=\"#\" title=\"' + 'More elements' + '\" class=\"h5p-dragnbar-a h5p-dragnbar-more-button\"><\/a><ul class=\"h5p-dragnbar-li-ul\"><\/ul><\/li>')\n        .appendTo($list)\n        .click(function () {\n          return false;\n        })\n        .hover(function () {\n          $list.stop().slideToggle(300);\n        }, function () {\n          $list.stop().slideToggle(300);\n        })\n        .children(':first')\n        .next();\n    }\n\n    this.addButton(button, $list);\n  }\n\n  this.containTooltips();\n};\n\n\/**\n * Add button.\n *\n * @param {type} button\n * @param {Function} button.createElement Function for creating element\n * @param {type} $list\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.addButton = function (button, $list) {\n  var that = this;\n\n  var $button = ns.$(\n    '<li class=\"h5p-dragnbar-li\" data-label=\"Image\">' +\n      '<a href=\"#\" class=\"h5p-dragnbar-a h5p-dragnbar-' + button.id + '-button\" aria-label=\"' + button.title + '\"><\/a>' +\n    '<\/li>'\n  ).appendTo($list);\n\n  ns.$('<span\/>', {\n    'class': 'h5p-dragnbar-tooltip',\n    'text': button.title\n  }).appendTo($button);\n\n  $button\n    .hover(function() {\n      that.containTooltips();\n    })\n    .children()\n    .click(function () {\n      return false;\n    }).mousedown(function (event) {\n      if (event.which !== 1) {\n        return;\n      }\n      that.newElement = true;\n      that.pressed = true;\n      var createdElement = button.createElement();\n      that.$element = createdElement;\n      that.$container.css('overflow', 'visible');\n      that.dnd.press(that.$element, event.pageX, event.pageY);\n      that.focus(that.$element);\n    });\n};\n\n\/**\n * Contain tooltips.\n *\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.containTooltips = function () {\n  var that = this;\n\n  var containerWidth = that.$container.outerWidth();\n\n  this.$list.find('.h5p-dragnbar-tooltip').each(function() {\n    \/\/ Get correct offset even if element is a child\n    var width = ns.$(this).outerWidth();\n    var parentWidth = ns.$(this).parents('.h5p-dragnbar-li').last().outerWidth();\n\n    \/\/ Center the tooltip\n    ns.$(this).css('left', -(width \/ 2) + (parentWidth \/ 2) + 'px');\n\n    var offsetLeft = ns.$(this).position().left += ns.$(this).parents('.h5p-dragnbar-li').last().position().left;\n\n    \/\/ If outside left edge\n    if (offsetLeft <= 0) {\n      ns.$(this).css('left', 0);\n    }\n\n    \/\/ If outside right edge\n    if (offsetLeft + width > containerWidth) {\n      ns.$(this).css('left', -(width - parentWidth));\n    }\n  });\n};\n\n\/**\n * Change container.\n *\n * @param {jQuery} $container\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.setContainer = function ($container) {\n  this.$container = $container;\n  if (this.dnd) {\n    this.dnd.$container = $container;\n  }\n  if (this.dnr) {\n    this.dnr.$container = $container;\n  }\n};\n\n\/**\n * Handler for when the dragging stops. Makes sure the element is inside its container.\n *\n * @param {Number} left\n * @param {Number} top\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.stopMoving = function (left, top) {\n  \/\/ Calculate percentage\n  top = top \/ (this.$container.height() \/ 100);\n  left = left \/ (this.$container.width() \/ 100);\n  this.$element.css({top: top + '%', left: left + '%'});\n\n  \/\/ Give others the result\n  if (this.stopMovingCallback !== undefined) {\n    this.stopMovingCallback(left, top);\n  }\n};\n\n\/**\n * @typedef SizeNPosition\n * @type Object\n * @property {number} width Outer width of the element\n * @property {number} height Outer height of the element\n * @property {number} left The X Coordinate\n * @property {number} top The Y Coordinate\n * @property {number} containerWidth Inner width of the container\n * @property {number} containerHeight Inner height of the container\n *\/\n\n\/**\n *\n * Only works when element is inside this.$container. This is assumed and no\n * are done.\n *\n * @param {H5P.jQuery} [$element] Defaults to focused element.\n * @throws 'No element given' if $element is missing\n * @return {SizeNPosition}\n *\/\nH5P.DragNBar.prototype.getElementSizeNPosition = function ($element) {\n  $element = $element || this.focusedElement.$element;\n  if (!$element || !$element.length) {\n    throw 'No element given';\n  }\n\n  \/\/ Always use outer size for element\n  var size = $element[0].getBoundingClientRect();\n\n  \/\/ Always use position relative to container for element\n  var position = window.getComputedStyle($element[0]);\n\n  \/\/ We include container inner size as well\n  var containerSize = window.getComputedStyle(this.$container[0]);\n\n  \/\/ Start preparing return value\n  var sizeNPosition = {\n    width: parseFloat(size.width),\n    height: parseFloat(size.height),\n    left: parseFloat(position.left),\n    top: parseFloat(position.top),\n    containerWidth: parseFloat(containerSize.width),\n    containerHeight: parseFloat(containerSize.height)\n  };\n\n  if (position.left.substr(-1, 1) === '%' || position.top.substr(-1, 1) === '%') {\n    \/\/ Some browsers(Safari) gets percentage value instead of pixel value.\n    \/\/ Container inner size must be used to calculate such values.\n    sizeNPosition.left *= (sizeNPosition.containerWidth \/ 100);\n    sizeNPosition.top *= (sizeNPosition.containerHeight \/ 100);\n  }\n\n  return sizeNPosition;\n};\n\n\/**\n * Makes it possible to move dnb elements by adding to it's x and y\n *\n * @param {number} x Amount to move on x-axis.\n * @param {number} y Amount to move on y-axis.\n *\/\nH5P.DragNBar.prototype.moveWithKeys = function (x, y) {\n\n  \/**\n   * Ensure that the given value is within the given boundaries.\n   *\n   * @private\n   * @param {number} value\n   * @param {number} min\n   * @param {number} max\n   * @return {number}\n   *\/\n  var withinBoundaries = function (value, min, max) {\n    if (value < min) {\n      value = min;\n    }\n    if (value > max) {\n      value = max;\n    }\n\n    return value;\n  };\n\n  \/\/ Get size and position of current elemet in focus\n  var sizeNPosition = this.getElementSizeNPosition();\n\n  \/\/ Change position\n  sizeNPosition.left += x;\n  sizeNPosition.top += y;\n\n  \/\/ Check that values are within boundaries\n  sizeNPosition.left = withinBoundaries(sizeNPosition.left, 0, sizeNPosition.containerWidth - sizeNPosition.width);\n  sizeNPosition.top = withinBoundaries(sizeNPosition.top, 0, sizeNPosition.containerHeight - sizeNPosition.height);\n\n  \/\/ Determine new position style\n  this.$element.css({\n    left: sizeNPosition.left + 'px',\n    top: sizeNPosition.top + 'px',\n  });\n\n  this.dnd.trigger('showTransformPanel');\n\n  \/\/ Update position of context menu\n  this.updateCoordinates(sizeNPosition.left, sizeNPosition.top, sizeNPosition.left, sizeNPosition.top);\n};\n\n\/**\n * Makes it possible to focus and move the element around.\n * Must be inside $container.\n *\n * @param {H5P.jQuery} $element\n * @param {Object} [options]\n * @param {H5P.DragNBarElement} [options.dnbElement] Register new element with dnbelement\n * @param {boolean} [options.disableResize] Resize disabled\n * @param {boolean} [options.lock] Lock ratio during resize\n * @param {string} [clipboardData]\n * @returns {H5P.DragNBarElement} Reference to added dnbelement\n *\/\nH5P.DragNBar.prototype.add = function ($element, clipboardData, options) {\n  var self = this;\n  options = options || {};\n  if (this.isEditor && !options.disableResize) {\n    this.dnr.add($element, options);\n  }\n  var newElement = null;\n\n  \/\/ Check if element already exist\n  if (options.dnbElement) {\n    \/\/ Set element as added element\n    options.dnbElement.setElement($element);\n    newElement = options.dnbElement;\n  }\n  else {\n    options.element = $element;\n    newElement = new H5P.DragNBarElement(this, clipboardData, options);\n    this.elements.push(newElement);\n  }\n\n  $element.addClass('h5p-dragnbar-element');\n\n  if (this.isEditor) {\n    if ($element.attr('tabindex') === undefined) {\n      \/\/ Make it possible to tab between elements.\n      $element.attr('tabindex', '0');\n    }\n\n    $element.mousedown(function (event) {\n      if (event.which !== 1) {\n        return;\n      }\n\n      self.pressed = true;\n      self.focus($element);\n      if (self.dnr.active !== true) { \/\/ Moving can be stopped if the mousedown is doing something else\n        self.dnd.press($element, event.pageX, event.pageY);\n      }\n    });\n  }\n\n  $element.focus(function () {\n    self.focus($element);\n  });\n\n  return newElement;\n};\n\n\/**\n * Remove given element in the UI.\n *\n * @param {H5P.DragNBarElement} dnbElement\n *\/\nH5P.DragNBar.prototype.removeElement = function (dnbElement) {\n  dnbElement.removeElement();\n};\n\n\/**\n * Select the given element in the UI.\n *\n * @param {jQuery} $element\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.focus = function ($element) {\n  var self = this;\n\n  \/\/ Blur last focused\n  if (this.focusedElement && this.focusedElement.$element !== $element) {\n    this.focusedElement.blur();\n    this.focusedElement.hideContextMenu();\n  }\n\n  if (!$element.is(':visible')) {\n    return; \/\/ Do not focus invisible items (fixes FF refocus issue)\n  }\n\n  \/\/ Keep track of the element we have in focus\n  self.$element = $element;\n  this.dnd.setElement($element);\n\n  \/\/ Show and update coordinates picker\n  this.focusedElement = this.getDragNBarElement($element);\n\n  if (this.focusedElement) {\n    this.focusedElement.showContextMenu();\n    this.focusedElement.focus();\n    self.updateCoordinates();\n  }\n\n  \/\/ Wait for potential recreation of element\n  setTimeout(function () {\n    self.updateCoordinates();\n    if (self.focusedElement && self.focusedElement.contextMenu && self.focusedElement.contextMenu.canResize) {\n      self.focusedElement.contextMenu.updateDimensions();\n    }\n  }, 0);\n};\n\n\/**\n * Get dnbElement from $element\n * @param {jQuery} $element\n * @returns {H5P.DragNBarElement} dnbElement with matching $element\n *\/\nH5P.DragNBar.prototype.getDragNBarElement = function ($element) {\n  var foundElement;\n  \/\/ Find object with matching element\n  this.elements.forEach(function (element) {\n    if (element.getElement().is($element)) {\n      foundElement = element;\n    }\n  });\n  return foundElement;\n};\n\n\/**\n * Deselect all elements in the UI.\n *\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.blurAll = function () {\n  this.elements.forEach(function (element) {\n    element.blur();\n  });\n  delete this.focusedElement;\n};\n\n\/**\n * Resize DnB, make sure context menu is positioned correctly.\n *\/\nH5P.DragNBar.prototype.resize = function () {\n  var self = this;\n  this.updateCoordinates();\n\n  if (self.focusedElement) {\n    self.focusedElement.resizeContextMenu(self.$element.offset().left - self.$element.parent().offset().left);\n  }\n};\n\n\/**\n * Update the coordinates of context menu.\n *\n * @param {Number} [left]\n * @param {Number} [top]\n * @param {Number} [x]\n * @param {Number} [y]\n * @returns {undefined}\n *\/\nH5P.DragNBar.prototype.updateCoordinates = function (left, top, x, y) {\n  if (!this.focusedElement) {\n    return;\n  }\n\n  var containerPosition = this.$container.position();\n\n  if (left && top && x && y) {\n    left = x + containerPosition.left;\n    top = y + containerPosition.top;\n    this.focusedElement.updateCoordinates(left, top, x, y);\n  }\n  else {\n    var position = this.$element.position();\n    this.focusedElement.updateCoordinates(position.left + containerPosition.left, position.top + containerPosition.top, position.left, position.top);\n  }\n};\n\n\/**\n * Creates element data to store in the clipboard.\n *\n * @param {string} from Source of the element\n * @param {object} params Element options\n * @param {string} [generic] Which part of the parameters can be used by other libraries\n * @returns {string} JSON\n *\/\nH5P.DragNBar.clipboardify = function (from, params, generic) {\n  var clipboardData = {\n    from: from,\n    specific: params\n  };\n\n  if (H5PEditor.contentId) {\n    clipboardData.contentId = H5PEditor.contentId;\n  }\n\n  \/\/ Add the generic part\n  if (params[generic]) {\n    clipboardData.generic = generic;\n  }\n\n  return clipboardData;\n};\n\n\/**\n * Make sure the given element is inside the container.\n *\n * @param {SizeNPosition} sizeNPosition For the element\n * @returns {SizeNPosition} Only the properties which require change\n *\/\nH5P.DragNBar.fitElementInside = function (sizeNPosition) {\n  var style = {};\n\n  if (sizeNPosition.left < 0) {\n    \/\/ Element sticks out of the left side\n    style.left = sizeNPosition.left = 0;\n  }\n\n  if (sizeNPosition.width + sizeNPosition.left > sizeNPosition.containerWidth) {\n    \/\/ Element sticks out of the right side\n    style.left = sizeNPosition.containerWidth - sizeNPosition.width;\n    if (style.left < 0) {\n      \/\/ Element is wider than the container\n      style.left = 0;\n      style.width = sizeNPosition.containerWidth;\n    }\n  }\n\n  if (sizeNPosition.top < 0) {\n    \/\/ Element sticks out of the top side\n    style.top = sizeNPosition.top = 0;\n  }\n\n  if (sizeNPosition.height + sizeNPosition.top > sizeNPosition.containerHeight) {\n    \/\/ Element sticks out of the bottom side\n    style.top = sizeNPosition.containerHeight - sizeNPosition.height;\n    if (style.top < 0) {\n      \/\/ Element is higher than the container\n      style.top = 0;\n      style.height = sizeNPosition.containerHeight;\n    }\n  }\n\n  return style;\n};\n\n\/**\n * Clean up any event listeners\n *\/\nH5P.DragNBar.prototype.remove = function () {\n  var index = this.instanceIndex;\n\n  H5P.$body.off('keydown.dnb' + index, H5P.DragNBar.keydownHandler)\n           .off('keypress.dnb' + index, H5P.DragNBar.keypressHandler)\n           .off('keyup.dnb' + index, H5P.DragNBar.keyupHandler)\n           .off('click.dnb' + index, H5P.DragNBar.clickHandler);\n};\n\nif (window.H5PEditor) {\n  \/\/ Add translations\n  H5PEditor.language['H5P.DragNBar'] = {\n    libraryStrings: {\n      transformLabel: 'Transform',\n      editLabel: 'Edit',\n      removeLabel: 'Remove',\n      bringToFrontLabel: 'Bring to Front',\n      sendToBackLabel: 'Send to Back',\n      unableToPaste: 'Cannot paste this object. Unfortunately, the object you are trying to paste is not supported by this content type or version.',\n      sizeLabel: 'Size',\n      positionLabel: 'Position',\n      heightLabel: 'Height',\n      widthLabel: 'Width'\n    }\n  };\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/scripts\/context-menu.js?ver=1.4.6":"\n\/*global H5P*\/\n\n\/**\n * Create context menu\n *\/\nH5P.DragNBarContextMenu = (function ($, EventDispatcher) {\n\n  \/**\n   * Constructor for context menu\n   * @class\n   * @param {jQuery} $container Parent container\n   * @param {H5P.DragNBarElement} DragNBarElement\n   * @param {boolean} [hasCoordinates] Decides if coordinates will be displayed\n   * @param {boolean} [disableResize] No input for dimensions\n   *\/\n  function ContextMenu($container, DragNBarElement, hasCoordinates, disableResize) {\n    var self = this;\n    EventDispatcher.call(this);\n\n    \/**\n     * Keeps track of DragNBar object\n     *\n     * @type {H5P.DragNBar}\n     *\/\n    this.dnb = DragNBarElement.dnb;\n\n    \/**\n     * Keeps track of DnBElement object\n     *\n     * @type {H5P.DragNBarElement}\n     *\/\n    this.dnbElement = DragNBarElement;\n\n    \/**\n     * Keeps track of context menu container\n     *\n     * @type {H5P.jQuery}\n     *\/\n    this.$contextMenu = $('<div>', {\n      'class': 'h5p-dragnbar-context-menu'\n    });\n\n    \/**\n     * Keeps track of buttons container\n     *\n     * @type {H5P.jQuery}\n     *\/\n    this.$buttons = $('<div>', {\n      'class': 'h5p-context-menu-buttons'\n    });\n\n    \/**\n     * Keeps track of transform panel\n     *\n     * @type {H5P.jQuery}\n     *\/\n    this.$transformPanel = $('<div>', {\n      'class': 'h5p-transform-panel hide'\n    });\n\n    \/**\n     * Keeps track of context menu parent\n     *\n     * @type {jQuery}\n     *\/\n    this.$parent = $container;\n\n    \/**\n     * Keeps track of whether the context menu should display coordinates\n     * @type {Boolean}\n     *\/\n    this.hasCoordinates = (hasCoordinates !== undefined ? hasCoordinates : true);\n\n    \/**\n     * Determines if the dimensions can be changed.\n     * @type {boolean}\n     *\/\n    this.canResize = !disableResize;\n\n    \/**\n     * Determines if the transform panel is showing.\n     * @type {boolean}\n     *\/\n    this.showingTransformPanel = false;\n\n    \/**\n     * Button containing button name and event name that will be fired.\n     * @typedef {Object} ContextMenuButton\n     * @property {String} name Machine readable\n     * @property {String} label Human readable\n     *\/\n\n    \/**\n     * Keeps track of button objects\n     * @type {ContextMenuButton[]}\n     *\/\n    this.buttons = [\n      {name: 'Edit', label: H5PEditor.t('H5P.DragNBar', 'editLabel')},\n      {name: 'BringToFront', label: H5PEditor.t('H5P.DragNBar', 'bringToFrontLabel')},\n      {name: 'SendToBack', label: H5PEditor.t('H5P.DragNBar', 'sendToBackLabel')},\n      {name: 'Remove', label: H5PEditor.t('H5P.DragNBar', 'removeLabel')}\n    ];\n\n    \/**\n     * Register transform listener\n     *\n     * @param {event} [e] event\n     * @param {Object} [e.data] event data\n     * @param {Boolean} [e.data.showTransformPanel] Show transform panel\n     *\/\n    self.on('contextMenuTransform', function (e) {\n      if (e && e.data.showTransformPanel) {\n        \/\/ Use event data\n        self.showingTransformPanel = e.data.showTransformPanel;\n      }\n      else {\n        \/\/ Toggle showing panel\n        self.showingTransformPanel = !self.showingTransformPanel;\n      }\n\n      \/\/ Toggle sticky transform panel\n      if (e.data.button === 'Transform') {\n        if (self.dnb.transformButtonActive) {\n          self.dnb.transformButtonActive = false;\n        }\n        else {\n          self.dnb.transformButtonActive = true;\n        }\n      }\n\n      \/\/ Remove sticky transform panel when focus is lost\n      if (e.data.showTransformPanel == false) {\n        self.dnb.transformButtonActive = false;\n      }\n\n      \/\/ Toggle buttons bar and transform panel\n      self.toggleButtonsBar(!self.showingTransformPanel);\n      self.toggleTransformPanel(self.showingTransformPanel);\n      self.$transformButtonWrapper.toggleClass('active', self.showingTransformPanel);\n\n      \/\/ Realign context menu\n      self.dnb.updateCoordinates();\n    });\n\n    this.updateContextMenu();\n  }\n\n  \/\/ Inherit event dispatcher\n  ContextMenu.prototype = Object.create(EventDispatcher.prototype);\n  ContextMenu.prototype.constructor = ContextMenu;\n\n  \/**\n   * Create coordinates in context menu\n   *\/\n  ContextMenu.prototype.addCoordinates = function () {\n    \/\/ Coordinates disabled or exists\n    if (!this.hasCoordinates || this.$coordinates) {\n      return;\n    }\n\n    var self = this;\n\n    \/\/ Add coordinates picker\n    this.$coordinates = $(\n      '<div class=\"h5p-dragnbar-coordinates\">' +\n        '<div class=\"h5p-dragnbar-label\">' + H5PEditor.t('H5P.DragNBar', 'positionLabel') + '<\/div>' +\n        '<div class=\"h5p-dragnbar-x-container\" aria-label=\"X position\">' +\n          '<input class=\"h5p-dragnbar-x\" type=\"text\" value=\"0\">' +\n        '<\/div>' +\n        '<span class=\"h5p-dragnbar-coordinates-separater\">,<\/span>' +\n        '<div class=\"h5p-dragnbar-y-container\" aria-label=\"Y position\">' +\n          '<input class=\"h5p-dragnbar-y\" type=\"text\" value=\"0\">' +\n        '<\/div>' +\n      '<\/div>'\n    ).mousedown(function () {\n      self.dnb.pressed = true;\n    }).appendTo(this.$transformPanel);\n\n    this.$x = this.$coordinates.find('.h5p-dragnbar-x');\n    this.$y = this.$coordinates.find('.h5p-dragnbar-y');\n\n    this.$x.add(this.$y).on('change keydown', function(event) {\n      if (event.type === 'change' || event.which === 13) {\n\n        \/\/ Get input\n        var x = Number(self.$x.val());\n        var y = Number(self.$y.val());\n\n        if (!isNaN(x) && !isNaN(y)) {\n\n          \/\/ Do not move outside of container\n          var min = {x: 0 , y: 0};\n          var max = {\n            x: self.dnb.$container.width() - self.dnbElement.getElement().outerWidth(),\n            y: self.dnb.$container.height() - self.dnbElement.getElement().outerHeight()\n          };\n\n          \/\/ Check min values\n          if (x < 0) {\n            x = min.x;\n          }\n          if (y < 0) {\n            y = min.y;\n          }\n\n          \/\/ Check max values\n          if (x > max.x) {\n            x = max.x;\n          }\n          if (y > max.y) {\n            y = max.y;\n          }\n\n          \/\/ Update and store location\n          self.dnb.stopMoving(x, y);\n\n          if (event.which === 13) {\n            \/\/ Pressed enter, mark number for easy edit\n            setTimeout(function () {\n              event.target.focus();\n              event.target.setSelectionRange(0, event.target.value.length);\n            }, 0);\n          }\n\n          \/\/ Update context menu position\n          self.dnb.updateCoordinates();\n        }\n      }\n    }).click(function (event) {\n      \/\/ Select coordinates numbers for easy edit\n      event.target.focus();\n      event.target.setSelectionRange(0, event.target.value.length);\n    });\n  };\n\n  \/**\n   * Update the coordinates picker.\n   *\n   * @param {Number} left Left pos of context menu\n   * @param {Number} top Top pos of context menu\n   * @param {Number} x X value in coordinates\n   * @param {Number} y Y value in coordinates\n   *\/\n  ContextMenu.prototype.updateCoordinates = function (left, top, x, y) {\n    \/\/ Move it\n    this.$contextMenu.css({\n      left: left,\n      top: top\n    });\n\n    \/\/ Set pos\n    if (this.hasCoordinates) {\n      this.$x.val(Math.round(x));\n      this.$y.val(Math.round(y));\n    }\n  };\n\n  \/**\n   * Create coordinates in context menu\n   *\/\n  ContextMenu.prototype.addDimensions = function () {\n    var self = this;\n\n    self.$dimensions = $('<div\/>', {\n      'class': 'h5p-dragnbar-dimensions'\n    });\n\n    \/\/ Add label\n    $('<div\/>', {\n      'class': 'h5p-dragnbar-label',\n      appendTo: self.$dimensions,\n      text: H5PEditor.t('H5P.DragNBar', 'sizeLabel')\n    });\n\n    var updateDimensions = function (type) {\n      var target = parseFloat(this.value);\n      if (isNaN(target)) {\n        return;\n      }\n\n      \/\/ Get element\n      var $element = self.dnbElement.getElement();\n\n      \/\/ Determine min&max values\n      var min = H5P.DragNResize.MIN_SIZE;\n      var containerSize = parseFloat(window.getComputedStyle(self.dnb.$container[0])[type]);\n      var elementStyle = window.getComputedStyle($element[0]);\n      var max = containerSize - parseFloat(elementStyle[type === 'width' ? 'left' : 'top']);\n\n      if (target < min) {\n        target = min;\n      }\n      if (target > max) {\n        target = max;\n      }\n\n      \/\/ Set input field value\n      self['$' + type].val(Math.round(target));\n\n      \/\/ Remove any height padding before updating element\n      var padding = $element[0].getBoundingClientRect()[type] - parseFloat(elementStyle[type]);\n      target -= padding;\n\n      $element.css(type, (target \/ (containerSize \/ 100)) + '%');\n\n      var eventData = {};\n      eventData[type] = target \/ self.dnb.dnr.containerEm;\n      self.dnb.dnr.trigger('stoppedResizing', eventData);\n    };\n\n    \/\/ Add input for width\n    self.$width = self.getNewInput('width', H5PEditor.t('H5P.DragNBar', 'widthLabel'), self.$dimensions, updateDimensions);\n\n    $('<span\/>', {\n      'class': 'h5p-dragnbar-dimensions-separator',\n      text: '\u00d7',\n      appendTo: self.$dimensions\n    });\n\n    self.$height = self.getNewInput('height', H5PEditor.t('H5P.DragNBar', 'heightLabel'), self.$dimensions, updateDimensions);\n\n    self.dnb.dnr.on('moveResizing', function () {\n      self.updateDimensions();\n    });\n\n    self.$dimensions.appendTo(self.$transformPanel);\n  };\n\n  \/**\n   * Add transform functionality\n   *\n   * @param [enableTransform]\n   *\/\n  ContextMenu.prototype.addTransform = function (enableTransform) {\n    var self = this;\n    var transformButtonObject = {name: 'Transform', label: H5PEditor.t('H5P.DragNBar', 'transformLabel')};\n    var $transformButtonWrapper = $('<div>', {\n      'class': 'h5p-transform-button-wrapper'\n    });\n\n    \/\/ Attach button\n    if (enableTransform) {\n      self.createButton(transformButtonObject)\n        .appendTo($transformButtonWrapper);\n    }\n\n    self.$transformButtonWrapper = $transformButtonWrapper;\n    return $transformButtonWrapper;\n  };\n\n  \/**\n   * Updates the values in the input fields for width and height.\n   *\/\n  ContextMenu.prototype.updateDimensions = function () {\n    var self = this;\n    var $element = self.dnbElement.getElement();\n    var elementSize = window.getComputedStyle($element[0]);\n    self.$width.val(Math.round(parseFloat(elementSize.width)));\n    self.$height.val(Math.round(parseFloat(elementSize.height)));\n  };\n\n  \/**\n   * Creates a new input field for modifying an element property.\n   *\n   * @param {string} type\n   * @param {string} label\n   * @param {H5P.jQuery} $container\n   * @param {function} handler\n   * @returns {H5P.jQuery}\n   *\/\n  ContextMenu.prototype.getNewInput = function (type, label, $container, handler) {\n    \/\/ Wrap input element with label (implicit labeling)\n    var $wrapper = $('<div\/>', {\n      'class': 'h5p-dragnbar-input h5p-dragnbar-' + type,\n      'aria-label': label,\n      appendTo: $container\n    });\n\n    \/\/ Create input field\n    var $input = $('<input\/>', {\n      maxLength: 5,\n      on: {\n        change: function () {\n          handler.call(this, type);\n        },\n        keydown: function (event) {\n          if (event.which === 13) { \/\/ Enter key\n            handler.call(this, type);\n            $input.focus().select();\n          }\n          else if (event.which === 38 || event.which === 40) { \/\/ Up key\n            \/\/ Increase or decrease the number by using the arrows keys\n            var currentValue = parseFloat($input.val());\n            if (!isNaN(currentValue)) {\n              $input.val(currentValue + (event.which === 38 ? 1 : -1));\n              handler.call(this, type);\n            }\n          }\n        },\n        keyup: function (event) {\n          if (event.which === 38 || event.which === 40) { \/\/ Up or Down key\n            $input.select(); \/\/ Select again\n          }\n        },\n        click: function () {\n          $input.select();\n        }\n      },\n      appendTo: $wrapper\n    });\n    return $input;\n  };\n\n  \/**\n   * Create button and add it to buttons bar\n   * @param {object} button\n   *\/\n  ContextMenu.prototype.addToMenu = function (button) {\n    var self = this;\n\n    self.createButton(button).appendTo(this.$buttons);\n  };\n\n  \/**\n   * Create button\n   *\n   * @param button\n   * @param {string} button.name\n   * @param {string} button.label\n   *\n   * @returns {H5P.jQuery}\n   *\/\n  ContextMenu.prototype.createButton = function (button) {\n    var self = this;\n\n    var $newButton = $('<div>', {\n      'class': 'h5p-dragnbar-context-menu-button ' + button.name.toLowerCase(),\n      'role': 'button',\n      'tabindex': 0,\n      'aria-label': button.label\n    }).click(function () {\n      self.dnb.pressed = true;\n      self.trigger('contextMenu' + button.name, {button: button.name});\n    }).keydown(function (e) {\n      var keyPressed = e.which;\n      \/\/ 32 - space\n      if (keyPressed === 32) {\n        $(this).click();\n      }\n    });\n\n    return $newButton;\n  };\n\n  \/**\n   * Remove button from context menu\n   * @param {String} buttonName\n   *\/\n  ContextMenu.prototype.removeFromMenu = function (buttonName) {\n    var $removeButton = this.$buttons.children('.h5p-context-menu-button-' + buttonName);\n    $removeButton.remove();\n  };\n\n  \/**\n   * Update context menu with current buttons. Useful when having added or removed buttons.\n   *\/\n  ContextMenu.prototype.updateContextMenu = function () {\n    var self = this;\n\n    \/\/ Clear context menu\n    this.$buttons.children().remove();\n\n    \/\/ Check if transform button should be enabled\n    var enableTransform = false;\n\n    \/\/ Add coordinates\n    if (this.hasCoordinates) {\n      this.addCoordinates();\n      enableTransform = true;\n    }\n\n    \/\/ Add dimensions\n    if (this.canResize) {\n      this.addDimensions();\n      enableTransform = true;\n    }\n\n    \/\/ Add menu elements\n    this.buttons.forEach(function (button) {\n      self.addToMenu(button);\n    });\n\n    \/\/ Add transform button\n    this.addTransform(enableTransform)\n      .appendTo(this.$contextMenu);\n\n    this.$buttons.appendTo(this.$contextMenu);\n    this.$transformPanel.appendTo(this.$contextMenu);\n  };\n\n  \/**\n   * Add button and update context menu.\n   * @param {String} name\n   * @param {String} label\n   *\/\n  ContextMenu.prototype.addButton = function (name, label) {\n    this.buttons.push({name:name, label:label});\n    this.updateContextMenu();\n  };\n\n  \/**\n   * Remove button from context menu\n   * @param {string} name\n   *\/\n  ContextMenu.prototype.removeButton = function (name) {\n    var self = this;\n\n    \/\/ Check if button exists\n    self.buttons.forEach(function (button, index) {\n      if (button.name === name) {\n        self.buttons.splice(index, 1);\n        return;\n      }\n    });\n\n    this.updateContextMenu();\n  };\n\n  \/**\n   * Toggle buttons visibility\n   *\n   * @param [showButtons] Show buttons\n   *\/\n  ContextMenu.prototype.toggleButtonsBar = function (showButtons) {\n    var self = this;\n\n    if (showButtons !== undefined) {\n      self.$buttons.toggleClass('hide', !showButtons);\n    }\n    else {\n      self.$buttons.toggleClass('hide');\n    }\n  };\n\n  \/**\n   * Toggle transform panel visibility.\n   *\n   * @param [showTransformPanel] Show transform panel\n   *\/\n  ContextMenu.prototype.toggleTransformPanel = function (showTransformPanel) {\n    var self = this;\n\n    if (showTransformPanel !== undefined) {\n      self.$transformPanel.toggleClass('hide', !showTransformPanel);\n    }\n    else {\n      self.$transformPanel.toggleClass('hide');\n    }\n  };\n\n  \/**\n   * Toggle if coordinates should show\n   * @param {Boolean} [enableCoordinates] Enable coordinates\n   *\/\n  ContextMenu.prototype.toggleCoordinates = function (enableCoordinates) {\n    if (enableCoordinates === undefined) {\n      this.hasCoordinates = !this.hasCoordinates;\n    }\n    else {\n      this.hasCoordinates = !!enableCoordinates;\n    }\n\n    this.updateContextMenu();\n  };\n\n  \/**\n   * Attach context menu to body.\n   *\/\n  ContextMenu.prototype.attach = function () {\n    this.$contextMenu.appendTo(this.$parent);\n  };\n\n  \/**\n   * Detach context menu from DOM.\n   *\/\n  ContextMenu.prototype.detach = function () {\n    this.$contextMenu.detach();\n  };\n\n  return ContextMenu;\n\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/scripts\/dialog.js?ver=1.4.6":"\n\/*global H5P*\/\nH5P.DragNBarDialog = (function ($, EventDispatcher) {\n\n  \/**\n   * Controls the dialog in the interactive video.\n   *\n   * @class\n   * @param {H5P.jQuery} $container for dialog\n   * @param {H5P.jQuery} $videoWrapper needed for positioning of dialog\n   *\/\n  function Dialog($container, $videoWrapper) {\n    var KEY_CODE_ESC = 27;\n    var KEY_CODE_ENTER = 13;\n    var KEY_CODE_SPACE = 32;\n\n    var self = this;\n    var titleId = 'dialog-title-' + H5P.createUUID();\n\n    \/\/ Initialize event inheritance\n    EventDispatcher.call(self);\n\n    \/**\n     * Stops propagating an event\n     *\n     * @param {Event} event\n     *\/\n    var stopEventPropagation = function (event) {\n      \/\/ k is used to stop and start an interactive video\n      if (event.which === 75) {\n        event.stopPropagation();\n      }\n    };\n\n    \/\/ Create DOM elements for dialog\n    var $wrapper = $('<div\/>', {\n      'class': 'h5p-dialog-wrapper h5p-ie-transparent-background h5p-hidden',\n      on: {\n        click: function () {\n          if (!self.disableOverlay)  {\n            self.close();\n          }\n        },\n        keyup: stopEventPropagation,\n        keydown: stopEventPropagation\n      }\n    });\n    var $dialog = $('<div\/>', {\n      'class': 'h5p-dialog h5p-big',\n      'aria-labelledby': titleId,\n      on: {\n        click: function (event) {\n          event.stopPropagation();\n        },\n        keydown: function (event) {\n          var isClosable = $close.is(':visible');\n          if (event.which === KEY_CODE_ESC && isClosable) {\n            self.close();\n          }\n        }\n      }\n    }).appendTo($wrapper);\n\n    \/\/ Create title bar\n    var $titleBar = $('<div\/>', {\n      'class': 'h5p-dialog-titlebar',\n      appendTo: $dialog\n    });\n    var $title = $('<div\/>', {\n      'class': 'h5p-dialog-title',\n      id: titleId,\n      appendTo: $titleBar\n    });\n    var $close = $('<div\/>', {\n      'role': 'button',\n      'class': 'h5p-dialog-close',\n      tabindex: '0',\n      title: H5P.t('close'),\n      on: {\n        click: function (event) {\n          if (event.which === 1) {\n            self.close();\n          }\n        },\n        keypress: function (event) {\n          if (event.which === KEY_CODE_SPACE || event.which === KEY_CODE_ENTER) {\n            self.close();\n            event.preventDefault();\n          }\n        }\n      },\n      appendTo: $titleBar\n    });\n\n    \/\/ Used instead of close\n    var $customButtons;\n\n    \/\/ Create inner DOM elements for dialog\n    var $inner = $('<div\/>', {\n      'class': 'h5p-dialog-inner'\n    }).appendTo($dialog);\n\n    \/\/ Add all to DOM\n    $wrapper.appendTo($container);\n\n    \/**\n     * Reset the dialog's positioning\n     *\n     * @private\n     *\/\n    var resetPosition = function () {\n      \/\/ Reset positioning\n      $dialog.css({\n        left: '',\n        top: '',\n        height: '',\n        width: '',\n        fontSize: '',\n        bottom: ''\n      });\n      $inner.css({\n        width: '',\n        height: '',\n        overflow: ''\n      });\n    };\n\n    \/**\n     * Display overlay.\n     *\n     * @private\n     * @param {function} next callback\n     *\/\n    var showOverlay = function (next) {\n      $wrapper.show();\n      setTimeout(function () {\n        \/\/ Remove class on next tick to ensure css animation\n        $wrapper.removeClass('h5p-hidden');\n        if (next) {\n          next();\n        }\n      }, 0);\n    };\n\n    \/**\n     * Close overlay.\n     *\n     * @private\n     * @param {function} next callback\n     *\/\n    var hideOverlay = function (next) {\n      $wrapper.addClass('h5p-hidden');\n      setTimeout(function () {\n        \/\/ Hide when animation is done\n        $wrapper.hide();\n        if (next) {\n          next();\n        }\n      }, 200);\n    };\n\n    \/**\n     * Opens a new dialog. Displays the given element.\n     *\n     * @param {H5P.jQuery} $element\n     * @param {string} [title] Label for the dialog\n     * @param {string} [classes] For styling\n     * @param {H5P.jQuery} [$buttons] Use custom buttons for dialog\n     *\/\n    self.open = function ($element, title, classes, $buttons) {\n      showOverlay();\n      $inner.children().detach().end().append($element);\n\n      \/\/ Reset positioning\n      resetPosition();\n      $dialog.addClass('h5p-big');\n      $title.attr('class', 'h5p-dialog-title' + (classes ? ' ' + classes : ''));\n\n      \/\/ Add label\n      if (!title) {\n        title = '';\n      }\n      $title.html(title);\n\n      \/\/ Clean up after previous custom buttons\n      if ($customButtons) {\n        $customButtons.remove();\n        $close.show();\n      }\n\n      \/\/ Add new custom buttons\n      if ($buttons) {\n        $customButtons = $buttons;\n\n        \/\/ Hide default close button\n        $close.hide();\n\n        \/\/ Add custom buttons\n        $buttons.appendTo($titleBar);\n      }\n\n      self.resize();\n\n      self.trigger('open');\n\n      $dialog.one('transitionend', function() {\n        \/\/ Find visible enabled inputs:\n        var $inputs = $inner.find('input:visible:not(:disabled)');\n        var $tabbables = $inner.find('[tabindex]');\n\n        \/\/ Prioritize the focusing of inputs before other elements\n        if ($inputs.length) {\n          $inputs.get(0).focus();\n        }\n        \/\/ If other tabbables exist like h5p-text, focus on them\n        else if ($tabbables.length) {\n          $tabbables.get(0).focus();\n        }\n      });\n    };\n\n    self.resize = function () {\n      if (!$dialog.hasClass('h5p-big')) {\n        return;\n      }\n\n      var fontSize = toNum($inner.css('fontSize'));\n      var titleBarHeight = ($titleBar.outerHeight() \/ fontSize);\n\n      \/\/ Same as height\n      var maxHeight = $container.height();\n      \/\/ minus dialog margins\n      maxHeight -= Number($dialog.css('top').replace('px', '')) * 2;\n\n      $inner.css({\n        width: '100%',\n        maxHeight: ((maxHeight \/ fontSize) - titleBarHeight) + 'em',\n        marginTop: titleBarHeight + 'em'\n      });\n      $dialog.css({\n        bottom: 'auto',\n        maxHeight: ''\n      });\n    };\n\n    \/**\n     * Adds a name to the dialog for identifying what it contains.\n     *\n     * @param {string} machineName Name of library inside dialog.\n     *\/\n    self.addLibraryClass = function (machineName) {\n      $dialog.attr('data-lib', machineName);\n    };\n\n    \/**\n     * Toggle class on the dialog Dom element\n     * @method toggleClass\n     * @param  {String}    cls    Classname\n     * @param  {Boolean}   toggle\n     *\/\n    self.toggleClass = function (cls, toggle) {\n      $dialog.toggleClass(cls, toggle);\n    };\n\n    self.isOpen = function () {\n      return $wrapper.is(':visible');\n    };\n\n    \/**\n     * Reposition the currently open dialog relative to the given button.\n     *\n     * @param {H5P.jQuery} $button\n     * @param {Object} [size] Sets a size for the dialog, useful for images.\n     * @param {boolean} [medium=false] Sets a min. size for medium dialogs.\n     *\/\n    self.position = function ($button, size, medium) {\n      resetPosition();\n      $dialog.removeClass('h5p-big h5p-medium');\n      var titleBarHeight = Number($inner[0].style.marginTop.replace('em', ''));\n\n      \/\/ Use a fixed size\n      if (size) {\n        var fontSizeRatio = 16 \/ toNum($container.css('fontSize'));\n\n        \/\/ Fixed width\n        if (size.width) {\n          size.width = (size.width * fontSizeRatio);\n          $dialog.css('width', size.width + 'em');\n        }\n\n        \/\/ Fixed height\n        if (size.height) {\n          size.height = (size.height * fontSizeRatio) + titleBarHeight;\n          $dialog.css('height', size.height + 'em');\n\n          $inner.css({\n            width: 'auto',\n            overflow: 'hidden'\n          });\n        }\n      }\n\n      if (medium) {\n        $dialog.addClass('h5p-medium');\n      }\n\n      var buttonWidth = $button.outerWidth(true);\n      var buttonPosition = $button.position();\n      var containerWidth = $container.width();\n      var containerHeight = $container.height();\n\n      \/\/ Position dialog horizontally\n      var left = buttonPosition.left;\n      var dialogWidth = $dialog.outerWidth(true);\n      if (medium && dialogWidth > containerWidth) {\n        \/\/ If dialog is too big to fit within the container, display as h5p-big instead.\n        \/\/ Only medium dialogs can become big\n        $dialog.addClass('h5p-big');\n        return;\n      }\n\n      if (buttonPosition.left > (containerWidth \/ 2) - (buttonWidth \/ 2)) {\n        \/\/ Show on left\n        left -= dialogWidth - buttonWidth;\n      }\n\n      \/\/ Make sure the dialog is within the video on the right.\n      if ((left + dialogWidth) > containerWidth) {\n        left = containerWidth - dialogWidth;\n      }\n\n      var marginLeft = parseInt($videoWrapper.css('marginLeft'));\n      if (isNaN(marginLeft)) {\n        marginLeft = 0;\n      }\n\n      \/\/ And finally, make sure we're within bounds on the left hand side too...\n      if (left < marginLeft) {\n        left = marginLeft;\n      }\n\n      \/\/ Position dialog vertically\n      var marginTop = parseInt($videoWrapper.css('marginTop'));\n      if (isNaN(marginTop)) {\n        marginTop = 0;\n      }\n\n      var top = (medium ? 0 : (buttonPosition.top + marginTop));\n      var totalHeight = top + $dialog.outerHeight(true);\n      if (totalHeight > containerHeight) {\n        top -= totalHeight - containerHeight;\n      }\n      var maxHeight = $container.height() - top + $dialog.height() - $dialog.outerHeight(true);\n      var fontSize = toNum($container.css('fontSize'));\n      \/\/ Set dialog size\n      $dialog.css({\n        top: (top \/ (containerHeight \/ 100)) + '%',\n        left: (left \/ (containerWidth \/ 100)) + '%',\n        width: (window.getComputedStyle($dialog[0]).width \/ fontSize) + 'em',\n        maxHeight: (maxHeight \/ fontSize) + 'em'\n      });\n      $inner.css('maxHeight', ((maxHeight - $titleBar.outerHeight(true)) \/ fontSize) + 'em');\n    };\n\n    \/**\n     * Find max available space inside dialog when positioning relative to\n     * given button.\n     *\n     * @param {H5P.jQuery} $button\n     * @param {Boolean} fullScreen True if dialog fills whole parent\n     * @returns {Object} Attrs: width, height\n     *\/\n    self.getMaxSize = function ($button, fullScreen) {\n      var buttonWidth = $button.outerWidth(true);\n      var buttonPosition = $button.position();\n      var containerWidth = $container.width();\n\n      var max = {};\n      max.height = Number($inner.css('maxHeight').replace('px', ''));\n\n      \/\/ If border, extract that:\n      max.height -= Number($inner.css('border-width').replace('px', '')) * 2;\n\n      if (fullScreen) {\n        max.width = containerWidth;\n      }\n      else {\n        if (buttonPosition.left > (containerWidth \/ 2) - (buttonWidth \/ 2)) {\n          \/\/ Space to the left of the button minus margin\n          max.width = buttonPosition.left;\n        }\n        else {\n          \/\/ Space to the right of the button minus margin\n          max.width = (containerWidth - buttonPosition.left - buttonWidth);\n        }\n      }\n\n      \/\/ Use em\n      var fontSize = toNum($container.css('fontSize'));\n      max.width = (max.width \/ fontSize) * (fontSize \/ 16);\n      max.height = (max.height \/ fontSize) * (fontSize \/ 16);\n\n      return max;\n    };\n\n    \/**\n     * Scroll to given position in current dialog.\n     *\n     * @param {number} to Scroll position\n     * @param {number} ms Time the animation takes.\n     *\/\n    self.scroll = function (to, ms) {\n      $inner.stop().animate({\n        scrollTop: to\n      }, ms);\n    };\n\n    \/**\n     * Close the currently open dialog.\n     *\/\n    self.close = function (closeInstant) {\n      $wrapper.addClass('h5p-hidden');\n\n      if (closeInstant) {\n        $wrapper.hide();\n        self.disableOverlay = false;\n        $close.show();\n      }\n      else {\n        setTimeout(function () {\n          $wrapper.hide();\n          self.disableOverlay = false;\n          $close.show();\n        }, 201);\n      }\n\n      self.trigger('close');\n\n      \/\/ Let others reach to the hiding of this dialog\n      self.trigger('domHidden', {\n        '$dom': $wrapper,\n        'key': 'dialogClosed'\n      }, {'bubbles': true, 'external': true});\n    };\n\n    \/**\n     * Open overlay only.\n     *\/\n    self.openOverlay = function () {\n      self.disableOverlay = true;\n      $dialog.hide();\n      showOverlay();\n    };\n\n    \/**\n     * Close overlay only.\n     *\/\n    self.closeOverlay = function () {\n      $wrapper.addClass('h5p-hidden');\n      hideOverlay(function () {\n        $dialog.show();\n        self.disableOverlay = false;\n      });\n    };\n\n    \/**\n     * Removes the close button from the current dialog.\n     *\/\n    self.hideCloseButton = function () {\n      $close.hide();\n    };\n\n    \/**\n     * Get width of dialog\n     * @returns {Number} Width of dialog\n     *\/\n    self.getDialogWidth = function () {\n      return $dialog.width();\n    };\n\n    \/**\n     * Reset dialog width\n     *\/\n    self.removeStaticWidth = function () {\n      $dialog.css('width', '');\n    };\n  }\n\n  \/\/ Extends the event dispatcher\n  Dialog.prototype = Object.create(EventDispatcher.prototype);\n  Dialog.prototype.constructor = Dialog;\n\n\n  \/**\n   * Converts css px value to number.\n   *\n   * @private\n   * @param {string} num\n   * @returns {Number}\n   *\/\n  var toNum = function (num) {\n    return Number(num.replace('px',''));\n  };\n\n  return Dialog;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/scripts\/drag-n-bar-element.js?ver=1.4.6":"\n\/*global H5P*\/\n\n\/**\n * Create Drag N Bar Element. Connects a DragNBar element to a context menu\n *\/\nH5P.DragNBarElement = (function ($, ContextMenu, EventDispatcher) {\n\n  \/**\n   * Constructor DragNBarElement\n   *\n   * @class\n   * @param {H5P.DragNBar} dragNBar Parent dragNBar toolbar\n   * @param {object} [clipboardData]\n   * @param {Object} [options] Button object that the element is created from\n   * @param {Boolean} [options.disableContextMenu] Decides if element should have editor functionality\n   * @param {Function} [options.createElement] Function for creating element from button\n   * @param {boolean} [options.hasCoordinates] Decides if element will display coordinates\n   * @param {H5P.jQuery} [options.element] Element\n   *\/\n  function DragNBarElement(dragNBar, clipboardData, options) {\n    var self = this;\n    EventDispatcher.call(this);\n\n    this.dnb = dragNBar;\n    this.options = options || {};\n    if (!this.options.disableContextMenu) {\n      this.contextMenu = new ContextMenu(this.dnb.$dialogContainer, this, this.options.hasCoordinates, this.options.disableResize);\n    }\n    this.focused = false;\n\n    if (this.options.createElement) {\n      this.$element = this.options.createElement().appendTo(dragNBar.$container);\n      this.focus();\n    }\n    else {\n      this.$element = this.options.element;\n    }\n\n    \/\/ Let dnb know element has been pressed\n    if (this.$element) {\n      if (this.dnb.isEditor) {\n        this.$element.mousedown(function () {\n          self.dnb.pressed = true;\n        });\n      }\n\n      \/\/ Run custom focus function on element focus\n      this.$element.focus(function () {\n        self.focus();\n      });\n    }\n\n    \/**\n     * Store element paramets in the local storage.\n     *\/\n    self.toClipboard = function (width, height) {\n      if (clipboardData && localStorage) {\n        clipboardData.width = width;\n        clipboardData.height = height;\n        localStorage.setItem('h5pClipboard', JSON.stringify(clipboardData));\n      }\n    };\n  }\n\n  \/\/ Inheritance\n  DragNBarElement.prototype = Object.create(EventDispatcher.prototype);\n  DragNBarElement.prototype.constructor = DragNBarElement;\n\n  \/**\n   * Add button to context menu.\n   *\n   * @param {string} name\n   * @param {string} label\n   *\/\n  DragNBarElement.prototype.addButton = function (name, label) {\n    this.contextMenu.addToMenu({name:name, label:label});\n  };\n\n  \/**\n   * Get element\n   * @returns {H5P.jQuery}\n   *\/\n  DragNBarElement.prototype.getElement = function () {\n    return this.$element;\n  };\n\n  \/**\n   * Set element\n   * @param {H5P.jQuery} $element\n   *\/\n  DragNBarElement.prototype.setElement = function ($element) {\n    var self = this;\n    this.$element = $element;\n\n    \/\/ Register custom focus function on new element focus\n    this.$element.focus(function () {\n      self.focus();\n    });\n  };\n\n  \/**\n   * Show context menu\n   *\/\n  DragNBarElement.prototype.showContextMenu = function () {\n    if (this.contextMenu) {\n      this.contextMenu.attach();\n    }\n  };\n\n  \/**\n   * Hide context menu\n   *\/\n  DragNBarElement.prototype.hideContextMenu = function () {\n    if (this.contextMenu) {\n      this.contextMenu.detach();\n    }\n  };\n\n  \/**\n   * Update coordinates in context menu to current location\n   *\n   * @param {Number} left Left position of context menu\n   * @param {Number} top Top position of context menu\n   * @param {Number} x X coordinate of context menu\n   * @param {Number} y Y coordinate of context menu\n   *\/\n  DragNBarElement.prototype.updateCoordinates = function (left, top, x, y) {\n    if (this.contextMenu) {\n      this.contextMenu.updateCoordinates(left, top, x, y);\n      this.resizeContextMenu(x);\n    }\n  };\n\n  \/**\n   * Float context menu left if width exceeds parent container.\n   *\n   * @param {Number} [left] Left position of context menu.\n   *\/\n  DragNBarElement.prototype.resizeContextMenu = function (left) {\n    if (this.options.disableContextMenu) {\n      return;\n    }\n\n    \/\/ Need to take into account the left padding of the contextmenu's parent\n    var paddingLeft = Number(this.contextMenu.$parent.css('padding-left').replace('px', ''));\n    left = (left || this.$element.position().left) + paddingLeft;\n    var containerWidth = this.dnb.$container.width();\n    var $cm = this.contextMenu.$contextMenu;\n\n    \/\/ Measure full outer width\n    $cm.css({\n      position: 'absolute',\n      left: 0\n    });\n    var contextMenuWidth = $cm.outerWidth(true);\n\n    \/\/ Reset to default\n    $cm.css({\n      position: '',\n      left: left\n    });\n\n    var isTooWide = left + contextMenuWidth >= containerWidth;\n\n    if (isTooWide) {\n      var newLeft = left - contextMenuWidth;\n      this.contextMenu.$contextMenu.css('left', newLeft + 'px');\n      this.contextMenu.$contextMenu.addClass('left-aligned');\n    } else {\n      this.contextMenu.$contextMenu.removeClass('left-aligned');\n    }\n  };\n\n  \/**\n   * Blur element and hide context menu.\n   *\/\n  DragNBarElement.prototype.blur = function () {\n    if (this.$element) {\n      this.$element.removeClass('focused');\n      this.focused = false;\n\n      if (!this.options.disableContextMenu) {\n        \/\/ Hide transform panel\n        this.contextMenu.trigger('contextMenuTransform', {showTransformPanel: false});\n      }\n    }\n    this.hideContextMenu();\n  };\n\n  \/**\n   * Focus element\n   *\/\n  DragNBarElement.prototype.focus = function () {\n    this.$element.addClass('focused');\n    this.focused = true;\n    if (this.contextMenu) {\n      this.resizeContextMenu(this.$element.position().left);\n    }\n  };\n\n  \/**\n   * Remove element and hide context menu\n   *\/\n  DragNBarElement.prototype.removeElement = function () {\n    this.$element.detach();\n    this.hideContextMenu();\n  };\n\n  return DragNBarElement;\n\n})(H5P.jQuery, H5P.DragNBarContextMenu, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Image-1.0\/image.js?ver=1.0.31":"\nvar H5P = H5P || {};\n\n\/**\n * Constructor.\n *\n * @param {Object} params Options for this library.\n * @param {Number} id Content identifier\n * @returns {undefined}\n *\/\n(function ($) {\n  H5P.Image = function (params, id) {\n    H5P.EventDispatcher.call(this);\n\n    if (params.file === undefined || !(params.file instanceof Object)) {\n      this.placeholder = true;\n    }\n    else {\n      this.source = H5P.getPath(params.file.path, id);\n      this.width = params.file.width;\n      this.height = params.file.height;\n\n      \/\/ Use new copyright information if available. Fallback to old.\n      if (params.file.copyright !== undefined) {\n        this.copyright = params.file.copyright;\n      }\n      else if (params.copyright !== undefined) {\n        this.copyright = params.copyright;\n      }\n    }\n\n    this.alt = params.alt !== undefined ? params.alt : 'New image';\n\n    if (params.title !== undefined) {\n      this.title = params.title;\n    }\n  };\n\n  H5P.Image.prototype = Object.create(H5P.EventDispatcher.prototype);\n  H5P.Image.prototype.constructor = H5P.Image;\n\n  \/**\n   * Wipe out the content of the wrapper and put our HTML in it.\n   *\n   * @param {jQuery} $wrapper\n   * @returns {undefined}\n   *\/\n  H5P.Image.prototype.attach = function ($wrapper) {\n    var self = this;\n    var source = this.source;\n\n    if (self.$img === undefined) {\n      if(self.placeholder) {\n        self.$img = $('<div>', {\n          width: '100%',\n          height: '100%',\n          class: 'h5p-placeholder',\n          title: this.title === undefined ? '' : this.title,\n          load: function () {\n            self.trigger('loaded');\n          }\n        });\n      } else {\n        self.$img = $('<img>', {\n          width: '100%',\n          height: '100%',\n          src: source,\n          alt: this.alt,\n          title: this.title === undefined ? '' : this.title,\n          load: function () {\n            self.trigger('loaded');\n          }\n        });\n      }\n    }\n\n    $wrapper.addClass('h5p-image').html(self.$img);\n  };\n\n  \/**\n   * Gather copyright information for the current content.\n   *\n   * @returns {H5P.ContentCopyright}\n   *\/\n  H5P.Image.prototype.getCopyrights = function () {\n    if (this.copyright === undefined) {\n      return;\n    }\n\n    var info = new H5P.ContentCopyrights();\n\n    var image = new H5P.MediaCopyright(this.copyright);\n    image.setThumbnail(new H5P.Thumbnail(this.source, this.width, this.height));\n    info.addMedia(image);\n\n    return info;\n  };\n\n  return H5P.Image;\n}(H5P.jQuery));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.AdvancedText-1.1\/text.js?ver=1.1.5":"\nH5P.AdvancedText = (function ($) {\n\n  \/**\n   * A simple library for displaying text with advanced styling.\n   *\n   * @class H5P.AdvancedText\n   * @param {Object} parameters\n   * @param {Object} [parameters.text='New text']\n   * @param {number} id\n   *\/\n  function AdvancedText(parameters, id) {\n    var self = this;\n\n    var html = (parameters.text === undefined ? '<em>New text<\/em>' : parameters.text);\n\n    \/**\n     * Wipe container and add text html.\n     *\n     * @alias H5P.AdvancedText#attach\n     * @param {H5P.jQuery} $container\n     *\/\n    self.attach = function ($container) {\n      $container.addClass('h5p-advanced-text').html(html);\n    };\n  }\n\n  return AdvancedText;\n\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.UrlField-1.2\/link-widget.js?ver=1.2.1":"\n\/*global H5PEditor, H5P *\/\nH5PEditor.widgets.linkWidget = (function ($) {\n\n  \/**\n   * Initialize link widget\n   *\n   * @param parent\n   * @param field\n   * @param params\n   * @param setValue\n   *\/\n  function LinkWidget(parent, field, params, setValue) {\n    var self = this;\n\n    self.field = field;\n\n    \/\/ Tell editor to handle passing readies.\n    self.passReadies = false;\n\n    \/\/ Create link widget container\n    var $container = $('<div>', {\n      'class': 'h5p-link-widget'\n    });\n\n    \/\/ Link fields\n    var $linkFields = $('<div>', {\n      'class': 'h5p-link-fields'\n    }).appendTo($container);\n\n    \/\/ Error field\n    var $errorField = $('<div>', {\n      'class': 'h5p-link-errors'\n    }).appendTo($container);\n\n    \/\/ Extend params with default values\n    params = $.extend({}, params);\n    setValue(field, params);\n\n    \/\/ Process semantics and place them in container\n    H5PEditor.processSemanticsChunk(field.fields, params, $linkFields, self);\n\n    \/\/ Selector element\n    var $selectElement = $linkFields.find('.field.select').addClass('h5p-link-protocol-selector');\n    var $selector = $selectElement.find('select');\n\n    \/\/ Url text element\n    var $urlElement = $linkFields.find('.field.text').addClass('h5p-link-url');\n    var $urlText = $urlElement.find('.h5peditor-text');\n\n    \/\/ Move error messages\n    $selectElement.find('.h5p-errors').appendTo($errorField);\n    $urlElement.find('.h5p-errors').appendTo($errorField);\n\n    \/\/ Register listener for changes in url field\n    $urlText.on('input propertychange paste', function () {\n      findUrlProtocol();\n    });\n\n    \/**\n     * Finds url protocol and sets it in selector if found.\n     *\/\n    var findUrlProtocol = function () {\n      var $options = $('option', $selector);\n      $options.each(function (idx, option) {\n        if ($urlText.val().substr(0, option.value.length) === option.value) {\n          $urlText.val($urlText.val().substr(option.value.length));\n          $selector.val(option.value);\n        }\n      });\n\n      \/\/ Make sure params are updated\n      params.url = $urlText.val();\n      params.protocol = $selector.val();\n    };\n\n    \/**\n     * Validate the url\n     *\/\n    self.validate = function () {\n      \/\/ We only require the URL field to be non-empty if mandatory\n      return field.optional === true || $urlText.val().trim().length >= 1;\n    };\n\n    \/**\n     * Remove widget\n     *\/\n    self.remove = function () {\n      $container.remove();\n    };\n\n    \/**\n     * Append link widget to wrapper\n     *\n     * @param {H5P.jQuery} $wrapper\n     *\/\n    self.appendTo = function ($wrapper) {\n      $container.appendTo($wrapper);\n    };\n\n    self.getDomElement = function () {\n      return $container;\n    }\n  }\n\n  return LinkWidget;\n\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Link-1.3\/link.js?ver=1.3.4":"\nvar H5P = H5P || {};\n\n\/**\n * H5P Link Library Module.\n *\/\nH5P.Link = (function ($) {\n\n  \/**\n   * Link constructor.\n   *\n   * @param {Object} parameters\n   *\/\n  function Link(parameters) {\n    \/\/ Add default parameters\n    parameters = $.extend(true, {\n      title: 'New link',\n      linkWidget: {\n        protocol: '',\n        url: ''\n      }\n    }, parameters);\n\n    var url = '';\n    if (parameters.linkWidget.protocol !== 'other') {\n       url += parameters.linkWidget.protocol;\n    }\n    url += parameters.linkWidget.url;\n\n    \/**\n     * Public. Attach.\n     *\n     * @param {jQuery} $container\n     *\/\n    this.attach = function ($container) {\n      var sanitizedUrl = sanitizeUrlProtocol(url);\n      $container.addClass('h5p-link').html('<a href=\"' + sanitizedUrl + '\" target=\"_blank\">' + parameters.title + '<\/a>')\n                .keypress(function (event) {\n                  if (event.which === 32) {\n                    this.click();\n                  }\n                });\n    };\n\n    \/**\n     * Return url\n     *\n     * @returns {string}\n     *\/\n    this.getUrl = function () {\n      return url;\n    };\n\n    \/**\n     * Private. Remove illegal url protocols from uri\n     *\/\n    var sanitizeUrlProtocol = function(uri) {\n      var allowedProtocols = ['http', 'https', 'ftp', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'tel', 'telnet', 'webcal'];\n\n      var first = true;\n      var before = '';\n      while (first || uri != before) {\n        first = false;\n        before = uri;\n        var colonPos = uri.indexOf(':');\n        if (colonPos > 0) {\n          \/\/ We found a possible protocol\n          var protocol = uri.substr(0, colonPos);\n          \/\/ If the colon is preceeded by a hash, slash or question mark it isn't a protocol\n          if (protocol.match(\/[\/?#]\/g)) {\n            break;\n          }\n          \/\/ Is this a forbidden protocol?\n          if (allowedProtocols.indexOf(protocol.toLowerCase()) == -1) {\n            \/\/ If illegal, remove the protocol...\n            uri = uri.substr(colonPos + 1);\n          }\n        }\n      }\n      return uri;\n    };\n  }\n\n  return Link;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.ContinuousText-1.2\/scripts\/ct.js?ver=1.2.8":"\nvar H5P = H5P || {};\n\n\/**\n * Constructor.\n *\n * @param {object} params Options for this library.\n *\/\nH5P.ContinuousText = function (params) {\n  this.text = params.text === undefined ? '<div class=\"ct\"><em>New text<\/em><\/div>' : '<div class=\"ct\">'+params.text+'<\/div>';\n};\n\n\/**\n * Wipe out the content of the wrapper and put our HTML in it.\n *\n * @param {jQuery} $wrapper\n *\/\nH5P.ContinuousText.prototype.attach = function ($wrapper) {\n  $wrapper.addClass('h5p-ct').html(this.text);\n};\n\nH5P.ContinuousText.Engine = (function() {\n\n  \/\/ Fit nodes from $document into $target while preventing $target from\n  \/\/ overflowing $container.  Will call itself recursively to add child nodes\n  \/\/ if the parent node does not fit.\n  function fitText($container, $target, $document) {\n    var containerBottom = $container.offset().top + $container.innerHeight();\n    $document.contents().each(function () {\n      var thisBottom, $node, $clone, words,\n      i = 0,\n      text = \"\",\n      rest = \"\";\n\n      \/\/ Proper DOM node. Attempt to fit.\n      if (this.nodeType === 1) {\n        $node = H5P.jQuery(this);\n        $target.append($node); \/\/ Need to append it here to get height calculated by browser.\n        thisBottom = $node.offset().top + $node.outerHeight();\n        if (thisBottom > containerBottom) {\n          \/\/ Pull back to the document.\n          $clone = $node.clone();\n          $document.prepend($clone);\n          $node.empty();\n          fitText($container, $node, $clone);\n          return false;\n        }\n      } else if (this.nodeType === 3) {\n        \/\/ Text node. Might need to split.\n        $target.append(this);\n        \/\/ Test if $target overflows.\n        thisBottom = $target.offset().top + $target.outerHeight();\n        if (thisBottom > containerBottom) {\n          words = this.data.split(' ');\n          do {\n            i++;\n            text = words.slice(0, i).join(\" \");\n            rest = words.slice(i).join(\" \");\n            this.replaceData(0, this.data.length, text);\n            thisBottom = $target.offset().top + $target.outerHeight();\n          } while (thisBottom < containerBottom && i < words.length);\n          \/\/ Need to backtrack one word.\n          text = words.slice(0, i-1).join(\" \");\n          rest = words.slice(i-1).join(\" \");\n          this.replaceData(0, this.data.length, text);\n          $document.prepend(rest);\n\n          return false;\n        }\n      } else {\n        \/\/ Ignore. Probably a comment.\n      }\n    });\n  }\n\n  return {\n    run: function (cpEditor) {\n      var elements = cpEditor.getCTs();\n\n      \/\/ Do not run if there are no CT-elements\n      if (!elements.length) {\n        return;\n      }\n\n      var content = cpEditor.params.ct;\n      var $temporaryDocument = H5P.jQuery('<div\/>').html(content);\n\n      var opacity = (cpEditor.ct.params.backgroundOpacity === undefined || cpEditor.ct.params.backgroundOpacity === 0 ? null : cpEditor.ct.params.backgroundOpacity);\n\n      for (var i = 0; i < elements.length; i++) {\n        var element = elements[i];\n\n        var $container = element.element.$wrapper;\n\n        \/\/ Update element visuals\n        if (opacity) {\n          $container.removeClass('h5p-transparent').css('backgroundColor', 'rgba(255, 255, 255, ' + (opacity \/ 100) + ')');\n        }\n        else {\n          $container.addClass('h5p-transparent').css('backgroundColor', '');\n        }\n        element.params.backgroundOpacity = opacity;\n\n        var $elementClone = $container.clone();\n        var $innerContainer = $elementClone.find('.ct');\n\n        $elementClone.appendTo(cpEditor.cp.$current);\n\n        \/\/ Remaining blocks in the temporary document.\n        var $blocks = $temporaryDocument.children();\n        if ($blocks.length === 0) {\n          $container.addClass('no-more-content');\n          $container.find('.ct').html('<em>No more content<\/em>');\n          element.params.action.params.text = '';\n        }\n        else {\n          $innerContainer.html('');\n          fitText($elementClone, $innerContainer, $temporaryDocument);\n\n          \/\/ Store data on element\n          element.params.action.params.text = $innerContainer.html();\n          $container.find('.ct').html(element.params.action.params.text);\n        }\n\n        \/\/ Cleanup\n        $elementClone.remove();\n      }\n\n      \/\/ Cleanup Temporary document.\n      $temporaryDocument.remove();\n    }\n  };\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Table-1.1\/scripts\/table.js?ver=1.1.5":"\nvar H5P = H5P || {};\n\n\/**\n * Constructor.\n *\n * @param {object} params Options for this library.\n * @param {int} id Content identifier\n *\/\nH5P.Table = function (params, id) {\n  this.text = params.text === undefined ? '<table class=\"h5p-table\"><thead><tr><th scope=\"col\">Heading Column 1<\/th><th scope=\"col\">Heading Column 2<\/th><\/tr><\/thead><tbody><tr><td>Row 1 Col 1<\/td><td>Row 1 Col 2<\/td><\/tr><tr><td>Row 2 Col 1<\/td><td>Row 2 Col 2<\/td><\/tr><\/tbody><\/table>' : params.text;\n};\n\n\/**\n * Wipe out the content of the wrapper and put our HTML in it.\n *\n * @param {jQuery} $wrapper\n *\/\nH5P.Table.prototype.attach = function ($wrapper) {\n  $wrapper.addClass('h5p-table').html(this.text);\n};","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/flowplayer-1.0\/scripts\/flowplayer-3.2.12.min.js?ver=1.0.5":"\n\/*\n * flowplayer.js 3.2.12. The Flowplayer API\n *\n * Copyright 2009-2011 Flowplayer Oy\n *\n * This file is part of Flowplayer.\n *\n * Flowplayer is free software: you can redistribute it and\/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Flowplayer is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Flowplayer.  If not, see <http:\/\/www.gnu.org\/licenses\/>.\n *\n * Date: ${date}\n * Revision: ${revision}\n *\/\n!function(){function h(p){console.log(\"$f.fireEvent\",[].slice.call(p))}function l(r){if(!r||typeof r!=\"object\"){return r}var p=new r.constructor();for(var q in r){if(r.hasOwnProperty(q)){p[q]=l(r[q])}}return p}function n(u,r){if(!u){return}var p,q=0,s=u.length;if(s===undefined){for(p in u){if(r.call(u[p],p,u[p])===false){break}}}else{for(var t=u[0];q<s&&r.call(t,q,t)!==false;t=u[++q]){}}return u}function c(p){return document.getElementById(p)}function j(r,q,p){if(typeof q!=\"object\"){return r}if(r&&q){n(q,function(s,t){if(!p||typeof t!=\"function\"){r[s]=t}})}return r}function o(t){var r=t.indexOf(\".\");if(r!=-1){var q=t.slice(0,r)||\"*\";var p=t.slice(r+1,t.length);var s=[];n(document.getElementsByTagName(q),function(){if(this.className&&this.className.indexOf(p)!=-1){s.push(this)}});return s}}function g(p){p=p||window.event;if(p.preventDefault){p.stopPropagation();p.preventDefault()}else{p.returnValue=false;p.cancelBubble=true}return false}function k(r,p,q){r[p]=r[p]||[];r[p].push(q)}function e(p){return p.replace(\/&amp;\/g,\"%26\").replace(\/&\/g,\"%26\").replace(\/=\/g,\"%3D\")}function f(){return\"_\"+(\"\"+Math.random()).slice(2,10)}var i=function(u,s,t){var r=this,q={},v={};r.index=s;if(typeof u==\"string\"){u={url:u}}j(this,u,true);n((\"Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop\").split(\",\"),function(){var w=\"on\"+this;if(w.indexOf(\"*\")!=-1){w=w.slice(0,w.length-1);var x=\"onBefore\"+w.slice(2);r[x]=function(y){k(v,x,y);return r}}r[w]=function(y){k(v,w,y);return r};if(s==-1){if(r[x]){t[x]=r[x]}if(r[w]){t[w]=r[w]}}});j(this,{onCuepoint:function(y,x){if(arguments.length==1){q.embedded=[null,y];return r}if(typeof y==\"number\"){y=[y]}var w=f();q[w]=[y,x];if(t.isLoaded()){t._api().fp_addCuepoints(y,s,w)}return r},update:function(x){j(r,x);if(t.isLoaded()){t._api().fp_updateClip(x,s)}var w=t.getConfig();var y=(s==-1)?w.clip:w.playlist[s];j(y,x,true)},_fireEvent:function(w,z,x,B){if(w==\"onLoad\"){n(q,function(C,D){if(D[0]){t._api().fp_addCuepoints(D[0],s,C)}});return false}B=B||r;if(w==\"onCuepoint\"){var A=q[z];if(A){return A[1].call(t,B,x)}}if(z&&\"onBeforeBegin,onMetaData,onStart,onUpdate,onResume\".indexOf(w)!=-1){j(B,z);if(z.metaData){if(!B.duration){B.duration=z.metaData.duration}else{B.fullDuration=z.metaData.duration}}}var y=true;n(v[w],function(){y=this.call(t,B,z,x)});return y}});if(u.onCuepoint){var p=u.onCuepoint;r.onCuepoint.apply(r,typeof p==\"function\"?[p]:p);delete u.onCuepoint}n(u,function(w,x){if(typeof x==\"function\"){k(v,w,x);delete u[w]}});if(s==-1){t.onCuepoint=this.onCuepoint}};var m=function(q,s,r,u){var p=this,t={},v=false;if(u){j(t,u)}n(s,function(w,x){if(typeof x==\"function\"){t[w]=x;delete s[w]}});j(this,{animate:function(z,A,y){if(!z){return p}if(typeof A==\"function\"){y=A;A=500}if(typeof z==\"string\"){var x=z;z={};z[x]=A;A=500}if(y){var w=f();t[w]=y}if(A===undefined){A=500}s=r._api().fp_animate(q,z,A,w);return p},css:function(x,y){if(y!==undefined){var w={};w[x]=y;x=w}s=r._api().fp_css(q,x);j(p,s);return p},show:function(){this.display=\"block\";r._api().fp_showPlugin(q);return p},hide:function(){this.display=\"none\";r._api().fp_hidePlugin(q);return p},toggle:function(){this.display=r._api().fp_togglePlugin(q);return p},fadeTo:function(z,y,x){if(typeof y==\"function\"){x=y;y=500}if(x){var w=f();t[w]=x}this.display=r._api().fp_fadeTo(q,z,y,w);this.opacity=z;return p},fadeIn:function(x,w){return p.fadeTo(1,x,w)},fadeOut:function(x,w){return p.fadeTo(0,x,w)},getName:function(){return q},getPlayer:function(){return r},_fireEvent:function(x,w,y){if(x==\"onUpdate\"){var A=r._api().fp_getPlugin(q);if(!A){return}j(p,A);delete p.methods;if(!v){n(A.methods,function(){var C=\"\"+this;p[C]=function(){var D=[].slice.call(arguments);var E=r._api().fp_invoke(q,C,D);return E===\"undefined\"||E===undefined?p:E}});v=true}}var B=t[x];if(B){var z=B.apply(p,w);if(x.slice(0,1)==\"_\"){delete t[x]}return z}return p}})};function b(r,H,u){var x=this,w=null,E=false,v,t,G=[],z={},y={},F,s,q,D,p,B;j(x,{id:function(){return F},isLoaded:function(){return(w!==null&&w.fp_play!==undefined&&!E)},getParent:function(){return r},hide:function(I){if(I){r.style.height=\"0px\"}if(x.isLoaded()){w.style.height=\"0px\"}return x},show:function(){r.style.height=B+\"px\";if(x.isLoaded()){w.style.height=p+\"px\"}return x},isHidden:function(){return x.isLoaded()&&parseInt(w.style.height,10)===0},load:function(K){if(!x.isLoaded()&&x._fireEvent(\"onBeforeLoad\")!==false){var I=function(){if(v&&!flashembed.isSupported(H.version)){r.innerHTML=\"\"}if(K){K.cached=true;k(y,\"onLoad\",K)}flashembed(r,H,{config:u})};var J=0;n(a,function(){this.unload(function(L){if(++J==a.length){I()}})})}return x},unload:function(K){if(v.replace(\/\\s\/g,\"\")!==\"\"){if(x._fireEvent(\"onBeforeUnload\")===false){if(K){K(false)}return x}E=true;try{if(w){if(w.fp_isFullscreen()){w.fp_toggleFullscreen()}w.fp_close();x._fireEvent(\"onUnload\")}}catch(I){}var J=function(){w=null;r.innerHTML=v;E=false;if(K){K(true)}};if(\/WebKit\/i.test(navigator.userAgent)&&!\/Chrome\/i.test(navigator.userAgent)){setTimeout(J,0)}else{J()}}else{if(K){K(false)}}return x},getClip:function(I){if(I===undefined){I=D}return G[I]},getCommonClip:function(){return t},getPlaylist:function(){return G},getPlugin:function(I){var K=z[I];if(!K&&x.isLoaded()){var J=x._api().fp_getPlugin(I);if(J){K=new m(I,J,x);z[I]=K}}return K},getScreen:function(){return x.getPlugin(\"screen\")},getControls:function(){return x.getPlugin(\"controls\")._fireEvent(\"onUpdate\")},getLogo:function(){try{return x.getPlugin(\"logo\")._fireEvent(\"onUpdate\")}catch(I){}},getPlay:function(){return x.getPlugin(\"play\")._fireEvent(\"onUpdate\")},getConfig:function(I){return I?l(u):u},getFlashParams:function(){return H},loadPlugin:function(L,K,N,M){if(typeof N==\"function\"){M=N;N={}}var J=M?f():\"_\";x._api().fp_loadPlugin(L,K,N,J);var I={};I[J]=M;var O=new m(L,null,x,I);z[L]=O;return O},getState:function(){return x.isLoaded()?w.fp_getState():-1},play:function(J,I){var K=function(){if(J!==undefined){x._api().fp_play(J,I)}else{x._api().fp_play()}};if(x.isLoaded()){K()}else{if(E){setTimeout(function(){x.play(J,I)},50)}else{x.load(function(){K()})}}return x},getVersion:function(){var J=\"flowplayer.js 3.2.12\";if(x.isLoaded()){var I=w.fp_getVersion();I.push(J);return I}return J},_api:function(){if(!x.isLoaded()){throw\"Flowplayer \"+x.id()+\" not loaded when calling an API method\"}return w},setClip:function(I){n(I,function(J,K){if(typeof K==\"function\"){k(y,J,K);delete I[J]}else{if(J==\"onCuepoint\"){$f(r).getCommonClip().onCuepoint(I[J][0],I[J][1])}}});x.setPlaylist([I]);return x},getIndex:function(){return q},bufferAnimate:function(I){w.fp_bufferAnimate(I===undefined||I);return x},_swfHeight:function(){return w.clientHeight}});n((\"Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error,MouseOver,MouseOut\").split(\",\"),function(){var I=\"on\"+this;if(I.indexOf(\"*\")!=-1){I=I.slice(0,I.length-1);var J=\"onBefore\"+I.slice(2);x[J]=function(K){k(y,J,K);return x}}x[I]=function(K){k(y,I,K);return x}});n((\"pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip,playFeed,setKeyboardShortcutsEnabled,isKeyboardShortcutsEnabled\").split(\",\"),function(){var I=this;x[I]=function(K,J){if(!x.isLoaded()){return x}var L=null;if(K!==undefined&&J!==undefined){L=w[\"fp_\"+I](K,J)}else{L=(K===undefined)?w[\"fp_\"+I]():w[\"fp_\"+I](K)}return L===\"undefined\"||L===undefined?x:L}});x._fireEvent=function(R){if(typeof R==\"string\"){R=[R]}var S=R[0],P=R[1],N=R[2],M=R[3],L=0;if(u.debug){h(R)}if(!x.isLoaded()&&S==\"onLoad\"&&P==\"player\"){w=w||c(s);p=x._swfHeight();n(G,function(){this._fireEvent(\"onLoad\")});n(z,function(T,U){U._fireEvent(\"onUpdate\")});t._fireEvent(\"onLoad\")}if(S==\"onLoad\"&&P!=\"player\"){return}if(S==\"onError\"){if(typeof P==\"string\"||(typeof P==\"number\"&&typeof N==\"number\")){P=N;N=M}}if(S==\"onContextMenu\"){n(u.contextMenu[P],function(T,U){U.call(x)});return}if(S==\"onPluginEvent\"||S==\"onBeforePluginEvent\"){var I=P.name||P;var J=z[I];if(J){J._fireEvent(\"onUpdate\",P);return J._fireEvent(N,R.slice(3))}return}if(S==\"onPlaylistReplace\"){G=[];var O=0;n(P,function(){G.push(new i(this,O++,x))})}if(S==\"onClipAdd\"){if(P.isInStream){return}P=new i(P,N,x);G.splice(N,0,P);for(L=N+1;L<G.length;L++){G[L].index++}}var Q=true;if(typeof P==\"number\"&&P<G.length){D=P;var K=G[P];if(K){Q=K._fireEvent(S,N,M)}if(!K||Q!==false){Q=t._fireEvent(S,N,M,K)}}n(y[S],function(){Q=this.call(x,P,N);if(this.cached){y[S].splice(L,1)}if(Q===false){return false}L++});return Q};function C(){if($f(r)){$f(r).getParent().innerHTML=\"\";q=$f(r).getIndex();a[q]=x}else{a.push(x);q=a.length-1}B=parseInt(r.style.height,10)||r.clientHeight;F=r.id||\"fp\"+f();s=H.id||F+\"_api\";H.id=s;v=r.innerHTML;if(typeof u==\"string\"){u={clip:{url:u}}}u.playerId=F;u.clip=u.clip||{};if(r.getAttribute(\"href\",2)&&!u.clip.url){u.clip.url=r.getAttribute(\"href\",2)}if(u.clip.url){u.clip.url=e(u.clip.url)}t=new i(u.clip,-1,x);u.playlist=u.playlist||[u.clip];var J=0;n(u.playlist,function(){var M=this;if(typeof M==\"object\"&&M.length){M={url:\"\"+M}}if(M.url){M.url=e(M.url)}n(u.clip,function(N,O){if(O!==undefined&&M[N]===undefined&&typeof O!=\"function\"){M[N]=O}});u.playlist[J]=M;M=new i(M,J,x);G.push(M);J++});n(u,function(M,N){if(typeof N==\"function\"){if(t[M]){t[M](N)}else{k(y,M,N)}delete u[M]}});n(u.plugins,function(M,N){if(N){z[M]=new m(M,N,x)}});if(!u.plugins||u.plugins.controls===undefined){z.controls=new m(\"controls\",null,x)}z.canvas=new m(\"canvas\",null,x);v=r.innerHTML;function L(M){if(\/iPad|iPhone|iPod\/i.test(navigator.userAgent)&&!\/.flv$\/i.test(G[0].url)&&!K()){return true}if(!x.isLoaded()&&x._fireEvent(\"onBeforeClick\")!==false){x.load()}return g(M)}function K(){return x.hasiPadSupport&&x.hasiPadSupport()}function I(){if(v.replace(\/\\s\/g,\"\")!==\"\"){if(r.addEventListener){r.addEventListener(\"click\",L,false)}else{if(r.attachEvent){r.attachEvent(\"onclick\",L)}}}else{if(r.addEventListener&&!K()){r.addEventListener(\"click\",g,false)}x.load()}}setTimeout(I,0)}if(typeof r==\"string\"){var A=c(r);if(!A){throw\"Flowplayer cannot access element: \"+r}r=A;C()}else{C()}}var a=[];function d(p){this.length=p.length;this.each=function(r){n(p,r)};this.size=function(){return p.length};var q=this;for(name in b.prototype){q[name]=function(){var r=arguments;q.each(function(){this[name].apply(this,r)})}}}window.flowplayer=window.$f=function(){var q=null;var p=arguments[0];if(!arguments.length){n(a,function(){if(this.isLoaded()){q=this;return false}});return q||a[0]}if(arguments.length==1){if(typeof p==\"number\"){return a[p]}else{if(p==\"*\"){return new d(a)}n(a,function(){if(this.id()==p.id||this.id()==p||this.getParent()==p){q=this;return false}});return q}}if(arguments.length>1){var u=arguments[1],r=(arguments.length==3)?arguments[2]:{};if(typeof u==\"string\"){u={src:u}}u=j({bgcolor:\"#000000\",version:[10,1],expressInstall:\"http:\/\/releases.flowplayer.org\/swf\/expressinstall.swf\",cachebusting:false},u);if(typeof p==\"string\"){if(p.indexOf(\".\")!=-1){var t=[];n(o(p),function(){t.push(new b(this,l(u),l(r)))});return new d(t)}else{var s=c(p);return new b(s!==null?s:l(p),l(u),l(r))}}else{if(p){return new b(p,l(u),l(r))}}}return null};j(window.$f,{fireEvent:function(){var q=[].slice.call(arguments);var r=$f(q[0]);return r?r._fireEvent(q.slice(1)):null},addPlugin:function(p,q){b.prototype[p]=q;return $f},each:n,extend:j});if(typeof jQuery==\"function\"){jQuery.fn.flowplayer=function(r,q){if(!arguments.length||typeof arguments[0]==\"number\"){var p=[];this.each(function(){var s=$f(this);if(s){p.push(s)}});return arguments.length?p[arguments[0]]:new d(p)}return this.each(function(){$f(this,l(r),q?l(q):{})})}}}();!function(){var h=document.all,j=\"http:\/\/get.adobe.com\/flashplayer\",c=typeof jQuery==\"function\",e=\/(\\d+)[^\\d]+(\\d+)[^\\d]*(\\d*)\/,b={width:\"100%\",height:\"100%\",id:\"_\"+(\"\"+Math.random()).slice(9),allowfullscreen:true,allowscriptaccess:\"always\",quality:\"high\",version:[3,0],onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(window.attachEvent){window.attachEvent(\"onbeforeunload\",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function i(m,l){if(l){for(var f in l){if(l.hasOwnProperty(f)){m[f]=l[f]}}}return m}function a(f,n){var m=[];for(var l in f){if(f.hasOwnProperty(l)){m[l]=n(f[l])}}return m}window.flashembed=function(f,m,l){if(typeof f==\"string\"){f=document.getElementById(f.replace(\"#\",\"\"))}if(!f){return}if(typeof m==\"string\"){m={src:m}}return new d(f,i(i({},b),m),l)};var g=i(window.flashembed,{conf:b,getVersion:function(){var m,f;try{f=navigator.plugins[\"Shockwave Flash\"].description.slice(16)}catch(o){try{m=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");f=m&&m.GetVariable(\"$version\")}catch(n){try{m=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");f=m&&m.GetVariable(\"$version\")}catch(l){}}}f=e.exec(f);return f?[1*f[1],1*f[(f[1]*1>9?2:3)]*1]:[0,0]},asString:function(l){if(l===null||l===undefined){return null}var f=typeof l;if(f==\"object\"&&l.push){f=\"array\"}switch(f){case\"string\":l=l.replace(new RegExp('([\"\\\\\\\\])',\"g\"),\"\\\\$1\");l=l.replace(\/^\\s?(\\d+\\.?\\d*)%\/,\"$1pct\");return'\"'+l+'\"';case\"array\":return\"[\"+a(l,function(o){return g.asString(o)}).join(\",\")+\"]\";case\"function\":return'\"function()\"';case\"object\":var m=[];for(var n in l){if(l.hasOwnProperty(n)){m.push('\"'+n+'\":'+g.asString(l[n]))}}return\"{\"+m.join(\",\")+\"}\"}return String(l).replace(\/\\s\/g,\" \").replace(\/\\'\/g,'\"')},getHTML:function(o,l){o=i({},o);var n='<object width=\"'+o.width+'\" height=\"'+o.height+'\" id=\"'+o.id+'\" name=\"'+o.id+'\"';if(o.cachebusting){o.src+=((o.src.indexOf(\"?\")!=-1?\"&\":\"?\")+Math.random())}if(o.w3c||!h){n+=' data=\"'+o.src+'\" type=\"application\/x-shockwave-flash\"'}else{n+=' classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'}n+=\">\";if(o.w3c||h){n+='<param name=\"movie\" value=\"'+o.src+'\" \/>'}o.width=o.height=o.id=o.w3c=o.src=null;o.onFail=o.version=o.expressInstall=null;for(var m in o){if(o[m]){n+='<param name=\"'+m+'\" value=\"'+o[m]+'\" \/>'}}var p=\"\";if(l){for(var f in l){if(l[f]){var q=l[f];p+=f+\"=\"+(\/function|object\/.test(typeof q)?g.asString(q):q)+\"&\"}}p=p.slice(0,-1);n+='<param name=\"flashvars\" value=\\''+p+\"' \/>\"}n+=\"<\/object>\";return n},isSupported:function(f){return k[0]>f[0]||k[0]==f[0]&&k[1]>=f[1]}});var k=g.getVersion();function d(f,n,m){if(g.isSupported(n.version)){f.innerHTML=g.getHTML(n,m)}else{if(n.expressInstall&&g.isSupported([6,65])){f.innerHTML=g.getHTML(i(n,{src:n.expressInstall}),{MMredirectURL:encodeURIComponent(location.href),MMplayerType:\"PlugIn\",MMdoctitle:document.title})}else{if(!f.innerHTML.replace(\/\\s\/g,\"\")){f.innerHTML=\"<h2>Flash version \"+n.version+\" or greater is required<\/h2><h3>\"+(k[0]>0?\"Your version is \"+k:\"You have no flash plugin installed\")+\"<\/h3>\"+(f.tagName==\"A\"?\"<p>Click here to download latest version<\/p>\":\"<p>Download latest version from <a href='\"+j+\"'>here<\/a><\/p>\");if(f.tagName==\"A\"||f.tagName==\"DIV\"){f.onclick=function(){location.href=j}}}if(n.onFail){var l=n.onFail.call(this);if(typeof l==\"string\"){f.innerHTML=l}}}}if(h){window[n.id]=document.getElementById(n.id)}i(this,{getRoot:function(){return f},getOptions:function(){return n},getConf:function(){return m},getApi:function(){return f.firstChild}})}if(c){jQuery.tools=jQuery.tools||{version:\"3.2.12\"};jQuery.tools.flashembed={conf:b};jQuery.fn.flashembed=function(l,f){return this.each(function(){$(this).data(\"flashembed\",flashembed(this,l,f))})}}}();","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Video-1.3\/scripts\/youtube.js?ver=1.3.10":"\n\/** @namespace H5P *\/\nH5P.VideoYouTube = (function ($) {\n\n  \/**\n   * YouTube video player for H5P.\n   *\n   * @class\n   * @param {Array} sources Video files to use\n   * @param {Object} options Settings for the player\n   * @param {Object} l10n Localization strings\n   *\/\n  function YouTube(sources, options, l10n) {\n    var self = this;\n\n    var player;\n    var playbackRate = 1;\n    var id = 'h5p-youtube-' + numInstances;\n    numInstances++;\n\n    var $wrapper = $('<div\/>');\n    var $placeholder = $('<div\/>', {\n      id: id,\n      text: l10n.loading\n    }).appendTo($wrapper);\n\n    \/\/ Optional placeholder\n    \/\/ var $placeholder = $('<iframe id=\"' + id + '\" type=\"text\/html\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/' + getId(sources[0].path) + '?enablejsapi=1&origin=' + encodeURIComponent(ORIGIN) + '&autoplay=' + (options.autoplay ? 1 : 0) + '&controls=' + (options.controls ? 1 : 0) + '&disabledkb=' + (options.controls ? 0 : 1) + '&fs=0&loop=' + (options.loop ? 1 : 0) + '&rel=0&showinfo=0&iv_load_policy=3\" frameborder=\"0\"><\/iframe>').appendTo($wrapper);\n\n    \/**\n     * Use the YouTube API to create a new player\n     *\n     * @private\n     *\/\n    var create = function () {\n      if (!$placeholder.is(':visible') || player !== undefined) {\n        return;\n      }\n\n      if (window.YT === undefined) {\n        \/\/ Load API first\n        loadAPI(create);\n        return;\n      }\n      if (YT.Player === undefined) {\n        return;\n      }\n\n      var width = $wrapper.width();\n      if (width < 200) {\n        width = 200;\n      }\n\n      var loadCaptionsModule = true;\n\n      var videoId = getId(sources[0].path);\n\n      player = new YT.Player(id, {\n        width: width,\n        height: width * (9\/16),\n        videoId: videoId,\n        playerVars: {\n          origin: ORIGIN,\n          autoplay: options.autoplay ? 1 : 0,\n          controls: options.controls ? 1 : 0,\n          disablekb: options.controls ? 0 : 1,\n          fs: 0,\n          playlist: options.loop ? videoId : undefined,\n          rel: 0,\n          showinfo: 0,\n          iv_load_policy: 3,\n          wmode: \"opaque\",\n          start: options.startAt,\n          playsinline: 1\n        },\n        events: {\n          onReady: function () {\n            self.trigger('ready');\n            self.trigger('loaded');\n          },\n          onApiChange: function () {\n            if (loadCaptionsModule) {\n              loadCaptionsModule = false;\n\n              \/\/ Always load captions\n              player.loadModule('captions');\n            }\n\n            var trackList;\n            try {\n              \/\/ Grab tracklist from player\n              trackList = player.getOption('captions', 'tracklist');\n            }\n            catch (err) {}\n            if (trackList && trackList.length) {\n\n              \/\/ Format track list into valid track options\n              var trackOptions = [];\n              for (var i = 0; i < trackList.length; i++) {\n                trackOptions.push(new H5P.Video.LabelValue(trackList[i].displayName, trackList[i].languageCode));\n              }\n\n              \/\/ Captions are ready for loading\n              self.trigger('captions', trackOptions);\n            }\n          },\n          onStateChange: function (state) {\n            if (state.data > -1 && state.data < 4) {\n\n              \/\/ Fix for keeping playback rate in IE11\n              if (H5P.Video.IE11_PLAYBACK_RATE_FIX && state.data === H5P.Video.PLAYING && playbackRate !== 1) {\n                \/\/ YT doesn't know that IE11 changed the rate so it must be reset before it's set to the correct value\n                player.setPlaybackRate(1);\n                player.setPlaybackRate(playbackRate);\n              }\n              \/\/ End IE11 fix\n\n              self.trigger('stateChange', state.data);\n            }\n          },\n          onPlaybackQualityChange: function (quality) {\n            self.trigger('qualityChange', quality.data);\n          },\n          onPlaybackRateChange: function (playbackRate) {\n            self.trigger('playbackRateChange', playbackRate.data);\n          },\n          onError: function (error) {\n            var message;\n            switch (error.data) {\n              case 2:\n                message = l10n.invalidYtId;\n                break;\n\n              case 100:\n                message = l10n.unknownYtId;\n                break;\n\n              case 101:\n              case 150:\n                message = l10n.restrictedYt;\n                break;\n\n              default:\n                message = l10n.unknownError + ' ' + error.data;\n                break;\n            }\n            self.trigger('error', message);\n          }\n        }\n      });\n    };\n\n    \/**\n     * Indicates if the video must be clicked for it to start playing.\n     * For instance YouTube videos on iPad must be pressed to start playing.\n     *\n     * @public\n     *\/\n    self.pressToPlay = navigator.userAgent.match(\/iPad\/i) ? true : false;\n\n    \/**\n    * Appends the video player to the DOM.\n    *\n    * @public\n    * @param {jQuery} $container\n    *\/\n    self.appendTo = function ($container) {\n      $container.addClass('h5p-youtube').append($wrapper);\n      create();\n    };\n\n    \/**\n     * Get list of available qualities. Not available until after play.\n     *\n     * @public\n     * @returns {Array}\n     *\/\n    self.getQualities = function () {\n      if (!player || !player.getAvailableQualityLevels) {\n        return;\n      }\n\n      var qualities = player.getAvailableQualityLevels();\n      if (!qualities.length) {\n        return; \/\/ No qualities\n      }\n\n      \/\/ Add labels\n      for (var i = 0; i < qualities.length; i++) {\n        var quality = qualities[i];\n        var label = (LABELS[quality] !== undefined ? LABELS[quality] : 'Unknown'); \/\/ TODO: l10n\n        qualities[i] = {\n          name: quality,\n          label: LABELS[quality]\n        };\n      }\n\n      return qualities;\n    };\n\n    \/**\n     * Get current playback quality. Not available until after play.\n     *\n     * @public\n     * @returns {String}\n     *\/\n    self.getQuality = function () {\n      if (!player || !player.getPlaybackQuality) {\n        return;\n      }\n\n      var quality = player.getPlaybackQuality();\n      return quality === 'unknown' ? undefined : quality;\n    };\n\n    \/**\n     * Set current playback quality. Not available until after play.\n     * Listen to event \"qualityChange\" to check if successful.\n     *\n     * @public\n     * @params {String} [quality]\n     *\/\n    self.setQuality = function (quality) {\n      if (!player || !player.setPlaybackQuality) {\n        return;\n      }\n\n      player.setPlaybackQuality(quality);\n    };\n\n    \/**\n     * Start the video.\n     *\n     * @public\n     *\/\n    self.play = function () {\n      if (!player || !player.playVideo) {\n        self.on('ready', self.play);\n        return;\n      }\n\n      player.playVideo();\n    };\n\n    \/**\n     * Pause the video.\n     *\n     * @public\n     *\/\n    self.pause = function () {\n      self.off('ready', self.play);\n      if (!player || !player.pauseVideo) {\n        return;\n      }\n      player.pauseVideo();\n    };\n\n    \/**\n     * Seek video to given time.\n     *\n     * @public\n     * @param {Number} time\n     *\/\n    self.seek = function (time) {\n      if (!player || !player.seekTo) {\n        return;\n      }\n\n      player.seekTo(time, true);\n    };\n\n    \/**\n     * Get elapsed time since video beginning.\n     *\n     * @public\n     * @returns {Number}\n     *\/\n    self.getCurrentTime = function () {\n      if (!player || !player.getCurrentTime) {\n        return;\n      }\n\n      return player.getCurrentTime();\n    };\n\n    \/**\n     * Get total video duration time.\n     *\n     * @public\n     * @returns {Number}\n     *\/\n    self.getDuration = function () {\n      if (!player || !player.getDuration) {\n        return;\n      }\n\n      return player.getDuration();\n    };\n\n    \/**\n     * Get percentage of video that is buffered.\n     *\n     * @public\n     * @returns {Number} Between 0 and 100\n     *\/\n    self.getBuffered = function () {\n      if (!player || !player.getVideoLoadedFraction) {\n        return;\n      }\n\n      return player.getVideoLoadedFraction() * 100;\n    };\n\n    \/**\n     * Turn off video sound.\n     *\n     * @public\n     *\/\n    self.mute = function () {\n      if (!player || !player.mute) {\n        return;\n      }\n\n      player.mute();\n    };\n\n    \/**\n     * Turn on video sound.\n     *\n     * @public\n     *\/\n    self.unMute = function () {\n      if (!player || !player.unMute) {\n        return;\n      }\n\n      player.unMute();\n    };\n\n    \/**\n     * Check if video sound is turned on or off.\n     *\n     * @public\n     * @returns {Boolean}\n     *\/\n    self.isMuted = function () {\n      if (!player || !player.isMuted) {\n        return;\n      }\n\n      return player.isMuted();\n    };\n\n    \/**\n     * Return the video sound level.\n     *\n     * @public\n     * @returns {Number} Between 0 and 100.\n     *\/\n    self.getVolume = function () {\n      if (!player || !player.getVolume) {\n        return;\n      }\n\n      return player.getVolume();\n    };\n\n    \/**\n     * Set video sound level.\n     *\n     * @public\n     * @param {Number} level Between 0 and 100.\n     *\/\n    self.setVolume = function (level) {\n      if (!player || !player.setVolume) {\n        return;\n      }\n\n      player.setVolume(level);\n    };\n\n    \/**\n     * Get list of available playback rates.\n     *\n     * @public\n     * @returns {Array} available playback rates\n     *\/\n    self.getPlaybackRates = function () {\n      if (!player || !player.getAvailablePlaybackRates) {\n        return;\n      }\n\n      var playbackRates = player.getAvailablePlaybackRates();\n      if (!playbackRates.length) {\n        return; \/\/ No rates, but the array should contain at least 1\n      }\n\n      return playbackRates;\n    };\n\n    \/**\n     * Get current playback rate.\n     *\n     * @public\n     * @returns {Number} such as 0.25, 0.5, 1, 1.25, 1.5 and 2\n     *\/\n    self.getPlaybackRate = function () {\n      if (!player || !player.getPlaybackRate) {\n        return;\n      }\n\n      var playbackRate = player.getPlaybackRate();\n\t  return playbackRate;\n    };\n\n    \/**\n     * Set current playback rate.\n     * Listen to event \"playbackRateChange\" to check if successful.\n     *\n     * @public\n     * @params {Number} suggested rate that may be rounded to supported values\n     *\/\n    self.setPlaybackRate = function (newPlaybackRate) {\n      if (!player || !player.setPlaybackRate) {\n        return;\n      }\n\n      playbackRate = newPlaybackRate;\n      player.setPlaybackRate(newPlaybackRate);\n    };\n\n    \/**\n     * Set current captions track.\n     *\n     * @param {H5P.Video.LabelValue} Captions track to show during playback\n     *\/\n    self.setCaptionsTrack = function (track) {\n      player.setOption('captions', 'track', track ? {languageCode: track.value} : {});\n    };\n\n    \/**\n     * Figure out which captions track is currently used.\n     *\n     * @return {H5P.Video.LabelValue} Captions track\n     *\/\n    self.getCaptionsTrack = function () {\n      var track = player.getOption('captions', 'track');\n      return (track.languageCode ? new H5P.Video.LabelValue(track.displayName, track.languageCode) : null);\n    };\n\n    \/\/ Respond to resize events by setting the YT player size.\n    self.on('resize', function () {\n      if (!$wrapper.is(':visible')) {\n        return;\n      }\n\n      if (!player) {\n        \/\/ Player isn't created yet. Try again.\n        create();\n        return;\n      }\n\n      \/\/ Use as much space as possible\n      $wrapper.css({\n        width: '100%',\n        height: '100%'\n      });\n\n      var width = $wrapper[0].clientWidth;\n      var height = options.fit ? $wrapper[0].clientHeight : (width * (9\/16));\n\n      \/\/ Set size\n      $wrapper.css({\n        width: width + 'px',\n        height: height + 'px'\n      });\n\n      player.setSize(width, height);\n    });\n  }\n\n  \/**\n   * Check to see if we can play any of the given sources.\n   *\n   * @public\n   * @static\n   * @param {Array} sources\n   * @returns {Boolean}\n   *\/\n  YouTube.canPlay = function (sources) {\n    return getId(sources[0].path);\n  };\n\n  \/**\n   * Find id of YouTube video from given URL.\n   *\n   * @private\n   * @param {String} url\n   * @returns {String} YouTube video identifier\n   *\/\n\n  var getId = function (url) {\n    \/\/ Has some false positives, but should cover all regular URLs that people can find\n    var matches = url.match(\/(?:(?:youtube.com\\\/(?:attribution_link\\?(?:\\S+))?(?:v\\\/|embed\\\/|watch\\\/|(?:user\\\/(?:\\S+)\\\/)?watch(?:\\S+)v\\=))|(?:youtu.be\\\/|y2u.be\\\/))([A-Za-z0-9_-]{11})\/i);\n    if (matches && matches[1]) {\n      return matches[1];\n    }\n  };\n\n  \/**\n   * Load the IFrame Player API asynchronously.\n   *\/\n  var loadAPI = function (loaded) {\n    if (window.onYouTubeIframeAPIReady !== undefined) {\n      \/\/ Someone else is loading, hook in\n      var original = window.onYouTubeIframeAPIReady;\n      window.onYouTubeIframeAPIReady = function (id) {\n        loaded(id);\n        original(id);\n      };\n    }\n    else {\n      \/\/ Load the API our self\n      var tag = document.createElement('script');\n      tag.src = \"https:\/\/www.youtube.com\/iframe_api\";\n      var firstScriptTag = document.getElementsByTagName('script')[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n      window.onYouTubeIframeAPIReady = loaded;\n    }\n  };\n\n  \/** @constant {Object} *\/\n  var LABELS = {\n    highres: '2160p',\n    hd1440: '1440p',\n    hd1080: '1080p',\n    hd720: '720p',\n    large: '480p',\n    medium: '360p',\n    small: '240p',\n    tiny: '144p',\n    auto: 'Auto'\n  };\n\n  \/** @private *\/\n  var numInstances = 0;\n\n  \/\/ Extract the current origin (used for security)\n  var ORIGIN = window.location.href.match(\/http[s]?:\\\/\\\/[^\\\/]+\/)[0];\n\n  return YouTube;\n})(H5P.jQuery);\n\n\/\/ Register video handler\nH5P.videoHandlers = H5P.videoHandlers || [];\nH5P.videoHandlers.push(H5P.VideoYouTube);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Video-1.3\/scripts\/html5.js?ver=1.3.10":"\n\/** @namespace H5P *\/\nH5P.VideoHtml5 = (function ($) {\n\n  \/**\n   * HTML5 video player for H5P.\n   *\n   * @class\n   * @param {Array} sources Video files to use\n   * @param {Object} options Settings for the player\n   * @param {Object} l10n Localization strings\n   *\/\n  function Html5(sources, options, l10n) {\n    var self = this;\n\n    \/**\n     * Displayed when the video is buffering\n     * @private\n     *\/\n    var $throbber = $('<div\/>', {\n      'class': 'h5p-video-loading'\n    });\n\n    \/**\n     * Used to display error messages\n     * @private\n     *\/\n    var $error = $('<div\/>', {\n      'class': 'h5p-video-error'\n    });\n\n    \/**\n     * Keep track of current state when changing quality.\n     * @private\n     *\/\n    var stateBeforeChangingQuality;\n    var currentTimeBeforeChangingQuality;\n\n    \/**\n     * Avoids firing the same event twice.\n     * @private\n     *\/\n    var lastState;\n\n    \/**\n     * Keeps track whether or not the video has been loaded.\n     * @private\n     *\/\n    var isLoaded = false;\n\n    \/**\n     *\n     * @private\n     *\/\n    var playbackRate = 1;\n    var skipRateChange = false;\n\n    \/\/ Create player\n    var video = document.createElement('video');\n\n    \/\/ Sort sources into qualities\n    var qualities = getQualities(sources, video);\n\n    \/\/ Select quality and source\n    var currentQuality = getPreferredQuality();\n    if (currentQuality === undefined || qualities[currentQuality] === undefined) {\n      \/\/ No preferred quality, pick the first.\n      for (currentQuality in qualities) {\n        if (qualities.hasOwnProperty(currentQuality)) {\n          break;\n        }\n      }\n    }\n    video.src = qualities[currentQuality].source.path;\n\n    \/\/ Setting webkit-playsinline, which makes iOS 10 beeing able to play video\n    \/\/ inside browser.\n    video.setAttribute('webkit-playsinline', '');\n    video.setAttribute('playsinline', '');\n    video.setAttribute('preload', 'metadata');\n\n    \/\/ Set options\n    video.disableRemotePlayback = (options.disableRemotePlayback ? true : false);\n    video.controls = (options.controls ? true : false);\n    video.autoplay = (options.autoplay ? true : false);\n    video.loop = (options.loop ? true : false);\n    video.className = 'h5p-video';\n    video.style.display = 'block';\n\n    if (options.fit) {\n      \/\/ Style is used since attributes with relative sizes aren't supported by IE9.\n      video.style.width = '100%';\n      video.style.height = '100%';\n    }\n    \/\/ Add poster if provided\n    if (options.poster) {\n      video.poster = options.poster;\n    }\n\n    \/**\n     * Register track to video\n     *\n     * @param {Object} trackData Track object\n     * @param {string} trackData.kind Kind of track\n     * @param {Object} trackData.track Source path\n     * @param {string} [trackData.label] Label of track\n     * @param {string} [trackData.srcLang] Language code\n     *\/\n    var addTrack = function (trackData) {\n      \/\/ Skip invalid tracks\n      if (!trackData.kind || !trackData.track.path) {\n        return;\n      }\n\n      var track = document.createElement('track');\n      track.kind = trackData.kind;\n      track.src = trackData.track.path;\n      if (trackData.label) {\n        track.label = trackData.label;\n      }\n\n      if (trackData.srcLang) {\n        track.srcLang = trackData.srcLang;\n      }\n\n      return track;\n    };\n\n    \/\/ Register tracks\n    options.tracks.forEach(function (track, i) {\n      var trackElement = addTrack(track);\n      if (i === 0) {\n        trackElement.default = true;\n      }\n      if (trackElement) {\n        video.appendChild(trackElement);\n      }\n    });\n\n    \/**\n     * Helps registering events.\n     *\n     * @private\n     * @param {String} native Event name\n     * @param {String} h5p Event name\n     * @param {String} [arg] Optional argument\n     *\/\n    var mapEvent = function (native, h5p, arg) {\n      video.addEventListener(native, function () {\n        switch (h5p) {\n          case 'stateChange':\n            if (lastState === arg) {\n              return; \/\/ Avoid firing event twice.\n            }\n\n            var validStartTime = options.startAt && options.startAt > 0;\n            if (arg === H5P.Video.PLAYING && validStartTime) {\n              video.currentTime = options.startAt;\n              delete options.startAt;\n            }\n\n            break;\n\n          case 'loaded':\n            isLoaded = true;\n\n            if (stateBeforeChangingQuality !== undefined) {\n              return; \/\/ Avoid loaded event when changing quality.\n            }\n\n            \/\/ Remove any errors\n            if ($error.is(':visible')) {\n              $error.remove();\n            }\n\n            if (OLD_ANDROID_FIX) {\n              var andLoaded = function () {\n                video.removeEventListener('durationchange', andLoaded, false);\n                \/\/ On Android seeking isn't ready until after play.\n                self.trigger(h5p);\n              };\n              video.addEventListener('durationchange', andLoaded, false);\n              return;\n            }\n            break;\n\n          case 'error':\n            \/\/ Handle error and get message.\n            arg = error(arguments[0], arguments[1]);\n            break;\n\n          case 'playbackRateChange':\n\n            \/\/ Fix for keeping playback rate in IE11\n            if (skipRateChange) {\n              skipRateChange = false;\n              return; \/\/ Avoid firing event when changing back\n            }\n            if (H5P.Video.IE11_PLAYBACK_RATE_FIX && playbackRate != video.playbackRate) { \/\/ Intentional\n              \/\/ Prevent change in playback rate not triggered by the user\n              video.playbackRate = playbackRate;\n              skipRateChange = true;\n              return;\n            }\n            \/\/ End IE11 fix\n\n            arg = self.getPlaybackRate();\n            break;\n        }\n        self.trigger(h5p, arg);\n      }, false);\n    };\n\n    \/**\n     * Handle errors from the video player.\n     *\n     * @private\n     * @param {Object} code Error\n     * @param {String} [message]\n     * @returns {String} Human readable error message.\n     *\/\n    var error = function (code, message) {\n      if (code instanceof Event) {\n\n        \/\/ No error code\n        if (!code.target.error) {\n          return '';\n        }\n\n        switch (code.target.error.code) {\n          case MediaError.MEDIA_ERR_ABORTED:\n            message = l10n.aborted;\n            break;\n          case MediaError.MEDIA_ERR_NETWORK:\n            message = l10n.networkFailure;\n            break;\n          case MediaError.MEDIA_ERR_DECODE:\n            message = l10n.cannotDecode;\n            break;\n          case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\n            message = l10n.formatNotSupported;\n            break;\n          case MediaError.MEDIA_ERR_ENCRYPTED:\n            message = l10n.mediaEncrypted;\n            break;\n        }\n      }\n      if (!message) {\n        message = l10n.unknownError;\n      }\n\n      \/\/ Hide throbber\n      $throbber.remove();\n\n      \/\/ Display error message to user\n      $error.text(message).insertAfter(video);\n\n      \/\/ Pass message to our error event\n      return message;\n    };\n\n    \/**\n     * Appends the video player to the DOM.\n     *\n     * @public\n     * @param {jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      $container.append(video);\n    };\n\n    \/**\n     * Get list of available qualities. Not available until after play.\n     *\n     * @public\n     * @returns {Array}\n     *\/\n    self.getQualities = function () {\n      \/\/ Create reverse list\n      var options = [];\n      for (var q in qualities) {\n        if (qualities.hasOwnProperty(q)) {\n          options.splice(0, 0, {\n            name: q,\n            label: qualities[q].label\n          });\n        }\n      }\n\n      if (options.length < 2) {\n        \/\/ Do not return if only one quality.\n        return;\n      }\n\n      return options;\n    };\n\n    \/**\n     * Get current playback quality. Not available until after play.\n     *\n     * @public\n     * @returns {String}\n     *\/\n    self.getQuality = function () {\n      return currentQuality;\n    };\n\n    \/**\n     * Set current playback quality. Not available until after play.\n     * Listen to event \"qualityChange\" to check if successful.\n     *\n     * @public\n     * @params {String} [quality]\n     *\/\n    self.setQuality = function (quality) {\n      if (qualities[quality] === undefined || quality === currentQuality) {\n        return; \/\/ Invalid quality\n      }\n\n      \/\/ Keep track of last choice\n      setPreferredQuality(quality);\n\n      \/\/ Avoid multiple loaded events if changing quality multiple times.\n      if (!stateBeforeChangingQuality) {\n        \/\/ Keep track of last state\n        stateBeforeChangingQuality = lastState;\n\n        \/\/ Keep track of current time\n        currentTimeBeforeChangingQuality = video.currentTime;\n\n        \/\/ Seek and start video again after loading.\n        var loaded = function () {\n          video.removeEventListener('loadedmetadata', loaded, false);\n          if (OLD_ANDROID_FIX) {\n            var andLoaded = function () {\n              video.removeEventListener('durationchange', andLoaded, false);\n              \/\/ On Android seeking isn't ready until after play.\n              self.seek(currentTimeBeforeChangingQuality);\n            };\n            video.addEventListener('durationchange', andLoaded, false);\n          }\n          else {\n            \/\/ Seek to current time.\n            self.seek(currentTimeBeforeChangingQuality);\n          }\n\n          \/\/ Always play to get image.\n          video.play();\n\n          if (stateBeforeChangingQuality !== H5P.Video.PLAYING) {\n            \/\/ Do not resume playing\n            video.pause();\n          }\n\n          \/\/ Done changing quality\n          stateBeforeChangingQuality = undefined;\n\n          \/\/ Remove any errors\n          if ($error.is(':visible')) {\n            $error.remove();\n          }\n        };\n        video.addEventListener('loadedmetadata', loaded, false);\n      }\n\n      \/\/ Keep track of current quality\n      currentQuality = quality;\n      self.trigger('qualityChange', currentQuality);\n\n      \/\/ Display throbber\n      self.trigger('stateChange', H5P.Video.BUFFERING);\n\n      \/\/ Change source\n      video.src = qualities[quality].source.path; \/\/ (iPad does not support #t=).\n\n      \/\/ Remove poster so it will not show during quality change\n      video.removeAttribute('poster');\n    };\n\n    \/**\n     * Starts the video.\n     *\n     * @public\n     * @return {Promise|undefined} May return a Promise that resolves when\n     * play has been processed.\n     *\/\n    self.play = function () {\n      if ($error.is(':visible')) {\n        return;\n      }\n\n      if (!isLoaded) {\n        \/\/ Make sure video is loaded before playing\n        video.load();\n      }\n\n      return video.play();\n    };\n\n    \/**\n     * Pauses the video.\n     *\n     * @public\n     *\/\n    self.pause = function () {\n      video.pause();\n    };\n\n    \/**\n     * Seek video to given time.\n     *\n     * @public\n     * @param {Number} time\n     *\/\n    self.seek = function (time) {\n      if (lastState === undefined) {\n        \/\/ Make sure we always play before we seek to get an image.\n        \/\/ If not iOS devices will reset currentTime when pressing play.\n        video.play();\n        video.pause();\n      }\n\n      video.currentTime = time;\n    };\n\n    \/**\n     * Get elapsed time since video beginning.\n     *\n     * @public\n     * @returns {Number}\n     *\/\n    self.getCurrentTime = function () {\n      return video.currentTime;\n    };\n\n    \/**\n     * Get total video duration time.\n     *\n     * @public\n     * @returns {Number}\n     *\/\n    self.getDuration = function () {\n      if (isNaN(video.duration)) {\n        return;\n      }\n\n      return video.duration;\n    };\n\n    \/**\n     * Get percentage of video that is buffered.\n     *\n     * @public\n     * @returns {Number} Between 0 and 100\n     *\/\n    self.getBuffered = function () {\n      \/\/ Find buffer currently playing from\n      var buffered = 0;\n      for (var i = 0; i < video.buffered.length; i++) {\n        var from = video.buffered.start(i);\n        var to = video.buffered.end(i);\n\n        if (video.currentTime > from && video.currentTime < to) {\n          buffered = to;\n          break;\n        }\n      }\n\n      \/\/ To percentage\n      return buffered ? (buffered \/ video.duration) * 100 : 0;\n    };\n\n    \/**\n     * Turn off video sound.\n     *\n     * @public\n     *\/\n    self.mute = function () {\n      video.muted = true;\n    };\n\n    \/**\n     * Turn on video sound.\n     *\n     * @public\n     *\/\n    self.unMute = function () {\n      video.muted = false;\n    };\n\n    \/**\n     * Check if video sound is turned on or off.\n     *\n     * @public\n     * @returns {Boolean}\n     *\/\n    self.isMuted = function () {\n      return video.muted;\n    };\n\n    \/**\n     * Returns the video sound level.\n     *\n     * @public\n     * @returns {Number} Between 0 and 100.\n     *\/\n    self.getVolume = function () {\n      return video.volume * 100;\n    };\n\n    \/**\n     * Set video sound level.\n     *\n     * @public\n     * @param {Number} level Between 0 and 100.\n     *\/\n    self.setVolume = function (level) {\n      video.volume = level \/ 100;\n    };\n\n    \/**\n     * Get list of available playback rates.\n     *\n     * @public\n     * @returns {Array} available playback rates\n     *\/\n    self.getPlaybackRates = function () {\n      \/*\n       * not sure if there's a common rule about determining good speeds\n       * using Google's standard options via a constant for setting\n       *\/\n      var playbackRates = PLAYBACK_RATES;\n\n      return playbackRates;\n    };\n\n    \/**\n     * Get current playback rate.\n     *\n     * @public\n     * @returns {Number} such as 0.25, 0.5, 1, 1.25, 1.5 and 2\n     *\/\n    self.getPlaybackRate = function () {\n      return video.playbackRate;\n    };\n\n    \/**\n     * Set current playback rate.\n     * Listen to event \"playbackRateChange\" to check if successful.\n     *\n     * @public\n     * @params {Number} suggested rate that may be rounded to supported values\n     *\/\n    self.setPlaybackRate = function (newPlaybackRate) {\n      playbackRate = newPlaybackRate;\n      video.playbackRate = newPlaybackRate;\n    };\n\n    \/**\n     * Set current captions track.\n     *\n     * @param {H5P.Video.LabelValue} Captions track to show during playback\n     *\/\n    self.setCaptionsTrack = function (track) {\n      for (var i = 0; i < video.textTracks.length; i++) {\n        video.textTracks[i].mode = (track && track.value === i ? 'showing' : 'disabled');\n      }\n    };\n\n    \/**\n     * Figure out which captions track is currently used.\n     *\n     * @return {H5P.Video.LabelValue} Captions track\n     *\/\n    self.getCaptionsTrack = function () {\n      for (var i = 0; i < video.textTracks.length; i++) {\n        if (video.textTracks[i].mode === 'showing') {\n          return new H5P.Video.LabelValue(video.textTracks[i].label, i);\n        }\n      }\n\n      return null;\n    };\n\n    \/\/ Register event listeners\n    mapEvent('ended', 'stateChange', H5P.Video.ENDED);\n    mapEvent('playing', 'stateChange', H5P.Video.PLAYING);\n    mapEvent('pause', 'stateChange', H5P.Video.PAUSED);\n    mapEvent('waiting', 'stateChange', H5P.Video.BUFFERING);\n    mapEvent('loadedmetadata', 'loaded');\n    mapEvent('error', 'error');\n    mapEvent('ratechange', 'playbackRateChange');\n\n    if (!video.controls) {\n      \/\/ Disable context menu(right click) to prevent controls.\n      video.addEventListener('contextmenu', function (event) {\n        event.preventDefault();\n      }, false);\n    }\n\n    \/\/ Display throbber when buffering\/loading video.\n    self.on('stateChange', function (event) {\n      var state = event.data;\n      lastState = state;\n      if (state === H5P.Video.BUFFERING) {\n        $throbber.insertAfter(video);\n      }\n      else {\n        $throbber.remove();\n      }\n    });\n\n    \/\/ Load captions after the video is loaded\n    self.on('loaded', function () {\n      nextTick(function () {\n        var textTracks = [];\n        for (var i = 0; i < video.textTracks.length; i++) {\n          textTracks.push(new H5P.Video.LabelValue(video.textTracks[i].label, i));\n        }\n        if (textTracks.length) {\n          self.trigger('captions', textTracks);\n        }\n      });\n    });\n\n    \/\/ Video controls are ready\n    nextTick(function () {\n      self.trigger('ready');\n    });\n  }\n\n  \/**\n   * Check to see if we can play any of the given sources.\n   *\n   * @public\n   * @static\n   * @param {Array} sources\n   * @returns {Boolean}\n   *\/\n  Html5.canPlay = function (sources) {\n    var video = document.createElement('video');\n    if (video.canPlayType === undefined) {\n      return false; \/\/ Not supported\n    }\n\n    \/\/ Cycle through sources\n    for (var i = 0; i < sources.length; i++) {\n      var type = getType(sources[i]);\n      if (type && video.canPlayType(type) !== '') {\n        \/\/ We should be able to play this\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  \/**\n   * Find source type.\n   *\n   * @private\n   * @param {Object} source\n   * @returns {String}\n   *\/\n  var getType = function (source) {\n    var type = source.mime;\n    if (!type) {\n      \/\/ Try to get type from URL\n      var matches = source.path.match(\/\\.(\\w+)$\/);\n      if (matches && matches[1]) {\n        type = 'video\/' + matches[1];\n      }\n    }\n\n    if (type && source.codecs) {\n      \/\/ Add codecs\n      type += '; codecs=\"' + source.codecs + '\"';\n    }\n\n    return type;\n  };\n\n  \/**\n   * Sort sources into qualities.\n   *\n   * @private\n   * @static\n   * @param {Array} sources\n   * @param {Object} video\n   * @returns {Object} Quality mapping\n   *\/\n  var getQualities = function (sources, video) {\n    var qualities = {};\n    var qualityIndex = 1;\n    var lastQuality;\n\n    \/\/ Cycle through sources\n    for (var i = 0; i < sources.length; i++) {\n      var source = sources[i];\n\n      \/\/ Find and update type.\n      var type = source.type = getType(source);\n\n      \/\/ Check if we support this type\n      var isPlayable = type && (type === 'video\/unknown' || video.canPlayType(type) !== '');\n      if (!isPlayable) {\n        continue; \/\/ We cannot play this source\n      }\n\n      if (source.quality === undefined) {\n        \/**\n         * No quality metadata. Create a quality tag to separate multiple sources of the same type,\n         * e.g. if two mp4 files with different quality has been uploaded\n         *\/\n\n        if (lastQuality === undefined || qualities[lastQuality].source.type === type) {\n          \/\/ Create a new quality tag\n          source.quality = {\n            name: 'q' + qualityIndex,\n            label: (source.metadata && source.metadata.qualityName) ? source.metadata.qualityName : 'Quality ' + qualityIndex \/\/ TODO: l10n\n          };\n          qualityIndex++;\n        }\n        else {\n          \/**\n           * Assumes quality already exists in a different format.\n           * Uses existing label for this quality.\n           *\/\n          source.quality = qualities[lastQuality].source.quality;\n        }\n      }\n\n      \/\/ Log last quality\n      lastQuality = source.quality.name;\n\n      \/\/ Look to see if quality exists\n      var quality = qualities[lastQuality];\n      if (quality) {\n        \/\/ We have a source with this quality. Check if we have a better format.\n        if (source.mime.split('\/')[1] === PREFERRED_FORMAT) {\n          quality.source = source;\n        }\n      }\n      else {\n        \/\/ Add new source with quality.\n        qualities[source.quality.name] = {\n          label: source.quality.label,\n          source: source\n        };\n      }\n    }\n\n    return qualities;\n  };\n\n  \/**\n   * Set preferred video quality.\n   *\n   * @private\n   * @static\n   * @param {String} quality Index of preferred quality\n   *\/\n  var setPreferredQuality = function (quality) {\n    var settings = document.cookie.split(';');\n    for (var i = 0; i < settings.length; i++) {\n      var setting = settings[i].split('=');\n      if (setting[0] === 'H5PVideoQuality') {\n        setting[1] = quality;\n        settings[i] = setting.join('=');\n        document.cookie = settings.join(';');\n        return;\n      }\n    }\n\n    document.cookie = 'H5PVideoQuality=' + quality + '; ' + document.cookie;\n  };\n\n  \/**\n   * Get preferred video quality.\n   *\n   * @private\n   * @static\n   * @returns {String} Index of preferred quality\n   *\/\n  var getPreferredQuality = function () {\n    var quality, settings = document.cookie.split(';');\n    for (var i = 0; i < settings.length; i++) {\n      var setting = settings[i].split('=');\n      if (setting[0] === 'H5PVideoQuality') {\n        quality = setting[1];\n        break;\n      }\n    }\n\n    return quality;\n  };\n\n  \/**\n   * Helps schedule a task for the next tick.\n   * @param {function} task\n   *\/\n  var nextTick = function (task) {\n    setTimeout(task, 0);\n  };\n\n  \/** @constant {Boolean} *\/\n  var OLD_ANDROID_FIX = false;\n\n  \/** @constant {Boolean} *\/\n  var PREFERRED_FORMAT = 'mp4';\n\n  \/** @constant {Object} *\/\n  var PLAYBACK_RATES = [0.25, 0.5, 1, 1.25, 1.5, 2];\n\n  if (navigator.userAgent.indexOf('Android') !== -1) {\n    \/\/ We have Android, check version.\n    var version = navigator.userAgent.match(\/AppleWebKit\\\/(\\d+\\.?\\d*)\/);\n    if (version && version[1] && Number(version[1]) <= 534.30) {\n      \/\/ Include fix for devices running the native Android browser.\n      \/\/ (We don't know when video was fixed, so the number is just the lastest\n      \/\/ native android browser we found.)\n      OLD_ANDROID_FIX = true;\n    }\n  }\n  else {\n    if (navigator.userAgent.indexOf('Chrome') !== -1) {\n      \/\/ If we're using chrome on a device that isn't Android, prefer the webm\n      \/\/ format. This is because Chrome has trouble with some mp4 codecs.\n      PREFERRED_FORMAT = 'webm';\n    }\n  }\n\n  return Html5;\n})(H5P.jQuery);\n\n\/\/ Register video handler\nH5P.videoHandlers = H5P.videoHandlers || [];\nH5P.videoHandlers.push(H5P.VideoHtml5);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Video-1.3\/scripts\/flash.js?ver=1.3.10":"\n\/** @namespace H5P *\/\nH5P.VideoFlash = (function ($) {\n\n  \/**\n   * Flash video player for H5P.\n   *\n   * @class\n   * @param {Array} sources Video files to use\n   * @param {Object} options Settings for the player\n   *\/\n  function Flash(sources, options) {\n    var self = this;\n\n    \/\/ Player wrapper\n    var $wrapper = $('<div\/>', {\n      'class': 'h5p-video-flash',\n      css: {\n        width: '100%',\n        height: '100%'\n      }\n    });\n\n    \/**\n     * Used to display error messages\n     * @private\n     *\/\n    var $error = $('<div\/>', {\n      'class': 'h5p-video-error'\n    });\n\n    \/**\n    * Keep track of current state when changing quality.\n    * @private\n    *\/\n    var stateBeforeChangingQuality;\n    var currentTimeBeforeChangingQuality;\n\n    \/\/ Sort sources into qualities\n    \/\/var qualities = getQualities(sources);\n    var currentQuality;\n\n    \/\/ Create player options\n    var playerOptions = {\n      buffering: true,\n      clip: {\n        url: sources[0].path, \/\/ getPreferredQuality(),\n        autoPlay: options.autoplay,\n        autoBuffering: true,\n        scaling: 'fit',\n        onSeek: function () {\n          if (stateBeforeChangingQuality) {\n            \/\/ ????\n          }\n        },\n        onMetaData: function () {\n          setTimeout(function () {\n            if (stateBeforeChangingQuality !== undefined) {\n              fp.seek(currentTimeBeforeChangingQuality);\n              if (stateBeforeChangingQuality === H5P.Video.PLAYING) {\n                \/\/ Resume play\n                fp.play();\n              }\n\n              \/\/ Done changing quality\n              stateBeforeChangingQuality = undefined;\n\n              \/\/ Remove any errors\n              if ($error.is(':visible')) {\n                $error.remove();\n              }\n            }\n            else {\n              self.trigger('ready');\n              self.trigger('loaded');\n            }\n          }, 0); \/\/ Run on next tick\n        },\n        onBegin: function () {\n          self.trigger('stateChange', H5P.Video.PLAYING);\n        },\n        onResume: function () {\n          self.trigger('stateChange', H5P.Video.PLAYING);\n        },\n        onPause: function () {\n          self.trigger('stateChange', H5P.Video.PAUSED);\n        },\n        onFinish: function () {\n          self.trigger('stateChange', H5P.Video.ENDED);\n        },\n        onError: function (code, message) {\n          console.log('ERROR', code, message); \/\/ TODO\n          self.trigger('error', message);\n        }\n      },\n      plugins: {\n        controls: null\n      },\n      play: null, \/\/ Disable overlay controls\n      onPlaylistReplace: function () {\n        that.playlistReplaced();\n      }\n    };\n\n    if (options.controls) {\n      playerOptions.plugins.controls = {};\n      delete playerOptions.play;\n    }\n\n    var fp = flowplayer($wrapper[0], {\n      src: \"http:\/\/releases.flowplayer.org\/swf\/flowplayer-3.2.16.swf\",\n      wmode: \"opaque\"\n    }, playerOptions);\n\n    \/**\n     * Appends the video player to the DOM.\n     *\n     * @public\n     * @param {jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      $wrapper.appendTo($container);\n    };\n\n    \/**\n     * Get list of available qualities. Not available until after play.\n     *\n     * @public\n     * @returns {Array}\n     *\/\n    self.getQualities = function () {\n      return;\n    };\n\n    \/**\n     * Get current playback quality. Not available until after play.\n     *\n     * @public\n     * @returns {String}\n     *\/\n    self.getQuality = function () {\n      return currentQuality;\n    };\n\n    \/**\n     * Set current playback quality. Not available until after play.\n     * Listen to event \"qualityChange\" to check if successful.\n     *\n     * @public\n     * @params {String} [quality]\n     *\/\n    self.setQuality = function (quality) {\n      if (qualities[quality] === undefined || quality === currentQuality) {\n        return; \/\/ Invalid quality\n      }\n\n      \/\/ Keep track of last choice\n      setPreferredQuality(quality);\n\n      \/\/ Avoid multiple loaded events if changing quality multiple times.\n      if (!stateBeforeChangingQuality) {\n        \/\/ Keep track of last state\n        stateBeforeChangingQuality = lastState;\n\n        \/\/ Keep track of current time\n        currentTimeBeforeChangingQuality = video.currentTime;\n      }\n\n      \/\/ Keep track of current quality\n      currentQuality = quality;\n      self.trigger('qualityChange', currentQuality);\n\n      \/\/ Display throbber\n      self.trigger('stateChange', H5P.Video.BUFFERING);\n\n      \/\/ Change source\n      fp.setClip(qualities[quality].source.path);\n      fp.startBuffering();\n    };\n\n    \/**\n     * Starts the video.\n     *\n     * @public\n     *\/\n    self.play = function () {\n      if ($error.is(':visible')) {\n        return;\n      }\n\n      fp.play();\n    };\n\n    \/**\n     * Pauses the video.\n     *\n     * @public\n     *\/\n    self.pause = function () {\n      fp.pause();\n    };\n\n    \/**\n     * Seek video to given time.\n     *\n     * @public\n     * @param {Number} time\n     *\/\n    self.seek = function (time) {\n      fp.seek(time);\n    };\n\n    \/**\n     * Get elapsed time since video beginning.\n     *\n     * @public\n     * @returns {Number}\n     *\/\n    self.getCurrentTime = function () {\n      return fp.getTime();\n    };\n\n    \/**\n     * Get total video duration time.\n     *\n     * @public\n     * @returns {Number}\n     *\/\n    self.getDuration = function () {\n      return fp.getClip().metaData.duration;\n    };\n\n    \/**\n     * Get percentage of video that is buffered.\n     *\n     * @public\n     * @returns {Number} Between 0 and 100\n     *\/\n    self.getBuffered = function () {\n      return fp.getClip().buffer;\n    };\n\n    \/**\n     * Turn off video sound.\n     *\n     * @public\n     *\/\n    self.mute = function () {\n      fp.mute();\n    };\n\n    \/**\n     * Turn on video sound.\n     *\n     * @public\n     *\/\n    self.unMute = function () {\n      fp.unmute();\n    };\n\n    \/**\n     * Check if video sound is turned on or off.\n     *\n     * @public\n     * @returns {Boolean}\n     *\/\n    self.isMuted = function () {\n      return fp.muted;\n    };\n\n    \/**\n     * Returns the video sound level.\n     *\n     * @public\n     * @returns {Number} Between 0 and 100.\n     *\/\n    self.getVolume = function () {\n      return fp.volumeLevel * 100;\n    };\n\n    \/**\n     * Set video sound level.\n     *\n     * @public\n     * @param {Number} volume Between 0 and 100.\n     *\/\n    self.setVolume = function (level) {\n      fp.volume(level \/ 100);\n    };\n\n    \/\/ Handle resize events\n    self.on('resize', function () {\n      var $object = H5P.jQuery(fp.getParent()).children('object');\n      var clip = fp.getClip();\n\n      if (clip !== undefined) {\n        $object.css('height', $object.width() * (clip.metaData.height \/ clip.metaData.width));\n      }\n    });\n  }\n\n  \/**\n   * Check to see if we can play any of the given sources.\n   *\n   * @public\n   * @static\n   * @param {Array} sources\n   * @returns {Boolean}\n   *\/\n  Flash.canPlay = function (sources) {\n    \/\/ Cycle through sources\n    for (var i = 0; i < sources.length; i++) {\n      if (sources[i].mime === 'video\/mp4' || \/\\.mp4$\/.test(sources[i].mime)) {\n        return true; \/\/ We only play mp4\n      }\n    }\n  };\n\n  return Flash;\n})(H5P.jQuery);\n\n\/\/ Register video handler\nH5P.videoHandlers = H5P.videoHandlers || [];\nH5P.videoHandlers.push(H5P.VideoFlash);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Video-1.3\/scripts\/video.js?ver=1.3.10":"\n\/** @namespace H5P *\/\nH5P.Video = (function ($, ContentCopyrights, MediaCopyright, handlers) {\n\n  \/**\n   * The ultimate H5P video player!\n   *\n   * @class\n   * @param {Object} parameters Options for this library.\n   * @param {Object} parameters.visuals Visual options\n   * @param {Object} parameters.playback Playback options\n   * @param {Object} parameters.a11y Accessibility options\n   * @param {Boolean} [parameters.startAt] Start time of video\n   * @param {Number} id Content identifier\n   *\/\n  function Video(parameters, id) {\n    var self = this;\n\n    \/\/ Ref youtube.js - ipad & youtube - issue\n    self.pressToPlay = false;\n\n    \/\/ Initialize event inheritance\n    H5P.EventDispatcher.call(self);\n\n    \/\/ Default language localization\n    parameters = $.extend(true, parameters, {\n      l10n: {\n        name: 'Video',\n        loading: 'Video player loading...',\n        noPlayers: 'Found no video players that supports the given video format.',\n        noSources: 'Video is missing sources.',\n        aborted: 'Media playback has been aborted.',\n        networkFailure: 'Network failure.',\n        cannotDecode: 'Unable to decode media.',\n        formatNotSupported: 'Video format not supported.',\n        mediaEncrypted: 'Media encrypted.',\n        unknownError: 'Unknown error.',\n        invalidYtId: 'Invalid YouTube ID.',\n        unknownYtId: 'Unable to find video with the given YouTube ID.',\n        restrictedYt: 'The owner of this video does not allow it to be embedded.'\n      }\n    });\n\n    parameters.a11y = parameters.a11y || [];\n    parameters.playback = parameters.playback || {};\n    parameters.visuals = parameters.visuals || {};\n\n    \/** @private *\/\n    var sources = [];\n    if (parameters.sources) {\n      for (var i = 0; i < parameters.sources.length; i++) {\n        \/\/ Clone to avoid changing of parameters.\n        var source = $.extend(true, {}, parameters.sources[i]);\n\n        \/\/ Create working URL without html entities.\n        source.path = H5P.getPath($cleaner.html(source.path).text(), id);\n        sources.push(source);\n      }\n    }\n\n    \/** @private *\/\n    var tracks = [];\n    parameters.a11y.forEach(function (track) {\n      \/\/ Clone to avoid changing of parameters.\n      var clone = $.extend(true, {}, track);\n\n      \/\/ Create working URL without html entities\n      if (clone.track && clone.track.path) {\n        clone.track.path = H5P.getPath($cleaner.html(clone.track.path).text(), id);\n        tracks.push(clone);\n      }\n    });\n\n    \/**\n     * Attaches the video handler to the given container.\n     * Inserts text if no handler is found.\n     *\n     * @public\n     * @param {jQuery} $container\n     *\/\n    self.attach = function ($container) {\n      $container.addClass('h5p-video').html('');\n\n      if (self.appendTo !== undefined) {\n        self.appendTo($container);\n      }\n      else {\n        if (sources.length) {\n          $container.text(parameters.l10n.noPlayers);\n        }\n        else {\n          $container.text(parameters.l10n.noSources);\n        }\n      }\n    };\n\n    \/**\n     * Gather copyright information for the current video.\n     *\n     * @public\n     * @returns {ContentCopyrights}\n     *\/\n    self.getCopyrights = function () {\n      if (!sources[0] || !sources[0].copyright) {\n        return;\n      }\n\n      \/\/ Use copyright information from H5P media field\n      var info = new ContentCopyrights();\n      info.addMedia(new MediaCopyright(sources[0].copyright));\n\n      return info;\n    };\n\n    \/\/ Resize the video when we know its aspect ratio\n    self.on('loaded', function () {\n      self.trigger('resize');\n    });\n\n    \/\/ Find player for video sources\n    if (sources.length) {\n      var html5Handler;\n      for (var i = 0; i < handlers.length; i++) {\n        var handler = handlers[i];\n        if (handler.canPlay !== undefined && handler.canPlay(sources)) {\n          handler.call(self, sources, {\n            controls: parameters.visuals.controls,\n            autoplay: parameters.playback.autoplay,\n            loop: parameters.playback.loop,\n            fit: parameters.visuals.fit,\n            poster: parameters.visuals.poster === undefined ? undefined : H5P.getPath(parameters.visuals.poster.path, id),\n            startAt: parameters.startAt || 0,\n            tracks: tracks,\n            disableRemotePlayback: (parameters.visuals.disableRemotePlayback || false)\n          }, parameters.l10n);\n          return;\n        }\n\n        if (handler === H5P.VideoHtml5) {\n          html5Handler = handler;\n        }\n      }\n\n      \/\/ Fallback to trying HTML5 player\n      if (html5Handler) {\n        html5Handler.call(self, sources, {\n          controls: parameters.visuals.controls,\n          autoplay: parameters.playback.autoplay,\n          loop: parameters.playback.loop,\n          fit: parameters.visuals.fit,\n          poster: parameters.visuals.poster === undefined ? undefined : H5P.getPath(parameters.visuals.poster.path, id),\n          startAt: parameters.startAt || 0,\n          tracks: tracks,\n          disableRemotePlayback: (parameters.visuals.disableRemotePlayback || false)\n        }, parameters.l10n);\n      }\n    }\n  }\n\n  \/\/ Extends the event dispatcher\n  Video.prototype = Object.create(H5P.EventDispatcher.prototype);\n  Video.prototype.constructor = Video;\n\n  \/\/ Player states\n  \/** @constant {Number} *\/\n  Video.ENDED = 0;\n  \/** @constant {Number} *\/\n  Video.PLAYING = 1;\n  \/** @constant {Number} *\/\n  Video.PAUSED = 2;\n  \/** @constant {Number} *\/\n  Video.BUFFERING = 3;\n  \/**\n   * When video is queued to start\n   * @constant {Number}\n   *\/\n  Video.VIDEO_CUED = 5;\n\n  \/\/ Used to convert between html and text, since URLs have html entities.\n  var $cleaner = H5P.jQuery('<div\/>');\n\n  \/**\n   * Help keep track of key value pairs used by the UI.\n   *\n   * @class\n   * @param {string} label\n   * @param {string} value\n   *\/\n  Video.LabelValue = function (label, value) {\n    this.label = label;\n    this.value = value;\n  };\n\n  \/** @constant {Boolean} *\/\n  Video.IE11_PLAYBACK_RATE_FIX = (navigator.userAgent.match(\/Trident.*rv[ :]*11\\.\/) ? true : false);\n\n  return Video;\n})(H5P.jQuery, H5P.ContentCopyrights, H5P.MediaCopyright, H5P.videoHandlers || []);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Audio-1.2\/scripts\/audio.js?ver=1.2.12":"\nvar H5P = H5P || {};\n\n\/**\n * H5P audio module\n *\n * @external {jQuery} $ H5P.jQuery\n *\/\nH5P.Audio = (function ($) {\n  \/**\n  * @param {Object} params Options for this library.\n  * @param {Number} id Content identifier\n  * @returns {undefined}\n  *\/\n  function C(params, id) {\n    H5P.EventDispatcher.call(this);\n    this.contentId = id;\n    this.params = params;\n\n    this.params = $.extend({}, {\n      playerMode: 'minimalistic',\n      fitToWrapper: false,\n      controls: true,\n      autoplay: false,\n      audioNotSupported: \"Your browser does not support this audio\"\n    }, params);\n\n    \/\/ Use new copyright information if available. Fallback to old.\n    if (params.files !== undefined\n      && params.files[0] !== undefined\n      && params.files[0].copyright !== undefined) {\n\n      this.copyright = params.files[0].copyright;\n    }\n    else if (params.copyright !== undefined) {\n      this.copyright = params.copyright;\n    }\n    this.on('resize', this.resize, this);\n  }\n\n  C.prototype = Object.create(H5P.EventDispatcher.prototype);\n  C.prototype.constructor = C;\n\n  \/**\n   * Adds a minimalistic audio player with only \"play\" and \"pause\" functionality.\n   *\n   * @param {jQuery} $container Container for the player.\n   * @param {boolean} transparentMode true: the player is only visible when hovering over it; false: player's UI always visible\n   *\/\n  C.prototype.addMinimalAudioPlayer = function ($container, transparentMode) {\n    var INNER_CONTAINER = 'h5p-audio-inner';\n    var AUDIO_BUTTON = 'h5p-audio-minimal-button';\n    var PLAY_BUTTON = 'h5p-audio-minimal-play';\n    var PAUSE_BUTTON = 'h5p-audio-minimal-pause';\n\n    var self = this;\n    this.$container = $container;\n\n    self.$inner = $('<div\/>', {\n      'class': INNER_CONTAINER + (transparentMode ? ' h5p-audio-transparent' : '')\n    }).appendTo($container);\n\n    var audioButton = $('<button\/>', {\n      'class': AUDIO_BUTTON + \" \" + PLAY_BUTTON\n    }).appendTo(self.$inner)\n      .click( function () {\n        if (self.audio.paused) {\n          self.play();\n        } else {\n          self.pause();\n        }\n      });\n\n    \/\/Fit to wrapper\n    if (this.params.fitToWrapper) {\n      audioButton.css({\n        'width': '100%',\n        'height': '100%'\n      });\n    }\n\n    \/\/ cpAutoplay is passed from coursepresentation\n    if (this.params.autoplay) {\n      self.play();\n    }\n\n    \/\/Event listeners that change the look of the player depending on events.\n    self.audio.addEventListener('ended', function () {\n      audioButton.removeClass(PAUSE_BUTTON).addClass(PLAY_BUTTON);\n    });\n\n    self.audio.addEventListener('play', function () {\n      audioButton.removeClass(PLAY_BUTTON).addClass(PAUSE_BUTTON);\n    });\n\n    self.audio.addEventListener('pause', function () {\n      audioButton.removeClass(PAUSE_BUTTON).addClass(PLAY_BUTTON);\n    });\n\n    this.$audioButton = audioButton;\n    \/\/Scale icon to container\n    self.resize();\n  };\n\n  \/**\n   * Resizes the audio player icon when the wrapper is resized.\n   *\/\n  C.prototype.resize = function () {\n    \/\/ Find the smallest value of height and width, and use it to choose the font size.\n    if (this.params.fitToWrapper && this.$container && this.$container.width()) {\n      var w = this.$container.width();\n      var h = this.$container.height();\n      if (w < h) {\n        this.$audioButton.css({'font-size': w \/ 2 + 'px'});\n      }\n      else {\n        this.$audioButton.css({'font-size': h \/ 2 + 'px'});\n      }\n    }\n  };\n\n\n  return C;\n})(H5P.jQuery);\n\n\/**\n * Wipe out the content of the wrapper and put our HTML in it.\n *\n * @param {jQuery} $wrapper Our poor container.\n *\/\nH5P.Audio.prototype.attach = function ($wrapper) {\n  $wrapper.addClass('h5p-audio-wrapper');\n\n  \/\/ Check if browser supports audio.\n  var audio = document.createElement('audio');\n  if (audio.canPlayType === undefined) {\n    \/\/ Try flash\n    this.attachFlash($wrapper);\n    return;\n  }\n\n  \/\/ Add supported source files.\n  if (this.params.files !== undefined && this.params.files instanceof Object) {\n    for (var i = 0; i < this.params.files.length; i++) {\n      var file = this.params.files[i];\n\n      if (audio.canPlayType(file.mime)) {\n        var source = document.createElement('source');\n        source.src = H5P.getPath(file.path, this.contentId);\n        source.type = file.mime;\n        audio.appendChild(source);\n      }\n    }\n  }\n\n  if (!audio.children.length) {\n    \/\/ Try flash\n    this.attachFlash($wrapper);\n    return;\n  }\n\n  if (this.endedCallback !== undefined) {\n    audio.addEventListener('ended', this.endedCallback, false);\n  }\n\n  audio.className = 'h5p-audio';\n  audio.controls = this.params.controls === undefined ? true : this.params.controls;\n  audio.preload = 'auto';\n  audio.style.display = 'block';\n\n  if (this.params.fitToWrapper === undefined || this.params.fitToWrapper) {\n    audio.style.width = '100%';\n    if (!this.isRoot()) {\n      \/\/ Only set height if this isn't a root\n      audio.style.height = '100%';\n    }\n  }\n\n  this.audio = audio;\n\n  if (this.params.playerMode === 'minimalistic') {\n    audio.controls = false;\n    this.addMinimalAudioPlayer($wrapper, false);\n  }\n  else if (this.params.playerMode === 'transparent') {\n    audio.controls = false;\n    this.addMinimalAudioPlayer($wrapper, true);\n  }\n  else {\n    audio.autoplay = this.params.autoplay === undefined ? false : this.params.autoplay;\n    $wrapper.html(audio);\n  }\n};\n\n\/**\n * Attaches a flash audio player to the wrapper.\n *\n * @param {jQuery} $wrapper Our dear container.\n *\/\nH5P.Audio.prototype.attachFlash = function ($wrapper) {\n  if (this.params.files !== undefined && this.params.files instanceof Object) {\n    for (var i = 0; i < this.params.files.length; i++) {\n      var file = this.params.files[i];\n      if (file.mime === 'audio\/mpeg' || file.mime === 'audio\/mp3') {\n        var audioSource = H5P.getPath(file.path, this.contentId);\n        break;\n      }\n    }\n  }\n\n  if (audioSource === undefined) {\n    $wrapper.addClass('h5p-audio-not-supported');\n    $wrapper.html(\n      '<div class=\"h5p-audio-inner\">' +\n        '<div class=\"h5p-audio-not-supported-icon\"><span\/><\/div>' +\n        '<span>' + this.params.audioNotSupported + '<\/span>' +\n      '<\/div>'\n    );\n\n    if (this.endedCallback !== undefined) {\n      this.endedCallback();\n    }\n    return;\n  }\n\n  var options = {\n    buffering: true,\n    clip: {\n      url: window.location.protocol + '\/\/' + window.location.host + audioSource,\n      autoPlay: this.params.autoplay === undefined ? false : this.params.autoplay,\n      scaling: 'fit'\n    },\n    plugins: {\n      controls: null\n    }\n  };\n\n  if (this.params.controls === undefined || this.params.controls) {\n    options.plugins.controls = {\n      fullscreen: false,\n      autoHide: false\n    };\n  }\n\n  if (this.endedCallback !== undefined) {\n    options.clip.onFinish = this.endedCallback;\n    options.clip.onError = this.endedCallback;\n  }\n\n  this.flowplayer = flowplayer($wrapper[0], {\n    src: \"http:\/\/releases.flowplayer.org\/swf\/flowplayer-3.2.16.swf\",\n    wmode: \"opaque\"\n  }, options);\n};\n\n\/**\n * Stop the audio. TODO: Rename to pause?\n *\n * @returns {undefined}\n *\/\nH5P.Audio.prototype.stop = function () {\n  if (this.flowplayer !== undefined) {\n    this.flowplayer.stop().close().unload();\n  }\n  if (this.audio !== undefined) {\n    this.audio.pause();\n  }\n};\n\n\/**\n * Play\n *\/\nH5P.Audio.prototype.play = function () {\n  if (this.flowplayer !== undefined) {\n    this.flowplayer.play();\n  }\n  if (this.audio !== undefined) {\n    this.audio.play();\n  }\n};\n\n\/**\n * @public\n * Pauses the audio.\n *\/\nH5P.Audio.prototype.pause = function () {\n  if (this.audio !== undefined) {\n    this.audio.pause();\n  }\n};\n\n\/**\n * Gather copyright information for the current content.\n *\n * @returns {H5P.ContentCopyrights} Copyright information\n *\/\nH5P.Audio.prototype.getCopyrights = function () {\n  if (this.copyright === undefined) {\n    return;\n  }\n\n  var info = new H5P.ContentCopyrights();\n  info.addMedia(new H5P.MediaCopyright(this.copyright));\n\n  return info;\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Transition-1.0\/transition.js?ver=1.0.4":"\nvar H5P = H5P || {};\n\/**\n * Transition contains helper function relevant for transitioning\n *\/\nH5P.Transition = (function ($) {\n\n  \/**\n   * @class\n   * @namespace H5P\n   *\/\n  Transition = {};\n\n  \/**\n   * @private\n   *\/\n  Transition.transitionEndEventNames = {\n    'WebkitTransition': 'webkitTransitionEnd',\n    'transition':       'transitionend',\n    'MozTransition':    'transitionend',\n    'OTransition':      'oTransitionEnd',\n    'msTransition':     'MSTransitionEnd'\n  };\n\n  \/**\n   * @private\n   *\/\n  Transition.cache = [];\n\n  \/**\n   * Get the vendor property name for an event\n   *\n   * @function H5P.Transition.getVendorPropertyName\n   * @static\n   * @private\n   * @param  {string} prop Generic property name\n   * @return {string}      Vendor specific property name\n   *\/\n  Transition.getVendorPropertyName = function (prop) {\n\n    if (Transition.cache[prop] !== undefined) {\n      return Transition.cache[prop];\n    }\n\n    var div = document.createElement('div');\n\n    \/\/ Handle unprefixed versions (FF16+, for example)\n    if (prop in div.style) {\n      Transition.cache[prop] = prop;\n    }\n    else {\n      var prefixes = ['Moz', 'Webkit', 'O', 'ms'];\n      var prop_ = prop.charAt(0).toUpperCase() + prop.substr(1);\n\n      if (prop in div.style) {\n        Transition.cache[prop] = prop;\n      }\n      else {\n        for (var i = 0; i < prefixes.length; ++i) {\n          var vendorProp = prefixes[i] + prop_;\n          if (vendorProp in div.style) {\n            Transition.cache[prop] = vendorProp;\n            break;\n          }\n        }\n      }\n    }\n\n    return Transition.cache[prop];\n  };\n\n  \/**\n   * Get the name of the transition end event\n   *\n   * @static\n   * @private\n   * @return {string}  description\n   *\/\n  Transition.getTransitionEndEventName = function () {\n    return Transition.transitionEndEventNames[Transition.getVendorPropertyName('transition')] || undefined;\n  };\n\n  \/**\n   * Helper function for listening on transition end events\n   *\n   * @function H5P.Transition.onTransitionEnd\n   * @static\n   * @param  {domElement} $element The element which is transitioned\n   * @param  {function} callback The callback to be invoked when transition is finished\n   * @param  {number} timeout  Timeout in milliseconds. Fallback if transition event is never fired\n   *\/\n  Transition.onTransitionEnd = function ($element, callback, timeout) {\n    \/\/ Fallback on 1 second if transition event is not supported\/triggered\n    timeout = timeout || 1000;\n    Transition.transitionEndEventName = Transition.transitionEndEventName || Transition.getTransitionEndEventName();\n    var callbackCalled = false;\n\n    var doCallback = function () {\n      if (callbackCalled) {\n        return;\n      }\n      $element.off(Transition.transitionEndEventName, callback);\n      callbackCalled = true;\n      clearTimeout(timer);\n      callback();\n    };\n\n    var timer = setTimeout(function () {\n      doCallback();\n    }, timeout);\n\n    $element.on(Transition.transitionEndEventName, function () {\n      doCallback();\n    });\n  };\n\n  \/**\n   * Wait for a transition - when finished, invokes next in line\n   *\n   * @private\n   *\n   * @param {Object[]}    transitions             Array of transitions\n   * @param {H5P.jQuery}  transitions[].$element  Dom element transition is performed on\n   * @param {number=}     transitions[].timeout   Timeout fallback if transition end never is triggered\n   * @param {bool=}       transitions[].break     If true, sequence breaks after this transition\n   * @param {number}      index                   The index for current transition\n   *\/\n  var runSequence = function (transitions, index) {\n    if (index >= transitions.length) {\n      return;\n    }\n\n    var transition = transitions[index];\n    H5P.Transition.onTransitionEnd(transition.$element, function () {\n      if (transition.end) {\n        transition.end();\n      }\n      if (transition.break !== true) {\n        runSequence(transitions, index+1);\n      }\n    }, transition.timeout || undefined);\n  };\n\n  \/**\n   * Run a sequence of transitions\n   *\n   * @function H5P.Transition.sequence\n   * @static\n   * @param {Object[]}    transitions             Array of transitions\n   * @param {H5P.jQuery}  transitions[].$element  Dom element transition is performed on\n   * @param {number=}     transitions[].timeout   Timeout fallback if transition end never is triggered\n   * @param {bool=}       transitions[].break     If true, sequence breaks after this transition\n   *\/\n  Transition.sequence = function (transitions) {\n    runSequence(transitions, 0);\n  };\n\n  return Transition;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/Tether-1.0\/scripts\/tether.min.js?ver=1.0.2":"\nvar oldTether = window.Tether;\n!function(t,e){\"function\"==typeof define&&define.amd?define(e):\"object\"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){\"use strict\";function i(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function n(t){var e=getComputedStyle(t),o=e.position;if(\"fixed\"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if(\"undefined\"==typeof n||null===n)return i;var s=n.overflow,a=n.overflowX,f=n.overflowY;if(\/(auto|scroll)\/.test(s+f+a)&&(\"absolute\"!==o||[\"relative\",\"absolute\",\"fixed\"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,\"undefined\"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),\"undefined\"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement(\"div\");t.style.width=\"100%\",t.style.height=\"200px\";var e=document.createElement(\"div\");f(e.style,{position:\"absolute\",top:0,left:0,pointerEvents:\"none\",visibility:\"hidden\",width:\"200px\",height:\"150px\",overflow:\"hidden\"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow=\"scroll\";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if(\"undefined\"!=typeof t.classList)e.split(\" \").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp(\"(^| )\"+e.split(\" \").join(\"|\")+\"( |$)\",\"gi\"),i=u(t).replace(o,\" \");p(t,i)}}function l(t,e){if(\"undefined\"!=typeof t.classList)e.split(\" \").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(\" \"+e);p(t,o)}}function d(t,e){if(\"undefined\"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp(\"(^| )\"+e+\"( |$)\",\"gi\").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute(\"class\",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function g(t,e){var o=void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return\"undefined\"!=typeof performance&&\"undefined\"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;\"string\"==typeof o&&(o=parseFloat(o,10)),\"string\"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return\"string\"==typeof t.left&&-1!==t.left.indexOf(\"%\")&&(t.left=parseFloat(t.left,10)\/100*e.width),\"string\"==typeof t.top&&-1!==t.top.indexOf(\"%\")&&(t.top=parseFloat(t.top,10)\/100*e.height),t}function b(t,e){return\"scrollParent\"===e?e=t.scrollParent:\"window\"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),\"undefined\"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),\"Top\"===t||\"Left\"===t?e[o]+=parseFloat(i[\"border\"+t+\"Width\"]):e[o]-=parseFloat(i[\"border\"+t+\"Width\"])})}(),e}var w=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),C=void 0;\"undefined\"==typeof C&&(C={modules:[]});var O=function(){var t=0;return function(){return++t}}(),E={},x=function(t){var e=t._tetherZeroElement;\"undefined\"==typeof e&&(e=t.createElement(\"div\"),e.setAttribute(\"data-tether-id\",O()),f(e.style,{top:0,left:0,position:\"absolute\"}),t.body.appendChild(e),t._tetherZeroElement=e);var o=e.getAttribute(\"data-tether-id\");if(\"undefined\"==typeof E[o]){E[o]={};var i=e.getBoundingClientRect();for(var n in i)E[o][n]=i[n];T(function(){delete E[o]})}return E[o]},A=[],T=function(t){A.push(t)},S=function(){for(var t=void 0;t=A.pop();)t()},W=function(){function t(){i(this,t)}return w(t,[{key:\"on\",value:function(t,e,o){var i=void 0===arguments[3]?!1:arguments[3];\"undefined\"==typeof this.bindings&&(this.bindings={}),\"undefined\"==typeof this.bindings[t]&&(this.bindings[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})}},{key:\"once\",value:function(t,e,o){this.on(t,e,o,!0)}},{key:\"off\",value:function(t,e){if(\"undefined\"==typeof this.bindings||\"undefined\"==typeof this.bindings[t])if(\"undefined\"==typeof e)delete this.bindings[t];else for(var o=0;o<this.bindings[t].length;)this.bindings[t][o].handler===e?this.bindings[t].splice(o,1):++o}},{key:\"trigger\",value:function(t){if(\"undefined\"!=typeof this.bindings&&this.bindings[t])for(var e=0;e<this.bindings[t].length;){var o=this.bindings[t][e],i=o.handler,n=o.ctx,r=o.once,s=n;\"undefined\"==typeof s&&(s=this);for(var a=arguments.length,f=Array(a>1?a-1:0),h=1;a>h;h++)f[h-1]=arguments[h];i.apply(s,f),r?this.bindings[t].splice(e,1):++e}}}]),t}();C.Utils={getScrollParent:n,getBounds:r,getOffsetParent:s,extend:f,addClass:l,removeClass:h,hasClass:d,updateClasses:c,defer:T,flush:S,uniqueId:O,Evented:W,getScrollBarSize:a};var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a[\"return\"]&&a[\"return\"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),w=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}();if(\"undefined\"==typeof C)throw new Error(\"You must include the utils.js file before tether.js\");var P=C.Utils,n=P.getScrollParent,r=P.getBounds,s=P.getOffsetParent,f=P.extend,l=P.addClass,h=P.removeClass,c=P.updateClasses,T=P.defer,S=P.flush,a=P.getScrollBarSize,k=function(){for(var t=document.createElement(\"div\"),e=[\"transform\",\"webkitTransform\",\"OTransform\",\"MozTransform\",\"msTransform\"],o=0;o<e.length;++o){var i=e[o];if(void 0!==t.style[i])return i}}(),B=[],_=function(){B.forEach(function(t){t.position(!1)}),S()};!function(){var t=null,e=null,o=null,i=function n(){return\"undefined\"!=typeof e&&e>16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void(\"undefined\"!=typeof t&&m()-t<10||(\"undefined\"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};[\"resize\",\"scroll\",\"touchmove\"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:\"center\",left:\"right\",right:\"left\"},F={middle:\"middle\",top:\"bottom\",bottom:\"top\"},L={top:0,left:0,middle:\"50%\",center:\"50%\",bottom:\"100%\",right:\"100%\"},Y=function(t,e){var o=t.left,i=t.top;return\"auto\"===o&&(o=z[e.left]),\"auto\"===i&&(i=F[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return\"undefined\"!=typeof L[t.left]&&(e=L[t.left]),\"undefined\"!=typeof L[t.top]&&(o=L[t.top]),{left:e,top:o}},X=function(t){var e=t.split(\" \"),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){\"undefined\"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:\"getClass\",value:function(){var t=void 0===arguments[0]?\"\":arguments[0],e=this.options.classes;return\"undefined\"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+\"-\"+t:t}},{key:\"setOptions\",value:function(t){var e=this,o=void 0===arguments[1]?!0:arguments[1],i={offset:\"0 0\",targetOffset:\"0 0\",targetAttachment:\"auto auto\",classPrefix:\"tether\"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,\"viewport\"===this.target?(this.target=document.body,this.targetModifier=\"visible\"):\"scroll-handle\"===this.target&&(this.target=document.body,this.targetModifier=\"scroll-handle\"),[\"element\",\"target\"].forEach(function(t){if(\"undefined\"==typeof e[t])throw new Error(\"Tether Error: Both element and target must be defined\");\"undefined\"!=typeof e[t].jquery?e[t]=e[t][0]:\"string\"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass(\"element\")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass(\"target\")),!this.options.attachment)throw new Error(\"Tether Error: You must provide an attachment\");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),\"undefined\"!=typeof this.scrollParent&&this.disable(),this.scrollParent=\"scroll-handle\"===this.targetModifier?this.target:n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:\"getTargetBounds\",value:function(){if(\"undefined\"==typeof this.targetModifier)return r(this.target);if(\"visible\"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.top<pageYOffset&&(e.top=pageYOffset),e.left<pageXOffset&&(e.left=pageXOffset),e}if(\"scroll-handle\"===this.targetModifier){var t=void 0,o=this.target;o===document.body?(o=document.documentElement,t={left:pageXOffset,top:pageYOffset,height:innerHeight,width:innerWidth}):t=r(o);var i=getComputedStyle(o),n=o.scrollWidth>o.clientWidth||[i.overflow,i.overflowX].indexOf(\"scroll\")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a\/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop\/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:\"clearCache\",value:function(){this._cache={}}},{key:\"cache\",value:function(t,e){return\"undefined\"==typeof this._cache&&(this._cache={}),\"undefined\"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:\"enable\",value:function(){var t=void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass(\"enabled\")),l(this.element,this.getClass(\"enabled\")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener(\"scroll\",this.position),t&&this.position()}},{key:\"disable\",value:function(){h(this.target,this.getClass(\"enabled\")),h(this.element,this.getClass(\"enabled\")),this.enabled=!1,\"undefined\"!=typeof this.scrollParent&&this.scrollParent.removeEventListener(\"scroll\",this.position)}},{key:\"destroy\",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:\"updateAttachClasses\",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=[\"left\",\"top\",\"bottom\",\"right\",\"middle\",\"center\"];\"undefined\"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),\"undefined\"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass(\"element-attached\")+\"-\"+t.top),t.left&&n.push(this.getClass(\"element-attached\")+\"-\"+t.left),e.top&&n.push(this.getClass(\"target-attached\")+\"-\"+e.top),e.left&&n.push(this.getClass(\"target-attached\")+\"-\"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass(\"element-attached\")+\"-\"+t),r.push(o.getClass(\"target-attached\")+\"-\"+t)}),T(function(){\"undefined\"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:\"position\",value:function(){var t=this,e=void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=Y(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache(\"element-bounds\",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&\"undefined\"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache(\"target-bounds\",function(){return t.getTargetBounds()}),d=l,u=y(H(this.attachment),{width:n,height:f}),p=y(H(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;w<C.modules.length;++w){var O=C.modules[w],E=O.position.call(this,{left:m,top:b,targetAttachment:o,targetPos:l,elementPos:i,offset:u,targetOffset:p,manualOffset:c,manualTargetOffset:g,scrollbarSize:A,attachment:this.attachment});if(E===!1)return!1;\"undefined\"!=typeof E&&\"object\"==typeof E&&(b=E.top,m=E.left)}var x={page:{top:b,left:m},viewport:{top:b-pageYOffset,bottom:pageYOffset-b-f+innerHeight,left:m-pageXOffset,right:pageXOffset-m-n+innerWidth}},A=void 0;return document.body.scrollWidth>window.innerWidth&&(A=this.cache(\"scrollbar-size\",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache(\"scrollbar-size\",a),x.viewport.right-=A.width),(-1===[\"\",\"static\"].indexOf(document.body.style.position)||-1===[\"\",\"static\"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),\"undefined\"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&\"undefined\"==typeof this.targetModifier&&!function(){var e=t.cache(\"target-offsetparent\",function(){return s(t.target)}),o=t.cache(\"target-offsetparent-bounds\",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if([\"Top\",\"Left\",\"Bottom\",\"Right\"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i[\"border\"+t+\"Width\"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:\"move\",value:function(t){var e=this;if(\"undefined\"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a<this.history.length;++a){var h=this.history[a];if(\"undefined\"!=typeof h[i]&&!g(h[i][n],t[i][n])){r=!0;break}}r||(o[i][n]=!0)}}var l={top:\"\",left:\"\",right:\"\",bottom:\"\"},d=function(t,o){var i=\"undefined\"!=typeof e.options.optimizations,n=i?e.options.optimizations.gpu:null;if(n!==!1){var r=void 0,s=void 0;t.top?(l.top=0,r=o.top):(l.bottom=0,r=-o.bottom),t.left?(l.left=0,s=o.left):(l.right=0,s=-o.right),l[k]=\"translateX(\"+Math.round(s)+\"px) translateY(\"+Math.round(r)+\"px)\",\"msTransform\"!==k&&(l[k]+=\" translateZ(0)\")}else t.top?l.top=o.top+\"px\":l.bottom=o.bottom+\"px\",t.left?l.left=o.left+\"px\":l.right=o.right+\"px\"},u=!1;(o.page.top||o.page.bottom)&&(o.page.left||o.page.right)?(l.position=\"absolute\",d(o.page,t.page)):(o.viewport.top||o.viewport.bottom)&&(o.viewport.left||o.viewport.right)?(l.position=\"fixed\",d(o.viewport,t.viewport)):\"undefined\"!=typeof o.offset&&o.offset.top&&o.offset.left?!function(){l.position=\"absolute\";var i=e.cache(\"target-offsetparent\",function(){return s(e.target)});s(e.element)!==i&&T(function(){e.element.parentNode.removeChild(e.element),i.appendChild(e.element)}),d(o.offset,t.offset),u=!0}():(l.position=\"absolute\",d({top:!0,left:!0},t.page)),u||\"BODY\"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element));var p={},c=!1;for(var n in l){var m=l[n],v=this.element.style[n];\"\"!==v&&\"\"!==m&&[\"top\",\"left\",\"bottom\",\"right\"].indexOf(n)>=0&&(v=parseFloat(v),m=parseFloat(m)),v!==m&&(c=!0,p[n]=m)}c&&T(function(){f(e.element.style,p)})}}}]),t}();N.modules=[],C.position=_;var R=f(N,C),M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a[\"return\"]&&a[\"return\"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),P=C.Utils,r=P.getBounds,f=P.extend,c=P.updateClasses,T=P.defer,U=[\"left\",\"top\",\"right\",\"bottom\"];C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var s=this.cache(\"element-bounds\",function(){return r(e.element)}),a=s.height,h=s.width;if(0===h&&0===a&&\"undefined\"!=typeof this.lastSize){var l=this.lastSize;h=l.width,a=l.height}var d=this.cache(\"target-bounds\",function(){return e.getTargetBounds()}),u=d.height,p=d.width,g=[this.getClass(\"pinned\"),this.getClass(\"out-of-bounds\")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&g.push(e),o&&g.push(o)}),g.forEach(function(t){[\"left\",\"top\",\"right\",\"bottom\"].forEach(function(e){g.push(t+\"-\"+e)})});var m=[],v=f({},n),y=f({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,s=t.attachment,f=t.pin;\"undefined\"==typeof s&&(s=\"\");var l=void 0,d=void 0;if(s.indexOf(\" \")>=0){var c=s.split(\" \"),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);(\"target\"===d||\"both\"===d)&&(o<w[1]&&\"top\"===v.top&&(o+=u,v.top=\"bottom\"),o+a>w[3]&&\"bottom\"===v.top&&(o-=u,v.top=\"top\")),\"together\"===d&&(o<w[1]&&\"top\"===v.top&&(\"bottom\"===y.top?(o+=u,v.top=\"bottom\",o+=a,y.top=\"top\"):\"top\"===y.top&&(o+=u,v.top=\"bottom\",o-=a,y.top=\"bottom\")),o+a>w[3]&&\"bottom\"===v.top&&(\"top\"===y.top?(o-=u,v.top=\"top\",o-=a,y.top=\"bottom\"):\"bottom\"===y.top&&(o-=u,v.top=\"top\",o+=a,y.top=\"top\")),\"middle\"===v.top&&(o+a>w[3]&&\"top\"===y.top?(o-=a,y.top=\"bottom\"):o<w[1]&&\"bottom\"===y.top&&(o+=a,y.top=\"top\"))),(\"target\"===l||\"both\"===l)&&(i<w[0]&&\"left\"===v.left&&(i+=p,v.left=\"right\"),i+h>w[2]&&\"right\"===v.left&&(i-=p,v.left=\"left\")),\"together\"===l&&(i<w[0]&&\"left\"===v.left?\"right\"===y.left?(i+=p,v.left=\"right\",i+=h,y.left=\"left\"):\"left\"===y.left&&(i+=p,v.left=\"right\",i-=h,y.left=\"right\"):i+h>w[2]&&\"right\"===v.left?\"left\"===y.left?(i-=p,v.left=\"left\",i-=h,y.left=\"right\"):\"right\"===y.left&&(i-=p,v.left=\"left\",i+=h,y.left=\"left\"):\"center\"===v.left&&(i+h>w[2]&&\"left\"===y.left?(i-=h,y.left=\"right\"):i<w[0]&&\"right\"===y.left&&(i+=h,y.left=\"left\"))),(\"element\"===d||\"both\"===d)&&(o<w[1]&&\"bottom\"===y.top&&(o+=a,y.top=\"top\"),o+a>w[3]&&\"top\"===y.top&&(o-=a,y.top=\"bottom\")),(\"element\"===l||\"both\"===l)&&(i<w[0]&&\"right\"===y.left&&(i+=h,y.left=\"left\"),i+h>w[2]&&\"left\"===y.left&&(i-=h,y.left=\"right\")),\"string\"==typeof f?f=f.split(\",\").map(function(t){return t.trim()}):f===!0&&(f=[\"top\",\"left\",\"right\",\"bottom\"]),f=f||[];var C=[],O=[];o<w[1]&&(f.indexOf(\"top\")>=0?(o=w[1],C.push(\"top\")):O.push(\"top\")),o+a>w[3]&&(f.indexOf(\"bottom\")>=0?(o=w[3]-a,C.push(\"bottom\")):O.push(\"bottom\")),i<w[0]&&(f.indexOf(\"left\")>=0?(i=w[0],C.push(\"left\")):O.push(\"left\")),i+h>w[2]&&(f.indexOf(\"right\")>=0?(i=w[2]-h,C.push(\"right\")):O.push(\"right\")),C.length&&!function(){var t=void 0;t=\"undefined\"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass(\"pinned\"),m.push(t),C.forEach(function(e){m.push(t+\"-\"+e)})}(),O.length&&!function(){var t=void 0;t=\"undefined\"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass(\"out-of-bounds\"),m.push(t),O.forEach(function(e){m.push(t+\"-\"+e)})}(),(C.indexOf(\"left\")>=0||C.indexOf(\"right\")>=0)&&(y.left=v.left=!1),(C.indexOf(\"top\")>=0||C.indexOf(\"bottom\")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache(\"element-bounds\",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&[\"left\",\"right\"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&[\"top\",\"bottom\"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=[\"left\",\"top\",\"right\",\"bottom\"];return u.push(this.getClass(\"abutted\")),g.forEach(function(t){u.push(e.getClass(\"abutted\")+\"-\"+t)}),d.length&&p.push(this.getClass(\"abutted\")),d.forEach(function(t){p.push(e.getClass(\"abutted\")+\"-\"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a[\"return\"]&&a[\"return\"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;\"function\"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if(\"string\"==typeof i){i=i.split(\" \"),i[1]=i[1]||i[0];var s=M(i,2);n=s[0],r=s[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R});\nH5P.Tether = Tether;\nwindow.Tether = oldTether;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/Drop-1.0\/js\/drop.min.js?ver=1.0.2":"\nvar oldDrop = window.Drop;\nvar oldTether = window.Tether;\nTether = H5P.Tether;\n!function(t,e){\"function\"==typeof define&&define.amd?define([\"tether\"],e):\"object\"==typeof exports?module.exports=e(require(\"tether\")):t.Drop=e(t.Tether)}(this,function(t){\"use strict\";function e(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function n(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function o(t){var e=t.split(\" \"),n=a(e,2),o=n[0],i=n[1];if([\"left\",\"right\"].indexOf(o)>=0){var s=[i,o];o=s[0],i=s[1]}return[o,i].join(\" \")}function i(t,e){for(var n=void 0,o=[];-1!==(n=t.indexOf(e));)o.push(t.splice(n,1));return o}function s(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],u=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return new(r.apply(b,[null].concat(e)))};p(u,{createContext:s,drops:[],defaults:{}});var g={classPrefix:\"drop\",defaults:{position:\"bottom left\",openOn:\"click\",beforeClose:null,constrainToScrollParent:!0,constrainToWindow:!0,classes:\"\",remove:!1,tetherOptions:{}}};p(u,g,a),p(u.defaults,g.defaults,a.defaults),\"undefined\"==typeof x[u.classPrefix]&&(x[u.classPrefix]=[]),u.updateBodyClasses=function(){for(var t=!1,e=x[u.classPrefix],n=e.length,o=0;n>o;++o)if(e[o].isOpened()){t=!0;break}t?d(document.body,u.classPrefix+\"-open\"):c(document.body,u.classPrefix+\"-open\")};var b=function(s){function r(t){if(e(this,r),l(Object.getPrototypeOf(r.prototype),\"constructor\",this).call(this),this.options=p({},u.defaults,t),this.target=this.options.target,\"undefined\"==typeof this.target)throw new Error(\"Drop Error: You must provide a target.\");var n=\"data-\"+u.classPrefix,o=this.target.getAttribute(n);o&&(this.options.content=o);for(var i=[\"position\",\"openOn\"],s=0;s<i.length;++s){var a=this.target.getAttribute(n+\"-\"+i[s]);a&&(this.options[i[s]]=a)}this.options.classes&&this.options.addTargetClasses!==!1&&d(this.target,this.options.classes),u.drops.push(this),x[u.classPrefix].push(this),this._boundEvents=[],this.bindMethods(),this.setupElements(),this.setupEvents(),this.setupTether()}return n(r,s),h(r,[{key:\"_on\",value:function(t,e,n){this._boundEvents.push({element:t,event:e,handler:n}),t.addEventListener(e,n)}},{key:\"bindMethods\",value:function(){this.transitionEndHandler=this._transitionEndHandler.bind(this)}},{key:\"setupElements\",value:function(){var t=this;if(this.drop=document.createElement(\"div\"),d(this.drop,u.classPrefix),this.options.classes&&d(this.drop,this.options.classes),this.content=document.createElement(\"div\"),d(this.content,u.classPrefix+\"-content\"),\"function\"==typeof this.options.content){var e=function(){var e=t.options.content.call(t,t);if(\"string\"==typeof e)t.content.innerHTML=e;else{if(\"object\"!=typeof e)throw new Error(\"Drop Error: Content function should return a string or HTMLElement.\");t.content.innerHTML=\"\",t.content.appendChild(e)}};e(),this.on(\"open\",e.bind(this))}else\"object\"==typeof this.options.content?this.content.appendChild(this.options.content):this.content.innerHTML=this.options.content;this.drop.appendChild(this.content)}},{key:\"setupTether\",value:function(){var e=this.options.position.split(\" \");e[0]=E[e[0]],e=e.join(\" \");var n=[];this.options.constrainToScrollParent?n.push({to:\"scrollParent\",pin:\"top, bottom\",attachment:\"together none\"}):n.push({to:\"scrollParent\"}),this.options.constrainToWindow!==!1?n.push({to:\"window\",attachment:\"together\"}):n.push({to:\"window\"});var i={element:this.drop,target:this.target,attachment:o(e),targetAttachment:o(this.options.position),classPrefix:u.classPrefix,offset:\"0 0\",targetOffset:\"0 0\",enabled:!1,constraints:n,addTargetClasses:this.options.addTargetClasses};this.options.tetherOptions!==!1&&(this.tether=new t(p({},i,this.options.tetherOptions)))}},{key:\"setupEvents\",value:function(){var t=this;if(this.options.openOn){if(\"always\"===this.options.openOn)return void setTimeout(this.open.bind(this));var e=this.options.openOn.split(\" \");if(e.indexOf(\"click\")>=0)for(var n=function(e){t.toggle(e),e.preventDefault()},o=function(e){t.isOpened()&&(e.target===t.drop||t.drop.contains(e.target)||e.target===t.target||t.target.contains(e.target)||t.close(e))},i=0;i<y.length;++i){var s=y[i];this._on(this.target,s,n),this._on(document,s,o)}var r=!1,a=null,h=function(e){r=!0,t.open(e)},l=function(e){r=!1,\"undefined\"!=typeof a&&clearTimeout(a),a=setTimeout(function(){r||t.close(e),a=null},50)};e.indexOf(\"hover\")>=0&&(this._on(this.target,\"mouseover\",h),this._on(this.drop,\"mouseover\",h),this._on(this.target,\"mouseout\",l),this._on(this.drop,\"mouseout\",l)),e.indexOf(\"focus\")>=0&&(this._on(this.target,\"focus\",h),this._on(this.drop,\"focus\",h),this._on(this.target,\"blur\",l),this._on(this.drop,\"blur\",l))}}},{key:\"isOpened\",value:function(){return this.drop?f(this.drop,u.classPrefix+\"-open\"):void 0}},{key:\"toggle\",value:function(t){this.isOpened()?this.close(t):this.open(t)}},{key:\"open\",value:function(t){var e=this;this.isOpened()||(this.drop.parentNode||document.body.appendChild(this.drop),\"undefined\"!=typeof this.tether&&this.tether.enable(),d(this.drop,u.classPrefix+\"-open\"),d(this.drop,u.classPrefix+\"-open-transitionend\"),setTimeout(function(){e.drop&&d(e.drop,u.classPrefix+\"-after-open\")}),\"undefined\"!=typeof this.tether&&this.tether.position(),this.trigger(\"open\"),u.updateBodyClasses())}},{key:\"_transitionEndHandler\",value:function(t){t.target===t.currentTarget&&(f(this.drop,u.classPrefix+\"-open\")||c(this.drop,u.classPrefix+\"-open-transitionend\"),this.drop.removeEventListener(m,this.transitionEndHandler))}},{key:\"beforeCloseHandler\",value:function(t){var e=!0;return this.isClosing||\"function\"!=typeof this.options.beforeClose||(this.isClosing=!0,e=this.options.beforeClose(t,this)!==!1),this.isClosing=!1,e}},{key:\"close\",value:function(t){this.isOpened()&&this.beforeCloseHandler(t)&&(c(this.drop,u.classPrefix+\"-open\"),c(this.drop,u.classPrefix+\"-after-open\"),this.drop.addEventListener(m,this.transitionEndHandler),this.trigger(\"close\"),\"undefined\"!=typeof this.tether&&this.tether.disable(),u.updateBodyClasses(),this.options.remove&&this.remove(t))}},{key:\"remove\",value:function(t){this.close(t),this.drop.parentNode&&this.drop.parentNode.removeChild(this.drop)}},{key:\"position\",value:function(){this.isOpened()&&\"undefined\"!=typeof this.tether&&this.tether.position()}},{key:\"destroy\",value:function(){this.remove(),\"undefined\"!=typeof this.tether&&this.tether.destroy();for(var t=0;t<this._boundEvents.length;++t){var e=this._boundEvents[t],n=e.element,o=e.event,s=e.handler;n.removeEventListener(o,s)}this._boundEvents=[],this.tether=null,this.drop=null,this.content=null,this.target=null,i(x[u.classPrefix],this),i(u.drops,this)}}]),r}(v);return u}var r=Function.prototype.bind,a=function(){function t(t,e){var n=[],o=!0,i=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(n.push(r.value),!e||n.length!==e);o=!0);}catch(h){i=!0,s=h}finally{try{!o&&a[\"return\"]&&a[\"return\"]()}finally{if(i)throw s}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),h=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),l=function(t,e,n){for(var o=!0;o;){var i=t,s=e,r=n;a=l=h=void 0,o=!1,null===i&&(i=Function.prototype);var a=Object.getOwnPropertyDescriptor(i,s);if(void 0!==a){if(\"value\"in a)return a.value;var h=a.get;return void 0===h?void 0:h.call(r)}var l=Object.getPrototypeOf(i);if(null===l)return void 0;t=l,e=s,n=r,o=!0}},u=t.Utils,p=u.extend,d=u.addClass,c=u.removeClass,f=u.hasClass,v=u.Evented,y=[\"click\"];\"ontouchstart\"in document.documentElement&&y.push(\"touchstart\");var g={WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"transitionend\",OTransition:\"otransitionend\",transition:\"transitionend\"},m=\"\";for(var b in g)if({}.hasOwnProperty.call(g,b)){var O=document.createElement(\"p\");\"undefined\"!=typeof O.style[b]&&(m=g[b])}var E={left:\"right\",right:\"left\",top:\"bottom\",bottom:\"top\",middle:\"middle\",center:\"center\"},x={},P=s();return document.addEventListener(\"DOMContentLoaded\",function(){P.updateBodyClasses()}),P});\nH5P.Drop = Drop;\nwindow.Drop = oldDrop;\nwindow.Tether = oldTether;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-help-dialog.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\n\/**\n * Class responsible for creating a help text dialog\n *\/\nH5P.JoubelHelpTextDialog = (function ($) {\n\n  var numInstances = 0;\n  \/**\n   * Display a pop-up containing a message.\n   *\n   * @param {H5P.jQuery}  $container  The container which message dialog will be appended to\n   * @param {string}      message     The message\n   * @param {string}      closeButtonTitle The title for the close button\n   * @return {H5P.jQuery}\n   *\/\n  function JoubelHelpTextDialog(header, message, closeButtonTitle) {\n    H5P.EventDispatcher.call(this);\n\n    var self = this;\n\n    numInstances++;\n    var headerId = 'joubel-help-text-header-' + numInstances;\n    var helpTextId = 'joubel-help-text-body-' + numInstances;\n\n    var $helpTextDialogBox = $('<div>', {\n      'class': 'joubel-help-text-dialog-box',\n      'role': 'dialog',\n      'aria-labelledby': headerId,\n      'aria-describedby': helpTextId\n    });\n\n    $('<div>', {\n      'class': 'joubel-help-text-dialog-background'\n    }).appendTo($helpTextDialogBox);\n\n    var $helpTextDialogContainer = $('<div>', {\n      'class': 'joubel-help-text-dialog-container'\n    }).appendTo($helpTextDialogBox);\n\n    $('<div>', {\n      'class': 'joubel-help-text-header',\n      'id': headerId,\n      'role': 'header',\n      'html': header\n    }).appendTo($helpTextDialogContainer);\n\n    $('<div>', {\n      'class': 'joubel-help-text-body',\n      'id': helpTextId,\n      'html': message,\n      'role': 'document',\n      'tabindex': 0\n    }).appendTo($helpTextDialogContainer);\n\n    var handleClose = function () {\n      $helpTextDialogBox.remove();\n      self.trigger('closed');\n    };\n\n    var $closeButton = $('<div>', {\n      'class': 'joubel-help-text-remove',\n      'role': 'button',\n      'title': closeButtonTitle,\n      'tabindex': 1,\n      'click': handleClose,\n      'keydown': function (event) {\n        \/\/ 32 - space, 13 - enter\n        if ([32, 13].indexOf(event.which) !== -1) {\n          event.preventDefault();\n          handleClose();\n        }\n      }\n    }).appendTo($helpTextDialogContainer);\n\n    \/**\n     * Get the DOM element\n     * @return {HTMLElement}\n     *\/\n    self.getElement = function () {\n      return $helpTextDialogBox;\n    };\n\n    self.focus = function () {\n      $closeButton.focus();\n    };\n  }\n\n  JoubelHelpTextDialog.prototype = Object.create(H5P.EventDispatcher.prototype);\n  JoubelHelpTextDialog.prototype.constructor = JoubelHelpTextDialog;\n\n  return JoubelHelpTextDialog;\n}(H5P.jQuery));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-message-dialog.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\n\/**\n * Class responsible for creating auto-disappearing dialogs\n *\/\nH5P.JoubelMessageDialog = (function ($) {\n\n  \/**\n   * Display a pop-up containing a message.\n   *\n   * @param {H5P.jQuery} $container The container which message dialog will be appended to\n   * @param {string} message The message\n   * @return {H5P.jQuery}\n   *\/\n  function JoubelMessageDialog ($container, message) {\n    var timeout;\n\n    var removeDialog = function () {\n      $warning.remove();\n      clearTimeout(timeout);\n      $container.off('click.messageDialog');\n    };\n\n    \/\/ Create warning popup:\n    var $warning = $('<div\/>', {\n      'class': 'joubel-message-dialog',\n      text: message\n    }).appendTo($container);\n\n    \/\/ Remove after 3 seconds or if user clicks anywhere in $container:\n    timeout = setTimeout(removeDialog, 3000);\n    $container.on('click.messageDialog', removeDialog);\n\n    return $warning;\n  }\n\n  return JoubelMessageDialog;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-progress-circle.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\n\/**\n * Class responsible for creating a circular progress bar\n *\/\n\nH5P.JoubelProgressCircle = (function ($) {\n\n  \/**\n   * Constructor for the Progress Circle\n   *\n   * @param {Number} number The amount of progress to display\n   * @param {string} progressColor Color for the progress meter\n   * @param {string} backgroundColor Color behind the progress meter\n   *\/\n  function ProgressCircle(number, progressColor, fillColor, backgroundColor) {\n    progressColor = progressColor || '#1a73d9';\n    fillColor = fillColor || '#f0f0f0';\n    backgroundColor = backgroundColor || '#ffffff';\n    var progressColorRGB = this.hexToRgb(progressColor);\n\n    \/\/Verify number\n    try {\n      number = Number(number);\n      if (number === '') {\n        throw 'is empty';\n      }\n      if (isNaN(number)) {\n        throw 'is not a number';\n      }\n    } catch (e) {\n      number = 'err';\n    }\n\n    \/\/Draw circle\n    if (number > 100) {\n      number = 100;\n    }\n\n    \/\/ We can not use rgba, since they will stack on top of each other.\n    \/\/ Instead we create the equivalent of the rgba color\n    \/\/ and applies this to the activeborder and background color.\n    var progressColorString = 'rgb(' + parseInt(progressColorRGB.r, 10) +\n      ',' + parseInt(progressColorRGB.g, 10) +\n      ',' + parseInt(progressColorRGB.b, 10) + ')';\n\n    \/\/ Circle wrapper\n    var $wrapper = $('<div\/>', {\n      'class': \"joubel-progress-circle-wrapper\"\n    });\n\n    \/\/Active border indicates progress\n    var $activeBorder = $('<div\/>', {\n      'class': \"joubel-progress-circle-active-border\"\n    }).appendTo($wrapper);\n\n    \/\/Background circle\n    var $backgroundCircle = $('<div\/>', {\n      'class': \"joubel-progress-circle-circle\"\n    }).appendTo($activeBorder);\n\n    \/\/Progress text\/number\n    $('<span\/>', {\n      'text': number + '%',\n      'class': \"joubel-progress-circle-percentage\"\n    }).appendTo($backgroundCircle);\n\n    var deg = number * 3.6;\n    if (deg <= 180) {\n      $activeBorder.css('background-image',\n        'linear-gradient(' + (90 + deg) + 'deg, transparent 50%, ' + fillColor + ' 50%),' +\n        'linear-gradient(90deg, ' + fillColor + ' 50%, transparent 50%)')\n        .css('border', '2px solid' + backgroundColor)\n        .css('background-color', progressColorString);\n    } else {\n      $activeBorder.css('background-image',\n        'linear-gradient(' + (deg - 90) + 'deg, transparent 50%, ' + progressColorString + ' 50%),' +\n        'linear-gradient(90deg, ' + fillColor + ' 50%, transparent 50%)')\n        .css('border', '2px solid' + backgroundColor)\n        .css('background-color', progressColorString);\n    }\n\n    this.$activeBorder = $activeBorder;\n    this.$backgroundCircle = $backgroundCircle;\n    this.$wrapper = $wrapper;\n\n    this.initResizeFunctionality();\n\n    return $wrapper;\n  }\n\n  \/**\n   * Initializes resize functionality for the progress circle\n   *\/\n  ProgressCircle.prototype.initResizeFunctionality = function () {\n    var self = this;\n\n    $(window).resize(function () {\n      \/\/ Queue resize\n      setTimeout(function () {\n        self.resize();\n      });\n    });\n\n    \/\/ First resize\n    setTimeout(function () {\n      self.resize();\n    }, 0);\n  };\n\n  \/**\n   * Resize function makes progress circle grow or shrink relative to parent container\n   *\/\n  ProgressCircle.prototype.resize = function () {\n    var $parent = this.$wrapper.parent();\n\n    if ($parent !== undefined && $parent) {\n\n      \/\/ Measurements\n      var fontSize = parseInt($parent.css('font-size'), 10);\n\n      \/\/ Static sizes\n      var fontSizeMultiplum = 3.75;\n      var progressCircleWidthPx = parseInt((fontSize \/ 4.5), 10) % 2 === 0 ? parseInt((fontSize \/ 4.5), 10) + 4 : parseInt((fontSize \/ 4.5), 10) + 5;\n      var progressCircleOffset = progressCircleWidthPx \/ 2;\n\n      var width = fontSize * fontSizeMultiplum;\n      var height = fontSize * fontSizeMultiplum;\n      this.$activeBorder.css({\n        'width': width,\n        'height': height\n      });\n\n      this.$backgroundCircle.css({\n        'width': width - progressCircleWidthPx,\n        'height': height - progressCircleWidthPx,\n        'top': progressCircleOffset,\n        'left': progressCircleOffset\n      });\n    }\n  };\n\n  \/**\n   * Hex to RGB conversion\n   * @param hex\n   * @returns {{r: Number, g: Number, b: Number}}\n   *\/\n  ProgressCircle.prototype.hexToRgb = function (hex) {\n    var result = \/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$\/i.exec(hex);\n    return result ? {\n      r: parseInt(result[1], 16),\n      g: parseInt(result[2], 16),\n      b: parseInt(result[3], 16)\n    } : null;\n  };\n\n  return ProgressCircle;\n\n}(H5P.jQuery));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-simple-rounded-button.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\nH5P.SimpleRoundedButton = (function ($) {\n\n  \/**\n   * Creates a new tip\n   *\/\n  function SimpleRoundedButton(text) {\n\n    var $simpleRoundedButton = $('<div>', {\n      'class': 'joubel-simple-rounded-button',\n      'title': text,\n      'role': 'button',\n      'tabindex': '0'\n    }).keydown(function (e) {\n      \/\/ 32 - space, 13 - enter\n      if ([32, 13].indexOf(e.which) !== -1) {\n        $(this).click();\n        e.preventDefault();\n      }\n    });\n\n    $('<span>', {\n      'class': 'joubel-simple-rounded-button-text',\n      'html': text\n    }).appendTo($simpleRoundedButton);\n\n    return $simpleRoundedButton;\n  }\n\n  return SimpleRoundedButton;\n}(H5P.jQuery));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-speech-bubble.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\n\/**\n * Class responsible for creating speech bubbles\n *\/\nH5P.JoubelSpeechBubble = (function ($) {\n\n  var $currentSpeechBubble;\n  var $currentContainer;\n  var removeSpeechBubbleTimeout;\n\n  var DEFAULT_MAX_WIDTH = 400;\n\n  var iDevice = navigator.userAgent.match(\/iPod|iPhone|iPad\/g) ? true : false;\n\n  \/**\n   * Creates a new speech bubble\n   *\n   * @param {H5P.jQuery} $container The speaking object\n   * @param {string} text The text to display\n   * @param {number} maxWidth The maximum width of the bubble\n   * @return {H5P.JoubelSpeechBubble}\n   *\/\n  function JoubelSpeechBubble($container, text, maxWidth) {\n    maxWidth = maxWidth || DEFAULT_MAX_WIDTH;\n    $currentContainer = $container;\n\n    this.isCurrent = function ($tip) {\n      return $tip.is($currentContainer);\n    };\n\n    this.remove = function () {\n      remove();\n    };\n\n    var fadeOutSpeechBubble = function ($speechBubble) {\n      if (!$speechBubble) {\n        return;\n      }\n\n      \/\/ Stop removing bubble\n      clearTimeout(removeSpeechBubbleTimeout);\n\n      $speechBubble.removeClass('show');\n      setTimeout(function () {\n        if ($speechBubble) {\n          $speechBubble.remove();\n          $speechBubble = undefined;\n        }\n      }, 500);\n    };\n\n    if ($currentSpeechBubble !== undefined) {\n      remove();\n    }\n\n    var $h5pContainer = $container.closest('.h5p-frame');\n\n    \/\/ Check closest h5p frame first, then check for container in case there is no frame.\n    if (!$h5pContainer.length) {\n      $h5pContainer = $container.closest('.h5p-container');\n    }\n\n    \/\/ Make sure we fade out old speech bubble\n    fadeOutSpeechBubble($currentSpeechBubble);\n\n    \/\/ Create bubble\n    var $tail = $('<div class=\"joubel-speech-bubble-tail\"><\/div>');\n    var $innerTail = $('<div class=\"joubel-speech-bubble-inner-tail\"><\/div>');\n    var $innerBubble = $(\n      '<div class=\"joubel-speech-bubble-inner\">' +\n        '<div class=\"joubel-speech-bubble-text\">' + text + '<\/div>' +\n      '<\/div>'\n    ).prepend($innerTail);\n\n    $currentSpeechBubble = $(\n      '<div class=\"joubel-speech-bubble\" aria-live=\"assertive\">'\n    ).append([$tail, $innerBubble])\n      .appendTo($h5pContainer);\n\n    \/\/ Show speech bubble with transition\n    setTimeout(function () {\n      $currentSpeechBubble.addClass('show');\n    }, 0);\n\n    \/\/ Calculate offset between the button and the h5p frame\n    var offset = getOffsetBetween($h5pContainer, $container);\n\n    var direction = (offset.bottom > offset.top ? 'bottom' : 'top');\n    var tipWidth = offset.outerWidth * 0.9; \/\/ Var needs to be renamed to make sense\n    var bubbleWidth = tipWidth > maxWidth ? maxWidth : tipWidth;\n\n    var bubblePosition = getBubblePosition(bubbleWidth, offset);\n    var tailPosition = getTailPosition(bubbleWidth, bubblePosition, offset, $container.width());\n    \/\/ Need to set font-size, since element is appended to body.\n    \/\/ Using same font-size as parent. In that way it will grow accordingly\n    \/\/ when resizing\n    var fontSize = 16;\/\/parseFloat($parent.css('font-size'));\n\n    \/\/ Set width and position of speech bubble\n    $currentSpeechBubble.css(bubbleCSS(\n      direction,\n      bubbleWidth,\n      bubblePosition,\n      fontSize\n    ));\n\n    var preparedTailCSS = tailCSS(direction, tailPosition);\n    $tail.css(preparedTailCSS);\n    $innerTail.css(preparedTailCSS);\n\n    \/\/ Handle click to close\n    H5P.$body.on('mousedown.speechBubble', handleOutsideClick);\n\n    \/\/ Handle clicks when inside IV which blocks bubbling.\n    $container.parents('.h5p-dialog')\n      .on('mousedown.speechBubble', handleOutsideClick);\n\n    if (iDevice) {\n      H5P.$body.css('cursor', 'pointer');\n    }\n\n    return this;\n  }\n\n  \/\/ Remove speechbubble if it belongs to a dom element that is about to be hidden\n  H5P.externalDispatcher.on('domHidden', function (event) {\n    if ($currentSpeechBubble !== undefined && event.data.$dom.find($currentContainer).length !== 0) {\n      remove();\n    }\n  });\n\n  \/**\n   * Static function for removing the speechbubble\n   *\/\n  var remove = function() {\n    H5P.$body.off('mousedown.speechBubble');\n    $currentContainer.parents('.h5p-dialog').off('mousedown.speechBubble');\n    if (iDevice) {\n      H5P.$body.css('cursor', '');\n    }\n    if ($currentSpeechBubble !== undefined) {\n      \/\/ Apply transition, then remove speech bubble\n      $currentSpeechBubble.removeClass('show');\n\n      \/\/ Make sure we remove any old timeout before reassignment\n      clearTimeout(removeSpeechBubbleTimeout);\n      removeSpeechBubbleTimeout = setTimeout(function () {\n        $currentSpeechBubble.remove();\n        $currentSpeechBubble = undefined;\n      }, 500);\n    }\n    \/\/ Don't return false here. If the user e.g. clicks a button when the bubble is visible,\n    \/\/ we want the bubble to disapear AND the button to receive the event\n  };\n  \n  \/**\n   * Remove the speech bubble and container reference\n   *\/\n  function handleOutsideClick(event) {\n    if (event.target === $currentContainer[0]) {\n      return; \/\/ Button clicks are not outside clicks\n    }\n\n    remove();\n    \/\/ There is no current container when a container isn't clicked\n    $currentContainer = undefined;\n  }\n\n  \/**\n   * Calculate position for speech bubble\n   *\n   * @param {number} bubbleWidth The width of the speech bubble\n   * @param {object} offset\n   * @return {object} Return position for the speech bubble\n   *\/\n  function getBubblePosition(bubbleWidth, offset) {\n    var bubblePosition = {};\n\n    var tailOffset = 9;\n    var widthOffset = bubbleWidth \/ 2;\n\n    \/\/ Calculate top position\n    bubblePosition.top = offset.top + offset.innerHeight;\n\n    \/\/ Calculate bottom position\n    bubblePosition.bottom = offset.bottom + offset.innerHeight + tailOffset;\n\n    \/\/ Calculate left position\n    if (offset.left < widthOffset) {\n      bubblePosition.left = 3;\n    }\n    else if ((offset.left + widthOffset) > offset.outerWidth) {\n      bubblePosition.left = offset.outerWidth - bubbleWidth - 3;\n    }\n    else {\n      bubblePosition.left = offset.left - widthOffset + (offset.innerWidth \/ 2);\n    }\n\n    return bubblePosition;\n  }\n\n  \/**\n   * Calculate position for speech bubble tail\n   *\n   * @param {number} bubbleWidth The width of the speech bubble\n   * @param {object} bubblePosition Speech bubble position\n   * @param {object} offset\n   * @param {number} iconWidth The width of the tip icon\n   * @return {object} Return position for the tail\n   *\/\n  function getTailPosition(bubbleWidth, bubblePosition, offset, iconWidth) {\n    var tailPosition = {};\n    \/\/ Magic numbers. Tuned by hand so that the tail fits visually within\n    \/\/ the bounds of the speech bubble.\n    var leftBoundary = 9;\n    var rightBoundary = bubbleWidth - 20;\n\n    tailPosition.left = offset.left - bubblePosition.left + (iconWidth \/ 2) - 6;\n    if (tailPosition.left < leftBoundary) {\n      tailPosition.left = leftBoundary;\n    }\n    if (tailPosition.left > rightBoundary) {\n      tailPosition.left = rightBoundary;\n    }\n\n    tailPosition.top = -6;\n    tailPosition.bottom = -6;\n\n    return tailPosition;\n  }\n\n  \/**\n   * Return bubble CSS for the desired growth direction\n   *\n   * @param {string} direction The direction the speech bubble will grow\n   * @param {number} width The width of the speech bubble\n   * @param {object} position Speech bubble position\n   * @param {number} fontSize The size of the bubbles font\n   * @return {object} Return CSS\n   *\/\n  function bubbleCSS(direction, width, position, fontSize) {\n    if (direction === 'top') {\n      return {\n        width: width + 'px',\n        bottom: position.bottom + 'px',\n        left: position.left + 'px',\n        fontSize: fontSize + 'px'\n      };\n    }\n    else {\n      return {\n        width: width + 'px',\n        top: position.top + 'px',\n        left: position.left + 'px',\n        fontSize: fontSize + 'px'\n      };\n    }\n  }\n\n  \/**\n   * Return tail CSS for the desired growth direction\n   *\n   * @param {string} direction The direction the speech bubble will grow\n   * @param {object} position Tail position\n   * @return {object} Return CSS\n   *\/\n  function tailCSS(direction, position) {\n    if (direction === 'top') {\n      return {\n        bottom: position.bottom + 'px',\n        left: position.left + 'px'\n      };\n    }\n    else {\n      return {\n        top: position.top + 'px',\n        left: position.left + 'px'\n      };\n    }\n  }\n\n  \/**\n   * Calculates the offset between an element inside a container and the\n   * container. Only works if all the edges of the inner element is inside the\n   * outer element.\n   * Width\/height of the elements is included as a convenience.\n   *\n   * @param {H5P.jQuery} $outer\n   * @param {H5P.jQuery} $inner\n   * @return {object} Position offset\n   *\/\n  function getOffsetBetween($outer, $inner) {\n    var outer = $outer[0].getBoundingClientRect();\n    var inner = $inner[0].getBoundingClientRect();\n\n    return {\n      top: inner.top - outer.top,\n      right: outer.right - inner.right,\n      bottom: outer.bottom - inner.bottom,\n      left: inner.left - outer.left,\n      innerWidth: inner.width,\n      innerHeight: inner.height,\n      outerWidth: outer.width,\n      outerHeight: outer.height\n    };\n  }\n\n  return JoubelSpeechBubble;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-throbber.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\nH5P.JoubelThrobber = (function ($) {\n\n  \/**\n   * Creates a new tip\n   *\/\n  function JoubelThrobber() {\n\n    \/\/ h5p-throbber css is described in core\n    var $throbber = $('<div\/>', {\n      'class': 'h5p-throbber'\n    });\n\n    return $throbber;\n  }\n\n  return JoubelThrobber;\n}(H5P.jQuery));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-tip.js?ver=1.3.5":"\nH5P.JoubelTip = (function ($) {\n  var $conv = $('<div\/>');\n\n  \/**\n   * Creates a new tip element.\n   *\n   * NOTE that this may look like a class but it doesn't behave like one.\n   * It returns a jQuery object.\n   *\n   * @param {string} tipHtml The text to display in the popup\n   * @param {Object} [behaviour] Options\n   * @param {string} [behaviour.tipLabel] Set to use a custom label for the tip button (you want this for good A11Y)\n   * @param {boolean} [behaviour.helpIcon] Set to 'true' to Add help-icon classname to Tip button (changes the icon)\n   * @param {boolean} [behaviour.showSpeechBubble] Set to 'false' to disable functionality (you may this in the editor)\n   * @param {boolean} [behaviour.tabcontrol] Set to 'true' if you plan on controlling the tabindex in the parent (tabindex=\"-1\")\n   * @return {H5P.jQuery|undefined} Tip button jQuery element or 'undefined' if invalid tip\n   *\/\n  function JoubelTip(tipHtml, behaviour) {\n\n    \/\/ Keep track of the popup that appears when you click the Tip button\n    var speechBubble;\n\n    \/\/ Parse tip html to determine text\n    var tipText = $conv.html(tipHtml).text().trim();\n    if (tipText === '') {\n      return; \/\/ The tip has no textual content, i.e. it's invalid.\n    }\n\n    \/\/ Set default behaviour\n    behaviour = $.extend({\n      tipLabel: tipText,\n      helpIcon: false,\n      showSpeechBubble: true,\n      tabcontrol: false\n    }, behaviour);\n\n    \/\/ Create Tip button\n    var $tipButton = $('<div\/>', {\n      class: 'joubel-tip-container' + (behaviour.showSpeechBubble ? '' : ' be-quiet'),\n      title: behaviour.tipLabel,\n      'aria-label': behaviour.tipLabel,\n      'aria-expanded': false,\n      role: 'button',\n      tabindex: (behaviour.tabcontrol ? -1 : 0),\n      click: function (event) {\n        \/\/ Toggle show\/hide popup\n        toggleSpeechBubble();\n        event.preventDefault();\n      },\n      keydown: function (event) {\n        if (event.which === 32 || event.which === 13) { \/\/ Space & enter key\n          \/\/ Toggle show\/hide popup\n          toggleSpeechBubble();\n          event.stopPropagation();\n          event.preventDefault();\n        }\n        else { \/\/ Any other key\n          \/\/ Toggle hide popup\n          toggleSpeechBubble(false);\n        }\n      },\n      \/\/ Add markup to render icon\n      html: '<span class=\"joubel-icon-tip-normal ' + (behaviour.helpIcon ? ' help-icon': '') + '\">' +\n              '<span class=\"h5p-icon-shadow\"><\/span>' +\n              '<span class=\"h5p-icon-speech-bubble\"><\/span>' +\n              '<span class=\"h5p-icon-info\"><\/span>' +\n            '<\/span>'\n      \/\/ IMPORTANT: All of the markup elements must have 'pointer-events: none;'\n    });\n\n    \/**\n     * Tip button interaction handler.\n     * Toggle show or hide the speech bubble popup when interacting with the\n     * Tip button.\n     *\n     * @private\n     * @param {boolean} [force] 'true' shows and 'false' hides.\n     *\/\n    var toggleSpeechBubble = function (force) {\n      if (speechBubble !== undefined && speechBubble.isCurrent($tipButton)) {\n        \/\/ Hide current popup\n        speechBubble.remove();\n        speechBubble = undefined;\n\n        $tipButton.attr('aria-expanded', false);\n      }\n      else if (force !== false && behaviour.showSpeechBubble) {\n        \/\/ Create and show new popup\n        speechBubble = H5P.JoubelSpeechBubble($tipButton, tipHtml);\n        $tipButton.attr('aria-expanded', true);\n      }\n    };\n\n    return $tipButton;\n  }\n\n  return JoubelTip;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-slider.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\nH5P.JoubelSlider = (function ($) {\n\n  \/**\n   * Creates a new Slider\n   *\n   * @param {object} [params] Additional parameters\n   *\/\n  function JoubelSlider(params) {\n    H5P.EventDispatcher.call(this);\n\n    this.$slider = $('<div>', $.extend({\n      'class': 'h5p-joubel-ui-slider'\n    }, params));\n\n    this.$slides = [];\n    this.currentIndex = 0;\n    this.numSlides = 0;\n  }\n  JoubelSlider.prototype = Object.create(H5P.EventDispatcher.prototype);\n  JoubelSlider.prototype.constructor = JoubelSlider;\n\n  JoubelSlider.prototype.addSlide = function ($content) {\n    $content.addClass('h5p-joubel-ui-slide').css({\n      'left': (this.numSlides*100) + '%'\n    });\n    this.$slider.append($content);\n    this.$slides.push($content);\n\n    this.numSlides++;\n\n    if(this.numSlides === 1) {\n      $content.addClass('current');\n    }\n  };\n\n  JoubelSlider.prototype.attach = function ($container) {\n    $container.append(this.$slider);\n  };\n\n  JoubelSlider.prototype.move = function (index) {\n    var self = this;\n\n    if(index === 0) {\n      self.trigger('first-slide');\n    }\n    if(index+1 === self.numSlides) {\n      self.trigger('last-slide');\n    }\n    self.trigger('move');\n\n    var $previousSlide = self.$slides[this.currentIndex];\n    H5P.Transition.onTransitionEnd(this.$slider, function () {\n      $previousSlide.removeClass('current');\n      self.trigger('moved');\n    });\n    this.$slides[index].addClass('current');\n\n    var translateX = 'translateX(' + (-index*100) + '%)';\n    this.$slider.css({\n      '-webkit-transform': translateX,\n      '-moz-transform': translateX,\n      '-ms-transform': translateX,\n      'transform': translateX\n    });\n\n    this.currentIndex = index;\n  };\n\n  JoubelSlider.prototype.remove = function () {\n    this.$slider.remove();\n  };\n\n  JoubelSlider.prototype.next = function () {\n    if(this.currentIndex+1 >= this.numSlides) {\n      return;\n    }\n\n    this.move(this.currentIndex+1);\n  };\n\n  JoubelSlider.prototype.previous = function () {\n    this.move(this.currentIndex-1);\n  };\n\n  JoubelSlider.prototype.first = function () {\n    this.move(0);\n  };\n\n  JoubelSlider.prototype.last = function () {\n    this.move(this.numSlides-1);\n  };\n\n  return JoubelSlider;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-score-bar.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\n\/**\n * @module\n *\/\nH5P.JoubelScoreBar = (function ($) {\n\n  \/* Need to use an id for the star SVG since that is the only way to reference\n     SVG filters  *\/\n  var idCounter = 0;\n\n  \/**\n   * Creates a score bar\n   * @class H5P.JoubelScoreBar\n   * @param {number} maxScore  Maximum score\n   * @param {string} [label] Makes it easier for readspeakers to identify the scorebar\n   * @param {string} [helpText] Score explanation\n   * @param {string} [scoreExplanationButtonLabel] Label for score explanation button\n   *\/\n  function JoubelScoreBar(maxScore, label, helpText, scoreExplanationButtonLabel) {\n    var self = this;\n\n    self.maxScore = maxScore;\n    self.score = 0;\n    idCounter++;\n\n    \/**\n     * @const {string}\n     *\/\n    self.STAR_MARKUP = '<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 63.77 53.87\" aria-hidden=\"true\" focusable=\"false\">' +\n        '<title>star<\/title>' +\n        '<filter id=\"h5p-joubelui-score-bar-star-inner-shadow-' + idCounter + '\" x0=\"-50%\" y0=\"-50%\" width=\"200%\" height=\"200%\">' +\n          '<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"3\" result=\"blur\"><\/feGaussianBlur>' +\n          '<feOffset dy=\"2\" dx=\"4\"><\/feOffset>' +\n          '<feComposite in2=\"SourceAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\" result=\"shadowDiff\"><\/feComposite>' +\n          '<feFlood flood-color=\"#ffe95c\" flood-opacity=\"1\"><\/feFlood>' +\n          '<feComposite in2=\"shadowDiff\" operator=\"in\"><\/feComposite>' +\n          '<feComposite in2=\"SourceGraphic\" operator=\"over\" result=\"firstfilter\"><\/feComposite>' +\n          '<feGaussianBlur in=\"firstfilter\" stdDeviation=\"3\" result=\"blur2\"><\/feGaussianBlur>' +\n          '<feOffset dy=\"-2\" dx=\"-4\"><\/feOffset>' +\n          '<feComposite in2=\"firstfilter\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\" result=\"shadowDiff\"><\/feComposite>' +\n          '<feFlood flood-color=\"#ffe95c\" flood-opacity=\"1\"><\/feFlood>' +\n          '<feComposite in2=\"shadowDiff\" operator=\"in\"><\/feComposite>' +\n          '<feComposite in2=\"firstfilter\" operator=\"over\"><\/feComposite>' +\n        '<\/filter>' +\n        '<path class=\"h5p-joubelui-score-bar-star-shadow\" d=\"M35.08,43.41V9.16H20.91v0L9.51,10.85,9,10.93C2.8,12.18,0,17,0,21.25a11.22,11.22,0,0,0,3,7.48l8.73,8.53-1.07,6.16Z\"\/>' +\n        '<g>' +\n          '<path class=\"h5p-joubelui-score-bar-star-border\" d=\"M61.36,22.8,49.72,34.11l2.78,16a2.6,2.6,0,0,1,.05.64c0,.85-.37,1.6-1.33,1.6A2.74,2.74,0,0,1,49.94,52L35.58,44.41,21.22,52a2.93,2.93,0,0,1-1.28.37c-.91,0-1.33-.75-1.33-1.6,0-.21.05-.43.05-.64l2.78-16L9.8,22.8A2.57,2.57,0,0,1,9,21.25c0-1,1-1.33,1.81-1.49l16.07-2.35L34.09,2.83c.27-.59.85-1.33,1.55-1.33s1.28.69,1.55,1.33l7.21,14.57,16.07,2.35c.75.11,1.81.53,1.81,1.49A3.07,3.07,0,0,1,61.36,22.8Z\"\/>' +\n          '<path class=\"h5p-joubelui-score-bar-star-fill\" d=\"M61.36,22.8,49.72,34.11l2.78,16a2.6,2.6,0,0,1,.05.64c0,.85-.37,1.6-1.33,1.6A2.74,2.74,0,0,1,49.94,52L35.58,44.41,21.22,52a2.93,2.93,0,0,1-1.28.37c-.91,0-1.33-.75-1.33-1.6,0-.21.05-.43.05-.64l2.78-16L9.8,22.8A2.57,2.57,0,0,1,9,21.25c0-1,1-1.33,1.81-1.49l16.07-2.35L34.09,2.83c.27-.59.85-1.33,1.55-1.33s1.28.69,1.55,1.33l7.21,14.57,16.07,2.35c.75.11,1.81.53,1.81,1.49A3.07,3.07,0,0,1,61.36,22.8Z\"\/>' +\n          '<path filter=\"url(#h5p-joubelui-score-bar-star-inner-shadow-' + idCounter + ')\" class=\"h5p-joubelui-score-bar-star-fill-full-score\" d=\"M61.36,22.8,49.72,34.11l2.78,16a2.6,2.6,0,0,1,.05.64c0,.85-.37,1.6-1.33,1.6A2.74,2.74,0,0,1,49.94,52L35.58,44.41,21.22,52a2.93,2.93,0,0,1-1.28.37c-.91,0-1.33-.75-1.33-1.6,0-.21.05-.43.05-.64l2.78-16L9.8,22.8A2.57,2.57,0,0,1,9,21.25c0-1,1-1.33,1.81-1.49l16.07-2.35L34.09,2.83c.27-.59.85-1.33,1.55-1.33s1.28.69,1.55,1.33l7.21,14.57,16.07,2.35c.75.11,1.81.53,1.81,1.49A3.07,3.07,0,0,1,61.36,22.8Z\"\/>' +\n        '<\/g>' +\n      '<\/svg>';\n\n    \/**\n     * @function appendTo\n     * @memberOf H5P.JoubelScoreBar#\n     * @param {H5P.jQuery}  $wrapper  Dom container\n     *\/\n    self.appendTo = function ($wrapper) {\n      self.$scoreBar.appendTo($wrapper);\n    };\n\n    \/**\n     * Create the text representation of the scorebar .\n     *\n     * @private\n     * @return {string}\n     *\/\n    var createLabel = function (score) {\n      if (!label) {\n        return '';\n      }\n\n      return label.replace(':num', score).replace(':total', self.maxScore);\n    };\n\n    \/**\n     * Creates the html for this widget\n     *\n     * @method createHtml\n     * @private\n     *\/\n    var createHtml = function () {\n      \/\/ Container div\n      self.$scoreBar = $('<div>', {\n        'class': 'h5p-joubelui-score-bar',\n      });\n\n      var $visuals = $('<div>', {\n        'class': 'h5p-joubelui-score-bar-visuals',\n        appendTo: self.$scoreBar\n      });\n\n      \/\/ The progress bar wrapper\n      self.$progressWrapper = $('<div>', {\n        'class': 'h5p-joubelui-score-bar-progress-wrapper',\n        appendTo: $visuals\n      });\n\n      self.$progress = $('<div>', {\n        'class': 'h5p-joubelui-score-bar-progress',\n        'html': createLabel(self.score),\n        appendTo: self.$progressWrapper\n      });\n\n      \/\/ The star\n      $('<div>', {\n        'class': 'h5p-joubelui-score-bar-star',\n        html: self.STAR_MARKUP\n      }).appendTo($visuals);\n\n      \/\/ The score container\n      var $numerics = $('<div>', {\n        'class': 'h5p-joubelui-score-numeric',\n        appendTo: self.$scoreBar,\n        'aria-hidden': true\n      });\n\n      \/\/ The current score\n      self.$scoreCounter = $('<span>', {\n        'class': 'h5p-joubelui-score-number h5p-joubelui-score-number-counter',\n        text: 0,\n        appendTo: $numerics\n      });\n\n      \/\/ The separator\n      $('<span>', {\n        'class': 'h5p-joubelui-score-number-separator',\n        text: '\/',\n        appendTo: $numerics\n      });\n\n      \/\/ Max score\n      self.$maxScore = $('<span>', {\n        'class': 'h5p-joubelui-score-number h5p-joubelui-score-max',\n        text: self.maxScore,\n        appendTo: $numerics\n      });\n\n      if (helpText) {\n        H5P.JoubelUI.createTip(helpText, {\n          tipLabel: scoreExplanationButtonLabel ? scoreExplanationButtonLabel : helpText,\n          helpIcon: true\n        }).appendTo(self.$scoreBar);\n        self.$scoreBar.addClass('h5p-score-bar-has-help');\n      }\n    };\n\n    \/**\n     * Set the current score\n     * @method setScore\n     * @memberOf H5P.JoubelScoreBar#\n     * @param  {number} score\n     *\/\n    self.setScore = function (score) {\n      \/\/ Do nothing if score hasn't changed\n      if (score === self.score) {\n        return;\n      }\n      self.score = score > self.maxScore ? self.maxScore : score;\n      self.updateVisuals();\n    };\n\n    \/**\n     * Increment score\n     * @method incrementScore\n     * @memberOf H5P.JoubelScoreBar#\n     * @param  {number=}        incrementBy Optional parameter, defaults to 1\n     *\/\n    self.incrementScore = function (incrementBy) {\n      self.setScore(self.score + (incrementBy || 1));\n    };\n\n    \/**\n     * Set the max score\n     * @method setMaxScore\n     * @memberOf H5P.JoubelScoreBar#\n     * @param  {number}    maxScore The max score\n     *\/\n    self.setMaxScore = function (maxScore) {\n      self.maxScore = maxScore;\n    };\n\n    \/**\n     * Updates the progressbar visuals\n     * @memberOf H5P.JoubelScoreBar#\n     * @method updateVisuals\n     *\/\n    self.updateVisuals = function () {\n      self.$progress.html(createLabel(self.score));\n      self.$scoreCounter.text(self.score);\n\n      setTimeout(function () {\n        \/\/ Start the progressbar animation\n        self.$progress.css({\n          width: ((self.score \/ self.maxScore) * 100) + '%'\n        });\n\n        H5P.Transition.onTransitionEnd(self.$progress, function () {\n          \/\/ If fullscore fill the star and start the animation\n          self.$scoreBar.toggleClass('h5p-joubelui-score-bar-full-score', self.score === self.maxScore);\n          self.$scoreBar.toggleClass('h5p-joubelui-score-bar-animation-active', self.score === self.maxScore);\n\n          \/\/ Only allow the star animation to run once\n          self.$scoreBar.one(\"animationend\", function() {\n            self.$scoreBar.removeClass(\"h5p-joubelui-score-bar-animation-active\");\n          });\n        }, 600);\n      }, 300);\n    };\n\n    \/**\n     * Removes all classes\n     * @method reset\n     *\/\n    self.reset = function () {\n      self.$scoreBar.removeClass('h5p-joubelui-score-bar-full-score');\n    };\n\n    createHtml();\n  }\n\n  return JoubelScoreBar;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-progressbar.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\nH5P.JoubelProgressbar = (function ($) {\n\n  \/**\n   * Joubel progressbar class\n   * @method JoubelProgressbar\n   * @constructor\n   * @param  {number}          steps Number of steps\n   * @param {Object} [options] Additional options\n   * @param {boolean} [options.disableAria] Disable readspeaker assistance\n   * @param {string} [options.progressText] A progress text for describing\n   *  current progress out of total progress for readspeakers.\n   *  e.g. \"Slide :num of :total\"\n   *\/\n  function JoubelProgressbar(steps, options) {\n    H5P.EventDispatcher.call(this);\n    var self = this;\n    this.options = $.extend({\n      progressText: 'Slide :num of :total'\n    }, options);\n    this.currentStep = 0;\n    this.steps = steps;\n\n    this.$progressbar = $('<div>', {\n      'class': 'h5p-joubelui-progressbar',\n      on: {\n        click: function () {\n          self.toggleTooltip();\n          return false;\n        },\n        mouseenter: function () {\n          self.showTooltip();\n        },\n        mouseleave: function () {\n          setTimeout(function () {\n            self.hideTooltip();\n          }, 1500);\n        }\n      }\n    });\n    this.$background = $('<div>', {\n      'class': 'h5p-joubelui-progressbar-background'\n    }).appendTo(this.$progressbar);\n\n    $('body').click(function () {\n      self.toggleTooltip(true);\n    });\n  }\n\n  JoubelProgressbar.prototype = Object.create(H5P.EventDispatcher.prototype);\n  JoubelProgressbar.prototype.constructor = JoubelProgressbar;\n\n  \/**\n   * Display tooltip\n   * @method showTooltip\n   *\/\n  JoubelProgressbar.prototype.showTooltip = function () {\n    var self = this;\n\n    if (this.currentStep === 0 || this.tooltip !== undefined) {\n      return;\n    }\n\n    var parentWidth = self.$progressbar.offset().left + self.$progressbar.width();\n\n    this.tooltip = new H5P.Drop({\n      target: this.$background.get(0),\n      content: this.currentStep + '\/' + this.steps,\n      classes: 'drop-theme-arrows-bounce h5p-joubelui-drop',\n      position: 'top right',\n      openOn: 'always',\n      tetherOptions: {\n        attachment: 'bottom center',\n        targetAttachment: 'top right'\n      }\n    });\n    this.tooltip.on('open', function () {\n      var $drop = $(self.tooltip.drop);\n      var left = $drop.position().left;\n      var dropWidth = $drop.width();\n\n      \/\/ Need to handle drops getting outside of the progressbar:\n      if (left < 0) {\n        $drop.css({marginLeft: (-left) + 'px'});\n      }\n      else if (left + dropWidth > parentWidth) {\n        $drop.css({marginLeft: (parentWidth - (left + dropWidth)) + 'px'});\n      }\n    });\n  };\n\n  JoubelProgressbar.prototype.updateAria = function () {\n    var self = this;\n    if (this.options.disableAria) {\n      return;\n    }\n\n    if (!this.$currentStatus) {\n      this.$currentStatus = $('<div>', {\n        'class': 'h5p-joubelui-progressbar-slide-status-text',\n        'aria-live': 'assertive'\n      }).appendTo(this.$progressbar);\n    }\n    var interpolatedProgressText = self.options.progressText\n      .replace(':num', self.currentStep)\n      .replace(':total', self.steps);\n    this.$currentStatus.html(interpolatedProgressText);\n  };\n\n  \/**\n   * Hides tooltip\n   * @method hideTooltip\n   *\/\n  JoubelProgressbar.prototype.hideTooltip = function () {\n    if (this.tooltip !== undefined) {\n      this.tooltip.remove();\n      this.tooltip.destroy();\n      this.tooltip = undefined;\n    }\n  };\n\n  \/**\n   * Toggles tooltip-visibility\n   * @method toggleTooltip\n   * @param  {boolean} [closeOnly] Don't show, only close if open\n   *\/\n  JoubelProgressbar.prototype.toggleTooltip = function (closeOnly) {\n    if (this.tooltip === undefined && !closeOnly) {\n      this.showTooltip();\n    }\n    else if (this.tooltip !== undefined) {\n      this.hideTooltip();\n    }\n  };\n\n  \/**\n   * Appends to a container\n   * @method appendTo\n   * @param  {H5P.jquery} $container\n   *\/\n  JoubelProgressbar.prototype.appendTo = function ($container) {\n    this.$progressbar.appendTo($container);\n  };\n\n  \/**\n   * Update progress\n   * @method setProgress\n   * @param  {number}    step\n   *\/\n  JoubelProgressbar.prototype.setProgress = function (step) {\n    \/\/ Check for valid value:\n    if (step > this.steps || step < 0) {\n      return;\n    }\n    this.currentStep = step;\n    this.$background.css({\n      width: ((this.currentStep\/this.steps)*100) + '%'\n    });\n\n    this.updateAria();\n  };\n\n  \/**\n   * Increment progress with 1\n   * @method next\n   *\/\n  JoubelProgressbar.prototype.next = function () {\n    this.setProgress(this.currentStep+1);\n  };\n\n  \/**\n   * Reset progressbar\n   * @method reset\n   *\/\n  JoubelProgressbar.prototype.reset = function () {\n    this.setProgress(0);\n  };\n\n  \/**\n   * Check if last step is reached\n   * @method isLastStep\n   * @return {Boolean}\n   *\/\n  JoubelProgressbar.prototype.isLastStep = function () {\n    return this.steps === this.currentStep;\n  };\n\n  return JoubelProgressbar;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/js\/joubel-ui.js?ver=1.3.5":"\nvar H5P = H5P || {};\n\n\/**\n * H5P Joubel UI library.\n *\n * This is a utility library, which does not implement attach. I.e, it has to bee actively used by\n * other libraries\n * @module\n *\/\nH5P.JoubelUI = (function ($) {\n\n  \/**\n   * The internal object to return\n   * @class H5P.JoubelUI\n   * @static\n   *\/\n  function JoubelUI() {}\n\n  \/* Public static functions *\/\n\n  \/**\n   * Create a tip icon\n   * @method H5P.JoubelUI.createTip\n   * @param  {string}  text   The textual tip\n   * @param  {Object}  params Parameters\n   * @return {H5P.JoubelTip}\n   *\/\n  JoubelUI.createTip = function (text, params) {\n    return new H5P.JoubelTip(text, params);\n  };\n\n  \/**\n   * Create message dialog\n   * @method H5P.JoubelUI.createMessageDialog\n   * @param  {H5P.jQuery}               $container The dom container\n   * @param  {string}                   message    The message\n   * @return {H5P.JoubelMessageDialog}\n   *\/\n  JoubelUI.createMessageDialog = function ($container, message) {\n    return new H5P.JoubelMessageDialog($container, message);\n  };\n\n  \/**\n   * Create help text dialog\n   * @method H5P.JoubelUI.createHelpTextDialog\n   * @param  {string}             header  The textual header\n   * @param  {string}             message The textual message\n   * @param  {string}             closeButtonTitle The title for the close button\n   * @return {H5P.JoubelHelpTextDialog}\n   *\/\n  JoubelUI.createHelpTextDialog = function (header, message, closeButtonTitle) {\n    return new H5P.JoubelHelpTextDialog(header, message, closeButtonTitle);\n  };\n\n  \/**\n   * Create progress circle\n   * @method H5P.JoubelUI.createProgressCircle\n   * @param  {number}             number          The progress (0 to 100)\n   * @param  {string}             progressColor   The progress color in hex value\n   * @param  {string}             fillColor       The fill color in hex value\n   * @param  {string}             backgroundColor The background color in hex value\n   * @return {H5P.JoubelProgressCircle}\n   *\/\n  JoubelUI.createProgressCircle = function (number, progressColor, fillColor, backgroundColor) {\n    return new H5P.JoubelProgressCircle(number, progressColor, fillColor, backgroundColor);\n  };\n\n  \/**\n   * Create throbber for loading\n   * @method H5P.JoubelUI.createThrobber\n   * @return {H5P.JoubelThrobber}\n   *\/\n  JoubelUI.createThrobber = function () {\n    return new H5P.JoubelThrobber();\n  };\n\n  \/**\n   * Create simple rounded button\n   * @method H5P.JoubelUI.createSimpleRoundedButton\n   * @param  {string}                  text The button label\n   * @return {H5P.SimpleRoundedButton}\n   *\/\n  JoubelUI.createSimpleRoundedButton = function (text) {\n    return new H5P.SimpleRoundedButton(text);\n  };\n\n  \/**\n   * Create Slider\n   * @method H5P.JoubelUI.createSlider\n   * @param  {Object} [params] Parameters\n   * @return {H5P.JoubelSlider}\n   *\/\n  JoubelUI.createSlider = function (params) {\n    return new H5P.JoubelSlider(params);\n  };\n\n  \/**\n   * Create Score Bar\n   * @method H5P.JoubelUI.createScoreBar\n   * @param  {number=}       maxScore The maximum score\n   * @param {string} [label] Makes it easier for readspeakers to identify the scorebar\n   * @return {H5P.JoubelScoreBar}\n   *\/\n  JoubelUI.createScoreBar = function (maxScore, label, helpText, scoreExplanationButtonLabel) {\n    return new H5P.JoubelScoreBar(maxScore, label, helpText, scoreExplanationButtonLabel);\n  };\n\n  \/**\n   * Create Progressbar\n   * @method H5P.JoubelUI.createProgressbar\n   * @param  {number=}       numSteps The total numer of steps\n   * @param {Object} [options] Additional options\n   * @param {boolean} [options.disableAria] Disable readspeaker assistance\n   * @param {string} [options.progressText] A progress text for describing\n   *  current progress out of total progress for readspeakers.\n   *  e.g. \"Slide :num of :total\"\n   * @return {H5P.JoubelProgressbar}\n   *\/\n  JoubelUI.createProgressbar = function (numSteps, options) {\n    return new H5P.JoubelProgressbar(numSteps, options);\n  };\n\n  \/**\n   * Create standard Joubel button\n   *\n   * @method H5P.JoubelUI.createButton\n   * @param {object} params\n   *  May hold any properties allowed by jQuery. If href is set, an A tag\n   *  is used, if not a button tag is used.\n   * @return {H5P.jQuery} The jquery element created\n   *\/\n  JoubelUI.createButton = function(params) {\n    var type = 'button';\n    if (params.href) {\n      type = 'a';\n    }\n    else {\n      params.type = 'button';\n    }\n    if (params.class) {\n      params.class += ' h5p-joubelui-button';\n    }\n    else {\n      params.class = 'h5p-joubelui-button';\n    }\n    return $('<' + type + '\/>', params);\n  };\n\n  \/**\n   * Fix for iframe scoll bug in IOS. When focusing an element that doesn't have\n   * focus support by default the iframe will scroll the parent frame so that\n   * the focused element is out of view. This varies dependening on the elements\n   * of the parent frame.\n   *\/\n  if (H5P.isFramed && !H5P.hasiOSiframeScrollFix &&\n      \/iPad|iPhone|iPod\/.test(navigator.userAgent)) {\n    H5P.hasiOSiframeScrollFix = true;\n\n    \/\/ Keep track of original focus function\n    var focus = HTMLElement.prototype.focus;\n\n    \/\/ Override the original focus\n    HTMLElement.prototype.focus = function () {\n      \/\/ Only focus the element if it supports it natively\n      if ( (this instanceof HTMLAnchorElement ||\n            this instanceof HTMLInputElement ||\n            this instanceof HTMLSelectElement ||\n            this instanceof HTMLTextAreaElement ||\n            this instanceof HTMLButtonElement ||\n            this instanceof HTMLIFrameElement ||\n            this instanceof HTMLAreaElement) && \/\/ HTMLAreaElement isn't supported by Safari yet.\n          !this.getAttribute('role')) { \/\/ Focus breaks if a different role has been set\n          \/\/ In theory this.isContentEditable should be able to recieve focus,\n          \/\/ but it didn't work when tested.\n\n        \/\/ Trigger the original focus with the proper context\n        focus.call(this);\n      }\n    };\n  }\n\n  return JoubelUI;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/scripts\/question.js?ver=1.3.4":"\nH5P.Question = (function ($, EventDispatcher, JoubelUI) {\n\n  \/**\n   * Extending this class make it alot easier to create tasks for other\n   * content types.\n   *\n   * @class H5P.Question\n   * @extends H5P.EventDispatcher\n   * @param {string} type\n   *\/\n  function Question(type) {\n    var self = this;\n\n    \/\/ Inheritance\n    EventDispatcher.call(self);\n\n    \/\/ Register default section order\n    self.order = ['video', 'image', 'introduction', 'content', 'explanation', 'feedback', 'buttons', 'read'];\n\n    \/\/ Keep track of registered sections\n    var sections = {};\n\n    \/\/ Buttons\n    var buttons = {};\n    var buttonOrder = [];\n\n    \/\/ Wrapper when attached\n    var $wrapper;\n\n    \/\/ Click element\n    var clickElement;\n\n    \/\/ ScoreBar\n    var scoreBar;\n\n    \/\/ Keep track of the feedback's visual status.\n    var showFeedback;\n\n    \/\/ Keep track of which buttons are scheduled for hiding.\n    var buttonsToHide = [];\n\n    \/\/ Keep track of which buttons are scheduled for showing.\n    var buttonsToShow = [];\n\n    \/\/ Keep track of the hiding and showing of buttons.\n    var toggleButtonsTimer;\n    var toggleButtonsTransitionTimer;\n    var buttonTruncationTimer;\n\n    \/\/ Keeps track of initialization of question\n    var initialized = false;\n\n    \/**\n     * @type {Object} behaviour Behaviour of Question\n     * @property {Boolean} behaviour.disableFeedback Set to true to disable feedback section\n     *\/\n    var behaviour = {\n      disableFeedback: false,\n      disableReadSpeaker: false\n    };\n\n    \/\/ Keeps track of thumb state\n    var imageThumb = true;\n\n    \/\/ Keeps track of image transitions\n    var imageTransitionTimer;\n\n    \/\/ Keep track of whether sections is transitioning.\n    var sectionsIsTransitioning = false;\n\n    \/\/ Keep track of auto play state\n    var disableAutoPlay = false;\n\n    \/\/ Feedback transition timer\n    var feedbackTransitionTimer;\n\n    \/\/ Used when reading messages to the user\n    var $read, readText;\n\n    \/**\n     * Register section with given content.\n     *\n     * @private\n     * @param {string} section ID of the section\n     * @param {(string|H5P.jQuery)} [content]\n     *\/\n    var register = function (section, content) {\n      sections[section] = {};\n      var $e = sections[section].$element = $('<div\/>', {\n        'class': 'h5p-question-' + section,\n      });\n      if (content) {\n        $e[content instanceof $ ? 'append' : 'html'](content);\n      }\n    };\n\n    \/**\n     * Update registered section with content.\n     *\n     * @private\n     * @param {string} section ID of the section\n     * @param {(string|H5P.jQuery)} content\n     *\/\n    var update = function (section, content) {\n      if (content instanceof $) {\n        sections[section].$element.html('').append(content);\n      }\n      else {\n        sections[section].$element.html(content);\n      }\n    };\n\n    \/**\n     * Insert element with given ID into the DOM.\n     *\n     * @private\n     * @param {array|Array|string[]} order\n     * List with ordered element IDs\n     * @param {string} id\n     * ID of the element to be inserted\n     * @param {Object} elements\n     * Maps ID to the elements\n     * @param {H5P.jQuery} $container\n     * Parent container of the elements\n     *\/\n    var insert = function (order, id, elements, $container) {\n      \/\/ Try to find an element id should be after\n      for (var i = 0; i < order.length; i++) {\n        if (order[i] === id) {\n          \/\/ Found our pos\n          while (i > 0 &&\n          (elements[order[i - 1]] === undefined ||\n          !elements[order[i - 1]].isVisible)) {\n            i--;\n          }\n          if (i === 0) {\n            \/\/ We are on top.\n            elements[id].$element.prependTo($container);\n          }\n          else {\n            \/\/ Add after element\n            elements[id].$element.insertAfter(elements[order[i - 1]].$element);\n          }\n          elements[id].isVisible = true;\n          break;\n        }\n      }\n    };\n\n    \/**\n     * Make feedback into a popup and position relative to click.\n     *\n     * @private\n     * @param {string} [closeText] Text for the close button\n     *\/\n    var makeFeedbackPopup = function (closeText) {\n      var $element = sections.feedback.$element;\n      var $click = (clickElement != null ? clickElement.$element : null);\n\n      $element\n        .appendTo(sections.content.$element)\n        .addClass('h5p-question-popup');\n\n      $element.parent()\n        .addClass('h5p-has-question-popup');\n\n      \/\/ Draw the tail\n      var $tail = $('<div\/>', {\n        'class': 'h5p-question-feedback-tail'\n      }).hide()\n        .appendTo($element.parent());\n\n      \/\/ Draw the close button\n      var $close = $('<div\/>', {\n        'class': 'h5p-question-feedback-close',\n        'tabindex': 0,\n        'title': closeText,\n        on: {\n          click: function (event) {\n            $element.remove();\n            $tail.remove();\n            event.preventDefault();\n          },\n          keydown: function (event) {\n            switch (event.which) {\n              case 13: \/\/ Enter\n              case 32: \/\/ Space\n                $element.remove();\n                $tail.remove();\n                event.preventDefault();\n            }\n          }\n        }\n      })\n      .hide()\n      .appendTo($element);\n\n      if ($click != null) {\n        if ($click.hasClass('correct')) {\n          $element.addClass('h5p-question-feedback-correct');\n          $close.show();\n          sections.buttons.$element.hide();\n        } else {\n          sections.buttons.$element.appendTo(sections.feedback.$element);\n        }\n      }\n\n      positionFeedbackPopup($element, $click);\n    };\n\n    \/**\n     * Position the feedback popup.\n     *\n     * @private\n     * @param {H5P.jQuery} $element Feedback div\n     * @param {H5P.jQuery} $click Visual click div\n     *\/\n    var positionFeedbackPopup = function ($element, $click) {\n      var $container = $element.parent();\n      var $tail = $element.siblings('.h5p-question-feedback-tail');\n      var popupWidth = $element.outerWidth();\n      var popupHeight = setElementHeight($element);\n      var space = 15;\n      var disableTail = false;\n      var positionY = $container.height() \/ 2 - popupHeight \/ 2;\n      var positionX = $container.width() \/ 2 - popupWidth \/ 2;\n      var tailX = 0;\n      var tailY = 0;\n      var tailRotation = 0;\n\n      if ($click != null) {\n        \/\/ Edge detection for click, takes space into account\n        var clickNearTop = ($click[0].offsetTop < space);\n        var clickNearBottom = ($click[0].offsetTop + $click.height() > $container.height() - space);\n        var clickNearLeft = ($click[0].offsetLeft < space);\n        var clickNearRight = ($click[0].offsetLeft + $click.width() > $container.width() - space);\n\n        \/\/ Click is not in a corner or close to edge, calculate position normally\n        positionX = $click[0].offsetLeft - popupWidth \/ 2  + $click.width() \/ 2;\n        positionY = $click[0].offsetTop - popupHeight - space;\n        tailX = positionX + popupWidth \/ 2 - $tail.width() \/ 2;\n        tailY = positionY + popupHeight - ($tail.height() \/ 2);\n        tailRotation = 225;\n\n        \/\/ If popup is outside top edge, position under click instead\n        if (popupHeight + space > $click[0].offsetTop) {\n          positionY = $click[0].offsetTop + $click.height() + space;\n          tailY = positionY - $tail.height() \/ 2 ;\n          tailRotation = 45;\n        }\n\n        \/\/ If popup is outside left edge, position left\n        if (positionX < 0) {\n          positionX = 0;\n        }\n\n        \/\/ If popup is outside right edge, position right\n        if (positionX + popupWidth > $container.width()) {\n          positionX = $container.width() - popupWidth;\n        }\n\n        \/\/ Special cases such as corner clicks, or close to an edge, they override X and Y positions if met\n        if (clickNearTop && (clickNearLeft || clickNearRight)) {\n          positionX = $click[0].offsetLeft + (clickNearLeft ? $click.width() : -popupWidth);\n          positionY = $click[0].offsetTop + $click.height();\n          disableTail = true;\n        }\n        else if (clickNearBottom && (clickNearLeft || clickNearRight)) {\n          positionX = $click[0].offsetLeft + (clickNearLeft ? $click.width() : -popupWidth);\n          positionY = $click[0].offsetTop - popupHeight;\n          disableTail = true;\n        }\n        else if (!clickNearTop && !clickNearBottom) {\n          if (clickNearLeft || clickNearRight) {\n            positionY = $click[0].offsetTop - popupHeight \/ 2 + $click.width() \/ 2;\n            positionX = $click[0].offsetLeft + (clickNearLeft ? $click.width() + space : -popupWidth + -space);\n            \/\/ Make sure this does not position the popup off screen\n            if (positionX < 0) {\n              positionX = 0;\n              disableTail = true;\n            }\n            else {\n              tailX = positionX + (clickNearLeft ? - $tail.width() \/ 2 : popupWidth - $tail.width() \/ 2);\n              tailY = positionY + popupHeight \/ 2 - $tail.height() \/ 2;\n              tailRotation = (clickNearLeft ? 315 : 135);\n            }\n          }\n        }\n\n        \/\/ Contain popup from overflowing bottom edge\n        if (positionY + popupHeight > $container.height()) {\n          positionY = $container.height() - popupHeight;\n\n          if (popupHeight > $container.height() - ($click[0].offsetTop + $click.height() + space)) {\n            disableTail = true;\n          }\n        }\n      }\n      else {\n        disableTail = true;\n      }\n\n      \/\/ Contain popup from ovreflowing top edge\n      if (positionY < 0) {\n        positionY = 0;\n      }\n\n      $element.css({top: positionY, left: positionX});\n      $tail.css({top: tailY, left: tailX});\n\n      if (!disableTail) {\n        $tail.css({\n          'left': tailX,\n          'top': tailY,\n          'transform': 'rotate(' + tailRotation + 'deg)'\n        }).show();\n      }\n      else {\n        $tail.hide();\n      }\n    };\n\n    \/**\n     * Set element max height, used for animations.\n     *\n     * @param {H5P.jQuery} $element\n     *\/\n    var setElementHeight = function ($element) {\n      if (!$element.is(':visible')) {\n        \/\/ No animation\n        $element.css('max-height', 'none');\n        return;\n      }\n\n      \/\/ If this element is shown in the popup, we can't set width to 100%,\n      \/\/ since it already has a width set in CSS\n      var isFeedbackPopup = $element.hasClass('h5p-question-popup');\n\n      \/\/ Get natural element height\n      var $tmp = $element.clone()\n        .css({\n          'position': 'absolute',\n          'max-height': 'none',\n          'width': isFeedbackPopup ? '' : '100%'\n        })\n        .appendTo($element.parent());\n\n      \/\/ Need to take margins into account when calculating available space\n      var sideMargins = parseFloat($element.css('margin-left'))\n        + parseFloat($element.css('margin-right'));\n      var tmpElWidth = $tmp.css('width') ? $tmp.css('width') : '100%';\n      $tmp.css('width', 'calc(' + tmpElWidth + ' - ' + sideMargins + 'px)');\n\n      \/\/ Apply height to element\n      var h = Math.round($tmp.get(0).getBoundingClientRect().height);\n      var fontSize = parseFloat($element.css('fontSize'));\n      var relativeH = h \/ fontSize;\n      $element.css('max-height', relativeH + 'em');\n      $tmp.remove();\n\n      if (h > 0 && sections.buttons && sections.buttons.$element === $element) {\n\n        \/\/ Make sure buttons section is visible\n        sections.buttons.$element.addClass('h5p-question-visible');\n\n        \/\/ Resize buttons after resizing button section\n        setTimeout(function () {\n          resizeButtons();\n        }, 150);\n      }\n      return h;\n    };\n\n    \/**\n     * Does the actual job of hiding the buttons scheduled for hiding.\n     *\n     * @private\n     * @param {boolean} [relocateFocus] Find a new button to focus\n     *\/\n    var hideButtons = function (relocateFocus) {\n      for (var i = 0; i < buttonsToHide.length; i++) {\n        hideButton(buttonsToHide[i].id);\n      }\n      buttonsToHide = [];\n\n      if (relocateFocus) {\n        self.focusButton();\n      }\n    };\n\n    \/**\n     * Does the actual hiding.\n     * @private\n     * @param {string} buttonId\n     *\/\n    var hideButton = function (buttonId) {\n      \/\/ Using detach() vs hide() makes it harder to cheat.\n      buttons[buttonId].$element.detach();\n      buttons[buttonId].isVisible = false;\n    };\n\n    \/**\n     * Shows the buttons on the next tick. This is to avoid buttons flickering\n     * If they're both added and removed on the same tick.\n     *\n     * @private\n     *\/\n    var toggleButtons = function () {\n\n      \/\/ Clear transition timer, reevaluate if buttons will be detached\n      clearTimeout(toggleButtonsTransitionTimer);\n\n      \/\/ Show buttons\n      for (var i = 0; i < buttonsToShow.length; i++) {\n        insert(buttonOrder, buttonsToShow[i].id, buttons, sections.buttons.$element);\n        buttons[buttonsToShow[i].id].isVisible = true;\n      }\n      buttonsToShow = [];\n\n      \/\/ Hide buttons\n      var numToHide = 0;\n      var relocateFocus = false;\n      for (var j = 0; j < buttonsToHide.length; j++) {\n        var button = buttons[buttonsToHide[j].id];\n        if (button.isVisible) {\n          numToHide += 1;\n        }\n        if (button.$element.is(':focus')) {\n          \/\/ Move focus to the first visible button.\n          relocateFocus = true;\n        }\n      }\n\n      var animationTimer = 150;\n      if (sections.feedback && sections.feedback.$element.hasClass('h5p-question-popup')) {\n        animationTimer = 0;\n      }\n\n      if (sections.buttons && numToHide === sections.buttons.$element.children().length) {\n        \/\/ All buttons are going to be hidden. Hide container using transition.\n        sections.buttons.$element.removeClass('h5p-question-visible');\n        sections.buttons.$element.css('max-height', '');\n        sectionsIsTransitioning = true;\n\n        \/\/ Wait for animations before detaching buttons\n        toggleButtonsTransitionTimer = setTimeout(function () {\n          hideButtons(relocateFocus);\n          sectionsIsTransitioning = false;\n        }, animationTimer);\n      }\n      else {\n        hideButtons(relocateFocus);\n\n        \/\/ Show button section\n        if (!sections.buttons.$element.is(':empty')) {\n          sections.buttons.$element.addClass('h5p-question-visible');\n          setElementHeight(sections.buttons.$element);\n\n          \/\/ Trigger resize after animation\n          toggleButtonsTransitionTimer = setTimeout(function () {\n            self.trigger('resize');\n          }, animationTimer);\n        }\n      }\n\n      \/\/ Resize buttons to fit container\n      resizeButtons();\n\n      toggleButtonsTimer = undefined;\n    };\n\n    \/**\n     * Allows for scaling of the question image.\n     *\/\n    var scaleImage = function () {\n      var $imgSection = sections.image.$element;\n      clearTimeout(imageTransitionTimer);\n\n      \/\/ Add this here to avoid initial transition of the image making\n      \/\/ content overflow. Alternatively we need to trigger a resize.\n      $imgSection.addClass('animatable');\n\n      if (imageThumb) {\n\n        \/\/ Expand image\n        $(this).attr('aria-expanded', true);\n        $imgSection.addClass('h5p-question-image-fill-width');\n        imageThumb = false;\n\n        imageTransitionTimer = setTimeout(function () {\n          self.trigger('resize');\n        }, 600);\n      }\n      else {\n\n        \/\/ Scale down image\n        $(this).attr('aria-expanded', false);\n        $imgSection.removeClass('h5p-question-image-fill-width');\n        imageThumb = true;\n\n        imageTransitionTimer = setTimeout(function () {\n          self.trigger('resize');\n        }, 600);\n      }\n    };\n\n    \/**\n     * Get scrollable ancestor of element\n     *\n     * @private\n     * @param {H5P.jQuery} $element\n     * @param {Number} [currDepth=0] Current recursive calls to ancestor, stop at maxDepth\n     * @param {Number} [maxDepth=5] Maximum depth for finding ancestor.\n     * @returns {H5P.jQuery} Parent element that is scrollable\n     *\/\n    var findScrollableAncestor = function ($element, currDepth, maxDepth) {\n      if (!currDepth) {\n        currDepth = 0;\n      }\n      if (!maxDepth) {\n        maxDepth = 5;\n      }\n      \/\/ Check validation of element or if we have reached document root\n      if (!$element || !($element instanceof $) || document === $element.get(0) || currDepth >= maxDepth) {\n        return;\n      }\n\n      if ($element.css('overflow-y') === 'auto') {\n        return $element;\n      }\n      else {\n        return findScrollableAncestor($element.parent(), currDepth + 1, maxDepth);\n      }\n    };\n\n    \/**\n     * Scroll to bottom of Question.\n     *\n     * @private\n     *\/\n    var scrollToBottom = function () {\n      if (!$wrapper || ($wrapper.hasClass('h5p-standalone') && !H5P.isFullscreen)) {\n        return; \/\/ No scroll\n      }\n\n      var scrollableAncestor = findScrollableAncestor($wrapper);\n\n      \/\/ Scroll to bottom of scrollable ancestor\n      if (scrollableAncestor) {\n        scrollableAncestor.animate({\n          scrollTop: $wrapper.css('height')\n        }, \"slow\");\n      }\n    };\n\n    \/**\n     * Resize buttons to fit container width\n     *\n     * @private\n     *\/\n    var resizeButtons = function () {\n      if (!buttons || !sections.buttons) {\n        return;\n      }\n\n      \/\/ Clear button truncation timer if within a button truncation function\n      if (buttonTruncationTimer) {\n        clearTimeout(buttonTruncationTimer);\n      }\n\n      \/\/ Allow button section to attach before getting width\n      buttonTruncationTimer = setTimeout(function () {\n\n        \/\/ A static margin is added as buffer for smoother transitions\n        var buttonsWidth = 0;\n        for (var i in buttons) {\n          var $element = buttons[i].$element;\n          if (buttons[i].isVisible) {\n\n            \/\/Calculate exact button width\n            var buttonInstanceWidth = $element.get(0).offsetWidth +\n              parseFloat($element.css('margin-left')) +\n              parseFloat($element.css('margin-right'));\n            buttonsWidth += Math.ceil(buttonInstanceWidth) + 1;\n          }\n        }\n\n\n        \/\/ Button section reduced by 1 pixel for cross-broswer consistency.\n        var buttonSectionWidth = Math.floor($(sections.buttons.$element).width()) - 1;\n\n        \/\/ Remove button labels if width of buttons are too wide\n        if (buttonsWidth >= buttonSectionWidth) {\n          removeButtonLabels(buttonsWidth, buttonSectionWidth);\n        }\n        else {\n          restoreButtonLabels(buttonsWidth, buttonSectionWidth);\n        }\n        buttonTruncationTimer = undefined;\n      }, 0);\n    };\n\n    \/**\n     * Remove button labels until they use less than max width.\n     *\n     * @private\n     * @param {Number} buttonsWidth Total width of all buttons\n     * @param {Number} maxButtonsWidth Max width allowed for buttons\n     *\/\n    var removeButtonLabels = function (buttonsWidth, maxButtonsWidth) {\n      \/\/ Reverse traversal\n      for (var i = buttonOrder.length - 1; i >= 0; i--) {\n        var buttonId = buttonOrder[i];\n        if (!buttons[buttonId].isTruncated && buttons[buttonId].isVisible) {\n          var $button = buttons[buttonId].$element;\n          var $tmp = $button.clone()\n            .css({\n              'position': 'absolute',\n              'white-space': 'nowrap',\n              'max-width': 'none'\n            })\n            .addClass('truncated')\n            .html('')\n            .appendTo($button.parent());\n\n          \/\/ Calculate new total width of buttons\n          buttonsWidth = buttonsWidth - $button.outerWidth(true) + $tmp.outerWidth(true);\n\n          \/\/ Remove label\n          $button.attr('aria-label', $button.text());\n          $button.html('');\n          $button.addClass('truncated');\n          buttons[buttonId].isTruncated = true;\n          $tmp.remove();\n          if (buttonsWidth < maxButtonsWidth) {\n            \/\/ Buttons are small enough.\n            return;\n          }\n        }\n      }\n    };\n\n    \/**\n     * Restore button labels until it fills maximum possible width without exceeding the max width.\n     *\n     * @private\n     * @param {Number} buttonsWidth Total width of all buttons\n     * @param {Number} maxButtonsWidth Max width allowed for buttons\n     *\/\n    var restoreButtonLabels = function (buttonsWidth, maxButtonsWidth) {\n      for (var i = 0; i < buttonOrder.length; i++) {\n        var buttonId = buttonOrder[i];\n        if (buttons[buttonId].isTruncated && buttons[buttonId].isVisible) {\n\n          \/\/ Check if adding label exceeds allowed width\n          var $button = buttons[buttonId].$element;\n          var $tmp = $button.clone()\n            .css({\n              'position': 'absolute',\n              'white-space': 'nowrap',\n              'max-width': 'none'\n            }).removeClass('truncated')\n            .html(buttons[buttonId].text)\n            .appendTo($button.parent());\n\n          \/\/ Make sure clone was successfull\n          if(!$button.length || !$tmp.length) {\n            return;\n          }\n\n          var oldButtonSize = Math.floor($button.get(0).offsetWidth) - 1;\n          var newButtonSize = Math.ceil($tmp.get(0).offsetWidth) + 1;\n\n          \/\/ Calculate new total width of buttons with a static pixel for consistency cross-browser\n          buttonsWidth = buttonsWidth - Math.floor(oldButtonSize) + Math.ceil(newButtonSize) + 1;\n\n          $tmp.remove();\n          if (buttonsWidth >= maxButtonsWidth) {\n            return;\n          }\n          \/\/ Restore label\n          $button.html(buttons[buttonId].text);\n          $button.removeClass('truncated');\n          buttons[buttonId].isTruncated = false;\n        }\n      }\n    };\n\n    \/**\n     * Helper function for finding index of keyValue in array\n     *\n     * @param {String} keyValue Value to be found\n     * @param {String} key In key\n     * @param {Array} array In array\n     * @returns {number}\n     *\/\n    var existsInArray = function (keyValue, key, array) {\n      var i;\n      for (i = 0; i < array.length; i++) {\n        if (array[i][key] === keyValue) {\n          return i;\n        }\n      }\n      return -1;\n    };\n\n    \/**\n     * Set behaviour for question.\n     *\n     * @param {Object} options An object containing behaviour that will be extended by Question\n     *\/\n    self.setBehaviour = function (options) {\n      $.extend(behaviour, options);\n    };\n\n    \/**\n     * A video to display above the task.\n     *\n     * @param {object} params\n     *\/\n    self.setVideo = function (params) {\n      sections.video = {\n        $element: $('<div\/>', {\n          'class': 'h5p-question-video'\n        })\n      };\n\n      if (disableAutoPlay && params.params.playback) {\n        params.params.playback.autoplay = false;\n      }\n\n      \/\/ Never fit to wrapper\n      if (!params.params.visuals) {\n        params.params.visuals = {};\n      }\n      params.params.visuals.fit = false;\n      sections.video.instance = H5P.newRunnable(params, self.contentId, sections.video.$element, true);\n      var fromVideo = false; \/\/ Hack to avoid never ending loop\n      sections.video.instance.on('resize', function () {\n        fromVideo = true;\n        self.trigger('resize');\n        fromVideo = false;\n      });\n      self.on('resize', function () {\n        if (!fromVideo) {\n          sections.video.instance.trigger('resize');\n        }\n      });\n\n      return self;\n    };\n\n    \/**\n     * Will stop any playback going on in the task.\n     *\/\n    self.pause = function () {\n      if (sections.video && sections.video.isVisible) {\n        sections.video.instance.pause();\n      }\n    };\n\n    \/**\n     * Start playback of video\n     *\/\n    self.play = function () {\n      if (sections.video && sections.video.isVisible) {\n        sections.video.instance.play();\n      }\n    };\n\n    \/**\n     * Disable auto play, useful in editors.\n     *\/\n    self.disableAutoPlay = function () {\n      disableAutoPlay = true;\n    };\n\n    \/**\n     * Add task image.\n     *\n     * @param {string} path Relative\n     * @param {Object} [options] Options object\n     * @param {string} [options.alt] Text representation\n     * @param {Boolean} [options.disableImageZooming] Set as true to disable image zooming\n     *\/\n    self.setImage = function (path, options) {\n      options = options ? options : {};\n      sections.image = {};\n      \/\/ Image container\n      sections.image.$element = $('<div\/>', {\n        'class': 'h5p-question-image h5p-question-image-fill-width'\n      });\n\n      \/\/ Inner wrap\n      var $imgWrap = $('<div\/>', {\n        'class': 'h5p-question-image-wrap',\n        appendTo: sections.image.$element\n      });\n\n      \/\/ Image element\n      var $img = $('<img\/>', {\n        src: H5P.getPath(path, self.contentId),\n        alt: (options.alt === undefined ? '' : options.alt),\n        on: {\n          load: function () {\n            self.trigger('imageLoaded', this);\n            self.trigger('resize');\n          }\n        },\n        appendTo: $imgWrap\n      });\n\n      \/\/ Disable image zooming\n      if (options.disableImageZooming) {\n        $img.css('maxHeight', 'none');\n\n        \/\/ Make sure we are using the correct amount of width at all times\n        var determineImgWidth = function () {\n\n          \/\/ Remove margins if natural image width is bigger than section width\n          var imageSectionWidth = sections.image.$element.get(0).getBoundingClientRect().width;\n\n          \/\/ Do not transition, for instant measurements\n          $imgWrap.css({\n            '-webkit-transition': 'none',\n            'transition': 'none'\n          });\n\n          \/\/ Margin as translateX on both sides of image.\n          var diffX = 2 * ($imgWrap.get(0).getBoundingClientRect().left -\n            sections.image.$element.get(0).getBoundingClientRect().left);\n\n          if ($img.get(0).naturalWidth >= imageSectionWidth - diffX) {\n            sections.image.$element.addClass('h5p-question-image-fill-width');\n          }\n          else { \/\/ Use margin for small res images\n            sections.image.$element.removeClass('h5p-question-image-fill-width');\n          }\n\n          \/\/ Reset transition rules\n          $imgWrap.css({\n            '-webkit-transition': '',\n            'transition': ''\n          });\n        };\n\n        \/\/ Determine image width\n        if ($img.is(':visible')) {\n          determineImgWidth();\n        }\n        else {\n          $img.load(function () {\n            determineImgWidth();\n          });\n        }\n\n        \/\/ Skip adding zoom functionality\n        return;\n      }\n\n      var sizeDetermined = false;\n      var determineSize = function () {\n        if (sizeDetermined || !$img.is(':visible')) {\n          return; \/\/ Try again next time.\n        }\n\n        $imgWrap.addClass('h5p-question-image-scalable')\n          .attr('aria-expanded', false)\n          .attr('role', 'button')\n          .attr('tabIndex', '0')\n          .on('click', function (event) {\n            if (event.which === 1) {\n              scaleImage.apply(this); \/\/ Left mouse button click\n            }\n          }).on('keypress', function (event) {\n          if (event.which === 32) {\n            scaleImage.apply(this); \/\/ Space bar pressed\n          }\n        });\n        sections.image.$element.removeClass('h5p-question-image-fill-width');\n\n        sizeDetermined  = true; \/\/ Prevent any futher events\n      };\n\n      self.on('resize', determineSize);\n\n      return self;\n    };\n\n    \/**\n     * Add the introduction section.\n     *\n     * @param {(string|H5P.jQuery)} content\n     *\/\n    self.setIntroduction = function (content) {\n      register('introduction', content);\n\n      return self;\n    };\n\n    \/**\n     * Add the content section.\n     *\n     * @param {(string|H5P.jQuery)} content\n     * @param {Object} [options]\n     * @param {string} [options.class]\n     *\/\n    self.setContent = function (content, options) {\n      register('content', content);\n\n      if (options && options.class) {\n        sections.content.$element.addClass(options.class);\n      }\n\n      return self;\n    };\n\n    \/**\n     * Force readspeaker to read text. Useful when you have to use\n     * setTimeout for animations.\n     *\/\n    self.read = function (content) {\n      if (!$read) {\n        return; \/\/ Not ready yet\n      }\n\n      if (readText) {\n        \/\/ Combine texts if called multiple times\n        readText += (readText.substr(-1, 1) === '.' ? ' ' : '. ') + content;\n      }\n      else {\n        readText = content;\n      }\n\n      \/\/ Set text\n      $read.html(readText);\n\n      setTimeout(function () {\n        \/\/ Stop combining when done reading\n        readText = null;\n        $read.html('');\n      }, 100);\n    };\n\n    \/**\n     * Read feedback\n     *\/\n    self.readFeedback = function () {\n      var invalidFeedback =\n        behaviour.disableReadSpeaker ||\n        !showFeedback ||\n        !sections.feedback ||\n        !sections.feedback.$element;\n\n      if (invalidFeedback) {\n        return;\n      }\n\n      var $feedbackText = $('.h5p-question-feedback-content-text', sections.feedback.$element);\n      if ($feedbackText && $feedbackText.html() && $feedbackText.html().length) {\n        self.read($feedbackText.html());\n      }\n    };\n\n    \/**\n     * Remove feedback\n     *\n     * @return {H5P.Question}\n     *\/\n    self.removeFeedback = function () {\n\n      clearTimeout(feedbackTransitionTimer);\n\n      if (sections.feedback && showFeedback) {\n\n        showFeedback = false;\n\n        \/\/ Hide feedback section\n        sections.feedback.$element.removeClass('h5p-question-visible');\n        sections.feedback.$element.css('max-height', '');\n        sectionsIsTransitioning = true;\n\n        \/\/ Detach after transition\n        feedbackTransitionTimer = setTimeout(function () {\n          \/\/ Avoiding Transition.onTransitionEnd since it will register multiple events, and there's no way to cancel it if the transition changes back to \"show\" while the animation is happening.\n          if (!showFeedback) {\n            sections.feedback.$element.children().detach();\n\n            \/\/ Trigger resize after animation\n            self.trigger('resize');\n          }\n          sectionsIsTransitioning = false;\n          scoreBar.setScore(0);\n        }, 150);\n\n        if ($wrapper) {\n          $wrapper.find('.h5p-question-feedback-tail').remove();\n        }\n      }\n\n      return self;\n    };\n\n    \/**\n     * Set feedback message.\n     *\n     * @param {string} [content]\n     * @param {number} score The score\n     * @param {number} maxScore The maximum score for this question\n     * @param {string} [scoreBarLabel] Makes it easier for readspeakers to identify the scorebar\n     * @param {string} [helpText] Help text that describes the score inside a tip icon\n     * @param {object} [popupSettings] Extra settings for popup feedback\n     * @param {boolean} [popupSettings.showAsPopup] Should the feedback display as popup?\n     * @param {string} [popupSettings.closeText] Translation for close button text\n     * @param {object} [popupSettings.click] Element representing where user clicked on screen\n     *\/\n    self.setFeedback = function (content, score, maxScore, scoreBarLabel, helpText, popupSettings, scoreExplanationButtonLabel) {\n      \/\/ Feedback is disabled\n      if (behaviour.disableFeedback) {\n        return self;\n      }\n\n      clickElement = (popupSettings != null && popupSettings.click != null ? popupSettings.click : null);\n      clearTimeout(feedbackTransitionTimer);\n\n      var $feedback = $('<div>', {\n        'class': 'h5p-question-feedback-container'\n      });\n\n      var $feedbackContent = $('<div>', {\n        'class': 'h5p-question-feedback-content'\n      }).appendTo($feedback);\n\n      \/\/ Feedback text\n      $('<div>', {\n        'class': 'h5p-question-feedback-content-text',\n        'html': content\n      }).appendTo($feedbackContent);\n\n      if (scoreBar === undefined) {\n        scoreBar = JoubelUI.createScoreBar(maxScore, scoreBarLabel, helpText, scoreExplanationButtonLabel);\n      }\n      scoreBar.appendTo($feedback);\n\n      $feedbackContent.toggleClass('has-content', content !== undefined && content.length > 0);\n\n      \/\/ Feedback for readspeakers\n      if (!behaviour.disableReadSpeaker && scoreBarLabel) {\n        self.read(scoreBarLabel.replace(':num', score).replace(':total', maxScore) + '. ' + (content ? content : ''));\n      }\n\n      showFeedback = true;\n      if (sections.feedback) {\n        \/\/ Update section\n        update('feedback', $feedback);\n      }\n      else {\n        \/\/ Create section\n        register('feedback', $feedback);\n        if (initialized && $wrapper) {\n          insert(self.order, 'feedback', sections, $wrapper);\n        }\n      }\n\n      sections.feedback.$element.addClass('h5p-question-visible');\n      if (popupSettings != null && popupSettings.showAsPopup == true) {\n        makeFeedbackPopup(popupSettings.closeText);\n        scoreBar.setScore(score);\n      }\n      else {\n        \/\/ Show feedback section\n        feedbackTransitionTimer = setTimeout(function () {\n          setElementHeight(sections.feedback.$element);\n          sectionsIsTransitioning = true;\n\n          \/\/ Scroll to bottom after showing feedback\n          scrollToBottom();\n\n          \/\/ Trigger resize after animation\n          feedbackTransitionTimer = setTimeout(function () {\n            sectionsIsTransitioning = false;\n            self.trigger('resize');\n            scoreBar.setScore(score);\n          }, 150);\n        }, 0);\n      }\n\n      return self;\n    };\n\n    \/**\n     * Set feedback content (no animation).\n     *\n     * @param {string} content\n     * @param {boolean} [extendContent] True will extend content, instead of replacing it\n     *\/\n    self.updateFeedbackContent = function (content, extendContent) {\n      if (sections.feedback && sections.feedback.$element) {\n\n        if (extendContent) {\n          content = $('.h5p-question-feedback-content', sections.feedback.$element).html() + ' ' + content;\n        }\n\n        \/\/ Update feedback content html\n        $('.h5p-question-feedback-content', sections.feedback.$element).html(content).addClass('has-content');\n\n        \/\/ Make sure the height is correct\n        setElementHeight(sections.feedback.$element);\n      }\n\n      return self;\n    };\n\n    \/**\n     * Set the content of the explanation \/ feedback panel\n     *\n     * @param {Object} data\n     * @param {string} data.correct\n     * @param {string} data.wrong\n     * @param {string} data.text\n     * @param {string} title Title for explanation panel\n     *\n     * @return {H5P.Question}\n     *\/\n    self.setExplanation = function (data, title) {\n      if (data) {\n        var explainer = new H5P.Question.Explainer(title, data);\n\n        if (sections.explanation) {\n          \/\/ Update section\n          update('explanation', explainer.getElement());\n        }\n        else {\n          register('explanation', explainer.getElement());\n\n          if (initialized && $wrapper) {\n            insert(self.order, 'explanation', sections, $wrapper);\n          }\n        }\n      }\n      else if (sections.explanation) {\n        \/\/ Hide explanation section\n        sections.explanation.$element.children().detach();\n      }\n\n      return self;\n    };\n\n    \/**\n     * Checks to see if button is registered.\n     *\n     * @param {string} id\n     * @returns {boolean}\n     *\/\n    self.hasButton = function (id) {\n      return (buttons[id] !== undefined);\n    };\n\n    \/**\n     * @typedef {Object} ConfirmationDialog\n     * @property {boolean} [enable] Must be true to show confirmation dialog\n     * @property {Object} [instance] Instance that uses confirmation dialog\n     * @property {jQuery} [$parentElement] Append to this element.\n     * @property {Object} [l10n] Translatable fields\n     * @property {string} [l10n.header] Header text\n     * @property {string} [l10n.body] Body text\n     * @property {string} [l10n.cancelLabel]\n     * @property {string} [l10n.confirmLabel]\n     *\/\n\n    \/**\n     * Register buttons for the task.\n     *\n     * @param {string} id\n     * @param {string} text label\n     * @param {function} clicked\n     * @param {boolean} [visible=true]\n     * @param {Object} [options] Options for button\n     * @param {Object} [extras] Extra options\n     * @param {ConfirmationDialog} [extras.confirmationDialog] Confirmation dialog\n     *\/\n    self.addButton = function (id, text, clicked, visible, options, extras) {\n      if (buttons[id]) {\n        return self; \/\/ Already registered\n      }\n\n      if (sections.buttons === undefined)  {\n        \/\/ We have buttons, register wrapper\n        register('buttons');\n        if (initialized) {\n          insert(self.order, 'buttons', sections, $wrapper);\n        }\n      }\n\n      extras = extras || {};\n      extras.confirmationDialog = extras.confirmationDialog || {};\n      options = options || {};\n\n      var confirmationDialog =\n        self.addConfirmationDialogToButton(extras.confirmationDialog, clicked);\n\n      \/**\n       * Handle button clicks through both mouse and keyboard\n       * @private\n       *\/\n      var handleButtonClick = function () {\n        if (extras.confirmationDialog.enable && confirmationDialog) {\n          \/\/ Show popups section if used\n          if (!extras.confirmationDialog.$parentElement) {\n            sections.popups.$element.removeClass('hidden');\n          }\n          confirmationDialog.show($e.position().top);\n        }\n        else {\n          clicked();\n        }\n      };\n\n      buttons[id] = {\n        isTruncated: false,\n        text: text\n      };\n      var $e = buttons[id].$element = JoubelUI.createButton($.extend({\n        'class': 'h5p-question-' + id,\n        html: text,\n        on: {\n          click: function (event) {\n            handleButtonClick();\n            if (options.href !== undefined) {\n              event.preventDefault();\n            }\n          },\n          keydown: function (event) {\n            switch (event.which) {\n              case 13: \/\/ Enter\n              case 32: \/\/ Space\n                handleButtonClick();\n                event.preventDefault();\n            }\n          }\n        }\n      }, options));\n      buttonOrder.push(id);\n\n      if (visible === undefined || visible) {\n        \/\/ Button should be visible\n        $e.appendTo(sections.buttons.$element);\n        buttons[id].isVisible = true;\n        sections.buttons.$element.addClass('h5p-question-visible');\n      }\n\n      return self;\n    };\n\n    \/**\n     * Add confirmation dialog to button\n     * @param {ConfirmationDialog} options\n     *  A confirmation dialog that will be shown before click handler of button\n     *  is triggered\n     * @param {function} clicked\n     *  Click handler of button\n     * @return {H5P.ConfirmationDialog|undefined}\n     *  Confirmation dialog if enabled\n     *\/\n    self.addConfirmationDialogToButton = function (options, clicked) {\n      options = options || {};\n\n      if (!options.enable) {\n        return;\n      }\n\n      \/\/ Confirmation dialog\n      var confirmationDialog = new H5P.ConfirmationDialog({\n        instance: options.instance,\n        headerText: options.l10n.header,\n        dialogText: options.l10n.body,\n        cancelText: options.l10n.cancelLabel,\n        confirmText: options.l10n.confirmLabel\n      });\n\n      \/\/ Determine parent element\n      if (options.$parentElement) {\n        confirmationDialog.appendTo(options.$parentElement.get(0));\n      }\n      else {\n\n        \/\/ Create popup section and append to that\n        if (sections.popups === undefined) {\n          register('popups');\n          if (initialized) {\n            insert(self.order, 'popups', sections, $wrapper);\n          }\n          sections.popups.$element.addClass('hidden');\n          self.order.push('popups');\n        }\n        confirmationDialog.appendTo(sections.popups.$element.get(0));\n      }\n\n      \/\/ Add event listeners\n      confirmationDialog.on('confirmed', function () {\n        if (!options.$parentElement) {\n          sections.popups.$element.addClass('hidden');\n        }\n        clicked();\n\n        \/\/ Trigger to content type\n        self.trigger('confirmed');\n      });\n\n      confirmationDialog.on('canceled', function () {\n        if (!options.$parentElement) {\n          sections.popups.$element.addClass('hidden');\n        }\n        \/\/ Trigger to content type\n        self.trigger('canceled');\n      });\n\n      return confirmationDialog;\n    };\n\n    \/**\n     * Show registered button with given identifier.\n     *\n     * @param {string} id\n     * @param {Number} [priority]\n     *\/\n    self.showButton = function (id, priority) {\n      if (buttons[id] === undefined) {\n        return self;\n      }\n\n      priority = priority || 0;\n\n      \/\/ Skip if already being shown\n      var indexToShow = existsInArray(id, 'id', buttonsToShow);\n      if (indexToShow !== -1) {\n\n        \/\/ Update priority\n        if (buttonsToShow[indexToShow].priority < priority) {\n          buttonsToShow[indexToShow].priority = priority;\n        }\n\n        return self;\n      }\n\n      \/\/ Check if button is going to be hidden on next tick\n      var exists = existsInArray(id, 'id', buttonsToHide);\n      if (exists !== -1) {\n\n        \/\/ Skip hiding if higher priority\n        if (buttonsToHide[exists].priority <= priority) {\n          buttonsToHide.splice(exists, 1);\n          buttonsToShow.push({id: id, priority: priority});\n        }\n\n      } \/\/ If button is not shown\n      else if (!buttons[id].$element.is(':visible')) {\n\n        \/\/ Show button on next tick\n        buttonsToShow.push({id: id, priority: priority});\n      }\n\n      if (!toggleButtonsTimer) {\n        toggleButtonsTimer = setTimeout(toggleButtons, 0);\n      }\n\n      return self;\n    };\n\n    \/**\n     * Hide registered button with given identifier.\n     *\n     * @param {string} id\n     * @param {number} [priority]\n     *\/\n    self.hideButton = function (id, priority) {\n      if (buttons[id] === undefined) {\n        return self;\n      }\n\n      priority = priority || 0;\n\n      \/\/ Skip if already being hidden\n      var indexToHide = existsInArray(id, 'id', buttonsToHide);\n      if (indexToHide !== -1) {\n\n        \/\/ Update priority\n        if (buttonsToHide[indexToHide].priority < priority) {\n          buttonsToHide[indexToHide].priority = priority;\n        }\n\n        return self;\n      }\n\n      \/\/ Check if buttons is going to be shown on next tick\n      var exists = existsInArray(id, 'id', buttonsToShow);\n      if (exists !== -1) {\n\n        \/\/ Skip showing if higher priority\n        if (buttonsToShow[exists].priority <= priority) {\n          buttonsToShow.splice(exists, 1);\n          buttonsToHide.push({id: id, priority: priority});\n        }\n      }\n      else if (!buttons[id].$element.is(':visible')) {\n\n        \/\/ Make sure it is detached in case the container is hidden.\n        hideButton(id);\n      }\n      else {\n\n        \/\/ Hide button on next tick.\n        buttonsToHide.push({id: id, priority: priority});\n      }\n\n      if (!toggleButtonsTimer) {\n        toggleButtonsTimer = setTimeout(toggleButtons, 0);\n      }\n\n      return self;\n    };\n\n    \/**\n     * Set focus to the given button. If no button is given the first visible\n     * button gets focused. This is useful if you lose focus.\n     *\n     * @param {string} [id]\n     *\/\n    self.focusButton = function (id) {\n      if (id === undefined) {\n        \/\/ Find first button that is visible.\n        for (var i = 0; i < buttonOrder.length; i++) {\n          var button = buttons[buttonOrder[i]];\n          if (button && button.isVisible) {\n            \/\/ Give that button focus\n            button.$element.focus();\n            break;\n          }\n        }\n      }\n      else if (buttons[id] && buttons[id].$element.is(':visible')) {\n        \/\/ Set focus to requested button\n        buttons[id].$element.focus();\n      }\n\n      return self;\n    };\n\n    \/**\n     * Toggle readspeaker functionality\n     * @param {boolean} [disable] True to disable, false to enable.\n     *\/\n    self.toggleReadSpeaker = function (disable) {\n      behaviour.disableReadSpeaker = disable || !behaviour.disableReadSpeaker;\n    };\n\n    \/**\n     * Set new element for section.\n     *\n     * @param {String} id\n     * @param {H5P.jQuery} $element\n     *\/\n    self.insertSectionAtElement = function (id, $element) {\n      if (sections[id] === undefined) {\n        register(id);\n      }\n      sections[id].parent = $element;\n\n      \/\/ Insert section if question is not initialized\n      if (!initialized) {\n        insert([id], id, sections, $element);\n      }\n\n      return self;\n    };\n\n    \/**\n     * Attach content to given container.\n     *\n     * @param {H5P.jQuery} $container\n     *\/\n    self.attach = function ($container) {\n      if (self.isRoot()) {\n        self.setActivityStarted();\n      }\n\n      \/\/ The first time we attach we also create our DOM elements.\n      if ($wrapper === undefined) {\n        if (self.registerDomElements !== undefined &&\n           (self.registerDomElements instanceof Function ||\n           typeof self.registerDomElements === 'function')) {\n\n           \/\/ Give the question type a chance to register before attaching\n          self.registerDomElements();\n        }\n\n        \/\/ Create section for reading messages\n        $read = $('<div\/>', {\n          'aria-live': 'polite',\n          'class': 'h5p-hidden-read'\n        });\n        register('read', $read);\n        self.trigger('registerDomElements');\n      }\n\n      \/\/ Prepare container\n      $wrapper = $container;\n      $container.html('')\n        .addClass('h5p-question h5p-' + type);\n\n      \/\/ Add sections in given order\n      var $sections = [];\n      for (var i = 0; i < self.order.length; i++) {\n        var section = self.order[i];\n        if (sections[section]) {\n          if (sections[section].parent) {\n            \/\/ Section has a different parent\n            sections[section].$element.appendTo(sections[section].parent);\n          }\n          else {\n            $sections.push(sections[section].$element);\n          }\n          sections[section].isVisible = true;\n        }\n      }\n\n      \/\/ Only append once to DOM for optimal performance\n      $container.append($sections);\n\n      \/\/ Let others react to dom changes\n      self.trigger('domChanged', {\n        '$target': $container,\n        'library': self.libraryInfo.machineName,\n        'contentId': self.contentId,\n        'key': 'newLibrary'\n      }, {'bubbles': true, 'external': true});\n\n      \/\/ ??\n      initialized = true;\n\n      return self;\n    };\n\n    \/**\n     * Detach all sections from their parents\n     *\/\n    self.detachSections = function () {\n      \/\/ Deinit Question\n      initialized = false;\n\n      \/\/ Detach sections\n      for (var section in sections) {\n        sections[section].$element.detach();\n      }\n\n      return self;\n    };\n\n    \/\/ Listen for resize\n    self.on('resize', function () {\n      \/\/ Allow elements to attach and set their height before resizing\n      if (!sectionsIsTransitioning && sections.feedback && showFeedback) {\n        \/\/ Resize feedback to fit\n        setElementHeight(sections.feedback.$element);\n      }\n\n      \/\/ Re-position feedback popup if in use\n      var $element = sections.feedback;\n      var $click = clickElement;\n\n      if ($element != null && $element.$element != null && $click != null && $click.$element != null) {\n        setTimeout(function() {\n          positionFeedbackPopup($element.$element, $click.$element);\n        }, 10);\n      }\n\n      resizeButtons();\n    });\n  }\n\n  \/\/ Inheritance\n  Question.prototype = Object.create(EventDispatcher.prototype);\n  Question.prototype.constructor = Question;\n\n  \/**\n   * Determine the overall feedback to display for the question.\n   * Returns empty string if no matching range is found.\n   *\n   * @param {Object[]} feedbacks\n   * @param {number} scoreRatio\n   * @return {string}\n   *\/\n  Question.determineOverallFeedback = function (feedbacks, scoreRatio) {\n    scoreRatio = Math.floor(scoreRatio * 100);\n\n    for (var i = 0; i < feedbacks.length; i++) {\n      var feedback = feedbacks[i];\n      var hasFeedback = (feedback.feedback !== undefined && feedback.feedback.trim().length !== 0);\n\n      if (feedback.from <= scoreRatio && feedback.to >= scoreRatio && hasFeedback) {\n        return feedback.feedback;\n      }\n    }\n\n    return '';\n  };\n\n  return Question;\n})(H5P.jQuery, H5P.EventDispatcher, H5P.JoubelUI);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/scripts\/explainer.js?ver=1.3.4":"\nH5P.Question.Explainer = (function ($) {\n  \/**\n   * Constructor\n   *\n   * @class\n   * @param {string} title\n   * @param {array} explanations\n   *\/\n  function Explainer(title, explanations) {\n    var self = this;\n\n    \/**\n     * Create the DOM structure\n     *\/\n    var createHTML = function () {\n      self.$explanation = $('<div>', {\n        'class': 'h5p-question-explanation-container'\n      });\n\n      \/\/ Add title:\n      $('<div>', {\n        'class': 'h5p-question-explanation-title',\n        role: 'heading',\n        html: title,\n        appendTo: self.$explanation\n      });\n\n      var $explanationList = $('<ul>', {\n        'class': 'h5p-question-explanation-list',\n        appendTo: self.$explanation\n      });\n\n      for (var i = 0; i < explanations.length; i++) {\n        var feedback = explanations[i];\n        var $explanationItem = $('<li>', {\n          'class': 'h5p-question-explanation-item',\n          appendTo: $explanationList\n        });\n\n        var $content = $('<div>', {\n          'class': 'h5p-question-explanation-status'\n        });\n\n        if (feedback.correct) {\n          $('<span>', {\n            'class': 'h5p-question-explanation-correct',\n            html: feedback.correct,\n            appendTo: $content\n          });\n        }\n        if (feedback.wrong) {\n          $('<span>', {\n            'class': 'h5p-question-explanation-wrong',\n            html: feedback.wrong,\n            appendTo: $content\n          });\n        }\n        $content.appendTo($explanationItem);\n\n        if (feedback.text) {\n          $('<div>', {\n            'class': 'h5p-question-explanation-text',\n            html: feedback.text,\n            appendTo: $explanationItem\n          });\n        }\n      }\n    };\n\n    createHTML();\n\n    \/**\n     * Return the container HTMLElement\n     *\n     * @return {HTMLElement}\n     *\/\n    self.getElement = function () {\n      return self.$explanation;\n    };\n  }\n\n  return Explainer;\n\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/scripts\/score-points.js?ver=1.3.4":"\n(function (Question) {\n\n  \/**\n   * Makes it easy to add animated score points for your question type.\n   *\n   * @class H5P.Question.ScorePoints\n   *\/\n  Question.ScorePoints = function () {\n    var self = this;\n\n    var elements = [];\n    var showElementsTimer;\n\n    \/**\n     * Create the element that displays the score point element for questions.\n     *\n     * @param {boolean} isCorrect\n     * @return {HTMLElement}\n     *\/\n    self.getElement = function (isCorrect) {\n      var element = document.createElement('div');\n      element.classList.add(isCorrect ? 'h5p-question-plus-one' : 'h5p-question-minus-one');\n      element.classList.add('h5p-question-hidden-one');\n      elements.push(element);\n\n      \/\/ Schedule display animation of all added elements\n      if (showElementsTimer) {\n        clearTimeout(showElementsTimer);\n      }\n      showElementsTimer = setTimeout(showElements, 0);\n\n      return element;\n    };\n\n    \/**\n     * @private\n     *\/\n    var showElements = function () {\n      \/\/ Determine delay between triggering animations\n      var delay = 0;\n      var increment = 150;\n      var maxTime = 1000;\n\n      if (elements.length && elements.length > Math.ceil(maxTime \/ increment)) {\n        \/\/ Animations will run for more than ~1 second, reduce it.\n        increment = maxTime \/ elements.length;\n      }\n\n      for (var i = 0; i < elements.length; i++) {\n        \/\/ Use timer to trigger show\n        setTimeout(showElement(elements[i]), delay);\n\n        \/\/ Increse delay for next element\n        delay += increment;\n      }\n    };\n\n    \/**\n     * Trigger transition animation for the given element\n     *\n     * @private\n     * @param {HTMLElement} element\n     * @return {function}\n     *\/\n    var showElement = function (element) {\n      return function () {\n        element.classList.remove('h5p-question-hidden-one');\n      };\n    };\n  };\n\n})(H5P.Question);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TextUtilities-1.0\/scripts\/text-utilities.js?ver=1.0.0":"\nvar H5P = H5P || {};\n\n\/**\n * H5P-Text Utilities\n *\n * Some functions that can be useful when dealing with texts in H5P.\n *\n * @param {H5P.jQuery} $\n *\/\nH5P.TextUtilities = function ($, EventDispatcher) {\n  \/**\n   * Create Text Utilities.\n   *\n   * Might be needed later.\n   *\n   * @constructor\n   *\/\n  function TextUtilities() {\n  }\n\n  \/\/ Inheritance\n  TextUtilities.prototype = Object.create(H5P.EventDispatcher.prototype);\n  TextUtilities.prototype.constructor = TextUtilities;\n\n  \/** @constant {object} *\/\n  TextUtilities.WORD_DELIMITER = \/[\\s.?!,\\';]\/g;\n\n  \/**\n   * Check if a candidate string is considered isolated (in a larger string) by\n   * checking the symbol before and after the candidate.\n   *\n   * @param {string} candidate - String to be looked for.\n   * @param {string} text - (Larger) string that should contain candidate.\n   * @param {object} params - Parameters.\n   * @param {object} params.delimiter - Regular expression containing symbols used to isolate the candidate.\n   * @return {boolean} True if string is isolated.\n   *\/\n  TextUtilities.isIsolated = function (candidate, text, params) {\n    \/\/ Sanitization\n    if (!candidate || !text) {\n      return;\n    }\n\n    var delimiter = (!!params && !!params.delimiter) ? params.delimiter : TextUtilities.WORD_DELIMITER;\n\n    var pos = text.indexOf(candidate);\n    if (pos === -1) {\n      return false;\n    }\n\n    var pred = (pos === 0 ? '' : text[pos - 1].replace(delimiter, ''));\n    var succ = (pos + candidate.length === text.length ? '' : text[pos + candidate.length].replace(delimiter, ''));\n\n    if (pred !== '' || succ !== '') {\n      return false;\n    }\n    return true;\n  };\n\n  \/**\n   * Check whether two strings are considered to be similar.\n   * The similarity is temporarily computed by word length and number of number of operations\n   * required to change one word into the other (Damerau-Levenshtein). It's subject to\n   * change, cmp. https:\/\/github.com\/otacke\/udacity-machine-learning-engineer\/blob\/master\/submissions\/capstone_proposals\/h5p_fuzzy_blanks.md\n   *\n   * @param {String} string1 - String #1.\n   * @param {String} string2 - String #2.\n   * @param {object} params - Parameters.\n   * @return {boolean} True, if strings are considered to be similar.\n   *\/\n  TextUtilities.areSimilar = function (string1, string2, params) {\n    \/\/ Sanitization\n    if (!string1 || typeof string1 !== 'string') {\n      return;\n    }\n    if (!string2 || typeof string2 !== 'string') {\n      return;\n    }\n\n    \/\/ Just temporariliy this unflexible. Will be configurable via params.\n    var length = Math.min(string1.length, string2.length);\n    var levenshtein = H5P.TextUtilities.computeLevenshteinDistance(string1, string2, true);\n    if (levenshtein === 0) {\n      return true;\n    }\n    if ((length > 9) && (levenshtein <= 2)) {\n      return true;\n    }\n    if ((length > 3) && (levenshtein <= 1)) {\n      return true;\n    }\n    return false;\n  };\n\n\n\n  \/**\n   * Compute the (Damerau-)Levenshtein distance for two strings.\n   *\n   * The (Damerau-)Levenshtein distance that is returned is equivalent to the\n   * number of operations that are necessary to transform one string into the\n   * other. Consequently, lower numbers indicate higher similarity between the\n   * two strings.\n   *\n   * While the Levenshtein distance counts deletions, insertions and mismatches,\n   * the Damerau-Levenshtein distance also counts swapping two characters as\n   * only one operation (instead of two mismatches), because this seems to\n   * happen quite often.\n   *\n   * See http:\/\/en.wikipedia.org\/wiki\/Damerau%E2%80%93Levenshtein_distance for details\n   *\n   * @public\n   * @param {string} str1 - String no. 1.\n   * @param {string} str2 - String no. 2.\n   * @param {boolean} [countSwapping=false] - If true, swapping chars will count as operation.\n   * @returns {number} Distance.\n   *\/\n  TextUtilities.computeLevenshteinDistance = function(str1, str2, countSwapping) {\n    \/\/ sanity checks\n    if (typeof str1 !== 'string' || typeof str2 !== 'string') {\n      return undefined;\n    }\n    if (countSwapping && typeof countSwapping !== 'boolean') {\n      countSwapping = false;\n    }\n\n    \/\/ degenerate cases\n    if (str1 === str2) {\n      return 0;\n    }\n    if (str1.length === 0) {\n      return str2.length;\n    }\n    if (str2.length === 0) {\n      return str1.length;\n    }\n\n    \/\/ counter variables\n    var i, j;\n\n    \/\/ indicates characters that don't match\n    var cost;\n\n    \/\/ matrix for storing distances\n    var distance = [];\n\n    \/\/ initialization\n    for (i = 0; i <= str1.length; i++) {\n      distance[i] = [i];\n    }\n    for (j = 0; j <= str2.length; j++) {\n      distance[0][j] = j;\n    }\n\n    \/\/ computation\n    for (i = 1; i <= str1.length; i++) {\n      for (j = 1; j <= str2.length; j++) {\n        cost = (str1[i-1] === str2[j-1]) ? 0 : 1;\n        distance[i][j] = Math.min(\n          distance[i-1][j] + 1,     \/\/ deletion\n          distance[i][j-1] + 1,     \/\/ insertion\n          distance[i-1][j-1] + cost \/\/ mismatch\n        );\n        \/\/ in Damerau-Levenshtein distance, transpositions are operations\n        if (countSwapping) {\n          if (i > 1 && j > 1 && str1[i-1] === str2[j-2] && str1[i-2] === str2[j-1]) {\n            distance[i][j] = Math.min(distance[i][j], distance[i-2][j-2] + cost);\n          }\n        }\n      }\n    }\n    return distance[str1.length][str2.length];\n  };\n\n  \/**\n   * Compute the Jaro(-Winkler) distance for two strings.\n   *\n   * The Jaro(-Winkler) distance will return a value between 0 and 1 indicating\n   * the similarity of two strings. The higher the value, the more similar the\n   * strings are.\n   *\n   * See https:\/\/en.wikipedia.org\/wiki\/Jaro%E2%80%93Winkler_distance for details\n   *\n   * It seems that a more generalized implementation of Winkler's modification\n   * can improve the results. This might be implemented later.\n   * http:\/\/disi.unitn.it\/~p2p\/RelatedWork\/Matching\/Hermans_bnaic-2012.pdf\n   *\n   * @public\n   * @param {string} str1 - String no. 1.\n   * @param {string} str2 - String no. 2.\n   * @param {boolean} [favorSameStart=false] - If true, strings with same start get higher distance value.\n   * @param {boolean} [longTolerance=false] - If true, Winkler's tolerance for long words will be used.\n   * @returns {number} Distance.\n   *\/\n  TextUtilities.computeJaroDistance = function(str1, str2, favorSameStart, longTolerance) {\n    \/\/ sanity checks\n    if (typeof str1 !== 'string' || typeof str2 !== 'string') {\n      return undefined;\n    }\n    if (favorSameStart && typeof favorSameStart !== 'boolean') {\n      favorSameStart = false;\n    }\n    if (longTolerance && typeof longTolerance !== 'boolean') {\n      longTolerance = false;\n    }\n\n    \/\/ degenerate cases\n    if (str1.length === 0 || str2.length === 0) {\n      return 0;\n    }\n    if (str1 === str2) {\n      return 1;\n    }\n\n    \/\/ counter variables\n    var i, j, k;\n\n    \/\/ number of matches between both strings\n    var matches = 0;\n\n    \/\/ number of transpositions between both strings\n    var transpositions = 0;\n\n    \/\/ The Jaro-Winkler distance\n    var distance = 0;\n\n    \/\/ length of common prefix up to 4 chars\n    var l = 0;\n\n    \/\/ scaling factor, should not exceed 0.25 (Winkler default = 0.1)\n    var p = 0.1;\n\n    \/\/ will be used often\n    var str1Len = str1.length;\n    var str2Len = str2.length;\n\n    \/\/ determines the distance that still counts as a match\n    var matchWindow = Math.floor(Math.max(str1Len, str2Len) \/ 2)- 1;\n\n    \/\/ will store matches\n    var str1Flags = new Array(str1Len);\n    var str2Flags = new Array(str2Len);\n\n    \/\/ count matches\n    for (i = 0; i < str1Len; i++) {\n      var start  = (i >= matchWindow) ? i - matchWindow : 0;\n      var end = (i + matchWindow <= (str2Len - 1)) ? (i + matchWindow) : (str2Len - 1);\n\n      for (j = start; j <= end; j++) {\n        if (str1Flags[i] !== true && str2Flags[j] !== true && str1[i] === str2[j]) {\n          str1Flags[i] = str2Flags[j] = true;\n          matches += 1;\n          break;\n        }\n      }\n    }\n    if (matches === 0) {\n      return 0;\n    }\n\n    \/\/ count transpositions\n    k = 0;\n    for (i = 0; i < str1Len; i++) {\n      if (!str1Flags[i]) {\n        continue;\n      }\n      while (!str2Flags[k]) {\n        k += 1;\n      }\n      if (str1[i] !== str2[k]) {\n        transpositions += 1;\n      }\n      k += 1;\n    }\n    transpositions = transpositions \/ 2;\n\n    \/\/ compute Jaro distance\n    distance = (matches\/str1Len + matches\/str2Len + (matches - transpositions) \/ matches) \/ 3;\n\n    \/\/ modification used by Winkler\n    if (favorSameStart) {\n      if (distance > 0.7 && str1Len > 3 && str2Len > 3) {\n        while (str1[l] === str2[l] && l < 4) {\n          l += 1;\n        }\n        distance = distance + l * p * (1 - distance);\n\n        \/\/ modification for long words\n        if (longTolerance) {\n          if (Math.max(str1Len, str2Len) > 4 && matches > l + 1 && 2 * matches >= Math.max(str1Len, str2Len) + l) {\n            distance += ((1.0 - distance) * ((matches - l - 1) \/ (str1Len + str2Len - 2 * l + 2)));\n          }\n        }\n      }\n    }\n\n    return distance;\n  };\n\n\n  \/**\n   * Check whether a text contains a string, but fuzzy.\n   *\n   * This function is naive. It moves a window of needle's length (+2)\n   * over the haystack's text and each move compares for similarity using\n   * a given string metric. This will be slow for long texts!!!\n   *\n   * TODO: You might want to look into the bitap algorithm or experiment\n   *       with regexps\n   *\n   * @param {String} needle - String to look for.\n   * @param {String} haystack - Text to look in.\n   * @param {object} params - Parameters.\n   *\/\n  TextUtilities.fuzzyContains = function (needle, haystack, params) {\n    \/\/ Sanitization\n    if (!needle || typeof needle !== 'string') {\n      return false;\n    }\n    if (!haystack || typeof haystack !== 'string') {\n      return false;\n    }\n\n    var found = false;\n    for (var i = 0; i < haystack.length - needle.length + 1; i++) {\n      var h0 = haystack.substr(i, needle.length);\n      var h1 = haystack.substr(i, needle.length + 1);\n      var h2 = haystack.substr(i, needle.length + 2);\n\n      \/\/ Checking isIsolated will e.g. prevent finding beginnings of words\n      if (\n        TextUtilities.isIsolated(h0, haystack) && TextUtilities.areSimilar(h0, needle) ||\n        TextUtilities.isIsolated(h1, haystack) && TextUtilities.areSimilar(h1, needle) ||\n        TextUtilities.isIsolated(h2, haystack) && TextUtilities.areSimilar(h2, needle)\n      ) {\n        found = true;\n        break;\n      }\n    }\n    return found;\n  };\n\n  return TextUtilities;\n}(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.TableList-1.0\/h5p-editor-table-list.js?ver=1.0.2":"\nH5PEditor.TableList = (function ($, EventDispatcher) {\n\n  \/**\n   * Renders UI for the table list.\n   *\n   * @class\n   * @extends H5P.EventDispatcher\n   * @param {List} list\n   * @param {string} [extraClass]\n   *\/\n  function TableList(list, extraClass) {\n    var self = this;\n\n    \/\/ Initialize inheritance\n    EventDispatcher.call(self);\n\n    \/\/ Grab entity and make first letter upper case\n    var entity = list.getEntity();\n    entity = entity.substr(0,1).toLocaleUpperCase() + entity.substr(1);\n\n    \/\/ Create DOM structure elements for the table\n    var $wrapper = $('<table\/>', {\n      'class': 'h5p-editor-table-list' + (extraClass ? ' ' + extraClass : '')\n    });\n    var $thead = $('<thead\/>', {\n      appendTo: $wrapper\n    });\n    var $headRow;\n    var $tbody = $('<tbody\/>', {\n      appendTo: $wrapper\n    });\n    var $tfoot = $('<tfoot\/>', {\n      appendTo: $wrapper\n    });\n\n    \/**\n     * Adds UI items to the widget.\n     *\n     * @public\n     * @param {Object} item\n     *\/\n    self.addItem = function (item) {\n      if (!(item instanceof H5PEditor.Group)) {\n        return; \/\/ Only support multiple fields\n      }\n\n      if (!$headRow) {\n        var group = list.getField();\n        addHeader(group.fields);\n        addFooter(group.fields.length);\n\n        self.trigger('tableprepared', {\n          thead: $thead[0],\n          tfoot: $tfoot[0],\n          tbody: $tbody[0],\n          fields: group.fields\n        });\n      }\n\n      \/\/ Set default params in case item has no params\n      if (item.params === undefined) {\n        item.params = {};\n        item.setValue(item.field, item.params);\n      }\n\n      addRow(item);\n    };\n\n    \/**\n     * Add table headers\n     *\n     *\u00a0@private\n     * @param {Array} fields\n     *\/\n    var addHeader = function (fields) {\n      $headRow = $('<tr\/>', {\n        appendTo: $thead\n      });\n      for (var i = 0; i < fields.length; i++) {\n        var $th = $('<th\/>', {\n          'class': 'h5peditor-type-' + fields[i].type,\n          html: (fields[i].label ? fields[i].label : ''),\n          appendTo: $headRow\n        });\n        fields[i].label = 0; \/\/ No labels inside table rows\n      }\n      $('<th\/>', {\n        'class': 'h5peditor-remove-header',\n        appendTo: $headRow\n      });\n\n      self.trigger('headeradd', {\n        element: $headRow[0],\n        fields: fields\n      });\n    };\n\n    \/**\n     * Add table footer\n     *\n     *\u00a0@private\n     * @param {number} length\n     *\/\n    var addFooter = function (length) {\n      var $footRow = $('<tr\/>', {\n        appendTo: $tfoot\n      });\n      var $footCell = $('<td\/>', {\n        colspan: length,\n        appendTo: $footRow\n      });\n      H5PEditor.createButton(list.getImportance(), H5PEditor.t('core', 'addEntity', {':entity': entity}), function () {\n        list.addItem();\n      }, true).appendTo($footCell);\n\n      self.trigger('footeradd', {\n        footerCell: $footCell[0],\n        fields: list.getField().fields,\n        tbody: $tbody[0]\n      });\n    };\n\n    \/**\n     * Add a new table row with data using the given group as source\n     *\n     *\u00a0@private\n     * @param {H5PEditor.Group} item\n     *\/\n    var addRow = function (item) {\n      \/\/ Keep track of field instances\n      item.children = [];\n\n      \/\/ Create row element\n      var $tableRow = $('<tr\/>', {\n        appendTo: $tbody\n      });\n\n      \/\/ Process semantics to create row fields\n      var fields = item.getFields();\n      for (var i = 0; i < fields.length; i++) {\n        fields[i].label = 0;\n        var $cell = $('<td\/>', {\n          appendTo: $tableRow\n        });\n\n        var fieldInstance = processSemanticsField(item, fields[i]);\n        fieldInstance.appendTo($cell);\n\n        item.children.push(fieldInstance);\n      }\n\n      \/\/ Add remove button\n      var $removeButtonCell = $('<td\/>', {\n        'class': 'h5peditor-remove-button',\n        appendTo: $tableRow\n      });\n\n      H5PEditor.createButton('remove', H5PEditor.t('core', 'removeItem'), function () {\n        if (this.getAttribute('aria-disabled') !== 'true') {\n          confirmRemovalDialog.show($(this).offset().top);\n        }\n      }).appendTo($removeButtonCell);\n\n      \/\/ Create confirmation dialog for removing list item\n      var confirmRemovalDialog = new H5P.ConfirmationDialog({\n        dialogText: H5PEditor.t('core', 'confirmRemoval', {':type': entity.toLocaleLowerCase()})\n      }).appendTo(document.body);\n      confirmRemovalDialog.on('confirmed', function () {\n        \/\/ Remove him!\n        self.trigger('rowremove', {\n          element: $tableRow[0],\n          fields: fields\n        });\n        var index = $tableRow.index();\n        list.removeItem(index);\n        $tableRow.remove(); \/\/ Bye, bye\n        self.trigger('rowremoved');\n      });\n\n      \/\/ Allow overriding \/ customization\n      self.trigger('rowadd', {\n        element: $tableRow[0],\n        fields: fields,\n        instances: item.children\n      });\n    };\n\n    \/**\n     * Convert semantics into widgets.\n     *\n     *\u00a0@private\n     * @param {H5PEditor.Group} parent\n     * @param {Object} field\n     *\/\n    var processSemanticsField = function (parent, field) {\n      \/\/ Check required field properties\n      if (field.name === undefined || field.type === undefined) {\n        throw ns.t('core', 'missingProperty', {':index': i, ':property': 'name\/type'});\n      }\n\n      \/\/ Set default value\n      if (parent.params[field.name] === undefined && field['default'] !== undefined) {\n        parent.params[field.name] = field['default'];\n      }\n\n      \/\/ Locate widget\n      var widget = ns.getWidgetName(field);\n\n      \/\/ Create new field instance\n      return new ns.widgets[widget](parent, field, parent.params[field.name], function (field, value) {\n        if (value === undefined) {\n          delete parent.params[field.name];\n        }\n        else {\n          parent.params[field.name] = value;\n        }\n      });\n    };\n\n    \/**\n     * Puts this widget at the end of the given container.\n     *\n     * @public\n     * @param {jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      $wrapper.appendTo($container);\n    };\n\n    \/**\n     * Remove this widget from the editor DOM.\n     *\n     * @public\n     *\/\n    self.remove = function () {\n      $wrapper.remove();\n    };\n  }\n\n  \/\/ Extend the prototype\n  TableList.prototype = Object.create(EventDispatcher.prototype);\n  TableList.prototype.constructor = TableList;\n\n  return TableList;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.RangeList-1.0\/h5p-editor-range-list.js?ver=1.0.2":"\nH5PEditor.RangeList = (function ($, TableList) {\n\n  \/**\n   * Renders UI for the table list.\n   *\n   * @class\n   * @extends H5PEditor.TableList\n   * @param {List} list\n   *\/\n  function RangeList(list) {\n    var self = this;\n\n    \/\/ Initialize inheritance\n    TableList.call(self, list, 'h5p-editor-range-list');\n\n    \/\/ Keep track of the widget state\n    var initialized = false;\n    list.once('changeWidget', function () {\n      initialized = true;\n      validateSequence();\n    });\n\n    \/\/ Global elements\n    var distributeButton;\n    var tbody;\n\n    \/\/ Customize table header and footer\n    self.once('tableprepared', function (event) {\n      var headRow = event.data.thead.firstElementChild;\n      var footCell = event.data.tfoot.firstElementChild.firstElementChild;\n      tbody = event.data.tbody;\n      var fields = event.data.fields;\n\n      \/\/ Add dash between 'from' and 'to' values\n      addDashCol(headRow, 'th');\n\n      \/\/ Mark score range label as required\n      headRow.children[0].classList.add('h5peditor-required');\n\n      \/\/ Create button to evenly distribute ranges\n      distributeButton = createDistributeButton(\n        H5PEditor.t('H5PEditor.RangeList', 'distributeButtonLabel'),\n        H5PEditor.t('H5PEditor.RangeList', 'distributeButtonWarning'),\n        'h5peditor-range-distribute',\n        distributeEvenlyHandler(fields[0].min, fields[1].max)\n      );\n\n      \/\/ Increase footer size and insert button\n      footCell.colSpan += 2;\n      footCell.appendChild(distributeButton);\n\n      \/\/ Create message area and insert before buttons\n      self.messageArea = document.createElement('div');\n      self.messageArea.className = 'h5p-editor-range-list-message-area';\n      footCell.insertBefore(self.messageArea, footCell.firstElementChild);\n    });\n\n    \/\/ Customize rows as they're added\n    self.on('rowadd', function (event) {\n      var row = event.data.element;\n      var fields = event.data.fields;\n      var instances = event.data.instances;\n\n      \/\/ Customize the 'from' input part\n      var fromInput = getFirst('input', row);\n      makeReadOnly(fromInput);\n\n      \/\/ Customize each row by adding a separation dash between 'from' and 'to'\n      addDashCol(row, 'td', '\u2013');\n\n      \/\/ Customize the 'to' input part\n      var toInput = getSecond('input', row);\n\n      \/\/ Create textual representation to display if this is the last row\n      addInputText(toInput);\n\n      \/\/ Set min value of 'to' field to equal the 'from' field value\n      linkPropertyValue('min', instances[1], fromInput);\n\n      \/\/ Update the next row's 'from' input when this row's 'to' input changes\n      toInput.addEventListener('change', updateInputHandler(fields[0]));\n\n      var isFirstRow = !row.previousElementSibling;\n      if (isFirstRow) {\n        \/\/ This is the first row, disable buttons\n        toggleButtons(false, row);\n      }\n      else {\n        \/\/ Show the preivous field's second input when adding a new row\n        makeEditable(row.previousElementSibling);\n\n        \/\/ More than one row, enable buttons\n        toggleButtons(true, row.previousElementSibling);\n      }\n\n      if (initialized) {\n        validateSequence();\n      }\n    });\n\n    \/\/ Handle row being removed from the table\n    self.on('rowremove', function (event) {\n      var row = event.data.element;\n      var fields = event.data.fields;\n\n      if (!row.nextElementSibling) {\n        \/\/ This was the last row\n        if (row.previousElementSibling) {\n          getSecond('.h5peditor-input-text', row.previousElementSibling).style.display = '';\n          var prevToInput = getSecond('input', row.previousElementSibling);\n          prevToInput.style.display = 'none';\n          setValue(prevToInput, fields[1].max);\n\n          if (!row.previousElementSibling.previousElementSibling) {\n            \/\/ Only one row left, disable buttons\n            toggleButtons(false, row.previousElementSibling);\n          }\n        }\n      }\n      else if (!row.previousElementSibling) {\n        \/\/ This was the first row\n        setValue(getFirst('input', row.nextElementSibling), fields[0].min);\n        if (!row.nextElementSibling.nextElementSibling) {\n          \/\/ Only one row left, disable buttons\n          toggleButtons(false, row.nextElementSibling);\n        }\n      }\n      else {\n        \/\/ Set first input of next row to match the second input of previous row.\n        setValue(getFirst('input', row.nextElementSibling), getSecond('input', row.previousElementSibling).value);\n      }\n    });\n\n    \/\/ When row is removed we check for overlapping sequences\n    self.on('rowremoved', function (event) {\n      validateSequence();\n    });\n\n    \/**\n     * Convert the given input field into a read-only type field that is\n     * updated programmatically.\n     *\n     * @private\n     * @param {HTMLInputElement} input\n     *\/\n    var makeReadOnly = function (input) {\n      \/\/ Default value for newly added row is set to blank when this\n      \/\/ is a row added by the user\n      var isFirstRow = !input.parentElement.parentElement.parentElement.previousElementSibling;\n      if (!isFirstRow && initialized) {\n        setValue(input, '');\n      }\n\n      \/\/ Add textual representation of input\n      addInputText(input);\n\n      \/\/ Hide all errors since the input is updated programmatically\n      input.parentElement.querySelector('.h5p-errors').style.display = 'none';\n    };\n\n    \/**\n     * The given row is no longer the last row and the 'to' input should\n     * now be editable.\n     *\n     * @private\n     * @param {HTMLTableRowElement} row\n     *\/\n    var makeEditable = function (row) {\n      getSecond('.h5peditor-input-text', row).style.display = 'none';\n      var prevToInput = getSecond('input', row);\n      prevToInput.style.display = '';\n\n      if (initialized) {\n        \/\/ User action, use no value as default\n        setValue(prevToInput, '');\n\n        \/\/ Override \/ clear 'field is mandatory' error messages\n        prevToInput.parentNode.querySelector('.h5p-errors').innerHTML = '';\n        prevToInput.classList.remove('error');\n      }\n    };\n\n    \/**\n     * Set the given field property to equal the value the given input field\n     *\n     * @private\n     * @param {string} property\n     * @param {Object} fieldInstance\n     * @param {HTMLInputElement} input\n     *\/\n    var linkPropertyValue = function (property, fieldInstance, input) {\n      \/\/ Update the current value to equal that of the input\n      fieldInstance.field[property] = parseInt(input.value);\n\n      \/\/ Update the value if the value of the field changes\n      input.addEventListener('change', function () {\n        fieldInstance.field[property] = parseInt(input.value);\n        fieldInstance.$input[0].dispatchEvent(createNewEvent('change'));\n      });\n    };\n\n    \/**\n     * Update the next row's 'from' input when this 'to' input change.\n     *\n     * @private\n     * @param {Object} field\n     * @return {function} Event handler\n     *\/\n    var updateInputHandler = function (field) {\n      return function () {\n        var nextRow = this.parentElement.parentElement.parentElement.nextElementSibling;\n        if (!nextRow) {\n          \/\/ This is the last row, nothing to update\n          return;\n        }\n\n        var targetInput = getFirst('input', nextRow);\n        if (this.value === '') {\n          \/\/ No value has been set\n          setValue(targetInput, '');\n          return;\n        }\n\n        var value = parseInt(this.value);\n        if (!isNaN(value)) {\n          \/\/ Increment next from value\n          value += 1;\n          if (field.max && value >= field.max) {\n            value = field.max; \/\/ Respect max limit\n          }\n          setValue(targetInput, value);\n        }\n\n        validateSequence();\n      };\n    };\n\n    \/**\n     * Add dash column to the given row.\n     *\n     * @private\n     * @param {HTMLTableRowElement} row\n     * @param {string} type 'td' or 'th'\n     * @param {string} [symbol] The 'text' to display\n     *\/\n    var addDashCol = function (row, type, symbol) {\n      var dash = document.createElement(type);\n      dash.classList.add('h5peditor-dash');\n      if (symbol) {\n        dash.innerText = '\u2013';\n      }\n      row.insertBefore(dash, row.children[1]);\n    };\n\n    \/**\n     * Add text element displaying input value and hide input.\n     *\n     * @private\n     * @param {HTMLInputElement} input\n     *\/\n    var addInputText = function (input) {\n      \/\/ Add static text\n      var text = document.createElement('div');\n      text.classList.add('h5peditor-input-text');\n      text.innerHTML = input.value;\n      input.parentElement.insertBefore(text, input);\n\n      \/\/ Hide input\n      input.style.display = 'none';\n\n      \/\/ Update static on changes\n      input.addEventListener('change', function () {\n        text.innerHTML = input.value;\n      });\n    };\n\n    \/**\n     * Look for the given selector\/type in the first cell of the given row.\n     *\n     * @private\n     * @param {string} type selector\n     * @param {HTMLTableRowElement} row to look in\n     *\/\n    var getFirst = function (type, row) {\n      return row.children[0].querySelector(type);\n    };\n\n    \/**\n     * Look for the given selector\/type in the second cell of the given row.\n     *\n     * @private\n     * @param {string} type selector\n     * @param {HTMLTableRowElement} row to look in\n     *\/\n    var getSecond = function (type, row) {\n      return row.children[2].querySelector(type);\n    };\n\n    \/**\n     * Set the given value for the given input and trigger the change event.\n     *\n     * @private\n     * @param {HTMLInputElement} input\n     * @param {string} value\n     *\/\n    var setValue = function (input, value) {\n      input.value = value;\n      input.dispatchEvent(createNewEvent('change'));\n    };\n\n    \/**\n     * Create a new event, using a fallback for older browsers (IE11)\n     *\n     * @param {string} type\n     * @return {Event}\n     *\/\n    var createNewEvent = function (type) {\n      if (typeof Event !== 'function') {\n        var event = document.createEvent('Event');\n        event.initEvent(type, true, true);\n        return event;\n      }\n      else {\n        return new Event(type)\n      }\n    };\n\n    \/**\n     * Identify any overlapping ranges and provide an error message.\n     *\n     * @private\n     *\/\n    var validateSequence = function () {\n      var prevTo, error;\n      for (var i = 0; i < tbody.children.length; i++) {\n        var row = tbody.children[i];\n        var to = parseInt(getSecond('input', row).value);\n\n        if (prevTo !== undefined && !isNaN(to) && to <= prevTo) {\n          error = true;\n          row.classList.add('h5p-error-range-overlap');\n        }\n        else {\n          row.classList.remove('h5p-error-range-overlap');\n        }\n        prevTo = to;\n      }\n\n      \/\/ Display a message\n      self.messageArea.innerText = error ? H5PEditor.t('H5PEditor.RangeList', 'rangeOutOfSequenceWarning') : '';\n      self.messageArea.classList[error ? 'add' : 'remove']('problem-found');\n    };\n\n    \/**\n     * Create distribute button\n     *\n     * @private\n     * @param {string} label\n     * @param {string} warning\n     * @param {string} classname\n     * @param {function} action\n     * @return {HTMLElement}\n     *\/\n    var createDistributeButton = function (label, warning, classname, action) {\n\n      \/\/ Create confirmation dialog\n      var confirmDialog = new H5P.ConfirmationDialog({\n        dialogText: warning\n      }).appendTo(document.body);\n\n      confirmDialog.on('confirmed', action);\n\n      \/\/ Create and return button element\n      return H5PEditor.createButton(classname, label, function () {\n        if (this.getAttribute('aria-disabled') !== 'true') {\n          \/\/ The button has been clicked, activate confirmation dialog if\n          \/\/ the author has defined any ranges\n          if (authorHasDefinedRanges()) {\n            confirmDialog.show(this.getBoundingClientRect().top);\n          }\n          else {\n            action();\n          }\n        }\n      }, true)[0];\n    };\n\n    \/**\n     * Check if any input fields have gotten values by the author\n     *\n     * @private\n     * @return {boolean}\n     *\/\n    var authorHasDefinedRanges = function () {\n      for (var i = 0; i < tbody.children.length - 1; i++) {\n        var to = parseInt(getSecond('input', tbody.children[i]).value);\n        if (!isNaN(to)) {\n          return true;\n        }\n      }\n      return false;\n    };\n\n    \/**\n     * Generate an event handler for distributing ranges equally.\n     *\n     * @private\n     * @param {number} start The minimum value\n     * @param {number} end The maximum value\n     * @return {function} Event handler\n     *\/\n    var distributeEvenlyHandler = function (start, end) {\n      return function () {\n        \/\/ Distribute percentages evenly\n        var rowRange = (end - start) \/ tbody.children.length;\n\n        \/\/ Go though all the rows\n        for (var i = 0; i < tbody.children.length; i++) {\n          var row = tbody.children[i];\n          var from = start + (rowRange * i);\n          setValue(getFirst('input', row), Math.floor(from) + (i === 0 ? 0 : 1));\n          var secondInput = getSecond('input', row);\n          setValue(secondInput, Math.floor(from + rowRange));\n          secondInput.dispatchEvent(createNewEvent('keyup')); \/\/ Workaround to remove error messages\n        }\n\n        validateSequence();\n      };\n    };\n\n    \/**\n     * Toggle buttons disabled \/ enabled\n     *\n     * @private\n     * @param {boolean} state true to enable buttons, false to disable\n     * @param {HTMLTableRowElement} row to look in\n     *\/\n    var toggleButtons = function (state, row) {\n      var removeButton = row.children[row.children.length - 1].children[0];\n      if (state) {\n        enableButton(distributeButton);\n        enableButton(removeButton);\n      }\n      else {\n        disableButton(distributeButton);\n        disableButton(removeButton);\n      }\n    };\n\n    \/**\n     * Disables the given button\n     *\n     * @private\n     * @param {HTMLElement} button to look in\n     *\/\n    var disableButton = function (button) {\n      button.setAttribute('aria-disabled', 'true');\n      button.removeAttribute('tabindex');\n    };\n\n    \/**\n     * Enables the given button\n     *\n     * @private\n     * @param {HTMLElement} button to look in\n     *\/\n    var enableButton = function (button) {\n      button.removeAttribute('aria-disabled');\n      button.setAttribute('tabindex', '0');\n    };\n  }\n\n  \/\/ Extend TableList prototype\n  RangeList.prototype = Object.create(TableList.prototype);\n  RangeList.prototype.constructor = RangeList;\n\n  return RangeList;\n})(H5P.jQuery, H5PEditor.TableList);\n\n\/\/ Add translations\nH5PEditor.language['H5PEditor.RangeList'] = {\n  'libraryStrings': {\n    'distributeButtonLabel': 'Distribute Evenly',\n    'distributeButtonWarning': 'Values will be changed for all of the ranges. Do you wish to proceed?',\n    'rangeOutOfSequenceWarning': 'The score ranges are out of sequence'\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Blanks-1.8\/js\/blanks.js?ver=1.8.5":"\n\/*global H5P*\/\nH5P.Blanks = (function ($, Question) {\n  \/**\n   * @constant\n   * @default\n   *\/\n  var STATE_ONGOING = 'ongoing';\n  var STATE_CHECKING = 'checking';\n  var STATE_SHOWING_SOLUTION = 'showing-solution';\n  var STATE_FINISHED = 'finished';\n\n  \/**\n   * @typedef {Object} Params\n   *  Parameters\/configuration object for Blanks\n   *\n   * @property {Object} Params.behaviour\n   * @property {string} Params.behaviour.confirmRetryDialog\n   * @property {string} Params.behaviour.confirmCheckDialog\n   *\n   * @property {Object} Params.confirmRetry\n   * @property {string} Params.confirmRetry.header\n   * @property {string} Params.confirmRetry.body\n   * @property {string} Params.confirmRetry.cancelLabel\n   * @property {string} Params.confirmRetry.confirmLabel\n   *\n   * @property {Object} Params.confirmCheck\n   * @property {string} Params.confirmCheck.header\n   * @property {string} Params.confirmCheck.body\n   * @property {string} Params.confirmCheck.cancelLabel\n   * @property {string} Params.confirmCheck.confirmLabel\n   *\/\n\n  \/**\n   * Initialize module.\n   *\n   * @class H5P.Blanks\n   * @extends H5P.Question\n   * @param {Params} params\n   * @param {number} id Content identification\n   * @param {Object} contentData Task specific content data\n   *\/\n  function Blanks(params, id, contentData) {\n    var self = this;\n\n    \/\/ Inheritance\n    Question.call(self, 'blanks');\n\n    \/\/ IDs\n    this.contentId = id;\n\n    this.params = $.extend(true, {}, {\n      text: \"Fill in\",\n      questions: [\n        \"Oslo is the capital of *Norway*.\"\n      ],\n      overallFeedback: [],\n      userAnswers: [], \/\/ TODO This isn't in semantics?\n      showSolutions: \"Show solution\",\n      tryAgain: \"Try again\",\n      checkAnswer: \"Check\",\n      changeAnswer: \"Change answer\",\n      notFilledOut: \"Please fill in all blanks to view solution\",\n      answerIsCorrect: \"':ans' is correct\",\n      answerIsWrong: \"':ans' is wrong\",\n      answeredCorrectly: \"Answered correctly\",\n      answeredIncorrectly: \"Answered incorrectly\",\n      solutionLabel: \"Correct answer:\",\n      inputLabel: \"Blank input @num of @total\",\n      inputHasTipLabel: \"Tip available\",\n      tipLabel: \"Tip\",\n      scoreBarLabel: 'You got :num out of :total points',\n      behaviour: {\n        enableRetry: true,\n        enableSolutionsButton: true,\n        caseSensitive: true,\n        showSolutionsRequiresInput: true,\n        autoCheck: false,\n        separateLines: false,\n        disableImageZooming: false\n      }\n    }, params);\n\n    \/\/ Delete empty questions\n    for (var i = this.params.questions.length - 1; i >= 0; i--) {\n      if (!this.params.questions[i]) {\n        this.params.questions.splice(i, 1);\n      }\n    }\n\n    \/\/ Previous state\n    this.contentData = contentData;\n    if (this.contentData !== undefined && this.contentData.previousState !== undefined) {\n      this.previousState = this.contentData.previousState;\n    }\n\n    \/\/ Clozes\n    this.clozes = [];\n\n    \/\/ Keep track tabbing forward or backwards\n    this.shiftPressed = false;\n\n    H5P.$body.keydown(function (event) {\n      if (event.keyCode === 16) {\n        self.shiftPressed = true;\n      }\n    }).keyup(function (event) {\n      if (event.keyCode === 16) {\n        self.shiftPressed = false;\n      }\n    });\n  }\n\n  \/\/ Inheritance\n  Blanks.prototype = Object.create(Question.prototype);\n  Blanks.prototype.constructor = Blanks;\n\n  \/**\n   * Registers this question type's DOM elements before they are attached.\n   * Called from H5P.Question.\n   *\/\n  Blanks.prototype.registerDomElements = function () {\n    var self = this;\n\n    \/\/ Check for task media\n    var media = self.params.media;\n    if (media && media.library) {\n      var type = media.library.split(' ')[0];\n      if (type === 'H5P.Image') {\n        if (media.params.file) {\n          \/\/ Register task image\n          self.setImage(media.params.file.path, {\n            disableImageZooming: self.params.behaviour.disableImageZooming,\n            alt: media.params.alt\n          });\n        }\n      }\n      else if (type === 'H5P.Video') {\n        if (media.params.sources) {\n          \/\/ Register task video\n          self.setVideo(media);\n        }\n      }\n    }\n\n    \/\/ Register task introduction text\n    self.setIntroduction(self.params.text);\n\n    \/\/ Register task content area\n    self.setContent(self.createQuestions(), {\n      'class': self.params.behaviour.separateLines ? 'h5p-separate-lines' : ''\n    });\n\n    \/\/ ... and buttons\n    self.registerButtons();\n\n    \/\/ Restore previous state\n    self.setH5PUserState();\n  };\n\n  \/**\n   * Create all the buttons for the task\n   *\/\n  Blanks.prototype.registerButtons = function () {\n    var self = this;\n\n    var $content = $('[data-content-id=\"' + self.contentId + '\"].h5p-content');\n    var $containerParents = $content.parents('.h5p-container');\n\n    \/\/ select find container to attach dialogs to\n    var $container;\n    if($containerParents.length !== 0) {\n      \/\/ use parent highest up if any\n      $container = $containerParents.last();\n    }\n    else if($content.length !== 0){\n      $container = $content;\n    }\n    else  {\n      $container = $(document.body);\n    }\n\n    if (!self.params.behaviour.autoCheck) {\n      \/\/ Check answer button\n      self.addButton('check-answer', self.params.checkAnswer, function () {\n        self.toggleButtonVisibility(STATE_CHECKING);\n        self.markResults();\n        self.showEvaluation();\n        self.triggerAnswered();\n      }, true, {}, {\n        confirmationDialog: {\n          enable: self.params.behaviour.confirmCheckDialog,\n          l10n: self.params.confirmCheck,\n          instance: self,\n          $parentElement: $container\n        }\n      });\n    }\n\n    \/\/ Show solution button\n    self.addButton('show-solution', self.params.showSolutions, function () {\n      self.showCorrectAnswers(false);\n    }, self.params.behaviour.enableSolutionsButton);\n\n    \/\/ Try again button\n    if (self.params.behaviour.enableRetry === true) {\n      self.addButton('try-again', self.params.tryAgain, function () {\n        self.resetTask();\n        self.$questions.filter(':first').find('input:first').focus();\n      }, true, {}, {\n        confirmationDialog: {\n          enable: self.params.behaviour.confirmRetryDialog,\n          l10n: self.params.confirmRetry,\n          instance: self,\n          $parentElement: $container\n        }\n      });\n    }\n    self.toggleButtonVisibility(STATE_ONGOING);\n  };\n\n  \/**\n   * Find blanks in a string and run a handler on those blanks\n   *\n   * @param {string} question\n   *   Question text containing blanks enclosed in asterisks.\n   * @param {function} handler\n   *   Replaces the blanks text with an input field.\n   * @returns {string}\n   *   The question with blanks replaced by the given handler.\n   *\/\n  Blanks.prototype.handleBlanks = function (question, handler) {\n    \/\/ Go through the text and run handler on all asterisk\n    var clozeEnd, clozeStart = question.indexOf('*');\n    var self = this;\n    while (clozeStart !== -1 && clozeEnd !== -1) {\n      clozeStart++;\n      clozeEnd = question.indexOf('*', clozeStart);\n      if (clozeEnd === -1) {\n        continue; \/\/ No end\n      }\n      var clozeContent = question.substring(clozeStart, clozeEnd);\n      var replacer = '';\n      if (clozeContent.length) {\n        replacer = handler(self.parseSolution(clozeContent));\n        clozeEnd++;\n      }\n      else {\n        clozeStart += 1;\n      }\n      question = question.slice(0, clozeStart - 1) + replacer + question.slice(clozeEnd);\n      clozeEnd -= clozeEnd - clozeStart - replacer.length;\n\n      \/\/ Find the next cloze\n      clozeStart = question.indexOf('*', clozeEnd);\n    }\n    return question;\n  };\n\n  \/**\n   * Create questitons html for DOM\n   *\/\n  Blanks.prototype.createQuestions = function () {\n    var self = this;\n\n    var html = '';\n    var clozeNumber = 0;\n    for (var i = 0; i < self.params.questions.length; i++) {\n      var question = self.params.questions[i];\n\n      \/\/ Go through the question text and replace all the asterisks with input fields\n      question = self.handleBlanks(question, function (solution) {\n        \/\/ Create new cloze\n        clozeNumber += 1;\n        var defaultUserAnswer = (self.params.userAnswers.length > self.clozes.length ? self.params.userAnswers[self.clozes.length] : null);\n        var cloze = new Blanks.Cloze(solution, self.params.behaviour, defaultUserAnswer, {\n          answeredCorrectly: self.params.answeredCorrectly,\n          answeredIncorrectly: self.params.answeredIncorrectly,\n          solutionLabel: self.params.solutionLabel,\n          inputLabel: self.params.inputLabel,\n          inputHasTipLabel: self.params.inputHasTipLabel,\n          tipLabel: self.params.tipLabel\n        });\n\n        self.clozes.push(cloze);\n        return cloze;\n      });\n\n      html += '<div>' + question + '<\/div>';\n    }\n\n    self.hasClozes = clozeNumber > 0;\n    this.$questions = $(html);\n\n    \/\/ Set input fields.\n    this.$questions.find('input').each(function (i) {\n      var afterCheck;\n      if (self.params.behaviour.autoCheck) {\n        afterCheck = function () {\n          self.read((this.correct() ? self.params.answerIsCorrect : self.params.answerIsWrong).replace(':ans', this.getUserAnswer()));\n          if (self.done || self.allBlanksFilledOut()) {\n            \/\/ All answers has been given. Show solutions button.\n            self.toggleButtonVisibility(STATE_CHECKING);\n            self.showEvaluation();\n            self.triggerAnswered();\n            self.done = true;\n          }\n        };\n      }\n      self.clozes[i].setInput($(this), afterCheck, function () {\n        self.toggleButtonVisibility(STATE_ONGOING);\n        if (!self.params.behaviour.autoCheck) {\n          self.hideEvaluation();\n        }\n      }, i, self.clozes.length);\n    }).keydown(function (event) {\n      var $this = $(this);\n\n      \/\/ Adjust width of text input field to match value\n      self.autoGrowTextField($this);\n\n      var $inputs, isLastInput;\n      var enterPressed = (event.keyCode === 13);\n      var tabPressedAutoCheck = (event.keyCode === 9 && self.params.behaviour.autoCheck);\n\n      if (enterPressed || tabPressedAutoCheck) {\n        \/\/ Figure out which inputs are left to answer\n        $inputs = self.$questions.find('.h5p-input-wrapper:not(.h5p-correct) .h5p-text-input');\n\n        \/\/ Figure out if this is the last input\n        isLastInput = $this.is($inputs[$inputs.length - 1]);\n      }\n\n      if ((tabPressedAutoCheck && isLastInput && !self.shiftPressed) ||\n          (enterPressed && isLastInput)) {\n        \/\/ Focus first button on next tick\n        setTimeout(function () {\n          self.focusButton();\n        }, 10);\n      }\n\n      if (enterPressed) {\n        if (isLastInput) {\n          \/\/ Check answers\n          $this.trigger('blur');\n        }\n        else {\n          \/\/ Find next input to focus\n          $inputs.eq($inputs.index($this) + 1).focus();\n        }\n\n        return false; \/\/ Prevent form submission on enter key\n      }\n    }).on('change', function () {\n      self.answered = true;\n      self.triggerXAPI('interacted');\n    });\n\n    self.on('resize', function () {\n      self.resetGrowTextField();\n    });\n\n    return this.$questions;\n  };\n\n  \/**\n   *\n   *\/\n  Blanks.prototype.autoGrowTextField = function ($input) {\n    \/\/ Do not set text field size when separate lines is enabled\n    if (this.params.behaviour.separateLines) {\n      return;\n    }\n\n    var self = this;\n    var fontSize = parseInt($input.css('font-size'), 10);\n    var minEm = 3;\n    var minPx = fontSize * minEm;\n    var rightPadEm = 3.25;\n    var rightPadPx = fontSize * rightPadEm;\n    var static_min_pad = 0.5 * fontSize;\n\n    setTimeout(function(){\n      var tmp = $('<div>', {\n        'html': $input.val()\n      });\n      tmp.css({\n        'position': 'absolute',\n        'white-space': 'nowrap',\n        'font-size': $input.css('font-size'),\n        'font-family': $input.css('font-family'),\n        'padding': $input.css('padding'),\n        'width': 'initial'\n      });\n      $input.parent().append(tmp);\n      var width = tmp.width();\n      var parentWidth = self.$questions.width();\n      tmp.remove();\n      if (width <= minPx) {\n        \/\/ Apply min width\n        $input.width(minPx + static_min_pad);\n      }\n      else if (width + rightPadPx >= parentWidth) {\n        \/\/ Apply max width of parent\n        $input.width(parentWidth - rightPadPx);\n      }\n      else {\n        \/\/ Apply width that wraps input\n        $input.width(width + static_min_pad);\n      }\n    }, 1);\n  };\n\n  \/**\n   * Resize all text field growth to current size.\n   *\/\n  Blanks.prototype.resetGrowTextField = function () {\n    var self = this;\n\n    this.$questions.find('input').each(function () {\n      self.autoGrowTextField($(this));\n    });\n  };\n\n  \/**\n   * Toggle buttons dependent of state.\n   *\n   * Using CSS-rules to conditionally show\/hide using the data-attribute [data-state]\n   *\/\n  Blanks.prototype.toggleButtonVisibility = function (state) {\n    \/\/ The show solutions button is hidden if all answers are correct\n    var allCorrect = (this.getScore() === this.getMaxScore());\n    if (this.params.behaviour.autoCheck && allCorrect) {\n      \/\/ We are viewing the solutions\n      state = STATE_FINISHED;\n    }\n\n    if (this.params.behaviour.enableSolutionsButton) {\n      if (state === STATE_CHECKING && !allCorrect) {\n        this.showButton('show-solution');\n      }\n      else {\n        this.hideButton('show-solution');\n      }\n    }\n\n    if (this.params.behaviour.enableRetry) {\n      if ((state === STATE_CHECKING && !allCorrect) || state === STATE_SHOWING_SOLUTION) {\n        this.showButton('try-again');\n      }\n      else {\n        this.hideButton('try-again');\n      }\n    }\n\n    if (state === STATE_ONGOING) {\n      this.showButton('check-answer');\n    }\n    else {\n      this.hideButton('check-answer');\n    }\n\n    this.trigger('resize');\n  };\n\n  \/**\n   * Check if solution is allowed. Warn user if not\n   *\/\n  Blanks.prototype.allowSolution = function () {\n    if (this.params.behaviour.showSolutionsRequiresInput === true) {\n      if (!this.allBlanksFilledOut()) {\n        this.updateFeedbackContent(this.params.notFilledOut);\n        this.read(this.params.notFilledOut);\n        return false;\n      }\n    }\n    return true;\n  };\n\n  \/**\n   * Check if all blanks are filled out\n   *\n   * @method allBlanksFilledOut\n   * @return {boolean} Returns true if all blanks are filled out.\n   *\/\n  Blanks.prototype.allBlanksFilledOut = function () {\n    return !this.clozes.some(function (cloze) {\n      return !cloze.filledOut();\n    });\n  };\n\n  \/**\n   * Mark which answers are correct and which are wrong and disable fields if retry is off.\n   *\/\n  Blanks.prototype.markResults = function () {\n    var self = this;\n    for (var i = 0; i < self.clozes.length; i++) {\n      self.clozes[i].checkAnswer();\n      if (!self.params.behaviour.enableRetry) {\n        self.clozes[i].disableInput();\n      }\n    }\n    this.trigger('resize');\n  };\n\n  \/**\n   * Removed marked results\n   *\/\n  Blanks.prototype.removeMarkedResults = function () {\n    this.$questions.find('.h5p-input-wrapper').removeClass('h5p-correct h5p-wrong');\n    this.$questions.find('.h5p-input-wrapper > input').attr('disabled', false);\n    this.trigger('resize');\n  };\n\n\n  \/**\n   * Displays the correct answers\n   * @param {boolean} [alwaysShowSolution]\n   *  Will always show solution if true\n   *\/\n  Blanks.prototype.showCorrectAnswers = function (alwaysShowSolution) {\n    if (!alwaysShowSolution && !this.allowSolution()) {\n      return;\n    }\n\n    this.toggleButtonVisibility(STATE_SHOWING_SOLUTION);\n    this.hideSolutions();\n\n    for (var i = 0; i < this.clozes.length; i++) {\n      this.clozes[i].showSolution();\n    }\n    this.trigger('resize');\n  };\n\n  \/**\n   * Toggle input allowed for all input fields\n   *\n   * @method function\n   * @param  {boolean} enabled True if fields should allow input, otherwise false\n   *\/\n  Blanks.prototype.toggleAllInputs = function (enabled) {\n    for (var i = 0; i < this.clozes.length; i++) {\n      this.clozes[i].toggleInput(enabled);\n    }\n  };\n\n  \/**\n   * Display the correct solution for the input boxes.\n   *\n   * This is invoked from CP and QS - be carefull!\n   *\/\n  Blanks.prototype.showSolutions = function () {\n    this.params.behaviour.enableSolutionsButton = true;\n    this.toggleButtonVisibility(STATE_FINISHED);\n    this.markResults();\n    this.showEvaluation();\n    this.showCorrectAnswers(true);\n    this.toggleAllInputs(false);\n    \/\/Hides all buttons in \"show solution\" mode.\n    this.hideButtons();\n  };\n\n  \/**\n   * Resets the complete task.\n   * Used in contracts.\n   * @public\n   *\/\n  Blanks.prototype.resetTask = function () {\n    this.answered = false;\n    this.hideEvaluation();\n    this.hideSolutions();\n    this.clearAnswers();\n    this.removeMarkedResults();\n    this.toggleButtonVisibility(STATE_ONGOING);\n    this.resetGrowTextField();\n    this.toggleAllInputs(true);\n    this.done = false;\n  };\n\n  \/**\n   * Hides all buttons.\n   * @public\n   *\/\n  Blanks.prototype.hideButtons = function () {\n    this.toggleButtonVisibility(STATE_FINISHED);\n  };\n\n  \/**\n   * Trigger xAPI answered event\n   *\/\n  Blanks.prototype.triggerAnswered = function() {\n    this.answered = true;\n    var xAPIEvent = this.createXAPIEventTemplate('answered');\n    this.addQuestionToXAPI(xAPIEvent);\n    this.addResponseToXAPI(xAPIEvent);\n    this.trigger(xAPIEvent);\n  };\n\n  \/**\n   * Get xAPI data.\n   * Contract used by report rendering engine.\n   *\n   * @see contract at {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts#guides-header-6}\n   *\/\n  Blanks.prototype.getXAPIData = function () {\n    var xAPIEvent = this.createXAPIEventTemplate('answered');\n    this.addQuestionToXAPI(xAPIEvent);\n    this.addResponseToXAPI(xAPIEvent);\n    return {\n      statement: xAPIEvent.data.statement\n    };\n  };\n\n  \/**\n   * Generate xAPI object definition used in xAPI statements.\n   * @return {Object}\n   *\/\n  Blanks.prototype.getxAPIDefinition = function () {\n    var definition = {};\n    definition.description = {\n      'en-US': this.params.text\n    };\n    definition.type = 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction';\n    definition.interactionType = 'fill-in';\n    definition.correctResponsesPattern = ['{case_matters=' + this.params.behaviour.caseSensitive + '}'];\n    var firstCorrectResponse = true;\n    \/\/ xAPI forces us to create solution patterns for all possible solution combinations\n    for (var i = 0; i < this.params.questions.length; i++) {\n      var question = this.handleBlanks(this.params.questions[i], function(solution) {\n        \/\/ Store new patterns for each extra alternative answer\n        var newPatterns = [];\n        for (var j = 0; j < definition.correctResponsesPattern.length; j++) {\n          if (!firstCorrectResponse) {\n            definition.correctResponsesPattern[j] += '[,]';\n          }\n          var prefix = definition.correctResponsesPattern[j];\n          for (var k = 0; k < solution.solutions.length; k++) {\n            if (k === 0) {\n              \/\/ This is the first possible answr, just add it to the pattern\n              definition.correctResponsesPattern[j] += solution.solutions[k];\n            }\n            else {\n              \/\/ This is an alternative possible answer, we need to create a new permutation\n              newPatterns.push(prefix + solution.solutions[k]);\n            }\n          }\n        }\n        \/\/ Add any new permutations to the list of response patterns\n        definition.correctResponsesPattern = definition.correctResponsesPattern.concat(newPatterns);\n\n        firstCorrectResponse = false;\n\n        \/\/ We replace the solutions in the question with a \"blank\"\n        return '__________';\n      });\n      definition.description['en-US'] += question;\n    }\n    return definition;\n  };\n\n  \/**\n   * Add the question itselt to the definition part of an xAPIEvent\n   *\/\n  Blanks.prototype.addQuestionToXAPI = function(xAPIEvent) {\n    var definition = xAPIEvent.getVerifiedStatementValue(['object', 'definition']);\n    $.extend(definition, this.getxAPIDefinition());\n  };\n\n  \/**\n   * Parse the solution text (text between the asterisks)\n   *\n   * @param {string} solutionText\n   * @returns {object} with the following properties\n   *  - tip: the tip text for this solution, undefined if no tip\n   *  - solutions: array of solution words\n   *\/\n  Blanks.prototype.parseSolution = function (solutionText) {\n    var tip, solution;\n\n    var tipStart = solutionText.indexOf(':');\n    if (tipStart !== -1) {\n      \/\/ Found tip, now extract\n      tip = solutionText.slice(tipStart + 1);\n      solution = solutionText.slice(0, tipStart);\n    }\n    else {\n      solution = solutionText;\n    }\n\n    \/\/ Split up alternatives\n    var solutions = solution.split('\/');\n\n    \/\/ Trim solutions\n    for (var i = 0; i < solutions.length; i++) {\n      solutions[i] = H5P.trim(solutions[i]);\n\n      \/\/decodes html entities\n      var elem = document.createElement('textarea');\n      elem.innerHTML = solutions[i];\n      solutions[i] = elem.value;\n    }\n\n    return {\n      tip: tip,\n      solutions: solutions\n    };\n  };\n\n  \/**\n   * Add the response part to an xAPI event\n   *\n   * @param {H5P.XAPIEvent} xAPIEvent\n   *  The xAPI event we will add a response to\n   *\/\n  Blanks.prototype.addResponseToXAPI = function (xAPIEvent) {\n    xAPIEvent.setScoredResult(this.getScore(), this.getMaxScore(), this);\n    xAPIEvent.data.statement.result.response = this.getxAPIResponse();\n  };\n\n  \/**\n   * Generate xAPI user response, used in xAPI statements.\n   * @return {string} User answers separated by the \"[,]\" pattern\n   *\/\n  Blanks.prototype.getxAPIResponse = function () {\n    var usersAnswers = this.getCurrentState();\n    return usersAnswers.join('[,]');\n  };\n\n  \/**\n   * Show evaluation widget, i.e: 'You got x of y blanks correct'\n   *\/\n  Blanks.prototype.showEvaluation = function () {\n    var maxScore = this.getMaxScore();\n    var score = this.getScore();\n    var scoreText = H5P.Question.determineOverallFeedback(this.params.overallFeedback, score \/ maxScore).replace('@score', score).replace('@total', maxScore);\n\n    this.setFeedback(scoreText, score, maxScore, this.params.scoreBarLabel);\n\n    if (score === maxScore) {\n      this.toggleButtonVisibility(STATE_FINISHED);\n    }\n  };\n\n  \/**\n   * Hide the evaluation widget\n   *\/\n  Blanks.prototype.hideEvaluation = function () {\n    \/\/ Clear evaluation section.\n    this.removeFeedback();\n  };\n\n  \/**\n   * Hide solutions. (\/try again)\n   *\/\n  Blanks.prototype.hideSolutions = function () {\n    \/\/ Clean solution from quiz\n    this.$questions.find('.h5p-correct-answer').remove();\n  };\n\n  \/**\n   * Get maximum number of correct answers.\n   *\n   * @returns {Number} Max points\n   *\/\n  Blanks.prototype.getMaxScore = function () {\n    var self = this;\n    return self.clozes.length;\n  };\n\n  \/**\n   * Count the number of correct answers.\n   *\n   * @returns {Number} Points\n   *\/\n  Blanks.prototype.getScore = function () {\n    var self = this;\n    var correct = 0;\n    for (var i = 0; i < self.clozes.length; i++) {\n      if (self.clozes[i].correct()) {\n        correct++;\n      }\n      self.params.userAnswers[i] = self.clozes[i].getUserAnswer();\n    }\n\n    return correct;\n  };\n\n  Blanks.prototype.getTitle = function() {\n    return H5P.createTitle(this.params.text);\n  };\n\n  \/**\n   * Clear the user's answers\n   *\/\n  Blanks.prototype.clearAnswers = function () {\n    this.clozes.forEach(function (cloze) {\n      cloze.setUserInput('');\n      cloze.resetAriaLabel();\n    });\n  };\n\n  \/**\n   * Checks if all has been answered.\n   *\n   * @returns {Boolean}\n   *\/\n  Blanks.prototype.getAnswerGiven = function () {\n    return this.answered || !this.hasClozes;\n  };\n\n  \/**\n   * Helps set focus the given input field.\n   * @param {jQuery} $input\n   *\/\n  Blanks.setFocus = function ($input) {\n    setTimeout(function () {\n      $input.focus();\n    }, 1);\n  };\n\n  \/**\n   * Returns an object containing content of each cloze\n   *\n   * @returns {object} object containing content for each cloze\n   *\/\n  Blanks.prototype.getCurrentState = function () {\n    var clozesContent = [];\n\n    \/\/ Get user input for every cloze\n    this.clozes.forEach(function (cloze) {\n      clozesContent.push(cloze.getUserInput());\n    });\n    return clozesContent;\n  };\n\n  \/**\n   * Sets answers to current user state\n   *\/\n  Blanks.prototype.setH5PUserState = function () {\n    var self = this;\n    var isValidState = (this.previousState !== undefined &&\n                        this.previousState.length &&\n                        this.previousState.length === this.clozes.length);\n\n    \/\/ Check that stored user state is valid\n    if (!isValidState) {\n      return;\n    }\n\n    \/\/ Set input from user state\n    var hasAllClozesFilled = true;\n    this.previousState.forEach(function (clozeContent, ccIndex) {\n\n      \/\/ Register that an answer has been given\n      if (clozeContent.length) {\n        self.answered = true;\n      }\n\n      var cloze = self.clozes[ccIndex];\n      cloze.setUserInput(clozeContent);\n\n      \/\/ Handle instant feedback\n      if (self.params.behaviour.autoCheck) {\n        if (cloze.filledOut()) {\n          cloze.checkAnswer();\n        } else {\n          hasAllClozesFilled = false;\n        }\n      }\n    });\n\n    if (self.params.behaviour.autoCheck && hasAllClozesFilled) {\n      self.showEvaluation();\n      self.toggleButtonVisibility(STATE_CHECKING);\n    }\n  };\n\n  \/**\n   * Disables any active input. Useful for freezing the task and dis-allowing\n   * modification of wrong answers.\n   *\/\n  Blanks.prototype.disableInput = function () {\n    this.$questions.find('input').attr('disabled', true);\n  };\n\n  return Blanks;\n})(H5P.jQuery, H5P.Question);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Blanks-1.8\/js\/cloze.js?ver=1.8.5":"\n(function ($, Blanks) {\n\n  \/**\n   * Simple private class for keeping track of clozes.\n   *\n   * @class H5P.Blanks.Cloze\n   * @param {string} answer\n   * @param {Object} behaviour Behavioral settings for the task from semantics\n   * @param {boolean} behaviour.acceptSpellingErrors - If true, answers will also count correct if they contain small spelling errors.\n   * @param {string} defaultUserAnswer\n   * @param {Object} l10n Localized texts\n   * @param {string} l10n.solutionLabel Assistive technology label for cloze solution\n   * @param {string} l10n.inputLabel Assistive technology label for cloze input\n   * @param {string} l10n.inputHasTipLabel Assistive technology label for input with tip\n   * @param {string} l10n.tipLabel Label for tip icon\n   *\/\n  Blanks.Cloze = function (solution, behaviour, defaultUserAnswer, l10n) {\n    var self = this;\n    var $input, $wrapper;\n    var answers = solution.solutions;\n    var answer = answers.join('\/');\n    var tip = solution.tip;\n    var checkedAnswer = null;\n    var inputLabel = l10n.inputLabel;\n\n    if (behaviour.caseSensitive !== true) {\n      \/\/ Convert possible solutions into lowercase\n      for (var i = 0; i < answers.length; i++) {\n        answers[i] = answers[i].toLowerCase();\n      }\n    }\n\n    \/**\n     * Check if the answer is correct.\n     *\n     * @private\n     * @param {string} answered\n     *\/\n    var correct = function (answered) {\n      if (behaviour.caseSensitive !== true) {\n        answered = answered.toLowerCase();\n      }\n      for (var i = 0; i < answers.length; i++) {\n        \/\/ Damerau-Levenshtein comparison\n        if (behaviour.acceptSpellingErrors === true) {\n          var levenshtein = H5P.TextUtilities.computeLevenshteinDistance(answered, answers[i], true);\n          \/*\n           * The correctness is temporarily computed by word length and number of number of operations\n           * required to change one word into the other (Damerau-Levenshtein). It's subject to\n           * change, cmp. https:\/\/github.com\/otacke\/udacity-machine-learning-engineer\/blob\/master\/submissions\/capstone_proposals\/h5p_fuzzy_blanks.md\n           *\/\n          if ((answers[i].length > 9) && (levenshtein <= 2)) {\n            return true;\n          } else if ((answers[i].length > 3) && (levenshtein <= 1)) {\n            return true;\n          }\n        }\n        \/\/ regular comparison\n        if (answered === answers[i]) {\n          return true;\n        }\n      }\n      return false;\n    };\n\n    \/**\n     * Check if filled out.\n     *\n     * @param {boolean}\n     *\/\n    this.filledOut = function () {\n      var answered = this.getUserAnswer();\n      \/\/ Blank can be correct and is interpreted as filled out.\n      return (answered !== '' || correct(answered));\n    };\n\n    \/**\n     * Check the cloze and mark it as wrong or correct.\n     *\/\n    this.checkAnswer = function () {\n      checkedAnswer = this.getUserAnswer();\n      var isCorrect = correct(checkedAnswer);\n      if (isCorrect) {\n        $wrapper.addClass('h5p-correct');\n        $input.attr('disabled', true)\n          .attr('aria-label', inputLabel + '. ' + l10n.answeredCorrectly);\n      }\n      else {\n        $wrapper.addClass('h5p-wrong');\n        $input.attr('aria-label', inputLabel + '. ' + l10n.answeredIncorrectly);\n      }\n    };\n\n    \/**\n     * Disables input.\n     * @method disableInput\n     *\/\n    this.disableInput = function () {\n      this.toggleInput(false);\n    };\n\n    \/**\n     * Enables input.\n     * @method enableInput\n     *\/\n    this.enableInput = function () {\n      this.toggleInput(true);\n    };\n\n    \/**\n     * Toggles input enable\/disable\n     * @method toggleInput\n     * @param  {boolean}   enabled True if input should be enabled, otherwise false\n     *\/\n    this.toggleInput = function (enabled) {\n      $input.attr('disabled', !enabled);\n    };\n\n    \/**\n     * Show the correct solution.\n     *\/\n    this.showSolution = function () {\n      if (correct(this.getUserAnswer())) {\n        return; \/\/ Only for the wrong ones\n      }\n\n      $('<span aria-hidden=\"true\" class=\"h5p-correct-answer\"> ' + answer + '<\/span>').insertAfter($wrapper);\n      $input.attr('disabled', true);\n      var ariaLabel = inputLabel + '. ' +\n        l10n.solutionLabel + ' ' + answer + '. ' +\n        l10n.answeredIncorrectly;\n\n      $input.attr('aria-label', ariaLabel);\n    };\n\n    \/**\n     * @returns {boolean}\n     *\/\n    this.correct = function () {\n      return correct(this.getUserAnswer());\n    };\n\n    \/**\n     * Set input element.\n     *\n     * @param {H5P.jQuery} $element\n     * @param {function} afterCheck\n     * @param {function} afterFocus\n     * @param {number} clozeIndex Index of cloze\n     * @param {number} totalCloze Total amount of clozes in blanks\n     *\/\n    this.setInput = function ($element, afterCheck, afterFocus, clozeIndex, totalCloze) {\n      $input = $element;\n      $wrapper = $element.parent();\n      inputLabel = inputLabel.replace('@num', (clozeIndex + 1))\n        .replace('@total', totalCloze);\n\n      \/\/ Add tip if tip is set\n      if(tip !== undefined && tip.trim().length > 0) {\n        $wrapper.addClass('has-tip')\n          .append(H5P.JoubelUI.createTip(tip, {\n            tipLabel: l10n.tipLabel\n          }));\n        inputLabel += '. ' + l10n.inputHasTipLabel;\n      }\n\n      $input.attr('aria-label', inputLabel);\n\n      if (afterCheck !== undefined) {\n        $input.blur(function () {\n          if (self.filledOut()) {\n            \/\/ Check answers\n            if (!behaviour.enableRetry) {\n              self.disableInput();\n            }\n            self.checkAnswer();\n            afterCheck.apply(self);\n          }\n        });\n      }\n      $input.keyup(function () {\n        if (checkedAnswer !== null && checkedAnswer !== self.getUserAnswer()) {\n          \/\/ The Answer has changed since last check\n          checkedAnswer = null;\n          $wrapper.removeClass('h5p-wrong');\n          $input.attr('aria-label', inputLabel);\n          if (afterFocus !== undefined) {\n            afterFocus();\n          }\n        }\n      });\n    };\n\n    \/**\n     * @returns {string} Cloze html\n     *\/\n    this.toString = function () {\n      var extra = defaultUserAnswer ? ' value=\"' + defaultUserAnswer + '\"' : '';\n      var result = '<span class=\"h5p-input-wrapper\"><input type=\"text\" class=\"h5p-text-input\" autocomplete=\"off\" autocapitalize=\"off\"' + extra + '><\/span>';\n      self.length = result.length;\n      return result;\n    };\n\n    \/**\n     * @returns {string} Trimmed answer\n     *\/\n    this.getUserAnswer = function () {\n      return H5P.trim($input.val());\n    };\n\n    \/**\n     * @returns {string} Answer\n     *\/\n    this.getUserInput = function () {\n      return $input.val();\n    };\n\n    \/**\n     * @param {string} text New input text\n     *\/\n    this.setUserInput = function (text) {\n      $input.val(text);\n    };\n\n    \/**\n     * Resets aria label of input field\n     *\/\n    this.resetAriaLabel = function () {\n      $input.attr('aria-label', inputLabel);\n    };\n  };\n\n})(H5P.jQuery, H5P.Blanks);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SoundJS-1.0\/soundjs-0.6.2.min.js?ver=1.0.2":"\n\/*!\n* @license SoundJS\n* Visit http:\/\/createjs.com\/ for documentation, updates and examples.\n*\n* Copyright (c) 2011-2015 gskinner.com, inc.\n*\n* Distributed under the terms of the MIT license.\n* http:\/\/www.opensource.org\/licenses\/mit-license.html\n*\n* This notice shall be included in all copies or substantial portions of the Software.\n*\/\n\n\/**!\n * SoundJS FlashAudioPlugin also includes swfobject (http:\/\/code.google.com\/p\/swfobject\/)\n *\/\n\nvar old = this.createjs;\n\nthis.createjs=this.createjs||{},function(){var a=createjs.SoundJS=createjs.SoundJS||{};a.version=\"0.6.2\",a.buildDate=\"Thu, 26 Nov 2015 20:44:31 GMT\"}(),this.createjs=this.createjs||{},createjs.extend=function(a,b){\"use strict\";function c(){this.constructor=a}return c.prototype=b.prototype,a.prototype=new c},this.createjs=this.createjs||{},createjs.promote=function(a,b){\"use strict\";var c=a.prototype,d=Object.getPrototypeOf&&Object.getPrototypeOf(c)||c.__proto__;if(d){c[(b+=\"_\")+\"constructor\"]=d.constructor;for(var e in d)c.hasOwnProperty(e)&&\"function\"==typeof d[e]&&(c[b+e]=d[e])}return a},this.createjs=this.createjs||{},createjs.indexOf=function(a,b){\"use strict\";for(var c=0,d=a.length;d>c;c++)if(b===a[c])return c;return-1},this.createjs=this.createjs||{},function(){\"use strict\";createjs.proxy=function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){return a.apply(b,Array.prototype.slice.call(arguments,0).concat(c))}}}(),this.createjs=this.createjs||{},function(){\"use strict\";function BrowserDetect(){throw\"BrowserDetect cannot be instantiated\"}var a=BrowserDetect.agent=window.navigator.userAgent;BrowserDetect.isWindowPhone=a.indexOf(\"IEMobile\")>-1||a.indexOf(\"Windows Phone\")>-1,BrowserDetect.isFirefox=a.indexOf(\"Firefox\")>-1,BrowserDetect.isOpera=null!=window.opera,BrowserDetect.isChrome=a.indexOf(\"Chrome\")>-1,BrowserDetect.isIOS=(a.indexOf(\"iPod\")>-1||a.indexOf(\"iPhone\")>-1||a.indexOf(\"iPad\")>-1)&&!BrowserDetect.isWindowPhone,BrowserDetect.isAndroid=a.indexOf(\"Android\")>-1&&!BrowserDetect.isWindowPhone,BrowserDetect.isBlackberry=a.indexOf(\"Blackberry\")>-1,createjs.BrowserDetect=BrowserDetect}(),this.createjs=this.createjs||{},function(){\"use strict\";function EventDispatcher(){this._listeners=null,this._captureListeners=null}var a=EventDispatcher.prototype;EventDispatcher.initialize=function(b){b.addEventListener=a.addEventListener,b.on=a.on,b.removeEventListener=b.off=a.removeEventListener,b.removeAllEventListeners=a.removeAllEventListeners,b.hasEventListener=a.hasEventListener,b.dispatchEvent=a.dispatchEvent,b._dispatchEvent=a._dispatchEvent,b.willTrigger=a.willTrigger},a.addEventListener=function(a,b,c){var d;d=c?this._captureListeners=this._captureListeners||{}:this._listeners=this._listeners||{};var e=d[a];return e&&this.removeEventListener(a,b,c),e=d[a],e?e.push(b):d[a]=[b],b},a.on=function(a,b,c,d,e,f){return b.handleEvent&&(c=c||b,b=b.handleEvent),c=c||this,this.addEventListener(a,function(a){b.call(c,a,e),d&&a.remove()},f)},a.removeEventListener=function(a,b,c){var d=c?this._captureListeners:this._listeners;if(d){var e=d[a];if(e)for(var f=0,g=e.length;g>f;f++)if(e[f]==b){1==g?delete d[a]:e.splice(f,1);break}}},a.off=a.removeEventListener,a.removeAllEventListeners=function(a){a?(this._listeners&&delete this._listeners[a],this._captureListeners&&delete this._captureListeners[a]):this._listeners=this._captureListeners=null},a.dispatchEvent=function(a,b,c){if(\"string\"==typeof a){var d=this._listeners;if(!(b||d&&d[a]))return!0;a=new createjs.Event(a,b,c)}else a.target&&a.clone&&(a=a.clone());try{a.target=this}catch(e){}if(a.bubbles&&this.parent){for(var f=this,g=[f];f.parent;)g.push(f=f.parent);var h,i=g.length;for(h=i-1;h>=0&&!a.propagationStopped;h--)g[h]._dispatchEvent(a,1+(0==h));for(h=1;i>h&&!a.propagationStopped;h++)g[h]._dispatchEvent(a,3)}else this._dispatchEvent(a,2);return!a.defaultPrevented},a.hasEventListener=function(a){var b=this._listeners,c=this._captureListeners;return!!(b&&b[a]||c&&c[a])},a.willTrigger=function(a){for(var b=this;b;){if(b.hasEventListener(a))return!0;b=b.parent}return!1},a.toString=function(){return\"[EventDispatcher]\"},a._dispatchEvent=function(a,b){var c,d=1==b?this._captureListeners:this._listeners;if(a&&d){var e=d[a.type];if(!e||!(c=e.length))return;try{a.currentTarget=this}catch(f){}try{a.eventPhase=b}catch(f){}a.removed=!1,e=e.slice();for(var g=0;c>g&&!a.immediatePropagationStopped;g++){var h=e[g];h.handleEvent?h.handleEvent(a):h(a),a.removed&&(this.off(a.type,h,1==b),a.removed=!1)}}},createjs.EventDispatcher=EventDispatcher}(),this.createjs=this.createjs||{},function(){\"use strict\";function Event(a,b,c){this.type=a,this.target=null,this.currentTarget=null,this.eventPhase=0,this.bubbles=!!b,this.cancelable=!!c,this.timeStamp=(new Date).getTime(),this.defaultPrevented=!1,this.propagationStopped=!1,this.immediatePropagationStopped=!1,this.removed=!1}var a=Event.prototype;a.preventDefault=function(){this.defaultPrevented=this.cancelable&&!0},a.stopPropagation=function(){this.propagationStopped=!0},a.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},a.remove=function(){this.removed=!0},a.clone=function(){return new Event(this.type,this.bubbles,this.cancelable)},a.set=function(a){for(var b in a)this[b]=a[b];return this},a.toString=function(){return\"[Event (type=\"+this.type+\")]\"},createjs.Event=Event}(),this.createjs=this.createjs||{},function(){\"use strict\";function ErrorEvent(a,b,c){this.Event_constructor(\"error\"),this.title=a,this.message=b,this.data=c}var a=createjs.extend(ErrorEvent,createjs.Event);a.clone=function(){return new createjs.ErrorEvent(this.title,this.message,this.data)},createjs.ErrorEvent=createjs.promote(ErrorEvent,\"Event\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function ProgressEvent(a,b){this.Event_constructor(\"progress\"),this.loaded=a,this.total=null==b?1:b,this.progress=0==b?0:this.loaded\/this.total}var a=createjs.extend(ProgressEvent,createjs.Event);a.clone=function(){return new createjs.ProgressEvent(this.loaded,this.total)},createjs.ProgressEvent=createjs.promote(ProgressEvent,\"Event\")}(window),this.createjs=this.createjs||{},function(){\"use strict\";function LoadItem(){this.src=null,this.type=null,this.id=null,this.maintainOrder=!1,this.callback=null,this.data=null,this.method=createjs.LoadItem.GET,this.values=null,this.headers=null,this.withCredentials=!1,this.mimeType=null,this.crossOrigin=null,this.loadTimeout=b.LOAD_TIMEOUT_DEFAULT}var a=LoadItem.prototype={},b=LoadItem;b.LOAD_TIMEOUT_DEFAULT=8e3,b.create=function(a){if(\"string\"==typeof a){var c=new LoadItem;return c.src=a,c}if(a instanceof b)return a;if(a instanceof Object&&a.src)return null==a.loadTimeout&&(a.loadTimeout=b.LOAD_TIMEOUT_DEFAULT),a;throw new Error(\"Type not recognized.\")},a.set=function(a){for(var b in a)this[b]=a[b];return this},createjs.LoadItem=b}(),function(){var a={};a.ABSOLUTE_PATT=\/^(?:\\w+:)?\\\/{2}\/i,a.RELATIVE_PATT=\/^[.\\\/]*?\\\/\/i,a.EXTENSION_PATT=\/\\\/?[^\\\/]+\\.(\\w{1,5})$\/i,a.parseURI=function(b){var c={absolute:!1,relative:!1};if(null==b)return c;var d=b.indexOf(\"?\");d>-1&&(b=b.substr(0,d));var e;return a.ABSOLUTE_PATT.test(b)?c.absolute=!0:a.RELATIVE_PATT.test(b)&&(c.relative=!0),(e=b.match(a.EXTENSION_PATT))&&(c.extension=e[1].toLowerCase()),c},a.formatQueryString=function(a,b){if(null==a)throw new Error(\"You must specify data.\");var c=[];for(var d in a)c.push(d+\"=\"+escape(a[d]));return b&&(c=c.concat(b)),c.join(\"&\")},a.buildPath=function(a,b){if(null==b)return a;var c=[],d=a.indexOf(\"?\");if(-1!=d){var e=a.slice(d+1);c=c.concat(e.split(\"&\"))}return-1!=d?a.slice(0,d)+\"?\"+this.formatQueryString(b,c):a+\"?\"+this.formatQueryString(b,c)},a.isCrossDomain=function(a){var b=document.createElement(\"a\");b.href=a.src;var c=document.createElement(\"a\");c.href=location.href;var d=\"\"!=b.hostname&&(b.port!=c.port||b.protocol!=c.protocol||b.hostname!=c.hostname);return d},a.isLocal=function(a){var b=document.createElement(\"a\");return b.href=a.src,\"\"==b.hostname&&\"file:\"==b.protocol},a.isBinary=function(a){switch(a){case createjs.AbstractLoader.IMAGE:case createjs.AbstractLoader.BINARY:return!0;default:return!1}},a.isImageTag=function(a){return a instanceof HTMLImageElement},a.isAudioTag=function(a){return window.HTMLAudioElement?a instanceof HTMLAudioElement:!1},a.isVideoTag=function(a){return window.HTMLVideoElement?a instanceof HTMLVideoElement:!1},a.isText=function(a){switch(a){case createjs.AbstractLoader.TEXT:case createjs.AbstractLoader.JSON:case createjs.AbstractLoader.MANIFEST:case createjs.AbstractLoader.XML:case createjs.AbstractLoader.CSS:case createjs.AbstractLoader.SVG:case createjs.AbstractLoader.JAVASCRIPT:case createjs.AbstractLoader.SPRITESHEET:return!0;default:return!1}},a.getTypeByExtension=function(a){if(null==a)return createjs.AbstractLoader.TEXT;switch(a.toLowerCase()){case\"jpeg\":case\"jpg\":case\"gif\":case\"png\":case\"webp\":case\"bmp\":return createjs.AbstractLoader.IMAGE;case\"ogg\":case\"mp3\":case\"webm\":return createjs.AbstractLoader.SOUND;case\"mp4\":case\"webm\":case\"ts\":return createjs.AbstractLoader.VIDEO;case\"json\":return createjs.AbstractLoader.JSON;case\"xml\":return createjs.AbstractLoader.XML;case\"css\":return createjs.AbstractLoader.CSS;case\"js\":return createjs.AbstractLoader.JAVASCRIPT;case\"svg\":return createjs.AbstractLoader.SVG;default:return createjs.AbstractLoader.TEXT}},createjs.RequestUtils=a}(),this.createjs=this.createjs||{},function(){\"use strict\";function AbstractLoader(a,b,c){this.EventDispatcher_constructor(),this.loaded=!1,this.canceled=!1,this.progress=0,this.type=c,this.resultFormatter=null,this._item=a?createjs.LoadItem.create(a):null,this._preferXHR=b,this._result=null,this._rawResult=null,this._loadedItems=null,this._tagSrcAttribute=null,this._tag=null}var a=createjs.extend(AbstractLoader,createjs.EventDispatcher),b=AbstractLoader;b.POST=\"POST\",b.GET=\"GET\",b.BINARY=\"binary\",b.CSS=\"css\",b.IMAGE=\"image\",b.JAVASCRIPT=\"javascript\",b.JSON=\"json\",b.JSONP=\"jsonp\",b.MANIFEST=\"manifest\",b.SOUND=\"sound\",b.VIDEO=\"video\",b.SPRITESHEET=\"spritesheet\",b.SVG=\"svg\",b.TEXT=\"text\",b.XML=\"xml\",a.getItem=function(){return this._item},a.getResult=function(a){return a?this._rawResult:this._result},a.getTag=function(){return this._tag},a.setTag=function(a){this._tag=a},a.load=function(){this._createRequest(),this._request.on(\"complete\",this,this),this._request.on(\"progress\",this,this),this._request.on(\"loadStart\",this,this),this._request.on(\"abort\",this,this),this._request.on(\"timeout\",this,this),this._request.on(\"error\",this,this);var a=new createjs.Event(\"initialize\");a.loader=this._request,this.dispatchEvent(a),this._request.load()},a.cancel=function(){this.canceled=!0,this.destroy()},a.destroy=function(){this._request&&(this._request.removeAllEventListeners(),this._request.destroy()),this._request=null,this._item=null,this._rawResult=null,this._result=null,this._loadItems=null,this.removeAllEventListeners()},a.getLoadedItems=function(){return this._loadedItems},a._createRequest=function(){this._request=this._preferXHR?new createjs.XHRRequest(this._item):new createjs.TagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._createTag=function(){return null},a._sendLoadStart=function(){this._isCanceled()||this.dispatchEvent(\"loadstart\")},a._sendProgress=function(a){if(!this._isCanceled()){var b=null;\"number\"==typeof a?(this.progress=a,b=new createjs.ProgressEvent(this.progress)):(b=a,this.progress=a.loaded\/a.total,b.progress=this.progress,(isNaN(this.progress)||1\/0==this.progress)&&(this.progress=0)),this.hasEventListener(\"progress\")&&this.dispatchEvent(b)}},a._sendComplete=function(){if(!this._isCanceled()){this.loaded=!0;var a=new createjs.Event(\"complete\");a.rawResult=this._rawResult,null!=this._result&&(a.result=this._result),this.dispatchEvent(a)}},a._sendError=function(a){!this._isCanceled()&&this.hasEventListener(\"error\")&&(null==a&&(a=new createjs.ErrorEvent(\"PRELOAD_ERROR_EMPTY\")),this.dispatchEvent(a))},a._isCanceled=function(){return null==window.createjs||this.canceled?!0:!1},a.resultFormatter=null,a.handleEvent=function(a){switch(a.type){case\"complete\":this._rawResult=a.target._response;var b=this.resultFormatter&&this.resultFormatter(this);b instanceof Function?b.call(this,createjs.proxy(this._resultFormatSuccess,this),createjs.proxy(this._resultFormatFailed,this)):(this._result=b||this._rawResult,this._sendComplete());break;case\"progress\":this._sendProgress(a);break;case\"error\":this._sendError(a);break;case\"loadstart\":this._sendLoadStart();break;case\"abort\":case\"timeout\":this._isCanceled()||this.dispatchEvent(new createjs.ErrorEvent(\"PRELOAD_\"+a.type.toUpperCase()+\"_ERROR\"))}},a._resultFormatSuccess=function(a){this._result=a,this._sendComplete()},a._resultFormatFailed=function(a){this._sendError(a)},a.buildPath=function(a,b){return createjs.RequestUtils.buildPath(a,b)},a.toString=function(){return\"[PreloadJS AbstractLoader]\"},createjs.AbstractLoader=createjs.promote(AbstractLoader,\"EventDispatcher\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function AbstractMediaLoader(a,b,c){this.AbstractLoader_constructor(a,b,c),this.resultFormatter=this._formatResult,this._tagSrcAttribute=\"src\",this.on(\"initialize\",this._updateXHR,this)}var a=createjs.extend(AbstractMediaLoader,createjs.AbstractLoader);a.load=function(){this._tag||(this._tag=this._createTag(this._item.src)),this._tag.preload=\"auto\",this._tag.load(),this.AbstractLoader_load()},a._createTag=function(){},a._createRequest=function(){this._request=this._preferXHR?new createjs.XHRRequest(this._item):new createjs.MediaTagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._updateXHR=function(a){a.loader.setResponseType&&a.loader.setResponseType(\"blob\")},a._formatResult=function(a){if(this._tag.removeEventListener&&this._tag.removeEventListener(\"canplaythrough\",this._loadedHandler),this._tag.onstalled=null,this._preferXHR){var b=window.URL||window.webkitURL,c=a.getResult(!0);a.getTag().src=b.createObjectURL(c)}return a.getTag()},createjs.AbstractMediaLoader=createjs.promote(AbstractMediaLoader,\"AbstractLoader\")}(),this.createjs=this.createjs||{},function(){\"use strict\";var AbstractRequest=function(a){this._item=a},a=createjs.extend(AbstractRequest,createjs.EventDispatcher);a.load=function(){},a.destroy=function(){},a.cancel=function(){},createjs.AbstractRequest=createjs.promote(AbstractRequest,\"EventDispatcher\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function TagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this),this._addedToDOM=!1,this._startTagVisibility=null}var a=createjs.extend(TagRequest,createjs.AbstractRequest);a.load=function(){this._tag.onload=createjs.proxy(this._handleTagComplete,this),this._tag.onreadystatechange=createjs.proxy(this._handleReadyStateChange,this),this._tag.onerror=createjs.proxy(this._handleError,this);var a=new createjs.Event(\"initialize\");a.loader=this._tag,this.dispatchEvent(a),this._hideTag(),this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout),this._tag[this._tagSrcAttribute]=this._item.src,null==this._tag.parentNode&&(window.document.body.appendChild(this._tag),this._addedToDOM=!0)},a.destroy=function(){this._clean(),this._tag=null,this.AbstractRequest_destroy()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;(\"loaded\"==a.readyState||\"complete\"==a.readyState)&&this._handleTagComplete()},a._handleError=function(){this._clean(),this.dispatchEvent(\"error\")},a._handleTagComplete=function(){this._rawResult=this._tag,this._result=this.resultFormatter&&this.resultFormatter(this)||this._rawResult,this._clean(),this._showTag(),this.dispatchEvent(\"complete\")},a._handleTimeout=function(){this._clean(),this.dispatchEvent(new createjs.Event(\"timeout\"))},a._clean=function(){this._tag.onload=null,this._tag.onreadystatechange=null,this._tag.onerror=null,this._addedToDOM&&null!=this._tag.parentNode&&this._tag.parentNode.removeChild(this._tag),clearTimeout(this._loadTimeout)},a._hideTag=function(){this._startTagVisibility=this._tag.style.visibility,this._tag.style.visibility=\"hidden\"},a._showTag=function(){this._tag.style.visibility=this._startTagVisibility},a._handleStalled=function(){},createjs.TagRequest=createjs.promote(TagRequest,\"AbstractRequest\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function MediaTagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this)}var a=createjs.extend(MediaTagRequest,createjs.TagRequest);a.load=function(){var a=createjs.proxy(this._handleStalled,this);this._stalledCallback=a;var b=createjs.proxy(this._handleProgress,this);this._handleProgress=b,this._tag.addEventListener(\"stalled\",a),this._tag.addEventListener(\"progress\",b),this._tag.addEventListener&&this._tag.addEventListener(\"canplaythrough\",this._loadedHandler,!1),this.TagRequest_load()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;(\"loaded\"==a.readyState||\"complete\"==a.readyState)&&this._handleTagComplete()},a._handleStalled=function(){},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._clean=function(){this._tag.removeEventListener&&this._tag.removeEventListener(\"canplaythrough\",this._loadedHandler),this._tag.removeEventListener(\"stalled\",this._stalledCallback),this._tag.removeEventListener(\"progress\",this._progressCallback),this.TagRequest__clean()},createjs.MediaTagRequest=createjs.promote(MediaTagRequest,\"TagRequest\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function XHRRequest(a){this.AbstractRequest_constructor(a),this._request=null,this._loadTimeout=null,this._xhrLevel=1,this._response=null,this._rawResponse=null,this._canceled=!1,this._handleLoadStartProxy=createjs.proxy(this._handleLoadStart,this),this._handleProgressProxy=createjs.proxy(this._handleProgress,this),this._handleAbortProxy=createjs.proxy(this._handleAbort,this),this._handleErrorProxy=createjs.proxy(this._handleError,this),this._handleTimeoutProxy=createjs.proxy(this._handleTimeout,this),this._handleLoadProxy=createjs.proxy(this._handleLoad,this),this._handleReadyStateChangeProxy=createjs.proxy(this._handleReadyStateChange,this),!this._createXHR(a)}var a=createjs.extend(XHRRequest,createjs.AbstractRequest);XHRRequest.ACTIVEX_VERSIONS=[\"Msxml2.XMLHTTP.6.0\",\"Msxml2.XMLHTTP.5.0\",\"Msxml2.XMLHTTP.4.0\",\"MSXML2.XMLHTTP.3.0\",\"MSXML2.XMLHTTP\",\"Microsoft.XMLHTTP\"],a.getResult=function(a){return a&&this._rawResponse?this._rawResponse:this._response},a.cancel=function(){this.canceled=!0,this._clean(),this._request.abort()},a.load=function(){if(null==this._request)return void this._handleError();null!=this._request.addEventListener?(this._request.addEventListener(\"loadstart\",this._handleLoadStartProxy,!1),this._request.addEventListener(\"progress\",this._handleProgressProxy,!1),this._request.addEventListener(\"abort\",this._handleAbortProxy,!1),this._request.addEventListener(\"error\",this._handleErrorProxy,!1),this._request.addEventListener(\"timeout\",this._handleTimeoutProxy,!1),this._request.addEventListener(\"load\",this._handleLoadProxy,!1),this._request.addEventListener(\"readystatechange\",this._handleReadyStateChangeProxy,!1)):(this._request.onloadstart=this._handleLoadStartProxy,this._request.onprogress=this._handleProgressProxy,this._request.onabort=this._handleAbortProxy,this._request.onerror=this._handleErrorProxy,this._request.ontimeout=this._handleTimeoutProxy,this._request.onload=this._handleLoadProxy,this._request.onreadystatechange=this._handleReadyStateChangeProxy),1==this._xhrLevel&&(this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout));try{this._item.values&&this._item.method!=createjs.AbstractLoader.GET?this._item.method==createjs.AbstractLoader.POST&&this._request.send(createjs.RequestUtils.formatQueryString(this._item.values)):this._request.send()}catch(a){this.dispatchEvent(new createjs.ErrorEvent(\"XHR_SEND\",null,a))}},a.setResponseType=function(a){\"blob\"===a&&(a=window.URL?\"blob\":\"arraybuffer\",this._responseType=a),this._request.responseType=a},a.getAllResponseHeaders=function(){return this._request.getAllResponseHeaders instanceof Function?this._request.getAllResponseHeaders():null},a.getResponseHeader=function(a){return this._request.getResponseHeader instanceof Function?this._request.getResponseHeader(a):null},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._handleLoadStart=function(){clearTimeout(this._loadTimeout),this.dispatchEvent(\"loadstart\")},a._handleAbort=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent(\"XHR_ABORTED\",null,a))},a._handleError=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent(a.message))},a._handleReadyStateChange=function(){4==this._request.readyState&&this._handleLoad()},a._handleLoad=function(){if(!this.loaded){this.loaded=!0;var a=this._checkError();if(a)return void this._handleError(a);if(this._response=this._getResponse(),\"arraybuffer\"===this._responseType)try{this._response=new Blob([this._response])}catch(b){if(window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,\"TypeError\"===b.name&&window.BlobBuilder){var c=new BlobBuilder;c.append(this._response),this._response=c.getBlob()}}this._clean(),this.dispatchEvent(new createjs.Event(\"complete\"))}},a._handleTimeout=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent(\"PRELOAD_TIMEOUT\",null,a))},a._checkError=function(){var a=parseInt(this._request.status);switch(a){case 404:case 0:return new Error(a)}return null},a._getResponse=function(){if(null!=this._response)return this._response;if(null!=this._request.response)return this._request.response;try{if(null!=this._request.responseText)return this._request.responseText}catch(a){}try{if(null!=this._request.responseXML)return this._request.responseXML}catch(a){}return null},a._createXHR=function(a){var b=createjs.RequestUtils.isCrossDomain(a),c={},d=null;if(window.XMLHttpRequest)d=new XMLHttpRequest,b&&void 0===d.withCredentials&&window.XDomainRequest&&(d=new XDomainRequest);else{for(var e=0,f=s.ACTIVEX_VERSIONS.length;f>e;e++){var g=s.ACTIVEX_VERSIONS[e];try{d=new ActiveXObject(g);break}catch(h){}}if(null==d)return!1}null==a.mimeType&&createjs.RequestUtils.isText(a.type)&&(a.mimeType=\"text\/plain; charset=utf-8\"),a.mimeType&&d.overrideMimeType&&d.overrideMimeType(a.mimeType),this._xhrLevel=\"string\"==typeof d.responseType?2:1;var i=null;if(i=a.method==createjs.AbstractLoader.GET?createjs.RequestUtils.buildPath(a.src,a.values):a.src,d.open(a.method||createjs.AbstractLoader.GET,i,!0),b&&d instanceof XMLHttpRequest&&1==this._xhrLevel&&(c.Origin=location.origin),a.values&&a.method==createjs.AbstractLoader.POST&&(c[\"Content-Type\"]=\"application\/x-www-form-urlencoded\"),b||c[\"X-Requested-With\"]||(c[\"X-Requested-With\"]=\"XMLHttpRequest\"),a.headers)for(var j in a.headers)c[j]=a.headers[j];for(j in c)d.setRequestHeader(j,c[j]);return d instanceof XMLHttpRequest&&void 0!==a.withCredentials&&(d.withCredentials=a.withCredentials),this._request=d,!0},a._clean=function(){clearTimeout(this._loadTimeout),null!=this._request.removeEventListener?(this._request.removeEventListener(\"loadstart\",this._handleLoadStartProxy),this._request.removeEventListener(\"progress\",this._handleProgressProxy),this._request.removeEventListener(\"abort\",this._handleAbortProxy),this._request.removeEventListener(\"error\",this._handleErrorProxy),this._request.removeEventListener(\"timeout\",this._handleTimeoutProxy),this._request.removeEventListener(\"load\",this._handleLoadProxy),this._request.removeEventListener(\"readystatechange\",this._handleReadyStateChangeProxy)):(this._request.onloadstart=null,this._request.onprogress=null,this._request.onabort=null,this._request.onerror=null,this._request.ontimeout=null,this._request.onload=null,this._request.onreadystatechange=null)},a.toString=function(){return\"[PreloadJS XHRRequest]\"},createjs.XHRRequest=createjs.promote(XHRRequest,\"AbstractRequest\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function SoundLoader(a,b){this.AbstractMediaLoader_constructor(a,b,createjs.AbstractLoader.SOUND),createjs.RequestUtils.isAudioTag(a)?this._tag=a:createjs.RequestUtils.isAudioTag(a.src)?this._tag=a:createjs.RequestUtils.isAudioTag(a.tag)&&(this._tag=createjs.RequestUtils.isAudioTag(a)?a:a.src),null!=this._tag&&(this._preferXHR=!1)}var a=createjs.extend(SoundLoader,createjs.AbstractMediaLoader),b=SoundLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.SOUND},a._createTag=function(a){var b=document.createElement(\"audio\");return b.autoplay=!1,b.preload=\"none\",b.src=a,b},createjs.SoundLoader=createjs.promote(SoundLoader,\"AbstractMediaLoader\")}(),this.createjs=this.createjs||{},function(){\"use strict\";var PlayPropsConfig=function(){this.interrupt=null,this.delay=null,this.offset=null,this.loop=null,this.volume=null,this.pan=null,this.startTime=null,this.duration=null},a=PlayPropsConfig.prototype={},b=PlayPropsConfig;b.create=function(a){if(a instanceof b||a instanceof Object){var c=new createjs.PlayPropsConfig;return c.set(a),c}throw new Error(\"Type not recognized.\")},a.set=function(a){for(var b in a)this[b]=a[b];return this},a.toString=function(){return\"[PlayPropsConfig]\"},createjs.PlayPropsConfig=b}(),this.createjs=this.createjs||{},function(){\"use strict\";function Sound(){throw\"Sound cannot be instantiated\"}function a(a,b){this.init(a,b)}var b=Sound;b.INTERRUPT_ANY=\"any\",b.INTERRUPT_EARLY=\"early\",b.INTERRUPT_LATE=\"late\",b.INTERRUPT_NONE=\"none\",b.PLAY_INITED=\"playInited\",b.PLAY_SUCCEEDED=\"playSucceeded\",b.PLAY_INTERRUPTED=\"playInterrupted\",b.PLAY_FINISHED=\"playFinished\",b.PLAY_FAILED=\"playFailed\",b.SUPPORTED_EXTENSIONS=[\"mp3\",\"ogg\",\"opus\",\"mpeg\",\"wav\",\"m4a\",\"mp4\",\"aiff\",\"wma\",\"mid\"],b.EXTENSION_MAP={m4a:\"mp4\"},b.FILE_PATTERN=\/^(?:(\\w+:)\\\/{2}(\\w+(?:\\.\\w+)*\\\/?))?([\\\/.]*?(?:[^?]+)?\\\/)?((?:[^\\\/?]+)\\.(\\w+))(?:\\?(\\S+)?)?$\/,b.defaultInterruptBehavior=b.INTERRUPT_NONE,b.alternateExtensions=[],b.activePlugin=null,b._masterVolume=1,Object.defineProperty(b,\"volume\",{get:function(){return this._masterVolume},set:function(a){if(null==Number(a))return!1;if(a=Math.max(0,Math.min(1,a)),b._masterVolume=a,!this.activePlugin||!this.activePlugin.setVolume||!this.activePlugin.setVolume(a))for(var c=this._instances,d=0,e=c.length;e>d;d++)c[d].setMasterVolume(a)}}),b._masterMute=!1,Object.defineProperty(b,\"muted\",{get:function(){return this._masterMute},set:function(a){if(null==a)return!1;if(this._masterMute=a,!this.activePlugin||!this.activePlugin.setMute||!this.activePlugin.setMute(a))for(var b=this._instances,c=0,d=b.length;d>c;c++)b[c].setMasterMute(a);return!0}}),Object.defineProperty(b,\"capabilities\",{get:function(){return null==b.activePlugin?null:b.activePlugin._capabilities},set:function(){return!1}}),b._pluginsRegistered=!1,b._lastID=0,b._instances=[],b._idHash={},b._preloadHash={},b._defaultPlayPropsHash={},b.addEventListener=null,b.removeEventListener=null,b.removeAllEventListeners=null,b.dispatchEvent=null,b.hasEventListener=null,b._listeners=null,createjs.EventDispatcher.initialize(b),b.getPreloadHandlers=function(){return{callback:createjs.proxy(b.initLoad,b),types:[\"sound\"],extensions:b.SUPPORTED_EXTENSIONS}},b._handleLoadComplete=function(a){var c=a.target.getItem().src;if(b._preloadHash[c])for(var d=0,e=b._preloadHash[c].length;e>d;d++){var f=b._preloadHash[c][d];if(b._preloadHash[c][d]=!0,b.hasEventListener(\"fileload\")){var a=new createjs.Event(\"fileload\");a.src=f.src,a.id=f.id,a.data=f.data,a.sprite=f.sprite,b.dispatchEvent(a)}}},b._handleLoadError=function(a){var c=a.target.getItem().src;if(b._preloadHash[c])for(var d=0,e=b._preloadHash[c].length;e>d;d++){var f=b._preloadHash[c][d];if(b._preloadHash[c][d]=!1,b.hasEventListener(\"fileerror\")){var a=new createjs.Event(\"fileerror\");a.src=f.src,a.id=f.id,a.data=f.data,a.sprite=f.sprite,b.dispatchEvent(a)}}},b._registerPlugin=function(a){return a.isSupported()?(b.activePlugin=new a,!0):!1},b.registerPlugins=function(a){b._pluginsRegistered=!0;for(var c=0,d=a.length;d>c;c++)if(b._registerPlugin(a[c]))return!0;return!1},b.initializeDefaultPlugins=function(){return null!=b.activePlugin?!0:b._pluginsRegistered?!1:b.registerPlugins([createjs.WebAudioPlugin,createjs.HTMLAudioPlugin])?!0:!1},b.isReady=function(){return null!=b.activePlugin},b.getCapabilities=function(){return null==b.activePlugin?null:b.activePlugin._capabilities},b.getCapability=function(a){return null==b.activePlugin?null:b.activePlugin._capabilities[a]},b.initLoad=function(a){return b._registerSound(a)},b._registerSound=function(c){if(!b.initializeDefaultPlugins())return!1;var d;if(c.src instanceof Object?(d=b._parseSrc(c.src),d.src=c.path+d.src):d=b._parsePath(c.src),null==d)return!1;c.src=d.src,c.type=\"sound\";var e=c.data,f=null;if(null!=e&&(isNaN(e.channels)?isNaN(e)||(f=parseInt(e)):f=parseInt(e.channels),e.audioSprite))for(var g,h=e.audioSprite.length;h--;)g=e.audioSprite[h],b._idHash[g.id]={src:c.src,startTime:parseInt(g.startTime),duration:parseInt(g.duration)},g.defaultPlayProps&&(b._defaultPlayPropsHash[g.id]=createjs.PlayPropsConfig.create(g.defaultPlayProps));null!=c.id&&(b._idHash[c.id]={src:c.src});var i=b.activePlugin.register(c);return a.create(c.src,f),null!=e&&isNaN(e)?c.data.channels=f||a.maxPerChannel():c.data=f||a.maxPerChannel(),i.type&&(c.type=i.type),c.defaultPlayProps&&(b._defaultPlayPropsHash[c.src]=createjs.PlayPropsConfig.create(c.defaultPlayProps)),i},b.registerSound=function(a,c,d,e,f){var g={src:a,id:c,data:d,defaultPlayProps:f};a instanceof Object&&a.src&&(e=c,g=a),g=createjs.LoadItem.create(g),g.path=e,null==e||g.src instanceof Object||(g.src=e+a);var h=b._registerSound(g);if(!h)return!1;if(b._preloadHash[g.src]||(b._preloadHash[g.src]=[]),b._preloadHash[g.src].push(g),1==b._preloadHash[g.src].length)h.on(\"complete\",createjs.proxy(this._handleLoadComplete,this)),h.on(\"error\",createjs.proxy(this._handleLoadError,this)),b.activePlugin.preload(h);else if(1==b._preloadHash[g.src][0])return!0;return g},b.registerSounds=function(a,b){var c=[];a.path&&(b?b+=a.path:b=a.path,a=a.manifest);for(var d=0,e=a.length;e>d;d++)c[d]=createjs.Sound.registerSound(a[d].src,a[d].id,a[d].data,b,a[d].defaultPlayProps);return c},b.removeSound=function(c,d){if(null==b.activePlugin)return!1;c instanceof Object&&c.src&&(c=c.src);var e;if(c instanceof Object?e=b._parseSrc(c):(c=b._getSrcById(c).src,e=b._parsePath(c)),null==e)return!1;c=e.src,null!=d&&(c=d+c);for(var f in b._idHash)b._idHash[f].src==c&&delete b._idHash[f];return a.removeSrc(c),delete b._preloadHash[c],b.activePlugin.removeSound(c),!0},b.removeSounds=function(a,b){var c=[];a.path&&(b?b+=a.path:b=a.path,a=a.manifest);for(var d=0,e=a.length;e>d;d++)c[d]=createjs.Sound.removeSound(a[d].src,b);return c},b.removeAllSounds=function(){b._idHash={},b._preloadHash={},a.removeAll(),b.activePlugin&&b.activePlugin.removeAllSounds()},b.loadComplete=function(a){if(!b.isReady())return!1;var c=b._parsePath(a);return a=c?b._getSrcById(c.src).src:b._getSrcById(a).src,void 0==b._preloadHash[a]?!1:1==b._preloadHash[a][0]},b._parsePath=function(a){\"string\"!=typeof a&&(a=a.toString());var c=a.match(b.FILE_PATTERN);if(null==c)return!1;for(var d=c[4],e=c[5],f=b.capabilities,g=0;!f[e];)if(e=b.alternateExtensions[g++],g>b.alternateExtensions.length)return null;a=a.replace(\".\"+c[5],\".\"+e);var h={name:d,src:a,extension:e};return h},b._parseSrc=function(a){var c={name:void 0,src:void 0,extension:void 0},d=b.capabilities;for(var e in a)if(a.hasOwnProperty(e)&&d[e]){c.src=a[e],c.extension=e;break}if(!c.src)return!1;var f=c.src.lastIndexOf(\"\/\");return c.name=-1!=f?c.src.slice(f+1):c.src,c},b.play=function(a,c,d,e,f,g,h,i,j){var k;k=createjs.PlayPropsConfig.create(c instanceof Object||c instanceof createjs.PlayPropsConfig?c:{interrupt:c,delay:d,offset:e,loop:f,volume:g,pan:h,startTime:i,duration:j});var l=b.createInstance(a,k.startTime,k.duration),m=b._playInstance(l,k);return m||l._playFailed(),l},b.createInstance=function(c,d,e){if(!b.initializeDefaultPlugins())return new createjs.DefaultSoundInstance(c,d,e);var f=b._defaultPlayPropsHash[c];c=b._getSrcById(c);var g=b._parsePath(c.src),h=null;\nreturn null!=g&&null!=g.src?(a.create(g.src),null==d&&(d=c.startTime),h=b.activePlugin.create(g.src,d,e||c.duration),f=f||b._defaultPlayPropsHash[g.src],f&&h.applyPlayProps(f)):h=new createjs.DefaultSoundInstance(c,d,e),h.uniqueId=b._lastID++,h},b.stop=function(){for(var a=this._instances,b=a.length;b--;)a[b].stop()},b.setVolume=function(a){if(null==Number(a))return!1;if(a=Math.max(0,Math.min(1,a)),b._masterVolume=a,!this.activePlugin||!this.activePlugin.setVolume||!this.activePlugin.setVolume(a))for(var c=this._instances,d=0,e=c.length;e>d;d++)c[d].setMasterVolume(a)},b.getVolume=function(){return this._masterVolume},b.setMute=function(a){if(null==a)return!1;if(this._masterMute=a,!this.activePlugin||!this.activePlugin.setMute||!this.activePlugin.setMute(a))for(var b=this._instances,c=0,d=b.length;d>c;c++)b[c].setMasterMute(a);return!0},b.getMute=function(){return this._masterMute},b.setDefaultPlayProps=function(a,c){a=b._getSrcById(a),b._defaultPlayPropsHash[b._parsePath(a.src).src]=createjs.PlayPropsConfig.create(c)},b.getDefaultPlayProps=function(a){return a=b._getSrcById(a),b._defaultPlayPropsHash[b._parsePath(a.src).src]},b._playInstance=function(a,c){var d=b._defaultPlayPropsHash[a.src]||{};if(null==c.interrupt&&(c.interrupt=d.interrupt||b.defaultInterruptBehavior),null==c.delay&&(c.delay=d.delay||0),null==c.offset&&(c.offset=a.getPosition()),null==c.loop&&(c.loop=a.loop),null==c.volume&&(c.volume=a.volume),null==c.pan&&(c.pan=a.pan),0==c.delay){var e=b._beginPlaying(a,c);if(!e)return!1}else{var f=setTimeout(function(){b._beginPlaying(a,c)},c.delay);a.delayTimeoutId=f}return this._instances.push(a),!0},b._beginPlaying=function(b,c){if(!a.add(b,c.interrupt))return!1;var d=b._beginPlaying(c);if(!d){var e=createjs.indexOf(this._instances,b);return e>-1&&this._instances.splice(e,1),!1}return!0},b._getSrcById=function(a){return b._idHash[a]||{src:a}},b._playFinished=function(b){a.remove(b);var c=createjs.indexOf(this._instances,b);c>-1&&this._instances.splice(c,1)},createjs.Sound=Sound,a.channels={},a.create=function(b,c){var d=a.get(b);return null==d?(a.channels[b]=new a(b,c),!0):!1},a.removeSrc=function(b){var c=a.get(b);return null==c?!1:(c._removeAll(),delete a.channels[b],!0)},a.removeAll=function(){for(var b in a.channels)a.channels[b]._removeAll();a.channels={}},a.add=function(b,c){var d=a.get(b.src);return null==d?!1:d._add(b,c)},a.remove=function(b){var c=a.get(b.src);return null==c?!1:(c._remove(b),!0)},a.maxPerChannel=function(){return c.maxDefault},a.get=function(b){return a.channels[b]};var c=a.prototype;c.constructor=a,c.src=null,c.max=null,c.maxDefault=100,c.length=0,c.init=function(a,b){this.src=a,this.max=b||this.maxDefault,-1==this.max&&(this.max=this.maxDefault),this._instances=[]},c._get=function(a){return this._instances[a]},c._add=function(a,b){return this._getSlot(b,a)?(this._instances.push(a),this.length++,!0):!1},c._remove=function(a){var b=createjs.indexOf(this._instances,a);return-1==b?!1:(this._instances.splice(b,1),this.length--,!0)},c._removeAll=function(){for(var a=this.length-1;a>=0;a--)this._instances[a].stop()},c._getSlot=function(a){var b,c;if(a!=Sound.INTERRUPT_NONE&&(c=this._get(0),null==c))return!0;for(var d=0,e=this.max;e>d;d++){if(b=this._get(d),null==b)return!0;if(b.playState==Sound.PLAY_FINISHED||b.playState==Sound.PLAY_INTERRUPTED||b.playState==Sound.PLAY_FAILED){c=b;break}a!=Sound.INTERRUPT_NONE&&(a==Sound.INTERRUPT_EARLY&&b.getPosition()<c.getPosition()||a==Sound.INTERRUPT_LATE&&b.getPosition()>c.getPosition())&&(c=b)}return null!=c?(c._interrupt(),this._remove(c),!0):!1},c.toString=function(){return\"[Sound SoundChannel]\"}}(),this.createjs=this.createjs||{},function(){\"use strict\";var AbstractSoundInstance=function(a,b,c,d){this.EventDispatcher_constructor(),this.src=a,this.uniqueId=-1,this.playState=null,this.delayTimeoutId=null,this._volume=1,Object.defineProperty(this,\"volume\",{get:this.getVolume,set:this.setVolume}),this._pan=0,Object.defineProperty(this,\"pan\",{get:this.getPan,set:this.setPan}),this._startTime=Math.max(0,b||0),Object.defineProperty(this,\"startTime\",{get:this.getStartTime,set:this.setStartTime}),this._duration=Math.max(0,c||0),Object.defineProperty(this,\"duration\",{get:this.getDuration,set:this.setDuration}),this._playbackResource=null,Object.defineProperty(this,\"playbackResource\",{get:this.getPlaybackResource,set:this.setPlaybackResource}),d!==!1&&d!==!0&&this.setPlaybackResource(d),this._position=0,Object.defineProperty(this,\"position\",{get:this.getPosition,set:this.setPosition}),this._loop=0,Object.defineProperty(this,\"loop\",{get:this.getLoop,set:this.setLoop}),this._muted=!1,Object.defineProperty(this,\"muted\",{get:this.getMuted,set:this.setMuted}),this._paused=!1,Object.defineProperty(this,\"paused\",{get:this.getPaused,set:this.setPaused})},a=createjs.extend(AbstractSoundInstance,createjs.EventDispatcher);a.play=function(a,b,c,d,e,f){var g;return g=createjs.PlayPropsConfig.create(a instanceof Object||a instanceof createjs.PlayPropsConfig?a:{interrupt:a,delay:b,offset:c,loop:d,volume:e,pan:f}),this.playState==createjs.Sound.PLAY_SUCCEEDED?(this.applyPlayProps(g),void(this._paused&&this.setPaused(!1))):(this._cleanUp(),createjs.Sound._playInstance(this,g),this)},a.stop=function(){return this._position=0,this._paused=!1,this._handleStop(),this._cleanUp(),this.playState=createjs.Sound.PLAY_FINISHED,this},a.destroy=function(){this._cleanUp(),this.src=null,this.playbackResource=null,this.removeAllEventListeners()},a.applyPlayProps=function(a){return null!=a.offset&&this.setPosition(a.offset),null!=a.loop&&this.setLoop(a.loop),null!=a.volume&&this.setVolume(a.volume),null!=a.pan&&this.setPan(a.pan),null!=a.startTime&&(this.setStartTime(a.startTime),this.setDuration(a.duration)),this},a.toString=function(){return\"[AbstractSoundInstance]\"},a.getPaused=function(){return this._paused},a.setPaused=function(a){return a!==!0&&a!==!1||this._paused==a||1==a&&this.playState!=createjs.Sound.PLAY_SUCCEEDED?void 0:(this._paused=a,a?this._pause():this._resume(),clearTimeout(this.delayTimeoutId),this)},a.setVolume=function(a){return a==this._volume?this:(this._volume=Math.max(0,Math.min(1,a)),this._muted||this._updateVolume(),this)},a.getVolume=function(){return this._volume},a.setMuted=function(a){return a===!0||a===!1?(this._muted=a,this._updateVolume(),this):void 0},a.getMuted=function(){return this._muted},a.setPan=function(a){return a==this._pan?this:(this._pan=Math.max(-1,Math.min(1,a)),this._updatePan(),this)},a.getPan=function(){return this._pan},a.getPosition=function(){return this._paused||this.playState!=createjs.Sound.PLAY_SUCCEEDED||(this._position=this._calculateCurrentPosition()),this._position},a.setPosition=function(a){return this._position=Math.max(0,a),this.playState==createjs.Sound.PLAY_SUCCEEDED&&this._updatePosition(),this},a.getStartTime=function(){return this._startTime},a.setStartTime=function(a){return a==this._startTime?this:(this._startTime=Math.max(0,a||0),this._updateStartTime(),this)},a.getDuration=function(){return this._duration},a.setDuration=function(a){return a==this._duration?this:(this._duration=Math.max(0,a||0),this._updateDuration(),this)},a.setPlaybackResource=function(a){return this._playbackResource=a,0==this._duration&&this._setDurationFromSource(),this},a.getPlaybackResource=function(){return this._playbackResource},a.getLoop=function(){return this._loop},a.setLoop=function(a){null!=this._playbackResource&&(0!=this._loop&&0==a?this._removeLooping(a):0==this._loop&&0!=a&&this._addLooping(a)),this._loop=a},a._sendEvent=function(a){var b=new createjs.Event(a);this.dispatchEvent(b)},a._cleanUp=function(){clearTimeout(this.delayTimeoutId),this._handleCleanUp(),this._paused=!1,createjs.Sound._playFinished(this)},a._interrupt=function(){this._cleanUp(),this.playState=createjs.Sound.PLAY_INTERRUPTED,this._sendEvent(\"interrupted\")},a._beginPlaying=function(a){return this.setPosition(a.offset),this.setLoop(a.loop),this.setVolume(a.volume),this.setPan(a.pan),null!=a.startTime&&(this.setStartTime(a.startTime),this.setDuration(a.duration)),null!=this._playbackResource&&this._position<this._duration?(this._paused=!1,this._handleSoundReady(),this.playState=createjs.Sound.PLAY_SUCCEEDED,this._sendEvent(\"succeeded\"),!0):(this._playFailed(),!1)},a._playFailed=function(){this._cleanUp(),this.playState=createjs.Sound.PLAY_FAILED,this._sendEvent(\"failed\")},a._handleSoundComplete=function(){return this._position=0,0!=this._loop?(this._loop--,this._handleLoop(),void this._sendEvent(\"loop\")):(this._cleanUp(),this.playState=createjs.Sound.PLAY_FINISHED,void this._sendEvent(\"complete\"))},a._handleSoundReady=function(){},a._updateVolume=function(){},a._updatePan=function(){},a._updateStartTime=function(){},a._updateDuration=function(){},a._setDurationFromSource=function(){},a._calculateCurrentPosition=function(){},a._updatePosition=function(){},a._removeLooping=function(){},a._addLooping=function(){},a._pause=function(){},a._resume=function(){},a._handleStop=function(){},a._handleCleanUp=function(){},a._handleLoop=function(){},createjs.AbstractSoundInstance=createjs.promote(AbstractSoundInstance,\"EventDispatcher\"),createjs.DefaultSoundInstance=createjs.AbstractSoundInstance}(),this.createjs=this.createjs||{},function(){\"use strict\";var AbstractPlugin=function(){this._capabilities=null,this._loaders={},this._audioSources={},this._soundInstances={},this._volume=1,this._loaderClass,this._soundInstanceClass},a=AbstractPlugin.prototype;AbstractPlugin._capabilities=null,AbstractPlugin.isSupported=function(){return!0},a.register=function(a){var b=this._loaders[a.src];return b&&!b.canceled?this._loaders[a.src]:(this._audioSources[a.src]=!0,this._soundInstances[a.src]=[],b=new this._loaderClass(a),b.on(\"complete\",this._handlePreloadComplete,this),this._loaders[a.src]=b,b)},a.preload=function(a){a.on(\"error\",this._handlePreloadError,this),a.load()},a.isPreloadStarted=function(a){return null!=this._audioSources[a]},a.isPreloadComplete=function(a){return!(null==this._audioSources[a]||1==this._audioSources[a])},a.removeSound=function(a){if(this._soundInstances[a]){for(var b=this._soundInstances[a].length;b--;){var c=this._soundInstances[a][b];c.destroy()}delete this._soundInstances[a],delete this._audioSources[a],this._loaders[a]&&this._loaders[a].destroy(),delete this._loaders[a]}},a.removeAllSounds=function(){for(var a in this._audioSources)this.removeSound(a)},a.create=function(a,b,c){this.isPreloadStarted(a)||this.preload(this.register(a));var d=new this._soundInstanceClass(a,b,c,this._audioSources[a]);return this._soundInstances[a].push(d),d},a.setVolume=function(a){return this._volume=a,this._updateVolume(),!0},a.getVolume=function(){return this._volume},a.setMute=function(){return this._updateVolume(),!0},a.toString=function(){return\"[AbstractPlugin]\"},a._handlePreloadComplete=function(a){var b=a.target.getItem().src;this._audioSources[b]=a.result;for(var c=0,d=this._soundInstances[b].length;d>c;c++){var e=this._soundInstances[b][c];e.setPlaybackResource(this._audioSources[b])}},a._handlePreloadError=function(){},a._updateVolume=function(){},createjs.AbstractPlugin=AbstractPlugin}(),this.createjs=this.createjs||{},function(){\"use strict\";function a(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.SOUND)}var b=createjs.extend(a,createjs.AbstractLoader);a.context=null,b.toString=function(){return\"[WebAudioLoader]\"},b._createRequest=function(){this._request=new createjs.XHRRequest(this._item,!1),this._request.setResponseType(\"arraybuffer\")},b._sendComplete=function(){a.context.decodeAudioData(this._rawResult,createjs.proxy(this._handleAudioDecoded,this),createjs.proxy(this._sendError,this))},b._handleAudioDecoded=function(a){this._result=a,this.AbstractLoader__sendComplete()},createjs.WebAudioLoader=createjs.promote(a,\"AbstractLoader\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function WebAudioSoundInstance(a,c,d,e){this.AbstractSoundInstance_constructor(a,c,d,e),this.gainNode=b.context.createGain(),this.panNode=b.context.createPanner(),this.panNode.panningModel=b._panningModel,this.panNode.connect(this.gainNode),this._updatePan(),this.sourceNode=null,this._soundCompleteTimeout=null,this._sourceNodeNext=null,this._playbackStartTime=0,this._endedHandler=createjs.proxy(this._handleSoundComplete,this)}var a=createjs.extend(WebAudioSoundInstance,createjs.AbstractSoundInstance),b=WebAudioSoundInstance;b.context=null,b._scratchBuffer=null,b.destinationNode=null,b._panningModel=\"equalpower\",a.destroy=function(){this.AbstractSoundInstance_destroy(),this.panNode.disconnect(0),this.panNode=null,this.gainNode.disconnect(0),this.gainNode=null},a.toString=function(){return\"[WebAudioSoundInstance]\"},a._updatePan=function(){this.panNode.setPosition(this._pan,0,-.5)},a._removeLooping=function(){this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext)},a._addLooping=function(){this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0))},a._setDurationFromSource=function(){this._duration=1e3*this.playbackResource.duration},a._handleCleanUp=function(){this.sourceNode&&this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext)),0!=this.gainNode.numberOfOutputs&&this.gainNode.disconnect(0),clearTimeout(this._soundCompleteTimeout),this._playbackStartTime=0},a._cleanUpAudioNode=function(a){if(a){a.stop(0),a.disconnect(0);try{a.buffer=b._scratchBuffer}catch(c){}a=null}return a},a._handleSoundReady=function(){this.gainNode.connect(b.destinationNode);var a=.001*this._duration,c=.001*this._position;c>a&&(c=a),this.sourceNode=this._createAndPlayAudioNode(b.context.currentTime-a,c),this._playbackStartTime=this.sourceNode.startTime-c,this._soundCompleteTimeout=setTimeout(this._endedHandler,1e3*(a-c)),0!=this._loop&&(this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0))},a._createAndPlayAudioNode=function(a,c){var d=b.context.createBufferSource();d.buffer=this.playbackResource,d.connect(this.panNode);var e=.001*this._duration;return d.startTime=a+e,d.start(d.startTime,c+.001*this._startTime,e-c),d},a._pause=function(){this._position=1e3*(b.context.currentTime-this._playbackStartTime),this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext),0!=this.gainNode.numberOfOutputs&&this.gainNode.disconnect(0),clearTimeout(this._soundCompleteTimeout)},a._resume=function(){this._handleSoundReady()},a._updateVolume=function(){var a=this._muted?0:this._volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},a._calculateCurrentPosition=function(){return 1e3*(b.context.currentTime-this._playbackStartTime)},a._updatePosition=function(){this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext),clearTimeout(this._soundCompleteTimeout),this._paused||this._handleSoundReady()},a._handleLoop=function(){this._cleanUpAudioNode(this.sourceNode),this.sourceNode=this._sourceNodeNext,this._playbackStartTime=this.sourceNode.startTime,this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0),this._soundCompleteTimeout=setTimeout(this._endedHandler,this._duration)},a._updateDuration=function(){this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._pause(),this._resume())},createjs.WebAudioSoundInstance=createjs.promote(WebAudioSoundInstance,\"AbstractSoundInstance\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function WebAudioPlugin(){this.AbstractPlugin_constructor(),this._panningModel=b._panningModel,this.context=b.context,this.dynamicsCompressorNode=this.context.createDynamicsCompressor(),this.dynamicsCompressorNode.connect(this.context.destination),this.gainNode=this.context.createGain(),this.gainNode.connect(this.dynamicsCompressorNode),createjs.WebAudioSoundInstance.destinationNode=this.gainNode,this._capabilities=b._capabilities,this._loaderClass=createjs.WebAudioLoader,this._soundInstanceClass=createjs.WebAudioSoundInstance,this._addPropsToClasses()}var a=createjs.extend(WebAudioPlugin,createjs.AbstractPlugin),b=WebAudioPlugin;b._capabilities=null,b._panningModel=\"equalpower\",b.context=null,b._scratchBuffer=null,b._unlocked=!1,b.isSupported=function(){var a=createjs.BrowserDetect.isIOS||createjs.BrowserDetect.isAndroid||createjs.BrowserDetect.isBlackberry;return\"file:\"!=location.protocol||a||this._isFileXHRSupported()?(b._generateCapabilities(),null==b.context?!1:!0):!1},b.playEmptySound=function(){if(null!=b.context){var a=b.context.createBufferSource();a.buffer=b._scratchBuffer,a.connect(b.context.destination),a.start(0,0,0)}},b._isFileXHRSupported=function(){var a=!0,b=new XMLHttpRequest;try{b.open(\"GET\",\"WebAudioPluginTest.fail\",!1)}catch(c){return a=!1}b.onerror=function(){a=!1},b.onload=function(){a=404==this.status||200==this.status||0==this.status&&\"\"!=this.response};try{b.send()}catch(c){a=!1}return a},b._generateCapabilities=function(){if(null==b._capabilities){var a=document.createElement(\"audio\");if(null==a.canPlayType)return null;if(null==b.context)if(window.AudioContext)b.context=new AudioContext;else{if(!window.webkitAudioContext)return null;b.context=new webkitAudioContext}null==b._scratchBuffer&&(b._scratchBuffer=b.context.createBuffer(1,1,22050)),b._compatibilitySetUp(),\"ontouchstart\"in window&&\"running\"!=b.context.state&&(b._unlock(),document.addEventListener(\"mousedown\",b._unlock,!0),document.addEventListener(\"touchend\",b._unlock,!0)),b._capabilities={panning:!0,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;f>e;e++){var g=c[e],h=d[g]||g;b._capabilities[g]=\"no\"!=a.canPlayType(\"audio\/\"+g)&&\"\"!=a.canPlayType(\"audio\/\"+g)||\"no\"!=a.canPlayType(\"audio\/\"+h)&&\"\"!=a.canPlayType(\"audio\/\"+h)}b.context.destination.numberOfChannels<2&&(b._capabilities.panning=!1)}},b._compatibilitySetUp=function(){if(b._panningModel=\"equalpower\",!b.context.createGain){b.context.createGain=b.context.createGainNode;var a=b.context.createBufferSource();a.__proto__.start=a.__proto__.noteGrainOn,a.__proto__.stop=a.__proto__.noteOff,b._panningModel=0}},b._unlock=function(){b._unlocked||(b.playEmptySound(),\"running\"==b.context.state&&(document.removeEventListener(\"mousedown\",b._unlock,!0),document.removeEventListener(\"touchend\",b._unlock,!0),b._unlocked=!0))},a.toString=function(){return\"[WebAudioPlugin]\"},a._addPropsToClasses=function(){var a=this._soundInstanceClass;a.context=this.context,a._scratchBuffer=b._scratchBuffer,a.destinationNode=this.gainNode,a._panningModel=this._panningModel,this._loaderClass.context=this.context},a._updateVolume=function(){var a=createjs.Sound._masterMute?0:this._volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},createjs.WebAudioPlugin=createjs.promote(WebAudioPlugin,\"AbstractPlugin\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function HTMLAudioTagPool(){throw\"HTMLAudioTagPool cannot be instantiated\"}function a(){this._tags=[]}var b=HTMLAudioTagPool;b._tags={},b._tagPool=new a,b._tagUsed={},b.get=function(a){var c=b._tags[a];return null==c?(c=b._tags[a]=b._tagPool.get(),c.src=a):b._tagUsed[a]?(c=b._tagPool.get(),c.src=a):b._tagUsed[a]=!0,c},b.set=function(a,c){c==b._tags[a]?b._tagUsed[a]=!1:b._tagPool.set(c)},b.remove=function(a){var c=b._tags[a];return null==c?!1:(b._tagPool.set(c),delete b._tags[a],delete b._tagUsed[a],!0)},b.getDuration=function(a){var c=b._tags[a];return null!=c&&c.duration?1e3*c.duration:0},createjs.HTMLAudioTagPool=HTMLAudioTagPool;var c=a.prototype;c.constructor=a,c.get=function(){var a;return a=0==this._tags.length?this._createTag():this._tags.pop(),null==a.parentNode&&document.body.appendChild(a),a},c.set=function(a){var b=createjs.indexOf(this._tags,a);-1==b&&(this._tags.src=null,this._tags.push(a))},c.toString=function(){return\"[TagPool]\"},c._createTag=function(){var a=document.createElement(\"audio\");return a.autoplay=!1,a.preload=\"none\",a}}(),this.createjs=this.createjs||{},function(){\"use strict\";function HTMLAudioSoundInstance(a,b,c,d){this.AbstractSoundInstance_constructor(a,b,c,d),this._audioSpriteStopTime=null,this._delayTimeoutId=null,this._endedHandler=createjs.proxy(this._handleSoundComplete,this),this._readyHandler=createjs.proxy(this._handleTagReady,this),this._stalledHandler=createjs.proxy(this._playFailed,this),this._audioSpriteEndHandler=createjs.proxy(this._handleAudioSpriteLoop,this),this._loopHandler=createjs.proxy(this._handleSoundComplete,this),c?this._audioSpriteStopTime=.001*(b+c):this._duration=createjs.HTMLAudioTagPool.getDuration(this.src)}var a=createjs.extend(HTMLAudioSoundInstance,createjs.AbstractSoundInstance);a.setMasterVolume=function(){this._updateVolume()},a.setMasterMute=function(){this._updateVolume()},a.toString=function(){return\"[HTMLAudioSoundInstance]\"},a._removeLooping=function(){null!=this._playbackResource&&(this._playbackResource.loop=!1,this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1))},a._addLooping=function(){null==this._playbackResource||this._audioSpriteStopTime||(this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),this._playbackResource.loop=!0)},a._handleCleanUp=function(){var a=this._playbackResource;if(null!=a){a.pause(),a.loop=!1,a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_READY,this._readyHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED,this._stalledHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1);try{a.currentTime=this._startTime}catch(b){}createjs.HTMLAudioTagPool.set(this.src,a),this._playbackResource=null}},a._beginPlaying=function(a){return this._playbackResource=createjs.HTMLAudioTagPool.get(this.src),this.AbstractSoundInstance__beginPlaying(a)},a._handleSoundReady=function(){if(4!==this._playbackResource.readyState){var a=this._playbackResource;return a.addEventListener(createjs.HTMLAudioPlugin._AUDIO_READY,this._readyHandler,!1),a.addEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED,this._stalledHandler,!1),a.preload=\"auto\",void a.load()}this._updateVolume(),this._playbackResource.currentTime=.001*(this._startTime+this._position),this._audioSpriteStopTime?this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1):(this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),0!=this._loop&&(this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),this._playbackResource.loop=!0)),this._playbackResource.play()},a._handleTagReady=function(){this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_READY,this._readyHandler,!1),this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED,this._stalledHandler,!1),this._handleSoundReady()},a._pause=function(){this._playbackResource.pause()},a._resume=function(){this._playbackResource.play()},a._updateVolume=function(){if(null!=this._playbackResource){var a=this._muted||createjs.Sound._masterMute?0:this._volume*createjs.Sound._masterVolume;a!=this._playbackResource.volume&&(this._playbackResource.volume=a)}},a._calculateCurrentPosition=function(){return 1e3*this._playbackResource.currentTime-this._startTime},a._updatePosition=function(){this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._handleSetPositionSeek,!1);try{this._playbackResource.currentTime=.001*(this._position+this._startTime)}catch(a){this._handleSetPositionSeek(null)}},a._handleSetPositionSeek=function(){null!=this._playbackResource&&(this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._handleSetPositionSeek,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1))},a._handleAudioSpriteLoop=function(){this._playbackResource.currentTime<=this._audioSpriteStopTime||(this._playbackResource.pause(),0==this._loop?this._handleSoundComplete(null):(this._position=0,this._loop--,this._playbackResource.currentTime=.001*this._startTime,this._paused||this._playbackResource.play(),this._sendEvent(\"loop\")))},a._handleLoop=function(){0==this._loop&&(this._playbackResource.loop=!1,this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1))},a._updateStartTime=function(){this._audioSpriteStopTime=.001*(this._startTime+this._duration),this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1))},a._updateDuration=function(){this._audioSpriteStopTime=.001*(this._startTime+this._duration),this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1))},a._setDurationFromSource=function(){this._duration=createjs.HTMLAudioTagPool.getDuration(this.src),this._playbackResource=null},createjs.HTMLAudioSoundInstance=createjs.promote(HTMLAudioSoundInstance,\"AbstractSoundInstance\")}(),this.createjs=this.createjs||{},function(){\"use strict\";function HTMLAudioPlugin(){this.AbstractPlugin_constructor(),this.defaultNumChannels=2,this._capabilities=b._capabilities,this._loaderClass=createjs.SoundLoader,this._soundInstanceClass=createjs.HTMLAudioSoundInstance}var a=createjs.extend(HTMLAudioPlugin,createjs.AbstractPlugin),b=HTMLAudioPlugin;b.MAX_INSTANCES=30,b._AUDIO_READY=\"canplaythrough\",b._AUDIO_ENDED=\"ended\",b._AUDIO_SEEKED=\"seeked\",b._AUDIO_STALLED=\"stalled\",b._TIME_UPDATE=\"timeupdate\",b._capabilities=null,b.isSupported=function(){return b._generateCapabilities(),null!=b._capabilities},b._generateCapabilities=function(){if(null==b._capabilities){var a=document.createElement(\"audio\");if(null==a.canPlayType)return null;b._capabilities={panning:!1,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;f>e;e++){var g=c[e],h=d[g]||g;b._capabilities[g]=\"no\"!=a.canPlayType(\"audio\/\"+g)&&\"\"!=a.canPlayType(\"audio\/\"+g)||\"no\"!=a.canPlayType(\"audio\/\"+h)&&\"\"!=a.canPlayType(\"audio\/\"+h)}}},a.register=function(a){var b=createjs.HTMLAudioTagPool.get(a.src),c=this.AbstractPlugin_register(a);return c.setTag(b),c},a.removeSound=function(a){this.AbstractPlugin_removeSound(a),createjs.HTMLAudioTagPool.remove(a)},a.create=function(a,b,c){var d=this.AbstractPlugin_create(a,b,c);return d.setPlaybackResource(null),d},a.toString=function(){return\"[HTMLAudioPlugin]\"},a.setVolume=a.getVolume=a.setMute=null,createjs.HTMLAudioPlugin=createjs.promote(HTMLAudioPlugin,\"AbstractPlugin\")}();\n\nH5P.SoundJS = this.createjs.Sound;\n\nthis.createjs = old || this.createjs;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.VerticalTabs-1.3\/vertical-tabs.js?ver=1.3.5":"\n\/** @namespace H5PEditor *\/\nvar H5PEditor = H5PEditor || {};\n\nH5PEditor.VerticalTabs = (function ($) {\n\n  \/**\n   * Draws the list.\n   *\n   * @class\n   * @param {List} list\n   *\/\n  function VerticalTabs(list) {\n    var self = this;\n    var entity = list.getEntity();\n\n    \/\/ Make first letter upper case.\n    entity = entity.substr(0,1).toUpperCase() + entity.substr(1);\n\n    \/\/ Create DOM elements\n    var $wrapper = $('<div\/>', {\n      'class': 'h5p-vtab-wrapper'\n    });\n    var $inner = $('<div\/>', {\n      'class': 'h5p-vtabs'\n    }).appendTo($wrapper);\n    var $tabs = $('<ol\/>', {\n      'role': 'tablist',\n      'class': 'h5p-ul'\n    }).appendTo($inner);\n    H5PEditor.createButton('add-entity', H5PEditor.t('core', 'addEntity', {':entity': entity}), function () {\n      if (list.addItem()) {\n        $tabs.children(':last').trigger('open');\n        toggleOrderButtonsState();\n      }\n    }, true).appendTo($inner);\n    var $forms = $('<div\/>', {\n      'class': 'h5p-vtab-forms'\n    }).appendTo($wrapper);\n\n    \/\/ Once all items have been added we toggle the state of the order buttons\n    list.once('changeWidget', function () {\n      toggleOrderButtonsState();\n    });\n\n    \/\/ Used when dragging items around\n    var adjustX, adjustY, marginTop, formOffset, $currentTab;\n\n    \/**\n     * @private\n     * @param {jQuery} $item\n     * @param {jQuery} $placeholder\n     * @param {Number} x\n     * @param {Number} y\n     *\/\n    var moveItem = function ($item, $placeholder, x, y) {\n      var currentIndex;\n\n      \/\/ Adjust so the mouse is placed on top of the icon.\n      x = x - adjustX;\n      y = y - adjustY;\n\n      $item.css({\n        top: y - marginTop - formOffset.top,\n        left: x - formOffset.left\n      });\n\n      \/\/ Try to move up.\n      var $prev = $item.prev().prev();\n      if ($prev.length && y < $prev.offset().top + ($prev.height() \/ 2)) {\n        $prev.insertAfter($item);\n\n\n        currentIndex = $item.index();\n        list.moveItem(currentIndex, currentIndex - 1);\n\n        return;\n      }\n\n      \/\/ Try to move down.\n      var $next = $item.next();\n      if ($next.length && y + $item.height() > $next.offset().top + ($next.height() \/ 2)) {\n        $next.insertBefore($placeholder);\n\n        currentIndex = $item.index() - 2;\n        list.moveItem(currentIndex, currentIndex + 1);\n      }\n    };\n\n    \/**\n     * Re-index labels. Necessary after tabs are sorted or removed.\n     *\n     * @private\n     *\/\n    var reindexLabels = function () {\n      $tabs.find('.h5p-index-label').each(function (index, element) {\n        $(element).text(index + 1);\n      });\n      toggleOrderButtonsState();\n    };\n\n    \/**\n     * Always run after reordering, adding or removing to ensure correct\n     * state of the order buttons.\n     *\n     * @private\n     *\/\n    var toggleOrderButtonsState = function () {\n      $tabs.children().each(function (index, element) {\n        var $tab = $(element);\n        var isTopTab = !$tab.prev().length;\n        $tab.find('.order-up').attr('aria-disabled', isTopTab).attr('tabindex', isTopTab ? '-1' : '0');\n        var isBottomTab = !$tab.next().length;\n        $tab.find('.order-down').attr('aria-disabled', isBottomTab).attr('tabindex', isBottomTab ? '-1' : '0');\n      });\n    };\n\n    \/**\n     * Opens the given tab.\n     *\n     * @private\n     * @param {jQuery} $newTab\n     *\/\n    var openTab = function ($newTab) {\n      if ($currentTab !== undefined) {\n        H5PEditor.Html.removeWysiwyg();\n        $currentTab.removeClass('h5p-current');\n      }\n      $newTab.addClass('h5p-current');\n      $currentTab = $newTab;\n    };\n\n    \/**\n     * Adds UI items to the widget.\n     *\n     * @public\n     * @param {Object} item\n     *\/\n    self.addItem = function (item) {\n      var $placeholder;\n      var $tab = $('<li\/>', {\n        'class': 'h5p-vtab-li'\n      }).appendTo($tabs);\n\n      \/**\n       * Mouse move callback\n       *\n       * @private\n       * @param {Object} event\n       *\/\n      var move = function (event) {\n        moveItem($tab, $placeholder, event.pageX, event.pageY);\n      };\n\n      \/**\n       * Mouse button release callback\n       *\n       * @private\n       *\/\n      var up = function () {\n        H5P.$window\n          .unbind('mousemove', move)\n          .unbind('mouseup', up);\n\n        H5P.$body\n          .attr('unselectable', 'off')\n          .css({\n            '-moz-user-select': '',\n            '-webkit-user-select': '',\n            'user-select': '',\n            '-ms-user-select': '',\n            'overflow': '',\n          })[0].onselectstart = H5P.$body[0].ondragstart = null;\n\n        $tab.removeClass('h5p-moving').css({\n          width: 'auto',\n          height: 'auto',\n          top: '',\n          left: ''\n        });\n        $placeholder.remove();\n        reindexLabels();\n      };\n\n      \/**\n       * Mouse button down callback\n       *\n       * @private\n       *\/\n      var down = function (event) {\n        if (event.which !== 1) {\n          return; \/\/ Only allow left mouse button\n        }\n\n        H5P.$window\n          .mousemove(move)\n          .mouseup(up);\n\n        \/\/ Start tracking mouse\n        H5P.$body\n          .attr('unselectable', 'on')\n          .css({\n            '-moz-user-select': 'none',\n            '-webkit-user-select': 'none',\n            'user-select': 'none',\n            '-ms-user-select': 'none',\n            'overflow': 'hidden'\n          })[0].onselectstart = H5P.$body[0].ondragstart = function () {\n            return false;\n          };\n\n        var offset = $tab.offset();\n        adjustX = event.pageX - offset.left;\n        adjustY = event.pageY - offset.top;\n        marginTop = parseInt($tab.css('marginTop'));\n        formOffset = $tabs.offsetParent().offset();\n        \/\/ TODO: Couldn't formOffset and margin be added?\n\n        var width = $tab.width();\n        var height = $tab.height();\n\n        $tab.addClass('h5p-moving').css({\n          width: width,\n          height: height\n        });\n        $placeholder = $('<li\/>', {\n          'class': 'h5p-placeholder'\n        }).insertBefore($tab);\n\n        $('<div\/>', {\n          class: 'h5p-vtab-a',\n        }).appendTo($placeholder);\n\n        move(event);\n      };\n\n      \/**\n       * Order current list item up\n       *\n       * @private\n       *\/\n      var moveItemUp = function () {\n        var $prev = $tab.prev();\n        if (!$prev.length) {\n          return; \/\/ Cannot move item further up\n        }\n\n        var currentIndex = $tab.index();\n        $prev.insertAfter($tab);\n        list.moveItem(currentIndex, currentIndex - 1);\n        reindexLabels();\n      };\n\n      \/**\n       * Order current ist item down\n       *\n       * @private\n       *\/\n      var moveItemDown = function () {\n        var $next = $tab.next();\n        if (!$next.length) {\n          return; \/\/ Cannot move item further down\n        }\n\n        var currentIndex = $tab.index();\n        $next.insertBefore($tab);\n        list.moveItem(currentIndex, currentIndex + 1);\n        reindexLabels();\n      };\n\n      \/\/ Handle opening of the tab\n      $tab.on('open', function () {\n        openTab($tab.add($form));\n      });\n\n      var mouseDownPos;\n\n      \/\/ Add clickable label\n      $('<div\/>', {\n        'class' : 'h5p-vtab-a',\n        html: '<span class=\"h5p-index-label\">' + ($tab.index() + 1) + '<\/span>. <span class=\"h5p-label\" title=\"' + entity + '\">' + entity + '<\/span>',\n        role: 'tab',\n        tabIndex: 0,\n        on: {\n          mouseup: function (e) {\n\n            if (!mouseDownPos) {\n              return;\n            }\n            \/\/ Determine movement\n            var xDiff = Math.abs(mouseDownPos.x - e.pageX);\n            var yDiff = Math.abs(mouseDownPos.y - e.pageY);\n            var moveThreshold = 20;\n\n            \/\/ Open tab if moved less than threshold\n            if (xDiff < moveThreshold && yDiff < moveThreshold) {\n              $tab.trigger('open');\n            }\n          },\n          mousedown: function (e) {\n            \/\/ Start position\n            mouseDownPos = {\n              x: e.pageX,\n              y: e.pageY\n            };\n\n            \/\/ Order element\n            down(e);\n          },\n          keypress: function (e) {\n            if (e.which === 32) {\n              e.preventDefault();\n              $tab.trigger('open');\n            }\n          }\n        }\n      }).appendTo($tab);\n\n      var $tabLabel = $tab.find('.h5p-label');\n\n      var setTabLabel = function (label) {\n        $tabLabel.text(label).attr('title', label);\n      };\n\n      \/\/ Add buttons for ordering\n      var $orderWrapper = $('<div\/>', {\n        'class': 'vtab-order-wrapper',\n        appendTo: $tab\n      });\n      H5PEditor.createButton('order-up', H5PEditor.t('core', 'orderItemUp'), moveItemUp).appendTo($orderWrapper);\n      H5PEditor.createButton('order-down', H5PEditor.t('core', 'orderItemDown'), moveItemDown).appendTo($orderWrapper);\n\n      \/\/ Add remove button\n      var $removeWrapper = $('<div\/>', {\n        'class': 'vtab-remove-wrapper',\n        appendTo: $tab\n      });\n      H5PEditor.createButton('remove', H5PEditor.t('core', 'removeItem'), function () {\n        confirmRemovalDialog.show($(this).offset().top);\n      }).appendTo($removeWrapper);\n\n      \/\/ Create confirmation dialog for removing list item\n      var confirmRemovalDialog = new H5P.ConfirmationDialog({\n        dialogText: H5PEditor.t('core', 'confirmRemoval', {':type': entity.toLocaleLowerCase()})\n      }).appendTo(document.body);\n\n      \/\/ Remove list item on confirmation\n      confirmRemovalDialog.on('confirmed', function () {\n        var $next, index = $tab.index();\n\n        if ($tab.hasClass('h5p-current')) {\n          if (index) {\n            \/\/ Go to previous tab\n            $next = $tab.prev().add($form.prev());\n          }\n          else {\n            \/\/ Go to next tab\n            $next = $tab.next().add($form.next());\n          }\n\n          if ($next.length) {\n            \/\/ Open another tab\n            $next.trigger('open');\n          }\n        }\n\n        list.removeItem(index);\n        $tab.remove();\n        $form.remove();\n        reindexLabels();\n      });\n\n      \/\/ Create form wrapper\n      var $form = $('<fieldset\/>', {\n        'role': 'tabpanel',\n        'class': 'h5p-vtab-form'\n      });\n\n      if (item instanceof H5PEditor.Group) {\n        item.on('summary', function (event) {\n          if (event.data) {\n            \/\/ Update tab with summary\n            setTabLabel(event.data.substr(0, 32));\n          }\n        });\n      }\n\n      \/\/ Append new field item to forms wrapper\n      item.appendTo($form);\n\n      \/\/ Append form wrapper to forms list\n      $form.appendTo($forms);\n\n      \/\/ Good UX: automatically expand groups\n      if (item instanceof H5PEditor.Group) {\n        item.expand();\n\n        \/\/ Remove group title\n        item.$group.children('.title').remove();\n      }\n      else if (item instanceof H5PEditor.Library) {\n        $form.addClass('content');\n\n        \/\/ Use selected library as title\n        item.changes.push(function (library) {\n          setTabLabel(library.title);\n        });\n        if (item.currentLibrary) {\n          for (var i = 0; i < item.libraries.length; i++) {\n            if (item.libraries[i].uberName === item.currentLibrary) {\n              setTabLabel(item.libraries[i].title);\n              break;\n            }\n          }\n        }\n      }\n      else if (item instanceof H5PEditor.Select) {\n        \/\/ Use selected value as title\n        var change = function () {\n          var value = item.$select.val();\n          setTabLabel(value === '-' ?  entity : item.$select.children('option[value=\"' + value + '\"]').text());\n        };\n        item.$select.change(change);\n        change();\n      }\n\n      if ($currentTab === undefined) {\n        \/\/ Open tab if there are none open\n        $tab.trigger('open');\n      }\n\n      $tabs.find('.h5p-vtab-li .h5p-vtab-a').first().focus();\n    };\n\n    \/**\n     * Puts this widget at the end of the given container.\n     *\n     * @public\n     * @param {jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      $wrapper.appendTo($container);\n    };\n\n    \/**\n     * Remove this widget from the editor DOM.\n     *\n     * @public\n     *\/\n    self.remove = function () {\n      $wrapper.remove();\n    };\n  }\n\n  return VerticalTabs;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.ShowWhen-1.0\/h5p-show-when.js?ver=1.0.4":"\nH5PEditor.ShowWhen = (function ($) {\n\n  \/\/ Handler for the 'select' semantics type\n  function SelectHandler(field, equals) {\n    this.satisfied = function () {\n      return (equals.indexOf(field.value) !== -1);\n    };\n  }\n\n  \/\/ Handler for the 'library' semantics type\n  function LibraryHandler(field, equals) {\n    this.satisfied = function () {\n      var value;\n      if (field.currentLibrary !== undefined) {\n        value = field.currentLibrary.split(' ')[0];\n      }\n      return (equals.indexOf(value) !== -1);\n    };\n  }\n\n  function BooleanHandler(field, equals) {\n    this.satisfied = function () {\n      return field.value === equals;\n    };\n  }\n\n  \/\/ Factory method for creating handlers\n  \/\/ \"library\", \"select\" and \"boolean\" semantics types supported so far\n  function createFieldHandler(field, equals) {\n    if (field instanceof H5PEditor.Library) {\n      return new LibraryHandler(field, equals);\n    }\n    else if (field instanceof H5PEditor.Select) {\n      return new SelectHandler(field, equals);\n    }\n    else if (field instanceof H5PEditor.Boolean) {\n      return new BooleanHandler(field, equals);\n    }\n  }\n\n  \/\/ Handling rules\n  function RuleHandler(type) {\n    var TYPE_AND = 'and';\n    var TYPE_OR = 'or';\n    var handlers = [];\n\n    type = type || TYPE_OR;\n\n    this.add = function (handler) {\n      handlers.push(handler);\n    };\n\n    \/\/ Check if rules are satisfied\n    this.rulesSatisfied = function () {\n      for (var i = 0; i < handlers.length; i++) {\n        \/\/ check if rule was hit\n        var ruleHit = handlers[i].satisfied();\n\n        if (ruleHit && type === TYPE_OR) {\n          return true;\n        }\n        else if (type === TYPE_AND && !ruleHit) {\n          return false;\n        }\n      }\n\n      return false;\n    };\n  }\n\n  \/\/ Main widget class constructor\n  function ShowWhen(parent, field, params, setValue) {\n    var self = this;\n\n    self.field = field;\n    \/\/ Outsource readies\n    self.passReadies = true;\n    self.value = params;\n\n    \/\/ Create the wrapper:\n    var $wrapper = $('<div>', {\n      'class': 'field h5p-editor-widget-show-when'\n    });\n    var showing = false;\n    var config = self.field.showWhen;\n\n    if (config === undefined) {\n      throw new Error('You need to set the showWhen in semantics.json property when using the showWhen widget');\n    }\n\n    var ruleHandler = new RuleHandler(config.type);\n\n    for (var i = 0; i < config.rules.length; i++) {\n      var rule = config.rules[i];\n      var targetField = H5PEditor.findField(rule.field, parent);\n      var handler = createFieldHandler(targetField, rule.equals);\n\n      if (handler !== undefined) {\n        ruleHandler.add(handler);\n        H5PEditor.followField(parent, rule.field, config.detach ? function () {\n          if (showing != ruleHandler.rulesSatisfied()) {\n            showing = !showing;\n            if (showing) {\n              $wrapper.appendTo(self.$container);\n            }\n            else {\n              $wrapper.detach();\n            }\n          }\n        } : function () {\n          showing = ruleHandler.rulesSatisfied();\n          $wrapper.toggleClass('hidden', !showing);\n        });\n      }\n    }\n\n    \/\/ Create the real field:\n    var widgetName = config.widget || field.type;\n    var fieldInstance = new H5PEditor.widgets[widgetName](parent, field, params, setValue);\n    fieldInstance.appendTo($wrapper);\n\n    \/**\n     * Add myself to the DOM\n     *\n     * @public\n     * @param {H5P.jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      if (!config.detach) {\n        $wrapper.appendTo($container);\n      }\n      self.$container = $container;\n    };\n\n    \/**\n     * Validate\n     *\n     * @public\n     * @return {boolean}\n     *\/\n    self.validate = function () {\n      \/\/ Only validate if field is shown!\n      return showing ? fieldInstance.validate() : true;\n    };\n\n    self.remove = function () {};\n  }\n\n  return ShowWhen;\n})(H5PEditor.$);\n\n\/\/ Register widget\nH5PEditor.widgets.showWhen = H5PEditor.ShowWhen;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/stop-watch.js?ver=1.9.7":"\nvar H5P = H5P || {};\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\nH5P.SingleChoiceSet.StopWatch = (function () {\n  \/**\n   * @class {H5P.SingleChoiceSet.StopWatch}\n   * @constructor\n   *\/\n  function StopWatch() {\n    \/**\n     * @property {number} duration in ms\n     *\/\n    this.duration = 0;\n  }\n\n  \/**\n   * Starts the stop watch\n   *\n   * @public\n   * @return {H5P.SingleChoiceSet.StopWatch}\n   *\/\n  StopWatch.prototype.start = function(){\n    \/**\n     * @property {number}\n     *\/\n    this.startTime = Date.now();\n    return this;\n  };\n\n  \/**\n   * Stops the stopwatch, and returns the duration in seconds.\n   *\n   * @public\n   * @return {number}\n   *\/\n  StopWatch.prototype.stop = function(){\n    this.duration = this.duration + Date.now() - this.startTime;\n    return this.passedTime();\n  };\n\n  \/**\n   * Sets the duration to 0\n   *\n   * @public\n   *\/\n  StopWatch.prototype.reset = function(){\n    this.duration = 0;\n  };\n\n  \/**\n   * Returns the passed time in seconds\n   *\n   * @public\n   * @return {number}\n   *\/\n  StopWatch.prototype.passedTime = function(){\n    return Math.round(this.duration \/ 10) \/ 100;\n  };\n\n  return StopWatch;\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/sound-effects.js?ver=1.9.7":"\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\nH5P.SingleChoiceSet.SoundEffects = (function () {\n  var isDefined = false;\n\n  var SoundEffects = {\n    types: [\n      'positive-short',\n      'negative-short'\n    ]\n  };\n\n  \/**\n   * Setup defined sounds\n   *\n   * @param {string} libraryPath\n   * @return {boolean} True if setup was successfull, otherwise false\n   *\/\n  SoundEffects.setup = function (libraryPath) {\n    if (isDefined || !H5P.SoundJS.initializeDefaultPlugins()) {\n      return false;\n    }\n\n    H5P.SoundJS.alternateExtensions = ['mp3'];\n    for (var i = 0; i < SoundEffects.types.length; i++) {\n      var type = SoundEffects.types[i];\n      H5P.SoundJS.registerSound(libraryPath + 'sounds\/' + type + '.ogg', type);\n    }\n    isDefined = true;\n\n    return true;\n  };\n\n  \/**\n   * Play a sound\n   *\n   * @param  {string} type  Name of the sound as defined in [SoundEffects.types]{@link H5P.SoundEffects.SoundEffects#types}\n   * @param  {number} delay Delay in milliseconds\n   *\/\n  SoundEffects.play = function (type, delay) {\n    H5P.SoundJS.play(type, H5P.SoundJS.INTERRUPT_NONE, (delay || 0));\n  };\n\n  return SoundEffects;\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/xapi-event-builder.js?ver=1.9.7":"\nvar H5P = H5P || {};\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\nH5P.SingleChoiceSet.XApiEventBuilder = (function ($, EventDispatcher) {\n  \/**\n   * @typedef {object} LocalizedString\n   * @property {string} en-US\n   *\/\n\n  \/**\n   * @class {H5P.SingleChoiceSet.XApiEventDefinitionBuilder}\n   * @constructor\n   *\/\n  function XApiEventDefinitionBuilder(){\n    EventDispatcher.call(this);\n    \/**\n     * @property {object} attributes\n     * @property {string} attributes.name\n     * @property {string} attributes.description\n     * @property {string} attributes.interactionType\n     * @property {string} attributes.correctResponsesPattern\n     * @property {object} attributes.optional\n     *\/\n    this.attributes = {};\n  }\n\n  XApiEventDefinitionBuilder.prototype = Object.create(EventDispatcher.prototype);\n  XApiEventDefinitionBuilder.prototype.constructor = XApiEventDefinitionBuilder;\n\n\n  \/**\n   * Sets name\n   * @param {string} name\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.name = function (name) {\n    this.attributes.name = name;\n    return this;\n  };\n\n  \/**\n   * Question text and any additional information to generate the report.\n   * @param {string} description\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.description = function (description) {\n    this.attributes.description = description;\n    return this;\n  };\n\n  \/**\n   * Type of the interaction.\n   * @param {string} interactionType\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#interaction-types|xAPI Spec}\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.interactionType = function (interactionType) {\n    this.attributes.interactionType = interactionType;\n    return this;\n  };\n\n  \/**\n   * A pattern for determining the correct answers of the interaction\n   * @param {string[]} correctResponsesPattern\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#response-patterns|xAPI Spec}\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.correctResponsesPattern = function (correctResponsesPattern) {\n    this.attributes.correctResponsesPattern = correctResponsesPattern;\n    return this;\n  };\n\n  \/**\n   * Sets optional attributes\n   * @param {object} optional Can have one of the following configuration objects: choices, scale, source, target, steps\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.optional = function (optional) {\n    this.attributes.optional = optional;\n    return this;\n  };\n\n  \/**\n   * @return {object}\n   *\/\n  XApiEventDefinitionBuilder.prototype.build = function () {\n    var definition = {};\n\n    \/\/ sets attributes\n    setAttribute(definition, 'name', localizeToEnUS(this.attributes.name));\n    setAttribute(definition, 'description', localizeToEnUS(this.attributes.description));\n    setAttribute(definition, 'interactionType', this.attributes.interactionType);\n    setAttribute(definition, 'correctResponsesPattern', this.attributes.correctResponsesPattern);\n    setAttribute(definition, 'type', 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction');\n\n    \/\/ adds the optional object to the definition\n    if(this.attributes.optional){\n      $.extend(definition, this.attributes.optional);\n    }\n\n    return definition;\n  };\n\n  \/\/ -----------------------------------------------------\n\n  \/**\n   *\n   * @constructor\n   *\/\n  function XApiEventResultBuilder(){\n    EventDispatcher.call(this);\n    \/**\n     * @property {object} attributes\n     * @property {string} attributes.completion\n     * @property {boolean} attributes.success\n     * @property {boolean} attributes.response\n     * @property {number} attributes.rawScore\n     * @property {number} attributes.maxScore\n     *\/\n    this.attributes = {};\n  }\n\n  XApiEventResultBuilder.prototype = Object.create(EventDispatcher.prototype);\n  XApiEventResultBuilder.prototype.constructor = XApiEventResultBuilder;\n\n  \/**\n   * @param {boolean} completion\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.completion = function (completion) {\n    this.attributes.completion = completion;\n    return this;\n  };\n\n  \/**\n   * @param {boolean} success\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.success = function (success) {\n    this.attributes.success = success;\n    return this;\n  };\n\n  \/**\n   * @param {number} duration The duraction in seconds\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.duration = function (duration) {\n    this.attributes.duration = duration;\n    return this;\n  };\n\n  \/**\n   * Sets response\n   * @param {string|string[]} response\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.response = function (response) {\n    this.attributes.response = (typeof response === 'string') ? response : response.join('[,]');\n    return this;\n  };\n\n  \/**\n   * Sets the score, and max score\n   * @param {number} score\n   * @param {number} maxScore\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.score = function (score, maxScore) {\n    this.attributes.rawScore = score;\n    this.attributes.maxScore = maxScore;\n    return this;\n  };\n\n  \/**\n   * Builds the result object\n   * @return {object}\n   *\/\n  XApiEventResultBuilder.prototype.build = function () {\n    var result = {};\n\n    setAttribute(result, 'response', this.attributes.response);\n    setAttribute(result, 'completion', this.attributes.completion);\n    setAttribute(result, 'success', this.attributes.success);\n\n    if(isDefined(this.attributes.duration)){\n      setAttribute(result, 'duration','PT' +  this.attributes.duration + 'S');\n    }\n\n    \/\/ sets score\n    if (isDefined(this.attributes.rawScore)) {\n      result.score = {};\n      setAttribute(result.score, 'raw', this.attributes.rawScore);\n\n      if (isDefined(this.attributes.maxScore) && this.attributes.maxScore > 0) {\n        setAttribute(result.score, 'min', 0);\n        setAttribute(result.score, 'max', this.attributes.maxScore);\n        setAttribute(result.score, 'min', 0);\n        setAttribute(result.score, 'scaled', Math.round(this.attributes.rawScore \/ this.attributes.maxScore * 10000) \/ 10000);\n      }\n    }\n\n    return result;\n  };\n\n  \/\/ -----------------------------------------------------\n\n  \/**\n   * @class {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  function XApiEventBuilder() {\n    EventDispatcher.call(this);\n    \/**\n     * @property {object} attributes\n     * @property {string} attributes.contentId\n     * @property {string} attributes.subContentId\n     *\/\n    this.attributes = {};\n  }\n\n  XApiEventBuilder.prototype = Object.create(EventDispatcher.prototype);\n  XApiEventBuilder.prototype.constructor = XApiEventBuilder;\n\n\n  \/**\n   * @param {object} verb\n   *\n   * @public\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.verb = function (verb) {\n    this.attributes.verb = verb;\n    return this;\n  };\n\n  \/**\n   * @param {string} name\n   * @param {string} mbox\n   * @param {string} objectType\n   *\n   * @public\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.actor = function (name, mbox, objectType) {\n    this.attributes.actor = {\n      name: name,\n      mbox: mbox,\n      objectType: objectType\n    };\n\n    return this;\n  };\n\n  \/**\n   * Sets contentId\n   * @param {string} contentId\n   * @param {string} [subContentId]\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.contentId = function (contentId, subContentId) {\n    this.attributes.contentId = contentId;\n    this.attributes.subContentId = subContentId;\n    return this;\n  };\n\n  \/**\n   * Sets parent in context\n   *\n   * @param {string} parentContentId\n   * @param {string} [parentSubContentId]\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.context = function (parentContentId, parentSubContentId) {\n    this.attributes.parentContentId = parentContentId;\n    this.attributes.parentSubContentId = parentSubContentId;\n    return this;\n  };\n\n  \/**\n   * @param {object} result\n   *\n   * @public\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.result = function (result) {\n    this.attributes.result = result;\n    return this;\n  };\n\n  \/**\n   * @param {object} objectDefinition\n   *\n   * @public\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.objectDefinition = function (objectDefinition) {\n    this.attributes.objectDefinition = objectDefinition;\n    return this;\n  };\n\n  \/**\n   * Returns the buildt event\n   * @public\n   * @return {H5P.XAPIEvent}\n   *\/\n  XApiEventBuilder.prototype.build = function(){\n    var event = new H5P.XAPIEvent();\n\n    event.setActor();\n    event.setVerb(this.attributes.verb);\n\n    \/\/ sets context\n    if(this.attributes.parentContentId || this.attributes.parentSubContentId){\n      event.data.statement.context = {\n        'contextActivities': {\n          'parent': [\n            {\n              'id': getContentXAPIId(this.attributes.parentContentId, this.attributes.parentSubContentId),\n              'objectType': \"Activity\"\n            }\n          ]\n        }\n      };\n    }\n\n    event.data.statement.object = {\n      'id': getContentXAPIId(this.attributes.contentId, this.attributes.subContentId),\n      'objectType': 'Activity'\n    };\n\n    setAttribute(event.data, 'actor', this.attributes.actor);\n    setAttribute(event.data.statement, 'result', this.attributes.result);\n    setAttribute(event.data.statement.object, 'definition', this.attributes.objectDefinition);\n\n    \/\/ sets h5p specific attributes\n    if(event.data.statement.object.definition && (this.attributes.contentId || this.attributes.subContentId)) {\n      var extensions = event.data.statement.object.definition.extensions = {};\n      setAttribute(extensions, 'http:\/\/h5p.test.schulcloud-thueringen.de\/x-api\/h5p-local-content-id', this.attributes.contentId);\n      setAttribute(extensions, 'http:\/\/h5p.test.schulcloud-thueringen.de\/x-api\/h5p-subContentId', this.attributes.subContentId);\n    }\n\n    return event;\n  };\n\n  \/**\n   * Creates a Localized String object for en-US\n   *\n   * @param str\n   * @return {LocalizedString}\n   *\/\n  var localizeToEnUS = function(str){\n    if(str != undefined){\n      return {\n        'en-US': cleanString(str)\n      };\n    }\n  };\n\n  \/**\n   * Generates an id for the content\n   * @param {string} contentId\n   * @param {string} [subContentId]\n   *\n   * @see {@link https:\/\/github.com\/h5p\/h5p-php-library\/blob\/master\/js\/h5p-x-api-event.js#L240-L249}\n   * @return {string}\n   *\/\n  var getContentXAPIId = function (contentId, subContentId) {\n    if (contentId && H5PIntegration && H5PIntegration.contents) {\n      var id =  H5PIntegration.contents['cid-' + contentId].url;\n\n      if (subContentId) {\n        id += '?subContentId=' +  subContentId;\n      }\n\n      return id;\n    }\n  };\n\n  \/**\n   * Removes html elements from string\n   *\n   * @param {string} str\n   * @return {string}\n   *\/\n  var cleanString = function (str) {\n    return $('<div>' + str + '<\/div>').text().trim();\n  };\n\n  var isDefined = function(val){\n    return typeof val !== 'undefined';\n  };\n\n  function setAttribute(obj, key, value, required){\n    if(isDefined(value)){\n      obj[key] = value;\n    } else if (required) {\n      console.error(\"xApiEventBuilder: No value for [\" + key + \"] in\", obj);\n    }\n  }\n\n  \/**\n   * Creates a new XApiEventBuilder\n   *\n   * @public\n   * @static\n   * @return {H5P.SingleChoiceSet.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.create = function(){\n    return new XApiEventBuilder();\n  };\n\n  \/**\n   * Creates a new XApiEventDefinitionBuilder\n   *\n   * @public\n   * @static\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventBuilder.createDefinition = function(){\n    return new XApiEventDefinitionBuilder();\n  };\n\n  \/**\n   * Creates a new XApiEventDefinitionBuilder\n   *\n   * @public\n   * @static\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventBuilder.createResult = function(){\n    return new XApiEventResultBuilder();\n  };\n\n  \/**\n   * Returns choice to be used with 'cmi.interaction' for Activity of type 'choice'\n   *\n   * @param {string} id\n   * @param {string} description\n   *\n   * @public\n   * @static\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#choice|xAPI-Spec}\n   * @return {object}\n   *\/\n  XApiEventBuilder.createChoice = function(id, description){\n    return {\n      id: id,\n      description: localizeToEnUS(description)\n    };\n  };\n\n  \/**\n   * Takes an array of correct ids, and joins them to a 'correct response pattern'\n   *\n   * @param {string[]} ids\n   *\n   * @public\n   * @static\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#choice|xAPI-Spec}\n   * @return {string}\n   *\/\n  XApiEventBuilder.createCorrectResponsePattern = function(ids){\n    return ids.join('[,]');\n  };\n\n  \/**\n   * Interaction types\n   *\n   * @readonly\n   * @enum {String}\n   *\/\n  XApiEventBuilder.interactionTypes = {\n    CHOICE: 'choice',\n    COMPOUND: 'compound',\n    FILL_IN: 'fill-in',\n    MATCHING: 'matching',\n    TRUE_FALSE: 'true-false'\n  };\n\n  \/**\n   * Verbs\n   *\n   * @readonly\n   * @enum {String}\n   *\/\n  XApiEventBuilder.verbs = {\n    ANSWERED: 'answered'\n  };\n\n  return XApiEventBuilder;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/result-slide.js?ver=1.9.7":"\nvar H5P = H5P || {};\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\/**\n * SingleChoiceResultSlide - Represents the result slide\n *\/\nH5P.SingleChoiceSet.ResultSlide = (function ($, EventDispatcher) {\n\n  \/**\n   * @constructor\n   * @param {number} maxscore Max score\n   *\/\n  function ResultSlide(maxscore) {\n    EventDispatcher.call(this);\n\n    this.$feedbackContainer = $('<div>', {\n      'class': 'h5p-sc-feedback-container',\n      'tabindex': '-1'\n    });\n\n    this.$buttonContainer = $('<div\/>', {\n      'class': 'h5p-sc-button-container'\n    });\n\n    var $resultContainer = $('<div\/>', {\n      'class': 'h5p-sc-result-container'\n    }).append(this.$feedbackContainer)\n      .append(this.$buttonContainer);\n\n    this.$resultSlide = $('<div>', {\n      'class': 'h5p-sc-slide h5p-sc-set-results',\n      'css': {left: (maxscore * 100) + '%'}\n    }).append($resultContainer);\n  }\n\n  \/\/ inherits from EventDispatchers prototype\n  ResultSlide.prototype = Object.create(EventDispatcher.prototype);\n\n  \/\/ set the constructor\n  ResultSlide.prototype.constructor = ResultSlide;\n\n  \/**\n   * Focus feedback container.\n   *\/\n  ResultSlide.prototype.focusScore = function () {\n    this.$feedbackContainer.focus();\n  };\n\n  \/**\n   * Append the resultslide to a container\n   *\n   * @param  {jQuery} $container The container\n   * @return {jQuery}            This dom element\n   *\/\n  ResultSlide.prototype.appendTo = function ($container) {\n    this.$resultSlide.appendTo($container);\n    return this.$resultSlide;\n  };\n\n  return ResultSlide;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/solution-view.js?ver=1.9.7":"\nvar H5P = H5P || {};\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\nH5P.SingleChoiceSet.SolutionView = (function ($, EventDispatcher) {\n  \/**\n   * Constructor function.\n   *\/\n  function SolutionView(id, choices, l10n) {\n    EventDispatcher.call(this);\n    var self = this;\n    self.id = id;\n    this.choices = choices;\n\n    this.$solutionView = $('<div>', {\n      'class': 'h5p-sc-solution-view'\n    });\n\n    \/\/ Add header\n    this.$header = $('<div>', {\n      'class': 'h5p-sc-solution-view-header'\n    }).appendTo(this.$solutionView);\n\n    this.$title = $('<div>', {\n      'class': 'h5p-sc-solution-view-title',\n      'html': l10n.solutionViewTitle,\n      'tabindex': '-1'\n    });\n    this.$title = this.addAriaPunctuation(this.$title);\n    this.$header.append(this.$title);\n\n    \/\/ Close solution view button\n    $('<button>', {\n      'role': 'button',\n      'aria-label': l10n.closeButtonLabel + '.',\n      'class': 'h5p-joubelui-button h5p-sc-close-solution-view',\n      'click': function () {\n        self.hide();\n      }\n    }).appendTo(this.$header);\n\n    self.populate();\n  }\n\n  \/**\n   * Will append the solution view to a container DOM\n   * @param  {jQuery} $container The DOM object to append to\n   *\/\n  SolutionView.prototype.appendTo = function ($container) {\n    this.$solutionView.appendTo($container);\n  };\n\n  \/**\n   * Shows the solution view\n   *\/\n  SolutionView.prototype.show = function () {\n    var self = this;\n    self.$solutionView.addClass('visible');\n    self.$title.focus();\n\n    $(document).on('keyup.solutionview', function (event) {\n      if (event.keyCode === 27) { \/\/ Escape\n        self.hide();\n        $(document).off('keyup.solutionview');\n      }\n    });\n  };\n\n  \/**\n   * Hides the solution view\n   *\/\n  SolutionView.prototype.hide = function () {\n    this.$solutionView.removeClass('visible');\n    this.trigger('hide', this);\n  };\n\n\n  \/**\n   * Populates the solution view\n   *\/\n  SolutionView.prototype.populate = function () {\n    var self = this;\n    self.$choices = $('<dl>', {\n      'class': 'h5p-sc-solution-choices',\n      'tabindex': -1,\n    });\n\n    this.choices.forEach(function (choice) {\n      if (choice.question && choice.answers && choice.answers.length !== 0) {\n        var $question = self.addAriaPunctuation($('<dt>', {\n          'class': 'h5p-sc-solution-question',\n          html: choice.question\n        }));\n\n        self.$choices.append($question);\n\n        var $answer = self.addAriaPunctuation($('<dd>', {\n          'class': 'h5p-sc-solution-answer',\n          html: choice.answers[0]\n        }));\n\n        self.$choices.append($answer);\n      }\n    });\n    self.$choices.appendTo(this.$solutionView);\n  };\n\n  \/**\n   * If a jQuery elements text is missing punctuation, add an aria-label to the element\n   * containing the text, and adding an extra \"period\"-symbol at the end.\n   *\n   * @param {jQuery} $element A jQuery-element\n   * @returns {jQuery} The mutated jQuery-element\n   *\/\n  SolutionView.prototype.addAriaPunctuation = function ($element) {\n    var text = $element.text().trim();\n\n    if (!this.hasPunctuation(text)) {\n      $element.attr('aria-label', text + '.');\n    }\n\n    return $element;\n  };\n\n  \/**\n   * Checks if a string ends with punctuation\n   *\n   * @private\n   * @param {String} text Input string\n   *\/\n  SolutionView.prototype.hasPunctuation = function (text) {\n    return \/[,.?!]$\/.test(text);\n  };\n\n  return SolutionView;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/single-choice-alternative.js?ver=1.9.7":"\nvar H5P = H5P || {};\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\nH5P.SingleChoiceSet.Alternative = (function ($, EventDispatcher) {\n\n  \/**\n   * @constructor\n   *\n   * @param {object} options Options for the alternative\n   *\/\n  function Alternative(options) {\n    EventDispatcher.call(this);\n    var self = this;\n\n    this.options = options;\n\n    var triggerAlternativeSelected = function (event) {\n      self.trigger('alternative-selected', {\n        correct: self.options.correct,\n        $element: self.$alternative,\n        answerIndex: self.options.answerIndex\n      });\n\n      event.preventDefault();\n    };\n\n    this.$alternative = $('<li>', {\n      'class': 'h5p-sc-alternative h5p-sc-is-' + (this.options.correct ? 'correct' : 'wrong'),\n      'role': 'button',\n      'tabindex': -1,\n      'on': {\n        'keydown': function (event) {\n          switch (event.which) {\n            case 13: \/\/ Enter\n            case 32: \/\/ Space\n              \/\/ Answer question\n              triggerAlternativeSelected(event);\n              break;\n\n            case 35: \/\/ End button\n              \/\/ Go to previous Option\n              self.trigger('lastOption', event);\n              event.preventDefault();\n              break;\n\n            case 36: \/\/ Home button\n              \/\/ Go to previous Option\n              self.trigger('firstOption', event);\n              event.preventDefault();\n              break;\n\n            case 37: \/\/ Left Arrow\n            case 38: \/\/ Up Arrow\n              \/\/ Go to previous Option\n              self.trigger('previousOption', event);\n              event.preventDefault();\n              break;\n\n            case 39: \/\/ Right Arrow\n            case 40: \/\/ Down Arrow\n              \/\/ Go to next Option\n              self.trigger('nextOption', event);\n              event.preventDefault();\n              break;\n          }\n        }\n      },\n      'focus': function (event) {\n        self.trigger('focus', event);\n      },\n      'click': triggerAlternativeSelected\n    });\n\n    this.$alternative.append($('<div>', {\n      'class': 'h5p-sc-progressbar'\n    }));\n\n    this.$alternative.append($('<div>', {\n      'class': 'h5p-sc-label',\n      'html': this.options.text\n    }));\n\n    this.$alternative.append($('<div>', {\n      'class': 'h5p-sc-status'\n    }));\n  }\n\n  Alternative.prototype = Object.create(EventDispatcher.prototype);\n  Alternative.prototype.constructor = Alternative;\n\n  \/**\n   * Is this alternative the correct one?\n   *\n   * @return {boolean}  Correct or not?\n   *\/\n  Alternative.prototype.isCorrect = function () {\n    return this.options.correct;\n  };\n\n  \/**\n   * Move focus to this option.\n   *\/\n  Alternative.prototype.focus = function () {\n    this.$alternative.focus();\n  };\n\n  \/**\n   * Makes it possible to tab your way to this option.\n   *\/\n  Alternative.prototype.tabbable = function () {\n    this.$alternative.attr('tabindex', 0);\n  };\n\n  \/**\n   * Make sure it's NOT possible to tab your way to this option.\n   *\/\n  Alternative.prototype.notTabbable = function () {\n    this.$alternative.attr('tabindex', -1);\n  };\n\n  \/**\n   * Append the alternative to a DOM container\n   *\n   * @param  {jQuery} $container The Dom element to append to\n   * @return {jQuery}            This dom element\n   *\/\n  Alternative.prototype.appendTo = function ($container) {\n    $container.append(this.$alternative);\n    return this.$alternative;\n  };\n\n  return Alternative;\n\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/single-choice.js?ver=1.9.7":"\nvar H5P = H5P || {};\nH5P.SingleChoiceSet = H5P.SingleChoiceSet || {};\n\nH5P.SingleChoiceSet.SingleChoice = (function ($, EventDispatcher, Alternative) {\n  \/**\n   * Constructor function.\n   *\/\n  function SingleChoice(options, index, id) {\n    EventDispatcher.call(this);\n    \/\/ Extend defaults with provided options\n    this.options = $.extend(true, {}, {\n      question: '',\n      answers: []\n    }, options);\n    \/\/ Keep provided id.\n    this.index = index;\n    this.id = id;\n    this.answered = false;\n\n    for (var i = 0; i < this.options.answers.length; i++) {\n      this.options.answers[i] = {\n        text: this.options.answers[i],\n        correct: i === 0,\n        answerIndex: i\n      };\n    }\n    \/\/ Randomize alternatives\n    this.options.answers = H5P.shuffleArray(this.options.answers);\n  }\n\n  SingleChoice.prototype = Object.create(EventDispatcher.prototype);\n  SingleChoice.prototype.constructor = SingleChoice;\n\n  \/**\n   * appendTo function invoked to append SingleChoice to container\n   *\n   * @param {jQuery} $container\n   * @param {boolean} isCurrent Current slide we are on\n   *\/\n  SingleChoice.prototype.appendTo = function ($container, isCurrent) {\n    var self = this;\n    this.$container = $container;\n\n    \/\/ Index of the currently focused option.\n    var focusedOption;\n\n    this.$choice = $('<div>', {\n      'class': 'h5p-sc-slide h5p-sc' + (isCurrent ? ' h5p-sc-current-slide' : ''),\n      css: {'left': (self.index * 100) + '%'}\n    });\n\n    var questionId = 'single-choice-' + self.id + '-question-' + self.index;\n\n    this.$choice.append($('<div>', {\n      'id': questionId,\n      'class': 'h5p-sc-question',\n      'html': this.options.question\n    }));\n\n    var $alternatives = $('<ul>', {\n      'class': 'h5p-sc-alternatives',\n      'role': 'application',\n      'aria-labelledby': questionId\n    });\n\n    \/**\n     * List of Alternatives\n     *\n     * @type {Alternative[]}\n     *\/\n    this.alternatives = self.options.answers.map(function (opts) {\n      return new Alternative(opts);\n    });\n\n    \/**\n     * Handles click on an alternative\n     *\/\n    var handleAlternativeSelected = function (event) {\n      var $element = event.data.$element;\n      var correct = event.data.correct;\n      var answerIndex = event.data.answerIndex;\n\n      if ($element.parent().hasClass('h5p-sc-selected')) {\n        return;\n      }\n\n      self.trigger('alternative-selected', {\n        correct: correct,\n        index: self.index,\n        answerIndex: answerIndex\n      });\n\n      H5P.Transition.onTransitionEnd($element.find('.h5p-sc-progressbar'), function () {\n        $element.addClass('h5p-sc-drummed');\n        self.showResult(correct, answerIndex);\n      }, 700);\n\n      $element.addClass('h5p-sc-selected').parent().addClass('h5p-sc-selected');\n\n      \/\/ indicate that this question is anwered\n      this.setAnswered(true);\n    };\n\n    \/**\n     * Handles focusing one of the options, making the rest non-tabbable.\n     * @private\n     *\/\n    var handleFocus = function (answer, index) {\n      \/\/ Keep track of currently focused option\n      focusedOption = index;\n\n      \/\/ remove tabbable all alternatives\n      self.alternatives.forEach(function (alternative) {\n        alternative.notTabbable();\n      });\n      answer.tabbable();\n    };\n\n    \/**\n     * Handles moving the focus from the current option to the previous option.\n     * @private\n     *\/\n    var handlePreviousOption = function () {\n      if (focusedOption === 0) {\n        \/\/ wrap around to last\n        this.focusOnAlternative(self.alternatives.length - 1);\n      }\n      else {\n        this.focusOnAlternative(focusedOption - 1);\n      }\n    };\n\n    \/**\n     * Handles moving the focus from the current option to the next option.\n     * @private\n     *\/\n    var handleNextOption = function () {\n      if ((focusedOption === this.alternatives.length - 1)) {\n        \/\/ wrap around to first\n        this.focusOnAlternative(0);\n      }\n      else {\n        this.focusOnAlternative(focusedOption + 1);\n      }\n    };\n\n    \/**\n     * Handles moving the focus to the first option\n     * @private\n     *\/\n    var handleFirstOption = function () {\n      this.focusOnAlternative(0);\n    };\n\n    \/**\n     * Handles moving the focus to the last option\n     * @private\n     *\/\n    var handleLastOption = function () {\n      this.focusOnAlternative(self.alternatives.length - 1);\n    };\n\n    for (var i = 0; i < this.alternatives.length; i++) {\n      var alternative = this.alternatives[i];\n\n      if (i === 0) {\n        alternative.tabbable();\n      }\n\n      alternative.appendTo($alternatives);\n      alternative.on('focus', handleFocus.bind(this, alternative, i), this);\n      alternative.on('alternative-selected', handleAlternativeSelected, this);\n      alternative.on('previousOption', handlePreviousOption, this);\n      alternative.on('nextOption', handleNextOption, this);\n      alternative.on('firstOption', handleFirstOption, this);\n      alternative.on('lastOption', handleLastOption, this);\n\n    }\n\n    this.$choice.append($alternatives);\n    $container.append(this.$choice);\n    return this.$choice;\n  };\n\n  \/**\n   * Focus on an alternative by index\n   *\n   * @param {Number} index The index of the alternative to focus on\n   *\/\n  SingleChoice.prototype.focusOnAlternative = function (index) {\n    if (!this.answered) {\n      this.alternatives[index].focus();\n    }\n  };\n\n  \/**\n   * Sets if the question was answered\n   *\n   * @param {Boolean} answered If this question was answered\n   *\/\n  SingleChoice.prototype.setAnswered = function (answered) {\n    this.answered = answered;\n  };\n\n  \/**\n   * Reveals the result for a question\n   *\n   * @param  {boolean} correct True uf answer was correct, otherwise false\n   * @param  {number} answerIndex Original index of answer\n   *\/\n  SingleChoice.prototype.showResult = function (correct, answerIndex) {\n    var self = this;\n\n    var $correctAlternative = self.$choice.find('.h5p-sc-is-correct');\n\n    H5P.Transition.onTransitionEnd($correctAlternative, function () {\n      self.trigger('finished', {\n        correct: correct,\n        index: self.index,\n        answerIndex: answerIndex\n      });\n    }, 600);\n\n    \/\/ Reveal corrects and wrong\n    self.$choice.find('.h5p-sc-is-wrong').addClass('h5p-sc-reveal-wrong');\n    $correctAlternative.addClass('h5p-sc-reveal-correct');\n  };\n\n  return SingleChoice;\n\n})(H5P.jQuery, H5P.EventDispatcher, H5P.SingleChoiceSet.Alternative);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/scripts\/single-choice-set.js?ver=1.9.7":"\nvar H5P = H5P || {};\n\nH5P.SingleChoiceSet = (function ($, UI, Question, SingleChoice, SolutionView, ResultSlide, SoundEffects, XApiEventBuilder, StopWatch) {\n  \/**\n   * @constructor\n   * @extends Question\n   * @param {object} options Options for single choice set\n   * @param {string} contentId H5P instance id\n   * @param {Object} contentData H5P instance data\n   *\/\n  function SingleChoiceSet(options, contentId, contentData) {\n    var self = this;\n\n    \/\/ Extend defaults with provided options\n    this.contentId = contentId;\n    Question.call(this, 'single-choice-set');\n    this.options = $.extend(true, {}, {\n      choices: [],\n      overallFeedback: [],\n      behaviour: {\n        autoContinue: true,\n        timeoutCorrect: 2000,\n        timeoutWrong: 3000,\n        soundEffectsEnabled: true,\n        enableRetry: true,\n        enableSolutionsButton: true,\n        passPercentage: 100\n      }\n    }, options);\n    if (contentData && contentData.previousState !== undefined) {\n      this.currentIndex = contentData.previousState.progress;\n      this.results = contentData.previousState.answers;\n    }\n    this.currentIndex = this.currentIndex || 0;\n    this.results = this.results || {\n      corrects: 0,\n      wrongs: 0\n    };\n\n    if (!this.options.behaviour.autoContinue) {\n      this.options.behaviour.timeoutCorrect = 0;\n      this.options.behaviour.timeoutWrong = 0;\n    }\n\n    \/**\n     * @property {StopWatch[]} Stop watches for tracking duration of slides\n     *\/\n    this.stopWatches = [];\n    this.startStopWatch(this.currentIndex);\n\n    \/**\n     * The users input on the questions. Uses the same index as this.options.choices\n     * @type {number[]}\n     *\/\n    this.userResponses = [];\n\n    this.muted = (this.options.behaviour.soundEffectsEnabled === false);\n\n    this.l10n = H5P.jQuery.extend({\n      correctText: 'Correct!',\n      incorrectText: 'Incorrect! Correct answer was: :text',\n      nextButtonLabel: 'Next question',\n      showSolutionButtonLabel: 'Show solution',\n      retryButtonLabel: 'Retry',\n      closeButtonLabel: 'Close',\n      solutionViewTitle: 'Solution',\n      slideOfTotal: 'Slide :num of :total',\n      muteButtonLabel: \"Mute feedback sound\",\n      scoreBarLabel: 'You got :num out of :total points'\n    }, options.l10n !== undefined ? options.l10n : {});\n\n    this.$container = $('<div>', {\n      'class': 'h5p-sc-set-wrapper navigatable' + (!this.options.behaviour.autoContinue ? ' next-button-mode' : '')\n    });\n\n    this.$slides = [];\n    \/\/ An array containing the SingleChoice instances\n    this.choices = [];\n\n    \/**\n     * Keeps track of buttons that will be hidden\n     * @type {Array}\n     *\/\n    self.buttonsToBeHidden = [];\n\n    \/**\n     * The solution dialog\n     * @type {SolutionView}\n     *\/\n    this.solutionView = new SolutionView(contentId, this.options.choices, this.l10n);\n\n    this.$choices = $('<div>', {\n      'class': 'h5p-sc-set h5p-sc-animate'\n    });\n\n    \/\/ sometimes an empty object is in the choices\n    this.options.choices = this.options.choices.filter(function (choice) {\n      return choice !== undefined && !!choice.answers;\n    });\n\n    var numQuestions = this.options.choices.length;\n\n    \/\/ Create progressbar\n    self.progressbar = UI.createProgressbar(numQuestions + 1, {\n      progressText: this.l10n.slideOfTotal\n    });\n    self.progressbar.setProgress(this.currentIndex);\n\n    for (var i = 0; i < this.options.choices.length; i++) {\n      var choice = new SingleChoice(this.options.choices[i], i, this.contentId);\n      choice.on('finished', this.handleQuestionFinished, this);\n      choice.on('alternative-selected', this.handleAlternativeSelected, this);\n      choice.appendTo(this.$choices, (i === this.currentIndex));\n      this.choices.push(choice);\n      this.$slides.push(choice.$choice);\n    }\n\n    this.resultSlide = new ResultSlide(this.options.choices.length);\n    this.resultSlide.appendTo(this.$choices);\n    this.resultSlide.on('retry', this.resetTask, this);\n    this.resultSlide.on('view-solution', this.handleViewSolution, this);\n    this.$slides.push(this.resultSlide.$resultSlide);\n    this.on('resize', this.resize, this);\n\n    \/\/ Use the correct starting slide\n    this.recklessJump(this.currentIndex);\n\n    if (this.options.choices.length === this.currentIndex) {\n      \/\/ Make sure results slide is displayed\n      this.resultSlide.$resultSlide.addClass('h5p-sc-current-slide');\n      this.setScore(this.results.corrects, true);\n    }\n\n    if (!this.muted) {\n      setTimeout(function () {\n        SoundEffects.setup(self.getLibraryFilePath(''));\n      }, 1);\n    }\n\n    \/**\n     * Override Question's hideButton function\n     * to be able to hide buttons after delay\n     *\n     * @override\n     * @param {string} id\n     *\/\n    this.superHideButton = self.hideButton;\n    this.hideButton = (function () {\n      return function (id) {\n\n        if (!self.scoreTimeout) {\n          return self.superHideButton(id);\n        }\n\n        self.buttonsToBeHidden.push(id);\n        return this;\n      };\n    })();\n  }\n\n  SingleChoiceSet.prototype = Object.create(Question.prototype);\n  SingleChoiceSet.prototype.constructor = SingleChoiceSet;\n\n  \/**\n   * Set if a element is tabbable or not\n   *\n   * @param {jQuery} $element The element\n   * @param {boolean} tabbable If element should be tabbable\n   * @returns {jQuery} The element\n   *\/\n  SingleChoiceSet.prototype.setTabbable = function ($element, tabbable) {\n    if ($element) {\n      $element.attr('tabindex', tabbable ? 0 : -1);\n    }\n  };\n\n  \/**\n   * Handle alternative selected, i.e play sound if sound effects are enabled\n   *\n   * @method handleAlternativeSelected\n   * @param  {Object} event Event that was fired\n   *\/\n  SingleChoiceSet.prototype.handleAlternativeSelected = function (event) {\n    var self = this;\n    this.lastAnswerIsCorrect = event.data.correct;\n\n    self.toggleNextButton(true);\n\n    self.triggerXAPI('interacted');\n\n    \/\/ correct answer\n    var correctAnswer = self.$choices.find('.h5p-sc-is-correct').text();\n\n    \/\/ Announce by ARIA if answer is correct or incorrect\n    var text = this.lastAnswerIsCorrect ? self.l10n.correctText : (self.l10n.incorrectText.replace(':text', correctAnswer));\n    self.read(text);\n\n    if (!this.muted) {\n      \/\/ Can't play it after the transition end is received, since this is not\n      \/\/ accepted on iPad. Therefore we are playing it here with a delay instead\n      SoundEffects.play(this.lastAnswerIsCorrect ? 'positive-short' : 'negative-short', 700);\n    }\n  };\n\n  \/**\n   * Handler invoked when question is done\n   *\n   * @param  {object} event An object containing a single boolean property: \"correct\".\n   *\/\n  SingleChoiceSet.prototype.handleQuestionFinished = function (event) {\n    var self = this;\n\n    var index = event.data.index;\n\n    \/\/ saves user response\n    var userResponse = self.userResponses[index] = event.data.answerIndex;\n\n    \/\/ trigger answered event\n    var duration = this.stopStopWatch(index);\n    var xapiEvent = self.createXApiAnsweredEvent(self.options.choices[index], userResponse, duration);\n\n    self.trigger(xapiEvent);\n\n    self.continue();\n  };\n\n  \/**\n   * Setup auto continue\n   *\/\n  SingleChoiceSet.prototype.continue = function () {\n    var self = this;\n\n    if (!self.options.behaviour.autoContinue) {\n      \/\/ Set focus to next button\n      self.$nextButton.focus();\n      return;\n    }\n\n    var timeout;\n    var letsMove = function () {\n      \/\/ Handle impatient users\n      self.$container.off('click.impatient keydown.impatient');\n      clearTimeout(timeout);\n      self.next();\n    };\n\n    timeout = setTimeout(function () {\n      letsMove();\n    }, self.lastAnswerIsCorrect ? self.options.behaviour.timeoutCorrect : self.options.behaviour.timeoutWrong);\n\n    self.onImpatientUser(letsMove);\n  };\n\n  \/**\n   * Listen to impatience\n   * @param  {Function} action Callback\n   *\/\n  SingleChoiceSet.prototype.onImpatientUser = function (action) {\n    this.$container.off('click.impatient keydown.impatient');\n\n    this.$container.one('click.impatient', action);\n    this.$container.one('keydown.impatient', function (event) {\n      \/\/ If return, space or right arrow\n      if ([13,32,39].indexOf(event.which)) {\n        action();\n      }\n    });\n  };\n\n  \/**\n   * Go to next slide\n   *\/\n  SingleChoiceSet.prototype.next = function () {\n    \/\/ Keep track of num correct\/wrong answers\n    this.results[this.lastAnswerIsCorrect ? 'corrects' : 'wrongs']++;\n\n    this.move(this.currentIndex + 1);\n  };\n\n  \/**\n   * Creates an xAPI answered event\n   *\n   * @param {object} question\n   * @param {number} userAnswer\n   * @param {number} duration\n   *\n   * @return {H5P.XAPIEvent}\n   *\/\n  SingleChoiceSet.prototype.createXApiAnsweredEvent = function (question, userAnswer, duration) {\n    var self = this;\n    var types = XApiEventBuilder.interactionTypes;\n\n    \/\/ creates the definition object\n    var definition = XApiEventBuilder.createDefinition()\n      .interactionType(types.CHOICE)\n      .description(question.question)\n      .correctResponsesPattern(self.getXApiCorrectResponsePattern())\n      .optional( self.getXApiChoices(question.answers))\n      .build();\n\n    \/\/ create the result object\n    var result = XApiEventBuilder.createResult()\n      .response(userAnswer.toString())\n      .duration(duration)\n      .score((userAnswer === 0) ? 1 : 0, 1)\n      .completion(true)\n      .success(userAnswer === 0)\n      .build();\n\n    return XApiEventBuilder.create()\n      .verb(XApiEventBuilder.verbs.ANSWERED)\n      .objectDefinition(definition)\n      .context(self.contentId, self.subContentId)\n      .contentId(self.contentId, question.subContentId)\n      .result(result)\n      .build();\n  };\n\n  \/**\n   * Returns the 'correct response pattern' for xApi\n   *\n   * @return {string[]}\n   *\/\n  SingleChoiceSet.prototype.getXApiCorrectResponsePattern = function () {\n    return [XApiEventBuilder.createCorrectResponsePattern([(0).toString()])]; \/\/ is always '0' for SCS\n  };\n\n  \/**\n   * Returns the choices array for xApi statements\n   *\n   * @param {String[]} answers\n   *\n   * @return {{ choices: []}}\n   *\/\n  SingleChoiceSet.prototype.getXApiChoices = function (answers) {\n    var choices = answers.map(function(answer, index){\n      return XApiEventBuilder.createChoice(index.toString(), answer);\n    });\n\n    return {\n      choices: choices\n    };\n  };\n\n  \/**\n   * Handles buttons that are queued for hiding\n   *\/\n  SingleChoiceSet.prototype.handleQueuedButtonChanges = function () {\n    var self = this;\n\n    if (self.buttonsToBeHidden.length) {\n      self.buttonsToBeHidden.forEach(function (id) {\n        self.superHideButton(id);\n      });\n    }\n    self.buttonsToBeHidden = [];\n  };\n\n  \/**\n   * Set score and feedback\n   *\n   * @params {Number} score Number of correct answers\n   *\/\n  SingleChoiceSet.prototype.setScore = function (score, noXAPI) {\n    var self = this;\n\n    if (!self.choices.length) {\n      return;\n    }\n\n    self.setFeedback(determineOverallFeedback(self.options.overallFeedback , score \/ self.options.choices.length)\n        .replace(':numcorrect', score)\n        .replace(':maxscore', self.options.choices.length.toString()),\n      score, self.options.choices.length, self.l10n.scoreBarLabel);\n\n    if (score === self.options.choices.length) {\n      self.hideButton('try-again');\n      self.hideButton('show-solution');\n    }\n    else {\n      self.showButton('try-again');\n      self.showButton('show-solution');\n    }\n    self.handleQueuedButtonChanges();\n    self.scoreTimeout = undefined;\n\n    if (!noXAPI) {\n      self.triggerXAPIScored(score, self.options.choices.length, 'completed', true, (100 * score \/ self.options.choices.length) >= self.options.behaviour.passPercentage);\n    }\n\n    self.trigger('resize');\n  };\n\n  \/**\n   * Handler invoked when view solution is selected\n   *\/\n  SingleChoiceSet.prototype.handleViewSolution = function () {\n    var self = this;\n\n    var $tryAgainButton = $('.h5p-question-try-again', self.$container);\n    var $showSolutionButton = $('.h5p-question-show-solution', self.$container);\n    var buttons = [self.$muteButton, $tryAgainButton, $showSolutionButton];\n\n    \/\/ remove tabbable for buttons in result view\n    buttons.forEach(function (button) {\n      self.setTabbable(button, false);\n    });\n\n    self.solutionView.on('hide', function () {\n      \/\/ re-add tabbable for buttons in result view\n      buttons.forEach(function (button) {\n        self.setTabbable(button, true);\n      });\n      self.toggleAriaVisibility(true);\n      \/\/ Focus on first button when closing solution view\n      self.focusButton();\n    });\n\n    self.solutionView.show();\n    self.toggleAriaVisibility(false);\n  };\n\n  \/**\n   * Toggle elements visibility to Assistive Technologies\n   *\n   * @param {boolean} enable Make elements visible\n   *\/\n  SingleChoiceSet.prototype.toggleAriaVisibility = function (enable) {\n    var self = this;\n    var ariaHidden = enable ? '' : 'true';\n    if (self.$muteButton) {\n      self.$muteButton.attr('aria-hidden', ariaHidden);\n    }\n    self.progressbar.$progressbar.attr('aria-hidden', ariaHidden);\n    self.$choices.attr('aria-hidden', ariaHidden);\n  };\n\n  \/**\n   * Register DOM elements before they are attached.\n   * Called from H5P.Question.\n   *\/\n  SingleChoiceSet.prototype.registerDomElements = function () {\n    \/\/ Register task content area.\n    this.setContent(this.createQuestion());\n\n    \/\/ Register buttons with question.\n    this.addButtons();\n\n    \/\/ Insert feedback and buttons section on the result slide\n    this.insertSectionAtElement('feedback', this.resultSlide.$feedbackContainer);\n    this.insertSectionAtElement('buttons', this.resultSlide.$buttonContainer);\n\n    \/\/ Question is finished\n    if (this.options.choices.length === this.currentIndex) {\n      this.trigger('question-finished');\n    }\n\n    this.trigger('resize');\n  };\n\n  \/**\n   * Add Buttons to question.\n   *\/\n  SingleChoiceSet.prototype.addButtons = function () {\n    var self = this;\n\n    if (this.options.behaviour.enableRetry) {\n      this.addButton('try-again', this.l10n.retryButtonLabel, function () {\n        self.resetTask();\n      }, self.results.corrects !== self.options.choices.length);\n    }\n\n    if (this.options.behaviour.enableSolutionsButton) {\n      this.addButton('show-solution', this.l10n.showSolutionButtonLabel, function () {\n        self.showSolutions();\n      }, self.results.corrects !== self.options.choices.length);\n    }\n  };\n\n  \/**\n   * Create main content\n   *\/\n  SingleChoiceSet.prototype.createQuestion = function () {\n    var self = this;\n\n    self.progressbar.appendTo(self.$container);\n    self.$container.append(self.$choices);\n\n    function toggleMute(event) {\n      var $button = $(event.target);\n      event.preventDefault();\n      self.muted = !self.muted;\n      $button.attr('aria-pressed', self.muted);\n    }\n\n    \/\/ Keep this out of H5P.Question, since we are moving the button & feedback\n    \/\/ region to the last slide\n    if (!this.options.behaviour.autoContinue) {\n\n      var handleNextClick = function () {\n        if(self.$nextButton.attr('aria-disabled') !== 'true') {\n          self.next();\n        }\n      };\n\n      self.$nextButton = UI.createButton({\n        'class': 'h5p-ssc-next-button',\n        'aria-label': self.l10n.nextButtonLabel,\n        click: handleNextClick,\n        keydown: function (event) {\n          switch (event.which) {\n            case 13: \/\/ Enter\n            case 32: \/\/ Space\n              handleNextClick();\n              event.preventDefault();\n          }\n        },\n        appendTo: self.$container\n      });\n      self.toggleNextButton(false);\n    }\n\n    if (self.options.behaviour.soundEffectsEnabled) {\n      self.$muteButton = $('<div>', {\n        'class': 'h5p-sc-sound-control',\n        'tabindex': 0,\n        'role': 'button',\n        'aria-label': self.l10n.muteButtonLabel,\n        'aria-pressed': false,\n        'on': {\n          'keydown': function (event) {\n            switch (event.which) {\n              case 13: \/\/ Enter\n              case 32: \/\/ Space\n                toggleMute(event);\n                break;\n            }\n          }\n        },\n        'click': toggleMute,\n        appendTo: self.$container\n      });\n    }\n\n    \/\/ Append solution view - hidden by default:\n    self.solutionView.appendTo(self.$container);\n\n    self.resize();\n\n    \/\/ Hide all other slides than the current one:\n    self.$container.addClass('initialized');\n\n    return self.$container;\n  };\n\n  \/**\n   * Resize if something outside resizes\n   *\/\n  SingleChoiceSet.prototype.resize = function () {\n    var self = this;\n    var maxHeight = 0;\n    self.choices.forEach(function (choice) {\n      var choiceHeight = choice.$choice.outerHeight();\n      maxHeight = choiceHeight > maxHeight ? choiceHeight : maxHeight;\n    });\n\n    \/\/ Set minimum height for choices\n    self.$choices.css({minHeight: maxHeight + 'px'});\n  };\n\n  \/**\n   * Disable\/enable the next button\n   * @param  {boolean} enable\n   *\/\n  SingleChoiceSet.prototype.toggleNextButton = function(enable) {\n    if (this.$nextButton) {\n      this.$nextButton.attr('aria-disabled', !enable);\n    }\n  };\n\n  \/**\n   * Will jump to the given slide without any though to animations,\n   * current slide etc.\n   *\n   * @public\n   *\/\n  SingleChoiceSet.prototype.recklessJump = function (index) {\n    var tX = 'translateX(' + (-index * 100) + '%)';\n    this.$choices.css({\n      '-webkit-transform': tX,\n      '-moz-transform': tX,\n      '-ms-transform': tX,\n      'transform': tX\n    });\n    this.progressbar.setProgress(index + 1);\n  };\n\n  \/**\n   * Move to slide n\n   * @param  {number} index The slide number    to move to\n   *\/\n  SingleChoiceSet.prototype.move = function (index) {\n    var self = this;\n    if (index === this.currentIndex || index > self.$slides.length-1) {\n      return;\n    }\n\n    var $previousSlide = self.$slides[self.currentIndex];\n    var $currentChoice = self.choices[index];\n    var $currentSlide = self.$slides[index];\n    var isResultSlide = (index >= self.choices.length);\n\n    self.toggleNextButton(false);\n\n    H5P.Transition.onTransitionEnd(self.$choices, function () {\n      $previousSlide.removeClass('h5p-sc-current-slide');\n\n      \/\/ on slides with answers focus on first alternative\n      if (!isResultSlide) {\n        $currentChoice.focusOnAlternative(0);\n      }\n      \/\/ on last slide, focus on try again button\n      else {\n        self.resultSlide.focusScore();\n      }\n    }, 600);\n\n    \/\/ if should show result slide\n    if (isResultSlide) {\n      self.setScore(self.results.corrects);\n    }\n\n    self.$container.toggleClass('navigatable', !isResultSlide);\n\n    \/\/ start timing of new slide\n    this.startStopWatch(index);\n\n    \/\/ move to slide\n    $currentSlide.addClass('h5p-sc-current-slide');\n    self.recklessJump(index);\n\n    self.currentIndex = index;\n  };\n\n  \/**\n   * Starts a stopwatch for indexed slide\n   *\n   * @param {number} index\n   *\/\n  SingleChoiceSet.prototype.startStopWatch = function (index) {\n    this.stopWatches[index] = this.stopWatches[index] || new StopWatch();\n    this.stopWatches[index].start();\n  };\n\n  \/**\n   * Stops a stopwatch for indexed slide\n   *\n   * @param {number} index\n   *\/\n  SingleChoiceSet.prototype.stopStopWatch = function (index) {\n    if(this.stopWatches[index]){\n      this.stopWatches[index].stop();\n    }\n  };\n\n  \/**\n   * Returns the passed time in seconds of a stopwatch on an indexed slide,\n   * or 0 if not existing\n   *\n   * @param {number} index\n   * @return {number}\n   *\/\n  SingleChoiceSet.prototype.timePassedInStopWatch = function (index) {\n    if(this.stopWatches[index] !== undefined){\n      return this.stopWatches[index].passedTime();\n    }\n    else {\n      \/\/ if not created, return no passed time,\n      return 0;\n    }\n  };\n\n  \/**\n   * Returns the time the user has spent on all questions so far\n   *\n   * @return {number}\n   *\/\n  SingleChoiceSet.prototype.getTotalPassedTime = function () {\n    return this.stopWatches\n      .filter(function(watch){\n        return watch != undefined;\n      })\n      .reduce(function(sum, watch){\n        return sum + watch.passedTime();\n      }, 0);\n  };\n\n  \/**\n   * The following functions implements the CP and IV - Contracts v 1.0 documented here:\n   * http:\/\/h5p.test.schulcloud-thueringen.de\/node\/1009\n   *\/\n  SingleChoiceSet.prototype.getScore = function () {\n    return this.results.corrects;\n  };\n\n  SingleChoiceSet.prototype.getMaxScore = function () {\n    return this.options.choices.length;\n  };\n\n  SingleChoiceSet.prototype.getAnswerGiven = function () {\n    return (this.results.corrects + this.results.wrongs) > 0;\n  };\n\n  SingleChoiceSet.prototype.getTitle = function () {\n    return (this.options.choices[0] ? H5P.createTitle(this.options.choices[0].question) : '');\n  };\n\n  \/**\n   * Retrieves the xAPI data necessary for generating result reports.\n   *\n   * @return {object}\n   *\/\n  SingleChoiceSet.prototype.getXAPIData = function(){\n    var self = this;\n\n    \/\/ create array with userAnswer\n    var children =  self.options.choices.map(function(question, index) {\n      var userResponse = self.userResponses[index] >= 0 ? self.userResponses[index] : '';\n      var duration = self.timePassedInStopWatch(index);\n      var event = self.createXApiAnsweredEvent(question, userResponse, duration);\n\n      return {\n        statement: event.data.statement\n      };\n    });\n\n    var result = XApiEventBuilder.createResult()\n      .score(self.getScore(), self.getMaxScore())\n      .duration(self.getTotalPassedTime())\n      .build();\n\n    \/\/ creates the definition object\n    var definition = XApiEventBuilder.createDefinition()\n      .interactionType(XApiEventBuilder.interactionTypes.COMPOUND)\n      .build();\n\n    var xAPIEvent = XApiEventBuilder.create()\n      .verb(XApiEventBuilder.verbs.ANSWERED)\n      .contentId(self.contentId, self.subContentId)\n      .context(self.getParentAttribute('contentId'), self.getParentAttribute('subContentId'))\n      .objectDefinition(definition)\n      .result(result)\n      .build();\n\n    return {\n      statement: xAPIEvent.data.statement,\n      children: children\n    };\n  };\n\n  \/**\n   * Returns an attribute from this.parent if it exists\n   *\n   * @param {string} attributeName\n   * @return {*|undefined}\n   *\/\n  SingleChoiceSet.prototype.getParentAttribute = function (attributeName) {\n    var self = this;\n\n    if(self.parent !== undefined){\n      return self.parent[attributeName];\n    }\n  };\n\n  SingleChoiceSet.prototype.showSolutions = function () {\n    this.handleViewSolution();\n  };\n\n  \/**\n   * Reset all answers. This is equal to refreshing the quiz\n   *\/\n  SingleChoiceSet.prototype.resetTask = function () {\n    var self = this;\n\n    \/\/ Close solution view if visible:\n    this.solutionView.hide();\n\n    \/\/ Reset the user's answers\n    var classes = ['h5p-sc-reveal-wrong', 'h5p-sc-reveal-correct', 'h5p-sc-selected', 'h5p-sc-drummed', 'h5p-sc-correct-answer'];\n    for (var i = 0; i < classes.length; i++) {\n      this.$choices.find('.' + classes[i]).removeClass(classes[i]);\n    }\n    this.results = {\n      corrects: 0,\n      wrongs: 0\n    };\n\n    this.choices.forEach(function (choice) {\n      choice.setAnswered(false);\n    });\n\n    this.stopWatches.forEach(function(stopWatch){\n      if(stopWatch){\n        stopWatch.reset();\n      }\n    });\n\n    this.move(0);\n\n    \/\/ Wait for transition, then remove feedback.\n    H5P.Transition.onTransitionEnd(this.$choices, function () {\n      self.removeFeedback();\n    }, 600);\n  };\n\n  \/**\n   * Clever comment.\n   *\n   * @public\n   * @returns {object}\n   *\/\n  SingleChoiceSet.prototype.getCurrentState = function () {\n    return {\n      progress: this.currentIndex,\n      answers: this.results\n    };\n  };\n\n  \/**\n   * Determine the overall feedback to display for the question.\n   * Returns empty string if no matching range is found.\n   *\n   * @param {Object[]} feedbacks\n   * @param {number} scoreRatio\n   * @return {string}\n   *\/\n  var determineOverallFeedback = function (feedbacks, scoreRatio) {\n    scoreRatio = Math.floor(scoreRatio * 100);\n\n    for (var i = 0; i < feedbacks.length; i++) {\n      var feedback = feedbacks[i];\n      var hasFeedback = (feedback.feedback !== undefined && feedback.feedback.trim().length !== 0);\n\n      if (feedback.from <= scoreRatio && feedback.to >= scoreRatio && hasFeedback) {\n        return feedback.feedback;\n      }\n    }\n\n    return '';\n  };\n\n  return SingleChoiceSet;\n})(H5P.jQuery, H5P.JoubelUI, H5P.Question, H5P.SingleChoiceSet.SingleChoice, H5P.SingleChoiceSet.SolutionView, H5P.SingleChoiceSet.ResultSlide, H5P.SingleChoiceSet.SoundEffects, H5P.SingleChoiceSet.XApiEventBuilder, H5P.SingleChoiceSet.StopWatch);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/EmbeddedJS-1.0\/js\/ejs_production.js?ver=1.0.4":"\n(function(){var rsplit=function(string,regex){var result=regex.exec(string),retArr=new Array(),first_idx,last_idx,first_bit;while(result!=null){first_idx=result.index;last_idx=regex.lastIndex;if((first_idx)!=0){first_bit=string.substring(0,first_idx);retArr.push(string.substring(0,first_idx));string=string.slice(first_idx)}retArr.push(result[0]);string=string.slice(result[0].length);result=regex.exec(string)}if(!string==\"\"){retArr.push(string)}return retArr},chop=function(string){return string.substr(0,string.length-1)},extend=function(d,s){for(var n in s){if(s.hasOwnProperty(n)){d[n]=s[n]}}};EJS=function(options){options=typeof options==\"string\"?{view:options}:options;this.set_options(options);if(options.precompiled){this.template={};this.template.process=options.precompiled;EJS.update(this.name,this);return }if(options.element){if(typeof options.element==\"string\"){var name=options.element;options.element=document.getElementById(options.element);if(options.element==null){throw name+\"does not exist!\"}}if(options.element.value){this.text=options.element.value}else{this.text=options.element.innerHTML}this.name=options.element.id;this.type=\"[\"}else{if(options.url){options.url=EJS.endExt(options.url,this.extMatch);this.name=this.name?this.name:options.url;var url=options.url;var template=EJS.get(this.name,this.cache);if(template){return template}if(template==EJS.INVALID_PATH){return null}try{this.text=EJS.request(url+(this.cache?\"\":\"?\"+Math.random()))}catch(e){}if(this.text==null){throw ({type:\"EJS\",message:\"There is no template at \"+url})}}}var template=new EJS.Compiler(this.text,this.type);template.compile(options,this.name);EJS.update(this.name,this);this.template=template};EJS.prototype={render:function(object,extra_helpers){object=object||{};this._extra_helpers=extra_helpers;var v=new EJS.Helpers(object,extra_helpers||{});return this.template.process.call(object,object,v)},update:function(element,options){if(typeof element==\"string\"){element=document.getElementById(element)}if(options==null){_template=this;return function(object){EJS.prototype.update.call(_template,element,object)}}if(typeof options==\"string\"){params={};params.url=options;_template=this;params.onComplete=function(request){var object=eval(request.responseText);EJS.prototype.update.call(_template,element,object)};EJS.ajax_request(params)}else{element.innerHTML=this.render(options)}},out:function(){return this.template.out},set_options:function(options){this.type=options.type||EJS.type;this.cache=options.cache!=null?options.cache:EJS.cache;this.text=options.text||null;this.name=options.name||null;this.ext=options.ext||EJS.ext;this.extMatch=new RegExp(this.ext.replace(\/\\.\/,\".\"))}};EJS.endExt=function(path,match){if(!path){return null}match.lastIndex=0;return path+(match.test(path)?\"\":this.ext)};EJS.Scanner=function(source,left,right){extend(this,{left_delimiter:left+\"%\",right_delimiter:\"%\"+right,double_left:left+\"%%\",double_right:\"%%\"+right,left_equal:left+\"%=\",left_comment:left+\"%#\"});this.SplitRegexp=left==\"[\"?\/(\\[%%)|(%%\\])|(\\[%=)|(\\[%#)|(\\[%)|(%\\]\\n)|(%\\])|(\\n)\/:new RegExp(\"(\"+this.double_left+\")|(%%\"+this.double_right+\")|(\"+this.left_equal+\")|(\"+this.left_comment+\")|(\"+this.left_delimiter+\")|(\"+this.right_delimiter+\"\\n)|(\"+this.right_delimiter+\")|(\\n)\");this.source=source;this.stag=null;this.lines=0};EJS.Scanner.to_text=function(input){if(input==null||input===undefined){return\"\"}if(input instanceof Date){return input.toDateString()}if(input.toString){return input.toString()}return\"\"};EJS.Scanner.prototype={scan:function(block){scanline=this.scanline;regex=this.SplitRegexp;if(!this.source==\"\"){var source_split=rsplit(this.source,\/\\n\/);for(var i=0;i<source_split.length;i++){var item=source_split[i];this.scanline(item,regex,block)}}},scanline:function(line,regex,block){this.lines++;var line_split=rsplit(line,regex);for(var i=0;i<line_split.length;i++){var token=line_split[i];if(token!=null){try{block(token,this)}catch(e){throw {type:\"EJS.Scanner\",line:this.lines}}}}}};EJS.Buffer=function(pre_cmd,post_cmd){this.line=new Array();this.script=\"\";this.pre_cmd=pre_cmd;this.post_cmd=post_cmd;for(var i=0;i<this.pre_cmd.length;i++){this.push(pre_cmd[i])}};EJS.Buffer.prototype={push:function(cmd){this.line.push(cmd)},cr:function(){this.script=this.script+this.line.join(\"; \");this.line=new Array();this.script=this.script+\"\\n\"},close:function(){if(this.line.length>0){for(var i=0;i<this.post_cmd.length;i++){this.push(pre_cmd[i])}this.script=this.script+this.line.join(\"; \");line=null}}};EJS.Compiler=function(source,left){this.pre_cmd=[\"var ___ViewO = [];\"];this.post_cmd=new Array();this.source=\" \";if(source!=null){if(typeof source==\"string\"){source=source.replace(\/\\r\\n\/g,\"\\n\");source=source.replace(\/\\r\/g,\"\\n\");this.source=source}else{if(source.innerHTML){this.source=source.innerHTML}}if(typeof this.source!=\"string\"){this.source=\"\"}}left=left||\"<\";var right=\">\";switch(left){case\"[\":right=\"]\";break;case\"<\":break;default:throw left+\" is not a supported deliminator\";break}this.scanner=new EJS.Scanner(this.source,left,right);this.out=\"\"};EJS.Compiler.prototype={compile:function(options,name){options=options||{};this.out=\"\";var put_cmd=\"___ViewO.push(\";var insert_cmd=put_cmd;var buff=new EJS.Buffer(this.pre_cmd,this.post_cmd);var content=\"\";var clean=function(content){content=content.replace(\/\\\\\/g,\"\\\\\\\\\");content=content.replace(\/\\n\/g,\"\\\\n\");content=content.replace(\/\"\/g,'\\\\\"');return content};this.scanner.scan(function(token,scanner){if(scanner.stag==null){switch(token){case\"\\n\":content=content+\"\\n\";buff.push(put_cmd+'\"'+clean(content)+'\");');buff.cr();content=\"\";break;case scanner.left_delimiter:case scanner.left_equal:case scanner.left_comment:scanner.stag=token;if(content.length>0){buff.push(put_cmd+'\"'+clean(content)+'\")')}content=\"\";break;case scanner.double_left:content=content+scanner.left_delimiter;break;default:content=content+token;break}}else{switch(token){case scanner.right_delimiter:switch(scanner.stag){case scanner.left_delimiter:if(content[content.length-1]==\"\\n\"){content=chop(content);buff.push(content);buff.cr()}else{buff.push(content)}break;case scanner.left_equal:buff.push(insert_cmd+\"(EJS.Scanner.to_text(\"+content+\")))\");break}scanner.stag=null;content=\"\";break;case scanner.double_right:content=content+scanner.right_delimiter;break;default:content=content+token;break}}});if(content.length>0){buff.push(put_cmd+'\"'+clean(content)+'\")')}buff.close();this.out=buff.script+\";\";var to_be_evaled=\"\/*\"+name+\"*\/this.process = function(_CONTEXT,_VIEW) { try { with(_VIEW) { with (_CONTEXT) {\"+this.out+\" return ___ViewO.join('');}}}catch(e){e.lineNumber=null;throw e;}};\";try{eval(to_be_evaled)}catch(e){if(typeof JSLINT!=\"undefined\"){JSLINT(this.out);for(var i=0;i<JSLINT.errors.length;i++){var error=JSLINT.errors[i];if(error.reason!=\"Unnecessary semicolon.\"){error.line++;var e=new Error();e.lineNumber=error.line;e.message=error.reason;if(options.view){e.fileName=options.view}throw e}}}else{throw e}}}};EJS.config=function(options){EJS.cache=options.cache!=null?options.cache:EJS.cache;EJS.type=options.type!=null?options.type:EJS.type;EJS.ext=options.ext!=null?options.ext:EJS.ext;var templates_directory=EJS.templates_directory||{};EJS.templates_directory=templates_directory;EJS.get=function(path,cache){if(cache==false){return null}if(templates_directory[path]){return templates_directory[path]}return null};EJS.update=function(path,template){if(path==null){return }templates_directory[path]=template};EJS.INVALID_PATH=-1};EJS.config({cache:true,type:\"<\",ext:\".ejs\"});EJS.Helpers=function(data,extras){this._data=data;this._extras=extras;extend(this,extras)};EJS.Helpers.prototype={view:function(options,data,helpers){if(!helpers){helpers=this._extras}if(!data){data=this._data}return new EJS(options).render(data,helpers)},to_text:function(input,null_text){if(input==null||input===undefined){return null_text||\"\"}if(input instanceof Date){return input.toDateString()}if(input.toString){return input.toString().replace(\/\\n\/g,\"<br \/>\").replace(\/''\/g,\"'\")}return\"\"}};EJS.newRequest=function(){var factories=[function(){return new ActiveXObject(\"Msxml2.XMLHTTP\")},function(){return new XMLHttpRequest()},function(){return new ActiveXObject(\"Microsoft.XMLHTTP\")}];for(var i=0;i<factories.length;i++){try{var request=factories[i]();if(request!=null){return request}}catch(e){continue}}};EJS.request=function(path){var request=new EJS.newRequest();request.open(\"GET\",path,false);try{request.send(null)}catch(e){return null}if(request.status==404||request.status==2||(request.status==0&&request.responseText==\"\")){return null}return request.responseText};EJS.ajax_request=function(params){params.method=(params.method?params.method:\"GET\");var request=new EJS.newRequest();request.onreadystatechange=function(){if(request.readyState==4){if(request.status==200){params.onComplete(request)}else{params.onComplete(request)}}};request.open(params.method,params.url);request.send(null)}})();EJS.Helpers.prototype.date_tag=function(C,O,A){if(!(O instanceof Date)){O=new Date()}var B=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];var G=[],D=[],P=[];var J=O.getFullYear();var H=O.getMonth();var N=O.getDate();for(var M=J-15;M<J+15;M++){G.push({value:M,text:M})}for(var E=0;E<12;E++){D.push({value:(E),text:B[E]})}for(var I=0;I<31;I++){P.push({value:(I+1),text:(I+1)})}var L=this.select_tag(C+\"[year]\",J,G,{id:C+\"[year]\"});var F=this.select_tag(C+\"[month]\",H,D,{id:C+\"[month]\"});var K=this.select_tag(C+\"[day]\",N,P,{id:C+\"[day]\"});return L+F+K};EJS.Helpers.prototype.form_tag=function(B,A){A=A||{};A.action=B;if(A.multipart==true){A.method=\"post\";A.enctype=\"multipart\/form-data\"}return this.start_tag_for(\"form\",A)};EJS.Helpers.prototype.form_tag_end=function(){return this.tag_end(\"form\")};EJS.Helpers.prototype.hidden_field_tag=function(A,C,B){return this.input_field_tag(A,C,\"hidden\",B)};EJS.Helpers.prototype.input_field_tag=function(A,D,C,B){B=B||{};B.id=B.id||A;B.value=D||\"\";B.type=C||\"text\";B.name=A;return this.single_tag_for(\"input\",B)};EJS.Helpers.prototype.is_current_page=function(A){return(window.location.href==A||window.location.pathname==A?true:false)};EJS.Helpers.prototype.link_to=function(B,A,C){if(!B){var B=\"null\"}if(!C){var C={}}if(C.confirm){C.onclick=' var ret_confirm = confirm(\"'+C.confirm+'\"); if(!ret_confirm){ return false;} ';C.confirm=null}C.href=A;return this.start_tag_for(\"a\",C)+B+this.tag_end(\"a\")};EJS.Helpers.prototype.submit_link_to=function(B,A,C){if(!B){var B=\"null\"}if(!C){var C={}}C.onclick=C.onclick||\"\";if(C.confirm){C.onclick=' var ret_confirm = confirm(\"'+C.confirm+'\"); if(!ret_confirm){ return false;} ';C.confirm=null}C.value=B;C.type=\"submit\";C.onclick=C.onclick+(A?this.url_for(A):\"\")+\"return false;\";return this.start_tag_for(\"input\",C)};EJS.Helpers.prototype.link_to_if=function(F,B,A,D,C,E){return this.link_to_unless((F==false),B,A,D,C,E)};EJS.Helpers.prototype.link_to_unless=function(E,B,A,C,D){C=C||{};if(E){if(D&&typeof D==\"function\"){return D(B,A,C,D)}else{return B}}else{return this.link_to(B,A,C)}};EJS.Helpers.prototype.link_to_unless_current=function(B,A,C,D){C=C||{};return this.link_to_unless(this.is_current_page(A),B,A,C,D)};EJS.Helpers.prototype.password_field_tag=function(A,C,B){return this.input_field_tag(A,C,\"password\",B)};EJS.Helpers.prototype.select_tag=function(D,G,H,F){F=F||{};F.id=F.id||D;F.value=G;F.name=D;var B=\"\";B+=this.start_tag_for(\"select\",F);for(var E=0;E<H.length;E++){var C=H[E];var A={value:C.value};if(C.value==G){A.selected=\"selected\"}B+=this.start_tag_for(\"option\",A)+C.text+this.tag_end(\"option\")}B+=this.tag_end(\"select\");return B};EJS.Helpers.prototype.single_tag_for=function(A,B){return this.tag(A,B,\"\/>\")};EJS.Helpers.prototype.start_tag_for=function(A,B){return this.tag(A,B)};EJS.Helpers.prototype.submit_tag=function(A,B){B=B||{};B.type=B.type||\"submit\";B.value=A||\"Submit\";return this.single_tag_for(\"input\",B)};EJS.Helpers.prototype.tag=function(C,E,D){if(!D){var D=\">\"}var B=\" \";for(var A in E){if(E[A]!=null){var F=E[A].toString()}else{var F=\"\"}if(A==\"Class\"){A=\"class\"}if(F.indexOf(\"'\")!=-1){B+=A+'=\"'+F+'\" '}else{B+=A+\"='\"+F+\"' \"}}return\"<\"+C+B+D};EJS.Helpers.prototype.tag_end=function(A){return\"<\/\"+A+\">\"};EJS.Helpers.prototype.text_area_tag=function(A,C,B){B=B||{};B.id=B.id||A;B.name=B.name||A;C=C||\"\";if(B.size){B.cols=B.size.split(\"x\")[0];B.rows=B.size.split(\"x\")[1];delete B.size}B.cols=B.cols||50;B.rows=B.rows||4;return this.start_tag_for(\"textarea\",B)+C+this.tag_end(\"textarea\")};EJS.Helpers.prototype.text_tag=EJS.Helpers.prototype.text_area_tag;EJS.Helpers.prototype.text_field_tag=function(A,C,B){return this.input_field_tag(A,C,\"text\",B)};EJS.Helpers.prototype.url_for=function(A){return'window.location=\"'+A+'\";'};EJS.Helpers.prototype.img_tag=function(B,C,A){A=A||{};A.src=B;A.alt=C;return this.single_tag_for(\"img\",A)}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/EmbeddedJS-1.0\/js\/ejs_viewhelpers.js?ver=1.0.4":"\nEJS.Helpers.prototype.date_tag = function(name, value , html_options) {\n    if(! (value instanceof Date))\n\t\tvalue = new Date()\n\t\n\tvar month_names = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n\tvar years = [], months = [], days =[];\n\tvar year = value.getFullYear();\n\tvar month = value.getMonth();\n\tvar day = value.getDate();\n\tfor(var y = year - 15; y < year+15 ; y++)\n\t{\n\t\tyears.push({value: y, text: y})\n\t}\n\tfor(var m = 0; m < 12; m++)\n\t{\n\t\tmonths.push({value: (m), text: month_names[m]})\n\t}\n\tfor(var d = 0; d < 31; d++)\n\t{\n\t\tdays.push({value: (d+1), text: (d+1)})\n\t}\n\tvar year_select = this.select_tag(name+'[year]', year, years, {id: name+'[year]'} )\n\tvar month_select = this.select_tag(name+'[month]', month, months, {id: name+'[month]'})\n\tvar day_select = this.select_tag(name+'[day]', day, days, {id: name+'[day]'})\n\t\n    return year_select+month_select+day_select;\n}\n\nEJS.Helpers.prototype.form_tag = function(action, html_options) {\n                 \n    \n    html_options     = html_options                     || {};\n\thtml_options.action = action\n    if(html_options.multipart == true) {\n        html_options.method = 'post';\n        html_options.enctype = 'multipart\/form-data';\n    }\n    \n    return this.start_tag_for('form', html_options)\n}\n\nEJS.Helpers.prototype.form_tag_end = function() { return this.tag_end('form'); }\n\nEJS.Helpers.prototype.hidden_field_tag   = function(name, value, html_options) { \n    return this.input_field_tag(name, value, 'hidden', html_options); \n}\n\nEJS.Helpers.prototype.input_field_tag = function(name, value , inputType, html_options) {\n    \n    html_options = html_options || {};\n    html_options.id  = html_options.id  || name;\n    html_options.value = value || '';\n    html_options.type = inputType || 'text';\n    html_options.name = name;\n    \n    return this.single_tag_for('input', html_options)\n}\n\nEJS.Helpers.prototype.is_current_page = function(url) {\n\treturn (window.location.href == url || window.location.pathname == url ? true : false);\n}\n\nEJS.Helpers.prototype.link_to = function(name, url, html_options) {\n    if(!name) var name = 'null';\n    if(!html_options) var html_options = {}\n\t\n\tif(html_options.confirm){\n\t\thtml_options.onclick = \n\t\t\" var ret_confirm = confirm(\\\"\"+html_options.confirm+\"\\\"); if(!ret_confirm){ return false;} \"\n\t\thtml_options.confirm = null;\n\t}\n    html_options.href=url\n    return this.start_tag_for('a', html_options)+name+ this.tag_end('a');\n}\n\nEJS.Helpers.prototype.submit_link_to = function(name, url, html_options){\n\tif(!name) var name = 'null';\n    if(!html_options) var html_options = {}\n    html_options.onclick = html_options.onclick  || '' ;\n\t\n\tif(html_options.confirm){\n\t\thtml_options.onclick = \n\t\t\" var ret_confirm = confirm(\\\"\"+html_options.confirm+\"\\\"); if(!ret_confirm){ return false;} \"\n\t\thtml_options.confirm = null;\n\t}\n\t\n    html_options.value = name;\n\thtml_options.type = 'submit'\n    html_options.onclick=html_options.onclick+\n\t\t(url ? this.url_for(url) : '')+'return false;';\n    \/\/html_options.href='#'+(options ? Routes.url_for(options) : '')\n\treturn this.start_tag_for('input', html_options)\n}\n\nEJS.Helpers.prototype.link_to_if = function(condition, name, url, html_options, post, block) {\n\treturn this.link_to_unless((condition == false), name, url, html_options, post, block);\n}\n\nEJS.Helpers.prototype.link_to_unless = function(condition, name, url, html_options, block) {\n\thtml_options = html_options || {};\n\tif(condition) {\n\t\tif(block && typeof block == 'function') {\n\t\t\treturn block(name, url, html_options, block);\n\t\t} else {\n\t\t\treturn name;\n\t\t}\n\t} else\n\t\treturn this.link_to(name, url, html_options);\n}\n\nEJS.Helpers.prototype.link_to_unless_current = function(name, url, html_options, block) {\n\thtml_options = html_options || {};\n\treturn this.link_to_unless(this.is_current_page(url), name, url, html_options, block)\n}\n\n\nEJS.Helpers.prototype.password_field_tag = function(name, value, html_options) { return this.input_field_tag(name, value, 'password', html_options); }\n\nEJS.Helpers.prototype.select_tag = function(name, value, choices, html_options) {     \n    html_options = html_options || {};\n    html_options.id  = html_options.id  || name;\n    html_options.value = value;\n\thtml_options.name = name;\n    \n    var txt = ''\n    txt += this.start_tag_for('select', html_options)\n    \n    for(var i = 0; i < choices.length; i++)\n    {\n        var choice = choices[i];\n        var optionOptions = {value: choice.value}\n        if(choice.value == value)\n            optionOptions.selected ='selected'\n        txt += this.start_tag_for('option', optionOptions )+choice.text+this.tag_end('option')\n    }\n    txt += this.tag_end('select');\n    return txt;\n}\n\nEJS.Helpers.prototype.single_tag_for = function(tag, html_options) { return this.tag(tag, html_options, '\/>');}\n\nEJS.Helpers.prototype.start_tag_for = function(tag, html_options)  { return this.tag(tag, html_options); }\n\nEJS.Helpers.prototype.submit_tag = function(name, html_options) {  \n    html_options = html_options || {};\n    \/\/html_options.name  = html_options.id  || 'commit';\n    html_options.type = html_options.type  || 'submit';\n    html_options.value = name || 'Submit';\n    return this.single_tag_for('input', html_options);\n}\n\nEJS.Helpers.prototype.tag = function(tag, html_options, end) {\n    if(!end) var end = '>'\n    var txt = ' '\n    for(var attr in html_options) { \n\t   if(html_options[attr] != null)\n        var value = html_options[attr].toString();\n       else\n        var value=''\n       if(attr == \"Class\") \/\/ special case because \"class\" is a reserved word in IE\n        attr = \"class\";\n       if( value.indexOf(\"'\") != -1 )\n            txt += attr+'=\\\"'+value+'\\\" ' \n       else\n            txt += attr+\"='\"+value+\"' \" \n    }\n    return '<'+tag+txt+end;\n}\n\nEJS.Helpers.prototype.tag_end = function(tag)             { return '<\/'+tag+'>'; }\n\nEJS.Helpers.prototype.text_area_tag = function(name, value, html_options) { \n    html_options = html_options || {};\n    html_options.id  = html_options.id  || name;\n    html_options.name  = html_options.name  || name;\n\tvalue = value || ''\n    if(html_options.size) {\n        html_options.cols = html_options.size.split('x')[0]\n        html_options.rows = html_options.size.split('x')[1];\n        delete html_options.size\n    }\n    \n    html_options.cols = html_options.cols  || 50;\n    html_options.rows = html_options.rows  || 4;\n    \n    return  this.start_tag_for('textarea', html_options)+value+this.tag_end('textarea')\n}\nEJS.Helpers.prototype.text_tag = EJS.Helpers.prototype.text_area_tag\n\nEJS.Helpers.prototype.text_field_tag     = function(name, value, html_options) { return this.input_field_tag(name, value, 'text', html_options); }\n\nEJS.Helpers.prototype.url_for = function(url) {\n        return 'window.location=\"'+url+'\";'\n}\nEJS.Helpers.prototype.img_tag = function(image_location, alt, options){\n\toptions = options || {};\n\toptions.src = image_location\n\toptions.alt = alt\n\treturn this.single_tag_for('img', options)\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/js\/multichoice.js?ver=1.10.4":"\n\/*global EJS*\/\n\/\/ Will render a Question with multiple choices for answers.\n\n\/\/ Options format:\n\/\/ {\n\/\/   title: \"Optional title for question box\",\n\/\/   question: \"Question text\",\n\/\/   answers: [{text: \"Answer text\", correct: false}, ...],\n\/\/   singleAnswer: true, \/\/ or false, will change rendered output slightly.\n\/\/   singlePoint: true,  \/\/ True if question give a single point score only\n\/\/                       \/\/ if all are correct, false to give 1 point per\n\/\/                       \/\/ correct answer. (Only for singleAnswer=false)\n\/\/   randomAnswers: false  \/\/ Whether to randomize the order of answers.\n\/\/ }\n\/\/\n\/\/ Events provided:\n\/\/ - h5pQuestionAnswered: Triggered when a question has been answered.\n\nvar H5P = H5P || {};\n\n\/**\n * @typedef {Object} Options\n *   Options for multiple choice\n *\n * @property {Object} behaviour\n * @property {boolean} behaviour.confirmCheckDialog\n * @property {boolean} behaviour.confirmRetryDialog\n *\n * @property {Object} UI\n * @property {string} UI.tipsLabel\n *\n * @property {Object} [confirmRetry]\n * @property {string} [confirmRetry.header]\n * @property {string} [confirmRetry.body]\n * @property {string} [confirmRetry.cancelLabel]\n * @property {string} [confirmRetry.confirmLabel]\n *\n * @property {Object} [confirmCheck]\n * @property {string} [confirmCheck.header]\n * @property {string} [confirmCheck.body]\n * @property {string} [confirmCheck.cancelLabel]\n * @property {string} [confirmCheck.confirmLabel]\n *\/\n\n\/**\n * Module for creating a multiple choice question\n *\n * @param {Options} options\n * @param {number} contentId\n * @param {Object} contentData\n * @returns {H5P.MultiChoice}\n * @constructor\n *\/\nH5P.MultiChoice = function (options, contentId, contentData) {\n  if (!(this instanceof H5P.MultiChoice))\n    return new H5P.MultiChoice(options, contentId, contentData);\n  var self = this;\n  this.contentId = contentId;\n  H5P.Question.call(self, 'multichoice');\n  var $ = H5P.jQuery;\n\n  \/\/ checkbox or radiobutton\n  var texttemplate =\n    '<ul class=\"h5p-answers\" role=\"<%= role %>\" aria-labelledby=\"<%= label %>\">' +\n    '  <% for (var i=0; i < answers.length; i++) { %>' +\n    '    <li class=\"h5p-answer\" role=\"<%= answers[i].role %>\" tabindex=\"<%= answers[i].tabindex %>\" aria-checked=\"<%= answers[i].checked %>\" data-id=\"<%= i %>\">' +\n    '      <div class=\"h5p-alternative-container\">' +\n    '        <span class=\"h5p-alternative-inner\"><%= answers[i].text %><\/span><span class=\"h5p-hidden-read\">.<\/span>' +\n    '      <\/div>' +\n    '      <div class=\"h5p-clearfix\"><\/div>' +\n    '    <\/li>' +\n    '  <% } %>' +\n    '<\/ul>';\n\n  var defaults = {\n    image: null,\n    question: \"No question text provided\",\n    answers: [\n      {\n        tipsAndFeedback: {\n          tip: '',\n          chosenFeedback: '',\n          notChosenFeedback: ''\n        },\n        text: \"Answer 1\",\n        correct: true\n      }\n    ],\n    overallFeedback: [],\n    weight: 1,\n    userAnswers: [],\n    UI: {\n      checkAnswerButton: 'Check',\n      showSolutionButton: 'Show solution',\n      tryAgainButton: 'Try again',\n      scoreBarLabel: 'You got :num out of :total points',\n      tipAvailable: \"Tip available\",\n      feedbackAvailable: \"Feedback available\",\n      readFeedback: 'Read feedback',\n      shouldCheck: \"Should have been checked\",\n      shouldNotCheck: \"Should not have been checked\",\n      noInput: 'Input is required before viewing the solution'\n    },\n    behaviour: {\n      enableRetry: true,\n      enableSolutionsButton: true,\n      type: 'auto',\n      singlePoint: true,\n      randomAnswers: false,\n      showSolutionsRequiresInput: true,\n      disableImageZooming: false,\n      autoCheck: false,\n      passPercentage: 100,\n      showScorePoints: true\n    }\n  };\n  var template = new EJS({text: texttemplate});\n  var params = $.extend(true, defaults, options);\n  \/\/ Keep track of number of correct choices\n  var numCorrect = 0;\n\n  \/\/ Loop through choices\n  for (var i = 0; i < params.answers.length; i++) {\n    var answer = params.answers[i];\n\n    \/\/ Make sure tips and feedback exists\n    answer.tipsAndFeedback = answer.tipsAndFeedback || {};\n\n    if (params.answers[i].correct) {\n      \/\/ Update number of correct choices\n      numCorrect++;\n    }\n  }\n\n  \/\/ Determine if no choices is the correct\n  var blankIsCorrect = (numCorrect === 0);\n\n  \/\/ Determine task type\n  if (params.behaviour.type === 'auto') {\n    \/\/ Use single choice if only one choice is correct\n    params.behaviour.singleAnswer = (numCorrect === 1);\n  }\n  else {\n    params.behaviour.singleAnswer = (params.behaviour.type === 'single');\n  }\n\n  var getCheckboxOrRadioIcon = function (radio, selected) {\n    var icon;\n    if (radio) {\n      icon = selected ? '&#xe603;' : '&#xe600;';\n    }\n    else {\n      icon = selected ? '&#xe601;' : '&#xe602;';\n    }\n    return icon;\n  };\n\n  \/\/ Initialize buttons and elements.\n  var $myDom;\n  var $feedbackDialog;\n\n  \/**\n   * Remove all feedback dialogs\n   *\/\n  var removeFeedbackDialog = function () {\n    \/\/ Remove the open feedback dialogs.\n    $myDom.unbind('click', removeFeedbackDialog);\n    $myDom.find('.h5p-feedback-button, .h5p-feedback-dialog').remove();\n    $myDom.find('.h5p-has-feedback').removeClass('h5p-has-feedback');\n    if ($feedbackDialog) {\n      $feedbackDialog.remove();\n    }\n  };\n\n  var score = 0;\n  var solutionsVisible = false;\n\n  \/**\n   * Add feedback to element\n   * @param {jQuery} $element Element that feedback will be added to\n   * @param {string} feedback Feedback string\n   *\/\n  var addFeedback = function ($element, feedback) {\n    $feedbackDialog = $('' +\n    '<div class=\"h5p-feedback-dialog\">' +\n      '<div class=\"h5p-feedback-inner\">' +\n        '<div class=\"h5p-feedback-text\" aria-hidden=\"true\">' + feedback + '<\/div>' +\n      '<\/div>' +\n    '<\/div>');\n\n    \/\/make sure feedback is only added once\n    if (!$element.find($('.h5p-feedback-dialog')).length) {\n      $feedbackDialog.appendTo($element.addClass('h5p-has-feedback'));\n    }\n  };\n\n  \/**\n   * Register the different parts of the task with the H5P.Question structure.\n   *\/\n  self.registerDomElements = function () {\n    if (params.media && params.media.library) {\n      var type = params.media.library.split(' ')[0];\n      if (type === 'H5P.Image') {\n        if (params.media.params.file) {\n          \/\/ Register task image\n          self.setImage(params.media.params.file.path, {\n            disableImageZooming: params.behaviour.disableImageZooming,\n            alt: params.media.params.alt\n          });\n        }\n      }\n      else if (type === 'H5P.Video') {\n        if (params.media.params.sources) {\n          \/\/ Register task video\n          self.setVideo(params.media);\n        }\n      }\n    }\n\n    \/\/ Determine if we're using checkboxes or radio buttons\n    for (var i = 0; i < params.answers.length; i++) {\n      params.answers[i].checkboxOrRadioIcon = getCheckboxOrRadioIcon(params.behaviour.singleAnswer, params.userAnswers.indexOf(i) > -1);\n    }\n\n    \/\/ Register Introduction\n    self.setIntroduction('<div id=\"' + params.label + '\">' + params.question + '<\/div>');\n\n    \/\/ Register task content area\n    $myDom = $(template.render(params));\n    self.setContent($myDom, {\n      'class': params.behaviour.singleAnswer ? 'h5p-radio' : 'h5p-check'\n    });\n\n    \/\/ Create tips:\n    var $answers = $('.h5p-answer', $myDom).each(function (i) {\n\n      var tip = params.answers[i].tipsAndFeedback.tip;\n      if (tip === undefined) {\n        return; \/\/ No tip\n      }\n\n      tip = tip.trim();\n      var tipContent = tip\n        .replace(\/&nbsp;\/g, '')\n        .replace(\/<p>\/g, '')\n        .replace(\/<\\\/p>\/g, '')\n        .trim();\n      if (!tipContent.length) {\n        return; \/\/ Empty tip\n      }\n      else {\n        $(this).addClass('h5p-has-tip');\n      }\n\n      \/\/ Add tip\n      var $wrap = $('<div\/>', {\n        'class': 'h5p-multichoice-tipwrap',\n        'aria-label': params.UI.tipAvailable + '.'\n      });\n\n      var $multichoiceTip = $('<div>', {\n        'role': 'button',\n        'tabindex': 0,\n        'title': params.UI.tipsLabel,\n        'aria-label': params.UI.tipsLabel,\n        'aria-expanded': false,\n        'class': 'multichoice-tip',\n        appendTo: $wrap\n      });\n\n      var tipIconHtml = '<span class=\"joubel-icon-tip-normal\">' +\n                          '<span class=\"h5p-icon-shadow\"><\/span>' +\n                          '<span class=\"h5p-icon-speech-bubble\"><\/span>' +\n                          '<span class=\"h5p-icon-info\"><\/span>' +\n                        '<\/span>';\n\n      $multichoiceTip.append(tipIconHtml);\n\n      $multichoiceTip.click(function () {\n        var $tipContainer = $multichoiceTip.parents('.h5p-answer');\n        var openFeedback = !$tipContainer.children('.h5p-feedback-dialog').is($feedbackDialog);\n        removeFeedbackDialog();\n\n        \/\/ Do not open feedback if it was open\n        if (openFeedback) {\n          $multichoiceTip.attr('aria-expanded', true);\n\n          \/\/ Add tip dialog\n          addFeedback($tipContainer, tip);\n          $feedbackDialog.addClass('h5p-has-tip');\n\n          \/\/ Tip for readspeaker\n          self.read(tip);\n        }\n        else {\n          $multichoiceTip.attr('aria-expanded', false);\n        }\n\n        self.trigger('resize');\n\n        \/\/ Remove tip dialog on dom click\n        setTimeout(function () {\n          $myDom.click(removeFeedbackDialog);\n        }, 100);\n\n        \/\/ Do not propagate\n        return false;\n      }).keydown(function (e) {\n        if (e.which === 32) {\n          $(this).click();\n          return false;\n        }\n      });\n\n      $('.h5p-alternative-container', this).append($wrap);\n    });\n\n    \/\/ Set event listeners.\n    var toggleCheck = function ($ans) {\n      if ($ans.attr('aria-disabled') === 'true') {\n        return;\n      }\n      self.answered = true;\n      var num = parseInt($ans.data('id'));\n      if (params.behaviour.singleAnswer) {\n        \/\/ Store answer\n        params.userAnswers[0] = num;\n\n        \/\/ Calculate score\n        score = (params.answers[num].correct ? 1 : 0);\n\n        \/\/ De-select previous answer\n        $answers.not($ans).removeClass('h5p-selected').attr('tabindex', '-1').attr('aria-checked', 'false');\n\n        \/\/ Select new answer\n        $ans.addClass('h5p-selected').attr('tabindex', '0').attr('aria-checked', 'true');\n      }\n      else {\n        if ($ans.attr('aria-checked') === 'true') {\n\n          \/\/ Do not allow un-checking when retry disabled and auto check\n          if (params.behaviour.autoCheck && !params.behaviour.enableRetry) {\n            return;\n          }\n\n          \/\/ Remove check\n          $ans.removeClass('h5p-selected').attr('aria-checked', 'false');\n        }\n        else {\n          $ans.addClass('h5p-selected').attr('aria-checked', 'true');\n        }\n\n        \/\/ Calculate score\n        calcScore();\n      }\n\n      self.triggerXAPI('interacted');\n      hideSolution($ans);\n\n      if (params.userAnswers.length) {\n        self.showButton('check-answer');\n        self.hideButton('try-again');\n        self.hideButton('show-solution');\n\n        if (params.behaviour.autoCheck) {\n          if (params.behaviour.singleAnswer) {\n            \/\/ Only a single answer allowed\n            checkAnswer();\n          }\n          else {\n            \/\/ Show feedback for selected alternatives\n            self.showCheckSolution(true);\n\n            \/\/ Always finish task if it was completed successfully\n            if (score === self.getMaxScore()) {\n              checkAnswer();\n            }\n          }\n        }\n      }\n    };\n\n    $answers.click(function () {\n      toggleCheck($(this));\n    }).keydown(function (e) {\n      if (e.keyCode === 32) { \/\/ Space bar\n        \/\/ Select current item\n        toggleCheck($(this));\n        return false;\n      }\n\n      if (params.behaviour.singleAnswer) {\n        switch (e.keyCode) {\n          case 38:   \/\/ Up\n          case 37: { \/\/ Left\n            \/\/ Try to select previous item\n            var $prev = $(this).prev();\n            if ($prev.length) {\n              toggleCheck($prev.focus());\n            }\n            return false;\n          }\n          case 40:   \/\/ Down\n          case 39: { \/\/ Right\n            \/\/ Try to select next item\n            var $next = $(this).next();\n            if ($next.length) {\n              toggleCheck($next.focus());\n            }\n            return false;\n          }\n        }\n      }\n    });\n\n    if (params.behaviour.singleAnswer) {\n      \/\/ Special focus handler for radio buttons\n      $answers.focus(function () {\n        if ($(this).attr('aria-disabled') !== 'true') {\n          $answers.not(this).attr('tabindex', '-1');\n        }\n      }).blur(function () {\n        if (!$answers.filter('.h5p-selected').length) {\n          $answers.first().add($answers.last()).attr('tabindex', '0');\n        }\n      });\n    }\n\n    \/\/ Adds check and retry button\n    addButtons();\n    if (!params.behaviour.singleAnswer) {\n\n      calcScore();\n    }\n    else {\n      if (params.userAnswers.length && params.answers[params.userAnswers[0]].correct) {\n        score = 1;\n      }\n      else {\n        score = 0;\n      }\n    }\n\n    \/\/ Has answered through auto-check in a previous session\n    if (hasCheckedAnswer && params.behaviour.autoCheck) {\n\n      \/\/ Check answers if answer has been given or max score reached\n      if (params.behaviour.singleAnswer || score === self.getMaxScore()) {\n        checkAnswer();\n      }\n      else {\n        \/\/ Show feedback for checked checkboxes\n        self.showCheckSolution(true);\n      }\n    }\n  };\n\n  this.showAllSolutions = function () {\n    if (solutionsVisible) {\n      return;\n    }\n    solutionsVisible = true;\n\n    $myDom.find('.h5p-answer').each(function (i, e) {\n      var $e = $(e);\n      var a = params.answers[i];\n      if (a.correct) {\n        $e.addClass('h5p-should').append($('<span\/>', {\n          'class': 'h5p-solution-icon',\n          html: params.UI.shouldCheck + '.'\n        }));\n      }\n      else {\n        $e.addClass('h5p-should-not').append($('<span\/>', {\n          'class': 'h5p-solution-icon',\n          html: params.UI.shouldNotCheck + '.'\n        }));\n      }\n    }).find('.h5p-question-plus-one, .h5p-question-minus-one').remove();\n\n    \/\/ Make sure input is disabled in solution mode\n    disableInput();\n\n    \/\/Hide buttons and retry depending on settings.\n    self.hideButton('check-answer');\n    self.hideButton('show-solution');\n    if (params.behaviour.enableRetry) {\n      self.showButton('try-again');\n    }\n    self.trigger('resize');\n  };\n\n  \/**\n   * Used in contracts.\n   * Shows the solution for the task and hides all buttons.\n   *\/\n  this.showSolutions = function () {\n    removeFeedbackDialog();\n    self.showCheckSolution();\n    self.showAllSolutions();\n    disableInput();\n    self.hideButton('try-again');\n  };\n\n  \/**\n   * Hide solution for the given answer(s)\n   *\n   * @private\n   * @param {H5P.jQuery} $answer\n   *\/\n  var hideSolution = function ($answer) {\n    $answer\n      .removeClass('h5p-correct')\n      .removeClass('h5p-wrong')\n      .removeClass('h5p-should')\n      .removeClass('h5p-should-not')\n      .removeClass('h5p-has-feedback')\n      .find('.h5p-question-plus-one, .h5p-question-minus-one, .h5p-answer-icon, .h5p-solution-icon, .h5p-feedback-dialog').remove();\n  };\n\n  \/**\n   *\n   *\/\n  this.hideSolutions = function () {\n    solutionsVisible = false;\n\n    hideSolution($('.h5p-answer', $myDom));\n\n    this.removeFeedback(); \/\/ Reset feedback\n\n    self.trigger('resize');\n  };\n\n  \/**\n   * Resets the whole task.\n   * Used in contracts with integrated content.\n   * @private\n   *\/\n  this.resetTask = function () {\n    self.answered = false;\n    self.hideSolutions();\n    params.userAnswers = [];\n    removeSelections();\n    self.showButton('check-answer');\n    self.hideButton('try-again');\n    self.hideButton('show-solution');\n    enableInput();\n    $myDom.find('.h5p-feedback-available').remove();\n  };\n\n  var calculateMaxScore = function () {\n    if (blankIsCorrect) {\n      return params.weight;\n    }\n    var maxScore = 0;\n    for (var i = 0; i < params.answers.length; i++) {\n      var choice = params.answers[i];\n      if (choice.correct) {\n        maxScore += (choice.weight !== undefined ? choice.weight : 1);\n      }\n    }\n    return maxScore;\n  };\n\n  this.getMaxScore = function () {\n    return (!params.behaviour.singleAnswer && !params.behaviour.singlePoint ? calculateMaxScore() : params.weight);\n  };\n\n  \/**\n   * Check answer\n   *\/\n  var checkAnswer = function () {\n    \/\/ Unbind removal of feedback dialogs on click\n    $myDom.unbind('click', removeFeedbackDialog);\n\n    \/\/ Remove all tip dialogs\n    removeFeedbackDialog();\n\n    self.hideButton('check-answer');\n    if (params.behaviour.enableSolutionsButton) {\n      self.showButton('show-solution');\n    }\n    if (params.behaviour.enableRetry) {\n      self.showButton('try-again');\n    }\n\n    self.showCheckSolution();\n    disableInput();\n\n    var xAPIEvent = self.createXAPIEventTemplate('answered');\n    addQuestionToXAPI(xAPIEvent);\n    addResponseToXAPI(xAPIEvent);\n    self.trigger(xAPIEvent);\n    self.trigger('resize');\n  };\n\n  \/**\n   * Determine if any of the radios or checkboxes have been checked.\n   *\n   * @return {boolean}\n   *\/\n  var isAnswerSelected = function () {\n    return !!$('.h5p-answer[aria-checked=\"true\"]', $myDom).length;\n  };\n\n  \/**\n   * Adds the ui buttons.\n   * @private\n   *\/\n  var addButtons = function () {\n    var $content = $('[data-content-id=\"' + self.contentId + '\"].h5p-content');\n    var $containerParents = $content.parents('.h5p-container');\n\n    \/\/ select find container to attach dialogs to\n    var $container;\n    if($containerParents.length !== 0) {\n      \/\/ use parent highest up if any\n      $container = $containerParents.last();\n    }\n    else if($content.length !== 0){\n      $container = $content;\n    }\n    else  {\n      $container = $(document.body);\n    }\n\n    \/\/ Show solution button\n    self.addButton('show-solution', params.UI.showSolutionButton, function () {\n\n      if (params.behaviour.showSolutionsRequiresInput && !isAnswerSelected()) {\n        \/\/ Require answer before solution can be viewed\n        self.updateFeedbackContent(params.UI.noInput);\n        self.read(params.UI.noInput);\n      }\n      else {\n        calcScore();\n        self.showAllSolutions();\n      }\n\n    }, false);\n\n    \/\/ Check solution button\n    if (!params.behaviour.autoCheck || !params.behaviour.singleAnswer) {\n      self.addButton('check-answer', params.UI.checkAnswerButton,\n        function () {\n          self.answered = true;\n          checkAnswer();\n        },\n        true,\n        {},\n        {\n          confirmationDialog: {\n            enable: params.behaviour.confirmCheckDialog,\n            l10n: params.confirmCheck,\n            instance: self,\n            $parentElement: $container\n          }\n        }\n      );\n    }\n\n    \/\/ Try Again button\n    self.addButton('try-again', params.UI.tryAgainButton, function () {\n      self.showButton('check-answer');\n      self.hideButton('try-again');\n      self.hideButton('show-solution');\n      self.hideSolutions();\n      removeSelections();\n      enableInput();\n      $myDom.find('.h5p-feedback-available').remove();\n      self.answered = false;\n      if (params.behaviour.randomAnswers) {\n        \/\/ reshuffle answers\n       var oldIdMap = idMap;\n       idMap = getShuffleMap();\n       var answersDisplayed = $myDom.find('.h5p-answer');\n       \/\/ remember tips\n       var tip = [];\n       for (i = 0; i < answersDisplayed.length; i++) {\n         tip[i] = $(answersDisplayed[i]).find('.h5p-multichoice-tipwrap');\n       }\n       \/\/ Those two loops cannot be merged or you'll screw up your tips\n       for (i = 0; i < answersDisplayed.length; i++) {\n         \/\/ move tips and answers on display\n         $(answersDisplayed[i]).find('.h5p-alternative-inner').html(params.answers[i].text);\n         $(tip[i]).detach().appendTo($(answersDisplayed[idMap.indexOf(oldIdMap[i])]).find('.h5p-alternative-container'));\n       }\n     }\n    }, false, {}, {\n      confirmationDialog: {\n        enable: params.behaviour.confirmRetryDialog,\n        l10n: params.confirmRetry,\n        instance: self,\n        $parentElement: $container\n      }\n    });\n  };\n\n  \/**\n   * @private\n   *\/\n  var insertFeedback = function ($e, feedback) {\n    \/\/ Add visuals\n    addFeedback($e, feedback);\n\n    \/\/ Add button for readspeakers\n    var $wrap = $('<div\/>', {\n      'class': 'h5p-hidden-read h5p-feedback-available',\n      'aria-label': params.UI.feedbackAvailable + '.'\n    });\n    $('<div\/>', {\n      'role': 'button',\n      'tabindex': 0,\n      'aria-label': params.UI.readFeedback + '.',\n      appendTo: $wrap,\n      on: {\n        keydown: function (e) {\n          if (e.which === 32) { \/\/ Space\n            self.read(feedback);\n            return false;\n          }\n        }\n      }\n    });\n    $wrap.appendTo($e);\n  };\n\n  \/**\n   * Determine which feedback text to display\n   *\n   * @param {number} score\n   * @param {number} max\n   * @return {string}\n   *\/\n  var getFeedbackText = function (score, max) {\n    var ratio = (score \/ max);\n\n    var feedback = H5P.Question.determineOverallFeedback(params.overallFeedback, ratio);\n\n    return feedback.replace('@score', score).replace('@total', max);\n  };\n\n  \/**\n   * Shows feedback on the selected fields.\n   * @public\n   * @param {boolean} [skipFeedback] Skip showing feedback if true\n   *\/\n  this.showCheckSolution = function (skipFeedback) {\n    var scorePoints;\n    if (!(params.behaviour.singleAnswer || params.behaviour.singlePoint || !params.behaviour.showScorePoints)) {\n      scorePoints = new H5P.Question.ScorePoints();\n    }\n\n    $myDom.find('.h5p-answer').each(function (i, e) {\n      var $e = $(e);\n      var a = params.answers[i];\n      var chosen = ($e.attr('aria-checked') === 'true');\n      if (chosen) {\n        if (a.correct) {\n          $e.addClass('h5p-correct').append($('<span\/>', {\n            'class': 'h5p-answer-icon',\n            html: params.UI.correctAnswer + '.'\n          }));\n        }\n        else {\n          $e.addClass('h5p-wrong').append($('<span\/>', {\n            'class': 'h5p-answer-icon',\n            html: params.UI.wrongAnswer + '.'\n          }));\n        }\n\n        if (scorePoints) {\n          var alternativeContainer = $e[0].querySelector('.h5p-alternative-container');\n\n          if (!params.behaviour.autoCheck || alternativeContainer.querySelector('.h5p-question-plus-one, .h5p-question-minus-one') === null) {\n            alternativeContainer.appendChild(scorePoints.getElement(a.correct));\n          }\n        }\n      }\n\n      if (!skipFeedback) {\n        if (chosen && a.tipsAndFeedback.chosenFeedback !== undefined && a.tipsAndFeedback.chosenFeedback !== '') {\n          insertFeedback($e, a.tipsAndFeedback.chosenFeedback);\n        }\n        else if (!chosen && a.tipsAndFeedback.notChosenFeedback !== undefined && a.tipsAndFeedback.notChosenFeedback !== '') {\n          insertFeedback($e, a.tipsAndFeedback.notChosenFeedback);\n        }\n      }\n    });\n\n    \/\/ Determine feedback\n    var max = self.getMaxScore();\n\n    \/\/ Show feedback\n    if (!skipFeedback) {\n      this.setFeedback(getFeedbackText(score, max), score, max, params.UI.scoreBarLabel);\n    }\n\n    \/\/ Disable task if maxscore is achieved\n    var fullScore = (score === max);\n    if (fullScore) {\n      finishedTask();\n    }\n\n    self.trigger('resize');\n  };\n\n  \/**\n   * Method to use when the task is correctly answered, removes all buttons and disables input.\n   *\/\n  var finishedTask = function () {\n    self.hideButton('check-answer');\n    self.hideButton('try-again');\n    self.hideButton('show-solution');\n    self.trigger('resize');\n  };\n\n  \/**\n   * Disables choosing new input.\n   *\/\n  var disableInput = function () {\n    $('.h5p-answer', $myDom).attr({\n      'aria-disabled': 'true',\n      'tabindex': '-1'\n    });\n  };\n\n  \/**\n   * Enables new input.\n   *\/\n  var enableInput = function () {\n    $('.h5p-answer', $myDom).attr('aria-disabled', 'false');\n  };\n\n  var calcScore = function () {\n    score = 0;\n    params.userAnswers = [];\n    $('.h5p-answer', $myDom).each(function (idx, el) {\n      var $el = $(el);\n      if ($el.attr('aria-checked') === 'true') {\n        var choice = params.answers[idx];\n        var weight = (choice.weight !== undefined ? choice.weight : 1);\n        if (choice.correct) {\n          score += weight;\n        }\n        else {\n          score -= weight;\n        }\n        var num = parseInt($(el).data('id'));\n        params.userAnswers.push(num);\n      }\n    });\n    if (score < 0) {\n      score = 0;\n    }\n    if (!params.userAnswers.length && blankIsCorrect) {\n      score = params.weight;\n    }\n    if (params.behaviour.singlePoint) {\n      score = (100 * score \/ calculateMaxScore()) >= params.behaviour.passPercentage ? params.weight : 0;\n    }\n  };\n\n  \/**\n   * Removes selections from task.\n   *\/\n  var removeSelections = function () {\n    var $answers = $('.h5p-answer', $myDom)\n      .removeClass('h5p-selected')\n      .attr('aria-checked', 'false');\n\n    if (!params.behaviour.singleAnswer) {\n      $answers.attr('tabindex', '0');\n    }\n    else {\n      $answers.first().attr('tabindex', '0');\n    }\n\n    \/\/ Set focus to first option\n    $answers.first().focus();\n\n    calcScore();\n  };\n\n  \/**\n   * Get xAPI data.\n   * Contract used by report rendering engine.\n   *\n   * @see contract at {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts#guides-header-6}\n   *\/\n  this.getXAPIData = function(){\n    var xAPIEvent = this.createXAPIEventTemplate('answered');\n    addQuestionToXAPI(xAPIEvent);\n    addResponseToXAPI(xAPIEvent);\n    return {\n      statement: xAPIEvent.data.statement\n    };\n  };\n\n  \/**\n   * Add the question itself to the definition part of an xAPIEvent\n   *\/\n  var addQuestionToXAPI = function (xAPIEvent) {\n    var definition = xAPIEvent.getVerifiedStatementValue(['object', 'definition']);\n    definition.description = {\n      \/\/ Remove tags, must wrap in div tag because jQuery 1.9 will crash if the string isn't wrapped in a tag.\n      'en-US': $('<div>' + params.question + '<\/div>').text()\n    };\n    definition.type = 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction';\n    definition.interactionType = 'choice';\n    definition.correctResponsesPattern = [];\n    definition.choices = [];\n    for (var i = 0; i < params.answers.length; i++) {\n      definition.choices[i] = {\n        'id': params.answers[i].originalOrder + '',\n        'description': {\n          \/\/ Remove tags, must wrap in div tag because jQuery 1.9 will crash if the string isn't wrapped in a tag.\n          'en-US': $('<div>' + params.answers[i].text + '<\/div>').text()\n        }\n      };\n      if (params.answers[i].correct) {\n        if (!params.singleAnswer) {\n          if (definition.correctResponsesPattern.length) {\n            definition.correctResponsesPattern[0] += '[,]';\n            \/\/ This looks insane, but it's how you separate multiple answers\n            \/\/ that must all be chosen to achieve perfect score...\n          }\n          else {\n            definition.correctResponsesPattern.push('');\n          }\n          definition.correctResponsesPattern[0] += params.answers[i].originalOrder;\n        }\n        else {\n          definition.correctResponsesPattern.push('' + params.answers[i].originalOrder);\n        }\n      }\n    }\n  };\n\n  \/**\n   * Add the response part to an xAPI event\n   *\n   * @param {H5P.XAPIEvent} xAPIEvent\n   *  The xAPI event we will add a response to\n   *\/\n  var addResponseToXAPI = function (xAPIEvent) {\n    var maxScore = self.getMaxScore();\n    var success = (100 * score \/ maxScore) >= params.behaviour.passPercentage;\n\n    xAPIEvent.setScoredResult(score, maxScore, self, true, success);\n    if (params.userAnswers === undefined) {\n      calcScore();\n    }\n\n    \/\/ Add the response\n    var response = '';\n    for (var i = 0; i < params.userAnswers.length; i++) {\n      if (response !== '') {\n        response += '[,]';\n      }\n      response += idMap === undefined ? params.userAnswers[i] : idMap[params.userAnswers[i]];\n    }\n    xAPIEvent.data.statement.result.response = response;\n  };\n\n  \/**\n   * Create a map pointing from original answers to shuffled answers\n   *\n   * @return {number[]} map pointing from original answers to shuffled answers\n   *\/\n  var getShuffleMap = function() {\n    params.answers = H5P.shuffleArray(params.answers);\n\n    \/\/ Create a map from the new id to the old one\n    var idMap = [];\n    for (i = 0; i < params.answers.length; i++) {\n      idMap[i] = params.answers[i].originalOrder;\n    }\n    return idMap;\n  };\n\n  \/\/ Initialization code\n  \/\/ Randomize order, if requested\n  var idMap;\n  \/\/ Store original order in answers\n  for (i = 0; i < params.answers.length; i++) {\n    params.answers[i].originalOrder = i;\n  }\n  if (params.behaviour.randomAnswers) {\n    idMap = getShuffleMap();\n  }\n\n  \/\/ Start with an empty set of user answers.\n  params.userAnswers = [];\n\n  \/\/ Restore previous state\n  if (contentData && contentData.previousState !== undefined) {\n\n    \/\/ Restore answers\n    if (contentData.previousState.answers) {\n      if (!idMap) {\n        params.userAnswers = contentData.previousState.answers;\n      }\n      else {\n        \/\/ The answers have been shuffled, and we must use the id mapping.\n        for (i = 0; i < contentData.previousState.answers.length; i++) {\n          for (var k = 0; k < idMap.length; k++) {\n            if (idMap[k] === contentData.previousState.answers[i]) {\n              params.userAnswers.push(k);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  var hasCheckedAnswer = false;\n\n  \/\/ Loop through choices\n  for (var j = 0; j < params.answers.length; j++) {\n    var ans = params.answers[j];\n\n    if (!params.behaviour.singleAnswer) {\n      \/\/ Set role\n      ans.role = 'checkbox';\n      ans.tabindex = '0';\n      if (params.userAnswers.indexOf(j) !== -1) {\n        ans.checked = 'true';\n        hasCheckedAnswer = true;\n      }\n    }\n    else {\n      \/\/ Set role\n      ans.role = 'radio';\n\n      \/\/ Determine tabindex, checked and extra classes\n      if (params.userAnswers.length === 0) {\n        \/\/ No correct answers\n        if (i === 0 || i === params.answers.length) {\n          ans.tabindex = '0';\n        }\n      }\n      else if (params.userAnswers.indexOf(j) !== -1) {\n        \/\/ This is the correct choice\n        ans.tabindex = '0';\n        ans.checked = 'true';\n        hasCheckedAnswer = true;\n      }\n    }\n\n    \/\/ Set default\n    if (ans.tabindex === undefined) {\n      ans.tabindex = '-1';\n    }\n    if (ans.checked === undefined) {\n      ans.checked = 'false';\n    }\n  }\n\n  H5P.MultiChoice.counter = (H5P.MultiChoice.counter === undefined ? 0 : H5P.MultiChoice.counter + 1);\n  params.role = (params.behaviour.singleAnswer ? 'radiogroup' : 'group');\n  params.label = 'h5p-mcq' + H5P.MultiChoice.counter;\n\n  \/**\n   * Pack the current state of the interactivity into a object that can be\n   * serialized.\n   *\n   * @public\n   *\/\n  this.getCurrentState = function () {\n    var state = {};\n    if (!idMap) {\n      state.answers = params.userAnswers;\n    }\n    else {\n      \/\/ The answers have been shuffled and must be mapped back to their\n      \/\/ original ID.\n      state.answers = [];\n      for (var i = 0; i < params.userAnswers.length; i++) {\n        state.answers.push(idMap[params.userAnswers[i]]);\n      }\n    }\n    return state;\n  };\n\n  \/**\n   * Check if user has given an answer.\n   *\n   * @param {boolean} [ignoreCheck] Ignore returning true from pressing \"check-answer\" button.\n   * @return {boolean} True if answer is given\n   *\/\n  this.getAnswerGiven = function (ignoreCheck) {\n    var answered = ignoreCheck ? false : this.answered;\n    return answered || params.userAnswers.length > 0 || blankIsCorrect;\n  };\n\n  this.getScore = function () {\n    return score;\n  };\n\n  this.getTitle = function () {\n    return H5P.createTitle(params.question);\n  };\n};\n\nH5P.MultiChoice.prototype = Object.create(H5P.Question.prototype);\nH5P.MultiChoice.prototype.constructor = H5P.MultiChoice;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.RadioGroup-1.1\/radio-group.js?ver=1.1.1":"\n\/**\n * RadioGroup widget\n *\n * @param {H5P.jQuery} $\n *\/\nH5PEditor.RadioGroup = H5PEditor.widgets.radioGroup = (function ($) {\n\n  var groupCounter = 0;\n  \/**\n   * Creates an radio button group.\n   *\n   * @class H5PEditor.ImageRadioButtonGroup\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   *\/\n  function RadioGroup(parent, field, params, setValue) {\n    this.parent = parent;\n    this.field = field;\n    this.params = params;\n    this.setValue = setValue;\n\n    this.alignment = this.field.alignment || 'vertical';\n\n    groupCounter++;\n  }\n\n  \/**\n   * Append the field to the wrapper.\n   * @public\n   * @param {H5P.jQuery} $wrapper\n   *\/\n  RadioGroup.prototype.appendTo = function ($wrapper) {\n    var self = this;\n\n    self.$container = $(H5PEditor.createFieldMarkup(\n        self.field,\n        '<div class=\"h5p-editor-radio-group-container ' + self.alignment + '\" role=\"radiogroup\"><\/div>'\n    ));\n\n    var $buttonGroup = self.$container.find('.h5p-editor-radio-group-container');\n\n    for (var i = 0; i < self.field.options.length; i++) {\n      var option = self.field.options[i];\n      var inputId = 'h5p-editor-radio-group-button-' + groupCounter + '-' + i;\n\n      var $button = $('<div>', {\n        'class': 'h5p-editor-radio-group-button ' + option.value\n      }).appendTo($buttonGroup);\n\n      $('<input>', {\n        type: 'radio',\n        name: self.field.name + groupCounter,\n        value: option.value,\n        role: 'radio',\n        id: inputId,\n        checked: (self.params === option.value) || (self.params === undefined && this.field.default === option.value),\n        change: function () {\n          self.params = $('input:checked', $buttonGroup).val();\n          self.setValue(self.field, self.params);\n        }\n      }).appendTo($button);\n\n      $('<label>', {\n        'for': inputId\n      }).append($('<span>', {\n        html: option.label\n      })).appendTo($button);\n\n      if (option.description) {\n        $('<div>', {\n          'class': 'h5p-option-description',\n          html: option.description\n        }).appendTo($button);\n      }\n    }\n\n    self.$container.appendTo($wrapper);\n  };\n\n\n  \/**\n   * Validate the current values.\n   *\/\n  RadioGroup.prototype.validate = function () {\n    return true;\n  };\n\n  RadioGroup.prototype.remove = function () {};\n\n  return RadioGroup;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TrueFalse-1.2\/scripts\/h5p-true-false.js?ver=1.2.4":"\nH5P.TrueFalse = (function ($, Question) {\n  'use strict';\n\n  \/\/ Maximum score for True False\n  var MAX_SCORE = 1;\n\n  \/**\n   * Enum containing the different states this content type can exist in\n   *\n   * @enum\n   *\/\n  var State = Object.freeze({\n    ONGOING: 1,\n    FINISHED_WRONG: 2,\n    FINISHED_CORRECT: 3,\n    INTERNAL_SOLUTION: 4,\n    EXTERNAL_SOLUTION: 5\n  });\n\n  \/**\n   * Button IDs\n   *\/\n  var Button = Object.freeze({\n    CHECK: 'check-answer',\n    TRYAGAIN: 'try-again',\n    SHOW_SOLUTION: 'show-solution'\n  });\n\n  \/**\n   * Initialize module.\n   *\n   * @class H5P.TrueFalse\n   * @extends H5P.Question\n   * @param {Object} options\n   * @param {number} id Content identification\n   * @param {Object} contentData Task specific content data\n   *\/\n  function TrueFalse(options, id, contentData) {\n    var self = this;\n\n    \/\/ Inheritance\n    Question.call(self, 'true-false');\n\n    var params = $.extend(true, {\n      question: 'No question text provided',\n      correct: 'true',\n      l10n: {\n        trueText: 'True',\n        falseText: 'False',\n        score: 'You got @score of @total points',\n        checkAnswer: 'Check',\n        showSolutionButton: 'Show solution',\n        tryAgain: 'Retry',\n        wrongAnswerMessage: 'Wrong answer',\n        correctAnswerMessage: 'Correct answer',\n        scoreBarLabel: 'You got :num out of :total points'\n      },\n      behaviour: {\n        enableRetry: true,\n        enableSolutionsButton: true,\n        disableImageZooming: false,\n        confirmCheckDialog: false,\n        confirmRetryDialog: false,\n        autoCheck: false\n      }\n    }, options);\n\n    \/\/ Counter used to create unique id for this question\n    TrueFalse.counter = (TrueFalse.counter === undefined ? 0 : TrueFalse.counter + 1);\n\n    \/\/ A unique ID is needed for aria label\n    var domId = 'h5p-tfq' + H5P.TrueFalse.counter;\n\n    \/\/ saves the content id\n    this.contentId = id;\n\n    \/\/ The radio group\n    var answerGroup = new H5P.TrueFalse.AnswerGroup(domId, params.correct, params.l10n);\n    if (contentData.previousState !== undefined && contentData.previousState.answer !== undefined) {\n      answerGroup.check(contentData.previousState.answer);\n    }\n    answerGroup.on('selected', function () {\n      self.triggerXAPI('interacted');\n\n      if (params.behaviour.autoCheck) {\n        checkAnswer();\n        triggerXAPIAnswered();\n      }\n    });\n\n\n    \/**\n     * Create the answers\n     *\n     * @method createAnswers\n     * @private\n     * @return {H5P.jQuery}\n     *\/\n    var createAnswers = function () {\n      return answerGroup.getDomElement();\n    };\n\n    \/**\n     * Register buttons\n     *\n     * @method registerButtons\n     * @private\n     *\/\n    var registerButtons = function () {\n      var $content = $('[data-content-id=\"' + self.contentId + '\"].h5p-content');\n      var $containerParents = $content.parents('.h5p-container');\n\n      \/\/ select find container to attach dialogs to\n      var $container;\n      if($containerParents.length !== 0) {\n        \/\/ use parent highest up if any\n        $container = $containerParents.last();\n      }\n      else if($content.length !== 0){\n        $container = $content;\n      }\n      else  {\n        $container = $(document.body);\n      }\n\n      \/\/ Show solution button\n      if (params.behaviour.enableSolutionsButton === true) {\n        self.addButton(Button.SHOW_SOLUTION, params.l10n.showSolutionButton, function () {\n          self.showSolutions(true);\n        }, false);\n      }\n\n      \/\/ Check button\n      if (!params.behaviour.autoCheck) {\n        self.addButton(Button.CHECK, params.l10n.checkAnswer, function () {\n          checkAnswer();\n          triggerXAPIAnswered();\n        }, true, {}, {\n          confirmationDialog: {\n            enable: params.behaviour.confirmCheckDialog,\n            l10n: params.confirmCheck,\n            instance: self,\n            $parentElement: $container\n          }\n        });\n      }\n\n      \/\/ Try again button\n      if (params.behaviour.enableRetry === true) {\n        self.addButton(Button.TRYAGAIN, params.l10n.tryAgain, function () {\n          self.resetTask();\n        }, true, {}, {\n          confirmationDialog: {\n            enable: params.behaviour.confirmRetryDialog,\n            l10n: params.confirmRetry,\n            instance: self,\n            $parentElement: $container\n          }\n        });\n      }\n\n      toggleButtonState(State.ONGOING);\n    };\n\n    \/**\n     * Creates and triggers the xAPI answered event\n     *\n     * @method triggerXAPIAnswered\n     * @private\n     * @fires xAPIEvent\n     *\/\n    var triggerXAPIAnswered = function () {\n      var xAPIEvent = self.createXAPIEventTemplate('answered');\n      addQuestionToXAPI(xAPIEvent);\n      addResponseToXAPI(xAPIEvent);\n      self.trigger(xAPIEvent);\n    };\n\n    \/**\n     * Add the question itself to the definition part of an xAPIEvent\n     *\n     * @method addQuestionToXAPI\n     * @param {XAPIEvent} xAPIEvent\n     * @private\n     *\/\n    var addQuestionToXAPI = function(xAPIEvent) {\n      var definition = xAPIEvent.getVerifiedStatementValue(['object', 'definition']);\n      definition.description = {\n        \/\/ Remove tags, must wrap in div tag because jQuery 1.9 will crash if the string isn't wrapped in a tag.\n        'en-US': $('<div>' + params.question + '<\/div>').text()\n      };\n      definition.type = 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction';\n      definition.interactionType = 'true-false';\n      definition.correctResponsesPattern = [getCorrectAnswer()];\n    };\n\n    \/**\n     * Returns the correct answer\n     *\n     * @method getCorrectAnswer\n     * @private\n     * @return {String}\n     *\/\n    var getCorrectAnswer = function () {\n      return (params.correct === 'true' ? 'true' : 'false');\n    };\n\n    \/**\n     * Returns the wrong answer\n     *\n     * @method getWrongAnswer\n     * @private\n     * @return {String}\n     *\/\n    var getWrongAnswer = function () {\n      return (params.correct === 'false' ? 'true' : 'false');\n    };\n\n    \/**\n     * Add the response part to an xAPI event\n     *\n     * @method addResponseToXAPI\n     * @private\n     * @param {H5P.XAPIEvent} xAPIEvent\n     *  The xAPI event we will add a response to\n     *\/\n    var addResponseToXAPI = function(xAPIEvent) {\n      var isCorrect = answerGroup.isCorrect();\n      xAPIEvent.setScoredResult(isCorrect ? MAX_SCORE : 0, MAX_SCORE, self, true, isCorrect);\n      xAPIEvent.data.statement.result.response = (isCorrect ? getCorrectAnswer() : getWrongAnswer());\n    };\n\n    \/**\n     * Toggles btton visibility dependent of current state\n     *\n     * @method toggleButtonVisibility\n     * @private\n     * @param  {String}    buttonId\n     * @param  {Boolean}   visible\n     *\/\n    var toggleButtonVisibility = function (buttonId, visible) {\n      if (visible === true) {\n        self.showButton(buttonId);\n      }\n      else {\n        self.hideButton(buttonId);\n      }\n    };\n\n    \/**\n     * Toggles buttons state\n     *\n     * @method toggleButtonState\n     * @private\n     * @param  {String}          state\n     *\/\n    var toggleButtonState = function (state) {\n      toggleButtonVisibility(Button.SHOW_SOLUTION, state === State.FINISHED_WRONG);\n      toggleButtonVisibility(Button.CHECK, state === State.ONGOING);\n      toggleButtonVisibility(Button.TRYAGAIN, state === State.FINISHED_WRONG || state === State.INTERNAL_SOLUTION);\n    };\n\n    \/**\n     * Check if answer is correct or wrong, and update visuals accordingly\n     *\n     * @method checkAnswer\n     * @private\n     *\/\n    var checkAnswer = function () {\n      \/\/ Create feedback widget\n      var score = self.getScore();\n      var scoreText;\n\n      toggleButtonState(score === MAX_SCORE ? State.FINISHED_CORRECT : State.FINISHED_WRONG);\n\n      if (score === MAX_SCORE && params.behaviour.feedbackOnCorrect) {\n        scoreText = params.behaviour.feedbackOnCorrect;\n      }\n      else if (score === 0 && params.behaviour.feedbackOnWrong) {\n        scoreText = params.behaviour.feedbackOnWrong;\n      }\n      else {\n        scoreText = params.l10n.score;\n      }\n      \/\/ Replace relevant variables:\n      scoreText = scoreText.replace('@score', score).replace('@total', MAX_SCORE);\n      self.setFeedback(scoreText, score, MAX_SCORE, params.l10n.scoreBarLabel);\n      answerGroup.reveal();\n    };\n\n    \/**\n     * Registers this question type's DOM elements before they are attached.\n     * Called from H5P.Question.\n     *\n     * @method registerDomElements\n     * @private\n     *\/\n    self.registerDomElements = function () {\n      var self = this;\n\n      \/\/ Check for task media\n      var media = params.media;\n      if (media && media.library) {\n        var type = media.library.split(' ')[0];\n        if (type === 'H5P.Image') {\n          if (media.params.file) {\n            \/\/ Register task image\n            self.setImage(media.params.file.path, {\n              disableImageZooming: params.behaviour.disableImageZooming,\n              alt: media.params.alt\n            });\n          }\n        }\n        else if (type === 'H5P.Video') {\n          if (media.params.sources) {\n            \/\/ Register task video\n            self.setVideo(media);\n          }\n        }\n      }\n\n      \/\/ Add task question text\n      self.setIntroduction('<div id=\"' + domId + '\">' + params.question + '<\/div>');\n\n      \/\/ Register task content area\n      self.$content = createAnswers();\n      self.setContent(self.$content);\n\n      \/\/ ... and buttons\n      registerButtons();\n    };\n\n    \/**\n     * Implements resume (save content state)\n     *\n     * @method getCurrentState\n     * @public\n     * @returns {object} object containing answer\n     *\/\n    self.getCurrentState = function () {\n      return {answer: answerGroup.getAnswer()};\n    };\n\n    \/**\n     * Used for contracts.\n     * Checks if the parent program can proceed. Always true.\n     *\n     * @method getAnswerGiven\n     * @public\n     * @returns {Boolean} true\n     *\/\n    self.getAnswerGiven = function () {\n      return answerGroup.hasAnswered();\n    };\n\n    \/**\n     * Used for contracts.\n     * Checks the current score for this task.\n     *\n     * @method getScore\n     * @public\n     * @returns {Number} The current score.\n     *\/\n    self.getScore = function () {\n      return answerGroup.isCorrect() ? MAX_SCORE : 0;\n    };\n\n    \/**\n     * Used for contracts.\n     * Checks the maximum score for this task.\n     *\n     * @method getMaxScore\n     * @public\n     * @returns {Number} The maximum score.\n     *\/\n    self.getMaxScore = function () {\n      return MAX_SCORE;\n    };\n\n    \/**\n     * Get title of task\n     *\n     * @method getTitle\n     * @upblic\n     * @returns {string} title\n     *\/\n    self.getTitle = function () {\n      return H5P.createTitle(params.question);\n    };\n\n    \/**\n     * Used for contracts.\n     * Show the solution.\n     *\n     * @method showSolutions\n     * @public\n     *\/\n    self.showSolutions = function (internal) {\n      checkAnswer();\n      answerGroup.showSolution();\n      toggleButtonState(internal ? State.INTERNAL_SOLUTION : State.EXTERNAL_SOLUTION);\n    };\n\n    \/**\n     * Used for contracts.\n     * Resets the complete task back to its' initial state.\n     *\n     * @method resetTask\n     * @public\n     *\/\n    self.resetTask = function () {\n      answerGroup.reset();\n      self.removeFeedback();\n      toggleButtonState(State.ONGOING);\n    };\n\n    \/**\n     * Get xAPI data.\n     * Contract used by report rendering engine.\n     *\n     * @see contract at {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts#guides-header-6}\n     *\/\n    self.getXAPIData = function(){\n      var xAPIEvent = this.createXAPIEventTemplate('answered');\n      this.addQuestionToXAPI(xAPIEvent);\n      this.addResponseToXAPI(xAPIEvent);\n      return {\n        statement: xAPIEvent.data.statement\n      };\n    };\n\n    \/**\n     * Add the question itself to the definition part of an xAPIEvent\n     *\/\n    self.addQuestionToXAPI = function(xAPIEvent) {\n      var definition = xAPIEvent.getVerifiedStatementValue(['object', 'definition']);\n      $.extend(definition, this.getxAPIDefinition());\n    };\n\n    \/**\n     * Generate xAPI object definition used in xAPI statements.\n     * @return {Object}\n     *\/\n    self.getxAPIDefinition = function () {\n      var definition = {};\n      definition.interactionType = 'true-false';\n      definition.type = 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction';\n      definition.description = {\n        'en-US': $('<div>' + params.question + '<\/div>').text()\n      };\n      definition.correctResponsesPattern = [getCorrectAnswer()];\n\n      return definition;\n    };\n\n    \/**\n     * Add the response part to an xAPI event\n     *\n     * @param {H5P.XAPIEvent} xAPIEvent\n     *  The xAPI event we will add a response to\n     *\/\n    self.addResponseToXAPI = function (xAPIEvent) {\n      var isCorrect = answerGroup.isCorrect();\n      var rawUserScore = isCorrect ? MAX_SCORE : 0;\n      var currentResponse = '';\n\n      xAPIEvent.setScoredResult(rawUserScore, MAX_SCORE, self, true, isCorrect);\n\n      if(self.getCurrentState().answer !== undefined) {\n        currentResponse += answerGroup.isCorrect() ? getCorrectAnswer() : getWrongAnswer();\n      }\n      xAPIEvent.data.statement.result.response = currentResponse;\n    };\n   }\n\n  \/\/ Inheritance\n  TrueFalse.prototype = Object.create(Question.prototype);\n  TrueFalse.prototype.constructor = TrueFalse;\n\n  return TrueFalse;\n})(H5P.jQuery, H5P.Question);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TrueFalse-1.2\/scripts\/h5p-true-false-answer-group.js?ver=1.2.4":"\nH5P.TrueFalse.AnswerGroup = (function ($, EventDispatcher) {\n  'use strict';\n\n  \/**\n   * Initialize module.\n   *\n   * @class H5P.TrueFalse.AnswerGroup\n   * @extends H5P.EventDispatcher\n   * @param {String} domId Id for label\n   * @param {String} correctOption Correct option ('true' or 'false')\n   * @param {Object} l10n Object containing all interface translations\n   *\/\n  function AnswerGroup(domId, correctOption, l10n) {\n    var self = this;\n\n    EventDispatcher.call(self);\n\n    var $answers = $('<div>', {\n      'class': 'h5p-true-false-answers',\n      role: 'radiogroup',\n      'aria-labelledby': domId\n    });\n\n    var answer;\n    var trueAnswer = new H5P.TrueFalse.Answer(l10n.trueText, l10n.correctAnswerMessage, l10n.wrongAnswerMessage);\n    var falseAnswer = new H5P.TrueFalse.Answer(l10n.falseText, l10n.correctAnswerMessage, l10n.wrongAnswerMessage);\n    var correctAnswer = (correctOption === 'true' ? trueAnswer : falseAnswer);\n    var wrongAnswer = (correctOption === 'false' ? trueAnswer : falseAnswer);\n\n    \/\/ Handle checked\n    var handleChecked = function (newAnswer, other) {\n      return function () {\n        answer = newAnswer;\n        other.uncheck();\n        self.trigger('selected');\n      };\n    };\n    trueAnswer.on('checked', handleChecked(true, falseAnswer));\n    falseAnswer.on('checked', handleChecked(false, trueAnswer));\n\n    \/\/ Handle switches (using arrow keys)\n    var handleInvert = function (newAnswer, other) {\n      return function () {\n        answer = newAnswer;\n        other.check();\n        self.trigger('selected');\n      };\n    };\n    trueAnswer.on('invert', handleInvert(false, falseAnswer));\n    falseAnswer.on('invert', handleInvert(true, trueAnswer));\n\n    \/\/ Handle tabbing\n    var handleTabable = function(other, tabable) {\n      return function () {\n        \/\/ If one of them are checked, that one should get tabfocus\n        if (!tabable || !self.hasAnswered() || other.isChecked()) {\n          other.tabable(tabable);\n        }\n      };\n    };\n    \/\/ Need to remove tabIndex on the other alternative on focus\n    trueAnswer.on('focus', handleTabable(falseAnswer, false));\n    falseAnswer.on('focus', handleTabable(trueAnswer, false));\n    \/\/ Need to make both alternatives tabable on blur:\n    trueAnswer.on('blur', handleTabable(falseAnswer, true));\n    falseAnswer.on('blur', handleTabable(trueAnswer, true));\n\n    $answers.append(trueAnswer.getDomElement());\n    $answers.append(falseAnswer.getDomElement());\n\n    \/**\n     * Get hold of the DOM element representing this thingy\n     * @method getDomElement\n     * @return {jQuery}\n     *\/\n    self.getDomElement = function () {\n      return $answers;\n    };\n\n    \/**\n     * Programatic check\n     * @method check\n     * @param  {[type]} answer [description]\n     *\/\n    self.check = function (answer) {\n      if (answer) {\n        trueAnswer.check();\n      }\n      else {\n        falseAnswer.check();\n      }\n    };\n\n    \/**\n     * Return current answer\n     * @method getAnswer\n     * @return {Boolean} undefined if no answer if given\n     *\/\n    self.getAnswer = function () {\n      return answer;\n    };\n\n    \/**\n     * Check if user has answered question yet\n     * @method hasAnswered\n     * @return {Boolean}\n     *\/\n    self.hasAnswered = function () {\n      return answer !== undefined;\n    };\n\n    \/**\n     * Is answer correct?\n     * @method isCorrect\n     * @return {Boolean}\n     *\/\n    self.isCorrect = function () {\n      return correctAnswer.isChecked();\n    };\n\n    \/**\n     * Enable user input\n     *\n     * @method enable\n     *\/\n    self.enable = function () {\n      trueAnswer.enable().tabable(true);\n      falseAnswer.enable();\n    };\n\n    \/**\n     * Disable user input\n     *\n     * @method disable\n     *\/\n    self.disable = function () {\n      trueAnswer.disable();\n      falseAnswer.disable();\n    };\n\n    \/**\n     * Reveal correct\/wrong answer\n     *\n     * @method reveal\n     *\/\n    self.reveal = function () {\n      if (self.hasAnswered()) {\n        if (self.isCorrect()) {\n          correctAnswer.markCorrect();\n        }\n        else {\n          wrongAnswer.markWrong();\n        }\n      }\n\n      self.disable();\n    };\n\n    \/**\n     * Reset task\n     * @method reset\n     *\/\n    self.reset = function () {\n      trueAnswer.reset();\n      falseAnswer.reset();\n      self.enable();\n      answer = undefined;\n    };\n\n    \/**\n     * Show the solution\n     * @method showSolution\n     * @return {[type]}\n     *\/\n    self.showSolution = function () {\n      correctAnswer.markCorrect();\n      wrongAnswer.unmark();\n    };\n  }\n\n  \/\/ Inheritance\n  AnswerGroup.prototype = Object.create(EventDispatcher.prototype);\n  AnswerGroup.prototype.constructor = AnswerGroup;\n\n  return AnswerGroup;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TrueFalse-1.2\/scripts\/h5p-true-false-answer.js?ver=1.2.4":"\nH5P.TrueFalse.Answer = (function ($, EventDispatcher) {\n  'use strict';\n\n  var Keys = {\n    ENTER: 13,\n    SPACE: 32,\n    LEFT_ARROW: 37,\n    UP_ARROW: 38,\n    RIGHT_ARROW: 39,\n    DOWN_ARROW: 40\n  };\n\n  \/**\n   * Initialize module.\n   *\n   * @class H5P.TrueFalse.Answer\n   * @extends H5P.EventDispatcher\n   * @param {String} text Label\n   * @param {String} correctMessage Message read by readspeaker when correct alternative is chosen\n   * @param {String} wrongMessage Message read by readspeaker when wrong alternative is chosen\n   *\/\n  function Answer (text, correctMessage, wrongMessage) {\n    var self = this;\n\n    EventDispatcher.call(self);\n\n    var checked = false;\n    var enabled = true;\n\n    var $answer = $('<div>', {\n      'class': 'h5p-true-false-answer',\n      role: 'radio',\n      'aria-checked': false,\n      html: text + '<span class=\"aria-label\"><\/span>',\n      tabindex: 0, \/\/ Tabable by default\n      click: function (event) {\n        \/\/ Handle left mouse (or tap on touch devices)\n        if (event.which === 1) {\n          self.check();\n        }\n      },\n      keydown: function (event) {\n        if (!enabled) {\n          return;\n        }\n        if ([Keys.SPACE, Keys.ENTER].indexOf(event.keyCode) !== -1) {\n          self.check();\n        }\n        else if ([Keys.LEFT_ARROW, Keys.UP_ARROW, Keys.RIGHT_ARROW, Keys.DOWN_ARROW].indexOf(event.keyCode) !== -1) {\n          self.uncheck();\n          self.trigger('invert');\n        }\n      },\n      focus: function () {\n        self.trigger('focus');\n      },\n      blur: function () {\n        self.trigger('blur');\n      }\n    });\n\n    var $ariaLabel = $answer.find('.aria-label');\n\n    \/\/ A bug in Chrome 54 makes the :after icons (V and X) not beeing rendered.\n    \/\/ Doing this in a timeout solves this\n    \/\/ Might be removed when Chrome 56 is out\n    var chromeBugFixer = function (callback) {\n      setTimeout(function () {\n        callback();\n      }, 0);\n    };\n\n    \/**\n     * Return the dom element representing the alternative\n     *\n     * @public\n     * @method getDomElement\n     * @return {H5P.jQuery}\n     *\/\n    self.getDomElement = function () {\n      return $answer;\n    };\n\n    \/**\n     * Unchecks the alternative\n     *\n     * @public\n     * @method uncheck\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.uncheck = function () {\n      if (enabled) {\n        $answer.blur();\n        checked = false;\n        chromeBugFixer(function () {\n          $answer.attr('aria-checked', checked);\n        });\n      }\n      return self;\n    };\n\n    \/**\n     * Set tabable or not\n     * @method tabable\n     * @param  {Boolean} enabled\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.tabable = function (enabled) {\n      $answer.attr('tabIndex', enabled ? 0 : null);\n      return self;\n    };\n\n    \/**\n     * Checks the alternative\n     *\n     * @method check\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.check = function () {\n      if (enabled) {\n        checked = true;\n        chromeBugFixer(function () {\n          $answer.attr('aria-checked', checked);\n        });\n        self.trigger('checked');\n        $answer.focus();\n      }\n      return self;\n    };\n\n    \/**\n     * Is this alternative checked?\n     *\n     * @method isChecked\n     * @return {boolean}\n     *\/\n    self.isChecked = function () {\n      return checked;\n    };\n\n    \/**\n     * Enable alternative\n     *\n     * @method enable\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.enable = function () {\n      $answer.attr({\n        'aria-disabled': '',\n        tabIndex: 0\n      });\n      enabled = true;\n\n      return self;\n    };\n\n    \/**\n     * Disables alternative\n     *\n     * @method disable\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.disable = function () {\n      $answer.attr({\n        'aria-disabled': true,\n        tabIndex: null\n      });\n      enabled = false;\n\n      return self;\n    };\n\n    \/**\n     * Reset alternative\n     *\n     * @method reset\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.reset = function () {\n      self.enable();\n      self.uncheck();\n      self.unmark();\n      $ariaLabel.html('');\n\n      return self;\n    };\n\n    \/**\n     * Marks this alternative as the wrong one\n     *\n     * @method markWrong\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.markWrong = function () {\n      chromeBugFixer(function () {\n        $answer.addClass('wrong');\n      });\n      $ariaLabel.html('.' + wrongMessage);\n\n      return self;\n    };\n\n    \/**\n     * Marks this alternative as the wrong one\n     *\n     * @method markCorrect\n     * @return {H5P.TrueFalse.Answer}\n     *\/\n    self.markCorrect = function () {\n      chromeBugFixer(function () {\n        $answer.addClass('correct');\n      });\n      $ariaLabel.html('.' + correctMessage);\n\n      return self;\n    };\n\n    self.unmark = function () {\n      chromeBugFixer(function () {\n        $answer.removeClass('wrong correct');\n      });\n\n      return self;\n    };\n  }\n\n  \/\/ Inheritance\n  Answer.prototype = Object.create(EventDispatcher.prototype);\n  Answer.prototype.constructor = Answer;\n\n  return Answer;\n\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/h5p-jquery-ui.js?ver=1.10.19":"\nvar oldJQuery = jQuery;\njQuery = H5P.jQuery;\n\n\/*! jQuery UI - v1.10.2 - 2013-03-14\n* http:\/\/jqueryui.com\n* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js\n* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT *\/\n(function( $, undefined ) {\n\nvar uuid = 0,\n\truniqueId = \/^ui-id-\\d+$\/;\n\n\/\/ $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"1.10.2\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tNUMPAD_ADD: 107,\n\t\tNUMPAD_DECIMAL: 110,\n\t\tNUMPAD_DIVIDE: 111,\n\t\tNUMPAD_ENTER: 108,\n\t\tNUMPAD_MULTIPLY: 106,\n\t\tNUMPAD_SUBTRACT: 109,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n\/\/ plugins\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tscrollParent: function() {\n\t\tvar scrollParent;\n\t\tif (($.ui.ie && (\/(static|relative)\/).test(this.css(\"position\"))) || (\/absolute\/).test(this.css(\"position\"))) {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (\/(relative|absolute|fixed)\/).test($.css(this,\"position\")) && (\/(auto|scroll)\/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t} else {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (\/(auto|scroll)\/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t}\n\n\t\treturn (\/fixed\/).test(this.css(\"position\")) || !scrollParent.length ? $(document) : scrollParent;\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t\/\/ Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t\/\/ This makes behavior of this function consistent across browsers\n\t\t\t\t\/\/ WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t\/\/ IE returns 0 when zIndex is not specified\n\t\t\t\t\t\/\/ other browsers return a string\n\t\t\t\t\t\/\/ we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t\/\/ <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"><\/div><\/div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t},\n\n\tuniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.id ) {\n\t\t\t\tthis.id = \"ui-id-\" + (++uuid);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( runiqueId.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n\/\/ selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap=#\" + mapName + \"]\" )[0];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( \/input|select|textarea|button|object\/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t\/\/ the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t\/\/ support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n\/\/ support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n\/\/ support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n\/\/ support: jQuery 1.6.1, 1.6.2 (http:\/\/bugs.jquery.com\/ticket\/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n\n\n\n\n\/\/ deprecated\n$.ui.ie = !!\/msie [\\w.]+\/.exec( navigator.userAgent.toLowerCase() );\n\n$.support.selectstart = \"onselectstart\" in document.createElement( \"div\" );\n$.fn.extend({\n\tdisableSelection: function() {\n\t\treturn this.bind( ( $.support.selectstart ? \"selectstart\" : \"mousedown\" ) +\n\t\t\t\".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t},\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t}\n});\n\n$.extend( $.ui, {\n\t\/\/ $.ui.plugin is deprecated.  Use the proxy pattern instead.\n\tplugin: {\n\t\tadd: function( module, option, set ) {\n\t\t\tvar i,\n\t\t\t\tproto = $.ui[ module ].prototype;\n\t\t\tfor ( i in set ) {\n\t\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t\t}\n\t\t},\n\t\tcall: function( instance, name, args ) {\n\t\t\tvar i,\n\t\t\t\tset = instance.plugins[ name ];\n\t\t\tif ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t\/\/ only used by resizable\n\thasScroll: function( el, a ) {\n\n\t\t\/\/If overflow is hidden, the element might have extra content, but the user wants to hide it\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t\/\/ TODO: determine which cases actually cause this to happen\n\t\t\/\/ if the element doesn't have the scroll set, see if it's possible to\n\t\t\/\/ set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar uuid = 0,\n\tslice = Array.prototype.slice,\n\t_cleanData = $.cleanData;\n$.cleanData = function( elems ) {\n\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\ttry {\n\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\/\/ http:\/\/bugs.jquery.com\/ticket\/8235\n\t\t} catch( e ) {}\n\t}\n\t_cleanData( elems );\n};\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t\/\/ proxiedPrototype allows the provided prototype to remain unmodified\n\t\t\/\/ so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t\/\/ create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t\/\/ allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t\/\/ allow instantiation without initializing for simple inheritance\n\t\t\/\/ must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t\/\/ extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t\/\/ copy the object used to create the prototype in case we need to\n\t\t\/\/ redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t\/\/ track widgets that inherit from this widget in case this widget is\n\t\t\/\/ redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t\/\/ we need to make the options hash a property directly on the new instance\n\t\/\/ otherwise we'll modify the options hash on the prototype that we're\n\t\/\/ inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t\/\/ TODO: remove support for widgetEventPrefix\n\t\t\/\/ always use the name + a colon as the prefix, e.g., draggable:start\n\t\t\/\/ don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t\/\/ If this widget is being redefined then we need to find all widgets that\n\t\/\/ are inheriting from it and redefine all of them so that they inherit from\n\t\/\/ the new version of this widget. We're essentially trying to replace one\n\t\/\/ level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t\/\/ redefine the child widget using the same prototype that was\n\t\t\t\/\/ originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t\/\/ remove the list of existing child constructors from the old constructor\n\t\t\/\/ so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n};\n\n$.widget.extend = function( target ) {\n\tvar input = slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t\/\/ Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t\/\/ Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t\/\/ Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t\/\/ allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( \/* options, element *\/ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t\/\/ callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t\/\/ element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t\/\/ element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t\/\/ we can probably remove the unbind calls in 2.0\n\t\t\/\/ all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t\/\/ 1.9 BC for #7810\n\t\t\t\/\/ TODO remove dual storage\n\t\t\t.removeData( this.widgetName )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t\/\/ support: jquery <1.6.3\n\t\t\t\/\/ http:\/\/bugs.jquery.com\/ticket\/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t\/\/ clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t\/\/ don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t\/\/ handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( value === undefined ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( value === undefined ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOption( \"disabled\", false );\n\t},\n\tdisable: function() {\n\t\treturn this._setOption( \"disabled\", true );\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t\/\/ no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t\/\/ no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\t\/\/ accept selectors, DOM elements\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t\/\/ allow widgets to customize the disabled handling\n\t\t\t\t\/\/ - disabled as an array instead of boolean\n\t\t\t\t\/\/ - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t\/\/ copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( \/^(\\w+)\\s*(.*)$\/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t\/\/ the original event may come from any element\n\t\t\/\/ so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t\/\/ copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar mouseHandled = false;\n$( document ).mouseup( function() {\n\tmouseHandled = false;\n});\n\n$.widget(\"ui.mouse\", {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\tcancel: \"input,textarea,button,select,option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.bind(\"mousedown.\"+this.widgetName, function(event) {\n\t\t\t\treturn that._mouseDown(event);\n\t\t\t})\n\t\t\t.bind(\"click.\"+this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t\/\/ TODO: make sure destroying one instance of mouse doesn't mess with\n\t\/\/ other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind(\".\"+this.widgetName);\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\t$(document)\n\t\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\t\t}\n\t},\n\n\t_mouseDown: function(event) {\n\t\t\/\/ don't let more than one widget handle mouseStart\n\t\tif( mouseHandled ) { return; }\n\n\t\t\/\/ we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = (event.which === 1),\n\t\t\t\/\/ event.target.nodeName works around a bug in IE 8 with\n\t\t\t\/\/ disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t\/\/ Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\n\t\t}\n\n\t\t\/\/ these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn that._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn that._mouseUp(event);\n\t\t};\n\t\t$(document)\n\t\t\t.bind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.bind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tif (this.widgetName === 'slider') {\n\t\t\t\/\/ Prevent tragging of slider handle(anchor) in Firefox\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t\/\/ IE mouseup check - mouseup happened when mouse was out of window\n\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\n\t\t\treturn this._mouseUp(event);\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\t$(document)\n\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target === this._mouseDownEvent.target) {\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(\/* event *\/) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t\/\/ These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(\/* event *\/) {},\n\t_mouseDrag: function(\/* event *\/) {},\n\t_mouseStop: function(\/* event *\/) {},\n\t_mouseCapture: function(\/* event *\/) { return true; }\n});\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.widget(\"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.10.2\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t\/\/ callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif (this.options.helper === \"original\" && !(\/^(?:r|a|f)\/).test(this.element.css(\"position\"))) {\n\t\t\tthis.element[0].style.position = \"relative\";\n\t\t}\n\t\tif (this.options.addClasses){\n\t\t\tthis.element.addClass(\"ui-draggable\");\n\t\t}\n\t\tif (this.options.disabled){\n\t\t\tthis.element.addClass(\"ui-draggable-disabled\");\n\t\t}\n    this.element[0].style.msTouchAction = this.element[0].style.touchAction = 'none';\n\n\t\tthis._mouseInit();\n\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeClass( \"ui-draggable ui-draggable-dragging ui-draggable-disabled\" );\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function(event) {\n\n\t\tvar o = this.options;\n\n\t\t\/\/ among others, prevent a drag on a resizable-handle\n\t\tif (this.helper || o.disabled || $(event.target).closest(\".ui-resizable-handle\").length > 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t\/\/Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle(event);\n\t\tif (!this.handle) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$(o.iframeFix === true ? \"iframe\" : o.iframeFix).each(function() {\n\t\t\t$(\"<div class='ui-draggable-iframeFix' style='background: #fff;'><\/div>\")\n\t\t\t.css({\n\t\t\t\twidth: this.offsetWidth+\"px\", height: this.offsetHeight+\"px\",\n\t\t\t\tposition: \"absolute\", opacity: \"0.001\", zIndex: 1000\n\t\t\t})\n\t\t\t.css($(this).offset())\n\t\t\t.appendTo(\"body\");\n\t\t});\n\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar o = this.options;\n\n\t\t\/\/Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\tthis.helper.addClass(\"ui-draggable-dragging\");\n\n\t\t\/\/Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t\/\/If ddmanager is used for droppables, set the global draggable\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t\/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t *\/\n\n\t\t\/\/Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t\/\/Store the helper's css position\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t\/\/The element's absolute position on the page minus margins\n\t\tthis.offset = this.positionAbs = this.element.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { \/\/Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() \/\/This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t\/\/Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t\/\/Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t\/\/Set a containment if given in the options\n\t\tif(o.containment) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\t\/\/Trigger event + callbacks\n\t\tif(this._trigger(\"start\", event) === false) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t\/\/Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t\/\/Prepare the droppable offsets\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\n\t\tthis._mouseDrag(event, true); \/\/Execute the drag once - this causes the helper not to be visible before getting its correct position\n\n\t\t\/\/If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart(this, event);\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function(event, noPropagation) {\n\n\t\t\/\/Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t\/\/Call plugins and callbacks and use the resulting position if something is returned\n\t\tif (!noPropagation) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif(this._trigger(\"drag\", event, ui) === false) {\n\t\t\t\tthis._mouseUp({});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\n\t\t}\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\n\t\t}\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\t\/\/If we are using droppables, inform the manager about the drop\n\t\tvar element,\n\t\t\tthat = this,\n\t\t\telementInDom = false,\n\t\t\tdropped = false;\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\tdropped = $.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\t\/\/if a drop comes from outside (a sortable)\n\t\tif(this.dropped) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\t\/\/if the original element is no longer in the DOM don't bother to continue (see #8269)\n\t\telement = this.element[0];\n\t\twhile ( element && (element = element.parentNode) ) {\n\t\t\tif (element === document ) {\n\t\t\t\telementInDom = true;\n\t\t\t}\n\t\t}\n\t\tif ( !elementInDom && this.options.helper === \"original\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif((this.options.revert === \"invalid\" && !dropped) || (this.options.revert === \"valid\" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {\n\t\t\t$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {\n\t\t\t\tif(that._trigger(\"stop\", event) !== false) {\n\t\t\t\t\tthat._clear();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(this._trigger(\"stop\", event) !== false) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function(event) {\n\t\t\/\/Remove frame helpers\n\t\t$(\"div.ui-draggable-iframeFix\").each(function() {\n\t\t\tthis.parentNode.removeChild(this);\n\t\t});\n\n\t\t\/\/If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)\n\t\tif( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop(this, event);\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call(this, event);\n\t},\n\n\tcancel: function() {\n\n\t\tif(this.helper.is(\".ui-draggable-dragging\")) {\n\t\t\tthis._mouseUp({});\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function(event) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === \"clone\" ? this.element.clone().removeAttr(\"id\") : this.element);\n\n\t\tif(!helper.parents(\"body\").length) {\n\t\t\thelper.appendTo((o.appendTo === \"parent\" ? this.element[0].parentNode : o.appendTo));\n\t\t}\n\n\t\tif(helper[0] !== this.element[0] && !(\/(fixed|absolute)\/).test(helper.css(\"position\"))) {\n\t\t\thelper.css(\"position\", \"absolute\");\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t\/\/Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t\/\/ This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t\/\/ 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t\/\/ 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t\/\/    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t\/\/This needs to be actually done for all browsers, since pageX\/pageY includes this information\n\t\t\/\/Ugly IE fix\n\t\tif((this.offsetParent[0] === document.body) ||\n\t\t\t(this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition === \"relative\") {\n\t\t\tvar p = this.element.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.element.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.element.css(\"marginTop\"),10) || 0),\n\t\t\tright: (parseInt(this.element.css(\"marginRight\"),10) || 0),\n\t\t\tbottom: (parseInt(this.element.css(\"marginBottom\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar over, c, ce,\n\t\t\to = this.options;\n\n\t\tif(o.containment === \"parent\") {\n\t\t\to.containment = this.helper[0].parentNode;\n\t\t}\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\n\t\t\tthis.containment = [\n\t\t\t\to.containment === \"document\" ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\to.containment === \"document\" ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t(o.containment === \"document\" ? 0 : $(window).scrollLeft()) + $(o.containment === \"document\" ? document : window).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t(o.containment === \"document\" ? 0 : $(window).scrollTop()) + ($(o.containment === \"document\" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif(!(\/^(document|window|parent)$\/).test(o.containment) && o.containment.constructor !== Array) {\n\t\t\tc = $(o.containment);\n\t\t\tce = c[0];\n\n\t\t\tif(!ce) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\n\n\t\t\tthis.containment = [\n\t\t\t\t(parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0),\n\t\t\t\t(parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0),\n\t\t\t\t(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderRightWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,\n\t\t\t\t(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderBottomWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom\n\t\t\t];\n\t\t\tthis.relative_container = c;\n\n\t\t} else if(o.containment.constructor === Array) {\n\t\t\tthis.containment = o.containment;\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (\/(html|body)\/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\n\t\t\tscrollIsRootNode = (\/(html|body)\/i).test(scroll[0].tagName),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t\/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t *\/\n\n\t\tif(this.originalPosition) { \/\/If we are not dragging yet, we won't check for options\n\t\t\tif(this.containment) {\n\t\t\tif (this.relative_container){\n\t\t\t\tco = this.relative_container.offset();\n\t\t\t\tcontainment = [ this.containment[0] + co.left,\n\t\t\t\t\tthis.containment[1] + co.top,\n\t\t\t\t\tthis.containment[2] + co.left,\n\t\t\t\t\tthis.containment[3] + co.top ];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontainment = this.containment;\n\t\t\t}\n\n\t\t\t\tif(event.pageX - this.offset.click.left < containment[0]) {\n\t\t\t\t\tpageX = containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top < containment[1]) {\n\t\t\t\t\tpageY = containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif(event.pageX - this.offset.click.left > containment[2]) {\n\t\t\t\t\tpageX = containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top > containment[3]) {\n\t\t\t\t\tpageY = containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\t\/\/Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) \/ o.grid[1]) * o.grid[1] : this.originalPageY;\n\t\t\t\tpageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) \/ o.grid[0]) * o.grid[0] : this.originalPageX;\n\t\t\t\tpageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.click.top\t-\t\t\t\t\t\t\t\t\t\t\t\t\/\/ Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top -\t\t\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t\/\/ Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left -\t\t\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis.helper.removeClass(\"ui-draggable-dragging\");\n\t\tif(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t},\n\n\t\/\/ From now on bulk stuff - mainly helpers\n\n\t_trigger: function(type, event, ui) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call(this, type, [event, ui]);\n\t\t\/\/The absolute position has to be recalculated after plugins\n\t\tif(type === \"drag\") {\n\t\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call(this, type, event, ui);\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n});\n\n$.ui.plugin.add(\"draggable\", \"connectToSortable\", {\n\tstart: function(event, ui) {\n\n\t\tvar inst = $(this).data(\"ui-draggable\"), o = inst.options,\n\t\t\tuiSortable = $.extend({}, ui, { item: inst.element });\n\t\tinst.sortables = [];\n\t\t$(o.connectToSortable).each(function() {\n\t\t\tvar sortable = $.data(this, \"ui-sortable\");\n\t\t\tif (sortable && !sortable.options.disabled) {\n\t\t\t\tinst.sortables.push({\n\t\t\t\t\tinstance: sortable,\n\t\t\t\t\tshouldRevert: sortable.options.revert\n\t\t\t\t});\n\t\t\t\tsortable.refreshPositions();\t\/\/ Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).\n\t\t\t\tsortable._trigger(\"activate\", event, uiSortable);\n\t\t\t}\n\t\t});\n\n\t},\n\tstop: function(event, ui) {\n\n\t\t\/\/If we are still over the sortable, we fake the stop event of the sortable, but also remove helper\n\t\tvar inst = $(this).data(\"ui-draggable\"),\n\t\t\tuiSortable = $.extend({}, ui, { item: inst.element });\n\n\t\t$.each(inst.sortables, function() {\n\t\t\tif(this.instance.isOver) {\n\n\t\t\t\tthis.instance.isOver = 0;\n\n\t\t\t\tinst.cancelHelperRemoval = true; \/\/Don't remove the helper in the draggable instance\n\t\t\t\tthis.instance.cancelHelperRemoval = false; \/\/Remove it in the sortable instance (so sortable plugins like revert still work)\n\n\t\t\t\t\/\/The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: \"valid\/invalid\"\n\t\t\t\tif(this.shouldRevert) {\n\t\t\t\t\tthis.instance.options.revert = this.shouldRevert;\n\t\t\t\t}\n\n\t\t\t\t\/\/Trigger the stop of the sortable\n\t\t\t\tthis.instance._mouseStop(event);\n\n\t\t\t\tthis.instance.options.helper = this.instance.options._helper;\n\n\t\t\t\t\/\/If the helper has been the original item, restore properties in the sortable\n\t\t\t\tif(inst.options.helper === \"original\") {\n\t\t\t\t\tthis.instance.currentItem.css({ top: \"auto\", left: \"auto\" });\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tthis.instance.cancelHelperRemoval = false; \/\/Remove the helper in the sortable instance\n\t\t\t\tthis.instance._trigger(\"deactivate\", event, uiSortable);\n\t\t\t}\n\n\t\t});\n\n\t},\n\tdrag: function(event, ui) {\n\n\t\tvar inst = $(this).data(\"ui-draggable\"), that = this;\n\n\t\t$.each(inst.sortables, function() {\n\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tthisSortable = this;\n\n\t\t\t\/\/Copy over some variables to allow calling the sortable's native _intersectsWith\n\t\t\tthis.instance.positionAbs = inst.positionAbs;\n\t\t\tthis.instance.helperProportions = inst.helperProportions;\n\t\t\tthis.instance.offset.click = inst.offset.click;\n\n\t\t\tif(this.instance._intersectsWith(this.instance.containerCache)) {\n\t\t\t\tinnermostIntersecting = true;\n\t\t\t\t$.each(inst.sortables, function () {\n\t\t\t\t\tthis.instance.positionAbs = inst.positionAbs;\n\t\t\t\t\tthis.instance.helperProportions = inst.helperProportions;\n\t\t\t\t\tthis.instance.offset.click = inst.offset.click;\n\t\t\t\t\tif (this !== thisSortable &&\n\t\t\t\t\t\tthis.instance._intersectsWith(this.instance.containerCache) &&\n\t\t\t\t\t\t$.contains(thisSortable.instance.element[0], this.instance.element[0])\n\t\t\t\t\t) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t});\n\t\t\t}\n\n\n\t\t\tif(innermostIntersecting) {\n\t\t\t\t\/\/If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once\n\t\t\t\tif(!this.instance.isOver) {\n\n\t\t\t\t\tthis.instance.isOver = 1;\n\t\t\t\t\t\/\/Now we fake the start of dragging for the sortable instance,\n\t\t\t\t\t\/\/by cloning the list group item, appending it to the sortable and using it as inst.currentItem\n\t\t\t\t\t\/\/We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)\n\t\t\t\t\tthis.instance.currentItem = $(that).clone().removeAttr(\"id\").appendTo(this.instance.element).data(\"ui-sortable-item\", true);\n\t\t\t\t\tthis.instance.options._helper = this.instance.options.helper; \/\/Store helper option to later restore it\n\t\t\t\t\tthis.instance.options.helper = function() { return ui.helper[0]; };\n\n\t\t\t\t\tevent.target = this.instance.currentItem[0];\n\t\t\t\t\tthis.instance._mouseCapture(event, true);\n\t\t\t\t\tthis.instance._mouseStart(event, true, true);\n\n\t\t\t\t\t\/\/Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes\n\t\t\t\t\tthis.instance.offset.click.top = inst.offset.click.top;\n\t\t\t\t\tthis.instance.offset.click.left = inst.offset.click.left;\n\t\t\t\t\tthis.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;\n\t\t\t\t\tthis.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;\n\n\t\t\t\t\tinst._trigger(\"toSortable\", event);\n\t\t\t\t\tinst.dropped = this.instance.element; \/\/draggable revert needs that\n\t\t\t\t\t\/\/hack so receive\/update callbacks work (mostly)\n\t\t\t\t\tinst.currentItem = inst.element;\n\t\t\t\t\tthis.instance.fromOutside = inst;\n\n\t\t\t\t}\n\n\t\t\t\t\/\/Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable\n\t\t\t\tif(this.instance.currentItem) {\n\t\t\t\t\tthis.instance._mouseDrag(event);\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t\/\/If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t\/\/we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval\n\t\t\t\tif(this.instance.isOver) {\n\n\t\t\t\t\tthis.instance.isOver = 0;\n\t\t\t\t\tthis.instance.cancelHelperRemoval = true;\n\n\t\t\t\t\t\/\/Prevent reverting on this forced stop\n\t\t\t\t\tthis.instance.options.revert = false;\n\n\t\t\t\t\t\/\/ The out event needs to be triggered independently\n\t\t\t\t\tthis.instance._trigger(\"out\", event, this.instance._uiHash(this.instance));\n\n\t\t\t\t\tthis.instance._mouseStop(event, true);\n\t\t\t\t\tthis.instance.options.helper = this.instance.options._helper;\n\n\t\t\t\t\t\/\/Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size\n\t\t\t\t\tthis.instance.currentItem.remove();\n\t\t\t\t\tif(this.instance.placeholder) {\n\t\t\t\t\t\tthis.instance.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\tinst._trigger(\"fromSortable\", event);\n\t\t\t\t\tinst.dropped = false; \/\/draggable revert needs that\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t});\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"cursor\", {\n\tstart: function() {\n\t\tvar t = $(\"body\"), o = $(this).data(\"ui-draggable\").options;\n\t\tif (t.css(\"cursor\")) {\n\t\t\to._cursor = t.css(\"cursor\");\n\t\t}\n\t\tt.css(\"cursor\", o.cursor);\n\t},\n\tstop: function() {\n\t\tvar o = $(this).data(\"ui-draggable\").options;\n\t\tif (o._cursor) {\n\t\t\t$(\"body\").css(\"cursor\", o._cursor);\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"opacity\", {\n\tstart: function(event, ui) {\n\t\tvar t = $(ui.helper), o = $(this).data(\"ui-draggable\").options;\n\t\tif(t.css(\"opacity\")) {\n\t\t\to._opacity = t.css(\"opacity\");\n\t\t}\n\t\tt.css(\"opacity\", o.opacity);\n\t},\n\tstop: function(event, ui) {\n\t\tvar o = $(this).data(\"ui-draggable\").options;\n\t\tif(o._opacity) {\n\t\t\t$(ui.helper).css(\"opacity\", o._opacity);\n\t\t}\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"scroll\", {\n\tstart: function() {\n\t\tvar i = $(this).data(\"ui-draggable\");\n\t\tif(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== \"HTML\") {\n\t\t\ti.overflowOffset = i.scrollParent.offset();\n\t\t}\n\t},\n\tdrag: function( event ) {\n\n\t\tvar i = $(this).data(\"ui-draggable\"), o = i.options, scrolled = false;\n\n\t\tif(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== \"HTML\") {\n\n\t\t\tif(!o.axis || o.axis !== \"x\") {\n\t\t\t\tif((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\n\t\t\t\t\ti.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {\n\t\t\t\t\ti.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!o.axis || o.axis !== \"y\") {\n\t\t\t\tif((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\n\t\t\t\t\ti.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {\n\t\t\t\t\ti.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif(!o.axis || o.axis !== \"x\") {\n\t\t\t\tif(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!o.axis || o.axis !== \"y\") {\n\t\t\t\tif(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(i, event);\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"snap\", {\n\tstart: function() {\n\n\t\tvar i = $(this).data(\"ui-draggable\"),\n\t\t\to = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$(o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap).each(function() {\n\t\t\tvar $t = $(this),\n\t\t\t\t$o = $t.offset();\n\t\t\tif(this !== i.element[0]) {\n\t\t\t\ti.snapElements.push({\n\t\t\t\t\titem: this,\n\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t},\n\tdrag: function(event, ui) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\tinst = $(this).data(\"ui-draggable\"),\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor (i = inst.snapElements.length - 1; i >= 0; i--){\n\n\t\t\tl = inst.snapElements[i].left;\n\t\t\tr = l + inst.snapElements[i].width;\n\t\t\tt = inst.snapElements[i].top;\n\t\t\tb = t + inst.snapElements[i].height;\n\n\t\t\t\/\/Yes, I know, this is insane ;)\n\t\t\tif(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {\n\t\t\t\tif(inst.snapElements[i].snapping) {\n\t\t\t\t\t(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t\t}\n\t\t\t\tinst.snapElements[i].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(o.snapMode !== \"inner\") {\n\t\t\t\tts = Math.abs(t - y2) <= d;\n\t\t\t\tbs = Math.abs(b - y1) <= d;\n\t\t\t\tls = Math.abs(l - x2) <= d;\n\t\t\t\trs = Math.abs(r - x1) <= d;\n\t\t\t\tif(ts) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;\n\t\t\t\t}\n\t\t\t\tif(bs) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b, left: 0 }).top - inst.margins.top;\n\t\t\t\t}\n\t\t\t\tif(ls) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;\n\t\t\t\t}\n\t\t\t\tif(rs) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r }).left - inst.margins.left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = (ts || bs || ls || rs);\n\n\t\t\tif(o.snapMode !== \"outer\") {\n\t\t\t\tts = Math.abs(t - y1) <= d;\n\t\t\t\tbs = Math.abs(b - y2) <= d;\n\t\t\t\tls = Math.abs(l - x1) <= d;\n\t\t\t\trs = Math.abs(r - x2) <= d;\n\t\t\t\tif(ts) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t, left: 0 }).top - inst.margins.top;\n\t\t\t\t}\n\t\t\t\tif(bs) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;\n\t\t\t\t}\n\t\t\t\tif(ls) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l }).left - inst.margins.left;\n\t\t\t\t}\n\t\t\t\tif(rs) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {\n\t\t\t\t(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t}\n\t\t\tinst.snapElements[i].snapping = (ts || bs || ls || rs || first);\n\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"stack\", {\n\tstart: function() {\n\t\tvar min,\n\t\t\to = this.data(\"ui-draggable\").options,\n\t\t\tgroup = $.makeArray($(o.stack)).sort(function(a,b) {\n\t\t\t\treturn (parseInt($(a).css(\"zIndex\"),10) || 0) - (parseInt($(b).css(\"zIndex\"),10) || 0);\n\t\t\t});\n\n\t\tif (!group.length) { return; }\n\n\t\tmin = parseInt($(group[0]).css(\"zIndex\"), 10) || 0;\n\t\t$(group).each(function(i) {\n\t\t\t$(this).css(\"zIndex\", min + i);\n\t\t});\n\t\tthis.css(\"zIndex\", (min + group.length));\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"zIndex\", {\n\tstart: function(event, ui) {\n\t\tvar t = $(ui.helper), o = $(this).data(\"ui-draggable\").options;\n\t\tif(t.css(\"zIndex\")) {\n\t\t\to._zIndex = t.css(\"zIndex\");\n\t\t}\n\t\tt.css(\"zIndex\", o.zIndex);\n\t},\n\tstop: function(event, ui) {\n\t\tvar o = $(this).data(\"ui-draggable\").options;\n\t\tif(o._zIndex) {\n\t\t\t$(ui.helper).css(\"zIndex\", o._zIndex);\n\t\t}\n\t}\n});\n\n})(jQuery);\n\n(function( $, undefined ) {\n\nfunction isOverAxis( x, reference, size ) {\n\treturn ( x > reference ) && ( x < ( reference + size ) );\n}\n\n$.widget(\"ui.droppable\", {\n\tversion: \"1.10.2\",\n\twidgetEventPrefix: \"drop\",\n\toptions: {\n\t\taccept: \"*\",\n\t\tactiveClass: false,\n\t\taddClasses: true,\n\t\tgreedy: false,\n\t\thoverClass: false,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\n\t\t\/\/ callbacks\n\t\tactivate: null,\n\t\tdeactivate: null,\n\t\tdrop: null,\n\t\tout: null,\n\t\tover: null\n\t},\n\t_create: function() {\n\n\t\tvar o = this.options,\n\t\t\taccept = o.accept;\n\n\t\tthis.isover = false;\n\t\tthis.isout = true;\n\n\t\tthis.accept = $.isFunction(accept) ? accept : function(d) {\n\t\t\treturn d.is(accept);\n\t\t};\n\n\t\t\/\/Store the droppable's proportions\n\t\tthis.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };\n\n\t\t\/\/ Add the reference and positions to the manager\n\t\t$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];\n\t\t$.ui.ddmanager.droppables[o.scope].push(this);\n\n\t\t(o.addClasses && this.element.addClass(\"ui-droppable\"));\n\n\t},\n\n\t_destroy: function() {\n\t\tvar i = 0,\n\t\t\tdrop = $.ui.ddmanager.droppables[this.options.scope];\n\n\t\tfor ( ; i < drop.length; i++ ) {\n\t\t\tif ( drop[i] === this ) {\n\t\t\t\tdrop.splice(i, 1);\n\t\t\t}\n\t\t}\n\n\t\tthis.element.removeClass(\"ui-droppable ui-droppable-disabled\");\n\t},\n\n\t_setOption: function(key, value) {\n\n\t\tif(key === \"accept\") {\n\t\t\tthis.accept = $.isFunction(value) ? value : function(d) {\n\t\t\t\treturn d.is(value);\n\t\t\t};\n\t\t}\n\t\t$.Widget.prototype._setOption.apply(this, arguments);\n\t},\n\n\t_activate: function(event) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\t\tif(this.options.activeClass) {\n\t\t\tthis.element.addClass(this.options.activeClass);\n\t\t}\n\t\tif(draggable){\n\t\t\tthis._trigger(\"activate\", event, this.ui(draggable));\n\t\t}\n\t},\n\n\t_deactivate: function(event) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\t\tif(this.options.activeClass) {\n\t\t\tthis.element.removeClass(this.options.activeClass);\n\t\t}\n\t\tif(draggable){\n\t\t\tthis._trigger(\"deactivate\", event, this.ui(draggable));\n\t\t}\n\t},\n\n\t_over: function(event) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t\/\/ Bail if draggable and droppable are same element\n\t\tif (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {\n\t\t\tif(this.options.hoverClass) {\n\t\t\t\tthis.element.addClass(this.options.hoverClass);\n\t\t\t}\n\t\t\tthis._trigger(\"over\", event, this.ui(draggable));\n\t\t}\n\n\t},\n\n\t_out: function(event) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t\/\/ Bail if draggable and droppable are same element\n\t\tif (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {\n\t\t\tif(this.options.hoverClass) {\n\t\t\t\tthis.element.removeClass(this.options.hoverClass);\n\t\t\t}\n\t\t\tthis._trigger(\"out\", event, this.ui(draggable));\n\t\t}\n\n\t},\n\n\t_drop: function(event,custom) {\n\n\t\tvar draggable = custom || $.ui.ddmanager.current,\n\t\t\tchildrenIntersection = false;\n\n\t\t\/\/ Bail if draggable and droppable are same element\n\t\tif (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.element.find(\":data(ui-droppable)\").not(\".ui-draggable-dragging\").each(function() {\n\t\t\tvar inst = $.data(this, \"ui-droppable\");\n\t\t\tif(\n\t\t\t\tinst.options.greedy &&\n\t\t\t\t!inst.options.disabled &&\n\t\t\t\tinst.options.scope === draggable.options.scope &&\n\t\t\t\tinst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) &&\n\t\t\t\t$.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)\n\t\t\t) { childrenIntersection = true; return false; }\n\t\t});\n\t\tif(childrenIntersection) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {\n\t\t\tif(this.options.activeClass) {\n\t\t\t\tthis.element.removeClass(this.options.activeClass);\n\t\t\t}\n\t\t\tif(this.options.hoverClass) {\n\t\t\t\tthis.element.removeClass(this.options.hoverClass);\n\t\t\t}\n\t\t\tthis._trigger(\"drop\", event, this.ui(draggable));\n\t\t\treturn this.element;\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tui: function(c) {\n\t\treturn {\n\t\t\tdraggable: (c.currentItem || c.element),\n\t\t\thelper: c.helper,\n\t\t\tposition: c.position,\n\t\t\toffset: c.positionAbs\n\t\t};\n\t}\n\n});\n\n$.ui.intersect = function(draggable, droppable, toleranceMode) {\n\n\tif (!droppable.offset) {\n\t\treturn false;\n\t}\n\n\tvar draggableLeft, draggableTop,\n\t\tx1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,\n\t\ty1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height,\n\t\tl = droppable.offset.left, r = l + droppable.proportions.width,\n\t\tt = droppable.offset.top, b = t + droppable.proportions.height;\n\n\tswitch (toleranceMode) {\n\t\tcase \"fit\":\n\t\t\treturn (l <= x1 && x2 <= r && t <= y1 && y2 <= b);\n\t\tcase \"intersect\":\n\t\t\treturn (l < x1 + (draggable.helperProportions.width \/ 2) && \/\/ Right Half\n\t\t\t\tx2 - (draggable.helperProportions.width \/ 2) < r && \/\/ Left Half\n\t\t\t\tt < y1 + (draggable.helperProportions.height \/ 2) && \/\/ Bottom Half\n\t\t\t\ty2 - (draggable.helperProportions.height \/ 2) < b ); \/\/ Top Half\n\t\tcase \"pointer\":\n\t\t\tdraggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left);\n\t\t\tdraggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top);\n\t\t\treturn isOverAxis( draggableTop, t, droppable.proportions.height ) && isOverAxis( draggableLeft, l, droppable.proportions.width );\n\t\tcase \"touch\":\n\t\t\treturn (\n\t\t\t\t(y1 >= t && y1 <= b) ||\t\/\/ Top edge touching\n\t\t\t\t(y2 >= t && y2 <= b) ||\t\/\/ Bottom edge touching\n\t\t\t\t(y1 < t && y2 > b)\t\t\/\/ Surrounded vertically\n\t\t\t) && (\n\t\t\t\t(x1 >= l && x1 <= r) ||\t\/\/ Left edge touching\n\t\t\t\t(x2 >= l && x2 <= r) ||\t\/\/ Right edge touching\n\t\t\t\t(x1 < l && x2 > r)\t\t\/\/ Surrounded horizontally\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\n};\n\n\/*\n\tThis manager tracks offsets of draggables and droppables\n*\/\n$.ui.ddmanager = {\n\tcurrent: null,\n\tdroppables: { \"default\": [] },\n\tprepareOffsets: function(t, event) {\n\n\t\tvar i, j,\n\t\t\tm = $.ui.ddmanager.droppables[t.options.scope] || [],\n\t\t\ttype = event ? event.type : null, \/\/ workaround for #2317\n\t\t\tlist = (t.currentItem || t.element).find(\":data(ui-droppable)\").addBack();\n\n\t\tdroppablesLoop: for (i = 0; i < m.length; i++) {\n\n\t\t\t\/\/No disabled and non-accepted\n\t\t\tif(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t\/\/ Filter out elements in the current dragged item\n\t\t\tfor (j=0; j < list.length; j++) {\n\t\t\t\tif(list[j] === m[i].element[0]) {\n\t\t\t\t\tm[i].proportions.height = 0;\n\t\t\t\t\tcontinue droppablesLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm[i].visible = m[i].element.css(\"display\") !== \"none\";\n\t\t\tif(!m[i].visible) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t\/\/Activate the droppable if used directly from draggables\n\t\t\tif(type === \"mousedown\") {\n\t\t\t\tm[i]._activate.call(m[i], event);\n\t\t\t}\n\n\t\t\tm[i].offset = m[i].element.offset();\n\t\t\tm[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };\n\n\t\t}\n\n\t},\n\tdrop: function(draggable, event) {\n\n\t\tvar dropped = false;\n\t\t\/\/ Create a copy of the droppables in case the list changes during the drop (#9116)\n\t\t$.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() {\n\n\t\t\tif(!this.options) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) {\n\t\t\t\tdropped = this._drop.call(this, event) || dropped;\n\t\t\t}\n\n\t\t\tif (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {\n\t\t\t\tthis.isout = true;\n\t\t\t\tthis.isover = false;\n\t\t\t\tthis._deactivate.call(this, event);\n\t\t\t}\n\n\t\t});\n\t\treturn dropped;\n\n\t},\n\tdragStart: function( draggable, event ) {\n\t\t\/\/Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)\n\t\tdraggable.element.parentsUntil( \"body\" ).bind( \"scroll.droppable\", function() {\n\t\t\tif( !draggable.options.refreshPositions ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t\t}\n\t\t});\n\t},\n\tdrag: function(draggable, event) {\n\n\t\t\/\/If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.\n\t\tif(draggable.options.refreshPositions) {\n\t\t\t$.ui.ddmanager.prepareOffsets(draggable, event);\n\t\t}\n\n\t\t\/\/Run through all droppables and check their positions based on specific tolerance options\n\t\t$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {\n\n\t\t\tif(this.options.disabled || this.greedyChild || !this.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parentInstance, scope, parent,\n\t\t\t\tintersects = $.ui.intersect(draggable, this, this.options.tolerance),\n\t\t\t\tc = !intersects && this.isover ? \"isout\" : (intersects && !this.isover ? \"isover\" : null);\n\t\t\tif(!c) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.options.greedy) {\n\t\t\t\t\/\/ find droppable parents with same scope\n\t\t\t\tscope = this.options.scope;\n\t\t\t\tparent = this.element.parents(\":data(ui-droppable)\").filter(function () {\n\t\t\t\t\treturn $.data(this, \"ui-droppable\").options.scope === scope;\n\t\t\t\t});\n\n\t\t\t\tif (parent.length) {\n\t\t\t\t\tparentInstance = $.data(parent[0], \"ui-droppable\");\n\t\t\t\t\tparentInstance.greedyChild = (c === \"isover\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\/\/ we just moved into a greedy child\n\t\t\tif (parentInstance && c === \"isover\") {\n\t\t\t\tparentInstance.isover = false;\n\t\t\t\tparentInstance.isout = true;\n\t\t\t\tparentInstance._out.call(parentInstance, event);\n\t\t\t}\n\n\t\t\tthis[c] = true;\n\t\t\tthis[c === \"isout\" ? \"isover\" : \"isout\"] = false;\n\t\t\tthis[c === \"isover\" ? \"_over\" : \"_out\"].call(this, event);\n\n\t\t\t\/\/ we just moved out of a greedy child\n\t\t\tif (parentInstance && c === \"isout\") {\n\t\t\t\tparentInstance.isout = false;\n\t\t\t\tparentInstance.isover = true;\n\t\t\t\tparentInstance._over.call(parentInstance, event);\n\t\t\t}\n\t\t});\n\n\t},\n\tdragStop: function( draggable, event ) {\n\t\tdraggable.element.parentsUntil( \"body\" ).unbind( \"scroll.droppable\" );\n\t\t\/\/Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)\n\t\tif( !draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\t}\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\nfunction num(v) {\n\treturn parseInt(v, 10) || 0;\n}\n\nfunction isNumber(value) {\n\treturn !isNaN(parseInt(value, 10));\n}\n\n$.widget(\"ui.resizable\", $.ui.mouse, {\n\tversion: \"1.10.2\",\n\twidgetEventPrefix: \"resize\",\n\toptions: {\n\t\talsoResize: false,\n\t\tanimate: false,\n\t\tanimateDuration: \"slow\",\n\t\tanimateEasing: \"swing\",\n\t\taspectRatio: false,\n\t\tautoHide: false,\n\t\tcontainment: false,\n\t\tghost: false,\n\t\tgrid: false,\n\t\thandles: \"e,s,se\",\n\t\thelper: false,\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 10,\n\t\tminWidth: 10,\n\t\t\/\/ See #7960\n\t\tzIndex: 90,\n\n\t\t\/\/ callbacks\n\t\tresize: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tvar n, i, handle, axis, hname,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\t\tthis.element.addClass(\"ui-resizable\");\n\n\t\t$.extend(this, {\n\t\t\t_aspectRatio: !!(o.aspectRatio),\n\t\t\taspectRatio: o.aspectRatio,\n\t\t\toriginalElement: this.element,\n\t\t\t_proportionallyResizeElements: [],\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\n\t\t});\n\n\t\t\/\/Wrap the element if it cannot hold child nodes\n\t\tif(this.element[0].nodeName.match(\/canvas|textarea|input|select|button|img\/i)) {\n\n\t\t\t\/\/Create a wrapper element and set the wrapper to the new current internal element\n\t\t\tthis.element.wrap(\n\t\t\t\t$(\"<div class='ui-wrapper' style='overflow: hidden;'><\/div>\").css({\n\t\t\t\t\tposition: this.element.css(\"position\"),\n\t\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\t\ttop: this.element.css(\"top\"),\n\t\t\t\t\tleft: this.element.css(\"left\")\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t\/\/Overwrite the original this.element\n\t\t\tthis.element = this.element.parent().data(\n\t\t\t\t\"ui-resizable\", this.element.data(\"ui-resizable\")\n\t\t\t);\n\n\t\t\tthis.elementIsWrapper = true;\n\n\t\t\t\/\/Move margins to the wrapper\n\t\t\tthis.element.css({ marginLeft: this.originalElement.css(\"marginLeft\"), marginTop: this.originalElement.css(\"marginTop\"), marginRight: this.originalElement.css(\"marginRight\"), marginBottom: this.originalElement.css(\"marginBottom\") });\n\t\t\tthis.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});\n\n\t\t\t\/\/Prevent Safari textarea resize\n\t\t\tthis.originalResizeStyle = this.originalElement.css(\"resize\");\n\t\t\tthis.originalElement.css(\"resize\", \"none\");\n\n\t\t\t\/\/Push the actual element to our proportionallyResize internal array\n\t\t\tthis._proportionallyResizeElements.push(this.originalElement.css({ position: \"static\", zoom: 1, display: \"block\" }));\n\n\t\t\t\/\/ avoid IE jump (hard set the margin)\n\t\t\tthis.originalElement.css({ margin: this.originalElement.css(\"margin\") });\n\n\t\t\t\/\/ fix handlers offset\n\t\t\tthis._proportionallyResize();\n\n\t\t}\n\n\t\tthis.handles = o.handles || (!$(\".ui-resizable-handle\", this.element).length ? \"e,s,se\" : { n: \".ui-resizable-n\", e: \".ui-resizable-e\", s: \".ui-resizable-s\", w: \".ui-resizable-w\", se: \".ui-resizable-se\", sw: \".ui-resizable-sw\", ne: \".ui-resizable-ne\", nw: \".ui-resizable-nw\" });\n\t\tif(this.handles.constructor === String) {\n\n\t\t\tif ( this.handles === \"all\") {\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\n\t\t\t}\n\n\t\t\tn = this.handles.split(\",\");\n\t\t\tthis.handles = {};\n\n\t\t\tfor(i = 0; i < n.length; i++) {\n\n\t\t\t\thandle = $.trim(n[i]);\n\t\t\t\thname = \"ui-resizable-\"+handle;\n\t\t\t\taxis = $(\"<div class='ui-resizable-handle \" + hname + \"'><\/div>\");\n\n\t\t\t\t\/\/ Apply zIndex to all handles - see #7960\n\t\t\t\taxis.css({ zIndex: o.zIndex });\n\n\t\t\t\t\/\/TODO : What's going on here?\n\t\t\t\tif (\"se\" === handle) {\n\t\t\t\t\taxis.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\");\n\t\t\t\t}\n\n\t\t\t\t\/\/Insert into internal handles object and append to element\n\t\t\t\tthis.handles[handle] = \".ui-resizable-\"+handle;\n\t\t\t\tthis.element.append(axis);\n\t\t\t}\n\n\t\t}\n\n\t\tthis._renderAxis = function(target) {\n\n\t\t\tvar i, axis, padPos, padWrapper;\n\n\t\t\ttarget = target || this.element;\n\n\t\t\tfor(i in this.handles) {\n\n\t\t\t\tif(this.handles[i].constructor === String) {\n\t\t\t\t\tthis.handles[i] = $(this.handles[i], this.element).show();\n\t\t\t\t}\n\n\t\t\t\t\/\/Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)\n\t\t\t\tif (this.elementIsWrapper && this.originalElement[0].nodeName.match(\/textarea|input|select|button\/i)) {\n\n\t\t\t\t\taxis = $(this.handles[i], this.element);\n\n\t\t\t\t\t\/\/Checking the correct pad and border\n\t\t\t\t\tpadWrapper = \/sw|ne|nw|se|n|s\/.test(i) ? axis.outerHeight() : axis.outerWidth();\n\n\t\t\t\t\t\/\/The padding type i have to apply...\n\t\t\t\t\tpadPos = [ \"padding\",\n\t\t\t\t\t\t\/ne|nw|n\/.test(i) ? \"Top\" :\n\t\t\t\t\t\t\/se|sw|s\/.test(i) ? \"Bottom\" :\n\t\t\t\t\t\t\/^e$\/.test(i) ? \"Right\" : \"Left\" ].join(\"\");\n\n\t\t\t\t\ttarget.css(padPos, padWrapper);\n\n\t\t\t\t\tthis._proportionallyResize();\n\n\t\t\t\t}\n\n\t\t\t\t\/\/TODO: What's that good for? There's not anything to be executed left\n\t\t\t\tif(!$(this.handles[i]).length) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t\/\/TODO: make renderAxis a prototype function\n\t\tthis._renderAxis(this.element);\n\n\t\tthis._handles = $(\".ui-resizable-handle\", this.element)\n\t\t\t.disableSelection();\n\n\t\t\/\/Matching axis name\n\t\tthis._handles.mouseover(function() {\n\t\t\tif (!that.resizing) {\n\t\t\t\tif (this.className) {\n\t\t\t\t\taxis = this.className.match(\/ui-resizable-(se|sw|ne|nw|n|e|s|w)\/i);\n\t\t\t\t}\n\t\t\t\t\/\/Axis, default = se\n\t\t\t\tthat.axis = axis && axis[1] ? axis[1] : \"se\";\n\t\t\t}\n\t\t});\n\n\t\t\/\/If we want to auto hide the elements\n\t\tif (o.autoHide) {\n\t\t\tthis._handles.hide();\n\t\t\t$(this.element)\n\t\t\t\t.addClass(\"ui-resizable-autohide\")\n\t\t\t\t.mouseenter(function() {\n\t\t\t\t\tif (o.disabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t$(this).removeClass(\"ui-resizable-autohide\");\n\t\t\t\t\tthat._handles.show();\n\t\t\t\t})\n\t\t\t\t.mouseleave(function(){\n\t\t\t\t\tif (o.disabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!that.resizing) {\n\t\t\t\t\t\t$(this).addClass(\"ui-resizable-autohide\");\n\t\t\t\t\t\tthat._handles.hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\t\/\/Initialize the mouse interaction\n\t\tthis._mouseInit();\n\n\t},\n\n\t_destroy: function() {\n\n\t\tthis._mouseDestroy();\n\n\t\tvar wrapper,\n\t\t\t_destroy = function(exp) {\n\t\t\t\t$(exp).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\")\n\t\t\t\t\t.removeData(\"resizable\").removeData(\"ui-resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove();\n\t\t\t};\n\n\t\t\/\/TODO: Unwrap at same DOM position\n\t\tif (this.elementIsWrapper) {\n\t\t\t_destroy(this.element);\n\t\t\twrapper = this.element;\n\t\t\tthis.originalElement.css({\n\t\t\t\tposition: wrapper.css(\"position\"),\n\t\t\t\twidth: wrapper.outerWidth(),\n\t\t\t\theight: wrapper.outerHeight(),\n\t\t\t\ttop: wrapper.css(\"top\"),\n\t\t\t\tleft: wrapper.css(\"left\")\n\t\t\t}).insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\n\t\tthis.originalElement.css(\"resize\", this.originalResizeStyle);\n\t\t_destroy(this.originalElement);\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function(event) {\n\t\tvar i, handle,\n\t\t\tcapture = false;\n\n\t\tfor (i in this.handles) {\n\t\t\thandle = $(this.handles[i])[0];\n\t\t\tif (handle === event.target || $.contains(handle, event.target)) {\n\t\t\t\tcapture = true;\n\t\t\t}\n\t\t}\n\n\t\treturn !this.options.disabled && capture;\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar curleft, curtop, cursor,\n\t\t\to = this.options,\n\t\t\tiniPos = this.element.position(),\n\t\t\tel = this.element;\n\n\t\tthis.resizing = true;\n\n\t\t\/\/ bugfix for http:\/\/dev.jquery.com\/ticket\/1749\n\t\tif ( (\/absolute\/).test( el.css(\"position\") ) ) {\n\t\t\tel.css({ position: \"absolute\", top: el.css(\"top\"), left: el.css(\"left\") });\n\t\t} else if (el.is(\".ui-draggable\")) {\n\t\t\tel.css({ position: \"absolute\", top: iniPos.top, left: iniPos.left });\n\t\t}\n\n\t\tthis._renderProxy();\n\n\t\tcurleft = num(this.helper.css(\"left\"));\n\t\tcurtop = num(this.helper.css(\"top\"));\n\n\t\tif (o.containment) {\n\t\t\tcurleft += $(o.containment).scrollLeft() || 0;\n\t\t\tcurtop += $(o.containment).scrollTop() || 0;\n\t\t}\n\n\t\t\/\/Store needed variables\n\t\tthis.offset = this.helper.offset();\n\t\tthis.position = { left: curleft, top: curtop };\n\t\tthis.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };\n\t\tthis.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };\n\t\tthis.originalPosition = { left: curleft, top: curtop };\n\t\tthis.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\n\n\t\t\/\/Aspect Ratio\n\t\tthis.aspectRatio = (typeof o.aspectRatio === \"number\") ? o.aspectRatio : ((this.originalSize.width \/ this.originalSize.height) || 1);\n\n\t\tcursor = $(\".ui-resizable-\" + this.axis).css(\"cursor\");\n\t\t$(\"body\").css(\"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor);\n\n\t\tel.addClass(\"ui-resizable-resizing\");\n\t\tthis._propagate(\"start\", event);\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function(event) {\n\n\t\t\/\/Increase performance, avoid regex\n\t\tvar data,\n\t\t\tel = this.helper, props = {},\n\t\t\tsmp = this.originalMousePosition,\n\t\t\ta = this.axis,\n\t\t\tprevTop = this.position.top,\n\t\t\tprevLeft = this.position.left,\n\t\t\tprevWidth = this.size.width,\n\t\t\tprevHeight = this.size.height,\n\t\t\tdx = (event.pageX-smp.left)||0,\n\t\t\tdy = (event.pageY-smp.top)||0,\n\t\t\ttrigger = this._change[a];\n\n\t\tif (!trigger) {\n\t\t\treturn false;\n\t\t}\n\n\t\t\/\/ Calculate the attrs that will be change\n\t\tdata = trigger.apply(this, [event, dx, dy]);\n\n\t\t\/\/ Put this in the mouseDrag handler since the user can start pressing shift while resizing\n\t\tthis._updateVirtualBoundaries(event.shiftKey);\n\t\tif (this._aspectRatio || event.shiftKey) {\n\t\t\tdata = this._updateRatio(data, event);\n\t\t}\n\n\t\tdata = this._respectSize(data, event);\n\n\t\tthis._updateCache(data);\n\n\t\t\/\/ plugins callbacks need to be called first\n\t\tthis._propagate(\"resize\", event);\n\n\t\tif (this.position.top !== prevTop) {\n\t\t\tprops.top = this.position.top + \"px\";\n\t\t}\n\t\tif (this.position.left !== prevLeft) {\n\t\t\tprops.left = this.position.left + \"px\";\n\t\t}\n\t\tif (this.size.width !== prevWidth) {\n\t\t\tprops.width = this.size.width + \"px\";\n\t\t}\n\t\tif (this.size.height !== prevHeight) {\n\t\t\tprops.height = this.size.height + \"px\";\n\t\t}\n\t\tel.css(props);\n\n\t\tif (!this._helper && this._proportionallyResizeElements.length) {\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\t\/\/ Call the user callback if the element was resized\n\t\tif ( ! $.isEmptyObject(props) ) {\n\t\t\tthis._trigger(\"resize\", event, this.ui());\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\tthis.resizing = false;\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\n\t\t\to = this.options, that = this;\n\n\t\tif(this._helper) {\n\n\t\t\tpr = this._proportionallyResizeElements;\n\t\t\tista = pr.length && (\/textarea\/i).test(pr[0].nodeName);\n\t\t\tsoffseth = ista && $.ui.hasScroll(pr[0], \"left\") \/* TODO - jump height *\/ ? 0 : that.sizeDiff.height;\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\n\n\t\t\ts = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) };\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) + (that.position.left - that.originalPosition.left)) || null;\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) + (that.position.top - that.originalPosition.top)) || null;\n\n\t\t\tif (!o.animate) {\n\t\t\t\tthis.element.css($.extend(s, { top: top, left: left }));\n\t\t\t}\n\n\t\t\tthat.helper.height(that.size.height);\n\t\t\tthat.helper.width(that.size.width);\n\n\t\t\tif (this._helper && !o.animate) {\n\t\t\t\tthis._proportionallyResize();\n\t\t\t}\n\t\t}\n\n\t\t$(\"body\").css(\"cursor\", \"auto\");\n\n\t\tthis.element.removeClass(\"ui-resizable-resizing\");\n\n\t\tthis._propagate(\"stop\", event);\n\n\t\tif (this._helper) {\n\t\t\tthis.helper.remove();\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\t_updateVirtualBoundaries: function(forceAspectRatio) {\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\n\t\t\to = this.options;\n\n\t\tb = {\n\t\t\tminWidth: isNumber(o.minWidth) ? o.minWidth : 0,\n\t\t\tmaxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,\n\t\t\tminHeight: isNumber(o.minHeight) ? o.minHeight : 0,\n\t\t\tmaxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity\n\t\t};\n\n\t\tif(this._aspectRatio || forceAspectRatio) {\n\t\t\t\/\/ We want to create an enclosing box whose aspect ration is the requested one\n\t\t\t\/\/ First, compute the \"projected\" size for each dimension based on the aspect ratio and other dimension\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\n\t\t\tpMinHeight = b.minWidth \/ this.aspectRatio;\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\n\t\t\tpMaxHeight = b.maxWidth \/ this.aspectRatio;\n\n\t\t\tif(pMinWidth > b.minWidth) {\n\t\t\t\tb.minWidth = pMinWidth;\n\t\t\t}\n\t\t\tif(pMinHeight > b.minHeight) {\n\t\t\t\tb.minHeight = pMinHeight;\n\t\t\t}\n\t\t\tif(pMaxWidth < b.maxWidth) {\n\t\t\t\tb.maxWidth = pMaxWidth;\n\t\t\t}\n\t\t\tif(pMaxHeight < b.maxHeight) {\n\t\t\t\tb.maxHeight = pMaxHeight;\n\t\t\t}\n\t\t}\n\t\tthis._vBoundaries = b;\n\t},\n\n\t_updateCache: function(data) {\n\t\tthis.offset = this.helper.offset();\n\t\tif (isNumber(data.left)) {\n\t\t\tthis.position.left = data.left;\n\t\t}\n\t\tif (isNumber(data.top)) {\n\t\t\tthis.position.top = data.top;\n\t\t}\n\t\tif (isNumber(data.height)) {\n\t\t\tthis.size.height = data.height;\n\t\t}\n\t\tif (isNumber(data.width)) {\n\t\t\tthis.size.width = data.width;\n\t\t}\n\t},\n\n\t_updateRatio: function( data ) {\n\n\t\tvar cpos = this.position,\n\t\t\tcsize = this.size,\n\t\t\ta = this.axis;\n\n\t\tif (isNumber(data.height)) {\n\t\t\tdata.width = (data.height * this.aspectRatio);\n\t\t} else if (isNumber(data.width)) {\n\t\t\tdata.height = (data.width \/ this.aspectRatio);\n\t\t}\n\n\t\tif (a === \"sw\") {\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\n\t\t\tdata.top = null;\n\t\t}\n\t\tif (a === \"nw\") {\n\t\t\tdata.top = cpos.top + (csize.height - data.height);\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_respectSize: function( data ) {\n\n\t\tvar o = this._vBoundaries,\n\t\t\ta = this.axis,\n\t\t\tismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),\n\t\t\tisminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height),\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\n\t\t\tdh = this.position.top + this.size.height,\n\t\t\tcw = \/sw|nw|w\/.test(a), ch = \/nw|ne|n\/.test(a);\n\t\tif (isminw) {\n\t\t\tdata.width = o.minWidth;\n\t\t}\n\t\tif (isminh) {\n\t\t\tdata.height = o.minHeight;\n\t\t}\n\t\tif (ismaxw) {\n\t\t\tdata.width = o.maxWidth;\n\t\t}\n\t\tif (ismaxh) {\n\t\t\tdata.height = o.maxHeight;\n\t\t}\n\n\t\tif (isminw && cw) {\n\t\t\tdata.left = dw - o.minWidth;\n\t\t}\n\t\tif (ismaxw && cw) {\n\t\t\tdata.left = dw - o.maxWidth;\n\t\t}\n\t\tif (isminh && ch) {\n\t\t\tdata.top = dh - o.minHeight;\n\t\t}\n\t\tif (ismaxh && ch) {\n\t\t\tdata.top = dh - o.maxHeight;\n\t\t}\n\n\t\t\/\/ fixing jump error on top\/left - bug #2330\n\t\tif (!data.width && !data.height && !data.left && data.top) {\n\t\t\tdata.top = null;\n\t\t} else if (!data.width && !data.height && !data.top && data.left) {\n\t\t\tdata.left = null;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_proportionallyResize: function() {\n\n\t\tif (!this._proportionallyResizeElements.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar i, j, borders, paddings, prel,\n\t\t\telement = this.helper || this.element;\n\n\t\tfor ( i=0; i < this._proportionallyResizeElements.length; i++) {\n\n\t\t\tprel = this._proportionallyResizeElements[i];\n\n\t\t\tif (!this.borderDif) {\n\t\t\t\tthis.borderDif = [];\n\t\t\t\tborders = [prel.css(\"borderTopWidth\"), prel.css(\"borderRightWidth\"), prel.css(\"borderBottomWidth\"), prel.css(\"borderLeftWidth\")];\n\t\t\t\tpaddings = [prel.css(\"paddingTop\"), prel.css(\"paddingRight\"), prel.css(\"paddingBottom\"), prel.css(\"paddingLeft\")];\n\n\t\t\t\tfor ( j = 0; j < borders.length; j++ ) {\n\t\t\t\t\tthis.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprel.css({\n\t\t\t\theight: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,\n\t\t\t\twidth: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0\n\t\t\t});\n\n\t\t}\n\n\t},\n\n\t_renderProxy: function() {\n\n\t\tvar el = this.element, o = this.options;\n\t\tthis.elementOffset = el.offset();\n\n\t\tif(this._helper) {\n\n\t\t\tthis.helper = this.helper || $(\"<div style='overflow:hidden;'><\/div>\");\n\n\t\t\tthis.helper.addClass(this._helper).css({\n\t\t\t\twidth: this.element.outerWidth() - 1,\n\t\t\t\theight: this.element.outerHeight() - 1,\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: this.elementOffset.left +\"px\",\n\t\t\t\ttop: this.elementOffset.top +\"px\",\n\t\t\t\tzIndex: ++o.zIndex \/\/TODO: Don't modify option\n\t\t\t});\n\n\t\t\tthis.helper\n\t\t\t\t.appendTo(\"body\")\n\t\t\t\t.disableSelection();\n\n\t\t} else {\n\t\t\tthis.helper = this.element;\n\t\t}\n\n\t},\n\n\t_change: {\n\t\te: function(event, dx) {\n\t\t\treturn { width: this.originalSize.width + dx };\n\t\t},\n\t\tw: function(event, dx) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\n\t\t},\n\t\tn: function(event, dx, dy) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\n\t\t},\n\t\ts: function(event, dx, dy) {\n\t\t\treturn { height: this.originalSize.height + dy };\n\t\t},\n\t\tse: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));\n\t\t},\n\t\tsw: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));\n\t\t},\n\t\tne: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));\n\t\t},\n\t\tnw: function(event, dx, dy) {\n\t\t\treturn $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));\n\t\t}\n\t},\n\n\t_propagate: function(n, event) {\n\t\t$.ui.plugin.call(this, n, [event, this.ui()]);\n\t\t(n !== \"resize\" && this._trigger(n, event, this.ui()));\n\t},\n\n\tplugins: {},\n\n\tui: function() {\n\t\treturn {\n\t\t\toriginalElement: this.originalElement,\n\t\t\telement: this.element,\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\tsize: this.size,\n\t\t\toriginalSize: this.originalSize,\n\t\t\toriginalPosition: this.originalPosition\n\t\t};\n\t}\n\n});\n\n\/*\n * Resizable Extensions\n *\/\n\n$.ui.plugin.add(\"resizable\", \"animate\", {\n\n\tstop: function( event ) {\n\t\tvar that = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\tpr = that._proportionallyResizeElements,\n\t\t\tista = pr.length && (\/textarea\/i).test(pr[0].nodeName),\n\t\t\tsoffseth = ista && $.ui.hasScroll(pr[0], \"left\") \/* TODO - jump height *\/ ? 0 : that.sizeDiff.height,\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\n\t\t\tstyle = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) + (that.position.left - that.originalPosition.left)) || null,\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) + (that.position.top - that.originalPosition.top)) || null;\n\n\t\tthat.element.animate(\n\t\t\t$.extend(style, top && left ? { top: top, left: left } : {}), {\n\t\t\t\tduration: o.animateDuration,\n\t\t\t\teasing: o.animateEasing,\n\t\t\t\tstep: function() {\n\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\twidth: parseInt(that.element.css(\"width\"), 10),\n\t\t\t\t\t\theight: parseInt(that.element.css(\"height\"), 10),\n\t\t\t\t\t\ttop: parseInt(that.element.css(\"top\"), 10),\n\t\t\t\t\t\tleft: parseInt(that.element.css(\"left\"), 10)\n\t\t\t\t\t};\n\n\t\t\t\t\tif (pr && pr.length) {\n\t\t\t\t\t\t$(pr[0]).css({ width: data.width, height: data.height });\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ propagating resize, and updating values for each animation step\n\t\t\t\t\tthat._updateCache(data);\n\t\t\t\t\tthat._propagate(\"resize\", event);\n\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n});\n\n$.ui.plugin.add(\"resizable\", \"containment\", {\n\n\tstart: function() {\n\t\tvar element, p, co, ch, cw, width, height,\n\t\t\tthat = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\tel = that.element,\n\t\t\toc = o.containment,\n\t\t\tce = (oc instanceof $) ? oc.get(0) : (\/parent\/.test(oc)) ? el.parent().get(0) : oc;\n\n\t\tif (!ce) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.containerElement = $(ce);\n\n\t\tif (\/document\/.test(oc) || oc === document) {\n\t\t\tthat.containerOffset = { left: 0, top: 0 };\n\t\t\tthat.containerPosition = { left: 0, top: 0 };\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: $(document), left: 0, top: 0,\n\t\t\t\twidth: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight\n\t\t\t};\n\t\t}\n\n\t\t\/\/ i'm a node, so compute top, left, right, bottom\n\t\telse {\n\t\t\telement = $(ce);\n\t\t\tp = [];\n\t\t\t$([ \"Top\", \"Right\", \"Left\", \"Bottom\" ]).each(function(i, name) { p[i] = num(element.css(\"padding\" + name)); });\n\n\t\t\tthat.containerOffset = element.offset();\n\t\t\tthat.containerPosition = element.position();\n\t\t\tthat.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };\n\n\t\t\tco = that.containerOffset;\n\t\t\tch = that.containerSize.height;\n\t\t\tcw = that.containerSize.width;\n\t\t\twidth = ($.ui.hasScroll(ce, \"left\") ? ce.scrollWidth : cw );\n\t\t\theight = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: ce, left: co.left, top: co.top, width: width, height: height\n\t\t\t};\n\t\t}\n\t},\n\n\tresize: function( event ) {\n\t\tvar woset, hoset, isParent, isOffsetRelative,\n\t\t\tthat = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset, cp = that.position,\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\n\t\t\tcop = { top:0, left:0 }, ce = that.containerElement;\n\n\t\tif (ce[0] !== document && (\/static\/).test(ce.css(\"position\"))) {\n\t\t\tcop = co;\n\t\t}\n\n\t\tif (cp.left < (that._helper ? co.left : 0)) {\n\t\t\tthat.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));\n\t\t\tif (pRatio) {\n\t\t\t\tthat.size.height = that.size.width \/ that.aspectRatio;\n\t\t\t}\n\t\t\tthat.position.left = o.helper ? co.left : 0;\n\t\t}\n\n\t\tif (cp.top < (that._helper ? co.top : 0)) {\n\t\t\tthat.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);\n\t\t\tif (pRatio) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t}\n\t\t\tthat.position.top = that._helper ? co.top : 0;\n\t\t}\n\n\t\tthat.offset.left = that.parentData.left+that.position.left;\n\t\tthat.offset.top = that.parentData.top+that.position.top;\n\n\t\twoset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width );\n\t\thoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );\n\n\t\tisParent = that.containerElement.get(0) === that.element.parent().get(0);\n\t\tisOffsetRelative = \/relative|absolute\/.test(that.containerElement.css(\"position\"));\n\n\t\tif(isParent && isOffsetRelative) {\n\t\t\twoset -= that.parentData.left;\n\t\t}\n\n\t\tif (woset + that.size.width >= that.parentData.width) {\n\t\t\tthat.size.width = that.parentData.width - woset;\n\t\t\tif (pRatio) {\n\t\t\t\tthat.size.height = that.size.width \/ that.aspectRatio;\n\t\t\t}\n\t\t}\n\n\t\tif (hoset + that.size.height >= that.parentData.height) {\n\t\t\tthat.size.height = that.parentData.height - hoset;\n\t\t\tif (pRatio) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t}\n\t\t}\n\t},\n\n\tstop: function(){\n\t\tvar that = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcop = that.containerPosition,\n\t\t\tce = that.containerElement,\n\t\t\thelper = $(that.helper),\n\t\t\tho = helper.offset(),\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\n\n\t\tif (that._helper && !o.animate && (\/relative\/).test(ce.css(\"position\"))) {\n\t\t\t$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });\n\t\t}\n\n\t\tif (that._helper && !o.animate && (\/static\/).test(ce.css(\"position\"))) {\n\t\t\t$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });\n\t\t}\n\n\t}\n});\n\n$.ui.plugin.add(\"resizable\", \"alsoResize\", {\n\n\tstart: function () {\n\t\tvar that = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\t_store = function (exp) {\n\t\t\t\t$(exp).each(function() {\n\t\t\t\t\tvar el = $(this);\n\t\t\t\t\tel.data(\"ui-resizable-alsoresize\", {\n\t\t\t\t\t\twidth: parseInt(el.width(), 10), height: parseInt(el.height(), 10),\n\t\t\t\t\t\tleft: parseInt(el.css(\"left\"), 10), top: parseInt(el.css(\"top\"), 10)\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t};\n\n\t\tif (typeof(o.alsoResize) === \"object\" && !o.alsoResize.parentNode) {\n\t\t\tif (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }\n\t\t\telse { $.each(o.alsoResize, function (exp) { _store(exp); }); }\n\t\t}else{\n\t\t\t_store(o.alsoResize);\n\t\t}\n\t},\n\n\tresize: function (event, ui) {\n\t\tvar that = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\tdelta = {\n\t\t\t\theight: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,\n\t\t\t\ttop: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0\n\t\t\t},\n\n\t\t\t_alsoResize = function (exp, c) {\n\t\t\t\t$(exp).each(function() {\n\t\t\t\t\tvar el = $(this), start = $(this).data(\"ui-resizable-alsoresize\"), style = {},\n\t\t\t\t\t\tcss = c && c.length ? c : el.parents(ui.originalElement[0]).length ? [\"width\", \"height\"] : [\"width\", \"height\", \"top\", \"left\"];\n\n\t\t\t\t\t$.each(css, function (i, prop) {\n\t\t\t\t\t\tvar sum = (start[prop]||0) + (delta[prop]||0);\n\t\t\t\t\t\tif (sum && sum >= 0) {\n\t\t\t\t\t\t\tstyle[prop] = sum || null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tel.css(style);\n\t\t\t\t});\n\t\t\t};\n\n\t\tif (typeof(o.alsoResize) === \"object\" && !o.alsoResize.nodeType) {\n\t\t\t$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });\n\t\t}else{\n\t\t\t_alsoResize(o.alsoResize);\n\t\t}\n\t},\n\n\tstop: function () {\n\t\t$(this).removeData(\"resizable-alsoresize\");\n\t}\n});\n\n$.ui.plugin.add(\"resizable\", \"ghost\", {\n\n\tstart: function() {\n\n\t\tvar that = $(this).data(\"ui-resizable\"), o = that.options, cs = that.size;\n\n\t\tthat.ghost = that.originalElement.clone();\n\t\tthat.ghost\n\t\t\t.css({ opacity: 0.25, display: \"block\", position: \"relative\", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })\n\t\t\t.addClass(\"ui-resizable-ghost\")\n\t\t\t.addClass(typeof o.ghost === \"string\" ? o.ghost : \"\");\n\n\t\tthat.ghost.appendTo(that.helper);\n\n\t},\n\n\tresize: function(){\n\t\tvar that = $(this).data(\"ui-resizable\");\n\t\tif (that.ghost) {\n\t\t\tthat.ghost.css({ position: \"relative\", height: that.size.height, width: that.size.width });\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $(this).data(\"ui-resizable\");\n\t\tif (that.ghost && that.helper) {\n\t\t\tthat.helper.get(0).removeChild(that.ghost.get(0));\n\t\t}\n\t}\n\n});\n\n$.ui.plugin.add(\"resizable\", \"grid\", {\n\n\tresize: function() {\n\t\tvar that = $(this).data(\"ui-resizable\"),\n\t\t\to = that.options,\n\t\t\tcs = that.size,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\ta = that.axis,\n\t\t\tgrid = typeof o.grid === \"number\" ? [o.grid, o.grid] : o.grid,\n\t\t\tgridX = (grid[0]||1),\n\t\t\tgridY = (grid[1]||1),\n\t\t\tox = Math.round((cs.width - os.width) \/ gridX) * gridX,\n\t\t\toy = Math.round((cs.height - os.height) \/ gridY) * gridY,\n\t\t\tnewWidth = os.width + ox,\n\t\t\tnewHeight = os.height + oy,\n\t\t\tisMaxWidth = o.maxWidth && (o.maxWidth < newWidth),\n\t\t\tisMaxHeight = o.maxHeight && (o.maxHeight < newHeight),\n\t\t\tisMinWidth = o.minWidth && (o.minWidth > newWidth),\n\t\t\tisMinHeight = o.minHeight && (o.minHeight > newHeight);\n\n\t\to.grid = grid;\n\n\t\tif (isMinWidth) {\n\t\t\tnewWidth = newWidth + gridX;\n\t\t}\n\t\tif (isMinHeight) {\n\t\t\tnewHeight = newHeight + gridY;\n\t\t}\n\t\tif (isMaxWidth) {\n\t\t\tnewWidth = newWidth - gridX;\n\t\t}\n\t\tif (isMaxHeight) {\n\t\t\tnewHeight = newHeight - gridY;\n\t\t}\n\n\t\tif (\/^(se|s|e)$\/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t} else if (\/^(ne)$\/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t} else if (\/^(sw)$\/.test(a)) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.left = op.left - ox;\n\t\t} else {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t\tthat.position.left = op.left - ox;\n\t\t}\n\t}\n\n});\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.widget(\"ui.selectable\", $.ui.mouse, {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoRefresh: true,\n\t\tdistance: 0,\n\t\tfilter: \"*\",\n\t\ttolerance: \"touch\",\n\n\t\t\/\/ callbacks\n\t\tselected: null,\n\t\tselecting: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tunselected: null,\n\t\tunselecting: null\n\t},\n\t_create: function() {\n\t\tvar selectees,\n\t\t\tthat = this;\n\n\t\tthis.element.addClass(\"ui-selectable\");\n\n\t\tthis.dragged = false;\n\n\t\t\/\/ cache selectee children based on filter\n\t\tthis.refresh = function() {\n\t\t\tselectees = $(that.options.filter, that.element[0]);\n\t\t\tselectees.addClass(\"ui-selectee\");\n\t\t\tselectees.each(function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\tpos = $this.offset();\n\t\t\t\t$.data(this, \"selectable-item\", {\n\t\t\t\t\telement: this,\n\t\t\t\t\t$element: $this,\n\t\t\t\t\tleft: pos.left,\n\t\t\t\t\ttop: pos.top,\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\n\t\t\t\t\tstartselected: false,\n\t\t\t\t\tselected: $this.hasClass(\"ui-selected\"),\n\t\t\t\t\tselecting: $this.hasClass(\"ui-selecting\"),\n\t\t\t\t\tunselecting: $this.hasClass(\"ui-unselecting\")\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\t\tthis.refresh();\n\n\t\tthis.selectees = selectees.addClass(\"ui-selectee\");\n\n\t\tthis._mouseInit();\n\n\t\tthis.helper = $(\"<div class='ui-selectable-helper'><\/div>\");\n\t},\n\n\t_destroy: function() {\n\t\tthis.selectees\n\t\t\t.removeClass(\"ui-selectee\")\n\t\t\t.removeData(\"selectable-item\");\n\t\tthis.element\n\t\t\t.removeClass(\"ui-selectable ui-selectable-disabled\");\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseStart: function(event) {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.opos = [event.pageX, event.pageY];\n\n\t\tif (this.options.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selectees = $(options.filter, this.element[0]);\n\n\t\tthis._trigger(\"start\", event);\n\n\t\t$(options.appendTo).append(this.helper);\n\t\t\/\/ position helper (lasso)\n\t\tthis.helper.css({\n\t\t\t\"left\": event.pageX,\n\t\t\t\"top\": event.pageY,\n\t\t\t\"width\": 0,\n\t\t\t\"height\": 0\n\t\t});\n\n\t\tif (options.autoRefresh) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\tthis.selectees.filter(\".ui-selected\").each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.startselected = true;\n\t\t\tif (!event.metaKey && !event.ctrlKey) {\n\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\tselectee.selected = false;\n\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\/\/ selectable UNSELECTING callback\n\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t$(event.target).parents().addBack().each(function() {\n\t\t\tvar doSelect,\n\t\t\t\tselectee = $.data(this, \"selectable-item\");\n\t\t\tif (selectee) {\n\t\t\t\tdoSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass(\"ui-selected\");\n\t\t\t\tselectee.$element\n\t\t\t\t\t.removeClass(doSelect ? \"ui-unselecting\" : \"ui-selected\")\n\t\t\t\t\t.addClass(doSelect ? \"ui-selecting\" : \"ui-unselecting\");\n\t\t\t\tselectee.unselecting = !doSelect;\n\t\t\t\tselectee.selecting = doSelect;\n\t\t\t\tselectee.selected = doSelect;\n\t\t\t\t\/\/ selectable (UN)SELECTING callback\n\t\t\t\tif (doSelect) {\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_mouseDrag: function(event) {\n\n\t\tthis.dragged = true;\n\n\t\tif (this.options.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tmp,\n\t\t\tthat = this,\n\t\t\toptions = this.options,\n\t\t\tx1 = this.opos[0],\n\t\t\ty1 = this.opos[1],\n\t\t\tx2 = event.pageX,\n\t\t\ty2 = event.pageY;\n\n\t\tif (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }\n\t\tif (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }\n\t\tthis.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});\n\n\t\tthis.selectees.each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\"),\n\t\t\t\thit = false;\n\n\t\t\t\/\/prevent helper from being selected if appendTo: selectable\n\t\t\tif (!selectee || selectee.element === that.element[0]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (options.tolerance === \"touch\") {\n\t\t\t\thit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );\n\t\t\t} else if (options.tolerance === \"fit\") {\n\t\t\t\thit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);\n\t\t\t}\n\n\t\t\tif (hit) {\n\t\t\t\t\/\/ SELECT\n\t\t\t\tif (selectee.selected) {\n\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\t\tselectee.selected = false;\n\t\t\t\t}\n\t\t\t\tif (selectee.unselecting) {\n\t\t\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\n\t\t\t\t\tselectee.unselecting = false;\n\t\t\t\t}\n\t\t\t\tif (!selectee.selecting) {\n\t\t\t\t\tselectee.$element.addClass(\"ui-selecting\");\n\t\t\t\t\tselectee.selecting = true;\n\t\t\t\t\t\/\/ selectable SELECTING callback\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t\/\/ UNSELECT\n\t\t\t\tif (selectee.selecting) {\n\t\t\t\t\tif ((event.metaKey || event.ctrlKey) && selectee.startselected) {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-selected\");\n\t\t\t\t\t\tselectee.selected = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tif (selectee.startselected) {\n\t\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\/\/ selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (selectee.selected) {\n\t\t\t\t\tif (!event.metaKey && !event.ctrlKey && !selectee.startselected) {\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\n\t\t\t\t\t\tselectee.selected = false;\n\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\n\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t\/\/ selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\t\tvar that = this;\n\n\t\tthis.dragged = false;\n\n\t\t$(\".ui-unselecting\", this.element[0]).each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\n\t\t\tselectee.unselecting = false;\n\t\t\tselectee.startselected = false;\n\t\t\tthat._trigger(\"unselected\", event, {\n\t\t\t\tunselected: selectee.element\n\t\t\t});\n\t\t});\n\t\t$(\".ui-selecting\", this.element[0]).each(function() {\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\n\t\t\tselectee.$element.removeClass(\"ui-selecting\").addClass(\"ui-selected\");\n\t\t\tselectee.selecting = false;\n\t\t\tselectee.selected = true;\n\t\t\tselectee.startselected = true;\n\t\t\tthat._trigger(\"selected\", event, {\n\t\t\t\tselected: selectee.element\n\t\t\t});\n\t\t});\n\t\tthis._trigger(\"stop\", event);\n\n\t\tthis.helper.remove();\n\n\t\treturn false;\n\t}\n\n});\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n\/*jshint loopfunc: true *\/\n\nfunction isOverAxis( x, reference, size ) {\n\treturn ( x > reference ) && ( x < ( reference + size ) );\n}\n\nfunction isFloating(item) {\n\treturn (\/left|right\/).test(item.css(\"float\")) || (\/inline|table-cell\/).test(item.css(\"display\"));\n}\n\n$.widget(\"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.10.2\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t\/\/ callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\t_create: function() {\n\n\t\tvar o = this.options;\n\t\tthis.containerCache = {};\n\t\tthis.element.addClass(\"ui-sortable\");\n\n\t\t\/\/Get the items\n\t\tthis.refresh();\n\n\t\t\/\/Let's determine if the items are being displayed horizontally\n\t\tthis.floating = this.items.length ? o.axis === \"x\" || isFloating(this.items[0].item) : false;\n\n\t\t\/\/Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t\/\/Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\t\/\/We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass(\"ui-sortable ui-sortable-disabled\");\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[i].item.removeData(this.widgetName + \"-item\");\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function(key, value){\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.options[ key ] = value;\n\n\t\t\tthis.widget().toggleClass( \"ui-sortable-disabled\", !!value );\n\t\t} else {\n\t\t\t\/\/ Don't call widget base _setOption for disable as it adds ui-state-disabled class\n\t\t\t$.Widget.prototype._setOption.apply(this, arguments);\n\t\t}\n\t},\n\n\t_mouseCapture: function(event, overrideHandle) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif (this.reverting) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(this.options.disabled || this.options.type === \"static\") {\n\t\t\treturn false;\n\t\t}\n\n\t\t\/\/We have to refresh the items data once first\n\t\tthis._refreshItems(event);\n\n\t\t\/\/Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$(event.target).parents().each(function() {\n\t\t\tif($.data(this, that.widgetName + \"-item\") === that) {\n\t\t\t\tcurrentItem = $(this);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif($.data(event.target, that.widgetName + \"-item\") === that) {\n\t\t\tcurrentItem = $(event.target);\n\t\t}\n\n\t\tif(!currentItem) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.options.handle && !overrideHandle) {\n\t\t\t$(this.options.handle, currentItem).find(\"*\").addBack().each(function() {\n\t\t\t\tif(this === event.target) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(!validHandle) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event, overrideHandle, noActivation) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t\/\/We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t\/\/Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\t\/\/Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t\/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t *\/\n\n\t\t\/\/Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t\/\/Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t\/\/The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { \/\/Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() \/\/This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t\/\/ Only after we got the offset, we can change the helper's position to absolute\n\t\t\/\/ TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css(\"position\", \"absolute\");\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\n\t\t\/\/Generate the original position\n\t\tthis.originalPosition = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t\/\/Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t\/\/Cache the former DOM position\n\t\tthis.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };\n\n\t\t\/\/If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t\/\/Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t\/\/Set a containment if given in the options\n\t\tif(o.containment) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif( o.cursor && o.cursor !== \"auto\" ) { \/\/ cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t\/\/ support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet = $( \"<style>*{ cursor: \"+o.cursor+\" !important; }<\/style>\" ).appendTo( body );\n\t\t}\n\n\t\tif(o.opacity) { \/\/ opacity option\n\t\t\tif (this.helper.css(\"opacity\")) {\n\t\t\t\tthis._storedOpacity = this.helper.css(\"opacity\");\n\t\t\t}\n\t\t\tthis.helper.css(\"opacity\", o.opacity);\n\t\t}\n\n\t\tif(o.zIndex) { \/\/ zIndex option\n\t\t\tif (this.helper.css(\"zIndex\")) {\n\t\t\t\tthis._storedZIndex = this.helper.css(\"zIndex\");\n\t\t\t}\n\t\t\tthis.helper.css(\"zIndex\", o.zIndex);\n\t\t}\n\n\t\t\/\/Prepare scrolling\n\t\tif(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== \"HTML\") {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t\/\/Call callbacks\n\t\tthis._trigger(\"start\", event, this._uiHash());\n\n\t\t\/\/Recache the helper size\n\t\tif(!this._preserveHelperProportions) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\n\t\t\/\/Post \"activate\" events to possible containers\n\t\tif( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t\/\/Prepare possible droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis.helper.addClass(\"ui-sortable-helper\");\n\t\tthis._mouseDrag(event); \/\/Execute the drag once - this causes the helper not to be visible before getting its correct position\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function(event) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t\/\/Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\tif (!this.lastPositionAbs) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t\/\/Do scrolling\n\t\tif(this.options.scroll) {\n\t\t\tif(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== \"HTML\") {\n\n\t\t\t\tif((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t\tif(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t\t}\n\t\t}\n\n\t\t\/\/Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t\/\/Set the helper position\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\n\t\t}\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\n\t\t}\n\n\t\t\/\/Rearrange\n\t\tfor (i = this.items.length - 1; i >= 0; i--) {\n\n\t\t\t\/\/Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[i];\n\t\t\titemElement = item.item[0];\n\t\t\tintersection = this._intersectsWithPointer(item);\n\t\t\tif (!intersection) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t\/\/ Only put the placeholder inside the current Container, skip all\n\t\t\t\/\/ items form other containers. This works because when moving\n\t\t\t\/\/ an item from one container to another the\n\t\t\t\/\/ currentContainer is switched before the placeholder is moved.\n\t\t\t\/\/\n\t\t\t\/\/ Without this moving items in \"sub-sortables\" can cause the placeholder to jitter\n\t\t\t\/\/ beetween the outer and inner container.\n\t\t\tif (item.instance !== this.currentContainer) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t\/\/ cannot intersect with itself\n\t\t\t\/\/ no useless actions that have been done before\n\t\t\t\/\/ no action if the item moved is the parent of the item checked\n\t\t\tif (itemElement !== this.currentItem[0] &&\n\t\t\t\tthis.placeholder[intersection === 1 ? \"next\" : \"prev\"]()[0] !== itemElement &&\n\t\t\t\t!$.contains(this.placeholder[0], itemElement) &&\n\t\t\t\t(this.options.type === \"semi-dynamic\" ? !$.contains(this.element[0], itemElement) : true)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif (this.options.tolerance === \"pointer\" || this._intersectsWithSides(item)) {\n\t\t\t\t\tthis._rearrange(event, item);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t\/\/Post events to containers\n\t\tthis._contactContainers(event);\n\n\t\t\/\/Interconnect with droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\t\/\/Call callbacks\n\t\tthis._trigger(\"sort\", event, this._uiHash());\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function(event, noPropagation) {\n\n\t\tif(!event) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/If we are using droppables, inform the manager about the drop\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\t$.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\tif(this.options.revert) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {\n\t\t\t\tthat._clear(event);\n\t\t\t});\n\t\t} else {\n\t\t\tthis._clear(event, noPropagation);\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif(this.dragging) {\n\n\t\t\tthis._mouseUp({ target: null });\n\n\t\t\tif(this.options.helper === \"original\") {\n\t\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t\/\/Post deactivating events to containers\n\t\t\tfor (var i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tthis.containers[i]._trigger(\"deactivate\", null, this._uiHash(this));\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", null, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (this.placeholder) {\n\t\t\t\/\/$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\t\tif(this.placeholder[0].parentNode) {\n\t\t\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\t\t\t}\n\t\t\tif(this.options.helper !== \"original\" && this.helper && this.helper[0].parentNode) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend(this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t});\n\n\t\t\tif(this.domPosition.prev) {\n\t\t\t\t$(this.domPosition.prev).after(this.currentItem);\n\t\t\t} else {\n\t\t\t\t$(this.domPosition.parent).prepend(this.currentItem);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$(items).each(function() {\n\t\t\tvar res = ($(o.item || this).attr(o.attribute || \"id\") || \"\").match(o.expression || (\/(.+)[\\-=_](.+)\/));\n\t\t\tif (res) {\n\t\t\t\tstr.push((o.key || res[1]+\"[]\")+\"=\"+(o.key && o.expression ? res[1] : res[2]));\n\t\t\t}\n\t\t});\n\n\t\tif(!str.length && o.key) {\n\t\t\tstr.push(o.key + \"=\");\n\t\t}\n\n\t\treturn str.join(\"&\");\n\n\t},\n\n\ttoArray: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each(function() { ret.push($(o.item || this).attr(o.attribute || \"id\") || \"\"); });\n\t\treturn ret;\n\n\t},\n\n\t\/* Be careful with the following core functions *\/\n\t_intersectsWith: function(item) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t(this.options.tolerance !== \"pointer\" && this.helperProportions[this.floating ? \"width\" : \"height\"] > item[this.floating ? \"width\" : \"height\"])\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn (l < x1 + (this.helperProportions.width \/ 2) && \/\/ Right Half\n\t\t\t\tx2 - (this.helperProportions.width \/ 2) < r && \/\/ Left Half\n\t\t\t\tt < y1 + (this.helperProportions.height \/ 2) && \/\/ Bottom Half\n\t\t\t\ty2 - (this.helperProportions.height \/ 2) < b ); \/\/ Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function(item) {\n\n\t\tvar isOverElementHeight = (this.options.axis === \"x\") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),\n\t\t\tisOverElementWidth = (this.options.axis === \"y\") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth,\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (!isOverElement) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.floating ?\n\t\t\t( ((horizontalDirection && horizontalDirection === \"right\") || verticalDirection === \"down\") ? 2 : 1 )\n\t\t\t: ( verticalDirection && (verticalDirection === \"down\" ? 2 : 1) );\n\n\t},\n\n\t_intersectsWithSides: function(item) {\n\n\t\tvar isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height\/2), item.height),\n\t\t\tisOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width\/2), item.width),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (this.floating && horizontalDirection) {\n\t\t\treturn ((horizontalDirection === \"right\" && isOverRightHalf) || (horizontalDirection === \"left\" && !isOverRightHalf));\n\t\t} else {\n\t\t\treturn verticalDirection && ((verticalDirection === \"down\" && isOverBottomHalf) || (verticalDirection === \"up\" && !isOverBottomHalf));\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && (delta > 0 ? \"down\" : \"up\");\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && (delta > 0 ? \"right\" : \"left\");\n\t},\n\n\trefresh: function(event) {\n\t\tthis._refreshItems(event);\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function(connected) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && connected) {\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i]);\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), inst]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), this]);\n\n\t\tfor (i = queries.length - 1; i >= 0; i--){\n\t\t\tqueries[i][0].each(function() {\n\t\t\t\titems.push(this);\n\t\t\t});\n\t\t}\n\n\t\treturn $(items);\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find(\":data(\" + this.widgetName + \"-item)\");\n\n\t\tthis.items = $.grep(this.items, function (item) {\n\t\t\tfor (var j=0; j < list.length; j++) {\n\t\t\t\tif(list[j] === item.item[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t},\n\n\t_refreshItems: function(event) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [this];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && this.ready) { \/\/Shouldn't be run the first time through due to massive slow-down\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i]);\n\t\t\t\tfor (j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);\n\t\t\t\t\t\tthis.containers.push(inst);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = queries.length - 1; i >= 0; i--) {\n\t\t\ttargetData = queries[i][1];\n\t\t\t_queries = queries[i][0];\n\n\t\t\tfor (j=0, queriesLength = _queries.length; j < queriesLength; j++) {\n\t\t\t\titem = $(_queries[j]);\n\n\t\t\t\titem.data(this.widgetName + \"-item\", targetData); \/\/ Data for target checking (mouse manager)\n\n\t\t\t\titems.push({\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function(fast) {\n\n\t\t\/\/This has to be redone because due to the item being moved out\/into the offsetParent, the offsetParent's position will change\n\t\tif(this.offsetParent && this.helper) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor (i = this.items.length - 1; i >= 0; i--){\n\t\t\titem = this.items[i];\n\n\t\t\t\/\/We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;\n\n\t\t\tif (!fast) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif(this.options.custom && this.options.custom.refreshContainers) {\n\t\t\tthis.options.custom.refreshContainers.call(this);\n\t\t} else {\n\t\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tp = this.containers[i].element.offset();\n\t\t\t\tthis.containers[i].containerCache.left = p.left;\n\t\t\t\tthis.containers[i].containerCache.top = p.top;\n\t\t\t\tthis.containers[i].containerCache.width\t= this.containers[i].element.outerWidth();\n\t\t\t\tthis.containers[i].containerCache.height = this.containers[i].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function(that) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif(!o.placeholder || o.placeholder.constructor === String) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[0].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( that.document[0].createElement( nodeName ) )\n\t\t\t\t\t\t\t.addClass(className || that.currentItem[0].className+\" ui-sortable-placeholder\")\n\t\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\");\n\n\t\t\t\t\tif ( nodeName === \"tr\" ) {\n\t\t\t\t\t\t\/\/ Use a high colspan to force the td to expand the full\n\t\t\t\t\t\t\/\/ width of the table (browsers are smart enough to\n\t\t\t\t\t\t\/\/ handle this properly)\n\t\t\t\t\t\telement.append( \"<td colspan='99'>&#160;<\/td>\" );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function(container, p) {\n\n\t\t\t\t\t\/\/ 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that\n\t\t\t\t\t\/\/ 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified\n\t\t\t\t\tif(className && !o.forcePlaceholderSize) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css(\"paddingTop\")||0, 10) - parseInt(that.currentItem.css(\"paddingBottom\")||0, 10)); }\n\t\t\t\t\tif(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css(\"paddingLeft\")||0, 10) - parseInt(that.currentItem.css(\"paddingRight\")||0, 10)); }\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t\/\/Create the placeholder\n\t\tthat.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));\n\n\t\t\/\/Append it after the actual current item\n\t\tthat.currentItem.after(that.placeholder);\n\n\t\t\/\/Update the size of the placeholder (TODO: Logic to fuzzy, see line 316\/317)\n\t\to.placeholder.update(that, that.placeholder);\n\n\t},\n\n\t_contactContainers: function(event) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t\/\/ get innermost container that intersects with item\n\t\tfor (i = this.containers.length - 1; i >= 0; i--) {\n\n\t\t\t\/\/ never consider a container that's located within the item itself\n\t\t\tif($.contains(this.currentItem[0], this.containers[i].element[0])) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(this._intersectsWith(this.containers[i].containerCache)) {\n\n\t\t\t\t\/\/ if we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[i];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\t\t\t\t\/\/ container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", event, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t\/\/ if no intersecting containers found, return\n\t\tif(!innermostContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ move the item into the container if it's not there already\n\t\tif(this.containers.length === 1) {\n\t\t\tif (!this.containers[innermostIndex].containerCache.over) {\n\t\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t\/\/When entering a new container, we will find the item with the least distance and append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || isFloating(this.currentItem);\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\tbase = this.positionAbs[posProperty] + this.offset.click[posProperty];\n\t\t\tfor (j = this.items.length - 1; j >= 0; j--) {\n\t\t\t\tif(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(this.items[j].item[0] === this.currentItem[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcur = this.items[j].item.offset()[posProperty];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t\tcur += this.items[j][sizeProperty];\n\t\t\t\t}\n\n\t\t\t\tif(Math.abs(cur - base) < dist) {\n\t\t\t\t\tdist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\": \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\/\/Check if dropOnEmpty is enabled\n\t\t\tif(!itemWithLeastDistance && !this.options.dropOnEmpty) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.currentContainer === this.containers[innermostIndex]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);\n\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\tthis.containers[innermostIndex]._trigger(\"change\", event, this._uiHash(this));\n\t\t\tthis.currentContainer = this.containers[innermostIndex];\n\n\t\t\t\/\/Update the placeholder\n\t\t\tthis.options.placeholder.update(this.currentContainer, this.placeholder);\n\n\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t}\n\n\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem);\n\n\t\t\/\/Add the helper to the DOM if that didn't happen already\n\t\tif(!helper.parents(\"body\").length) {\n\t\t\t$(o.appendTo !== \"parent\" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);\n\t\t}\n\n\t\tif(helper[0] === this.currentItem[0]) {\n\t\t\tthis._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css(\"position\"), top: this.currentItem.css(\"top\"), left: this.currentItem.css(\"left\") };\n\t\t}\n\n\t\tif(!helper[0].style.width || o.forceHelperSize) {\n\t\t\thelper.width(this.currentItem.width());\n\t\t}\n\t\tif(!helper[0].style.height || o.forceHelperSize) {\n\t\t\thelper.height(this.currentItem.height());\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\n\t\t\/\/Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t\/\/ This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t\/\/ 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t\/\/ 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t\/\/    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t\/\/ This needs to be actually done for all browsers, since pageX\/pageY includes this information\n\t\t\/\/ with an ugly IE fix\n\t\tif( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition === \"relative\") {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.currentItem.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.currentItem.css(\"marginTop\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif(o.containment === \"parent\") {\n\t\t\to.containment = this.helper[0].parentNode;\n\t\t}\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$(o.containment === \"document\" ? document : window).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t($(o.containment === \"document\" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif(!(\/^(document|window|parent)$\/).test(o.containment)) {\n\t\t\tce = $(o.containment)[0];\n\t\t\tco = $(o.containment).offset();\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0) - this.margins.left,\n\t\t\t\tco.top + (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0) - this.margins.top,\n\t\t\t\tco.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left,\n\t\t\t\tco.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\n\t\t\tscrollIsRootNode = (\/(html|body)\/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (\/(html|body)\/i).test(scroll[0].tagName);\n\n\t\t\/\/ This is another very weird special case that only happens for relative elements:\n\t\t\/\/ 1. If the css position is relative\n\t\t\/\/ 2. and the scroll parent is the document or similar to the offset parent\n\t\t\/\/ we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif(this.cssPosition === \"relative\" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t\/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t *\/\n\n\t\tif(this.originalPosition) { \/\/If we are not dragging yet, we won't check for options\n\n\t\t\tif(this.containment) {\n\t\t\t\tif(event.pageX - this.offset.click.left < this.containment[0]) {\n\t\t\t\t\tpageX = this.containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top < this.containment[1]) {\n\t\t\t\t\tpageY = this.containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif(event.pageX - this.offset.click.left > this.containment[2]) {\n\t\t\t\t\tpageX = this.containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top > this.containment[3]) {\n\t\t\t\t\tpageY = this.containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\ttop = this.originalPageY + Math.round((pageY - this.originalPageY) \/ o.grid[1]) * o.grid[1];\n\t\t\t\tpageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = this.originalPageX + Math.round((pageX - this.originalPageX) \/ o.grid[0]) * o.grid[0];\n\t\t\t\tpageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.click.top -\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top\t-\t\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t\/\/ Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left\t-\t\t\t\t\t\t\t\t\t\t\t\/\/ Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t\/\/ The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function(event, i, a, hardRefresh) {\n\n\t\ta ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === \"down\" ? i.item[0] : i.item[0].nextSibling));\n\n\t\t\/\/Various things done here to improve the performance:\n\t\t\/\/ 1. we create a setTimeout, that calls refreshPositions\n\t\t\/\/ 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t\/\/ 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same\n\t\t\/\/ 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay(function() {\n\t\t\tif(counter === this.counter) {\n\t\t\t\tthis.refreshPositions(!hardRefresh); \/\/Precompute after each DOM insertion, NOT on mousemove\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_clear: function(event, noPropagation) {\n\n\t\tthis.reverting = false;\n\t\t\/\/ We delay all events that have to be triggered to after the point where the placeholder has been removed and\n\t\t\/\/ everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t\/\/ We first have to update the dom position of the actual currentItem\n\t\t\/\/ Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)\n\t\tif(!this._noFinalSort && this.currentItem.parent().length) {\n\t\t\tthis.placeholder.before(this.currentItem);\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif(this.helper[0] === this.currentItem[0]) {\n\t\t\tfor(i in this._storedCSS) {\n\t\t\t\tif(this._storedCSS[i] === \"auto\" || this._storedCSS[i] === \"static\") {\n\t\t\t\t\tthis._storedCSS[i] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif(this.fromOutside && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"receive\", event, this._uiHash(this.fromOutside)); });\n\t\t}\n\t\tif((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(\".ui-sortable-helper\")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"update\", event, this._uiHash()); }); \/\/Trigger update callback if the DOM position has changed\n\t\t}\n\n\t\t\/\/ Check if the items Container has Changed and trigger appropriate\n\t\t\/\/ events.\n\t\tif (this !== this.currentContainer) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"remove\", event, this._uiHash()); });\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"receive\", event, this._uiHash(this)); };  }).call(this, this.currentContainer));\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"update\", event, this._uiHash(this));  }; }).call(this, this.currentContainer));\n\t\t\t}\n\t\t}\n\n\n\t\t\/\/Post events to containers\n\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\tif(!noPropagation) {\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"deactivate\", event, this._uiHash(this)); };  }).call(this, this.containers[i]));\n\t\t\t}\n\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"out\", event, this._uiHash(this)); };  }).call(this, this.containers[i]));\n\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t\/\/Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif(this._storedOpacity) {\n\t\t\tthis.helper.css(\"opacity\", this._storedOpacity);\n\t\t}\n\t\tif(this._storedZIndex) {\n\t\t\tthis.helper.css(\"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex);\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tif(this.cancelHelperRemoval) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t\t} \/\/Trigger all delayed events\n\t\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t\t}\n\n\t\t\tthis.fromOutside = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tif(!noPropagation) {\n\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t}\n\n\t\t\/\/$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\n\t\tif(!noPropagation) {\n\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t} \/\/Trigger all delayed events\n\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn true;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ($.Widget.prototype._trigger.apply(this, arguments) === false) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function(_inst) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $([]),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n});\n\n})(jQuery);\n\n(function($, undefined) {\n\nvar dataSpace = \"ui-effects-\";\n\n$.effects = {\n\teffect: {}\n};\n\n\/*!\n * jQuery Color Animations v2.1.2\n * https:\/\/github.com\/jquery\/jquery-color\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http:\/\/jquery.org\/license\n *\n * Date: Wed Jan 16 08:47:09 2013 -0600\n *\/\n(function( jQuery, undefined ) {\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\t\/\/ plusequals test for += 100 -= 100\n\trplusequals = \/^([\\-+])=\\s*(\\d+\\.?\\d*)\/,\n\t\/\/ a set of RE's that can match strings and generate color tuples.\n\tstringParsers = [{\n\t\t\tre: \/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)\/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: \/rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)\/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t\/\/ this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: \/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})\/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\t\/\/ this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: \/#([a-f0-9])([a-f0-9])([a-f0-9])\/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: \/hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)\/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] \/ 100,\n\t\t\t\t\texecResult[ 3 ] \/ 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}],\n\n\t\/\/ jQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t\/\/ element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t\/\/ colors = jQuery.Color.names\n\tcolors,\n\n\t\/\/ local aliases of functions called often\n\teach = jQuery.each;\n\n\/\/ determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n\/\/ define cache name and alpha properties\n\/\/ for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n});\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn (allowEmpty || !prop.def) ? null : prop.def;\n\t}\n\n\t\/\/ ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t\/\/ IE will pass in empty strings as value for alpha,\n\t\/\/ which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\t\t\/\/ we add mod before modding to make sure that negatives values\n\t\t\/\/ get converted properly: -10 -> 350\n\t\treturn (value + type.mod) % type.mod;\n\t}\n\n\t\/\/ for now all property types without mod have min and max\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t\/\/ if this was an rgba parse the assignment might happen twice\n\t\t\t\/\/ oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t\/\/ exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t});\n\n\t\/\/ Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t\/\/ if this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t\/\/ chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t\/\/ named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = jQuery.type( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t\/\/ more than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t\/\/ if the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t\/\/ if the value was null, we don't need to copy it\n\t\t\t\t\t\t\t\/\/ if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/ this is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t\/\/ call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/ everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\t\t\t\t\t\t\/\/ use the default of 1\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif (isCache) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn same;\n\t\t});\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t});\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t\/\/ if null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\/\/ if null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod \/ 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod \/ 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t});\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\t\t\/\/ if we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t}));\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\n\t\t\t});\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t\/\/ catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t});\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t\/\/ default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t}).join(\"\");\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n});\ncolor.fn.parse.prototype = color.fn;\n\n\/\/ hsla conversions adapted from:\n\/\/ https:\/\/code.google.com\/p\/maashaack\/source\/browse\/packages\/graphics\/trunk\/src\/graphics\/colors\/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + (q - p) * h * 6;\n\t}\n\tif ( h * 2 < 1) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + (q - p) * ((2\/3) - h) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function ( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] \/ 255,\n\t\tg = rgba[ 1 ] \/ 255,\n\t\tb = rgba[ 2 ] \/ 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) \/ diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) \/ diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) \/ diff ) + 240;\n\t}\n\n\t\/\/ chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t\/\/ otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff \/ add;\n\t} else {\n\t\ts = diff \/ ( 2 - add );\n\t}\n\treturn [ Math.round(h) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function ( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] \/ 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 \/ 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 \/ 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t\/\/ makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t\/\/ generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = jQuery.type( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t});\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t\/\/ makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\t\t\/\/ alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar vtype = jQuery.type( value ),\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\n\t\t\t\tlocal = this[ fn ](),\n\t\t\t\tcur = local[ prop.idx ],\n\t\t\t\tmatch;\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = jQuery.type( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t});\n});\n\n\/\/ add cssHook and .fx.step function for each named hook.\n\/\/ accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" || ( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t(backgroundColor === \"\" || backgroundColor === \"transparent\") &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch( e ) {\n\t\t\t\t\t\/\/ wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t});\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t});\n\t\treturn expanded;\n\t}\n};\n\n\/\/ Basic color names only.\n\/\/ Usage of any of the other color names requires adding yourself or including\n\/\/ jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\t\/\/ 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t\/\/ 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n})( jQuery );\n\n\n\/******************************************************************************\/\n\/****************************** CLASS ANIMATIONS ******************************\/\n\/******************************************************************************\/\n(function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each([ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ], function( _, prop ) {\n\t$.fx.step[ prop ] = function( fx ) {\n\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\tfx.setAttr = true;\n\t\t}\n\t};\n});\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\t\/\/ support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n\/\/ support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t\/\/ map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t});\n\n\t\t\/\/ apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function(i, action) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tapplyClassChange();\n\n\t\t\/\/ map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t});\n\n\t\t\/\/ apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t\/\/ map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map(function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend({}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t});\n\n\t\t\/\/ once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done(function() {\n\n\t\t\t\/\/ set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t\/\/ for each animated element,\n\t\t\t\/\/ clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function(key) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t\/\/ this is guarnteed to be there if you use jQuery.speed()\n\t\t\t\/\/ it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t});\n\t});\n};\n\n$.fn.extend({\n\taddClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.addClass ),\n\n\tremoveClass: (function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.removeClass ),\n\n\ttoggleClass: (function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\t\t\t\t\t\/\/ without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t(force ? { add: classNames } : { remove: classNames }),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t\/\/ without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n});\n\n})();\n\n\/******************************************************************************\/\n\/*********************************** EFFECTS **********************************\/\n\/******************************************************************************\/\n\n(function() {\n\n$.extend( $.effects, {\n\tversion: \"1.10.2\",\n\n\t\/\/ Saves a set of properties in a data storage\n\tsave: function( element, set ) {\n\t\tfor( var i=0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t}\n\t\t}\n\t},\n\n\t\/\/ Restores a set of previously saved properties from a data storage\n\trestore: function( element, set ) {\n\t\tvar val, i;\n\t\tfor( i=0; i < set.length; i++ ) {\n\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t\/\/ support: jQuery 1.6.2\n\t\t\t\t\/\/ http:\/\/bugs.jquery.com\/ticket\/9917\n\t\t\t\t\/\/ jQuery 1.6.2 incorrectly returns undefined for any falsy value.\n\t\t\t\t\/\/ We can't differentiate between \"\" and 0 here, so we just assume\n\t\t\t\t\/\/ empty string since it's likely to be a more common value...\n\t\t\t\tif ( val === undefined ) {\n\t\t\t\t\tval = \"\";\n\t\t\t\t}\n\t\t\t\telement.css( set[ i ], val );\n\t\t\t}\n\t\t}\n\t},\n\n\tsetMode: function( el, mode ) {\n\t\tif (mode === \"toggle\") {\n\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t\/\/ Translates a [top,left] array into a baseline value\n\t\/\/ this should be a little more flexible in the future to handle a string & hash\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\t\tswitch ( origin[ 0 ] ) {\n\t\t\tcase \"top\": y = 0; break;\n\t\t\tcase \"middle\": y = 0.5; break;\n\t\t\tcase \"bottom\": y = 1; break;\n\t\t\tdefault: y = origin[ 0 ] \/ original.height;\n\t\t}\n\t\tswitch ( origin[ 1 ] ) {\n\t\t\tcase \"left\": x = 0; break;\n\t\t\tcase \"center\": x = 0.5; break;\n\t\t\tcase \"right\": x = 1; break;\n\t\t\tdefault: x = origin[ 1 ] \/ original.width;\n\t\t}\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t\/\/ Wraps the element around a wrapper that copies position properties\n\tcreateWrapper: function( element ) {\n\n\t\t\/\/ if the element is already wrapped, return it\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" )) {\n\t\t\treturn element.parent();\n\t\t}\n\n\t\t\/\/ wrap the element\n\t\tvar props = {\n\t\t\t\twidth: element.outerWidth(true),\n\t\t\t\theight: element.outerHeight(true),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t},\n\t\t\twrapper = $( \"<div><\/div>\" )\n\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t.css({\n\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0\n\t\t\t\t}),\n\t\t\t\/\/ Store the size in case width\/height are defined in % - Fixes #5245\n\t\t\tsize = {\n\t\t\t\twidth: element.width(),\n\t\t\t\theight: element.height()\n\t\t\t},\n\t\t\tactive = document.activeElement;\n\n\t\t\/\/ support: Firefox\n\t\t\/\/ Firefox incorrectly exposes anonymous content\n\t\t\/\/ https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=561664\n\t\ttry {\n\t\t\tactive.id;\n\t\t} catch( e ) {\n\t\t\tactive = document.body;\n\t\t}\n\n\t\telement.wrap( wrapper );\n\n\t\t\/\/ Fixes #7595 - Elements lose focus when wrapped.\n\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t$( active ).focus();\n\t\t}\n\n\t\twrapper = element.parent(); \/\/Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element\n\n\t\t\/\/ transfer positioning properties to the wrapper\n\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\twrapper.css({ position: \"relative\" });\n\t\t\telement.css({ position: \"relative\" });\n\t\t} else {\n\t\t\t$.extend( props, {\n\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t});\n\t\t\t$.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\n\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t}\n\t\t\t});\n\t\t\telement.css({\n\t\t\t\tposition: \"relative\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: \"auto\",\n\t\t\t\tbottom: \"auto\"\n\t\t\t});\n\t\t}\n\t\telement.css(size);\n\n\t\treturn wrapper.css( props ).show();\n\t},\n\n\tremoveWrapper: function( element ) {\n\t\tvar active = document.activeElement;\n\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\telement.parent().replaceWith( element );\n\n\t\t\t\/\/ Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).focus();\n\t\t\t}\n\t\t}\n\n\n\t\treturn element;\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t});\n\t\treturn value;\n\t}\n});\n\n\/\/ return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t\/\/ allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t\/\/ convert to an object\n\teffect = { effect: effect };\n\n\t\/\/ catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t\/\/ catch (effect, callback)\n\tif ( $.isFunction( options ) ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t\/\/ catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t\/\/ catch (effect, options, callback)\n\tif ( $.isFunction( speed ) ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t\/\/ add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\t\/\/ Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t\/\/ Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t\/\/ Complete callback\n\tif ( $.isFunction( option ) ) {\n\t\treturn true;\n\t}\n\n\t\/\/ Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t\/\/ Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend({\n\teffect: function( \/* effect, options, speed, callback *\/ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\tmode = args.mode,\n\t\t\tqueue = args.queue,\n\t\t\teffectMethod = $.effects.effect[ args.effect ];\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\t\t\t\/\/ delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, args.complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( args.complete ) {\n\t\t\t\t\t\targs.complete.call( this );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this ),\n\t\t\t\tcomplete = args.complete,\n\t\t\t\tmode = args.mode;\n\n\t\t\tfunction done() {\n\t\t\t\tif ( $.isFunction( complete ) ) {\n\t\t\t\t\tcomplete.call( elem[0] );\n\t\t\t\t}\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\/\/ If the element already has the correct final state, delegate to\n\t\t\t\/\/ the core methods so the internal tracking of \"olddisplay\" works.\n\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\t\telem[ mode ]();\n\t\t\t\tdone();\n\t\t\t} else {\n\t\t\t\teffectMethod.call( elem[0], args, done );\n\t\t\t}\n\t\t}\n\n\t\treturn queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\n\t},\n\n\tshow: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.show ),\n\n\thide: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.hide ),\n\n\ttoggle: (function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t})( $.fn.toggle ),\n\n\t\/\/ helper functions\n\tcssUnit: function(key) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t});\n\t\treturn val;\n\t}\n});\n\n})();\n\n\/******************************************************************************\/\n\/*********************************** EASING ***********************************\/\n\/******************************************************************************\/\n\n(function() {\n\n\/\/ based on easing equations from Robert Penner (http:\/\/www.robertpenner.com\/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n});\n\n$.extend( baseEasings, {\n\tSine: function ( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI \/ 2 );\n\t},\n\tCirc: function ( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI \/ 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function ( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) \/ 11 ) {}\n\t\treturn 1 \/ Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) \/ 22 - p, 2 );\n\t}\n});\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) \/ 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) \/ 2;\n\t};\n});\n\n})();\n\n})(jQuery);\n\n(function( $, undefined ) {\n\nvar uid = 0,\n\thideProps = {},\n\tshowProps = {};\n\nhideProps.height = hideProps.paddingTop = hideProps.paddingBottom =\n\thideProps.borderTopWidth = hideProps.borderBottomWidth = \"hide\";\nshowProps.height = showProps.paddingTop = showProps.paddingBottom =\n\tshowProps.borderTopWidth = showProps.borderBottomWidth = \"show\";\n\n$.widget( \"ui.accordion\", {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\tactive: 0,\n\t\tanimate: {},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theader: \"> li > :first-child,> :not(li):even\",\n\t\theightStyle: \"auto\",\n\t\ticons: {\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\n\t\t\theader: \"ui-icon-triangle-1-e\"\n\t\t},\n\n\t\t\/\/ callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null\n\t},\n\n\t_create: function() {\n\t\tvar options = this.options;\n\t\tthis.prevShow = this.prevHide = $();\n\t\tthis.element.addClass( \"ui-accordion ui-widget ui-helper-reset\" )\n\t\t\t\/\/ ARIA\n\t\t\t.attr( \"role\", \"tablist\" );\n\n\t\t\/\/ don't allow collapsible: false and active: false \/ null\n\t\tif ( !options.collapsible && (options.active === false || options.active == null) ) {\n\t\t\toptions.active = 0;\n\t\t}\n\n\t\tthis._processPanels();\n\t\t\/\/ handle negative values\n\t\tif ( options.active < 0 ) {\n\t\t\toptions.active += this.headers.length;\n\t\t}\n\t\tthis._refresh();\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\theader: this.active,\n\t\t\tpanel: !this.active.length ? $() : this.active.next(),\n\t\t\tcontent: !this.active.length ? $() : this.active.next()\n\t\t};\n\t},\n\n\t_createIcons: function() {\n\t\tvar icons = this.options.icons;\n\t\tif ( icons ) {\n\t\t\t$( \"<span>\" )\n\t\t\t\t.addClass( \"ui-accordion-header-icon ui-icon \" + icons.header )\n\t\t\t\t.prependTo( this.headers );\n\t\t\tthis.active.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.removeClass( icons.header )\n\t\t\t\t.addClass( icons.activeHeader );\n\t\t\tthis.headers.addClass( \"ui-accordion-icons\" );\n\t\t}\n\t},\n\n\t_destroyIcons: function() {\n\t\tthis.headers\n\t\t\t.removeClass( \"ui-accordion-icons\" )\n\t\t\t.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.remove();\n\t},\n\n\t_destroy: function() {\n\t\tvar contents;\n\n\t\t\/\/ clean up main element\n\t\tthis.element\n\t\t\t.removeClass( \"ui-accordion ui-widget ui-helper-reset\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\t\/\/ clean up headers\n\t\tthis.headers\n\t\t\t.removeClass( \"ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t.removeAttr( \"aria-controls\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.each(function() {\n\t\t\t\tif ( \/^ui-accordion\/.test( this.id ) ) {\n\t\t\t\t\tthis.removeAttribute( \"id\" );\n\t\t\t\t}\n\t\t\t});\n\t\tthis._destroyIcons();\n\n\t\t\/\/ clean up content panels\n\t\tcontents = this.headers.next()\n\t\t\t.css( \"display\", \"\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t.removeClass( \"ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled\" )\n\t\t\t.each(function() {\n\t\t\t\tif ( \/^ui-accordion\/.test( this.id ) ) {\n\t\t\t\t\tthis.removeAttribute( \"id\" );\n\t\t\t\t}\n\t\t\t});\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tcontents.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t\/\/ _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tif ( this.options.event ) {\n\t\t\t\tthis._off( this.headers, this.options.event );\n\t\t\t}\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\t\/\/ setting collapsible: false while collapsed; open first panel\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t}\n\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis._destroyIcons();\n\t\t\tif ( value ) {\n\t\t\t\tthis._createIcons();\n\t\t\t}\n\t\t}\n\n\t\t\/\/ #5332 - opacity doesn't cascade to positioned elements in IE\n\t\t\/\/ so we need to add the disabled class to the headers and panels\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.headers.add( this.headers.next() )\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\t\/*jshint maxcomplexity:15*\/\n\t\tif ( event.altKey || event.ctrlKey ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar keyCode = $.ui.keyCode,\n\t\t\tlength = this.headers.length,\n\t\t\tcurrentIndex = this.headers.index( event.target ),\n\t\t\ttoFocus = false;\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase keyCode.RIGHT:\n\t\t\tcase keyCode.DOWN:\n\t\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.LEFT:\n\t\t\tcase keyCode.UP:\n\t\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.SPACE:\n\t\t\tcase keyCode.ENTER:\n\t\t\t\tthis._eventHandler( event );\n\t\t\t\tbreak;\n\t\t\tcase keyCode.HOME:\n\t\t\t\ttoFocus = this.headers[ 0 ];\n\t\t\t\tbreak;\n\t\t\tcase keyCode.END:\n\t\t\t\ttoFocus = this.headers[ length - 1 ];\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( toFocus ) {\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\n\t\t\ttoFocus.focus();\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_panelKeyDown : function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\n\t\t\t$( event.currentTarget ).prev().focus();\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options;\n\t\tthis._processPanels();\n\n\t\t\/\/ was collapsed or no panel\n\t\tif ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t\/\/ active false only when collapsible is true\n\t\t} if ( options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t\/\/ was active, but active panel is gone\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t\/\/ all remaining panel are disabled\n\t\t\tif ( this.headers.length === this.headers.find(\".ui-state-disabled\").length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t\/\/ activate previous panel\n\t\t\t} else {\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\n\t\t\t}\n\t\t\/\/ was active, active panel still exists\n\t\t} else {\n\t\t\t\/\/ make sure active index is correct\n\t\t\toptions.active = this.headers.index( this.active );\n\t\t}\n\n\t\tthis._destroyIcons();\n\n\t\tthis._refresh();\n\t},\n\n\t_processPanels: function() {\n\t\tthis.headers = this.element.find( this.options.header )\n\t\t\t.addClass( \"ui-accordion-header ui-helper-reset ui-state-default ui-corner-all\" );\n\n\t\tthis.headers.next()\n\t\t\t.addClass( \"ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom\" )\n\t\t\t.filter(\":not(.ui-accordion-content-active)\")\n\t\t\t.hide();\n\t},\n\n\t_refresh: function() {\n\t\tvar maxHeight,\n\t\t\toptions = this.options,\n\t\t\theightStyle = options.heightStyle,\n\t\t\tparent = this.element.parent(),\n\t\t\taccordionId = this.accordionId = \"ui-accordion-\" +\n\t\t\t\t(this.element.attr( \"id\" ) || ++uid);\n\n\t\tthis.active = this._findActive( options.active )\n\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" )\n\t\t\t.removeClass( \"ui-corner-all\" );\n\t\tthis.active.next()\n\t\t\t.addClass( \"ui-accordion-content-active\" )\n\t\t\t.show();\n\n\t\tthis.headers\n\t\t\t.attr( \"role\", \"tab\" )\n\t\t\t.each(function( i ) {\n\t\t\t\tvar header = $( this ),\n\t\t\t\t\theaderId = header.attr( \"id\" ),\n\t\t\t\t\tpanel = header.next(),\n\t\t\t\t\tpanelId = panel.attr( \"id\" );\n\t\t\t\tif ( !headerId ) {\n\t\t\t\t\theaderId = accordionId + \"-header-\" + i;\n\t\t\t\t\theader.attr( \"id\", headerId );\n\t\t\t\t}\n\t\t\t\tif ( !panelId ) {\n\t\t\t\t\tpanelId = accordionId + \"-panel-\" + i;\n\t\t\t\t\tpanel.attr( \"id\", panelId );\n\t\t\t\t}\n\t\t\t\theader.attr( \"aria-controls\", panelId );\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\tthis.headers\n\t\t\t.not( this.active )\n\t\t\t.attr({\n\t\t\t\t\"aria-selected\": \"false\",\n\t\t\t\ttabIndex: -1\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t})\n\t\t\t\t.hide();\n\n\t\t\/\/ make sure at least one header is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active.attr({\n\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\ttabIndex: 0\n\t\t\t})\n\t\t\t.next()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\n\t\tthis._createIcons();\n\n\t\tthis._setupEvents( options.event );\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.headers.each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.headers.next()\n\t\t\t\t.each(function() {\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t\t})\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.headers.next()\n\t\t\t\t.each(function() {\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\n\t\t\t\t})\n\t\t\t\t.height( maxHeight );\n\t\t}\n\t},\n\n\t_activate: function( index ) {\n\t\tvar active = this._findActive( index )[ 0 ];\n\n\t\t\/\/ trying to activate the already active panel\n\t\tif ( active === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ trying to collapse, simulate a click on the currently active header\n\t\tactive = active || this.active[ 0 ];\n\n\t\tthis._eventHandler({\n\t\t\ttarget: active,\n\t\t\tcurrentTarget: active,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( selector ) {\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tkeydown: \"_keydown\"\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split(\" \"), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.headers.add( this.headers.next() ) );\n\t\tthis._on( this.headers, events );\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" });\n\t\tthis._hoverable( this.headers );\n\t\tthis._focusable( this.headers );\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tclicked = $( event.currentTarget ),\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\n\t\t\ttoHide = active.next(),\n\t\t\teventData = {\n\t\t\t\toldHeader: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif (\n\t\t\t\t\/\/ click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t\/\/ allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\n\n\t\t\/\/ when the call to ._toggle() comes after the class changes\n\t\t\/\/ it causes a very odd bug in IE 8 (see #6720)\n\t\tthis.active = clickedIsActive ? $() : clicked;\n\t\tthis._toggle( eventData );\n\n\t\t\/\/ switch classes\n\t\t\/\/ corner classes on the previously active header stay after the animation\n\t\tactive.removeClass( \"ui-accordion-header-active ui-state-active\" );\n\t\tif ( options.icons ) {\n\t\t\tactive.children( \".ui-accordion-header-icon\" )\n\t\t\t\t.removeClass( options.icons.activeHeader )\n\t\t\t\t.addClass( options.icons.header );\n\t\t}\n\n\t\tif ( !clickedIsActive ) {\n\t\t\tclicked\n\t\t\t\t.removeClass( \"ui-corner-all\" )\n\t\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" );\n\t\t\tif ( options.icons ) {\n\t\t\t\tclicked.children( \".ui-accordion-header-icon\" )\n\t\t\t\t\t.removeClass( options.icons.header )\n\t\t\t\t\t.addClass( options.icons.activeHeader );\n\t\t\t}\n\n\t\t\tclicked\n\t\t\t\t.next()\n\t\t\t\t.addClass( \"ui-accordion-content-active\" );\n\t\t}\n\t},\n\n\t_toggle: function( data ) {\n\t\tvar toShow = data.newPanel,\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\n\n\t\t\/\/ handle activating a panel during the animation for another activation\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\n\t\tthis.prevShow = toShow;\n\t\tthis.prevHide = toHide;\n\n\t\tif ( this.options.animate ) {\n\t\t\tthis._animate( toShow, toHide, data );\n\t\t} else {\n\t\t\ttoHide.hide();\n\t\t\ttoShow.show();\n\t\t\tthis._toggleComplete( data );\n\t\t}\n\n\t\ttoHide.attr({\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-hidden\": \"true\"\n\t\t});\n\t\ttoHide.prev().attr( \"aria-selected\", \"false\" );\n\t\t\/\/ if we're switching panels, remove the old header from the tab order\n\t\t\/\/ if we're opening from collapsed state, remove the previous header from the tab order\n\t\t\/\/ if we're collapsing, then keep the collapsing header in the tab order\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\ttoHide.prev().attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.headers.filter(function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow\n\t\t\t.attr({\n\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t})\n\t\t\t.prev()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t},\n\n\t_animate: function( toShow, toHide, data ) {\n\t\tvar total, easing, duration,\n\t\t\tthat = this,\n\t\t\tadjust = 0,\n\t\t\tdown = toShow.length &&\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\n\t\t\tanimate = this.options.animate || {},\n\t\t\toptions = down && animate.down || animate,\n\t\t\tcomplete = function() {\n\t\t\t\tthat._toggleComplete( data );\n\t\t\t};\n\n\t\tif ( typeof options === \"number\" ) {\n\t\t\tduration = options;\n\t\t}\n\t\tif ( typeof options === \"string\" ) {\n\t\t\teasing = options;\n\t\t}\n\t\t\/\/ fall back from options to animation in case of partial down settings\n\t\teasing = easing || options.easing || animate.easing;\n\t\tduration = duration || options.duration || animate.duration;\n\n\t\tif ( !toHide.length ) {\n\t\t\treturn toShow.animate( showProps, duration, easing, complete );\n\t\t}\n\t\tif ( !toShow.length ) {\n\t\t\treturn toHide.animate( hideProps, duration, easing, complete );\n\t\t}\n\n\t\ttotal = toShow.show().outerHeight();\n\t\ttoHide.animate( hideProps, {\n\t\t\tduration: duration,\n\t\t\teasing: easing,\n\t\t\tstep: function( now, fx ) {\n\t\t\t\tfx.now = Math.round( now );\n\t\t\t}\n\t\t});\n\t\ttoShow\n\t\t\t.hide()\n\t\t\t.animate( showProps, {\n\t\t\t\tduration: duration,\n\t\t\t\teasing: easing,\n\t\t\t\tcomplete: complete,\n\t\t\t\tstep: function( now, fx ) {\n\t\t\t\t\tfx.now = Math.round( now );\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\n\t\t\t\t\t\tadjust += fx.now;\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\n\t\t\t\t\t\tadjust = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\t_toggleComplete: function( data ) {\n\t\tvar toHide = data.oldPanel;\n\n\t\ttoHide\n\t\t\t.removeClass( \"ui-accordion-content-active\" )\n\t\t\t.prev()\n\t\t\t\t.removeClass( \"ui-corner-top\" )\n\t\t\t\t.addClass( \"ui-corner-all\" );\n\n\t\t\/\/ Work around for rendering bug in IE (#5421)\n\t\tif ( toHide.length ) {\n\t\t\ttoHide.parent()[0].className = toHide.parent()[0].className;\n\t\t}\n\n\t\tthis._trigger( \"activate\", null, data );\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n\/\/ used to prevent race conditions with remote data sources\nvar requestIndex = 0;\n\n$.widget( \"ui.autocomplete\", {\n\tversion: \"1.10.2\",\n\tdefaultElement: \"<input>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tautoFocus: false,\n\t\tdelay: 300,\n\t\tminLength: 1,\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\tsource: null,\n\n\t\t\/\/ callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresponse: null,\n\t\tsearch: null,\n\t\tselect: null\n\t},\n\n\tpending: 0,\n\n\t_create: function() {\n\t\t\/\/ Some browsers only repeat keydown events, not keypress events,\n\t\t\/\/ so we use the suppressKeyPress flag to determine if we've already\n\t\t\/\/ handled the keydown event. #7269\n\t\t\/\/ Unfortunately the code for & in keypress is the same as the up arrow,\n\t\t\/\/ so we use the suppressKeyPressRepeat flag to avoid handling keypress\n\t\t\/\/ events when we know the keydown event was used to modify the\n\t\t\/\/ search term. #7799\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\n\t\t\tnodeName = this.element[0].nodeName.toLowerCase(),\n\t\t\tisTextarea = nodeName === \"textarea\",\n\t\t\tisInput = nodeName === \"input\";\n\n\t\tthis.isMultiLine =\n\t\t\t\/\/ Textareas are always multi-line\n\t\t\tisTextarea ? true :\n\t\t\t\/\/ Inputs are always single-line, even if inside a contentEditable element\n\t\t\t\/\/ IE also treats inputs as contentEditable\n\t\t\tisInput ? false :\n\t\t\t\/\/ All other element types are determined by whether or not they're contentEditable\n\t\t\tthis.element.prop( \"isContentEditable\" );\n\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\n\t\tthis.isNewMenu = true;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-autocomplete-input\" )\n\t\t\t.attr( \"autocomplete\", \"off\" );\n\n\t\tthis._on( this.element, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\t\/*jshint maxcomplexity:15*\/\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tsuppressInput = true;\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuppressKeyPress = false;\n\t\t\t\tsuppressInput = false;\n\t\t\t\tsuppressKeyPressRepeat = false;\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ENTER:\n\t\t\t\tcase keyCode.NUMPAD_ENTER:\n\t\t\t\t\t\/\/ when menu is open and has focus\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\t\/\/ #6055 - Opera still allows the keypress to occur\n\t\t\t\t\t\t\/\/ which causes forms to submit\n\t\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.TAB:\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ESCAPE:\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tthis._value( this.term );\n\t\t\t\t\t\tthis.close( event );\n\t\t\t\t\t\t\/\/ Different browsers have different default behavior for escape\n\t\t\t\t\t\t\/\/ Single press can mean undo or clear\n\t\t\t\t\t\t\/\/ Double press in IE means clear the whole form\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\t\/\/ search timeout should be triggered before the input value is changed\n\t\t\t\t\tthis._searchTimeout( event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeypress: function( event ) {\n\t\t\t\tif ( suppressKeyPress ) {\n\t\t\t\t\tsuppressKeyPress = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( suppressKeyPressRepeat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t\/\/ replicate some key handlers to allow them to repeat in Firefox and Opera\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tinput: function( event ) {\n\t\t\t\tif ( suppressInput ) {\n\t\t\t\t\tsuppressInput = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._searchTimeout( event );\n\t\t\t},\n\t\t\tfocus: function() {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.previous = this._value();\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tif ( this.cancelBlur ) {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tclearTimeout( this.searching );\n\t\t\t\tthis.close( event );\n\t\t\t\tthis._change( event );\n\t\t\t}\n\t\t});\n\n\t\tthis._initSource();\n\t\tthis.menu = $( \"<ul>\" )\n\t\t\t.addClass( \"ui-autocomplete ui-front\" )\n\t\t\t.appendTo( this._appendTo() )\n\t\t\t.menu({\n\t\t\t\t\/\/ custom key handling for now\n\t\t\t\tinput: $(),\n\t\t\t\t\/\/ disable ARIA support, the live region takes care of that\n\t\t\t\trole: null\n\t\t\t})\n\t\t\t.hide()\n\t\t\t.data( \"ui-menu\" );\n\n\t\tthis._on( this.menu.element, {\n\t\t\tmousedown: function( event ) {\n\t\t\t\t\/\/ prevent moving focus out of the text field\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\/\/ IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t\t\/\/ so we set a flag to know when we should ignore the blur event\n\t\t\t\tthis.cancelBlur = true;\n\t\t\t\tthis._delay(function() {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t});\n\n\t\t\t\t\/\/ clicking on the scrollbar causes focus to shift to the body\n\t\t\t\t\/\/ but we can't detect a mouseup or a click immediately afterward\n\t\t\t\t\/\/ so we have to track the next mousedown and close the menu if\n\t\t\t\t\/\/ the user clicks somewhere outside of the autocomplete\n\t\t\t\tvar menuElement = this.menu.element[ 0 ];\n\t\t\t\tif ( !$( event.target ).closest( \".ui-menu-item\" ).length ) {\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tvar that = this;\n\t\t\t\t\t\tthis.document.one( \"mousedown\", function( event ) {\n\t\t\t\t\t\t\tif ( event.target !== that.element[ 0 ] &&\n\t\t\t\t\t\t\t\t\tevent.target !== menuElement &&\n\t\t\t\t\t\t\t\t\t!$.contains( menuElement, event.target ) ) {\n\t\t\t\t\t\t\t\tthat.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenufocus: function( event, ui ) {\n\t\t\t\t\/\/ support: Firefox\n\t\t\t\t\/\/ Prevent accidental activation of menu items in Firefox (#7024 #9118)\n\t\t\t\tif ( this.isNewMenu ) {\n\t\t\t\t\tthis.isNewMenu = false;\n\t\t\t\t\tif ( event.originalEvent && \/^mouse\/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis.menu.blur();\n\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" );\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\n\t\t\t\t\t\/\/ use value to match what will end up in the input, if it was a key event\n\t\t\t\t\tif ( event.originalEvent && \/^key\/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis._value( item.value );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t\/\/ Normally the input is populated with the item's value as the\n\t\t\t\t\t\/\/ menu is navigated, causing screen readers to notice a change and\n\t\t\t\t\t\/\/ announce the item. Since the focus event was canceled, this doesn't\n\t\t\t\t\t\/\/ happen, so we update the live region so that screen readers can\n\t\t\t\t\t\/\/ still notice the change and announce it.\n\t\t\t\t\tthis.liveRegion.text( item.value );\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenuselect: function( event, ui ) {\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\n\t\t\t\t\tprevious = this.previous;\n\n\t\t\t\t\/\/ only trigger when focus was lost (click on menu)\n\t\t\t\tif ( this.element[0] !== this.document[0].activeElement ) {\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\/\/ #6109 - IE triggers two focus events and the second\n\t\t\t\t\t\/\/ is asynchronous, so we need to reset the previous\n\t\t\t\t\t\/\/ term synchronously and asynchronously :-(\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\tthis.selectedItem = item;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\n\t\t\t\t\tthis._value( item.value );\n\t\t\t\t}\n\t\t\t\t\/\/ reset the term after the select event\n\t\t\t\t\/\/ this allows custom select handling to work properly\n\t\t\t\tthis.term = this._value();\n\n\t\t\t\tthis.close( event );\n\t\t\t\tthis.selectedItem = item;\n\t\t\t}\n\t\t});\n\n\t\tthis.liveRegion = $( \"<span>\", {\n\t\t\t\trole: \"status\",\n\t\t\t\t\"aria-live\": \"polite\"\n\t\t\t})\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\n\t\t\t.insertAfter( this.element );\n\n\t\t\/\/ turning off autocomplete prevents the browser from remembering the\n\t\t\/\/ value when navigating through history, so we re-enable autocomplete\n\t\t\/\/ if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\tclearTimeout( this.searching );\n\t\tthis.element\n\t\t\t.removeClass( \"ui-autocomplete-input\" )\n\t\t\t.removeAttr( \"autocomplete\" );\n\t\tthis.menu.element.remove();\n\t\tthis.liveRegion.remove();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"source\" ) {\n\t\t\tthis._initSource();\n\t\t}\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\n\t\t}\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element ) {\n\t\t\telement = this.element.closest( \".ui-front\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[0].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_initSource: function() {\n\t\tvar array, url,\n\t\t\tthat = this;\n\t\tif ( $.isArray(this.options.source) ) {\n\t\t\tarray = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\n\t\t\t};\n\t\t} else if ( typeof this.options.source === \"string\" ) {\n\t\t\turl = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tif ( that.xhr ) {\n\t\t\t\t\tthat.xhr.abort();\n\t\t\t\t}\n\t\t\t\tthat.xhr = $.ajax({\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: request,\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\t\tresponse( data );\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tresponse( [] );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t} else {\n\t\t\tthis.source = this.options.source;\n\t\t}\n\t},\n\n\t_searchTimeout: function( event ) {\n\t\tclearTimeout( this.searching );\n\t\tthis.searching = this._delay(function() {\n\t\t\t\/\/ only search if the value has changed\n\t\t\tif ( this.term !== this._value() ) {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.search( null, event );\n\t\t\t}\n\t\t}, this.options.delay );\n\t},\n\n\tsearch: function( value, event ) {\n\t\tvalue = value != null ? value : this._value();\n\n\t\t\/\/ always save the actual value, not the one passed as an argument\n\t\tthis.term = this._value();\n\n\t\tif ( value.length < this.options.minLength ) {\n\t\t\treturn this.close( event );\n\t\t}\n\n\t\tif ( this._trigger( \"search\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._search( value );\n\t},\n\n\t_search: function( value ) {\n\t\tthis.pending++;\n\t\tthis.element.addClass( \"ui-autocomplete-loading\" );\n\t\tthis.cancelSearch = false;\n\n\t\tthis.source( { term: value }, this._response() );\n\t},\n\n\t_response: function() {\n\t\tvar that = this,\n\t\t\tindex = ++requestIndex;\n\n\t\treturn function( content ) {\n\t\t\tif ( index === requestIndex ) {\n\t\t\t\tthat.__response( content );\n\t\t\t}\n\n\t\t\tthat.pending--;\n\t\t\tif ( !that.pending ) {\n\t\t\t\tthat.element.removeClass( \"ui-autocomplete-loading\" );\n\t\t\t}\n\t\t};\n\t},\n\n\t__response: function( content ) {\n\t\tif ( content ) {\n\t\t\tcontent = this._normalize( content );\n\t\t}\n\t\tthis._trigger( \"response\", null, { content: content } );\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\n\t\t\tthis._suggest( content );\n\t\t\tthis._trigger( \"open\" );\n\t\t} else {\n\t\t\t\/\/ use ._close() instead of .close() so we don't cancel future searches\n\t\t\tthis._close();\n\t\t}\n\t},\n\n\tclose: function( event ) {\n\t\tthis.cancelSearch = true;\n\t\tthis._close( event );\n\t},\n\n\t_close: function( event ) {\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.menu.element.hide();\n\t\t\tthis.menu.blur();\n\t\t\tthis.isNewMenu = true;\n\t\t\tthis._trigger( \"close\", event );\n\t\t}\n\t},\n\n\t_change: function( event ) {\n\t\tif ( this.previous !== this._value() ) {\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\n\t\t}\n\t},\n\n\t_normalize: function( items ) {\n\t\t\/\/ assume all items have the right format when the first item is complete\n\t\tif ( items.length && items[0].label && items[0].value ) {\n\t\t\treturn items;\n\t\t}\n\t\treturn $.map( items, function( item ) {\n\t\t\tif ( typeof item === \"string\" ) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: item,\n\t\t\t\t\tvalue: item\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn $.extend({\n\t\t\t\tlabel: item.label || item.value,\n\t\t\t\tvalue: item.value || item.label\n\t\t\t}, item );\n\t\t});\n\t},\n\n\t_suggest: function( items ) {\n\t\tvar ul = this.menu.element.empty();\n\t\tthis._renderMenu( ul, items );\n\t\tthis.isNewMenu = true;\n\t\tthis.menu.refresh();\n\n\t\t\/\/ size and position menu\n\t\tul.show();\n\t\tthis._resizeMenu();\n\t\tul.position( $.extend({\n\t\t\tof: this.element\n\t\t}, this.options.position ));\n\n\t\tif ( this.options.autoFocus ) {\n\t\t\tthis.menu.next();\n\t\t}\n\t},\n\n\t_resizeMenu: function() {\n\t\tvar ul = this.menu.element;\n\t\tul.outerWidth( Math.max(\n\t\t\t\/\/ Firefox wraps long text (possibly a rounding bug)\n\t\t\t\/\/ so we add 1px to avoid the wrapping (#7513)\n\t\t\tul.width( \"\" ).outerWidth() + 1,\n\t\t\tthis.element.outerWidth()\n\t\t) );\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this;\n\t\t$.each( items, function( index, item ) {\n\t\t\tthat._renderItemData( ul, item );\n\t\t});\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\treturn $( \"<li>\" )\n\t\t\t.append( $( \"<a>\" ).text( item.label ) )\n\t\t\t.appendTo( ul );\n\t},\n\n\t_move: function( direction, event ) {\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.search( null, event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.menu.isFirstItem() && \/^previous\/.test( direction ) ||\n\t\t\t\tthis.menu.isLastItem() && \/^next\/.test( direction ) ) {\n\t\t\tthis._value( this.term );\n\t\t\tthis.menu.blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.menu[ direction ]( event );\n\t},\n\n\twidget: function() {\n\t\treturn this.menu.element;\n\t},\n\n\t_value: function() {\n\t\treturn this.valueMethod.apply( this.element, arguments );\n\t},\n\n\t_keyEvent: function( keyEvent, event ) {\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis._move( keyEvent, event );\n\n\t\t\t\/\/ prevents moving cursor to beginning\/end of the text field in some browsers\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n});\n\n$.extend( $.ui.autocomplete, {\n\tescapeRegex: function( value ) {\n\t\treturn value.replace(\/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]\/g, \"\\\\$&\");\n\t},\n\tfilter: function(array, term) {\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), \"i\" );\n\t\treturn $.grep( array, function(value) {\n\t\t\treturn matcher.test( value.label || value.value || value );\n\t\t});\n\t}\n});\n\n\n\/\/ live region extension, adding a `messages` option\n\/\/ NOTE: This is an experimental API. We are still investigating\n\/\/ a full solution for string manipulation and internationalization.\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\n\toptions: {\n\t\tmessages: {\n\t\t\tnoResults: \"No search results.\",\n\t\t\tresults: function( amount ) {\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\n\t\t\t}\n\t\t}\n\t},\n\n\t__response: function( content ) {\n\t\tvar message;\n\t\tthis._superApply( arguments );\n\t\tif ( this.options.disabled || this.cancelSearch ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( content && content.length ) {\n\t\t\tmessage = this.options.messages.results( content.length );\n\t\t} else {\n\t\t\tmessage = this.options.messages.noResults;\n\t\t}\n\t\tthis.liveRegion.text( message );\n\t}\n});\n\n}( jQuery ));\n\n(function( $, undefined ) {\n\nvar lastActive, startXPos, startYPos, clickDragged,\n\tbaseClasses = \"ui-button ui-widget ui-state-default ui-corner-all\",\n\tstateClasses = \"ui-state-hover ui-state-active \",\n\ttypeClasses = \"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",\n\tformResetHandler = function() {\n\t\tvar buttons = $( this ).find( \":ui-button\" );\n\t\tsetTimeout(function() {\n\t\t\tbuttons.button( \"refresh\" );\n\t\t}, 1 );\n\t},\n\tradioGroup = function( radio ) {\n\t\tvar name = radio.name,\n\t\t\tform = radio.form,\n\t\t\tradios = $( [] );\n\t\tif ( name ) {\n\t\t\tname = name.replace( \/'\/g, \"\\\\'\" );\n\t\t\tif ( form ) {\n\t\t\t\tradios = $( form ).find( \"[name='\" + name + \"']\" );\n\t\t\t} else {\n\t\t\t\tradios = $( \"[name='\" + name + \"']\", radio.ownerDocument )\n\t\t\t\t\t.filter(function() {\n\t\t\t\t\t\treturn !this.form;\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn radios;\n\t};\n\n$.widget( \"ui.button\", {\n\tversion: \"1.10.2\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tdisabled: null,\n\t\ttext: true,\n\t\tlabel: null,\n\t\ticons: {\n\t\t\tprimary: null,\n\t\t\tsecondary: null\n\t\t}\n\t},\n\t_create: function() {\n\t\tthis.element.closest( \"form\" )\n\t\t\t.unbind( \"reset\" + this.eventNamespace )\n\t\t\t.bind( \"reset\" + this.eventNamespace, formResetHandler );\n\n\t\tif ( typeof this.options.disabled !== \"boolean\" ) {\n\t\t\tthis.options.disabled = !!this.element.prop( \"disabled\" );\n\t\t} else {\n\t\t\tthis.element.prop( \"disabled\", this.options.disabled );\n\t\t}\n\n\t\tthis._determineButtonType();\n\t\tthis.hasTitle = !!this.buttonElement.attr( \"title\" );\n\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\ttoggleButton = this.type === \"checkbox\" || this.type === \"radio\",\n\t\t\tactiveClass = !toggleButton ? \"ui-state-active\" : \"\",\n\t\t\tfocusClass = \"ui-state-focus\";\n\n\t\tif ( options.label === null ) {\n\t\t\toptions.label = (this.type === \"input\" ? this.buttonElement.val() : this.buttonElement.html());\n\t\t}\n\n\t\tthis._hoverable( this.buttonElement );\n\n\t\tthis.buttonElement\n\t\t\t.addClass( baseClasses )\n\t\t\t.attr( \"role\", \"button\" )\n\t\t\t.bind( \"mouseenter\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( this === lastActive ) {\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t}\n\t\t\t})\n\t\t\t.bind( \"mouseleave\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$( this ).removeClass( activeClass );\n\t\t\t})\n\t\t\t.bind( \"click\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.bind( \"focus\" + this.eventNamespace, function() {\n\t\t\t\t\/\/ no need to check disabled, focus won't be triggered anyway\n\t\t\t\tthat.buttonElement.addClass( focusClass );\n\t\t\t})\n\t\t\t.bind( \"blur\" + this.eventNamespace, function() {\n\t\t\t\tthat.buttonElement.removeClass( focusClass );\n\t\t\t});\n\n\t\tif ( toggleButton ) {\n\t\t\tthis.element.bind( \"change\" + this.eventNamespace, function() {\n\t\t\t\tif ( clickDragged ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthat.refresh();\n\t\t\t});\n\t\t\t\/\/ if mouse moves between mousedown and mouseup (drag) set clickDragged flag\n\t\t\t\/\/ prevents issue where button state changes but checkbox\/radio checked state\n\t\t\t\/\/ does not in Firefox (see ticket #6970)\n\t\t\tthis.buttonElement\n\t\t\t\t.bind( \"mousedown\" + this.eventNamespace, function( event ) {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tclickDragged = false;\n\t\t\t\t\tstartXPos = event.pageX;\n\t\t\t\t\tstartYPos = event.pageY;\n\t\t\t\t})\n\t\t\t\t.bind( \"mouseup\" + this.eventNamespace, function( event ) {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif ( startXPos !== event.pageX || startYPos !== event.pageY ) {\n\t\t\t\t\t\tclickDragged = true;\n\t\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled || clickDragged ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"radio\" ) {\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\n\t\t\t\tif ( options.disabled || clickDragged ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\tthat.buttonElement.attr( \"aria-pressed\", \"true\" );\n\n\t\t\t\tvar radio = that.element[ 0 ];\n\t\t\t\tradioGroup( radio )\n\t\t\t\t\t.not( radio )\n\t\t\t\t\t.map(function() {\n\t\t\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t\t\t})\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t});\n\t\t} else {\n\t\t\tthis.buttonElement\n\t\t\t\t.bind( \"mousedown\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\tlastActive = this;\n\t\t\t\t\tthat.document.one( \"mouseup\", function() {\n\t\t\t\t\t\tlastActive = null;\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.bind( \"mouseup\" + this.eventNamespace, function() {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t})\n\t\t\t\t.bind( \"keydown\" + this.eventNamespace, function(event) {\n\t\t\t\t\tif ( options.disabled ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {\n\t\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t\/\/ see #8559, we bind to blur here in case the button element loses\n\t\t\t\t\/\/ focus between keydown and keyup, it would be left in an \"active\" state\n\t\t\t\t.bind( \"keyup\" + this.eventNamespace + \" blur\" + this.eventNamespace, function() {\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\n\t\t\t\t});\n\n\t\t\tif ( this.buttonElement.is(\"a\") ) {\n\t\t\t\tthis.buttonElement.keyup(function(event) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\t\/\/ TODO pass through original event correctly (just as 2nd argument doesn't work)\n\t\t\t\t\t\t$( this ).click();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t\/\/ TODO: pull out $.Widget's handling for the disabled option into\n\t\t\/\/ $.Widget.prototype._setOptionDisabled so it's easy to proxy and can\n\t\t\/\/ be overridden by individual plugins\n\t\tthis._setOption( \"disabled\", options.disabled );\n\t\tthis._resetButton();\n\t},\n\n\t_determineButtonType: function() {\n\t\tvar ancestor, labelSelector, checked;\n\n\t\tif ( this.element.is(\"[type=checkbox]\") ) {\n\t\t\tthis.type = \"checkbox\";\n\t\t} else if ( this.element.is(\"[type=radio]\") ) {\n\t\t\tthis.type = \"radio\";\n\t\t} else if ( this.element.is(\"input\") ) {\n\t\t\tthis.type = \"input\";\n\t\t} else {\n\t\t\tthis.type = \"button\";\n\t\t}\n\n\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\/\/ we don't search against the document in case the element\n\t\t\t\/\/ is disconnected from the DOM\n\t\t\tancestor = this.element.parents().last();\n\t\t\tlabelSelector = \"label[for='\" + this.element.attr(\"id\") + \"']\";\n\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\tancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();\n\t\t\t\tthis.buttonElement = ancestor.filter( labelSelector );\n\t\t\t\tif ( !this.buttonElement.length ) {\n\t\t\t\t\tthis.buttonElement = ancestor.find( labelSelector );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.element.addClass( \"ui-helper-hidden-accessible\" );\n\n\t\t\tchecked = this.element.is( \":checked\" );\n\t\t\tif ( checked ) {\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-active\" );\n\t\t\t}\n\t\t\tthis.buttonElement.prop( \"aria-pressed\", checked );\n\t\t} else {\n\t\t\tthis.buttonElement = this.element;\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.buttonElement;\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-helper-hidden-accessible\" );\n\t\tthis.buttonElement\n\t\t\t.removeClass( baseClasses + \" \" + stateClasses + \" \" + typeClasses )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-pressed\" )\n\t\t\t.html( this.buttonElement.find(\".ui-button-text\").html() );\n\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.buttonElement.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tif ( value ) {\n\t\t\t\tthis.element.prop( \"disabled\", true );\n\t\t\t} else {\n\t\t\t\tthis.element.prop( \"disabled\", false );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis._resetButton();\n\t},\n\n\trefresh: function() {\n\t\t\/\/See #8237 & #8828\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ? this.element.is( \":disabled\" ) : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOption( \"disabled\", isDisabled );\n\t\t}\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tradioGroup( this.element[0] ).each(function() {\n\t\t\t\tif ( $( this ).is( \":checked\" ) ) {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\t$( this ).button( \"widget\" )\n\t\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t\t}\n\t\t\t});\n\t\t} else if ( this.type === \"checkbox\" ) {\n\t\t\tif ( this.element.is( \":checked\" ) ) {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\n\t\t\t} else {\n\t\t\t\tthis.buttonElement\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetButton: function() {\n\t\tif ( this.type === \"input\" ) {\n\t\t\tif ( this.options.label ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tvar buttonElement = this.buttonElement.removeClass( typeClasses ),\n\t\t\tbuttonText = $( \"<span><\/span>\", this.document[0] )\n\t\t\t\t.addClass( \"ui-button-text\" )\n\t\t\t\t.html( this.options.label )\n\t\t\t\t.appendTo( buttonElement.empty() )\n\t\t\t\t.text(),\n\t\t\ticons = this.options.icons,\n\t\t\tmultipleIcons = icons.primary && icons.secondary,\n\t\t\tbuttonClasses = [];\n\n\t\tif ( icons.primary || icons.secondary ) {\n\t\t\tif ( this.options.text ) {\n\t\t\t\tbuttonClasses.push( \"ui-button-text-icon\" + ( multipleIcons ? \"s\" : ( icons.primary ? \"-primary\" : \"-secondary\" ) ) );\n\t\t\t}\n\n\t\t\tif ( icons.primary ) {\n\t\t\t\tbuttonElement.prepend( \"<span class='ui-button-icon-primary ui-icon \" + icons.primary + \"'><\/span>\" );\n\t\t\t}\n\n\t\t\tif ( icons.secondary ) {\n\t\t\t\tbuttonElement.append( \"<span class='ui-button-icon-secondary ui-icon \" + icons.secondary + \"'><\/span>\" );\n\t\t\t}\n\n\t\t\tif ( !this.options.text ) {\n\t\t\t\tbuttonClasses.push( multipleIcons ? \"ui-button-icons-only\" : \"ui-button-icon-only\" );\n\n\t\t\t\tif ( !this.hasTitle ) {\n\t\t\t\t\tbuttonElement.attr( \"title\", $.trim( buttonText ) );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbuttonClasses.push( \"ui-button-text-only\" );\n\t\t}\n\t\tbuttonElement.addClass( buttonClasses.join( \" \" ) );\n\t}\n});\n\n$.widget( \"ui.buttonset\", {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\titems: \"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)\"\n\t},\n\n\t_create: function() {\n\t\tthis.element.addClass( \"ui-buttonset\" );\n\t},\n\n\t_init: function() {\n\t\tthis.refresh();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.buttons.button( \"option\", key, value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\trefresh: function() {\n\t\tvar rtl = this.element.css( \"direction\" ) === \"rtl\";\n\n\t\tthis.buttons = this.element.find( this.options.items )\n\t\t\t.filter( \":ui-button\" )\n\t\t\t\t.button( \"refresh\" )\n\t\t\t.end()\n\t\t\t.not( \":ui-button\" )\n\t\t\t\t.button()\n\t\t\t.end()\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-all ui-corner-left ui-corner-right\" )\n\t\t\t\t.filter( \":first\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-right\" : \"ui-corner-left\" )\n\t\t\t\t.end()\n\t\t\t\t.filter( \":last\" )\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-left\" : \"ui-corner-right\" )\n\t\t\t\t.end()\n\t\t\t.end();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeClass( \"ui-buttonset\" );\n\t\tthis.buttons\n\t\t\t.map(function() {\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\n\t\t\t})\n\t\t\t\t.removeClass( \"ui-corner-left ui-corner-right\" )\n\t\t\t.end()\n\t\t\t.button( \"destroy\" );\n\t}\n});\n\n}( jQuery ) );\n\n(function( $, undefined ) {\n\n$.extend($.ui, { datepicker: { version: \"1.10.2\" } });\n\nvar PROP_NAME = \"datepicker\",\n\tdpuuid = new Date().getTime(),\n\tinstActive;\n\n\/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. *\/\n\nfunction Datepicker() {\n\tthis._curInst = null; \/\/ The current instance in use\n\tthis._keyEvent = false; \/\/ If the last event was a key event\n\tthis._disabledInputs = []; \/\/ List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; \/\/ True if the popup picker is showing , false if not\n\tthis._inDialog = false; \/\/ True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div\"; \/\/ The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; \/\/ The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; \/\/ The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; \/\/ The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; \/\/ The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; \/\/ The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; \/\/ The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; \/\/ The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; \/\/ The name of the day hover marker class\n\tthis.regional = []; \/\/ Available regional settings, indexed by language code\n\tthis.regional[\"\"] = { \/\/ Default regional settings\n\t\tcloseText: \"Done\", \/\/ Display text for close link\n\t\tprevText: \"Prev\", \/\/ Display text for previous month link\n\t\tnextText: \"Next\", \/\/ Display text for next month link\n\t\tcurrentText: \"Today\", \/\/ Display text for current month link\n\t\tmonthNames: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\n\t\t\t\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"], \/\/ Names of months for drop-down and formatting\n\t\tmonthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], \/\/ For formatting\n\t\tdayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], \/\/ For formatting\n\t\tdayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], \/\/ For formatting\n\t\tdayNamesMin: [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"], \/\/ Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", \/\/ Column header for week of the year\n\t\tdateFormat: \"mm\/dd\/yy\", \/\/ See format options on parseDate\n\t\tfirstDay: 0, \/\/ The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, \/\/ True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, \/\/ True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\" \/\/ Additional text to append to the year in the month headers\n\t};\n\tthis._defaults = { \/\/ Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", \/\/ \"focus\" for popup on focus,\n\t\t\t\/\/ \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", \/\/ Name of jQuery animation for popup\n\t\tshowOptions: {}, \/\/ Options for enhanced animations\n\t\tdefaultDate: null, \/\/ Used when field is blank: actual date,\n\t\t\t\/\/ +\/-number for offset from today, null for today\n\t\tappendText: \"\", \/\/ Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", \/\/ Text for trigger button\n\t\tbuttonImage: \"\", \/\/ URL for trigger button image\n\t\tbuttonImageOnly: false, \/\/ True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, \/\/ True to hide next\/previous month links\n\t\t\t\/\/ if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, \/\/ True if date formatting applied to prev\/today\/next links\n\t\tgotoCurrent: false, \/\/ True if today link goes back to current selection instead\n\t\tchangeMonth: false, \/\/ True if month can be selected directly, false if only prev\/next\n\t\tchangeYear: false, \/\/ True if year can be selected directly, false if only prev\/next\n\t\tyearRange: \"c-10:c+10\", \/\/ Range of years to display in drop-down,\n\t\t\t\/\/ either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t\/\/ (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, \/\/ True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, \/\/ True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, \/\/ True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, \/\/ How to calculate the week of the year,\n\t\t\t\/\/ takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", \/\/ Short year values < this are in the current century,\n\t\t\t\/\/ > this are in the previous century,\n\t\t\t\/\/ string value starting with \"+\" for current year + value\n\t\tminDate: null, \/\/ The earliest selectable date, or null for no limit\n\t\tmaxDate: null, \/\/ The latest selectable date, or null for no limit\n\t\tduration: \"fast\", \/\/ Duration of display\/closure\n\t\tbeforeShowDay: null, \/\/ Function that takes a date and returns an array with\n\t\t\t\/\/ [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t\/\/ [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, \/\/ Function that takes an input field and\n\t\t\t\/\/ returns a set of custom settings for the date picker\n\t\tonSelect: null, \/\/ Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, \/\/ Define a callback function when the month or year is changed\n\t\tonClose: null, \/\/ Define a callback function when the datepicker is closed\n\t\tnumberOfMonths: 1, \/\/ Number of months to show at a time\n\t\tshowCurrentAtPos: 0, \/\/ The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, \/\/ Number of months to step back\/forward\n\t\tstepBigMonths: 12, \/\/ Number of months to step back\/forward for the big links\n\t\taltField: \"\", \/\/ Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", \/\/ The date format to use for the alternate field\n\t\tconstrainInput: true, \/\/ The input is constrained by the current date format\n\t\tshowButtonPanel: false, \/\/ True to show button panel, false to not show it\n\t\tautoSize: false, \/\/ True to size the input for the date format, false to leave as is\n\t\tdisabled: false \/\/ The initial disabled state\n\t};\n\t$.extend(this._defaults, this.regional[\"\"]);\n\tthis.dpDiv = bindHover($(\"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'><\/div>\"));\n}\n\n$.extend(Datepicker.prototype, {\n\t\/* Class name added to elements to indicate already configured with a date picker. *\/\n\tmarkerClassName: \"hasDatepicker\",\n\n\t\/\/Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t\/\/ TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t\/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t *\/\n\tsetDefaults: function(settings) {\n\t\textendRemove(this._defaults, settings || {});\n\t\treturn this;\n\t},\n\n\t\/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t *\/\n\t_attachDatepicker: function(target, settings) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = (nodeName === \"div\" || nodeName === \"span\");\n\t\tif (!target.id) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst($(target), inline);\n\t\tinst.settings = $.extend({}, settings || {});\n\t\tif (nodeName === \"input\") {\n\t\t\tthis._connectDatepicker(target, inst);\n\t\t} else if (inline) {\n\t\t\tthis._inlineDatepicker(target, inst);\n\t\t}\n\t},\n\n\t\/* Create a new instance object. *\/\n\t_newInst: function(target, inline) {\n\t\tvar id = target[0].id.replace(\/([^A-Za-z0-9_\\-])\/g, \"\\\\\\\\$1\"); \/\/ escape jQuery meta chars\n\t\treturn {id: id, input: target, \/\/ associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, \/\/ current selection\n\t\t\tdrawMonth: 0, drawYear: 0, \/\/ month being drawn\n\t\t\tinline: inline, \/\/ is datepicker inline or not\n\t\t\tdpDiv: (!inline ? this.dpDiv : \/\/ presentation div\n\t\t\tbindHover($(\"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'><\/div>\")))};\n\t},\n\n\t\/* Attach the date picker to an input field. *\/\n\t_connectDatepicker: function(target, inst) {\n\t\tvar input = $(target);\n\t\tinst.append = $([]);\n\t\tinst.trigger = $([]);\n\t\tif (input.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments(input, inst);\n\t\tinput.addClass(this.markerClassName).keydown(this._doKeyDown).\n\t\t\tkeypress(this._doKeyPress).keyup(this._doKeyUp);\n\t\tthis._autoSize(inst);\n\t\t$.data(target, PROP_NAME, inst);\n\t\t\/\/If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t\/* Make attachments based on settings. *\/\n\t_attachments: function(input, inst) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get(inst, \"appendText\"),\n\t\t\tisRTL = this._get(inst, \"isRTL\");\n\n\t\tif (inst.append) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif (appendText) {\n\t\t\tinst.append = $(\"<span class='\" + this._appendClass + \"'>\" + appendText + \"<\/span>\");\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.append);\n\t\t}\n\n\t\tinput.unbind(\"focus\", this._showDatepicker);\n\n\t\tif (inst.trigger) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get(inst, \"showOn\");\n\t\tif (showOn === \"focus\" || showOn === \"both\") { \/\/ pop-up date picker when in the marked field\n\t\t\tinput.focus(this._showDatepicker);\n\t\t}\n\t\tif (showOn === \"button\" || showOn === \"both\") { \/\/ pop-up date picker when button clicked\n\t\t\tbuttonText = this._get(inst, \"buttonText\");\n\t\t\tbuttonImage = this._get(inst, \"buttonImage\");\n\t\t\tinst.trigger = $(this._get(inst, \"buttonImageOnly\") ?\n\t\t\t\t$(\"<img\/>\").addClass(this._triggerClass).\n\t\t\t\t\tattr({ src: buttonImage, alt: buttonText, title: buttonText }) :\n\t\t\t\t$(\"<button type='button'><\/button>\").addClass(this._triggerClass).\n\t\t\t\t\thtml(!buttonImage ? buttonText : $(\"<img\/>\").attr(\n\t\t\t\t\t{ src:buttonImage, alt:buttonText, title:buttonText })));\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.trigger);\n\t\t\tinst.trigger.click(function() {\n\t\t\t\tif ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t},\n\n\t\/* Apply the maximum length for the date format. *\/\n\t_autoSize: function(inst) {\n\t\tif (this._get(inst, \"autoSize\") && !inst.inline) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date(2009, 12 - 1, 20), \/\/ Ensure double digits\n\t\t\t\tdateFormat = this._get(inst, \"dateFormat\");\n\n\t\t\tif (dateFormat.match(\/[DM]\/)) {\n\t\t\t\tfindMax = function(names) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor (i = 0; i < names.length; i++) {\n\t\t\t\t\t\tif (names[i].length > max) {\n\t\t\t\t\t\t\tmax = names[i].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth(findMax(this._get(inst, (dateFormat.match(\/MM\/) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\"))));\n\t\t\t\tdate.setDate(findMax(this._get(inst, (dateFormat.match(\/DD\/) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\"))) + 20 - date.getDay());\n\t\t\t}\n\t\t\tinst.input.attr(\"size\", this._formatDate(inst, date).length);\n\t\t}\n\t},\n\n\t\/* Attach an inline date picker to a div. *\/\n\t_inlineDatepicker: function(target, inst) {\n\t\tvar divSpan = $(target);\n\t\tif (divSpan.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass(this.markerClassName).append(inst.dpDiv);\n\t\t$.data(target, PROP_NAME, inst);\n\t\tthis._setDate(inst, this._getDefaultDate(inst), true);\n\t\tthis._updateDatepicker(inst);\n\t\tthis._updateAlternate(inst);\n\t\t\/\/If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t\t\/\/ Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t\/\/ http:\/\/bugs.jqueryui.com\/ticket\/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t\/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x\/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t *\/\n\t_dialogDatepicker: function(input, date, onSelect, settings, pos) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; \/\/ internal instance\n\n\t\tif (!inst) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $(\"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'\/>\");\n\t\t\tthis._dialogInput.keydown(this._doKeyDown);\n\t\t\t$(\"body\").append(this._dialogInput);\n\t\t\tinst = this._dialogInst = this._newInst(this._dialogInput, false);\n\t\t\tinst.settings = {};\n\t\t\t$.data(this._dialogInput[0], PROP_NAME, inst);\n\t\t}\n\t\textendRemove(inst.settings, settings || {});\n\t\tdate = (date && date.constructor === Date ? this._formatDate(inst, date) : date);\n\t\tthis._dialogInput.val(date);\n\n\t\tthis._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);\n\t\tif (!this._pos) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = \/\/ should use actual width\/height below\n\t\t\t\t[(browserWidth \/ 2) - 100 + scrollX, (browserHeight \/ 2) - 150 + scrollY];\n\t\t}\n\n\t\t\/\/ move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css(\"left\", (this._pos[0] + 20) + \"px\").css(\"top\", this._pos[1] + \"px\");\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass(this._dialogClass);\n\t\tthis._showDatepicker(this._dialogInput[0]);\n\t\tif ($.blockUI) {\n\t\t\t$.blockUI(this.dpDiv);\n\t\t}\n\t\t$.data(this._dialogInput[0], PROP_NAME, inst);\n\t\treturn this;\n\t},\n\n\t\/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t *\/\n\t_destroyDatepicker: function(target) {\n\t\tvar nodeName,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, PROP_NAME);\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData(target, PROP_NAME);\n\t\tif (nodeName === \"input\") {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass(this.markerClassName).\n\t\t\t\tunbind(\"focus\", this._showDatepicker).\n\t\t\t\tunbind(\"keydown\", this._doKeyDown).\n\t\t\t\tunbind(\"keypress\", this._doKeyPress).\n\t\t\t\tunbind(\"keyup\", this._doKeyUp);\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\t$target.removeClass(this.markerClassName).empty();\n\t\t}\n\t},\n\n\t\/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t *\/\n\t_enableDatepicker: function(target) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, PROP_NAME);\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif (nodeName === \"input\") {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter(\"button\").\n\t\t\t\teach(function() { this.disabled = false; }).end().\n\t\t\t\tfilter(\"img\").css({opacity: \"1.0\", cursor: \"\"});\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\tinline.children().removeClass(\"ui-state-disabled\");\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\n\t\t\t\tprop(\"disabled\", false);\n\t\t}\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\n\t\t\tfunction(value) { return (value === target ? null : value); }); \/\/ delete entry\n\t},\n\n\t\/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t *\/\n\t_disableDatepicker: function(target) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $(target),\n\t\t\tinst = $.data(target, PROP_NAME);\n\n\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif (nodeName === \"input\") {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter(\"button\").\n\t\t\t\teach(function() { this.disabled = true; }).end().\n\t\t\t\tfilter(\"img\").css({opacity: \"0.5\", cursor: \"default\"});\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\tinline.children().addClass(\"ui-state-disabled\");\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\n\t\t\t\tprop(\"disabled\", true);\n\t\t}\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\n\t\t\tfunction(value) { return (value === target ? null : value); }); \/\/ delete entry\n\t\tthis._disabledInputs[this._disabledInputs.length] = target;\n\t},\n\n\t\/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t *\/\n\t_isDisabledDatepicker: function(target) {\n\t\tif (!target) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (var i = 0; i < this._disabledInputs.length; i++) {\n\t\t\tif (this._disabledInputs[i] === target) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t\/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t *\/\n\t_getInst: function(target) {\n\t\ttry {\n\t\t\treturn $.data(target, PROP_NAME);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t\/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t *\/\n\t_optionDatepicker: function(target, name, value) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst(target);\n\n\t\tif (arguments.length === 2 && typeof name === \"string\") {\n\t\t\treturn (name === \"defaults\" ? $.extend({}, $.datepicker._defaults) :\n\t\t\t\t(inst ? (name === \"all\" ? $.extend({}, inst.settings) :\n\t\t\t\tthis._get(inst, name)) : null));\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif (typeof name === \"string\") {\n\t\t\tsettings = {};\n\t\t\tsettings[name] = value;\n\t\t}\n\n\t\tif (inst) {\n\t\t\tif (this._curInst === inst) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker(target, true);\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\");\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\");\n\t\t\textendRemove(inst.settings, settings);\n\t\t\t\/\/ reformat the old minDate\/maxDate values if dateFormat changes and a new minDate\/maxDate isn't provided\n\t\t\tif (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {\n\t\t\t\tinst.settings.minDate = this._formatDate(inst, minDate);\n\t\t\t}\n\t\t\tif (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {\n\t\t\t\tinst.settings.maxDate = this._formatDate(inst, maxDate);\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker(target);\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker(target);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments($(target), inst);\n\t\t\tthis._autoSize(inst);\n\t\t\tthis._setDate(inst, date);\n\t\t\tthis._updateAlternate(inst);\n\t\t\tthis._updateDatepicker(inst);\n\t\t}\n\t},\n\n\t\/\/ change method deprecated\n\t_changeDatepicker: function(target, name, value) {\n\t\tthis._optionDatepicker(target, name, value);\n\t},\n\n\t\/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t *\/\n\t_refreshDatepicker: function(target) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst) {\n\t\t\tthis._updateDatepicker(inst);\n\t\t}\n\t},\n\n\t\/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t *\/\n\t_setDateDatepicker: function(target, date) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst) {\n\t\t\tthis._setDate(inst, date);\n\t\t\tthis._updateDatepicker(inst);\n\t\t\tthis._updateAlternate(inst);\n\t\t}\n\t},\n\n\t\/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t *\/\n\t_getDateDatepicker: function(target, noDefault) {\n\t\tvar inst = this._getInst(target);\n\t\tif (inst && !inst.inline) {\n\t\t\tthis._setDateFromField(inst, noDefault);\n\t\t}\n\t\treturn (inst ? this._getDate(inst) : null);\n\t},\n\n\t\/* Handle keystrokes. *\/\n\t_doKeyDown: function(event) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst(event.target),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is(\".ui-datepicker-rtl\");\n\n\t\tinst._keyEvent = true;\n\t\tif ($.datepicker._datepickerShowing) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; \/\/ hide on tab out\n\t\t\t\tcase 13: sel = $(\"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv);\n\t\t\t\t\t\tif (sel[0]) {\n\t\t\t\t\t\t\t$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get(inst, \"onSelect\");\n\t\t\t\t\t\tif (onSelect) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate(inst);\n\n\t\t\t\t\t\t\t\/\/ trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; \/\/ don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; \/\/ hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\tbreak; \/\/ previous month\/year on page up\/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\tbreak; \/\/ next month\/year on page down\/+ ctrl\n\t\t\t\tcase 35: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._clearDate(event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; \/\/ clear on ctrl or command +end\n\t\t\t\tcase 36: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday(event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; \/\/ current on ctrl or command +home\n\t\t\t\tcase 37: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t\/\/ -1 day on ctrl or command +left\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\/\/ next month\/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, -7, \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; \/\/ -1 week on ctrl or command +up\n\t\t\t\tcase 39: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t\/\/ +1 day on ctrl or command +right\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\/\/ next month\/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, +7, \"D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; \/\/ +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if (event.keyCode === 36 && event.ctrlKey) { \/\/ display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker(this);\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif (handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t\/* Filter entered characters - based on date format. *\/\n\t_doKeyPress: function(event) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst(event.target);\n\n\t\tif ($.datepicker._get(inst, \"constrainInput\")) {\n\t\t\tchars = $.datepicker._possibleChars($.datepicker._get(inst, \"dateFormat\"));\n\t\t\tchr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);\n\t\t\treturn event.ctrlKey || event.metaKey || (chr < \" \" || !chars || chars.indexOf(chr) > -1);\n\t\t}\n\t},\n\n\t\/* Synchronise manual entry and field\/alternate field. *\/\n\t_doKeyUp: function(event) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst(event.target);\n\n\t\tif (inst.input.val() !== inst.lastVal) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\n\t\t\t\t\t(inst.input ? inst.input.val() : null),\n\t\t\t\t\t$.datepicker._getFormatConfig(inst));\n\n\t\t\t\tif (date) { \/\/ only if valid\n\t\t\t\t\t$.datepicker._setDateFromField(inst);\n\t\t\t\t\t$.datepicker._updateAlternate(inst);\n\t\t\t\t\t$.datepicker._updateDatepicker(inst);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t\/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t *\/\n\t_showDatepicker: function(input) {\n\t\tinput = input.target || input;\n\t\tif (input.nodeName.toLowerCase() !== \"input\") { \/\/ find from button\/image trigger\n\t\t\tinput = $(\"input\", input.parentNode)[0];\n\t\t}\n\n\t\tif ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { \/\/ already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst(input);\n\t\tif ($.datepicker._curInst && $.datepicker._curInst !== inst) {\n\t\t\t$.datepicker._curInst.dpDiv.stop(true, true);\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get(inst, \"beforeShow\");\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};\n\t\tif(beforeShowSettings === false){\n\t\t\treturn;\n\t\t}\n\t\textendRemove(inst.settings, beforeShowSettings);\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField(inst);\n\n\t\tif ($.datepicker._inDialog) { \/\/ hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif (!$.datepicker._pos) { \/\/ position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos(input);\n\t\t\t$.datepicker._pos[1] += input.offsetHeight; \/\/ add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$(input).parents().each(function() {\n\t\t\tisFixed |= $(this).css(\"position\") === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t});\n\n\t\toffset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};\n\t\t$.datepicker._pos = null;\n\t\t\/\/to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\t\t\/\/ determine sizing offscreen\n\t\tinst.dpDiv.css({position: \"absolute\", display: \"block\", top: \"-1000px\"});\n\t\t$.datepicker._updateDatepicker(inst);\n\t\t\/\/ fix width for dynamic number of date pickers\n\t\t\/\/ and adjust position before showing\n\t\toffset = $.datepicker._checkOffset(inst, offset, isFixed);\n\t\tinst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : (isFixed ? \"fixed\" : \"absolute\")), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\"});\n\n\t\tif (!inst.inline) {\n\t\t\tshowAnim = $.datepicker._get(inst, \"showAnim\");\n\t\t\tduration = $.datepicker._get(inst, \"duration\");\n\t\t\tinst.dpDiv.zIndex($(input).zIndex()+1);\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show(showAnim, $.datepicker._get(inst, \"showOptions\"), duration);\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[showAnim || \"show\"](showAnim ? duration : null);\n\t\t\t}\n\n\t\t\tif (inst.input.is(\":visible\") && !inst.input.is(\":disabled\")) {\n\t\t\t\tinst.input.focus();\n\t\t\t}\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t\/* Generate the date picker content. *\/\n\t_updateDatepicker: function(inst) {\n\t\tthis.maxRows = 4; \/\/Reset the max number of rows being displayed (see #7043)\n\t\tinstActive = inst; \/\/ for delegate hover events\n\t\tinst.dpDiv.empty().append(this._generateHTML(inst));\n\t\tthis._attachHandlers(inst);\n\t\tinst.dpDiv.find(\".\" + this._dayOverClass + \" a\").mouseover();\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\n\t\t\tcols = numMonths[1],\n\t\t\twidth = 17;\n\n\t\tinst.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\");\n\t\tif (cols > 1) {\n\t\t\tinst.dpDiv.addClass(\"ui-datepicker-multi-\" + cols).css(\"width\", (width * cols) + \"em\");\n\t\t}\n\t\tinst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? \"add\" : \"remove\") +\n\t\t\t\"Class\"](\"ui-datepicker-multi\");\n\t\tinst.dpDiv[(this._get(inst, \"isRTL\") ? \"add\" : \"remove\") +\n\t\t\t\"Class\"](\"ui-datepicker-rtl\");\n\n\t\t\/\/ #6694 - don't focus the input if it's already focused\n\t\t\/\/ this breaks the change event in IE\n\t\tif (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&\n\t\t\tinst.input.is(\":visible\") && !inst.input.is(\":disabled\") && inst.input[0] !== document.activeElement) {\n\t\t\tinst.input.focus();\n\t\t}\n\n\t\t\/\/ deffered render of the years select (to avoid flashes on Firefox)\n\t\tif( inst.yearshtml ){\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout(function(){\n\t\t\t\t\/\/assure that inst.yearshtml didn't change.\n\t\t\t\tif( origyearshtml === inst.yearshtml && inst.yearshtml ){\n\t\t\t\t\tinst.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(inst.yearshtml);\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0);\n\t\t}\n\t},\n\n\t\/* Retrieve the size of left and top borders for an element.\n\t * @param  elem  (jQuery object) the element of interest\n\t * @return  (number[2]) the left and top borders\n\t *\/\n\t_getBorders: function(elem) {\n\t\tvar convert = function(value) {\n\t\t\treturn {thin: 1, medium: 2, thick: 3}[value] || value;\n\t\t};\n\t\treturn [parseFloat(convert(elem.css(\"border-left-width\"))),\n\t\t\tparseFloat(convert(elem.css(\"border-top-width\")))];\n\t},\n\n\t\/* Check positioning to remain on screen. *\/\n\t_checkOffset: function(inst, offset, isFixed) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),\n\t\t\tviewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());\n\n\t\toffset.left -= (this._get(inst, \"isRTL\") ? (dpWidth - inputWidth) : 0);\n\t\toffset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;\n\t\toffset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;\n\n\t\t\/\/ now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?\n\t\t\tMath.abs(offset.left + dpWidth - viewWidth) : 0);\n\t\toffset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?\n\t\t\tMath.abs(dpHeight + inputHeight) : 0);\n\n\t\treturn offset;\n\t},\n\n\t\/* Find an object's position on the screen. *\/\n\t_findPos: function(obj) {\n\t\tvar position,\n\t\t\tinst = this._getInst(obj),\n\t\t\tisRTL = this._get(inst, \"isRTL\");\n\n\t\twhile (obj && (obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {\n\t\t\tobj = obj[isRTL ? \"previousSibling\" : \"nextSibling\"];\n\t\t}\n\n\t\tposition = $(obj).offset();\n\t\treturn [position.left, position.top];\n\t},\n\n\t\/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t *\/\n\t_hideDatepicker: function(input) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif (!inst || (input && inst !== $.data(input, PROP_NAME))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._datepickerShowing) {\n\t\t\tshowAnim = this._get(inst, \"showAnim\");\n\t\t\tduration = this._get(inst, \"duration\");\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog(inst);\n\t\t\t};\n\n\t\t\t\/\/ DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide(showAnim, $.datepicker._get(inst, \"showOptions\"), duration, postProcess);\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[(showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t(showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\"))]((showAnim ? duration : null), postProcess);\n\t\t\t}\n\n\t\t\tif (!showAnim) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get(inst, \"onClose\");\n\t\t\tif (onClose) {\n\t\t\t\tonClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : \"\"), inst]);\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif (this._inDialog) {\n\t\t\t\tthis._dialogInput.css({ position: \"absolute\", left: \"0\", top: \"-100px\" });\n\t\t\t\tif ($.blockUI) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$(\"body\").append(this.dpDiv);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t\/* Tidy up after a dialog display. *\/\n\t_tidyDialog: function(inst) {\n\t\tinst.dpDiv.removeClass(this._dialogClass).unbind(\".ui-datepicker-calendar\");\n\t},\n\n\t\/* Close date picker if clicked elsewhere. *\/\n\t_checkExternalClick: function(event) {\n\t\tif (!$.datepicker._curInst) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $(event.target),\n\t\t\tinst = $.datepicker._getInst($target[0]);\n\n\t\tif ( ( ( $target[0].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents(\"#\" + $.datepicker._mainDivId).length === 0 &&\n\t\t\t\t!$target.hasClass($.datepicker.markerClassName) &&\n\t\t\t\t!$target.closest(\".\" + $.datepicker._triggerClass).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||\n\t\t\t( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t\/* Adjust one of the date sub-fields. *\/\n\t_adjustDate: function(id, offset, period) {\n\t\tvar target = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tif (this._isDisabledDatepicker(target[0])) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate(inst, offset +\n\t\t\t(period === \"M\" ? this._get(inst, \"showCurrentAtPos\") : 0), \/\/ undo positioning\n\t\t\tperiod);\n\t\tthis._updateDatepicker(inst);\n\t},\n\n\t\/* Action for current link. *\/\n\t_gotoToday: function(id) {\n\t\tvar date,\n\t\t\ttarget = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tif (this._get(inst, \"gotoCurrent\") && inst.currentDay) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange(inst);\n\t\tthis._adjustDate(target);\n\t},\n\n\t\/* Action for selecting a new month\/year. *\/\n\t_selectMonthYear: function(id, select, period) {\n\t\tvar target = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tinst[\"selected\" + (period === \"M\" ? \"Month\" : \"Year\")] =\n\t\tinst[\"draw\" + (period === \"M\" ? \"Month\" : \"Year\")] =\n\t\t\tparseInt(select.options[select.selectedIndex].value,10);\n\n\t\tthis._notifyChange(inst);\n\t\tthis._adjustDate(target);\n\t},\n\n\t\/* Action for selecting a day. *\/\n\t_selectDay: function(id, month, year, td) {\n\t\tvar inst,\n\t\t\ttarget = $(id);\n\n\t\tif ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst(target[0]);\n\t\tinst.selectedDay = inst.currentDay = $(\"a\", td).html();\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate(id, this._formatDate(inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear));\n\t},\n\n\t\/* Erase the input field and hide the date picker. *\/\n\t_clearDate: function(id) {\n\t\tvar target = $(id);\n\t\tthis._selectDate(target, \"\");\n\t},\n\n\t\/* Update the input field with the selected date. *\/\n\t_selectDate: function(id, dateStr) {\n\t\tvar onSelect,\n\t\t\ttarget = $(id),\n\t\t\tinst = this._getInst(target[0]);\n\n\t\tdateStr = (dateStr != null ? dateStr : this._formatDate(inst));\n\t\tif (inst.input) {\n\t\t\tinst.input.val(dateStr);\n\t\t}\n\t\tthis._updateAlternate(inst);\n\n\t\tonSelect = this._get(inst, \"onSelect\");\n\t\tif (onSelect) {\n\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  \/\/ trigger custom callback\n\t\t} else if (inst.input) {\n\t\t\tinst.input.trigger(\"change\"); \/\/ fire the change event\n\t\t}\n\n\t\tif (inst.inline){\n\t\t\tthis._updateDatepicker(inst);\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[0];\n\t\t\tif (typeof(inst.input[0]) !== \"object\") {\n\t\t\t\tinst.input.focus(); \/\/ restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t\/* Update any alternate field to synchronise with the main field. *\/\n\t_updateAlternate: function(inst) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get(inst, \"altField\");\n\n\t\tif (altField) { \/\/ update alternate field too\n\t\t\taltFormat = this._get(inst, \"altFormat\") || this._get(inst, \"dateFormat\");\n\t\t\tdate = this._getDate(inst);\n\t\t\tdateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));\n\t\t\t$(altField).each(function() { $(this).val(dateStr); });\n\t\t}\n\t},\n\n\t\/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t *\/\n\tnoWeekends: function(date) {\n\t\tvar day = date.getDay();\n\t\treturn [(day > 0 && day < 6), \"\"];\n\t},\n\n\t\/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t *\/\n\tiso8601Week: function(date) {\n\t\tvar time,\n\t\t\tcheckDate = new Date(date.getTime());\n\n\t\t\/\/ Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth(0); \/\/ Compare with Jan 1\n\t\tcheckDate.setDate(1);\n\t\treturn Math.floor(Math.round((time - checkDate) \/ 86400000) \/ 7) + 1;\n\t},\n\n\t\/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t *\/\n\tparseDate: function (format, value, settings) {\n\t\tif (format == null || value == null) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = (typeof value === \"object\" ? value.toString() : value + \"\");\n\t\tif (value === \"\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = (typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\t\t\t\/\/ Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\t\t\t\/\/ Extract a number from the string value\n\t\t\tgetNumber = function(match) {\n\t\t\t\tvar isDoubled = lookAhead(match),\n\t\t\t\t\tsize = (match === \"@\" ? 14 : (match === \"!\" ? 20 :\n\t\t\t\t\t(match === \"y\" && isDoubled ? 4 : (match === \"o\" ? 3 : 2)))),\n\t\t\t\t\tdigits = new RegExp(\"^\\\\d{1,\" + size + \"}\"),\n\t\t\t\t\tnum = value.substring(iValue).match(digits);\n\t\t\t\tif (!num) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[0].length;\n\t\t\t\treturn parseInt(num[0], 10);\n\t\t\t},\n\t\t\t\/\/ Extract a name from the string value and convert to an index\n\t\t\tgetName = function(match, shortNames, longNames) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {\n\t\t\t\t\t\treturn [ [k, v] ];\n\t\t\t\t\t}).sort(function (a, b) {\n\t\t\t\t\t\treturn -(a[1].length - b[1].length);\n\t\t\t\t\t});\n\n\t\t\t\t$.each(names, function (i, pair) {\n\t\t\t\t\tvar name = pair[1];\n\t\t\t\t\tif (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {\n\t\t\t\t\t\tindex = pair[0];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\t\t\t\/\/ Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif (value.charAt(iValue) !== format.charAt(iFormat)) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\tif (literal) {\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber(\"d\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName(\"D\", dayNamesShort, dayNames);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber(\"o\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber(\"m\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName(\"M\", monthNamesShort, monthNames);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber(\"y\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date(getNumber(\"@\"));\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date((getNumber(\"!\") - this._ticksTo1970) \/ 10000);\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif (lookAhead(\"'\")){\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (iValue < value.length){\n\t\t\textra = value.substr(iValue);\n\t\t\tif (!\/^\\s+\/.test(extra)) {\n\t\t\t\tthrow \"Extra\/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif (year === -1) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if (year < 100) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t(year <= shortYearCutoff ? 0 : -100);\n\t\t}\n\n\t\tif (doy > -1) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth(year, month - 1);\n\t\t\t\tif (day <= dim) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while (true);\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust(new Date(year, month - 1, day));\n\t\tif (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {\n\t\t\tthrow \"Invalid date\"; \/\/ E.g. 31\/02\/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t\/* Standard date formats. *\/\n\tATOM: \"yy-mm-dd\", \/\/ RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", \/\/ RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", \/\/ ISO 8601\n\n\t_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 \/ 4) - Math.floor(1970 \/ 100) +\n\t\tMath.floor(1970 \/ 400)) * 24 * 60 * 60 * 10000000),\n\n\t\/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01\/01\/1970)\n\t * ! - Windows ticks (100ns since 01\/01\/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t *\/\n\tformatDate: function (format, date, settings) {\n\t\tif (!date) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\t\/\/ Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\t\t\t\/\/ Format a number, with leading zero if necessary\n\t\t\tformatNumber = function(match, value, len) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif (lookAhead(match)) {\n\t\t\t\t\twhile (num.length < len) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\t\t\t\/\/ Format a name, short or long as requested\n\t\t\tformatName = function(match, value, shortNames, longNames) {\n\t\t\t\treturn (lookAhead(match) ? longNames[value] : shortNames[value]);\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif (date) {\n\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\t\tif (literal) {\n\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber(\"d\", date.getDate(), 2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber(\"o\",\n\t\t\t\t\t\t\t\tMath.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) \/ 86400000), 3);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber(\"m\", date.getMonth() + 1, 2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += (lookAhead(\"y\") ? date.getFullYear() :\n\t\t\t\t\t\t\t\t(date.getYear() % 100 < 10 ? \"0\" : \"\") + date.getYear() % 100);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t\/* Extract all possible characters from the date format. *\/\n\t_possibleChars: function (format) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\t\t\t\/\/ Check whether a format character is doubled\n\t\t\tlookAhead = function(match) {\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\n\t\t\t\tif (matches) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\tif (literal) {\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; \/\/ Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t\/* Get a setting value, defaulting if necessary. *\/\n\t_get: function(inst, name) {\n\t\treturn inst.settings[name] !== undefined ?\n\t\t\tinst.settings[name] : this._defaults[name];\n\t},\n\n\t\/* Parse existing date and initialise date picker. *\/\n\t_setDateFromField: function(inst, noDefault) {\n\t\tif (inst.input.val() === inst.lastVal) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get(inst, \"dateFormat\"),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate(inst),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig(inst);\n\n\t\ttry {\n\t\t\tdate = this.parseDate(dateFormat, dates, settings) || defaultDate;\n\t\t} catch (event) {\n\t\t\tdates = (noDefault ? \"\" : dates);\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = (dates ? date.getDate() : 0);\n\t\tinst.currentMonth = (dates ? date.getMonth() : 0);\n\t\tinst.currentYear = (dates ? date.getFullYear() : 0);\n\t\tthis._adjustInstDate(inst);\n\t},\n\n\t\/* Retrieve the default date shown on opening. *\/\n\t_getDefaultDate: function(inst) {\n\t\treturn this._restrictMinMax(inst,\n\t\t\tthis._determineDate(inst, this._get(inst, \"defaultDate\"), new Date()));\n\t},\n\n\t\/* A date may be specified as an exact value or a relative one. *\/\n\t_determineDate: function(inst, date, defaultDate) {\n\t\tvar offsetNumeric = function(offset) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate(date.getDate() + offset);\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function(offset) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig(inst));\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\t\/\/ Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = (offset.toLowerCase().match(\/^c\/) ?\n\t\t\t\t\t$.datepicker._getDate(inst) : null) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = \/([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?\/g,\n\t\t\t\t\tmatches = pattern.exec(offset);\n\n\t\t\t\twhile (matches) {\n\t\t\t\t\tswitch (matches[2] || \"d\") {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt(matches[1],10); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt(matches[1],10) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt(matches[1],10);\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt(matches[1],10);\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec(offset);\n\t\t\t\t}\n\t\t\t\treturn new Date(year, month, day);\n\t\t\t},\n\t\t\tnewDate = (date == null || date === \"\" ? defaultDate : (typeof date === \"string\" ? offsetString(date) :\n\t\t\t\t(typeof date === \"number\" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));\n\n\t\tnewDate = (newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate);\n\t\tif (newDate) {\n\t\t\tnewDate.setHours(0);\n\t\t\tnewDate.setMinutes(0);\n\t\t\tnewDate.setSeconds(0);\n\t\t\tnewDate.setMilliseconds(0);\n\t\t}\n\t\treturn this._daylightSavingAdjust(newDate);\n\t},\n\n\t\/* Handle switch to\/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t *\/\n\t_daylightSavingAdjust: function(date) {\n\t\tif (!date) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\n\t\treturn date;\n\t},\n\n\t\/* Set the date(s) directly. *\/\n\t_setDate: function(inst, date, noChange) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {\n\t\t\tthis._notifyChange(inst);\n\t\t}\n\t\tthis._adjustInstDate(inst);\n\t\tif (inst.input) {\n\t\t\tinst.input.val(clear ? \"\" : this._formatDate(inst));\n\t\t}\n\t},\n\n\t\/* Retrieve the date(s) directly. *\/\n\t_getDate: function(inst) {\n\t\tvar startDate = (!inst.currentYear || (inst.input && inst.input.val() === \"\") ? null :\n\t\t\tthis._daylightSavingAdjust(new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay)));\n\t\t\treturn startDate;\n\t},\n\n\t\/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t *\/\n\t_attachHandlers: function(inst) {\n\t\tvar stepMonths = this._get(inst, \"stepMonths\"),\n\t\t\tid = \"#\" + inst.id.replace( \/\\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find(\"[data-handler]\").map(function () {\n\t\t\tvar handler = {\n\t\t\t\tprev: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._adjustDate(id, -stepMonths, \"M\");\n\t\t\t\t},\n\t\t\t\tnext: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._adjustDate(id, +stepMonths, \"M\");\n\t\t\t\t},\n\t\t\t\thide: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._gotoToday(id);\n\t\t\t\t},\n\t\t\t\tselectDay: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._selectDay(id, +this.getAttribute(\"data-month\"), +this.getAttribute(\"data-year\"), this);\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._selectMonthYear(id, this, \"M\");\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function () {\n\t\t\t\t\twindow[\"DP_jQuery_\" + dpuuid].datepicker._selectMonthYear(id, this, \"Y\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$(this).bind(this.getAttribute(\"data-event\"), handler[this.getAttribute(\"data-handler\")]);\n\t\t});\n\t},\n\n\t\/* Generate the HTML for the current state of the date picker. *\/\n\t_generateHTML: function(inst) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), \/\/ clear time\n\t\t\tisRTL = this._get(inst, \"isRTL\"),\n\t\t\tshowButtonPanel = this._get(inst, \"showButtonPanel\"),\n\t\t\thideIfNoPrevNext = this._get(inst, \"hideIfNoPrevNext\"),\n\t\t\tnavigationAsDateFormat = this._get(inst, \"navigationAsDateFormat\"),\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\n\t\t\tshowCurrentAtPos = this._get(inst, \"showCurrentAtPos\"),\n\t\t\tstepMonths = this._get(inst, \"stepMonths\"),\n\t\t\tisMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),\n\t\t\tcurrentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :\n\t\t\t\tnew Date(inst.currentYear, inst.currentMonth, inst.currentDay))),\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif (drawMonth < 0) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif (maxDate) {\n\t\t\tmaxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));\n\t\t\tmaxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);\n\t\t\twhile (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif (drawMonth < 0) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get(inst, \"prevText\");\n\t\tprevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),\n\t\t\tthis._getFormatConfig(inst)));\n\n\t\tprev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?\n\t\t\t\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'\" +\n\t\t\t\" title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"<\/span><\/a>\" :\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\"+ prevText +\"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"<\/span><\/a>\"));\n\n\t\tnextText = this._get(inst, \"nextText\");\n\t\tnextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),\n\t\t\tthis._getFormatConfig(inst)));\n\n\t\tnext = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?\n\t\t\t\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'\" +\n\t\t\t\" title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"<\/span><\/a>\" :\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\"+ nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"<\/span><\/a>\"));\n\n\t\tcurrentText = this._get(inst, \"currentText\");\n\t\tgotoDate = (this._get(inst, \"gotoCurrent\") && inst.currentDay ? currentDate : today);\n\t\tcurrentText = (!navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));\n\n\t\tcontrols = (!inst.inline ? \"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\" +\n\t\t\tthis._get(inst, \"closeText\") + \"<\/button>\" : \"\");\n\n\t\tbuttonPanel = (showButtonPanel) ? \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" + (isRTL ? controls : \"\") +\n\t\t\t(this._isInRange(inst, gotoDate) ? \"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'\" +\n\t\t\t\">\" + currentText + \"<\/button>\" : \"\") + (isRTL ? \"\" : controls) + \"<\/div>\" : \"\";\n\n\t\tfirstDay = parseInt(this._get(inst, \"firstDay\"),10);\n\t\tfirstDay = (isNaN(firstDay) ? 0 : firstDay);\n\n\t\tshowWeek = this._get(inst, \"showWeek\");\n\t\tdayNames = this._get(inst, \"dayNames\");\n\t\tdayNamesMin = this._get(inst, \"dayNamesMin\");\n\t\tmonthNames = this._get(inst, \"monthNames\");\n\t\tmonthNamesShort = this._get(inst, \"monthNamesShort\");\n\t\tbeforeShowDay = this._get(inst, \"beforeShowDay\");\n\t\tshowOtherMonths = this._get(inst, \"showOtherMonths\");\n\t\tselectOtherMonths = this._get(inst, \"selectOtherMonths\");\n\t\tdefaultDate = this._getDefaultDate(inst);\n\t\thtml = \"\";\n\t\tdow;\n\t\tfor (row = 0; row < numMonths[0]; row++) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor (col = 0; col < numMonths[1]; col++) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif (isMultiMonth) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif (numMonths[1] > 1) {\n\t\t\t\t\t\tswitch (col) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"right\" : \"left\"); break;\n\t\t\t\t\t\t\tcase numMonths[1]-1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"left\" : \"right\"); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t(\/all|left\/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : \"\") +\n\t\t\t\t\t(\/all|right\/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : \"\") +\n\t\t\t\t\tthis._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort) + \/\/ draw month headers\n\t\t\t\t\t\"<\/div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = (showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get(inst, \"weekHeader\") + \"<\/th>\" : \"\");\n\t\t\t\tfor (dow = 0; dow < 7; dow++) { \/\/ days of the week\n\t\t\t\t\tday = (dow + firstDay) % 7;\n\t\t\t\t\tthead += \"<th\" + ((dow + firstDay + 6) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\") + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[day] + \"'>\" + dayNamesMin[day] + \"<\/span><\/th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"<\/tr><\/thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth(drawYear, drawMonth);\n\t\t\t\tif (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {\n\t\t\t\t\tinst.selectedDay = Math.min(inst.selectedDay, daysInMonth);\n\t\t\t\t}\n\t\t\t\tleadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;\n\t\t\t\tcurRows = Math.ceil((leadDays + daysInMonth) \/ 7); \/\/ calculate the number of rows to generate\n\t\t\t\tnumRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); \/\/If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));\n\t\t\t\tfor (dRow = 0; dRow < numRows; dRow++) { \/\/ create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = (!showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get(inst, \"calculateWeek\")(printDate) + \"<\/td>\");\n\t\t\t\t\tfor (dow = 0; dow < 7; dow++) { \/\/ create date picker days\n\t\t\t\t\t\tdaySettings = (beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, \"\"]);\n\t\t\t\t\t\totherMonth = (printDate.getMonth() !== drawMonth);\n\t\t\t\t\t\tunselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||\n\t\t\t\t\t\t\t(minDate && printDate < minDate) || (maxDate && printDate > maxDate);\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t((dow + firstDay + 6) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\") + \/\/ highlight weekends\n\t\t\t\t\t\t\t(otherMonth ? \" ui-datepicker-other-month\" : \"\") + \/\/ highlight days from other months\n\t\t\t\t\t\t\t((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || \/\/ user pressed key\n\t\t\t\t\t\t\t(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?\n\t\t\t\t\t\t\t\/\/ or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\") + \/\/ highlight selected day\n\t\t\t\t\t\t\t(unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\": \"\") +  \/\/ highlight unselectable days\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[1] + \/\/ highlight custom dates\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\") + \/\/ highlight selected day\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\")) + \"'\" + \/\/ highlight today (if different)\n\t\t\t\t\t\t\t((!otherMonth || showOtherMonths) && daySettings[2] ? \" title='\" + daySettings[2].replace(\/'\/g, \"&#39;\") + \"'\" : \"\") + \/\/ cell title\n\t\t\t\t\t\t\t(unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\") + \">\" + \/\/ actions\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"&#xa0;\" : \/\/ display for other months\n\t\t\t\t\t\t\t(unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"<\/span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\") +\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\") + \/\/ highlight selected day\n\t\t\t\t\t\t\t(otherMonth ? \" ui-priority-secondary\" : \"\") + \/\/ distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#'>\" + printDate.getDate() + \"<\/a>\")) + \"<\/td>\"; \/\/ display selectable date\n\t\t\t\t\t\tprintDate.setDate(printDate.getDate() + 1);\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust(printDate);\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"<\/tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif (drawMonth > 11) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"<\/tbody><\/table>\" + (isMultiMonth ? \"<\/div>\" +\n\t\t\t\t\t\t\t((numMonths[0] > 0 && col === numMonths[1]-1) ? \"<div class='ui-datepicker-row-break'><\/div>\" : \"\") : \"\");\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t\/* Generate the month and year header. *\/\n\t_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get(inst, \"changeMonth\"),\n\t\t\tchangeYear = this._get(inst, \"changeYear\"),\n\t\t\tshowMonthAfterYear = this._get(inst, \"showMonthAfterYear\"),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t\/\/ month selection\n\t\tif (secondary || !changeMonth) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[drawMonth] + \"<\/span>\";\n\t\t} else {\n\t\t\tinMinYear = (minDate && minDate.getFullYear() === drawYear);\n\t\t\tinMaxYear = (maxDate && maxDate.getFullYear() === drawYear);\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++) {\n\t\t\t\tif ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t(month === drawMonth ? \" selected='selected'\" : \"\") +\n\t\t\t\t\t\t\">\" + monthNamesShort[month] + \"<\/option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"<\/select>\";\n\t\t}\n\n\t\tif (!showMonthAfterYear) {\n\t\t\thtml += monthHtml + (secondary || !(changeMonth && changeYear) ? \"&#xa0;\" : \"\");\n\t\t}\n\n\t\t\/\/ year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif (secondary || !changeYear) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"<\/span>\";\n\t\t\t} else {\n\t\t\t\t\/\/ determine range of years to display\n\t\t\t\tyears = this._get(inst, \"yearRange\").split(\":\");\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function(value) {\n\t\t\t\t\tvar year = (value.match(\/c[+\\-].*\/) ? drawYear + parseInt(value.substring(1), 10) :\n\t\t\t\t\t\t(value.match(\/[+\\-].*\/) ? thisYear + parseInt(value, 10) :\n\t\t\t\t\t\tparseInt(value, 10)));\n\t\t\t\t\treturn (isNaN(year) ? thisYear : year);\n\t\t\t\t};\n\t\t\t\tyear = determineYear(years[0]);\n\t\t\t\tendYear = Math.max(year, determineYear(years[1] || \"\"));\n\t\t\t\tyear = (minDate ? Math.max(year, minDate.getFullYear()) : year);\n\t\t\t\tendYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor (; year <= endYear; year++) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t(year === drawYear ? \" selected='selected'\" : \"\") +\n\t\t\t\t\t\t\">\" + year + \"<\/option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"<\/select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get(inst, \"yearSuffix\");\n\t\tif (showMonthAfterYear) {\n\t\t\thtml += (secondary || !(changeMonth && changeYear) ? \"&#xa0;\" : \"\") + monthHtml;\n\t\t}\n\t\thtml += \"<\/div>\"; \/\/ Close datepicker_header\n\t\treturn html;\n\t},\n\n\t\/* Adjust one of the date sub-fields. *\/\n\t_adjustInstDate: function(inst, offset, period) {\n\t\tvar year = inst.drawYear + (period === \"Y\" ? offset : 0),\n\t\t\tmonth = inst.drawMonth + (period === \"M\" ? offset : 0),\n\t\t\tday = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === \"D\" ? offset : 0),\n\t\t\tdate = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif (period === \"M\" || period === \"Y\") {\n\t\t\tthis._notifyChange(inst);\n\t\t}\n\t},\n\n\t\/* Ensure a date is within any min\/max bounds. *\/\n\t_restrictMinMax: function(inst, date) {\n\t\tvar minDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tnewDate = (minDate && date < minDate ? minDate : date);\n\t\treturn (maxDate && newDate > maxDate ? maxDate : newDate);\n\t},\n\n\t\/* Notify change of month\/year. *\/\n\t_notifyChange: function(inst) {\n\t\tvar onChange = this._get(inst, \"onChangeMonthYear\");\n\t\tif (onChange) {\n\t\t\tonChange.apply((inst.input ? inst.input[0] : null),\n\t\t\t\t[inst.selectedYear, inst.selectedMonth + 1, inst]);\n\t\t}\n\t},\n\n\t\/* Determine the number of months to show. *\/\n\t_getNumberOfMonths: function(inst) {\n\t\tvar numMonths = this._get(inst, \"numberOfMonths\");\n\t\treturn (numMonths == null ? [1, 1] : (typeof numMonths === \"number\" ? [1, numMonths] : numMonths));\n\t},\n\n\t\/* Determine the current maximum date - ensure no time components are set. *\/\n\t_getMinMaxDate: function(inst, minMax) {\n\t\treturn this._determineDate(inst, this._get(inst, minMax + \"Date\"), null);\n\t},\n\n\t\/* Find the number of days in a given month. *\/\n\t_getDaysInMonth: function(year, month) {\n\t\treturn 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();\n\t},\n\n\t\/* Find the day of the week of the first of a month. *\/\n\t_getFirstDayOfMonth: function(year, month) {\n\t\treturn new Date(year, month, 1).getDay();\n\t},\n\n\t\/* Determines if we should allow a \"next\/prev\" month display change. *\/\n\t_canAdjustMonth: function(inst, offset, curYear, curMonth) {\n\t\tvar numMonths = this._getNumberOfMonths(inst),\n\t\t\tdate = this._daylightSavingAdjust(new Date(curYear,\n\t\t\tcurMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));\n\n\t\tif (offset < 0) {\n\t\t\tdate.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));\n\t\t}\n\t\treturn this._isInRange(inst, date);\n\t},\n\n\t\/* Is the given date in the accepted range? *\/\n\t_isInRange: function(inst, date) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get(inst, \"yearRange\");\n\t\t\tif (years){\n\t\t\t\tyearSplit = years.split(\":\");\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt(yearSplit[0], 10);\n\t\t\t\tmaxYear = parseInt(yearSplit[1], 10);\n\t\t\t\tif ( yearSplit[0].match(\/[+\\-].*\/) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[1].match(\/[+\\-].*\/) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ((!minDate || date.getTime() >= minDate.getTime()) &&\n\t\t\t(!maxDate || date.getTime() <= maxDate.getTime()) &&\n\t\t\t(!minYear || date.getFullYear() >= minYear) &&\n\t\t\t(!maxYear || date.getFullYear() <= maxYear));\n\t},\n\n\t\/* Provide the configuration settings for formatting\/parsing. *\/\n\t_getFormatConfig: function(inst) {\n\t\tvar shortYearCutoff = this._get(inst, \"shortYearCutoff\");\n\t\tshortYearCutoff = (typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));\n\t\treturn {shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get(inst, \"dayNamesShort\"), dayNames: this._get(inst, \"dayNames\"),\n\t\t\tmonthNamesShort: this._get(inst, \"monthNamesShort\"), monthNames: this._get(inst, \"monthNames\")};\n\t},\n\n\t\/* Format the given date for display. *\/\n\t_formatDate: function(inst, day, month, year) {\n\t\tif (!day) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = (day ? (typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust(new Date(year, month, day))) :\n\t\t\tthis._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));\n\t\treturn this.formatDate(this._get(inst, \"dateFormat\"), date, this._getFormatConfig(inst));\n\t}\n});\n\n\/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n *\/\nfunction bindHover(dpDiv) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.delegate(selector, \"mouseout\", function() {\n\t\t\t$(this).removeClass(\"ui-state-hover\");\n\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t\t$(this).removeClass(\"ui-datepicker-prev-hover\");\n\t\t\t}\n\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t\t$(this).removeClass(\"ui-datepicker-next-hover\");\n\t\t\t}\n\t\t})\n\t\t.delegate(selector, \"mouseover\", function(){\n\t\t\tif (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {\n\t\t\t\t$(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\");\n\t\t\t\t$(this).addClass(\"ui-state-hover\");\n\t\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t\t\t$(this).addClass(\"ui-datepicker-prev-hover\");\n\t\t\t\t}\n\t\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t\t\t$(this).addClass(\"ui-datepicker-next-hover\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n}\n\n\/* jQuery extend now ignores nulls! *\/\nfunction extendRemove(target, props) {\n\t$.extend(target, props);\n\tfor (var name in props) {\n\t\tif (props[name] == null) {\n\t\t\ttarget[name] = props[name];\n\t\t}\n\t}\n\treturn target;\n}\n\n\/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object *\/\n$.fn.datepicker = function(options){\n\n\t\/* Verify an empty collection wasn't passed - Fixes #6976 *\/\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t\/* Initialise the date picker. *\/\n\tif (!$.datepicker.initialized) {\n\t\t$(document).mousedown($.datepicker._checkExternalClick);\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t\/* Append datepicker main container to body if not exist. *\/\n\tif ($(\"#\"+$.datepicker._mainDivId).length === 0) {\n\t\t$(\"body\").append($.datepicker.dpDiv);\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call(arguments, 1);\n\tif (typeof options === \"string\" && (options === \"isDisabled\" || options === \"getDate\" || options === \"widget\")) {\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\n\t}\n\tif (options === \"option\" && arguments.length === 2 && typeof arguments[1] === \"string\") {\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\n\t}\n\treturn this.each(function() {\n\t\ttypeof options === \"string\" ?\n\t\t\t$.datepicker[\"_\" + options + \"Datepicker\"].\n\t\t\t\tapply($.datepicker, [this].concat(otherArgs)) :\n\t\t\t$.datepicker._attachDatepicker(this, options);\n\t});\n};\n\n$.datepicker = new Datepicker(); \/\/ singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.10.2\";\n\n\/\/ Workaround for #4055\n\/\/ Add another global to avoid noConflict issues with inline event handlers\nwindow[\"DP_jQuery_\" + dpuuid] = $;\n\n})(jQuery);\n\n(function( $, undefined ) {\n\nvar sizeRelatedOptions = {\n\t\tbuttons: true,\n\t\theight: true,\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true,\n\t\twidth: true\n\t},\n\tresizableRelatedOptions = {\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true\n\t};\n\n$.widget( \"ui.dialog\", {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoOpen: true,\n\t\tbuttons: [],\n\t\tcloseOnEscape: true,\n\t\tcloseText: \"close\",\n\t\tdialogClass: \"\",\n\t\tdraggable: true,\n\t\thide: null,\n\t\theight: \"auto\",\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 150,\n\t\tminWidth: 150,\n\t\tmodal: false,\n\t\tposition: {\n\t\t\tmy: \"center\",\n\t\t\tat: \"center\",\n\t\t\tof: window,\n\t\t\tcollision: \"fit\",\n\t\t\t\/\/ Ensure the titlebar is always visible\n\t\t\tusing: function( pos ) {\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\n\t\t\t\tif ( topOffset < 0 ) {\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tresizable: true,\n\t\tshow: null,\n\t\ttitle: null,\n\t\twidth: 300,\n\n\t\t\/\/ callbacks\n\t\tbeforeClose: null,\n\t\tclose: null,\n\t\tdrag: null,\n\t\tdragStart: null,\n\t\tdragStop: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresize: null,\n\t\tresizeStart: null,\n\t\tresizeStop: null\n\t},\n\n\t_create: function() {\n\t\tthis.originalCss = {\n\t\t\tdisplay: this.element[0].style.display,\n\t\t\twidth: this.element[0].style.width,\n\t\t\tminHeight: this.element[0].style.minHeight,\n\t\t\tmaxHeight: this.element[0].style.maxHeight,\n\t\t\theight: this.element[0].style.height\n\t\t};\n\t\tthis.originalPosition = {\n\t\t\tparent: this.element.parent(),\n\t\t\tindex: this.element.parent().children().index( this.element )\n\t\t};\n\t\tthis.originalTitle = this.element.attr(\"title\");\n\t\tthis.options.title = this.options.title || this.originalTitle;\n\n\t\tthis._createWrapper();\n\n\t\tthis.element\n\t\t\t.show()\n\t\t\t.removeAttr(\"title\")\n\t\t\t.addClass(\"ui-dialog-content ui-widget-content\")\n\t\t\t.appendTo( this.uiDialog );\n\n\t\tthis._createTitlebar();\n\t\tthis._createButtonPane();\n\n\t\tif ( this.options.draggable && $.fn.draggable ) {\n\t\t\tthis._makeDraggable();\n\t\t}\n\t\tif ( this.options.resizable && $.fn.resizable ) {\n\t\t\tthis._makeResizable();\n\t\t}\n\n\t\tthis._isOpen = false;\n\t},\n\n\t_init: function() {\n\t\tif ( this.options.autoOpen ) {\n\t\t\tthis.open();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\t\tif ( element && (element.jquery || element.nodeType) ) {\n\t\t\treturn $( element );\n\t\t}\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\n\t},\n\n\t_destroy: function() {\n\t\tvar next,\n\t\t\toriginalPosition = this.originalPosition;\n\n\t\tthis._destroyOverlay();\n\n\t\tthis.element\n\t\t\t.removeUniqueId()\n\t\t\t.removeClass(\"ui-dialog-content ui-widget-content\")\n\t\t\t.css( this.originalCss )\n\t\t\t\/\/ Without detaching first, the following becomes really slow\n\t\t\t.detach();\n\n\t\tthis.uiDialog.stop( true, true ).remove();\n\n\t\tif ( this.originalTitle ) {\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\n\t\t}\n\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\n\t\t\/\/ Don't try to place the dialog next to itself (#8613)\n\t\tif ( next.length && next[0] !== this.element[0] ) {\n\t\t\tnext.before( this.element );\n\t\t} else {\n\t\t\toriginalPosition.parent.append( this.element );\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.uiDialog;\n\t},\n\n\tdisable: $.noop,\n\tenable: $.noop,\n\n\tclose: function( event ) {\n\t\tvar that = this;\n\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = false;\n\t\tthis._destroyOverlay();\n\n\t\tif ( !this.opener.filter(\":focusable\").focus().length ) {\n\t\t\t\/\/ Hiding a focused element doesn't trigger blur in WebKit\n\t\t\t\/\/ so in case we have nothing to focus on, explicitly blur the active element\n\t\t\t\/\/ https:\/\/bugs.webkit.org\/show_bug.cgi?id=47182\n\t\t\t$( this.document[0].activeElement ).blur();\n\t\t}\n\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\n\t\t\tthat._trigger( \"close\", event );\n\t\t});\n\t},\n\n\tisOpen: function() {\n\t\treturn this._isOpen;\n\t},\n\n\tmoveToTop: function() {\n\t\tthis._moveToTop();\n\t},\n\n\t_moveToTop: function( event, silent ) {\n\t\tvar moved = !!this.uiDialog.nextAll(\":visible\").insertBefore( this.uiDialog ).length;\n\t\tif ( moved && !silent ) {\n\t\t\tthis._trigger( \"focus\", event );\n\t\t}\n\t\treturn moved;\n\t},\n\n\topen: function() {\n\t\tvar that = this;\n\t\tif ( this._isOpen ) {\n\t\t\tif ( this._moveToTop() ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = true;\n\t\tthis.opener = $( this.document[0].activeElement );\n\n\t\tthis._size();\n\t\tthis._position();\n\t\tthis._createOverlay();\n\t\tthis._moveToTop( null, true );\n\t\tthis._show( this.uiDialog, this.options.show, function() {\n\t\t\tthat._focusTabbable();\n\t\t\tthat._trigger(\"focus\");\n\t\t});\n\n\t\tthis._trigger(\"open\");\n\t},\n\n\t_focusTabbable: function() {\n\t\t\/\/ Set focus to the first match:\n\t\t\/\/ 1. First element inside the dialog matching [autofocus]\n\t\t\/\/ 2. Tabbable element inside the content element\n\t\t\/\/ 3. Tabbable element inside the buttonpane\n\t\t\/\/ 4. The close button\n\t\t\/\/ 5. The dialog itself\n\t\tvar hasFocus = this.element.find(\"[autofocus]\");\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.element.find(\":tabbable\");\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogButtonPane.find(\":tabbable\");\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter(\":tabbable\");\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialog;\n\t\t}\n\t\thasFocus.eq( 0 ).focus();\n\t},\n\n\t_keepFocus: function( event ) {\n\t\tfunction checkFocus() {\n\t\t\tvar activeElement = this.document[0].activeElement,\n\t\t\t\tisActive = this.uiDialog[0] === activeElement ||\n\t\t\t\t\t$.contains( this.uiDialog[0], activeElement );\n\t\t\tif ( !isActive ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t\tcheckFocus.call( this );\n\t\t\/\/ support: IE\n\t\t\/\/ IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n\t\t\/\/ so we check again later\n\t\tthis._delay( checkFocus );\n\t},\n\n\t_createWrapper: function() {\n\t\tthis.uiDialog = $(\"<div>\")\n\t\t\t.addClass( \"ui-dialog ui-widget ui-widget-content ui-corner-all ui-front \" +\n\t\t\t\tthis.options.dialogClass )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t\/\/ Setting tabIndex makes the div focusable\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: \"dialog\"\n\t\t\t})\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._on( this.uiDialog, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t\/\/ prevent tabbing out of dialogs\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tabbables = this.uiDialog.find(\":tabbable\"),\n\t\t\t\t\tfirst = tabbables.filter(\":first\"),\n\t\t\t\t\tlast  = tabbables.filter(\":last\");\n\n\t\t\t\tif ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {\n\t\t\t\t\tfirst.focus( 1 );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {\n\t\t\t\t\tlast.focus( 1 );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\tmousedown: function( event ) {\n\t\t\t\tif ( this._moveToTop( event ) ) {\n\t\t\t\t\tthis._focusTabbable();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t\/\/ We assume that any existing aria-describedby attribute means\n\t\t\/\/ that the dialog content is marked up properly\n\t\t\/\/ otherwise we brute force the content as the description\n\t\tif ( !this.element.find(\"[aria-describedby]\").length ) {\n\t\t\tthis.uiDialog.attr({\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr(\"id\")\n\t\t\t});\n\t\t}\n\t},\n\n\t_createTitlebar: function() {\n\t\tvar uiDialogTitle;\n\n\t\tthis.uiDialogTitlebar = $(\"<div>\")\n\t\t\t.addClass(\"ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix\")\n\t\t\t.prependTo( this.uiDialog );\n\t\tthis._on( this.uiDialogTitlebar, {\n\t\t\tmousedown: function( event ) {\n\t\t\t\t\/\/ Don't prevent click on close button (#8838)\n\t\t\t\t\/\/ Focusing a dialog that is partially scrolled out of view\n\t\t\t\t\/\/ causes the browser to scroll it into view, preventing the click event\n\t\t\t\tif ( !$( event.target ).closest(\".ui-dialog-titlebar-close\") ) {\n\t\t\t\t\t\/\/ Dialog isn't getting focus when dragging (#8063)\n\t\t\t\t\tthis.uiDialog.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.uiDialogTitlebarClose = $(\"<button><\/button>\")\n\t\t\t.button({\n\t\t\t\tlabel: this.options.closeText,\n\t\t\t\ticons: {\n\t\t\t\t\tprimary: \"ui-icon-closethick\"\n\t\t\t\t},\n\t\t\t\ttext: false\n\t\t\t})\n\t\t\t.addClass(\"ui-dialog-titlebar-close\")\n\t\t\t.appendTo( this.uiDialogTitlebar );\n\t\tthis._on( this.uiDialogTitlebarClose, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t});\n\n\t\tuiDialogTitle = $(\"<span>\")\n\t\t\t.uniqueId()\n\t\t\t.addClass(\"ui-dialog-title\")\n\t\t\t.prependTo( this.uiDialogTitlebar );\n\t\tthis._title( uiDialogTitle );\n\n\t\tthis.uiDialog.attr({\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr(\"id\")\n\t\t});\n\t},\n\n\t_title: function( title ) {\n\t\tif ( !this.options.title ) {\n\t\t\ttitle.html(\"&#160;\");\n\t\t}\n\t\ttitle.text( this.options.title );\n\t},\n\n\t_createButtonPane: function() {\n\t\tthis.uiDialogButtonPane = $(\"<div>\")\n\t\t\t.addClass(\"ui-dialog-buttonpane ui-widget-content ui-helper-clearfix\");\n\n\t\tthis.uiButtonSet = $(\"<div>\")\n\t\t\t.addClass(\"ui-dialog-buttonset\")\n\t\t\t.appendTo( this.uiDialogButtonPane );\n\n\t\tthis._createButtons();\n\t},\n\n\t_createButtons: function() {\n\t\tvar that = this,\n\t\t\tbuttons = this.options.buttons;\n\n\t\t\/\/ if we already have a button pane, remove it\n\t\tthis.uiDialogButtonPane.remove();\n\t\tthis.uiButtonSet.empty();\n\n\t\tif ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {\n\t\t\tthis.uiDialog.removeClass(\"ui-dialog-buttons\");\n\t\t\treturn;\n\t\t}\n\n\t\t$.each( buttons, function( name, props ) {\n\t\t\tvar click, buttonOptions;\n\t\t\tprops = $.isFunction( props ) ?\n\t\t\t\t{ click: props, text: name } :\n\t\t\t\tprops;\n\t\t\t\/\/ Default to a non-submitting button\n\t\t\tprops = $.extend( { type: \"button\" }, props );\n\t\t\t\/\/ Change the context for the click callback to be the main element\n\t\t\tclick = props.click;\n\t\t\tprops.click = function() {\n\t\t\t\tclick.apply( that.element[0], arguments );\n\t\t\t};\n\t\t\tbuttonOptions = {\n\t\t\t\ticons: props.icons,\n\t\t\t\ttext: props.showText\n\t\t\t};\n\t\t\tdelete props.icons;\n\t\t\tdelete props.showText;\n\t\t\t$( \"<button><\/button>\", props )\n\t\t\t\t.button( buttonOptions )\n\t\t\t\t.appendTo( that.uiButtonSet );\n\t\t});\n\t\tthis.uiDialog.addClass(\"ui-dialog-buttons\");\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\n\t},\n\n\t_makeDraggable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\tposition: ui.position,\n\t\t\t\toffset: ui.offset\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.draggable({\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\n\t\t\thandle: \".ui-dialog-titlebar\",\n\t\t\tcontainment: \"document\",\n\t\t\tstart: function( event, ui ) {\n\t\t\t\t$( this ).addClass(\"ui-dialog-dragging\");\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tdrag: function( event, ui ) {\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\toptions.position = [\n\t\t\t\t\tui.position.left - that.document.scrollLeft(),\n\t\t\t\t\tui.position.top - that.document.scrollTop()\n\t\t\t\t];\n\t\t\t\t$( this ).removeClass(\"ui-dialog-dragging\");\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t});\n\t},\n\n\t_makeResizable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\thandles = options.resizable,\n\t\t\t\/\/ .ui-resizable has position: relative defined in the stylesheet\n\t\t\t\/\/ but dialogs have to use absolute or fixed positioning\n\t\t\tposition = this.uiDialog.css(\"position\"),\n\t\t\tresizeHandles = typeof handles === \"string\" ?\n\t\t\t\thandles\t:\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\toriginalPosition: ui.originalPosition,\n\t\t\t\toriginalSize: ui.originalSize,\n\t\t\t\tposition: ui.position,\n\t\t\t\tsize: ui.size\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.resizable({\n\t\t\tcancel: \".ui-dialog-content\",\n\t\t\tcontainment: \"document\",\n\t\t\talsoResize: this.element,\n\t\t\tmaxWidth: options.maxWidth,\n\t\t\tmaxHeight: options.maxHeight,\n\t\t\tminWidth: options.minWidth,\n\t\t\tminHeight: this._minHeight(),\n\t\t\thandles: resizeHandles,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\t$( this ).addClass(\"ui-dialog-resizing\");\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tresize: function( event, ui ) {\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\toptions.height = $( this ).height();\n\t\t\t\toptions.width = $( this ).width();\n\t\t\t\t$( this ).removeClass(\"ui-dialog-resizing\");\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t})\n\t\t.css( \"position\", position );\n\t},\n\n\t_minHeight: function() {\n\t\tvar options = this.options;\n\n\t\treturn options.height === \"auto\" ?\n\t\t\toptions.minHeight :\n\t\t\tMath.min( options.minHeight, options.height );\n\t},\n\n\t_position: function() {\n\t\t\/\/ Need to show the dialog to get the actual offset in the position plugin\n\t\tvar isVisible = this.uiDialog.is(\":visible\");\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.show();\n\t\t}\n\t\tthis.uiDialog.position( this.options.position );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.hide();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tresize = false,\n\t\t\tresizableOptions = {};\n\n\t\t$.each( options, function( key, value ) {\n\t\t\tthat._setOption( key, value );\n\n\t\t\tif ( key in sizeRelatedOptions ) {\n\t\t\t\tresize = true;\n\t\t\t}\n\t\t\tif ( key in resizableRelatedOptions ) {\n\t\t\t\tresizableOptions[ key ] = value;\n\t\t\t}\n\t\t});\n\n\t\tif ( resize ) {\n\t\t\tthis._size();\n\t\t\tthis._position();\n\t\t}\n\t\tif ( this.uiDialog.is(\":data(ui-resizable)\") ) {\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\t\/*jshint maxcomplexity:15*\/\n\t\tvar isDraggable, isResizable,\n\t\t\tuiDialog = this.uiDialog;\n\n\t\tif ( key === \"dialogClass\" ) {\n\t\t\tuiDialog\n\t\t\t\t.removeClass( this.options.dialogClass )\n\t\t\t\t.addClass( value );\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"buttons\" ) {\n\t\t\tthis._createButtons();\n\t\t}\n\n\t\tif ( key === \"closeText\" ) {\n\t\t\tthis.uiDialogTitlebarClose.button({\n\t\t\t\t\/\/ Ensure that we always pass a string\n\t\t\t\tlabel: \"\" + value\n\t\t\t});\n\t\t}\n\n\t\tif ( key === \"draggable\" ) {\n\t\t\tisDraggable = uiDialog.is(\":data(ui-draggable)\");\n\t\t\tif ( isDraggable && !value ) {\n\t\t\t\tuiDialog.draggable(\"destroy\");\n\t\t\t}\n\n\t\t\tif ( !isDraggable && value ) {\n\t\t\t\tthis._makeDraggable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"position\" ) {\n\t\t\tthis._position();\n\t\t}\n\n\t\tif ( key === \"resizable\" ) {\n\t\t\t\/\/ currently resizable, becoming non-resizable\n\t\t\tisResizable = uiDialog.is(\":data(ui-resizable)\");\n\t\t\tif ( isResizable && !value ) {\n\t\t\t\tuiDialog.resizable(\"destroy\");\n\t\t\t}\n\n\t\t\t\/\/ currently resizable, changing handles\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\n\t\t\t}\n\n\t\t\t\/\/ currently non-resizable, becoming resizable\n\t\t\tif ( !isResizable && value !== false ) {\n\t\t\t\tthis._makeResizable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"title\" ) {\n\t\t\tthis._title( this.uiDialogTitlebar.find(\".ui-dialog-title\") );\n\t\t}\n\t},\n\n\t_size: function() {\n\t\t\/\/ If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n\t\t\/\/ divs will both have width and height set, so we need to reset them\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\n\t\t\toptions = this.options;\n\n\t\t\/\/ Reset content sizing\n\t\tthis.element.show().css({\n\t\t\twidth: \"auto\",\n\t\t\tminHeight: 0,\n\t\t\tmaxHeight: \"none\",\n\t\t\theight: 0\n\t\t});\n\n\t\tif ( options.minWidth > options.width ) {\n\t\t\toptions.width = options.minWidth;\n\t\t}\n\n\t\t\/\/ reset wrapper sizing\n\t\t\/\/ determine the height of all the non-content elements\n\t\tnonContentHeight = this.uiDialog.css({\n\t\t\t\theight: \"auto\",\n\t\t\t\twidth: options.width\n\t\t\t})\n\t\t\t.outerHeight();\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\n\t\t\t\"none\";\n\n\t\tif ( options.height === \"auto\" ) {\n\t\t\tthis.element.css({\n\t\t\t\tminHeight: minContentHeight,\n\t\t\t\tmaxHeight: maxContentHeight,\n\t\t\t\theight: \"auto\"\n\t\t\t});\n\t\t} else {\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\n\t\t}\n\n\t\tif (this.uiDialog.is(\":data(ui-resizable)\") ) {\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\n\t\t}\n\t},\n\n\t_blockFrames: function() {\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map(function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: iframe.outerWidth(),\n\t\t\t\t\theight: iframe.outerHeight()\n\t\t\t\t})\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.offset( iframe.offset() )[0];\n\t\t});\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_allowInteraction: function( event ) {\n\t\tif ( $( event.target ).closest(\".ui-dialog\").length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t\/\/ TODO: Remove hack when datepicker implements\n\t\t\/\/ the .ui-front logic (#8989)\n\t\treturn !!$( event.target ).closest(\".ui-datepicker\").length;\n\t},\n\n\t_createOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar that = this,\n\t\t\twidgetFullName = this.widgetFullName;\n\t\tif ( !$.ui.dialog.overlayInstances ) {\n\t\t\t\/\/ Prevent use of anchors and inputs.\n\t\t\t\/\/ We use a delay in case the overlay is created from an\n\t\t\t\/\/ event that we're going to be cancelling. (#2804)\n\t\t\tthis._delay(function() {\n\t\t\t\t\/\/ Handle .dialog().dialog(\"close\") (#4065)\n\t\t\t\tif ( $.ui.dialog.overlayInstances ) {\n\t\t\t\t\tthis.document.bind( \"focusin.dialog\", function( event ) {\n\t\t\t\t\t\tif ( !that._allowInteraction( event ) ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t$(\".ui-dialog:visible:last .ui-dialog-content\")\n\t\t\t\t\t\t\t\t.data( widgetFullName )._focusTabbable();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.overlay = $(\"<div>\")\n\t\t\t.addClass(\"ui-widget-overlay ui-front\")\n\t\t\t.appendTo( this._appendTo() );\n\t\tthis._on( this.overlay, {\n\t\t\tmousedown: \"_keepFocus\"\n\t\t});\n\t\t$.ui.dialog.overlayInstances++;\n\t},\n\n\t_destroyOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.overlay ) {\n\t\t\t$.ui.dialog.overlayInstances--;\n\n\t\t\tif ( !$.ui.dialog.overlayInstances ) {\n\t\t\t\tthis.document.unbind( \"focusin.dialog\" );\n\t\t\t}\n\t\t\tthis.overlay.remove();\n\t\t\tthis.overlay = null;\n\t\t}\n\t}\n});\n\n$.ui.dialog.overlayInstances = 0;\n\n\/\/ DEPRECATED\nif ( $.uiBackCompat !== false ) {\n\t\/\/ position option with array notation\n\t\/\/ just override with old implementation\n\t$.widget( \"ui.dialog\", $.ui.dialog, {\n\t\t_position: function() {\n\t\t\tvar position = this.options.position,\n\t\t\t\tmyAt = [],\n\t\t\t\toffset = [ 0, 0 ],\n\t\t\t\tisVisible;\n\n\t\t\tif ( position ) {\n\t\t\t\tif ( typeof position === \"string\" || (typeof position === \"object\" && \"0\" in position ) ) {\n\t\t\t\t\tmyAt = position.split ? position.split(\" \") : [ position[0], position[1] ];\n\t\t\t\t\tif ( myAt.length === 1 ) {\n\t\t\t\t\t\tmyAt[1] = myAt[0];\n\t\t\t\t\t}\n\n\t\t\t\t\t$.each( [ \"left\", \"top\" ], function( i, offsetPosition ) {\n\t\t\t\t\t\tif ( +myAt[ i ] === myAt[ i ] ) {\n\t\t\t\t\t\t\toffset[ i ] = myAt[ i ];\n\t\t\t\t\t\t\tmyAt[ i ] = offsetPosition;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tposition = {\n\t\t\t\t\t\tmy: myAt[0] + (offset[0] < 0 ? offset[0] : \"+\" + offset[0]) + \" \" +\n\t\t\t\t\t\t\tmyAt[1] + (offset[1] < 0 ? offset[1] : \"+\" + offset[1]),\n\t\t\t\t\t\tat: myAt.join(\" \")\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tposition = $.extend( {}, $.ui.dialog.prototype.options.position, position );\n\t\t\t} else {\n\t\t\t\tposition = $.ui.dialog.prototype.options.position;\n\t\t\t}\n\n\t\t\t\/\/ need to show the dialog to get the actual offset in the position plugin\n\t\t\tisVisible = this.uiDialog.is(\":visible\");\n\t\t\tif ( !isVisible ) {\n\t\t\t\tthis.uiDialog.show();\n\t\t\t}\n\t\t\tthis.uiDialog.position( position );\n\t\t\tif ( !isVisible ) {\n\t\t\t\tthis.uiDialog.hide();\n\t\t\t}\n\t\t}\n\t});\n}\n\n}( jQuery ) );\n\n(function( $, undefined ) {\n\nvar rvertical = \/up|down|vertical\/,\n\trpositivemotion = \/up|left|vertical|horizontal\/;\n\n$.effects.effect.blind = function( o, done ) {\n\t\/\/ Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tdirection = o.direction || \"up\",\n\t\tvertical = rvertical.test( direction ),\n\t\tref = vertical ? \"height\" : \"width\",\n\t\tref2 = vertical ? \"top\" : \"left\",\n\t\tmotion = rpositivemotion.test( direction ),\n\t\tanimation = {},\n\t\tshow = mode === \"show\",\n\t\twrapper, distance, margin;\n\n\t\/\/ if already wrapped, the wrapper's properties are my property. #6245\n\tif ( el.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t$.effects.save( el.parent(), props );\n\t} else {\n\t\t$.effects.save( el, props );\n\t}\n\tel.show();\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\n\tdistance = wrapper[ ref ]();\n\tmargin = parseFloat( wrapper.css( ref2 ) ) || 0;\n\n\tanimation[ ref ] = show ? distance : 0;\n\tif ( !motion ) {\n\t\tel\n\t\t\t.css( vertical ? \"bottom\" : \"right\", 0 )\n\t\t\t.css( vertical ? \"top\" : \"left\", \"auto\" )\n\t\t\t.css({ position: \"absolute\" });\n\n\t\tanimation[ ref2 ] = show ? margin : distance + margin;\n\t}\n\n\t\/\/ start at 0 if we are showing\n\tif ( show ) {\n\t\twrapper.css( ref, 0 );\n\t\tif ( ! motion ) {\n\t\t\twrapper.css( ref2, margin + distance );\n\t\t}\n\t}\n\n\t\/\/ Animate\n\twrapper.animate( animation, {\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tqueue: false,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.bounce = function( o, done ) {\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\n\t\t\/\/ defaults:\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\thide = mode === \"hide\",\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"up\",\n\t\tdistance = o.distance,\n\t\ttimes = o.times || 5,\n\n\t\t\/\/ number of internal animations\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\n\t\tspeed = o.duration \/ anims,\n\t\teasing = o.easing,\n\n\t\t\/\/ utility:\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\n\t\ti,\n\t\tupAnim,\n\t\tdownAnim,\n\n\t\t\/\/ we will need to re-assemble the queue to stack our animations in place\n\t\tqueue = el.queue(),\n\t\tqueuelen = queue.length;\n\n\t\/\/ Avoid touching opacity to prevent clearType and PNG issues in IE\n\tif ( show || hide ) {\n\t\tprops.push( \"opacity\" );\n\t}\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el ); \/\/ Create Wrapper\n\n\t\/\/ default distance for the BIGGEST bounce is the outer Distance \/ 3\n\tif ( !distance ) {\n\t\tdistance = el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() \/ 3;\n\t}\n\n\tif ( show ) {\n\t\tdownAnim = { opacity: 1 };\n\t\tdownAnim[ ref ] = 0;\n\n\t\t\/\/ if we are showing, force opacity 0 and set the initial position\n\t\t\/\/ then do the \"first\" animation\n\t\tel.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\n\t\t\t.animate( downAnim, speed, easing );\n\t}\n\n\t\/\/ start at the smallest distance if we are hiding\n\tif ( hide ) {\n\t\tdistance = distance \/ Math.pow( 2, times - 1 );\n\t}\n\n\tdownAnim = {};\n\tdownAnim[ ref ] = 0;\n\t\/\/ Bounces up\/down\/left\/right then back to 0 -- times * 2 animations happen here\n\tfor ( i = 0; i < times; i++ ) {\n\t\tupAnim = {};\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\tel.animate( upAnim, speed, easing )\n\t\t\t.animate( downAnim, speed, easing );\n\n\t\tdistance = hide ? distance * 2 : distance \/ 2;\n\t}\n\n\t\/\/ Last Bounce when Hiding\n\tif ( hide ) {\n\t\tupAnim = { opacity: 0 };\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\tel.animate( upAnim, speed, easing );\n\t}\n\n\tel.queue(function() {\n\t\tif ( hide ) {\n\t\t\tel.hide();\n\t\t}\n\t\t$.effects.restore( el, props );\n\t\t$.effects.removeWrapper( el );\n\t\tdone();\n\t});\n\n\t\/\/ inject all the animations we just queued to be first in line (after \"inprogress\")\n\tif ( queuelen > 1) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\tel.dequeue();\n\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.clip = function( o, done ) {\n\t\/\/ Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"vertical\",\n\t\tvert = direction === \"vertical\",\n\t\tsize = vert ? \"height\" : \"width\",\n\t\tposition = vert ? \"top\" : \"left\",\n\t\tanimation = {},\n\t\twrapper, animate, distance;\n\n\t\/\/ Save & Show\n\t$.effects.save( el, props );\n\tel.show();\n\n\t\/\/ Create Wrapper\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\tanimate = ( el[0].tagName === \"IMG\" ) ? wrapper : el;\n\tdistance = animate[ size ]();\n\n\t\/\/ Shift\n\tif ( show ) {\n\t\tanimate.css( size, 0 );\n\t\tanimate.css( position, distance \/ 2 );\n\t}\n\n\t\/\/ Create Animation Object:\n\tanimation[ size ] = show ? distance : 0;\n\tanimation[ position ] = show ? 0 : distance \/ 2;\n\n\t\/\/ Animate\n\tanimate.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( !show ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.drop = function( o, done ) {\n\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"opacity\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"pos\" : \"neg\",\n\t\tanimation = {\n\t\t\topacity: show ? 1 : 0\n\t\t},\n\t\tdistance;\n\n\t\/\/ Adjust\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\": \"outerWidth\" ]( true ) \/ 2;\n\n\tif ( show ) {\n\t\tel\n\t\t\t.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion === \"pos\" ? -distance : distance );\n\t}\n\n\t\/\/ Animation\n\tanimation[ ref ] = ( show ?\n\t\t( motion === \"pos\" ? \"+=\" : \"-=\" ) :\n\t\t( motion === \"pos\" ? \"-=\" : \"+=\" ) ) +\n\t\tdistance;\n\n\t\/\/ Animate\n\tel.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.explode = function( o, done ) {\n\n\tvar rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,\n\t\tcells = rows,\n\t\tel = $( this ),\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\n\t\t\/\/ show and then visibility:hidden the element before calculating offset\n\t\toffset = el.show().css( \"visibility\", \"hidden\" ).offset(),\n\n\t\t\/\/ width and height of a piece\n\t\twidth = Math.ceil( el.outerWidth() \/ cells ),\n\t\theight = Math.ceil( el.outerHeight() \/ rows ),\n\t\tpieces = [],\n\n\t\t\/\/ loop\n\t\ti, j, left, top, mx, my;\n\n\t\/\/ children animate complete:\n\tfunction childComplete() {\n\t\tpieces.push( this );\n\t\tif ( pieces.length === rows * cells ) {\n\t\t\tanimComplete();\n\t\t}\n\t}\n\n\t\/\/ clone the element for each row and cell.\n\tfor( i = 0; i < rows ; i++ ) { \/\/ ===>\n\t\ttop = offset.top + i * height;\n\t\tmy = i - ( rows - 1 ) \/ 2 ;\n\n\t\tfor( j = 0; j < cells ; j++ ) { \/\/ |||\n\t\t\tleft = offset.left + j * width;\n\t\t\tmx = j - ( cells - 1 ) \/ 2 ;\n\n\t\t\t\/\/ Create a clone of the now hidden main element that will be absolute positioned\n\t\t\t\/\/ within a wrapper div off the -left and -top equal to size of our pieces\n\t\t\tel\n\t\t\t\t.clone()\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.wrap( \"<div><\/div>\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tvisibility: \"visible\",\n\t\t\t\t\tleft: -j * width,\n\t\t\t\t\ttop: -i * height\n\t\t\t\t})\n\n\t\t\t\/\/ select the wrapper - make it overflow: hidden and absolute positioned based on\n\t\t\t\/\/ where the original was located +left and +top equal to the size of pieces\n\t\t\t\t.parent()\n\t\t\t\t.addClass( \"ui-effects-explode\" )\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\n\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\n\t\t\t\t\topacity: show ? 0 : 1\n\t\t\t\t}).animate({\n\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\n\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\n\t\t\t\t\topacity: show ? 1 : 0\n\t\t\t\t}, o.duration || 500, o.easing, childComplete );\n\t\t}\n\t}\n\n\tfunction animComplete() {\n\t\tel.css({\n\t\t\tvisibility: \"visible\"\n\t\t});\n\t\t$( pieces ).remove();\n\t\tif ( !show ) {\n\t\t\tel.hide();\n\t\t}\n\t\tdone();\n\t}\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.fade = function( o, done ) {\n\tvar el = $( this ),\n\t\tmode = $.effects.setMode( el, o.mode || \"toggle\" );\n\n\tel.animate({\n\t\topacity: mode\n\t}, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: done\n\t});\n};\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.effects.effect.fold = function( o, done ) {\n\n\t\/\/ Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tsize = o.size || 15,\n\t\tpercent = \/([0-9]+)%\/.exec( size ),\n\t\thorizFirst = !!o.horizFirst,\n\t\twidthFirst = show !== horizFirst,\n\t\tref = widthFirst ? [ \"width\", \"height\" ] : [ \"height\", \"width\" ],\n\t\tduration = o.duration \/ 2,\n\t\twrapper, distance,\n\t\tanimation1 = {},\n\t\tanimation2 = {};\n\n\t$.effects.save( el, props );\n\tel.show();\n\n\t\/\/ Create Wrapper\n\twrapper = $.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\tdistance = widthFirst ?\n\t\t[ wrapper.width(), wrapper.height() ] :\n\t\t[ wrapper.height(), wrapper.width() ];\n\n\tif ( percent ) {\n\t\tsize = parseInt( percent[ 1 ], 10 ) \/ 100 * distance[ hide ? 0 : 1 ];\n\t}\n\tif ( show ) {\n\t\twrapper.css( horizFirst ? {\n\t\t\theight: 0,\n\t\t\twidth: size\n\t\t} : {\n\t\t\theight: size,\n\t\t\twidth: 0\n\t\t});\n\t}\n\n\t\/\/ Animation\n\tanimation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;\n\tanimation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;\n\n\t\/\/ Animate\n\twrapper\n\t\t.animate( animation1, duration, o.easing )\n\t\t.animate( animation2, duration, o.easing, function() {\n\t\t\tif ( hide ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t});\n\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.highlight = function( o, done ) {\n\tvar elem = $( this ),\n\t\tprops = [ \"backgroundImage\", \"backgroundColor\", \"opacity\" ],\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\n\t\tanimation = {\n\t\t\tbackgroundColor: elem.css( \"backgroundColor\" )\n\t\t};\n\n\tif (mode === \"hide\") {\n\t\tanimation.opacity = 0;\n\t}\n\n\t$.effects.save( elem, props );\n\n\telem\n\t\t.show()\n\t\t.css({\n\t\t\tbackgroundImage: \"none\",\n\t\t\tbackgroundColor: o.color || \"#ffff99\"\n\t\t})\n\t\t.animate( animation, {\n\t\t\tqueue: false,\n\t\t\tduration: o.duration,\n\t\t\teasing: o.easing,\n\t\t\tcomplete: function() {\n\t\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\t\telem.hide();\n\t\t\t\t}\n\t\t\t\t$.effects.restore( elem, props );\n\t\t\t\tdone();\n\t\t\t}\n\t\t});\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.pulsate = function( o, done ) {\n\tvar elem = $( this ),\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tshowhide = ( show || mode === \"hide\" ),\n\n\t\t\/\/ showing or hiding leaves of the \"last\" animation\n\t\tanims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\n\t\tduration = o.duration \/ anims,\n\t\tanimateTo = 0,\n\t\tqueue = elem.queue(),\n\t\tqueuelen = queue.length,\n\t\ti;\n\n\tif ( show || !elem.is(\":visible\")) {\n\t\telem.css( \"opacity\", 0 ).show();\n\t\tanimateTo = 1;\n\t}\n\n\t\/\/ anims - 1 opacity \"toggles\"\n\tfor ( i = 1; i < anims; i++ ) {\n\t\telem.animate({\n\t\t\topacity: animateTo\n\t\t}, duration, o.easing );\n\t\tanimateTo = 1 - animateTo;\n\t}\n\n\telem.animate({\n\t\topacity: animateTo\n\t}, duration, o.easing);\n\n\telem.queue(function() {\n\t\tif ( hide ) {\n\t\t\telem.hide();\n\t\t}\n\t\tdone();\n\t});\n\n\t\/\/ We just queued up \"anims\" animations, we need to put them next in the queue\n\tif ( queuelen > 1 ) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\telem.dequeue();\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.puff = function( o, done ) {\n\tvar elem = $( this ),\n\t\tmode = $.effects.setMode( elem, o.mode || \"hide\" ),\n\t\thide = mode === \"hide\",\n\t\tpercent = parseInt( o.percent, 10 ) || 150,\n\t\tfactor = percent \/ 100,\n\t\toriginal = {\n\t\t\theight: elem.height(),\n\t\t\twidth: elem.width(),\n\t\t\touterHeight: elem.outerHeight(),\n\t\t\touterWidth: elem.outerWidth()\n\t\t};\n\n\t$.extend( o, {\n\t\teffect: \"scale\",\n\t\tqueue: false,\n\t\tfade: true,\n\t\tmode: mode,\n\t\tcomplete: done,\n\t\tpercent: hide ? percent : 100,\n\t\tfrom: hide ?\n\t\t\toriginal :\n\t\t\t{\n\t\t\t\theight: original.height * factor,\n\t\t\t\twidth: original.width * factor,\n\t\t\t\touterHeight: original.outerHeight * factor,\n\t\t\t\touterWidth: original.outerWidth * factor\n\t\t\t}\n\t});\n\n\telem.effect( o );\n};\n\n$.effects.effect.scale = function( o, done ) {\n\n\t\/\/ Create element\n\tvar el = $( this ),\n\t\toptions = $.extend( true, {}, o ),\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\tpercent = parseInt( o.percent, 10 ) ||\n\t\t\t( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === \"hide\" ? 0 : 100 ) ),\n\t\tdirection = o.direction || \"both\",\n\t\torigin = o.origin,\n\t\toriginal = {\n\t\t\theight: el.height(),\n\t\t\twidth: el.width(),\n\t\t\touterHeight: el.outerHeight(),\n\t\t\touterWidth: el.outerWidth()\n\t\t},\n\t\tfactor = {\n\t\t\ty: direction !== \"horizontal\" ? (percent \/ 100) : 1,\n\t\t\tx: direction !== \"vertical\" ? (percent \/ 100) : 1\n\t\t};\n\n\t\/\/ We are going to pass this effect to the size effect:\n\toptions.effect = \"size\";\n\toptions.queue = false;\n\toptions.complete = done;\n\n\t\/\/ Set default origin and restore for show\/hide\n\tif ( mode !== \"effect\" ) {\n\t\toptions.origin = origin || [\"middle\",\"center\"];\n\t\toptions.restore = true;\n\t}\n\n\toptions.from = o.from || ( mode === \"show\" ? {\n\t\theight: 0,\n\t\twidth: 0,\n\t\touterHeight: 0,\n\t\touterWidth: 0\n\t} : original );\n\toptions.to = {\n\t\theight: original.height * factor.y,\n\t\twidth: original.width * factor.x,\n\t\touterHeight: original.outerHeight * factor.y,\n\t\touterWidth: original.outerWidth * factor.x\n\t};\n\n\t\/\/ Fade option to support puff\n\tif ( options.fade ) {\n\t\tif ( mode === \"show\" ) {\n\t\t\toptions.from.opacity = 0;\n\t\t\toptions.to.opacity = 1;\n\t\t}\n\t\tif ( mode === \"hide\" ) {\n\t\t\toptions.from.opacity = 1;\n\t\t\toptions.to.opacity = 0;\n\t\t}\n\t}\n\n\t\/\/ Animate\n\tel.effect( options );\n\n};\n\n$.effects.effect.size = function( o, done ) {\n\n\t\/\/ Create element\n\tvar original, baseline, factor,\n\t\tel = $( this ),\n\t\tprops0 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\", \"overflow\", \"opacity\" ],\n\n\t\t\/\/ Always restore\n\t\tprops1 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"overflow\", \"opacity\" ],\n\n\t\t\/\/ Copy for children\n\t\tprops2 = [ \"width\", \"height\", \"overflow\" ],\n\t\tcProps = [ \"fontSize\" ],\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\n\n\t\t\/\/ Set options\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\trestore = o.restore || mode !== \"effect\",\n\t\tscale = o.scale || \"both\",\n\t\torigin = o.origin || [ \"middle\", \"center\" ],\n\t\tposition = el.css( \"position\" ),\n\t\tprops = restore ? props0 : props1,\n\t\tzero = {\n\t\t\theight: 0,\n\t\t\twidth: 0,\n\t\t\touterHeight: 0,\n\t\t\touterWidth: 0\n\t\t};\n\n\tif ( mode === \"show\" ) {\n\t\tel.show();\n\t}\n\toriginal = {\n\t\theight: el.height(),\n\t\twidth: el.width(),\n\t\touterHeight: el.outerHeight(),\n\t\touterWidth: el.outerWidth()\n\t};\n\n\tif ( o.mode === \"toggle\" && mode === \"show\" ) {\n\t\tel.from = o.to || zero;\n\t\tel.to = o.from || original;\n\t} else {\n\t\tel.from = o.from || ( mode === \"show\" ? zero : original );\n\t\tel.to = o.to || ( mode === \"hide\" ? zero : original );\n\t}\n\n\t\/\/ Set scaling factor\n\tfactor = {\n\t\tfrom: {\n\t\t\ty: el.from.height \/ original.height,\n\t\t\tx: el.from.width \/ original.width\n\t\t},\n\t\tto: {\n\t\t\ty: el.to.height \/ original.height,\n\t\t\tx: el.to.width \/ original.width\n\t\t}\n\t};\n\n\t\/\/ Scale the css box\n\tif ( scale === \"box\" || scale === \"both\" ) {\n\n\t\t\/\/ Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tprops = props.concat( vProps );\n\t\t\tel.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );\n\t\t\tel.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );\n\t\t}\n\n\t\t\/\/ Horizontal props scaling\n\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\tprops = props.concat( hProps );\n\t\t\tel.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );\n\t\t\tel.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );\n\t\t}\n\t}\n\n\t\/\/ Scale the content\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\t\/\/ Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tprops = props.concat( cProps ).concat( props2 );\n\t\t\tel.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );\n\t\t\tel.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );\n\t\t}\n\t}\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\tel.css( \"overflow\", \"hidden\" ).css( el.from );\n\n\t\/\/ Adjust\n\tif (origin) { \/\/ Calculate baseline shifts\n\t\tbaseline = $.effects.getBaseline( origin, original );\n\t\tel.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;\n\t\tel.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;\n\t\tel.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;\n\t\tel.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;\n\t}\n\tel.css( el.from ); \/\/ set top & left\n\n\t\/\/ Animate\n\tif ( scale === \"content\" || scale === \"both\" ) { \/\/ Scale the children\n\n\t\t\/\/ Add margins\/font-size\n\t\tvProps = vProps.concat([ \"marginTop\", \"marginBottom\" ]).concat(cProps);\n\t\thProps = hProps.concat([ \"marginLeft\", \"marginRight\" ]);\n\t\tprops2 = props0.concat(vProps).concat(hProps);\n\n\t\tel.find( \"*[width]\" ).each( function(){\n\t\t\tvar child = $( this ),\n\t\t\t\tc_original = {\n\t\t\t\t\theight: child.height(),\n\t\t\t\t\twidth: child.width(),\n\t\t\t\t\touterHeight: child.outerHeight(),\n\t\t\t\t\touterWidth: child.outerWidth()\n\t\t\t\t};\n\t\t\tif (restore) {\n\t\t\t\t$.effects.save(child, props2);\n\t\t\t}\n\n\t\t\tchild.from = {\n\t\t\t\theight: c_original.height * factor.from.y,\n\t\t\t\twidth: c_original.width * factor.from.x,\n\t\t\t\touterHeight: c_original.outerHeight * factor.from.y,\n\t\t\t\touterWidth: c_original.outerWidth * factor.from.x\n\t\t\t};\n\t\t\tchild.to = {\n\t\t\t\theight: c_original.height * factor.to.y,\n\t\t\t\twidth: c_original.width * factor.to.x,\n\t\t\t\touterHeight: c_original.height * factor.to.y,\n\t\t\t\touterWidth: c_original.width * factor.to.x\n\t\t\t};\n\n\t\t\t\/\/ Vertical props scaling\n\t\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\t\tchild.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );\n\t\t\t\tchild.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );\n\t\t\t}\n\n\t\t\t\/\/ Horizontal props scaling\n\t\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\t\tchild.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );\n\t\t\t\tchild.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );\n\t\t\t}\n\n\t\t\t\/\/ Animate children\n\t\t\tchild.css( child.from );\n\t\t\tchild.animate( child.to, o.duration, o.easing, function() {\n\n\t\t\t\t\/\/ Restore children\n\t\t\t\tif ( restore ) {\n\t\t\t\t\t$.effects.restore( child, props2 );\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t\/\/ Animate\n\tel.animate( el.to, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( el.to.opacity === 0 ) {\n\t\t\t\tel.css( \"opacity\", el.from.opacity );\n\t\t\t}\n\t\t\tif( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\tif ( !restore ) {\n\n\t\t\t\t\/\/ we need to calculate our new positioning based on the scaling\n\t\t\t\tif ( position === \"static\" ) {\n\t\t\t\t\tel.css({\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttop: el.to.top,\n\t\t\t\t\t\tleft: el.to.left\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$.each([ \"top\", \"left\" ], function( idx, pos ) {\n\t\t\t\t\t\tel.css( pos, function( _, str ) {\n\t\t\t\t\t\t\tvar val = parseInt( str, 10 ),\n\t\t\t\t\t\t\t\ttoRef = idx ? el.to.left : el.to.top;\n\n\t\t\t\t\t\t\t\/\/ if original was \"auto\", recalculate the new value from wrapper\n\t\t\t\t\t\t\tif ( str === \"auto\" ) {\n\t\t\t\t\t\t\t\treturn toRef + \"px\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn val + toRef + \"px\";\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.shake = function( o, done ) {\n\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\n\t\tdirection = o.direction || \"left\",\n\t\tdistance = o.distance || 20,\n\t\ttimes = o.times || 3,\n\t\tanims = times * 2 + 1,\n\t\tspeed = Math.round(o.duration\/anims),\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\n\t\tanimation = {},\n\t\tanimation1 = {},\n\t\tanimation2 = {},\n\t\ti,\n\n\t\t\/\/ we will need to re-assemble the queue to stack our animations in place\n\t\tqueue = el.queue(),\n\t\tqueuelen = queue.length;\n\n\t$.effects.save( el, props );\n\tel.show();\n\t$.effects.createWrapper( el );\n\n\t\/\/ Animation\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\n\n\t\/\/ Animate\n\tel.animate( animation, speed, o.easing );\n\n\t\/\/ Shakes\n\tfor ( i = 1; i < times; i++ ) {\n\t\tel.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );\n\t}\n\tel\n\t\t.animate( animation1, speed, o.easing )\n\t\t.animate( animation, speed \/ 2, o.easing )\n\t\t.queue(function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t});\n\n\t\/\/ inject all the animations we just queued to be first in line (after \"inprogress\")\n\tif ( queuelen > 1) {\n\t\tqueue.splice.apply( queue,\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\n\t}\n\tel.dequeue();\n\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.slide = function( o, done ) {\n\n\t\/\/ Create element\n\tvar el = $( this ),\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\" ],\n\t\tmode = $.effects.setMode( el, o.mode || \"show\" ),\n\t\tshow = mode === \"show\",\n\t\tdirection = o.direction || \"left\",\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\n\t\tdistance,\n\t\tanimation = {};\n\n\t\/\/ Adjust\n\t$.effects.save( el, props );\n\tel.show();\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true );\n\n\t$.effects.createWrapper( el ).css({\n\t\toverflow: \"hidden\"\n\t});\n\n\tif ( show ) {\n\t\tel.css( ref, positiveMotion ? (isNaN(distance) ? \"-\" + distance : -distance) : distance );\n\t}\n\n\t\/\/ Animation\n\tanimation[ ref ] = ( show ?\n\t\t( positiveMotion ? \"+=\" : \"-=\") :\n\t\t( positiveMotion ? \"-=\" : \"+=\")) +\n\t\tdistance;\n\n\t\/\/ Animate\n\tel.animate( animation, {\n\t\tqueue: false,\n\t\tduration: o.duration,\n\t\teasing: o.easing,\n\t\tcomplete: function() {\n\t\t\tif ( mode === \"hide\" ) {\n\t\t\t\tel.hide();\n\t\t\t}\n\t\t\t$.effects.restore( el, props );\n\t\t\t$.effects.removeWrapper( el );\n\t\t\tdone();\n\t\t}\n\t});\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.effects.effect.transfer = function( o, done ) {\n\tvar elem = $( this ),\n\t\ttarget = $( o.to ),\n\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\n\t\tbody = $(\"body\"),\n\t\tfixTop = targetFixed ? body.scrollTop() : 0,\n\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\n\t\tendPosition = target.offset(),\n\t\tanimation = {\n\t\t\ttop: endPosition.top - fixTop ,\n\t\t\tleft: endPosition.left - fixLeft ,\n\t\t\theight: target.innerHeight(),\n\t\t\twidth: target.innerWidth()\n\t\t},\n\t\tstartPosition = elem.offset(),\n\t\ttransfer = $( \"<div class='ui-effects-transfer'><\/div>\" )\n\t\t\t.appendTo( document.body )\n\t\t\t.addClass( o.className )\n\t\t\t.css({\n\t\t\t\ttop: startPosition.top - fixTop ,\n\t\t\t\tleft: startPosition.left - fixLeft ,\n\t\t\t\theight: elem.innerHeight(),\n\t\t\t\twidth: elem.innerWidth(),\n\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\n\t\t\t})\n\t\t\t.animate( animation, o.duration, o.easing, function() {\n\t\t\t\ttransfer.remove();\n\t\t\t\tdone();\n\t\t\t});\n};\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n$.widget( \"ui.menu\", {\n\tversion: \"1.10.2\",\n\tdefaultElement: \"<ul>\",\n\tdelay: 300,\n\toptions: {\n\t\ticons: {\n\t\t\tsubmenu: \"ui-icon-carat-1-e\"\n\t\t},\n\t\tmenus: \"ul\",\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"right top\"\n\t\t},\n\t\trole: \"menu\",\n\n\t\t\/\/ callbacks\n\t\tblur: null,\n\t\tfocus: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tthis.activeMenu = this.element;\n\t\t\/\/ flag used to prevent firing of the click handler\n\t\t\/\/ as the event bubbles up through nested menus\n\t\tthis.mouseHandled = false;\n\t\tthis.element\n\t\t\t.uniqueId()\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length )\n\t\t\t.attr({\n\t\t\t\trole: this.options.role,\n\t\t\t\ttabIndex: 0\n\t\t\t})\n\t\t\t\/\/ need to catch all clicks on disabled menu\n\t\t\t\/\/ not possible through _on\n\t\t\t.bind( \"click\" + this.eventNamespace, $.proxy(function( event ) {\n\t\t\t\tif ( this.options.disabled ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}, this ));\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.element\n\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t}\n\n\t\tthis._on({\n\t\t\t\/\/ Prevent focus from sticking to links inside menu after clicking\n\t\t\t\/\/ them (focus should always stay on UL during navigation).\n\t\t\t\"mousedown .ui-menu-item > a\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\t\"click .ui-state-disabled > a\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\t\"click .ui-menu-item:has(a)\": function( event ) {\n\t\t\t\tvar target = $( event.target ).closest( \".ui-menu-item\" );\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\n\t\t\t\t\tthis.mouseHandled = true;\n\n\t\t\t\t\tthis.select( event );\n\t\t\t\t\t\/\/ Open submenu on click\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\n\t\t\t\t\t\tthis.expand( event );\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) ) {\n\t\t\t\t\t\t\/\/ Redirect focus to the menu\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\n\n\t\t\t\t\t\t\/\/ If the active item is on the top level, let it stay active.\n\t\t\t\t\t\t\/\/ Otherwise, blur the active item since it is no longer visible.\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\n\t\t\t\t\t\t\tclearTimeout( this.timer );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mouseenter .ui-menu-item\": function( event ) {\n\t\t\t\tvar target = $( event.currentTarget );\n\t\t\t\t\/\/ Remove ui-state-active class from siblings of the newly focused menu item\n\t\t\t\t\/\/ to avoid a jump caused by adjacent elements both having a class with a border\n\t\t\t\ttarget.siblings().children( \".ui-state-active\" ).removeClass( \"ui-state-active\" );\n\t\t\t\tthis.focus( event, target );\n\t\t\t},\n\t\t\tmouseleave: \"collapseAll\",\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\n\t\t\tfocus: function( event, keepActiveItem ) {\n\t\t\t\t\/\/ If there's already an active item, keep it active\n\t\t\t\t\/\/ If not, activate the first item\n\t\t\t\tvar item = this.active || this.element.children( \".ui-menu-item\" ).eq( 0 );\n\n\t\t\t\tif ( !keepActiveItem ) {\n\t\t\t\t\tthis.focus( event, item );\n\t\t\t\t}\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tthis._delay(function() {\n\t\t\t\t\tif ( !$.contains( this.element[0], this.document[0].activeElement ) ) {\n\t\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tkeydown: \"_keydown\"\n\t\t});\n\n\t\tthis.refresh();\n\n\t\t\/\/ Clicks outside of a menu collapse any open menus\n\t\tthis._on( this.document, {\n\t\t\tclick: function( event ) {\n\t\t\t\tif ( !$( event.target ).closest( \".ui-menu\" ).length ) {\n\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t}\n\n\t\t\t\t\/\/ Reset the mouseHandled flag\n\t\t\t\tthis.mouseHandled = false;\n\t\t\t}\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\t\/\/ Destroy (sub)menus\n\t\tthis.element\n\t\t\t.removeAttr( \"aria-activedescendant\" )\n\t\t\t.find( \".ui-menu\" ).addBack()\n\t\t\t\t.removeClass( \"ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons\" )\n\t\t\t\t.removeAttr( \"role\" )\n\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.show();\n\n\t\t\/\/ Destroy menu items\n\t\tthis.element.find( \".ui-menu-item\" )\n\t\t\t.removeClass( \"ui-menu-item\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.children( \"a\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.removeClass( \"ui-corner-all ui-state-hover\" )\n\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t.removeAttr( \"role\" )\n\t\t\t\t.removeAttr( \"aria-haspopup\" )\n\t\t\t\t.children().each( function() {\n\t\t\t\t\tvar elem = $( this );\n\t\t\t\t\tif ( elem.data( \"ui-menu-submenu-carat\" ) ) {\n\t\t\t\t\t\telem.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\/\/ Destroy menu dividers\n\t\tthis.element.find( \".ui-menu-divider\" ).removeClass( \"ui-menu-divider ui-widget-content\" );\n\t},\n\n\t_keydown: function( event ) {\n\t\t\/*jshint maxcomplexity:20*\/\n\t\tvar match, prev, character, skip, regex,\n\t\t\tpreventDefault = true;\n\n\t\tfunction escape( value ) {\n\t\t\treturn value.replace( \/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]\/g, \"\\\\$&\" );\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\tthis.previousPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\tthis.nextPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tthis._move( \"first\", \"first\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tthis._move( \"last\", \"last\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\t\tthis.previous( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tthis.next( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ENTER:\n\t\tcase $.ui.keyCode.SPACE:\n\t\t\tthis._activate( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpreventDefault = false;\n\t\t\tprev = this.previousFilter || \"\";\n\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\tskip = false;\n\n\t\t\tclearTimeout( this.filterTimer );\n\n\t\t\tif ( character === prev ) {\n\t\t\t\tskip = true;\n\t\t\t} else {\n\t\t\t\tcharacter = prev + character;\n\t\t\t}\n\n\t\t\tregex = new RegExp( \"^\" + escape( character ), \"i\" );\n\t\t\tmatch = this.activeMenu.children( \".ui-menu-item\" ).filter(function() {\n\t\t\t\treturn regex.test( $( this ).children( \"a\" ).text() );\n\t\t\t});\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\n\t\t\t\tmatch;\n\n\t\t\t\/\/ If no matches on the current filter, reset to the last character pressed\n\t\t\t\/\/ to move down the menu to the first item that starts with that character\n\t\t\tif ( !match.length ) {\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\t\tregex = new RegExp( \"^\" + escape( character ), \"i\" );\n\t\t\t\tmatch = this.activeMenu.children( \".ui-menu-item\" ).filter(function() {\n\t\t\t\t\treturn regex.test( $( this ).children( \"a\" ).text() );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( match.length ) {\n\t\t\t\tthis.focus( event, match );\n\t\t\t\tif ( match.length > 1 ) {\n\t\t\t\t\tthis.previousFilter = character;\n\t\t\t\t\tthis.filterTimer = this._delay(function() {\n\t\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t\t}, 1000 );\n\t\t\t\t} else {\n\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdelete this.previousFilter;\n\t\t\t}\n\t\t}\n\n\t\tif ( preventDefault ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_activate: function( event ) {\n\t\tif ( !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\tif ( this.active.children( \"a[aria-haspopup='true']\" ).length ) {\n\t\t\t\tthis.expand( event );\n\t\t\t} else {\n\t\t\t\tthis.select( event );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar menus,\n\t\t\ticon = this.options.icons.submenu,\n\t\t\tsubmenus = this.element.find( this.options.menus );\n\n\t\t\/\/ Initialize nested menus\n\t\tsubmenus.filter( \":not(.ui-menu)\" )\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\trole: this.options.role,\n\t\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t})\n\t\t\t.each(function() {\n\t\t\t\tvar menu = $( this ),\n\t\t\t\t\titem = menu.prev( \"a\" ),\n\t\t\t\t\tsubmenuCarat = $( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-menu-icon ui-icon \" + icon )\n\t\t\t\t\t\t.data( \"ui-menu-submenu-carat\", true );\n\n\t\t\t\titem\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\n\t\t\t\t\t.prepend( submenuCarat );\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\n\t\t\t});\n\n\t\tmenus = submenus.add( this.element );\n\n\t\t\/\/ Don't refresh list items that are already adapted\n\t\tmenus.children( \":not(.ui-menu-item):has(a)\" )\n\t\t\t.addClass( \"ui-menu-item\" )\n\t\t\t.attr( \"role\", \"presentation\" )\n\t\t\t.children( \"a\" )\n\t\t\t\t.uniqueId()\n\t\t\t\t.addClass( \"ui-corner-all\" )\n\t\t\t\t.attr({\n\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\trole: this._itemRole()\n\t\t\t\t});\n\n\t\t\/\/ Initialize unlinked menu-items containing spaces and\/or dashes only as dividers\n\t\tmenus.children( \":not(.ui-menu-item)\" ).each(function() {\n\t\t\tvar item = $( this );\n\t\t\t\/\/ hyphen, em dash, en dash\n\t\t\tif ( !\/[^\\-\\u2014\\u2013\\s]\/.test( item.text() ) ) {\n\t\t\t\titem.addClass( \"ui-widget-content ui-menu-divider\" );\n\t\t\t}\n\t\t});\n\n\t\t\/\/ Add aria-disabled attribute to any disabled menu item\n\t\tmenus.children( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\n\n\t\t\/\/ If the active item has been removed, blur the menu\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\tthis.blur();\n\t\t}\n\t},\n\n\t_itemRole: function() {\n\t\treturn {\n\t\t\tmenu: \"menuitem\",\n\t\t\tlistbox: \"option\"\n\t\t}[ this.options.role ];\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.element.find( \".ui-menu-icon\" )\n\t\t\t\t.removeClass( this.options.icons.submenu )\n\t\t\t\t.addClass( value.submenu );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\tfocus: function( event, item ) {\n\t\tvar nested, focused;\n\t\tthis.blur( event, event && event.type === \"focus\" );\n\n\t\tthis._scrollIntoView( item );\n\n\t\tthis.active = item.first();\n\t\tfocused = this.active.children( \"a\" ).addClass( \"ui-state-focus\" );\n\t\t\/\/ Only update aria-activedescendant if there's a role\n\t\t\/\/ otherwise we assume focus is managed elsewhere\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\n\t\t}\n\n\t\t\/\/ Highlight active parent menu item, if any\n\t\tthis.active\n\t\t\t.parent()\n\t\t\t.closest( \".ui-menu-item\" )\n\t\t\t.children( \"a:first\" )\n\t\t\t.addClass( \"ui-state-active\" );\n\n\t\tif ( event && event.type === \"keydown\" ) {\n\t\t\tthis._close();\n\t\t} else {\n\t\t\tthis.timer = this._delay(function() {\n\t\t\t\tthis._close();\n\t\t\t}, this.delay );\n\t\t}\n\n\t\tnested = item.children( \".ui-menu\" );\n\t\tif ( nested.length && ( \/^mouse\/.test( event.type ) ) ) {\n\t\t\tthis._startOpening(nested);\n\t\t}\n\t\tthis.activeMenu = item.parent();\n\n\t\tthis._trigger( \"focus\", event, { item: item } );\n\t},\n\n\t_scrollIntoView: function( item ) {\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\n\t\tif ( this._hasScroll() ) {\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[0], \"borderTopWidth\" ) ) || 0;\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[0], \"paddingTop\" ) ) || 0;\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\n\t\t\tscroll = this.activeMenu.scrollTop();\n\t\t\telementHeight = this.activeMenu.height();\n\t\t\titemHeight = item.height();\n\n\t\t\tif ( offset < 0 ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\n\t\t\t}\n\t\t}\n\t},\n\n\tblur: function( event, fromFocus ) {\n\t\tif ( !fromFocus ) {\n\t\t\tclearTimeout( this.timer );\n\t\t}\n\n\t\tif ( !this.active ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.active.children( \"a\" ).removeClass( \"ui-state-focus\" );\n\t\tthis.active = null;\n\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\n\t},\n\n\t_startOpening: function( submenu ) {\n\t\tclearTimeout( this.timer );\n\n\t\t\/\/ Don't open if already open fixes a Firefox bug that caused a .5 pixel\n\t\t\/\/ shift in the submenu position when mousing over the carat icon\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = this._delay(function() {\n\t\t\tthis._close();\n\t\t\tthis._open( submenu );\n\t\t}, this.delay );\n\t},\n\n\t_open: function( submenu ) {\n\t\tvar position = $.extend({\n\t\t\tof: this.active\n\t\t}, this.options.position );\n\n\t\tclearTimeout( this.timer );\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" );\n\n\t\tsubmenu\n\t\t\t.show()\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.attr( \"aria-expanded\", \"true\" )\n\t\t\t.position( position );\n\t},\n\n\tcollapseAll: function( event, all ) {\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay(function() {\n\t\t\t\/\/ If we were passed an event, look for the submenu that contains the event\n\t\t\tvar currentMenu = all ? this.element :\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\n\n\t\t\t\/\/ If we found no valid submenu ancestor, use the main menu to close all sub menus anyway\n\t\t\tif ( !currentMenu.length ) {\n\t\t\t\tcurrentMenu = this.element;\n\t\t\t}\n\n\t\t\tthis._close( currentMenu );\n\n\t\t\tthis.blur( event );\n\t\t\tthis.activeMenu = currentMenu;\n\t\t}, this.delay );\n\t},\n\n\t\/\/ With no arguments, closes the currently active menu - if nothing is active\n\t\/\/ it closes all menus.  If passed an argument, it will search for menus BELOW\n\t_close: function( startMenu ) {\n\t\tif ( !startMenu ) {\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\n\t\t}\n\n\t\tstartMenu\n\t\t\t.find( \".ui-menu\" )\n\t\t\t\t.hide()\n\t\t\t\t.attr( \"aria-hidden\", \"true\" )\n\t\t\t\t.attr( \"aria-expanded\", \"false\" )\n\t\t\t.end()\n\t\t\t.find( \"a.ui-state-active\" )\n\t\t\t\t.removeClass( \"ui-state-active\" );\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._close();\n\t\t\tthis.focus( event, newItem );\n\t\t}\n\t},\n\n\texpand: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active\n\t\t\t\t.children( \".ui-menu \" )\n\t\t\t\t.children( \".ui-menu-item\" )\n\t\t\t\t.first();\n\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._open( newItem.parent() );\n\n\t\t\t\/\/ Delay so Firefox will not hide activedescendant change in expanding submenu from AT\n\t\t\tthis._delay(function() {\n\t\t\t\tthis.focus( event, newItem );\n\t\t\t});\n\t\t}\n\t},\n\n\tnext: function( event ) {\n\t\tthis._move( \"next\", \"first\", event );\n\t},\n\n\tprevious: function( event ) {\n\t\tthis._move( \"prev\", \"last\", event );\n\t},\n\n\tisFirstItem: function() {\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\n\t},\n\n\tisLastItem: function() {\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\n\t},\n\n\t_move: function( direction, filter, event ) {\n\t\tvar next;\n\t\tif ( this.active ) {\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( -1 );\n\t\t\t} else {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( 0 );\n\t\t\t}\n\t\t}\n\t\tif ( !next || !next.length || !this.active ) {\n\t\t\tnext = this.activeMenu.children( \".ui-menu-item\" )[ filter ]();\n\t\t}\n\n\t\tthis.focus( event, next );\n\t},\n\n\tnextPage: function( event ) {\n\t\tvar item, base, height;\n\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isLastItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each(function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base - height < 0;\n\t\t\t});\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.children( \".ui-menu-item\" )\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\n\t\t}\n\t},\n\n\tpreviousPage: function( event ) {\n\t\tvar item, base, height;\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isFirstItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each(function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base + height > 0;\n\t\t\t});\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.children( \".ui-menu-item\" ).first() );\n\t\t}\n\t},\n\n\t_hasScroll: function() {\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\n\t},\n\n\tselect: function( event ) {\n\t\t\/\/ TODO: It should never be possible to not have an active item at this\n\t\t\/\/ point, but the tests don't trigger mouseenter before click.\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\n\t\tvar ui = { item: this.active };\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\n\t\t\tthis.collapseAll( event, true );\n\t\t}\n\t\tthis._trigger( \"select\", event, ui );\n\t}\n});\n\n}( jQuery ));\n\n(function( $, undefined ) {\n\n$.ui = $.ui || {};\n\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\tround = Math.round,\n\trhorizontal = \/left|center|right\/,\n\trvertical = \/top|center|bottom\/,\n\troffset = \/[\\+\\-]\\d+(\\.[\\d]+)?%?\/,\n\trposition = \/^\\w+\/,\n\trpercent = \/%$\/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width \/ 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height \/ 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[0];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'><\/div><\/div>\" ),\n\t\t\tinnerDiv = div.children()[0];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[0].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn (cachedScrollbarWidth = w1 - w2);\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow ? \"\" : within.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow ? \"\" : within.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[0] );\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: isWindow ? withinElement.width() : withinElement.outerWidth(),\n\t\t\theight: isWindow ? withinElement.height() : withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t\/\/ make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[0].preventDefault ) {\n\t\t\/\/ force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\t\/\/ clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t\/\/ force my and at to have valid horizontal and vertical positions\n\t\/\/ if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t\/\/ calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t\/\/ reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t});\n\n\t\/\/ normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth \/ 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight \/ 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each(function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth \/ 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight \/ 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\t\/\/ if the browser doesn't support fractions, then round for consistent results\n\t\tif ( !$.support.offsetFractions ) {\n\t\t\tposition.left = round( position.left );\n\t\t\tposition.top = round( position.top );\n\t\t}\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem : elem\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif ( options.using ) {\n\t\t\t\/\/ adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t});\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t\/\/ element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\t\t\t\t\/\/ element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\t\t\t\t\/\/ element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\/\/ element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\/\/ too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\t\t\t\/\/ too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\t\t\t\/\/ adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t\/\/ element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\t\t\t\t\/\/ element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\t\t\t\t\/\/ element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\/\/ element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\/\/ too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\t\t\t\/\/ too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\t\t\t\/\/ adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n\/\/ fraction support test\n(function () {\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\n\t\tdiv = document.createElement( \"div\" );\n\n\t\/\/Create a \"fake body\" for testing based on method used in jQuery.support\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\t$.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-1000px\",\n\t\t\ttop: \"-1000px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || document.documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\n\n\toffsetLeft = $( div ).offset().left;\n\t$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;\n\n\ttestElement.innerHTML = \"\";\n\ttestElementParent.removeChild( testElement );\n})();\n\n}( jQuery ) );\n\n(function( $, undefined ) {\n\n$.widget( \"ui.progressbar\", {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\tmax: 100,\n\t\tvalue: 0,\n\n\t\tchange: null,\n\t\tcomplete: null\n\t},\n\n\tmin: 0,\n\n\t_create: function() {\n\t\t\/\/ Constrain initial value\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.attr({\n\t\t\t\t\/\/ Only set static values, aria-valuenow and aria-valuemax are\n\t\t\t\t\/\/ set inside _refreshValue()\n\t\t\t\trole: \"progressbar\",\n\t\t\t\t\"aria-valuemin\": this.min\n\t\t\t});\n\n\t\tthis.valueDiv = $( \"<div class='ui-progressbar-value ui-widget-header ui-corner-left'><\/div>\" )\n\t\t\t.appendTo( this.element );\n\n\t\tthis._refreshValue();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-valuemin\" )\n\t\t\t.removeAttr( \"aria-valuemax\" )\n\t\t\t.removeAttr( \"aria-valuenow\" );\n\n\t\tthis.valueDiv.remove();\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\treturn this.options.value;\n\t\t}\n\n\t\tthis.options.value = this._constrainedValue( newValue );\n\t\tthis._refreshValue();\n\t},\n\n\t_constrainedValue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\tnewValue = this.options.value;\n\t\t}\n\n\t\tthis.indeterminate = newValue === false;\n\n\t\t\/\/ sanitize value\n\t\tif ( typeof newValue !== \"number\" ) {\n\t\t\tnewValue = 0;\n\t\t}\n\n\t\treturn this.indeterminate ? false :\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\n\t},\n\n\t_setOptions: function( options ) {\n\t\t\/\/ Ensure \"value\" option is set after other values (like max)\n\t\tvar value = options.value;\n\t\tdelete options.value;\n\n\t\tthis._super( options );\n\n\t\tthis.options.value = this._constrainedValue( value );\n\t\tthis._refreshValue();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"max\" ) {\n\t\t\t\/\/ Don't allow a max less than min\n\t\t\tvalue = Math.max( this.min, value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_percentage: function() {\n\t\treturn this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) \/ ( this.options.max - this.min );\n\t},\n\n\t_refreshValue: function() {\n\t\tvar value = this.options.value,\n\t\t\tpercentage = this._percentage();\n\n\t\tthis.valueDiv\n\t\t\t.toggle( this.indeterminate || value > this.min )\n\t\t\t.toggleClass( \"ui-corner-right\", value === this.options.max )\n\t\t\t.width( percentage.toFixed(0) + \"%\" );\n\n\t\tthis.element.toggleClass( \"ui-progressbar-indeterminate\", this.indeterminate );\n\n\t\tif ( this.indeterminate ) {\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\n\t\t\tif ( !this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv = $( \"<div class='ui-progressbar-overlay'><\/div>\" ).appendTo( this.valueDiv );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.element.attr({\n\t\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\t\"aria-valuenow\": value\n\t\t\t});\n\t\t\tif ( this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv.remove();\n\t\t\t\tthis.overlayDiv = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.oldValue !== value ) {\n\t\t\tthis.oldValue = value;\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t\tif ( value === this.options.max ) {\n\t\t\tthis._trigger( \"complete\" );\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n\/\/ number of pages in a slider\n\/\/ (how many times can you page up\/down to go through the whole range)\nvar numPages = 5;\n\n$.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.10.2\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t\/\/ callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-\" + this.orientation +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\");\n\n\t\tthis._refresh();\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ).addClass( \"ui-state-default ui-corner-all\" ),\n\t\t\thandle = \"<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'><\/a>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each(function( i ) {\n\t\t\t$( this ).data( \"ui-slider-handle-index\", i );\n\t\t});\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options,\n\t\t\tclasses = \"\";\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[0], options.values[0] ];\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div><\/div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tclasses = \"ui-slider-range\" +\n\t\t\t\t\/\/ note: this isn't the most fittingly semantic framework class for this element,\n\t\t\t\t\/\/ but worked best visually with a variety of themes\n\t\t\t\t\" ui-widget-header ui-corner-all\";\n\t\t\t} else {\n\t\t\t\tthis.range.removeClass( \"ui-slider-range-min ui-slider-range-max\" )\n\t\t\t\t\t\/\/ Handle range switching from true to min\/max\n\t\t\t\t\t.css({\n\t\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.range.addClass( classes +\n\t\t\t\t( ( options.range === \"min\" || options.range === \"max\" ) ? \" ui-slider-range-\" + options.range : \"\" ) );\n\t\t} else {\n\t\t\tthis.range = $([]);\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tvar elements = this.handles.add( this.range ).filter( \"a\" );\n\t\tthis._off( elements );\n\t\tthis._on( elements, this._handleEvents );\n\t\tthis._hoverable( elements );\n\t\tthis._focusable( elements );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tthis.range.remove();\n\n\t\tthis.element\n\t\t\t.removeClass( \"ui-slider\" +\n\t\t\t\t\" ui-slider-horizontal\" +\n\t\t\t\t\" ui-slider-vertical\" +\n\t\t\t\t\" ui-widget\" +\n\t\t\t\t\" ui-widget-content\" +\n\t\t\t\t\" ui-corner-all\" );\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each(function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values(i) );\n\t\t\tif (( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t(i === that._lastChangedValue || that.values(i) === o.min ))) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t});\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tclosestHandle\n\t\t\t.addClass( \"ui-state-active\" )\n\t\t\t.focus();\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() \/ 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() \/ 2 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderTopWidth\"), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css(\"borderBottomWidth\"), 10 ) || 0) +\n\t\t\t\t( parseInt( closestHandle.css(\"marginTop\"), 10 ) || 0)\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis.handles.removeClass( \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse \/ pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_start: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\t\treturn this._trigger( \"start\", event, uiHash );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar otherVal,\n\t\t\tnewValues,\n\t\t\tallowed;\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\n\t\t\tif ( ( this.options.values.length === 2 && this.options.range === true ) &&\n\t\t\t\t\t( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )\n\t\t\t\t) {\n\t\t\t\tnewVal = otherVal;\n\t\t\t}\n\n\t\t\tif ( newVal !== this.values( index ) ) {\n\t\t\t\tnewValues = this.values();\n\t\t\t\tnewValues[ index ] = newVal;\n\t\t\t\t\/\/ A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal,\n\t\t\t\t\tvalues: newValues\n\t\t\t\t} );\n\t\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.values( index, newVal, true );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( newVal !== this.value() ) {\n\t\t\t\t\/\/ A slide can be canceled by returning false from the slide callback\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\n\t\t\t\t\thandle: this.handles[ index ],\n\t\t\t\t\tvalue: newVal\n\t\t\t\t} );\n\t\t\t\tif ( allowed !== false ) {\n\t\t\t\t\tthis.value( newVal );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\tvalue: this.value()\n\t\t};\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tuiHash.value = this.values( index );\n\t\t\tuiHash.values = this.values();\n\t\t}\n\n\t\tthis._trigger( \"stop\", event, uiHash );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\t\t\tvar uiHash = {\n\t\t\t\thandle: this.handles[ index ],\n\t\t\t\tvalue: this.value()\n\t\t\t};\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tuiHash.value = this.values( index );\n\t\t\t\tuiHash.values = this.values();\n\t\t\t}\n\n\t\t\t\/\/store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\n\t\t\tthis._trigger( \"change\", event, uiHash );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length-1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( $.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\t$.Widget.prototype._setOption.apply( this, arguments );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis.element\n\t\t\t\t\t.removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t.addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tfor ( i = 0; i < valsLength; i += 1 ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t\/\/internal value getter\n\t\/\/ _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t\/\/internal values getter\n\t\/\/ _values() returns array of values trimmed by min and max, aligned by step\n\t\/\/ _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this.options.values && this.options.values.length ) {\n\t\t\t\/\/ .slice() creates a copy of the array\n\t\t\t\/\/ this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i+= 1) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t\/\/ returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = (val - this._valueMin()) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs(valModStep) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t\/\/ Since JavaScript has problems with large floats, round\n\t\t\/\/ the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed(5) );\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.options.max;\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\tthis.handles.each(function( i ) {\n\t\t\t\tvalPercent = ( that.values(i) - that._valueMin() ) \/ ( that._valueMax() - that._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { left: valPercent + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { width: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { bottom: ( valPercent ) + \"%\" }, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { height: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) \/ ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { width: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { width: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { height: valPercent + \"%\" }, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { height: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\t\/*jshint maxcomplexity:25*\/\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\t$( event.target ).addClass( \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this.options.values && this.options.values.length ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) \/ numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) \/ numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tclick: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\t$( event.target ).removeClass( \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n\n});\n\n}(jQuery));\n\n(function( $ ) {\n\nfunction modifier( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.10.2\",\n\tdefaultElement: \"<input>\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\t\t\/\/ handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t\/\/ format the value, but don't constrain\n\t\tthis._value( this.element.val(), true );\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t\/\/ turning off autocomplete prevents the browser from remembering the\n\t\t\/\/ value when navigating through history, so we re-enable autocomplete\n\t\t\/\/ if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = {},\n\t\t\telement = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value !== undefined && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( (delta > 0 ? 1 : -1) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay(function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t\/\/ We never want the buttons to have focus; whenever the user is\n\t\t\t\/\/ interacting with the spinner, the focus should be on the input.\n\t\t\t\/\/ If the input is focused then this.previous is properly set from\n\t\t\t\/\/ when the input first received focus. If the input is not focused\n\t\t\t\/\/ then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[0] === this.document[0].activeElement ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[0] === this.document[0].activeElement;\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\/\/ support: IE\n\t\t\t\t\t\/\/ IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t\/\/ moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay(function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\/\/ ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t\/\/ support: IE\n\t\t\t\/\/ IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t\/\/ so we set a flag to know when we should ignore the blur event\n\t\t\t\/\/ and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay(function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t});\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\t\t\t\/\/ button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\/\/ TODO: do we really want to consider this a stop?\n\t\t\/\/ shouldn't we just stop the repeater and wait until mouseup before\n\t\t\/\/ we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t_draw: function() {\n\t\tvar uiSpinner = this.uiSpinner = this.element\n\t\t\t.addClass( \"ui-spinner-input\" )\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t.parent()\n\t\t\t\t\/\/ add buttons\n\t\t\t\t.append( this._buttonHtml() );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t\/\/ button bindings\n\t\tthis.buttons = uiSpinner.find( \".ui-spinner-button\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.button()\n\t\t\t.removeClass( \"ui-corner-all\" );\n\n\t\t\/\/ IE 6 doesn't understand height: 50% for the buttons\n\t\t\/\/ unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&\n\t\t\t\tuiSpinner.height() > 0 ) {\n\t\t\tuiSpinner.height( uiSpinner.height() );\n\t\t}\n\n\t\t\/\/ disable spinner if element was already disabled\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.disable();\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_uiSpinnerHtml: function() {\n\t\treturn \"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'><\/span>\";\n\t},\n\n\t_buttonHtml: function() {\n\t\treturn \"\" +\n\t\t\t\"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>\" +\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.up + \"'>&#9650;<\/span>\" +\n\t\t\t\"<\/a>\" +\n\t\t\t\"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>\" +\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.down + \"'>&#9660;<\/span>\" +\n\t\t\t\"<\/a>\";\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay(function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i*i*i\/50000 - i*i\/500 + 17*i\/200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t\/\/ make sure we're at a valid step\n\t\t\/\/ - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\t\t\/\/ - round to the nearest step\n\t\taboveMin = Math.round(aboveMin \/ options.step) * options.step;\n\t\t\/\/ - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t\/\/ fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t\/\/ clamp the value\n\t\tif ( options.max !== null && value > options.max) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tvar prevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis.buttons.first().find( \".ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.up )\n\t\t\t\t.addClass( value.up );\n\t\t\tthis.buttons.last().find( \".ui-icon\" )\n\t\t\t\t.removeClass( this.options.icons.down )\n\t\t\t\t.addClass( value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tif ( value ) {\n\t\t\t\tthis.element.prop( \"disabled\", true );\n\t\t\t\tthis.buttons.button( \"disable\" );\n\t\t\t} else {\n\t\t\t\tthis.element.prop( \"disabled\", false );\n\t\t\t\tthis.buttons.button( \"enable\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_setOptions: modifier(function( options ) {\n\t\tthis._super( options );\n\t\tthis._value( this.element.val() );\n\t}),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr({\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\/\/ TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t});\n\t},\n\n\t\/\/ update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass( \"ui-spinner-input\" )\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"aria-valuemin\" )\n\t\t\t.removeAttr( \"aria-valuemax\" )\n\t\t\t.removeAttr( \"aria-valuenow\" );\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: modifier(function( steps ) {\n\t\tthis._stepUp( steps );\n\t}),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( (steps || 1) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: modifier(function( steps ) {\n\t\tthis._stepDown( steps );\n\t}),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( (steps || 1) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: modifier(function( pages ) {\n\t\tthis._stepUp( (pages || 1) * this.options.page );\n\t}),\n\n\tpageDown: modifier(function( pages ) {\n\t\tthis._stepDown( (pages || 1) * this.options.page );\n\t}),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tmodifier( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n});\n\n}( jQuery ) );\n\n(function( $, undefined ) {\n\nvar tabId = 0,\n\trhash = \/#.*$\/;\n\nfunction getNextTabId() {\n\treturn ++tabId;\n}\n\nfunction isLocal( anchor ) {\n\treturn anchor.hash.length > 1 &&\n\t\tdecodeURIComponent( anchor.href.replace( rhash, \"\" ) ) ===\n\t\t\tdecodeURIComponent( location.href.replace( rhash, \"\" ) );\n}\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.10.2\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t\/\/ callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.toggleClass( \"ui-tabs-collapsible\", options.collapsible )\n\t\t\t\/\/ Prevent users from focusing disabled tabs via click\n\t\t\t.delegate( \".ui-tabs-nav > li\", \"mousedown\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t})\n\t\t\t\/\/ support: IE <9\n\t\t\t\/\/ Preventing the default action in mousedown doesn't prevent IE\n\t\t\t\/\/ from focusing the element, so if the anchor gets focused, blur.\n\t\t\t\/\/ We don't have to worry about focusing the previously focused\n\t\t\t\/\/ element since clicking on a non-focusable element should focus\n\t\t\t\/\/ the body anyway.\n\t\t\t.delegate( \".ui-tabs-anchor\", \"focus\" + this.eventNamespace, function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t\/\/ Take disabling tabs via class attribute from HTML\n\t\t\/\/ into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t})\n\t\t\t) ).sort();\n\t\t}\n\n\t\t\/\/ check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\t\t\t\/\/ check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each(function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t\/\/ check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t\/\/ no active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t\/\/ handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t\/\/ don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\t\/*jshint maxcomplexity:15*\/\n\t\tvar focusedTab = $( this.document[0].activeElement ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tselectedIndex++;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tgoingForward = false;\n\t\t\t\tselectedIndex--;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tselectedIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\t\/\/ Activate only, no collapsing\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\tthis._activate( selectedIndex );\n\t\t\t\treturn;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t\/\/ Toggle (cancel delayed activation, allow collapsing)\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\t\/\/ Determine if we should collapse or activate\n\t\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\t\/\/ Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t\/\/ Navigating with control key will prevent automatic activation\n\t\tif ( !event.ctrlKey ) {\n\t\t\t\/\/ Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t\/\/ Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t\/\/ but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay(function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.focus();\n\t\t}\n\t},\n\n\t\/\/ Alt+page up\/down moves focus to the previous\/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).focus();\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t\/\/ _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\t\/\/ don't use the widget factory's disabled handling\n\t\t\tthis._setupDisabled( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value);\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis.element.toggleClass( \"ui-tabs-collapsible\", value );\n\t\t\t\/\/ Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_tabId: function( tab ) {\n\t\treturn tab.attr( \"aria-controls\" ) || \"ui-tabs-\" + getNextTabId();\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( \/[!\"$%&'()*+,.\\\/:;<=>?@\\[\\]\\^`{|}~]\/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t\/\/ get disabled tabs from class attribute from HTML\n\t\t\/\/ this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t});\n\n\t\tthis._processTabs();\n\n\t\t\/\/ was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t\/\/ was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t\/\/ all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t\/\/ activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\t\t\/\/ was active, active tab still exists\n\t\t} else {\n\t\t\t\/\/ make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setupDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\ttabIndex: -1\n\t\t});\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t});\n\n\t\t\/\/ Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.addClass( \"ui-tabs-active ui-state-active\" )\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this;\n\n\t\tthis.tablist = this._getList()\n\t\t\t.addClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.attr( \"role\", \"tablist\" );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.addClass( \"ui-state-default ui-corner-top\" )\n\t\t\t.attr({\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.anchors = this.tabs.map(function() {\n\t\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t\t})\n\t\t\t.addClass( \"ui-tabs-anchor\" )\n\t\t\t.attr({\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each(function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t\/\/ inline tab\n\t\t\tif ( isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\t\t\t\/\/ remote tab\n\t\t\t} else {\n\t\t\t\tpanelId = that._tabId( tab );\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr({\n\t\t\t\t\"aria-controls\": selector.substring( 1 ),\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t});\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t});\n\n\t\tthis.panels\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.attr( \"role\", \"tabpanel\" );\n\t},\n\n\t\/\/ allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.element.find( \"ol,ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setupDisabled: function( disabled ) {\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t\/\/ disable tabs\n\t\tfor ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\t$( li )\n\t\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t\t} else {\n\t\t\t\t$( li )\n\t\t\t\t\t.removeClass( \"ui-state-disabled\" )\n\t\t\t\t\t.removeAttr( \"aria-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split(\" \"), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.element.children().not( this.panels ).each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.panels.each(function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t})\n\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each(function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t}).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\t\t\t\t\/\/ tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\t\t\t\t\/\/ can't switch durning an animation\n\t\t\t\tthis.running ||\n\t\t\t\t\/\/ click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t\/\/ allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t\/\/ handles show\/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\teventData.newTab.closest( \"li\" ).addClass( \"ui-tabs-active ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t\/\/ start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t});\n\t\t} else {\n\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr({\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-hidden\": \"true\"\n\t\t});\n\t\teventData.oldTab.attr( \"aria-selected\", \"false\" );\n\t\t\/\/ If we're switching tabs, remove the old tab from the tab order.\n\t\t\/\/ If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t\/\/ If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter(function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr({\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\"aria-hidden\": \"false\"\n\t\t});\n\t\teventData.newTab.attr({\n\t\t\t\"aria-selected\": \"true\",\n\t\t\ttabIndex: 0\n\t\t});\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t\/\/ trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler({\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\t\t\/\/ meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" + index + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.element.removeClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\" );\n\n\t\tthis.tablist\n\t\t\t.removeClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\tthis.anchors\n\t\t\t.removeClass( \"ui-tabs-anchor\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each(function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this )\n\t\t\t\t\t.removeClass( \"ui-state-default ui-state-active ui-state-disabled \" +\n\t\t\t\t\t\t\"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\" )\n\t\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t\t.removeAttr( \"aria-live\" )\n\t\t\t\t\t.removeAttr( \"aria-busy\" )\n\t\t\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t\t.removeAttr( \"role\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.tabs.each(function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t};\n\n\t\t\/\/ not remote\n\t\tif ( isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t\/\/ support: jQuery <1.8\n\t\t\/\/ jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t\/\/ but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\ttab.addClass( \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.success(function( response ) {\n\t\t\t\t\t\/\/ support: jQuery <1.8\n\t\t\t\t\t\/\/ http:\/\/bugs.jquery.com\/ticket\/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\t\t\t\t\t}, 1 );\n\t\t\t\t})\n\t\t\t\t.complete(function( jqXHR, status ) {\n\t\t\t\t\t\/\/ support: jQuery <1.8\n\t\t\t\t\t\/\/ http:\/\/bugs.jquery.com\/ticket\/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttab.removeClass( \"ui-tabs-loading\" );\n\t\t\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\t\t\tdelete that.xhr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 1 );\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\t\t\turl: anchor.attr( \"href\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n});\n\n})( jQuery );\n\n(function( $ ) {\n\nvar increments = 0;\n\nfunction addDescribedBy( elem, id ) {\n\tvar describedby = (elem.attr( \"aria-describedby\" ) || \"\").split( \/\\s+\/ );\n\tdescribedby.push( id );\n\telem\n\t\t.data( \"ui-tooltip-id\", id )\n\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n}\n\nfunction removeDescribedBy( elem ) {\n\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\tdescribedby = (elem.attr( \"aria-describedby\" ) || \"\").split( \/\\s+\/ ),\n\t\tindex = $.inArray( id, describedby );\n\tif ( index !== -1 ) {\n\t\tdescribedby.splice( index, 1 );\n\t}\n\n\telem.removeData( \"ui-tooltip-id\" );\n\tdescribedby = $.trim( describedby.join( \" \" ) );\n\tif ( describedby ) {\n\t\telem.attr( \"aria-describedby\", describedby );\n\t} else {\n\t\telem.removeAttr( \"aria-describedby\" );\n\t}\n}\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.10.2\",\n\toptions: {\n\t\tcontent: function() {\n\t\t\t\/\/ support: IE<9, Opera in jQuery <1.7\n\t\t\t\/\/ .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\t\t\t\/\/ Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"<a>\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\t\t\/\/ Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttooltipClass: null,\n\t\ttrack: false,\n\n\t\t\/\/ callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_create: function() {\n\t\tthis._on({\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t});\n\n\t\t\/\/ IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\t\t\/\/ IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._disable();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t\t\tthis.options[ key ] = value;\n\t\t\t\/\/ disable element style changes\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, element ) {\n\t\t\t\tthat._updateContent( element );\n\t\t\t});\n\t\t}\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t\/\/ close open tooltips\n\t\t$.each( this.tooltips, function( id, element ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = element[0];\n\t\t\tthat.close( event, true );\n\t\t});\n\n\t\t\/\/ remove title attributes to prevent native tooltips\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\telement\n\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t.attr( \"title\", \"\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_enable: function() {\n\t\t\/\/ restore title attributes\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t});\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\t\t\t\t\/\/ we need closest here due to mouseover bubbling,\n\t\t\t\t\/\/ but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t\/\/ No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t\/\/ kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each(function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[0], function( response ) {\n\t\t\t\/\/ ignore async response if tooltip was closed already\n\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\/\/ IE may instantly serve a cached response for ajax requests\n\t\t\t\/\/ delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay(function() {\n\t\t\t\t\/\/ jQuery creates a special event for focusin when it doesn't\n\t\t\t\t\/\/ exist natively. To improve performance, the native event\n\t\t\t\t\/\/ object is reused and the type is changed. Therefore, we can't\n\t\t\t\t\/\/ rely on the type being correct after the event finished\n\t\t\t\t\/\/ bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t});\n\t\t});\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltip, events, delayedShow,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ Content can be updated multiple times. If the tooltip already\n\t\t\/\/ exists, then just update the content and bail.\n\t\ttooltip = this._find( target );\n\t\tif ( tooltip.length ) {\n\t\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ if we have a title, clear it to prevent the native tooltip\n\t\t\/\/ we have to check first to avoid defining a title if none exists\n\t\t\/\/ (we don't want to cause an element to start matching [title])\n\t\t\/\/\n\t\t\/\/ We use removeAttr only for key events, to allow IE to export the correct\n\t\t\/\/ accessible attributes. For mouse events, set to empty string to avoid\n\t\t\/\/ native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltip = this._tooltip( target );\n\t\taddDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && \/^mouse\/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t});\n\t\t\t\/\/ trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend({\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\t\t\/\/ Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t\/\/ as the tooltip is visible, position the tooltip using the most recent\n\t\t\/\/ event.\n\t\tif ( this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval(function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\n\t\tevents = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event(event);\n\t\t\t\t\tfakeEvent.currentTarget = target[0];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tremove: function() {\n\t\t\t\tthis._removeTooltip( tooltip );\n\t\t\t}\n\t\t};\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltip = this._find( target );\n\n\t\t\/\/ disabling closes the tooltip, so we need to track when we're closing\n\t\t\/\/ to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( this.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t\/\/ only set title if we had one before (see comment in _open())\n\t\tif ( target.data( \"ui-tooltip-title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tremoveDescribedBy( target );\n\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t});\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\t\t\/\/ Remove 'remove' binding only on delegated targets\n\t\tif ( target[0] !== this.element[0] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t});\n\t\t}\n\n\t\tthis.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tthis.closing = false;\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar id = \"ui-tooltip-\" + increments++,\n\t\t\ttooltip = $( \"<div>\" )\n\t\t\t\t.attr({\n\t\t\t\t\tid: id,\n\t\t\t\t\trole: \"tooltip\"\n\t\t\t\t})\n\t\t\t\t.addClass( \"ui-tooltip ui-widget ui-corner-all ui-widget-content \" +\n\t\t\t\t\t( this.options.tooltipClass || \"\" ) );\n\t\t$( \"<div>\" )\n\t\t\t.addClass( \"ui-tooltip-content\" )\n\t\t\t.appendTo( tooltip );\n\t\ttooltip.appendTo( this.document[0].body );\n\t\tthis.tooltips[ id ] = element;\n\t\treturn tooltip;\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? $( \"#\" + id ) : $();\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t\/\/ close open tooltips\n\t\t$.each( this.tooltips, function( id, element ) {\n\t\t\t\/\/ Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = element[0];\n\t\t\tthat.close( event, true );\n\n\t\t\t\/\/ Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t\/\/ hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t\/\/ Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n}( jQuery ) );\n\n\/*!\n * jQuery UI Touch Punch 0.2.2\n *\n * Copyright 2011, Dave Furfero\n * Dual licensed under the MIT or GPL Version 2 licenses.\n *\n * Depends:\n *  jquery.ui.widget.js\n *  jquery.ui.mouse.js\n *\/\n(function ($) {\n\n  \/\/ Detect touch support\n  $.support.touch = 'ontouchend' in document;\n\n  \/\/ Ignore browsers without touch support\n  if (!$.support.touch) {\n    return;\n  }\n\n  var mouseProto = $.ui.mouse.prototype,\n      _mouseInit = mouseProto._mouseInit,\n      touchHandled;\n\n  \/**\n   * Simulate a mouse event based on a corresponding touch event\n   * @param {Object} event A touch event\n   * @param {String} simulatedType The corresponding mouse event\n   *\/\n  function simulateMouseEvent (event, simulatedType) {\n\n    \/\/ Ignore multi-touch events\n    if (event.originalEvent.touches.length > 1) {\n      return;\n    }\n\n    event.preventDefault();\n\n    var touch = event.originalEvent.changedTouches[0],\n        simulatedEvent = document.createEvent('MouseEvents');\n\n    \/\/ Initialize the simulated mouse event using the touch event's coordinates\n    simulatedEvent.initMouseEvent(\n      simulatedType,    \/\/ type\n      true,             \/\/ bubbles\n      true,             \/\/ cancelable\n      window,           \/\/ view\n      1,                \/\/ detail\n      touch.screenX,    \/\/ screenX\n      touch.screenY,    \/\/ screenY\n      touch.clientX,    \/\/ clientX\n      touch.clientY,    \/\/ clientY\n      false,            \/\/ ctrlKey\n      false,            \/\/ altKey\n      false,            \/\/ shiftKey\n      false,            \/\/ metaKey\n      0,                \/\/ button\n      null              \/\/ relatedTarget\n    );\n\n    \/\/ Dispatch the simulated event to the target element\n    event.target.dispatchEvent(simulatedEvent);\n  }\n\n  \/**\n   * Handle the jQuery UI widget's touchstart events\n   * @param {Object} event The widget element's touchstart event\n   *\/\n  mouseProto._touchStart = function (event) {\n\n    var self = this;\n\n    \/\/ Ignore the event if another widget is already being handled\n    if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {\n      return;\n    }\n\n    \/\/ Set the flag to prevent other widgets from inheriting the touch event\n    touchHandled = true;\n\n    \/\/ Track movement to determine if interaction was a click\n    self._touchMoved = false;\n\n    \/\/ Simulate the mouseover event\n    simulateMouseEvent(event, 'mouseover');\n\n    \/\/ Simulate the mousemove event\n    simulateMouseEvent(event, 'mousemove');\n\n    \/\/ Simulate the mousedown event\n    simulateMouseEvent(event, 'mousedown');\n  };\n\n  \/**\n   * Handle the jQuery UI widget's touchmove events\n   * @param {Object} event The document's touchmove event\n   *\/\n  mouseProto._touchMove = function (event) {\n\n    \/\/ Ignore event if not handled\n    if (!touchHandled) {\n      return;\n    }\n\n    \/\/ Interaction was not a click\n    this._touchMoved = true;\n\n    \/\/ Simulate the mousemove event\n    simulateMouseEvent(event, 'mousemove');\n\n    event.stopPropagation();\n  };\n\n  \/**\n   * Handle the jQuery UI widget's touchend events\n   * @param {Object} event The document's touchend event\n   *\/\n  mouseProto._touchEnd = function (event) {\n\n    \/\/ Ignore event if not handled\n    if (!touchHandled) {\n      return;\n    }\n\n    \/\/ Simulate the mouseup event\n    simulateMouseEvent(event, 'mouseup');\n\n    \/\/ Simulate the mouseout event\n    simulateMouseEvent(event, 'mouseout');\n\n    \/\/ If the touch interaction did not move, it should trigger a click\n    if (!this._touchMoved) {\n\n      \/\/ Simulate the click event\n      simulateMouseEvent(event, 'click');\n    }\n\n    \/\/ Unset the flag to allow other widgets to inherit the touch event\n    touchHandled = false;\n  };\n\n  \/**\n   * A duck punch of the $.ui.mouse _mouseInit method to support touch events.\n   * This method extends the widget with bound touch event handlers that\n   * translate touch events to mouse events and pass them to the widget's\n   * original mouse event handling methods.\n   *\/\n  mouseProto._mouseInit = function () {\n\n    var self = this;\n\n    \/\/ Delegate the touch handlers to the widget's element\n    self.element\n      .bind('touchstart', $.proxy(self, '_touchStart'))\n      .bind('touchmove', $.proxy(self, '_touchMove'))\n      .bind('touchend', $.proxy(self, '_touchEnd'));\n\n    \/\/ Call the original $.ui.mouse init method\n    _mouseInit.call(self);\n  };\n})(jQuery);\n\n(function ($) {\n  \/\/ This is a hack to make stuff like ckeditor work inside modal dialogs. Since ckeditor dialogs are placed on body and not in the ui.dialog's DOM. See http:\/\/bugs.jqueryui.com\/ticket\/9087\n  $.widget(\"ui.dialog\", $.ui.dialog, {\n    _allowInteraction: function (event) {\n      return true;\n    }\n  });\n\n  $.ui.dialog.prototype._focusTabbable = function () {};\n})(jQuery);\n\njQuery = oldJQuery;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.Wizard-1.2\/Scripts\/Wizard.js?ver=1.2.2":"\nvar H5PEditor = H5PEditor || {};\n\n\/**\n * Wizard editor widget module\n *\n * @param {jQuery} $\n *\/\nH5PEditor.widgets.wizard = H5PEditor.Wizard = (function ($, EventDispatcher) {\n\n  \/**\n   * Initialize wizard editor.\n   *\n   * @param {mixed} parent\n   * @param {Object} field\n   * @param {mixed} params\n   * @param {function} setValue\n   * @returns {_L8.C}\n   *\/\n  function C(parent, field, params, setValue) {\n    var that = this;\n\n    \/\/ Event support\n    H5P.EventDispatcher.call(that);\n\n    this.parent = parent;\n    this.field = field;\n    this.params = params;\n    this.setValue = setValue;\n    this.library = parent.library + '\/' + field.name;\n    this.children = [];\n\n    this.passReadies = true;\n    parent.ready(function () {\n      that.passReadies = false;\n    });\n  }\n\n  \/\/ Inheritance\n  C.prototype = Object.create(EventDispatcher.prototype);\n  C.prototype.constructor = C;\n\n  \/**\n   * Append field to wrapper.\n   *\n   * @param {jQuery} $wrapper\n   * @returns {undefined}\n   *\/\n  C.prototype.appendTo = function ($wrapper) {\n    var that = this;\n    this.$item = $(this.createHtml()).appendTo($wrapper);\n    this.$errors = this.$item.children('.h5p-errors');\n    var $panesWrapper = $('<div class=\"h5peditor-panes\"><\/div>').insertBefore(this.$errors);\n\n    if (this.params === undefined) {\n      this.params = {};\n      this.setValue(this.field, this.params);\n    }\n    H5PEditor.processSemanticsChunk(this.field.fields, this.params, $panesWrapper, this);\n\n    this.$panes = $panesWrapper.children();\n    this.$tabs = this.$item.find('ol > li > a').click(function () {\n      that.showTab($(this));\n      return false;\n    });\n\n    this.$panes.children('.h5peditor-label').hide();\n\n    \/\/ Make sure first tab is selected as default\n    this.$tabs.eq(0).click();\n\n    \/\/ Create wizard navigation buttons and attach events\n    var $prevButton = this.$item.find('.nav-button-prev').click(function () {\n      var currentTabId = that.$item.find('.h5peditor-active').attr('data-id');\n      that.showTab(that.$item.find('ol > li > a').eq(parseInt(currentTabId) - 1));\n    });\n\n    var $nextButton = this.$item.find('.nav-button-next').click(function () {\n      var currentTabId = that.$item.find('.h5peditor-active').attr('data-id');\n      that.showTab(that.$item.find('ol > li > a').eq(parseInt(currentTabId) + 1));\n    });\n\n    \/\/ Create wizard navigation wrapper and attach buttons\n    var $navButtonsWrapper = $('<div class=\"h5peditor-wizard-navigation-buttons\"><\/div>')\n      .append($prevButton)\n      .append($nextButton)\n      .appendTo(this.$item);\n  };\n\n  \/**\n   * Update the wizard navigation\n\n   * @param {jQuery} $tab\n   * @param {String} currentTabId\n   *\/\n  C.prototype.updateWizardNavigation = function ($tab, currentTabId) {\n    currentTabId = parseInt(currentTabId, 10);\n    var $prevButton = this.$item.find('.nav-button-prev');\n    var $nextButton = this.$item.find('.nav-button-next');\n\n    \/\/ If there is a previous tab, update navigation prev button\n    if (currentTabId > 0) {\n      var $prevTab = this.$tabs.eq(currentTabId - 1);\n\n      \/\/ Get the specific classname of the previous tab to mimic icon for navigation button\n      var prevTabClasses = $prevTab.attr('class').split(' ').filter(function (className) {\n        return (className.match(\/h5peditor-tab-[a-zA-z]{2,}\/i) !== null);\n      })[0];\n\n      this.$item.find('.nav-button-prev .nav-button-label')\n        .attr('class', 'nav-button-label ' + prevTabClasses)\n        .text($prevTab.find('.field-name').text());\n\n      $prevButton.show();\n    }\n    else {\n      $prevButton.hide();\n    }\n\n    \/\/ If there is a next tab, update navigation next button\n    if (currentTabId < this.$tabs.length - 1) {\n      var $nextTab = this.$tabs.eq(currentTabId + 1);\n\n      \/\/ Get the specific classname of the next tab to mimic icon for navigation button\n      var nextTabClasses = $nextTab.attr('class').split(' ').filter(function (className) {\n        return (className.match(\/h5peditor-tab-[a-zA-z]{2,}\/i) !== null);\n      })[0];\n\n      this.$item.find('.nav-button-next .nav-button-label')\n        .attr('class', 'nav-button-label ' + nextTabClasses)\n        .text($nextTab.find('.field-name').text());\n\n      $nextButton.show();\n    }\n    else {\n      $nextButton.hide();\n    }\n  };\n\n  \/**\n   * Create HTML for the field.\n   *\/\n  C.prototype.createHtml = function () {\n    \/\/ Create wizard tabs\n    var html = '<ol class=\"h5peditor-tabs\">';\n    for (var i = 0; i < this.field.fields.length; i++) {\n      var field = this.field.fields[i];\n      html += C.createTab(i, field);\n    }\n    html += '<\/ol>';\n\n    \/\/ Create wizard navigation buttons\n    html += '<div class=\"nav-button-prev\">' +\n              '<span class=\"nav-button-icon\"><\/span>' +\n              '<div>' +\n                '<span>' + C.t('previousStep') + '<\/span>' +\n                '<span class=\"nav-button-label\">' + this.field.fields[0].label + '<\/span>' +\n              '<\/div>' +\n            '<\/div>' +\n            '<div class=\"nav-button-next\">' +\n              '<div>' +\n                '<span>' + C.t('nextStep') + '<\/span>' +\n                '<span class=\"nav-button-label\">' + this.field.fields[1].label + '<\/span>' +\n              '<\/div>' +\n              '<span class=\"nav-button-icon\"><\/span>' +\n            '<\/div>';\n\n    return H5PEditor.createFieldMarkup(this.field, html);\n  };\n\n  \/**\n   * Display tab.\n   *\n   * @param {jQuery} $tab\n   * @returns {undefined}\n   *\/\n  C.prototype.showTab = function ($tab) {\n    var id = $tab.attr('data-id');\n    this.$panes.hide().eq(id).show();\n    this.$tabs.removeClass('h5peditor-active');\n    $tab.addClass('h5peditor-active');\n\n    \/\/ Update wizard navigation to sync with tabs\n    this.updateWizardNavigation($tab, id);\n\n    \/\/ Give the poor child a chance to handle tab switching.\n    if (this.children[id].setActive !== undefined) {\n      this.children[id].setActive();\n    }\n\n    this.trigger('stepChanged', {\n      id: parseInt(id),\n      name: this.field.fields[id].name\n    });\n  };\n\n  \/**\n   * Validate the current field.\n   *\n   * @returns {Boolean}\n   *\/\n  C.prototype.validate = function () {\n    for (var i = 0; i < this.children.length; i++) {\n      if (!this.children[i].validate()) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n\n  \/**\n   * Local translate function.\n   *\n   * @param {Atring} key\n   * @param {Object} params\n   * @returns {@exp;H5PEditor@call;t}\n   *\/\n  C.t = function (key, params) {\n    return H5PEditor.t('H5PEditor.Wizard', key, params);\n  };\n\n  \/**\n   * Collect functions to execute once the tree is complete.\n   *\n   * @param {function} ready\n   * @returns {undefined}\n   *\/\n  C.prototype.ready = function (ready) {\n    if (this.passReadies) {\n      this.parent.ready(ready);\n    }\n    else {\n      this.readies.push(ready);\n    }\n  };\n\n  \/**\n   * Remove this item.\n   *\/\n  C.prototype.remove = function () {\n    H5PEditor.removeChildren(this.children);\n    this.$item.remove();\n  };\n\n  \/**\n   * Create HTML for a tab.\n   *\n   * @param {type} id\n   * @param {type} label\n   * @returns {String}\n   *\/\n  C.createTab = function (id, field) {\n    return '<li class=\"h5peditor-tab-li\"><a href=\"#\" class=\"h5peditor-tab-a h5peditor-tab-' + field.name.toLowerCase() + '\" data-id=\"' + id + '\">' +\n      '<span class=\"field-step\">' + C.t('step', { ':index': id + 1 }) + '<\/span>' +\n      '<span class=\"field-name\">' + field.label + '<\/span>' +\n    '<\/a><\/li>';\n  };\n\n  return C;\n})(H5P.jQuery, H5P.EventDispatcher);\n\n\/\/ Default english translations\nH5PEditor.language['H5PEditor.Wizard'] = {\n  libraryStrings: {\n    previousStep: 'Previous Step',\n    nextStep: 'Next Step',\n    step: 'Step :index'\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.DragQuestion-1.9\/H5PEditor.DragQuestion.js?ver=1.9.2":"\n\/*global H5P*\/\nvar H5PEditor = H5PEditor || {};\n\n\/**\n * Interactive Video editor widget module\n * TODO: Rewrite to use H5P.DragQuestion for previewing?\n\n * @param {jQuery} $\n *\/\nH5PEditor.widgets.dragQuestion = H5PEditor.DragQuestion = (function ($, DragNBar) {\n  \/**\n   * Must be changed if the semantics for the elements changes.\n   * @\u03c0vate\n   * @type {string}\n   *\/\n  var clipboardKey = 'H5PEditor.DragQuestion';\n\n  \/**\n   * Initialize interactive video editor.\n   *\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   *\/\n  function C(parent, field, params, setValue) {\n    var that = this;\n\n    this.parent = parent;\n\n    \/\/ Set params\n    this.params = $.extend({\n      elements: [],\n      dropZones: []\n    }, params);\n    setValue(field, this.params);\n\n    \/\/ Get updates for fields\n    H5PEditor.followField(parent, 'settings\/background', function (params) {\n      that.setBackground(params);\n    });\n    H5PEditor.followField(parent, 'settings\/size', function (params) {\n      that.setSize(params);\n    });\n\n    \/\/ Need the override background opacity\n    this.backgroundOpacity = parent.parent.params.backgroundOpacity;\n    this.backgroundOpacity = (this.backgroundOpacity === undefined || this.backgroundOpacity.trim() === '') ? undefined : this.backgroundOpacity;\n\n    \/\/ Update opacity for all dropzones\/draggables when global background opacity is changed\n    parent.ready(function () {\n      H5PEditor.findField('..\/behaviour\/backgroundOpacity', parent).$item.find('input').on('change', function () {\n        that.backgroundOpacity = $(this).val().trim();\n        that.backgroundOpacity = (that.backgroundOpacity === '') ? undefined : that.backgroundOpacity;\n        that.updateAllElementsOpacity(that.elements, that.params.elements, 'element');\n      });\n    });\n\n    \/\/ Get options from semantics, clone since we'll be changing values.\n    this.elementFields = H5P.cloneObject(field.fields[0].field.fields, true);\n    this.dropZoneFields = H5P.cloneObject(field.fields[1].field.fields, true);\n    this.elementLibraryOptions = this.elementFields[0].options;\n    this.elementDropZoneFieldWeight = 5;\n    this.elementFields[this.elementDropZoneFieldWeight].options = [];\n    this.dropZoneElementFieldWeight = 6;\n    this.elementOptions = [];\n\n    this.parent = parent;\n    this.field = field;\n\n    this.passReadies = true;\n    parent.ready(function () {\n      that.passReadies = false;\n    });\n\n    H5P.$window.on('resize', function () {\n      if (that.size !== undefined && that.size.width !== undefined) {\n        that.resize();\n      }\n    });\n  }\n\n  \/**\n   * Append field to wrapper.\n   *\n   * @param {jQuery} $wrapper\n   * @returns {undefined}\n   *\/\n  C.prototype.appendTo = function ($wrapper) {\n    var that = this;\n\n    this.$item = $(this.createHtml()).appendTo($wrapper);\n    this.$editor = this.$item.children('.h5peditor-dragquestion');\n    this.$dnbWrapper = this.$item.children('.h5peditor-dragnbar');\n    this.$dialog = this.$item.children('.h5peditor-fluid-dialog');\n    this.$dialogInner = this.$dialog.children('.h5peditor-fd-inner');\n    this.$errors = this.$item.children('.h5p-errors');\n\n    \/\/ Handle click events for dialog buttons.\n    this.$dialog.find('.h5peditor-done').click(function () {\n      if (that.doneCallback() !== false) {\n        that.hideDialog();\n      }\n      return false;\n    }).end().find('.h5peditor-remove').click(function () {\n      if (confirm(C.t('confirmRemoval'))) {\n        that.removeCallback();\n        that.hideDialog();\n      }\n      return false;\n    });\n  };\n\n  \/**\n   * Create HTML for the field.\n   *\n   * @returns {String}\n   *\/\n  C.prototype.createHtml = function () {\n    var html = '';\n    if (this.field.label !== 0) {\n      html += '<span class=\"h5peditor-label\">' + this.field.label + '<\/span>';\n    }\n\n    html += '<div class=\"h5peditor-dragnbar\"><\/div>' +\n      '<div class=\"h5peditor-dragquestion\">' + C.t('noTaskSize') + '<\/div>' +\n      '<div class=\"h5peditor-fluid-dialog\">' +\n      '  <div class=\"h5peditor-fd-inner\"><\/div>' +\n      '  <div class=\"h5peditor-fd-buttons\">' +\n      '    <a href=\"#\" class=\"h5peditor-fd-button h5peditor-done\">' + C.t('done') + '<\/a>' +\n      '    <a href=\"#\" class=\"h5peditor-fd-button h5peditor-remove\">' + C.t('remove') + '<\/a>' +\n      '  <\/div>' +\n      '<\/div>';\n\n    if (this.field.description !== undefined) {\n      html += '<div class=\"h5peditor-field-description\">' + this.field.description + '<\/div>';\n    }\n\n    \/\/ removes the description field, so it's not re-rendered on top\n    var field = this.removeAttribute(this.field, 'description');\n\n    return H5PEditor.createFieldMarkup(field, html);\n  };\n\n  \/**\n   * Clones an object, and removes an attribute\n   *\n   * @param {object} obj\n   * @param {string} attributeName\n   *\n   * @return {object}\n   *\/\n  C.prototype.removeAttribute = function (obj, attributeName) {\n    var result = H5P.cloneObject(obj);\n    result[attributeName] = undefined;\n    return result;\n  };\n\n  \/**\n   * Set current background.\n   *\n   * @param {Object} params\n   * @returns {undefined}\n   *\/\n  C.prototype.setBackground = function (params) {\n    var path = params === undefined ? '' : params.path;\n    if (path !== '') {\n      \/\/ Add correct base path\n      path = 'url(\"' + H5P.getPath(path, H5PEditor.contentId) + '\")';\n    }\n\n    this.$editor.css({\n      backgroundImage: path\n    });\n  };\n\n  \/**\n   * Set current dimensions.\n   *\n   * @param {Object} params\n   * @returns {undefined}\n   *\/\n  C.prototype.setSize = function (params) {\n    this.size = params;\n  };\n\n  \/**\n   * Apply new size to task editor once visible.\n   *\n   * @returns {undefined}\n   *\/\n  C.prototype.setActive = function () {\n    var that = this;\n    if (this.size === undefined || this.size.width === undefined) {\n      return;\n    }\n\n    if (this.dnb === undefined) {\n      this.$editor.html('<div class=\"h5p-throbber\">' + H5PEditor.t('core', 'loading') + '<\/div>')\n        .addClass('h5p-ready');\n      this.resize();\n      H5PEditor.LibraryListCache.getLibraries(this.elementLibraryOptions, function (libraries) {\n        \/\/ Prevents duplicate loading\n        if (this.dnb === undefined) {\n          that.activateEditor(libraries);\n        }\n      });\n    }\n  };\n\n  \/**\n   * Adapt the editor when the window changes size.\n   *\/\n  C.prototype.resize = function () {\n    if (!this.$editor.is(':visible')) {\n      return;\n    }\n    if (this.fontSize === undefined) {\n      \/\/ Get editor default font size.\n      this.fontSize = parseInt(this.$editor.css('fontSize'));\n    }\n\n    var maxWidth = this.$item.width();\n    var editorCss;\n    if (this.size.width < maxWidth) {\n      editorCss = {\n        width: this.size.width,\n        height: this.size.height,\n        fontSize: this.fontSize\n      };\n      this.$dnbWrapper.css({\n        width: this.size.width\n      });\n    }\n    else {\n      editorCss = {\n        width: '100%',\n        height: maxWidth * (this.size.height \/ this.size.width),\n        fontSize: this.fontSize * (maxWidth \/ this.size.width)\n      };\n      this.$dnbWrapper.css({\n        width: '100%'\n      });\n    }\n\n    this.$editor.css(editorCss);\n    if (this.dnb !== undefined) {\n      this.dnb.dnr.setContainerEm(editorCss.fontSize);\n    }\n\n    this.pToEm = (parseFloat(window.getComputedStyle(this.$editor[0]).width) \/ this.fontSize) \/ 100;\n  };\n\n  \/**\n   * Activate DragNBar and add elements.\n   *\n   * @returns {undefined}\n   *\/\n  C.prototype.activateEditor = function (libraries) {\n    var that = this;\n    this.$editor.html('').addClass('h5p-ready');\n\n    \/\/ Create new bar\n    this.dnb = new DragNBar(this.getButtons(libraries), this.$editor, this.$item);\n    that.dnb.dnr.snap = 10;\n\n    \/\/ Add event handling\n    this.dnb.stopMovingCallback = function (x, y) {\n      \/\/ Update params when the element is dropped.\n      var id = that.dnb.dnd.$element.data('id');\n      var params = that.dnb.dnd.$element.hasClass('h5p-dq-dz') ? that.params.dropZones[id] : that.params.elements[id];\n      params.x = x;\n      params.y = y;\n    };\n    this.dnb.dnd.releaseCallback = function () {\n      \/\/ Edit element when it is dropped.\n      if (that.dnb.newElement) {\n        setTimeout(function () {\n          that.dnb.dnd.$element.dblclick();\n          that.dnb.blurAll();\n        }, 1);\n      }\n    };\n    this.dnb.attach(this.$dnbWrapper);\n\n    this.dnb.on('paste', function (event) {\n      var pasted = event.data;\n      var $element;\n\n      if (pasted.from === clipboardKey) {\n        \/\/ Pasted content comes from the same version of DQ\n\n        if (!pasted.generic) {\n          \/\/ Non generic part, must be a drop zone\n          that.center(pasted.specific);\n          that.params.dropZones.push(pasted.specific);\n          $element = that.insertDropZone(that.params.dropZones.length - 1);\n          setTimeout(function () {\n            that.dnb.focus($element);\n          });\n        }\n        else if (that.elementLibraryOptions.indexOf(pasted.generic.library) !== -1) {\n          \/\/ Has generic part and the generic libray is supported\n          that.center(pasted.specific);\n          that.params.elements.push(pasted.specific);\n          $element = that.insertElement(that.params.elements.length - 1);\n          setTimeout(function () {\n            that.dnb.focus($element);\n          });\n        }\n        else {\n          alert(H5PEditor.t('H5P.DragNBar', 'unableToPaste'));\n        }\n      }\n      else if (pasted.generic) {\n        if (that.elementLibraryOptions.indexOf(pasted.generic.library) !== -1) {\n          \/\/ Supported library from another content type\n          var id = C.getLibraryID(pasted.generic.library);\n          var elementParams = C.getDefaultElementParams(id);\n          elementParams.type = pasted.generic;\n          elementParams.width = pasted.width * that.pToEm;\n          elementParams.height = pasted.height * that.pToEm;\n\n          that.center(elementParams);\n          that.params.elements.push(elementParams);\n          $element = that.insertElement(that.params.elements.length - 1);\n          setTimeout(function () {\n            that.dnb.focus($element);\n          });\n        }\n        else {\n          alert(H5PEditor.t('H5P.DragNBar', 'unableToPaste'));\n        }\n      }\n    });\n\n    \/**\n     * Update params on end of resize\n     * Dimensions contains a data object where each dimensions is optional.\n     *\/\n    this.dnb.dnr.on('stoppedResizing', function (dimensions) {\n      var id = that.dnb.$element.data('id');\n      var params = that.dnb.$element.hasClass('h5p-dq-dz') ? that.params.dropZones[id] : that.params.elements[id];\n      var containerStyle = window.getComputedStyle(that.$editor[0]);\n\n      \/\/ Set dimensions if they were passed in\n      if (dimensions.data.left !== undefined) {\n        params.x = dimensions.data.left \/ (parseFloat(containerStyle.width) \/ 100);\n      }\n      if (dimensions.data.top !== undefined) {\n        params.y = dimensions.data.top \/ (parseFloat(containerStyle.height) \/ 100);\n      }\n      if (dimensions.data.width !== undefined) {\n        params.width = dimensions.data.width;\n      }\n      if (dimensions.data.height !== undefined) {\n        params.height = dimensions.data.height;\n      }\n    });\n\n    \/\/ Add Elements\n    this.elements = [];\n    for (var i = 0; i < this.params.elements.length; i++) {\n      this.insertElement(i);\n    }\n\n    \/\/ Add Drop Zones\n    this.dropZones = [];\n    for (var j = 0; j < this.params.dropZones.length; j++) {\n      this.insertDropZone(j);\n    }\n\n    this.resize();\n  };\n\n  \/**\n   * Help center new elements\n   * @param {object} params\n   *\/\n  C.prototype.center = function (params) {\n    var size = window.getComputedStyle(this.dnb.$container[0]);\n    var width = parseFloat(size.width);\n    var height = parseFloat(size.height);\n    var pos = {\n      x: (width - (params.width * this.fontSize)) \/ 2,\n      y: (height - (params.height * this.fontSize)) \/ 2\n    };\n    this.dnb.avoidOverlapping(pos, {\n      width: params.width * this.fontSize,\n      height: params.height * this.fontSize,\n    });\n    params.x = pos.x \/ (width \/ 100);\n    params.y = pos.y \/ (height \/ 100);\n  };\n\n  \/**\n   * Generate sub forms that's ready to use in the dialog.\n   *\n   * @param {Object} semantics\n   * @param {Object} params\n   * @returns {Object} generatedForm\n   *\/\n  C.prototype.generateForm = function (semantics, params) {\n    var $form = $('<div><\/div>');\n    H5PEditor.processSemanticsChunk(semantics, params, $form, this);\n    var $lib = $form.children('.library:first');\n    if ($lib.length !== 0) {\n      $lib.children('label, select, .h5peditor-field-description').hide().end().children('.libwrap').css('margin-top', '0');\n    }\n\n    return {\n      $form: $form,\n      children: this.children\n    };\n  };\n\n  \/**\n   * Generate a list of buttons for DnB.\n   *\n   * @returns {Array} Buttons\n   *\/\n  C.prototype.getButtons = function (libraries) {\n    var that = this;\n    var id = 'dropzone';\n    var buttons = [{\n      id: id,\n      title: C.t('insertElement', {':type': C.t(id)}),\n      createElement: function () {\n        that.params.dropZones.push({\n          x: 0,\n          y: 0,\n          width: 5,\n          height: 2.5,\n          correctElements: []\n        });\n\n        return that.insertDropZone(that.params.dropZones.length - 1);\n      }\n    }];\n\n    for (var i = 0; i < libraries.length; i++) {\n      if (libraries[i].restricted !== true) {\n        buttons.push(this.getButton(libraries[i]));\n      }\n    }\n\n    return buttons;\n  };\n\n  \/**\n   * Creates a fresh object with default element parameters.\n   * @returns {object}\n   *\/\n  C.getDefaultElementParams = function (id) {\n    return {\n      x: 0,\n      y: 0,\n      width: 5,\n      height: id === 'text' ? 1.25 : 5,\n      dropZones: []\n    };\n  };\n\n  \/**\n   * Find generic library identifier without version name.\n   *\n   * @param {string} library\n   * @returns {string}\n   *\/\n  C.getLibraryID = function (library) {\n    return library.split(' ')[0].split('.')[1].toLowerCase();\n  };\n\n  \/**\n   * Generate a single element button for the DnB.\n   *\n   * @param {String} library Library name + version\n   * @returns {Object} DnB button semantics\n   *\/\n  C.prototype.getButton = function (library) {\n    var that = this;\n    var id = C.getLibraryID(library.uberName);\n    return {\n      id: id,\n      title: library.title,\n      createElement: function () {\n        var elementParams = C.getDefaultElementParams(id);\n        elementParams.type = {\n          library: library.uberName,\n          params: {}\n        };\n        that.params.elements.push(elementParams);\n        return that.insertElement(that.params.elements.length - 1);\n      }\n    };\n  };\n\n  \/**\n   * Insert element at given params index.\n   *\n   * @param {int} index\n   * @returns {jQuery} The element's DOM\n   *\/\n  C.prototype.insertElement = function (index) {\n    var that = this;\n    var elementParams = this.params.elements[index];\n    var element = this.generateForm(this.elementFields, elementParams);\n\n    var library = this.children[0];\n\n    \/\/ Get image aspect ratio\n    var libraryChange = function () {\n      if (library.children[0].field.type === 'image') {\n        library.children[0].changes.push(function (params) {\n          if (params === undefined) {\n            return;\n          }\n\n          if (params.width !== undefined && params.height !== undefined) {\n            var editorStyles = window.getComputedStyle(that.$editor[0]);\n            var editorWidth = parseFloat(editorStyles.width);\n            var editorHeight = parseFloat(editorStyles.height);\n\n            var aspectRatio = params.height \/ params.width;\n            if (editorHeight \/ editorWidth > aspectRatio) {\n              elementParams.height = elementParams.width * aspectRatio;\n            }\n            else {\n              elementParams.width = elementParams.height \/ aspectRatio;\n            }\n\n            element.$element.css({\n              width: elementParams.width + 'em',\n              height: elementParams.height + 'em'\n            });\n          }\n        });\n      }\n    };\n\n    if (library.children === undefined) {\n      library.changes.push(libraryChange);\n    }\n    else {\n      libraryChange();\n    }\n\n    element.$element = $('<div class=\"h5p-dq-element\" style=\"width:' + elementParams.width + 'em;height:' + elementParams.height + 'em;top:' + elementParams.y + '%;left:' + elementParams.x + '%\"><\/div>')\n      .data('id', index)\n      .appendTo(this.$editor)\n      .dblclick(function () {\n        that.editElement(element);\n      }).hover(function () {\n        C.setElementOpacity(element.$element, that.getElementOpacitySetting(elementParams));\n      }, function () {\n        \/\/ Need this timeout for firefox beeing able to get the css hover rule in place\n        setTimeout(function () {\n          C.setElementOpacity(element.$element, that.getElementOpacitySetting(elementParams));\n        }, 1);\n      });\n\n    element.$innerElement = $('<div>', {\n      'class': 'h5p-dq-element-inner'\n    }).appendTo(element.$element);\n\n    setTimeout(function () {\n      var type = (elementParams.type ? elementParams.type.library.split(' ')[0] : null);\n\n      var dnbElement = that.dnb.add(element.$element, DragNBar.clipboardify(clipboardKey, elementParams, 'type'), {\n        cornerLock: (type === 'H5P.Image')\n      });\n\n      dnbElement.contextMenu.on('contextMenuEdit', function () {\n        that.editElement(element);\n        that.dnb.blurAll();\n      });\n\n      dnbElement.contextMenu.on('contextMenuRemove', that.elementRemove.bind(that, element));\n      dnbElement.contextMenu.on('contextMenuBringToFront', that.elementBringToFront.bind(that, element));\n      dnbElement.contextMenu.on('contextMenuSendToBack', that.elementSendToBack.bind(that, element));\n      that.dnb.focus(element.$element);\n    }, 0);\n\n    \/\/ Update element\n    that.updateElement(element, index);\n\n    this.elements[index] = element;\n    return element.$element;\n  };\n\n  \/**\n   * Removes an element\n   *\n   * @param {object} element\n   *\/\n  C.prototype.elementRemove = function (element) {\n    var that = this;\n\n    \/\/ confirm remove\n    if (!confirm(C.t('confirmRemoval'))) {\n      return;\n    }\n\n    var id = element.$element.data('id');\n    var value = id.toString();\n\n    \/\/ Remove element form\n    H5PEditor.removeChildren(element.children);\n\n    \/\/ Remove element\n    element.$element.remove();\n    that.elements.splice(id, 1);\n    that.params.elements.splice(id, 1);\n\n    \/\/ Remove from options\n    that.elementOptions.splice(id, 1);\n\n    \/\/ Update drop zone params\n\n    that.params.dropZones.forEach(function(dropZone){\n      var elements = dropZone.correctElements;\n\n      elements = that.arrayRemoveByValue(elements, value);\n      elements = that.decrementIdsLargerThen(elements, id);\n\n      \/\/ update correct elements\n      dropZone.correctElements = elements;\n    });\n\n    that.updateInternalElementIDs(id);\n    that.dnb.blurAll();\n  };\n\n  \/**\n   * Brings an element to the front\n   *\n   * @param {object} element\n   *\/\n  C.prototype.elementBringToFront = function (element) {\n    var that = this;\n\n    \/\/ Find element ID\n    var id = element.$element.data('id');\n    var oldId = id.toString();\n\n    \/\/ Update visuals\n    element.$element.appendTo(that.$editor);\n\n    \/\/ Give new ID\n    that.elements.push(that.elements.splice(id, 1)[0]);\n    that.params.elements.push(that.params.elements.splice(id, 1)[0]);\n    that.elementOptions.push(that.elementOptions.splice(id, 1)[0]);\n\n    var newId = (that.elements.length - 1).toString();\n\n    \/\/ Update drop zone params\n    that.params.dropZones.forEach(function(dropZone) {\n      \/\/ update correct elements\n      dropZone.correctElements = dropZone.correctElements.map(function(entry){\n        \/\/ Update ID in correct answers\n        if (entry === oldId) {\n          return newId;\n        }\n        \/\/ Adjust index for others\n        else if (parseInt(entry) > id) {\n          return (parseInt(entry) - 1).toString();\n        }\n        \/\/ if not current, and not with larger id\n        else {\n          return entry;\n        }\n      });\n    });\n\n    that.updateInternalElementIDs(id);\n  };\n\n  \/**\n   * Sends an element to the back\n   *\n   * @param {object} element\n   *\/\n  C.prototype.elementSendToBack = function (element) {\n    var that = this;\n\n    \/\/ Find element ID\n    var id = element.$element.data('id');\n    var oldId = id.toString();\n\n    \/\/ Update visuals\n    element.$element.prependTo(that.$editor);\n\n    \/\/ Give new ID\n    that.elements.unshift(that.elements.splice(id, 1)[0]);\n    that.params.elements.unshift(that.params.elements.splice(id, 1)[0]);\n    that.elementOptions.unshift(that.elementOptions.splice(id, 1)[0]);\n\n    var newId = (that.elements.length - 1).toString();\n\n    \/\/ Update drop zone params\n    that.params.dropZones.forEach(function(dropZone) {\n      \/\/ update correct elements\n      dropZone.correctElements = dropZone.correctElements.map(function(entry){\n        \/\/ Update ID in correct answers\n        if (entry === oldId) {\n          return newId;\n        }\n        \/\/ Adjust index for others\n        else if (parseInt(entry) > id) {\n          return (parseInt(entry) - 1).toString();\n        }\n        \/\/ if not current, and not with larger id\n        else {\n          return entry;\n        }\n      });\n    });\n\n    that.updateInternalElementIDs(id);\n  };\n\n  \/**\n   * Removes a value from an array\n   *\n   * @param {object[]} arr\n   * @param {object} value\n   *\n   * @return {object[]}\n   *\/\n  C.prototype.arrayRemoveByValue = function (arr, value) {\n    var ax;\n\n    while ((ax = arr.indexOf(value)) !== -1) {\n      arr.splice(ax, 1);\n    }\n\n    return arr;\n  };\n\n  \/**\n   * Takes an array of numbers (as strings), and decrements those larger\n   * then a threshold\n   *\n   * @param {String[]} arr\n   * @param {number} threshold\n   *\n   * @private\n   * @return {string[]}\n   *\/\n  C.prototype.decrementIdsLargerThen = function (arr, threshold) {\n    return arr.map(function(id){\n      var value = parseInt(id);\n      return (id < threshold) ? id : (value - 1).toString();\n    });\n  };\n\n  \/**\n   * Sync the internal ID of each element.\n   * @param {number} start\n   *\/\n  C.prototype.updateInternalElementIDs = function (start) {\n    for (var i = start; i < this.elements.length; i++) {\n      this.elements[i].$element.data('id', i);\n      this.elementOptions[i].value = '' + i;\n    }\n  };\n\n  \/**\n   * Set callbacks and open dialog with the form for the given element.\n   *\n   * @param {Object} element\n   * @returns {undefined}\n   *\/\n  C.prototype.editElement = function (element) {\n    var that = this;\n    var id = element.$element.data('id');\n\n    this.doneCallback = function () {\n      \/\/ Validate form\n      var valid = true;\n      for (var i = 0; i < element.children.length; i++) {\n        if (element.children[i].validate() === false) {\n          valid = false;\n          break;\n        }\n      }\n      if (!valid) {\n        return false;\n      }\n\n\n      \/\/ Must be removed before dnb changes focus!\n      if (H5PEditor.Html) {\n        H5PEditor.Html.removeWysiwyg();\n      }\n\n      \/\/ Update element\n      that.updateElement(element, id);\n      that.dnb.focus(element.$element);\n      that.dnb.pressed = undefined;\n    };\n\n    this.removeCallback = function () {\n      var i, j, ce;\n\n      \/\/ Remove element form\n      H5PEditor.removeChildren(element.children);\n\n      \/\/ Remove element\n      element.$element.remove();\n      that.elements.splice(id, 1);\n      that.params.elements.splice(id, 1);\n\n      \/\/ Remove from options\n      this.elementOptions.splice(id, 1);\n\n      \/\/ Update drop zone params\n      for (i = 0; i < that.params.dropZones.length; i++) {\n        ce = that.params.dropZones[i].correctElements;\n        for (j = 0; j < ce.length; j++) {\n          if (ce[j] === '' + id) {\n            \/\/ Remove from correct answers\n            ce.splice(j, 1);\n          }\n          else if (ce[j] > id) {\n            \/\/ Adjust index for others\n            ce[j] = '' + (ce[j] - 1);\n          }\n        }\n      }\n\n      \/\/ Change data index for \"all\" elements\n      for (i = id; i < that.elements.length; i++) {\n        that.elements[i].$element.data('id', i);\n        that.elementOptions[i].value = '' + i;\n      }\n    };\n\n    \/\/ Disable background opacity input if overriden globally\n    var disableOpacityField = !!(that.params.elements[id].dropZones.length !== 0 && this.backgroundOpacity);\n    H5PEditor.findField('backgroundOpacity', element).$item.find('input').prop({\n      disabled: disableOpacityField,\n      title: disableOpacityField ? C.t('backgroundOpacityOverridden') : ''\n    });\n\n    element.children[this.elementDropZoneFieldWeight].setActive();\n    this.showDialog(element.$form);\n\n    \/\/ Blur context menu when showing dialog.\n    setTimeout(function () {\n      that.dnb.blurAll();\n    }, 10);\n  };\n\n  \/**\n   * Update the element with new data.\n   *\n   * @param {Object} element\n   * @param {int} id\n   * @returns {undefined}\n   *\/\n  C.prototype.updateElement = function (element, id) {\n    var self = this;\n    var params = this.params.elements[id];\n\n    var type = (params.type.library.split(' ')[0] === 'H5P.AdvancedText' ? 'text' : 'image');\n    var hasCk = (element.children[0].children !== undefined && element.children[0].children[0].ckeditor !== undefined);\n    if (type === 'text' && hasCk) {\n      \/\/ Create new text instance. Replace asterisk with spans\n      element.instance = H5P.newRunnable({\n        library: params.type.library,\n        params: {\n          text: params.type.params.text.replace(\/\\*([^*]+)\\*\/g, '<span class=\"h5p-dragquestion-placeholder\">$1<\/span>')\n        }\n      }, H5PEditor.contentId, element.$innerElement);\n\n      \/\/ Remove asterisk from params and input field\n      params.type.params.text = params.type.params.text.replace(\/\\*([^*]+)\\*\/g, '$1');\n      element.children[0].children[0].ckeditor.setData(params.type.params.text);\n    }\n    else {\n      \/\/ Create new instance\n      element.instance = H5P.newRunnable(params.type, H5PEditor.contentId, element.$innerElement);\n    }\n\n    if (type === 'text') {\n      element.$element.addClass('h5p-dq-text');\n    }\n\n    \/\/ Find label text without html\n    var label = (type === 'text' ? $('<div>' + params.type.params.text + '<\/div>').text() : params.type.params.alt + '');\n\n    \/\/ Update correct element options\n    this.elementOptions[id] = {\n      value: '' + id,\n      label: C.t(type) + ': ' + C.getLabel(label)\n    };\n\n    \/\/ Retain size after toggling class\n    var toggleDraggable = function (addClass, $element) {\n      var toggleClass = addClass !== $element.hasClass('h5p-draggable');\n      if (!toggleClass) {\n        return;\n      }\n\n      if (addClass) {\n        $element.addClass('h5p-draggable');\n      }\n      else {\n        $element.removeClass('h5p-draggable');\n      }\n    };\n\n    if (params.dropZones !== undefined && params.dropZones.length) {\n\n      toggleDraggable(true, element.$element);\n    }\n    else {\n      toggleDraggable(false, element.$element);\n\n      if (type === 'text' && hasCk) {\n        \/\/ When dialog closes, replace spans with drop zones\n        this.hideDialogCallback = function () {\n          var pWidth = self.$editor.width() \/ 100;\n          var pHeight = self.$editor.height() \/ 100;\n          element.$element.find('.h5p-dragquestion-placeholder').each(function () {\n            var $span = $(this);\n            var pos = $span.position();\n\n            \/\/ Add new drop zone\n            self.params.dropZones.push({\n              x: params.x + ((pos.left - 3) \/ pWidth),\n              y: params.y + ((pos.top - 2) \/ pHeight),\n              width: ($span.width() \/ self.fontSize) + 0.5,\n              height: ($span.height() \/ self.fontSize) + 0.3,\n              backgroundOpacity: 0,\n              correctElements: [],\n              label: C.getLabel($span.text()),\n              showLabel: false\n            });\n            self.insertDropZone(self.params.dropZones.length - 1);\n\n            \/\/ Remove span\n            $span.contents().unwrap();\n          });\n          delete self.hideDialogCallback;\n        };\n      }\n    }\n\n    C.setElementOpacity(element.$element, this.getElementOpacitySetting(params));\n  };\n\n  \/**\n   * Clips text at 32 chars\n   *\n   * @param {String} text\n   * @returns {String}\n   *\/\n  C.getLabel = function (text) {\n    return (text.length > 32 ? text.substr(0, 32) + '...' : text);\n  };\n\n  \/**\n   * Insert the drop zone at the given index.\n   *\n   * @param {int} index\n   * @returns {H5P.jQuery}\n   *\/\n  C.prototype.insertDropZone = function (index) {\n    var that = this,\n      dropZoneParams = this.params.dropZones[index],\n      dropZone = this.generateForm(this.dropZoneFields, dropZoneParams);\n\n    dropZone.$dropZone = $('<div class=\"h5p-dq-dz\" style=\"width:' + dropZoneParams.width + 'em;height:' + dropZoneParams.height + 'em;top:' + dropZoneParams.y + '%;left:' + dropZoneParams.x + '%\"><\/div>')\n      .appendTo(this.$editor)\n      .data('id', index)\n      .dblclick(function () {\n        \/\/ Edit\n        that.editDropZone(dropZone);\n        that.dnb.blurAll();\n      });\n\n    \/\/ Add label\n    this.updateDropZone(dropZone, index);\n\n    \/\/ Add to dnb after element has been attached\n    setTimeout(function () {\n\n      var dropzoneDnBElement = that.dnb.add(dropZone.$dropZone, DragNBar.clipboardify(clipboardKey, dropZoneParams));\n\n      \/\/ Register listeners for context menu buttons\n      dropzoneDnBElement.contextMenu.on('contextMenuEdit', function () {\n        that.editDropZone(dropZone);\n        that.dnb.blurAll();\n      });\n\n      dropzoneDnBElement.contextMenu.on('contextMenuRemove', function () {\n        if (!confirm(C.t('confirmRemoval'))) {\n          return;\n        }\n\n        \/\/ Remove element form\n        H5PEditor.removeChildren(dropZone.children);\n        var i;\n        var j;\n        var id = dropZone.$dropZone.data('id');\n\n        \/\/ Remove element\n        dropZone.$dropZone.remove();\n        that.dropZones.splice(id, 1);\n        that.params.dropZones.splice(id, 1);\n\n        \/\/ Remove from elements\n        that.elementFields[that.elementDropZoneFieldWeight].options.splice(id, 1);\n\n        \/\/ Remove dropZone from element params properly\n        for (i = 0; i < that.params.elements.length; i++) {\n          var dropZones = that.params.elements[i].dropZones;\n          for (j = 0; j < dropZones.length; j++) {\n            if (parseInt(dropZones[j]) === id) {\n              \/\/ Remove from element drop zones\n              dropZones.splice(j, 1);\n              if (!dropZones.length) {\n                that.elements[i].$element.removeClass('h5p-draggable');\n              }\n            }\n            else if (dropZones[j] > id) {\n              \/\/ Re index other drop zones\n              dropZones[j] = '' + (dropZones[j] - 1);\n            }\n          }\n        }\n\n        that.updateInternalDropZoneIDs(id);\n        that.dnb.blurAll();\n      });\n\n      dropzoneDnBElement.contextMenu.on('contextMenuBringToFront', function () {\n        var id = dropZone.$dropZone.data('id');\n\n        \/\/ Update visuals\n        dropZone.$dropZone.appendTo(that.$editor);\n\n        \/\/ Get new ID\n        that.dropZones.push(that.dropZones.splice(id, 1)[0]);\n        that.params.dropZones.push(that.params.dropZones.splice(id, 1)[0]);\n        var options = that.elementFields[that.elementDropZoneFieldWeight].options;\n        options.push(options.splice(id, 1)[0]);\n        var newID = (that.dropZones.length - 1);\n\n        \/\/ Update dropZone IDs in element params\n        for (i = 0; i < that.params.elements.length; i++) {\n          var dropZones = that.params.elements[i].dropZones;\n          for (j = 0; j < dropZones.length; j++) {\n            if (parseInt(dropZones[j]) === id) {\n              \/\/ Update ID\n              dropZones[j] = newID;\n            }\n            else if (dropZones[j] > id) {\n              \/\/ Re-index other drop zones\n              dropZones[j] = '' + (dropZones[j] - 1);\n            }\n          }\n        }\n\n        that.updateInternalDropZoneIDs(id);\n      });\n\n      dropzoneDnBElement.contextMenu.on('contextMenuSendToBack', function () {\n        var id = dropZone.$dropZone.data('id');\n\n        \/\/ Update visuals\n        dropZone.$dropZone.prependTo(that.$editor);\n\n        \/\/ Get new ID\n        that.dropZones.unshift(that.dropZones.splice(id, 1)[0]);\n        that.params.dropZones.unshift(that.params.dropZones.splice(id, 1)[0]);\n        var options = that.elementFields[that.elementDropZoneFieldWeight].options;\n        options.unshift(options.splice(id, 1)[0]);\n        var newID = (that.dropZones.length - 1);\n\n        \/\/ Update dropZone IDs in element params\n        for (i = 0; i < that.params.elements.length; i++) {\n          var dropZones = that.params.elements[i].dropZones;\n          for (j = 0; j < dropZones.length; j++) {\n            if (parseInt(dropZones[j]) === id) {\n              \/\/ Update ID\n              dropZones[j] = newID;\n            }\n            else if (dropZones[j] > id) {\n              \/\/ Re-index other drop zones\n              dropZones[j] = '' + (dropZones[j] - 1);\n            }\n          }\n        }\n\n        that.updateInternalDropZoneIDs(id);\n      });\n      that.dnb.focus(dropZone.$dropZone);\n    }, 0);\n\n    this.dropZones[index] = dropZone;\n    return dropZone.$dropZone;\n  };\n\n  \/**\n   * Sync the internal ID of each drop zone.\n   * @param {number} start\n   *\/\n  C.prototype.updateInternalDropZoneIDs = function (start) {\n    for (i = start; i < this.dropZones.length; i++) {\n      this.dropZones[i].$dropZone.data('id', i);\n      this.elementFields[this.elementDropZoneFieldWeight].options[i].value = i + '';\n    }\n  };\n\n  \/**\n   * Set callbacks and open dialog with the form for the given drop zone.\n   *\n   * @param {Object} dropZone\n   * @returns {undefined}\n   *\/\n  C.prototype.editDropZone = function (dropZone) {\n    var that = this;\n    var i, j, id = dropZone.$dropZone.data('id');\n\n    this.doneCallback = function () {\n      \/\/ Validate form\n      var valid = true;\n      for (var i = 0; i < dropZone.children.length; i++) {\n        if (dropZone.children[i].validate() === false) {\n          valid = false;\n          break;\n        }\n      }\n      if (!valid) {\n        return false;\n      }\n\n      \/\/ Must be removed before dnb changes focus!\n      if (H5PEditor.Html) {\n        H5PEditor.Html.removeWysiwyg();\n      }\n\n      that.updateDropZone(dropZone, id);\n      that.dnb.focus(dropZone.$dropZone);\n      that.dnb.pressed = undefined;\n    };\n\n    this.removeCallback = function () {\n      \/\/ Remove element form\n      H5PEditor.removeChildren(dropZone.children);\n\n      \/\/ Remove element\n      dropZone.$dropZone.remove();\n      that.dropZones.splice(id, 1);\n      that.params.dropZones.splice(id, 1);\n\n      \/\/ Remove from elements\n      this.elementFields[this.elementDropZoneFieldWeight].options.splice(id, 1);\n\n      \/\/ Remove dropZone from element params properly\n      for (i = 0; i < that.params.elements.length; i++) {\n        var dropZones = that.params.elements[i].dropZones;\n        for (j = 0; j < dropZones.length; j++) {\n          if (parseInt(dropZones[j]) === id) {\n            \/\/ Remove from element drop zones\n            dropZones.splice(j, 1);\n            if (!dropZones.length) {\n              that.elements[i].$element.removeClass('h5p-draggable');\n            }\n          }\n          else if (dropZones[j] > id) {\n            \/\/ Re index other drop zones\n            dropZones[j] = '' + (dropZones[j] - 1);\n          }\n        }\n      }\n\n      \/\/ Reindex all dropzones\n      for (i = id; i < that.dropZones.length; i++) {\n        that.dropZones[i].$dropZone.data('id', i);\n        this.elementFields[this.elementDropZoneFieldWeight].options[i].value = i + '';\n      }\n    };\n\n    \/\/ Add only available options\n    var options = this.dropZoneFields[this.dropZoneElementFieldWeight].options = [];\n    var dropZones;\n    for (i = 0; i < this.elementOptions.length; i++) {\n      dropZones = this.params.elements[i].dropZones;\n      for (j = 0; j < dropZones.length; j++) {\n        if (dropZones[j] === (id + '')) {\n          options.push(this.elementOptions[i]);\n          break;\n        }\n      }\n    }\n\n    dropZone.children[this.dropZoneElementFieldWeight].setActive();\n    this.showDialog(dropZone.$form);\n\n    \/\/ Blur context menu when showing dialog\n    setTimeout(function () {\n      that.dnb.blurAll();\n    }, 10);\n  };\n\n  \/**\n   * Remove old label and add new.\n   *\n   * @param {Object} dropZone\n   * @param {int} id\n   * @returns {undefined}\n   *\/\n  C.prototype.updateDropZone = function (dropZone, id) {\n    var params = this.params.dropZones[id];\n\n    \/\/ Remove old label and add new.\n    dropZone.$dropZone.children('.h5p-dq-dz-label').remove();\n    if (params.showLabel === true) {\n      $('<div class=\"h5p-dq-dz-label\">' + params.label + '<\/div>').appendTo(dropZone.$dropZone);\n      dropZone.$dropZone.addClass('h5p-has-label');\n    }\n    else {\n      dropZone.$dropZone.removeClass('h5p-has-label');\n    }\n\n    \/\/ Create\/update Tip:\n    dropZone.$dropZone.children('.joubel-tip-container').remove();\n    if (params.tipsAndFeedback !== undefined && params.tipsAndFeedback.tip !== undefined && params.tipsAndFeedback.tip.trim().length !== 0) {\n      dropZone.$dropZone.append(H5P.JoubelUI.createTip(params.tipsAndFeedback.tip, {showSpeechBubble: false}));\n    }\n\n    this.elementFields[this.elementDropZoneFieldWeight].options[id] = {\n      value: '' + id,\n      label: params.label\n    };\n\n    C.setOpacity(dropZone.$dropZone.add(dropZone.$dropZone.children('.h5p-dq-dz-label')), 'background', params.backgroundOpacity);\n  };\n\n  \/**\n   * Attach form to dialog and show.\n   *\n   * @param {jQuery} $form\n   * @returns {undefined}\n   *\/\n  C.prototype.showDialog = function ($form) {\n    this.dnb.blurAll();\n    this.$currentForm = $form;\n    $form.appendTo(this.$dialogInner);\n    this.$dialog.show();\n    this.$editor.add(this.$dnbWrapper).hide();\n    this.dnb.dnr.toggleModifiers(false);\n  };\n\n  \/**\n   * Hide dialog and detach form.\n   *\n   * @returns {undefined}\n   *\/\n  C.prototype.hideDialog = function () {\n    \/\/ Attempt to find and close CKEditor instances before detaching.\n\n\n    this.$currentForm.detach();\n    this.$dialog.hide();\n    this.$editor.add(this.$dnbWrapper).show();\n\n    if (this.hideDialogCallback !== undefined) {\n      this.hideDialogCallback();\n    }\n    this.dnb.dnr.toggleModifiers(true);\n  };\n\n  \/**\n   * Update transparency for background.\n   *\n   * @param {jQuery} $element\n   * @param {Number} opacity\n   *\/\n  C.setElementOpacity = function ($element, opacity) {\n    C.setOpacity($element, 'background', opacity);\n    C.setOpacity($element, 'boxShadow', opacity);\n    C.setOpacity($element, 'borderColor', opacity);\n  };\n\n  \/**\n   * Update all elements' opacity\n   *\n   * @param {Array} domElements\n   * @param {Array} elements\n   * @param {String} type\n   *\/\n  C.prototype.updateAllElementsOpacity = function (domElements, elements, type) {\n    if (domElements === undefined) {\n      return;\n    }\n\n    for (var i = 0; i < domElements.length; i++) {\n      C.setElementOpacity(domElements[i]['$'+type], this.getElementOpacitySetting(elements[i]));\n    }\n  };\n\n  \/**\n   * Get the opacity setting for a given element\n   *\n   * @param {Object} element\n   * @returns {String} opacity\n   *\/\n  C.prototype.getElementOpacitySetting = function (element) {\n    if ((element.dropZones !== undefined && element.dropZones.length === 0) ||\n       (this.backgroundOpacity === undefined)) {\n      return element.backgroundOpacity;\n    }\n\n    return this.backgroundOpacity;\n  };\n\n  \/**\n   * Makes element background, border and shadow transparent.\n   *\n   * @param {jQuery} $element\n   * @param {String} property\n   * @param {Number} opacity\n   *\/\n  C.setOpacity = function ($element, property, opacity) {\n    if (property === 'background') {\n      \/\/ Set both color and gradient.\n      C.setOpacity($element, 'backgroundColor', opacity);\n      C.setOpacity($element, 'backgroundImage', opacity);\n      return;\n    }\n\n    opacity = (opacity === undefined ? 1 : opacity \/ 100);\n\n    \/\/ Private. Get css properties objects.\n    function getProperties(property, value) {\n      switch (property) {\n        case 'borderColor':\n          return {\n            borderTopColor: value,\n            borderRightColor: value,\n            borderBottomColor: value,\n            borderLeftColor: value\n          };\n\n        default:\n          var properties = {};\n          properties[property] = value;\n          return properties;\n      }\n    }\n\n    \/\/ Reset css to be sure we're using CSS and not inline values.\n    var properties = getProperties(property, '');\n    $element.css(properties);\n\n    for (var prop in properties) {\n      break;\n    }\n    var style = $element.css(prop); \/\/ Assume all props are the same and use the first.\n    style = C.setAlphas(style, 'rgba(', opacity); \/\/ Update rgba\n    style = C.setAlphas(style, 'rgb(', opacity); \/\/ Convert rgb\n\n    $element.css(getProperties(property, style));\n  };\n\n  \/**\n   * Updates alpha channel for colors in the given style.\n   *\n   * @param {String} style\n   * @param {String} prefix\n   * @param {Number} alpha\n   *\/\n  C.setAlphas = function (style, prefix, alpha) {\n    \/\/ Style undefined\n    if (!style) {\n      return;\n    }\n    var colorStart = style.indexOf(prefix);\n\n    while (colorStart !== -1) {\n      var colorEnd = style.indexOf(')', colorStart);\n      var channels = style.substring(colorStart + prefix.length, colorEnd).split(',');\n\n      \/\/ Set alpha channel\n      channels[3] = (channels[3] !== undefined ? parseFloat(channels[3]) * alpha : alpha);\n\n      style = style.substring(0, colorStart) + 'rgba(' + channels.join(',') + style.substring(colorEnd, style.length);\n\n      \/\/ Look for more colors\n      colorStart = style.indexOf(prefix, colorEnd);\n    }\n\n    return style;\n  };\n\n  \/**\n   * Validate the current field.\n   *\n   * @returns {Boolean}\n   *\/\n  C.prototype.validate = function () {\n    return true;\n  };\n\n  \/**\n   * Remove the field from DOM.\n   *\n   * @returns {undefined}\n   *\/\n  C.prototype.remove = function () {\n    if (this.dnb !== undefined) {\n      this.dnb.remove();\n    }\n    this.$item.remove();\n  };\n\n  \/**\n   * Collect functions to execute once the tree is complete.\n   *\n   * @param {function} ready\n   * @returns {undefined}\n   *\/\n  C.prototype.ready = function (ready) {\n    if (this.passReadies) {\n      this.parent.ready(ready);\n    }\n    else {\n      this.readies.push(ready);\n    }\n  };\n\n  \/**\n   * Translate UI texts for this library.\n   *\n   * @param {String} key\n   * @param {Object} vars\n   * @returns {@exp;H5PEditor@call;t}\n   *\/\n  C.t = function (key, vars) {\n    return H5PEditor.t('H5PEditor.DragQuestion', key, vars);\n  };\n\n  return C;\n})(H5P.jQuery, H5P.DragNBar);\n\n\/\/ Default english translations\nH5PEditor.language['H5PEditor.DragQuestion'] = {\n  libraryStrings: {\n    insertElement: 'Insert :type',\n    done: 'Done',\n    remove: 'Remove',\n    image: 'Image',\n    text: 'Text',\n    noTaskSize: 'Please specify task size first.',\n    confirmRemoval: 'Are you sure you wish to remove this element?',\n    backgroundOpacityOverridden: 'The background opacity is overridden',\n    advancedtext: 'Advanced text',\n    dropzone: 'Drop zone',\n    selectAll: 'Select all',\n    deselectAll: 'Deselect all'\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.DragQuestion-1.9\/H5PEditor.DynamicCheckboxes.js?ver=1.9.2":"\nvar H5PEditor = H5PEditor || {};\n\n\/**\n * Editor widget module for dynamic value checkboxes.\n *\n * Displays a list of checkboxes, and the list is regenerated each time the\n * field is set as active unlike H5PEditor.select where the options are\n * generated when the field is initialized, and after that stays the same.\n *\n * Other fields may change the options in dynamicCheckboxes\n *\/\nH5PEditor.widgets.dynamicCheckboxes = H5PEditor.DynamicCheckboxes = (function ($) {\n  \/**\n   * Initialize widget.\n   *\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   * @returns {_L8.C}\n   *\/\n  function C(parent, field, params, setValue) {\n    this.parent = parent;\n    this.field = field;\n    this.setValue = setValue;\n\n    if (params === undefined) {\n      if (this.field.multiple) {\n        this.params = [];\n      }\n      else {\n        this.params = '';\n      }\n      setValue(field, this.params);\n    }\n    else {\n      this.params = params;\n    }\n  }\n\n  \/**\n   * Append widget to form.\n   *\n   * @param {jQuery} $wrapper\n   * @returns {undefined}\n   *\/\n  C.prototype.appendTo = function ($wrapper) {\n    this.$item = $(H5PEditor.createFieldMarkup(this.field)).appendTo($wrapper);\n    this.$errors = this.$item.children('.h5p-errors');\n  };\n\n  \/**\n   * The widget is set as active.\n   * (re)Generate options.\n   *\n   * @returns {undefined}\n   *\/\n  C.prototype.setActive = function () {\n    var that = this,\n      html = '',\n      i, j, option, selected;\n\n    for (i = 0; i < this.field.options.length; i++) {\n      option = this.field.options[i];\n      selected = false;\n\n      if (this.field.multiple) {\n        \/\/ Check if selected\n        for (j = 0; j < this.params.length; j++) {\n          if (this.params[j] === option.value) {\n            selected = true;\n            break;\n          }\n        }\n        html += '<li><label class=\"h5p-editor-label\"><input type=\"checkbox\" value=\"' + option.value + '\"' + (selected ? ' checked=\"checked\"' : '') + '\/><div class=\"h5p-label-text\">' + option.label + '<\/div><\/label><\/li>';\n      }\n      else {\n        \/\/ Check if selected\n        if (this.params === option.value) {\n          selected = true;\n        }\n        html += '<li><label class=\"h5p-editor-label\"><input type=\"radio\" name=\"dynboxradio1\" value=\"' + option.value + '\"' + (selected ? ' checked=\"checked\"' : '') + '\/>' + option.label + '<\/label><\/li>';\n      }\n    }\n\n    this.$item.html(html ? '<div class=\"h5peditor-label\">' + this.field.label + '<\/div>' + (this.field.multiple ? '<a href=\"#\" class=\"h5p-selectall\">' + H5PEditor.t('H5PEditor.DragQuestion', 'selectAll') + '<\/a>' : '') + '<ul class=\"h5peditor-dynamiccheckboxes-select\">' + html + '<\/ul>' : '');\n\n    var updateSelectall, $a, $checkboxes = this.$item.find('input').change(function () {\n      that.change($(this));\n\n      \/\/ If all is checked change select all button.\n      updateSelectAll();\n    });\n\n    $a = this.$item.find('.h5p-selectall').click(function () {\n      if ($a.hasClass('h5p-deselectall')) {\n        $checkboxes.each(function () {\n          var $this = $(this);\n          if ($this.is(':checked')) {\n            $this.prop('checked', false).change();\n          }\n        });\n      }\n      else {\n        $checkboxes.each(function () {\n          var $this = $(this);\n          if (!$this.is(':checked')) {\n            $this.prop('checked', true).change();\n          }\n        });\n      }\n\n      return false;\n    });\n\n    updateSelectAll = function () {\n      if ($checkboxes.length) {\n        if ($checkboxes.length === $checkboxes.filter(':checked').length) {\n         $a.addClass('h5p-deselectall').text(H5PEditor.t('H5PEditor.DragQuestion', 'deselectAll'));\n        }\n        else {\n          $a.removeClass('h5p-deselectall').text(H5PEditor.t('H5PEditor.DragQuestion', 'selectAll'));\n        }\n      }\n    };\n    updateSelectAll();\n  };\n\n  \/**\n   * Update params with changes to checkbox.\n   *\n   * @param {jQuery} $input\n   * @returns {undefined}\n   *\/\n  C.prototype.change = function ($input) {\n    var i, value = $input.val();\n\n    if (this.field.multiple) {\n      if ($input.is(':checked')) {\n        this.params.push(value);\n      }\n      else {\n        for (i = 0; i < this.params.length; i++) {\n          if (this.params[i] === value) {\n            this.params.splice(i, 1);\n          }\n        }\n      }\n    }\n    else {\n      if ($input.is(':checked')) {\n        this.params = value;\n        this.setValue(this.field, value);\n      }\n    }\n  };\n\n  \/**\n   * Validate the current field.\n   *\n   * @returns {Boolean}\n   *\/\n  C.prototype.validate = function () {\n    return true;\n  };\n\n  \/**\n   *\n   * @returns {undefined}\n   *\/\n  C.prototype.remove = function () {\n    this.$item.remove();\n  };\n\n  return C;\n})(H5P.jQuery);\n\n\/\/ Get translations from H5PEditor.DragQuestion\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragQuestion-1.11\/h5p-drag-question.js?ver=1.11.4":"\n!function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"\",t(t.s=3)}([function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=t.curry=function(e){var t=e.length;return function n(){var i=Array.prototype.slice.call(arguments,0);return i.length>=t?e.apply(null,i):function(){var e=Array.prototype.slice.call(arguments,0);return n.apply(null,i.concat(e))}}},o=(t.compose=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce(function(e,t){return function(){return e(t.apply(void 0,arguments))}})},t.forEach=i(function(e,t){t.forEach(e)}),t.map=i(function(e,t){return t.map(e)}),t.filter=i(function(e,t){return t.filter(e)})),r=(t.some=i(function(e,t){return t.some(e)}),t.contains=i(function(e,t){return-1!=t.indexOf(e)}));t.without=i(function(e,t){return o(function(t){return!r(t,e)},t)}),t.inverseBooleanString=function(e){return(\"true\"!==e).toString()}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.createElement=t.toggleClass=t.toggleVisibility=t.show=t.hide=t.removeClass=t.addClass=t.classListContains=t.removeChild=t.querySelectorAll=t.nodeListToArray=t.querySelector=t.appendChild=t.toggleAttribute=t.attributeEquals=t.hasAttribute=t.removeAttribute=t.setAttribute=t.getAttribute=void 0;var i=n(0),o=t.getAttribute=(0,i.curry)(function(e,t){return t.getAttribute(e)}),r=t.setAttribute=(0,i.curry)(function(e,t,n){return n.setAttribute(e,t)}),a=(t.removeAttribute=(0,i.curry)(function(e,t){return t.removeAttribute(e)}),t.hasAttribute=(0,i.curry)(function(e,t){return t.hasAttribute(e)}),t.attributeEquals=(0,i.curry)(function(e,t,n){return n.getAttribute(e)===t}),t.toggleAttribute=(0,i.curry)(function(e,t){var n=o(e,t);r(e,(0,i.inverseBooleanString)(n),t)}),t.appendChild=(0,i.curry)(function(e,t){return e.appendChild(t)}),t.querySelector=(0,i.curry)(function(e,t){return t.querySelector(e)}),t.nodeListToArray=function(e){return Array.prototype.slice.call(e)}),s=(t.querySelectorAll=(0,i.curry)(function(e,t){return a(t.querySelectorAll(e))}),t.removeChild=(0,i.curry)(function(e,t){return e.removeChild(t)}),t.classListContains=(0,i.curry)(function(e,t){return t.classList.contains(e)}),t.addClass=(0,i.curry)(function(e,t){return t.classList.add(e)})),l=t.removeClass=(0,i.curry)(function(e,t){return t.classList.remove(e)}),u=t.hide=s(\"hidden\"),c=t.show=l(\"hidden\");t.toggleVisibility=(0,i.curry)(function(e,t){return(e?c:u)(t)}),t.toggleClass=(0,i.curry)(function(e,t,n){n.classList[t?\"add\":\"remove\"](e)}),t.createElement=function(e){var t=e.tag,n=e.id,i=e.classes,o=e.attributes,r=document.createElement(t);return n&&(r.id=n),i&&i.forEach(function(e){r.classList.add(e)}),o&&Object.keys(o).forEach(function(e){r.setAttribute(e,o[e])}),r}},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=function(){function e(){i(this,e)}return o(e,null,[{key:\"setElementOpacity\",value:function(t,n){e.setOpacity(t,\"borderColor\",n),e.setOpacity(t,\"boxShadow\",n),e.setOpacity(t,\"background\",n)}},{key:\"setOpacity\",value:function(t,n,i){function o(e,t){switch(e){case\"borderColor\":return{borderTopColor:t,borderRightColor:t,borderBottomColor:t,borderLeftColor:t};default:var n={};return n[e]=t,n}}if(\"background\"===n)return e.setOpacity(t,\"backgroundColor\",i),void e.setOpacity(t,\"backgroundImage\",i);i=void 0===i?1:i\/100;var r=t.css(n),a=o(n,\"\");t.css(a);for(var s in a)break;var l=t.css(s);\"\"!==l&&\"none\"!==l||(l=r),l=e.setAlphas(l,\"rgba(\",i),l=e.setAlphas(l,\"rgb(\",i),t.css(o(n,l))}},{key:\"setAlphas\",value:function(e,t,n){if(e){for(var i=e.indexOf(t);-1!==i;){var o=e.indexOf(\")\",i),r=e.substring(i+t.length,o).split(\",\");r[3]=void 0!==r[3]?parseFloat(r[3])*n:n,e=e.substring(0,i)+\"rgba(\"+r.join(\",\")+e.substring(o,e.length),i=e.indexOf(t,o)}return e}}},{key:\"elementToDraggable\",value:function(e,t){for(var n=0;n<e.length;n++)if(e[n]){var i=e[n].findElement(t);if(i)return i.draggable=e[n],i}}},{key:\"elementToDropZone\",value:function(e,t){for(var n=0;n<e.length;n++)if(e[n].$dropZone.is(t))return e[n]}},{key:\"positionToPercentage\",value:function(e,t){return{top:100*parseInt(t.css(\"top\"))\/e.innerHeight()+\"%\",left:100*parseInt(t.css(\"left\"))\/e.innerWidth()+\"%\"}}},{key:\"addHover\",value:function(t,n){t.hover(function(){t.addClass(\"h5p-draggable-hover\"),t.parent().hasClass(\"h5p-dragging\")||e.setElementOpacity(t,n)},function(){t.parent().hasClass(\"h5p-dragging\")||setTimeout(function(){t.removeClass(\"h5p-draggable-hover\"),e.setElementOpacity(t,n)},1)}),e.setElementOpacity(t,n)}},{key:\"strip\",value:function(e){var t=document.createElement(\"div\");return t.innerHTML=e,t.textContent||t.innerText||\"\"}}]),e}();t.default=r},function(e,t,n){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){var i,o,r=this;w++,this.id=this.contentId=t,H5P.Question.call(r,\"dragquestion\"),this.options=y.extend(!0,{},{scoreShow:\"Check\",tryAgain:\"Retry\",grabbablePrefix:\"Grabbable {num} of {total}.\",grabbableSuffix:\"Placed in dropzone {num}.\",dropzonePrefix:\"Dropzone {num} of {total}.\",noDropzone:\"No dropzone\",tipLabel:\"Show tip.\",tipAvailable:\"Tip available\",correctAnswer:\"Correct answer\",wrongAnswer:\"Wrong answer\",feedbackHeader:\"Feedback\",scoreBarLabel:\"You got :num out of :total points\",scoreExplanationButtonLabel:\"Show score explanation\",question:{settings:{questionTitle:\"Drag and drop\",showTitle:!0,size:{width:620,height:310}},task:{elements:[],dropZones:[]}},overallFeedback:[],behaviour:{enableRetry:!0,enableCheckButton:!0,preventResize:!1,singlePoint:!1,showSolutionsRequiresInput:!0,applyPenalties:!0,enableScoreExplanation:!0,dropZoneHighlighting:\"dragging\",autoAlignSpacing:2,showScorePoints:!0}},e),this.options.behaviour.singlePoint&&(this.options.behaviour.enableScoreExplanation=!1),this.draggables=[],this.dropZones=[],this.answered=n&&void 0!==n.previousState&&void 0!==n.previousState.answers&&n.previousState.answers.length,this.blankIsCorrect=!0,this.backgroundOpacity=void 0===this.options.behaviour.backgroundOpacity||\"\"===this.options.behaviour.backgroundOpacity.trim()?void 0:this.options.behaviour.backgroundOpacity,r.$noDropZone=y('<div class=\"h5p-dq-no-dz\" role=\"button\" style=\"display:none;\"><span class=\"h5p-hidden-read\">'+r.options.noDropzone+\"<\/span><\/div>\");var a=k(r.draggables,r.dropZones,r.$noDropZone[0]),s=function(e){for(var t=0;t<a.drop.elements.length;t++)a.drop.elements[t].setAttribute(\"aria-dropeffect\",e)},l=[],u=this.options.question.task;for(this.correctDZs=[],i=0;i<u.dropZones.length;i++){l.push(!0);var c=u.dropZones[i].correctElements;for(o=0;o<c.length;o++){var d=c[o];void 0===this.correctDZs[d]&&(this.correctDZs[d]=[]),this.correctDZs[d].push(i)}}this.weight=1;var p={prefix:r.options.grabbablePrefix.replace(\"{total}\",u.elements.length),suffix:r.options.grabbableSuffix,correctAnswer:r.options.correctAnswer,wrongAnswer:r.options.wrongAnswer};for(i=0;i<u.elements.length;i++){var h=u.elements[i];if(void 0!==h.dropZones&&h.dropZones.length){void 0!==this.backgroundOpacity&&(h.backgroundOpacity=this.backgroundOpacity);var g=null;n&&void 0!==n.previousState&&void 0!==n.previousState.answers&&void 0!==n.previousState.answers[i]&&(g=n.previousState.answers[i]);var v=new m.default(h,i,g,p),x=\"dragging\"===r.options.behaviour.dropZoneHighlighting;for(v.on(\"elementadd\",function(e){a.drag.addElement(e.data)}),v.on(\"elementremove\",function(e){a.drag.removeElement(e.data),\"true\"===e.data.getAttribute(\"aria-grabbed\")&&(a.drag.firesEvent(\"select\",e.data),e.data.removeAttribute(\"aria-grabbed\"))}),v.on(\"focus\",function(e){a.drag.setTabbable(e.data),e.data.focus()}),v.on(\"dragstart\",function(e){x&&r.$container.addClass(\"h5p-dq-highlight-dz\"),s(e.data)}),v.on(\"dragend\",function(){x&&r.$container.removeClass(\"h5p-dq-highlight-dz\"),s(\"none\")}),v.on(\"interacted\",function(){r.answered=!0,r.triggerXAPIScored(r.getScore(),r.getMaxScore(),\"interacted\")}),v.on(\"leavingDropZone\",function(e){r.dropZones[e.data.dropZone].removeAlignable(e.data.$)}),this.draggables[i]=v,o=0;o<h.dropZones.length;o++)l[h.dropZones[o]]=!1}}this.numDropZonesWithoutElements=0;var E={prefix:r.options.dropzonePrefix.replace(\"{total}\",u.dropZones.length),tipLabel:r.options.tipLabel,tipAvailable:r.options.tipAvailable};for(i=0;i<u.dropZones.length;i++){var P=u.dropZones[i];!0===l[i]&&(this.numDropZonesWithoutElements+=1),this.blankIsCorrect&&P.correctElements.length&&(this.blankIsCorrect=!1),P.autoAlign={enabled:P.autoAlign,spacing:r.options.behaviour.autoAlignSpacing,size:r.options.question.settings.size},this.dropZones[i]=new b.default(P,i,E),this.dropZones[i].on(\"elementaligned\",function(e){for(var t=e.data,n=0;n<r.draggables.length;n++){var i=r.draggables[n];if(i&&i.elements&&i.elements.length)for(var o=0;o<i.elements.length;o++){var a=i.elements[o];if(a&&a.$[0]===t[0])return void(a.position=f.default.positionToPercentage(r.$container,a.$))}}})}this.on(\"resize\",r.resize,r),this.on(\"domChanged\",function(e){r.contentId===e.data.contentId&&r.trigger(\"resize\")}),this.on(\"enterFullScreen\",function(){r.$container&&(r.$container.parents(\".h5p-content\").css(\"height\",\"100%\"),r.trigger(\"resize\"))}),this.on(\"exitFullScreen\",function(){r.$container&&(r.$container.parents(\".h5p-content\").css(\"height\",\"auto\"),r.trigger(\"resize\"))})}var r=n(4),a=i(r),s=n(6),l=i(s),u=n(7),c=i(u),d=n(8),p=i(d),h=n(2),f=i(h),g=n(9),b=i(g),v=n(10),m=i(v),y=H5P.jQuery,w=0;o.prototype=Object.create(H5P.Question.prototype),o.prototype.constructor=o,o.prototype.registerDomElements=function(){var e=this;e.options.question.settings.showTitle&&(e.$introduction=y('<p class=\"h5p-dragquestion-introduction\" id=\"dq-intro-'+w+'\">'+e.options.question.settings.questionTitle+\"<\/p>\"),e.setIntroduction(e.$introduction));var t=\"\";if(void 0!==this.options.question.settings.background&&(t+=\"h5p-dragquestion-has-no-background\"),\"always\"===e.options.behaviour.dropZoneHighlighting&&(t&&(t+=\" \"),t+=\"h5p-dq-highlight-dz-always\"),e.setContent(e.createQuestionContent(),{class:t}),!1!==H5P.canHasFullScreen&&this.options.behaviour.enableFullScreen){var n=function(){H5P.isFullscreen?H5P.exitFullScreen(e.$container):H5P.fullScreen(e.$container.parent().parent(),e)},i=y(\"<div\/>\",{class:\"h5p-my-fullscreen-button-enter\",title:this.options.localize.fullscreen,role:\"button\",tabindex:0,on:{click:n,keypress:function(e){13!==e.which&&32!==e.which||(n(),e.preventDefault())}},prependTo:this.$container.parent()});this.on(\"enterFullScreen\",function(){i.attr(\"class\",\"h5p-my-fullscreen-button-exit\"),i.attr(\"title\",this.options.localize.exitFullscreen)}),this.on(\"exitFullScreen\",function(){i.attr(\"class\",\"h5p-my-fullscreen-button-enter\"),i.attr(\"title\",this.options.localize.fullscreen)})}e.registerButtons(),setTimeout(function(){e.trigger(\"resize\")},200)},o.prototype.getXAPIData=function(){var e=this.createXAPIEventTemplate(\"answered\");return this.addQuestionToXAPI(e),this.addResponseToXAPI(e),{statement:e.data.statement}},o.prototype.addQuestionToXAPI=function(e){var t=e.getVerifiedStatementValue([\"object\",\"definition\"]);y.extend(t,this.getXAPIDefinition())},o.prototype.getXAPIDefinition=function(){var e={};e.description={\"en-US\":y(\"<div>\"+this.options.question.settings.questionTitle+\"<\/div>\").text()},e.type=\"http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction\",e.interactionType=\"matching\",e.source=[];for(var t=0;t<this.options.question.task.elements.length;t++){var n=this.options.question.task.elements[t];if(n.dropZones&&n.dropZones.length){var i=n.type.params.alt?n.type.params.alt:n.type.params.text;e.source.push({id:\"\"+t,description:{\"en-US\":y(\"<div>\"+i+\"<\/div>\").text()}})}}e.correctResponsesPattern=[\"\"],e.target=[];var o=!0;for(t=0;t<this.options.question.task.dropZones.length;t++)if(e.target.push({id:\"\"+t,description:{\"en-US\":y(\"<div>\"+this.options.question.task.dropZones[t].label+\"<\/div>\").text()}}),this.options.question.task.dropZones[t].correctElements)for(var r=0;r<this.options.question.task.dropZones[t].correctElements.length;r++)o||(e.correctResponsesPattern[0]+=\"[,]\"),e.correctResponsesPattern[0]+=t+\"[.]\"+this.options.question.task.dropZones[t].correctElements[r],o=!1;return e},o.prototype.addResponseToXAPI=function(e){var t=this.getMaxScore(),n=this.getScore(),i=n==t;e.setScoredResult(n,t,this,!0,i),e.data.statement.result.response=this.getUserXAPIResponse()},o.prototype.getUserXAPIResponse=function(){var e=this.getUserAnswers();return e?e.filter(function(e){return e.elements.length}).map(function(e,t){return e.elements.filter(function(e){return void 0!==e.dropZone}).map(function(e){return e.dropZone+\"[.]\"+t}).join(\"[,]\")}).filter(function(e){return void 0!==e&&\"\"!==e}).join(\"[,]\"):\"\"},o.prototype.getUserAnswers=function(){return this.draggables.map(function(e,t){return{index:t,draggable:e}}).filter(function(e){return void 0!==e.draggable&&e.draggable.elements}).map(function(e){return{index:e.index,elements:e.draggable.elements}})},o.prototype.createQuestionContent=function(){var e;this.$container=y('<div class=\"h5p-inner\" role=\"application\" aria-labelledby=\"dq-intro-'+w+'\"><\/div>'),void 0!==this.options.question.settings.background&&this.$container.css(\"backgroundImage\",'url(\"'+H5P.getPath(this.options.question.settings.background.path,this.id)+'\")');var t=this.options.question.task;for(e=0;e<t.elements.length;e++){var n=t.elements[e];if(void 0!==n.dropZones&&0!==n.dropZones.length)this.draggables[e].appendTo(this.$container,this.id);else{var i=this.addElement(n,\"static\",e);H5P.newRunnable(n.type,this.id,i);!function(e,t){setTimeout(function(){f.default.setOpacity(e,\"background\",t.backgroundOpacity)},0)}(i,n)}}for(this.$noDropZone.appendTo(this.$container),e=0;e<this.dropZones.length;e++)this.dropZones[e].appendTo(this.$container,this.draggables);return this.$container},o.prototype.registerButtons=function(){this.options.behaviour.enableCheckButton&&this.addSolutionButton(),this.addRetryButton()},o.prototype.addSolutionButton=function(){var e=this;this.addButton(\"check-answer\",this.options.scoreShow,function(){e.answered=!0,e.showAllSolutions(),e.showScore(),e.addExplanation();var t=e.createXAPIEventTemplate(\"answered\");e.addQuestionToXAPI(t),e.addResponseToXAPI(t),e.trigger(t),(e.$introduction?e.$introduction:e.$container.children().first()).focus()})},o.prototype.addExplanation=function(){var e=this,t=this.options.question.task,n=[];t.dropZones.forEach(function(t,i){var o={correct:t.tipsAndFeedback.feedbackOnCorrect,incorrect:t.tipsAndFeedback.feedbackOnIncorrect};if(void 0!==o.correct||void 0!==o.incorrect){var r=t.correctElements,a={};e.draggables.forEach(function(e){e.elements.forEach(function(t){t.dropZone==i&&(a[e.id]={instance:e,correct:-1!==r.indexOf(\"\"+e.id)})})}),Object.keys(a).forEach(function(e){var r=a[e],s=f.default.strip(r.instance.type.params.alt||r.instance.type.params.text)||\"?\",l=f.default.strip(t.label);r.correct&&o.correct?(n.push({correct:l+\" + \"+s,text:o.correct}),r.instance.setFeedback(o.correct,i)):!r.correct&&o.incorrect&&(n.push({correct:l+\" + \",wrong:s,text:o.incorrect}),r.instance.setFeedback(o.incorrect,i))})}}),0!==n.length&&this.setExplanation(n,this.options.feedbackHeader)},o.prototype.addRetryButton=function(){var e=this;this.addButton(\"try-again\",this.options.tryAgain,function(){e.resetTask(),e.showButton(\"check-answer\"),e.hideButton(\"try-again\")},!1)},o.prototype.addElement=function(e,t,n){return y('<div class=\"h5p-'+t+'\" style=\"left:'+e.x+\"%;top:\"+e.y+\"%;width:\"+e.width+\"em;height:\"+e.height+'em\"><\/div>').appendTo(this.$container).data(\"id\",n)},o.prototype.resize=function(e){var t=this;if(void 0!==this.$container&&this.$container.is(\":visible\")){var n=e&&e.data&&e.data.decreaseSize;n||(this.$container.css(\"height\",\"99999px\"),t.$container.parents(\".h5p-standalone.h5p-dragquestion\").css(\"width\",\"\"));var i=this.options.question.settings.size,o=i.width\/i.height,r=this.$container.parent(),a=r.width()-parseFloat(r.css(\"margin-left\"))-parseFloat(r.css(\"margin-right\")),s=t.$container.parents(\".h5p-standalone.h5p-dragquestion.h5p-semi-fullscreen\");if(s.length){s.css(\"width\",\"\"),n||(t.$container.css(\"width\",\"10px\"),s.css(\"width\",\"\"),setTimeout(function(){t.trigger(\"resize\",{decreaseSize:!0})},200));var l=y(window.frameElement);if(l){a=l.parent().width(),s.css(\"width\",a+\"px\")}}var u=a\/o;a<=0&&(a=i.width,u=i.height),this.$container.css({width:a+\"px\",height:u+\"px\",fontSize:a\/i.width*16+\"px\"})}},o.prototype.disableDraggables=function(){this.draggables.forEach(function(e){e.disable()})},o.prototype.enableDraggables=function(){this.draggables.forEach(function(e){e.enable()})},o.prototype.showAllSolutions=function(e){this.points=0,this.rawPoints=0,this.blankIsCorrect&&(this.points=1,this.rawPoints=1);var t;!e&&this.options.behaviour.showScorePoints&&!this.options.behaviour.singlePoint&&this.options.behaviour.applyPenalties&&(t=new H5P.Question.ScorePoints);for(var n=0;n<this.draggables.length;n++){var i=this.draggables[n];void 0!==i&&(e||i.disable(),this.points+=i.results(e,this.correctDZs[n],t),this.rawPoints+=i.rawPoints)}this.points<0&&(this.points=0),!this.answered&&this.blankIsCorrect&&(this.points=this.weight),this.options.behaviour.singlePoint&&(this.points=this.points===this.calculateMaxScore()?1:0),e||this.hideButton(\"check-answer\"),this.options.behaviour.enableRetry&&!e&&this.showButton(\"try-again\"),!this.hasButton(\"check-answer\")||!1!==this.options.behaviour.enableRetry&&this.points!==this.getMaxScore()||this.hideButton(\"try-again\")},o.prototype.showSolutions=function(){this.showAllSolutions(),this.showScore(),this.hideButton(\"check-answer\"),this.hideButton(\"try-again\"),this.disableDraggables()},o.prototype.resetTask=function(){this.points=0,this.rawPoints=0,this.answered=!1,this.enableDraggables(),this.draggables.forEach(function(e){e.resetPosition()}),this.showButton(\"check-answer\"),this.hideButton(\"try-again\"),this.removeFeedback(),this.setExplanation()},o.prototype.calculateMaxScore=function(){var e=0;if(this.blankIsCorrect)return 1;for(var t=this.options.question.task.elements,n=0;n<t.length;n++){var i=this.correctDZs[n];void 0!==i&&i.length&&(t[n].multiple?e+=i.length:e++)}return e},o.prototype.getMaxScore=function(){return this.options.behaviour.singlePoint?this.weight:this.calculateMaxScore()},o.prototype.getScore=function(){this.showAllSolutions(!0);var e=this.options.behaviour.applyPenalties||this.options.behaviour.singlePoint?this.points:this.rawPoints;return delete this.points,delete this.rawPoints,e},o.prototype.getAnswerGiven=function(){return!this.options.behaviour.showSolutionsRequiresInput||this.answered||this.blankIsCorrect},o.prototype.showScore=function(){var e=this.calculateMaxScore();this.options.behaviour.singlePoint&&(e=1);var t=this.options.behaviour.applyPenalties||this.options.behaviour.singlePoint?this.points:this.rawPoints,n=H5P.Question.determineOverallFeedback(this.options.overallFeedback,t\/e).replace(\"@score\",t).replace(\"@total\",e),i=!(!this.options.behaviour.enableScoreExplanation||!this.options.behaviour.applyPenalties)&&this.options.scoreExplanation;this.setFeedback(n,t,e,this.options.scoreBarLabel,i,void 0,this.options.scoreExplanationButtonLabel)},o.prototype.getCurrentState=function(){for(var e={answers:[]},t=0;t<this.draggables.length;t++){var n=this.draggables[t];if(void 0!==n){for(var i=[],o=0;o<n.elements.length;o++){var r=n.elements[o];void 0!==r&&void 0!==r.dropZone&&i.push({x:Number(r.position.left.replace(\"%\",\"\")),y:Number(r.position.top.replace(\"%\",\"\")),dz:r.dropZone})}i.length&&(e.answers[t]=i)}}return e},o.prototype.getCopyrights=function(){var e=this,t=new H5P.ContentCopyrights,n=e.options.question.settings.background;if(void 0!==n&&void 0!==n.copyright){var i=new H5P.MediaCopyright(n.copyright);i.setThumbnail(new H5P.Thumbnail(H5P.getPath(n.path,e.id),n.width,n.height)),t.addMedia(i)}for(var o=0;o<e.options.question.task.elements.length;o++){var r=e.options.question.task.elements[o],a=H5P.newRunnable(r.type,e.id);if(void 0!==a.getCopyrights){var s=a.getCopyrights();s.setLabel((r.dropZones.length?\"Draggable \":\"Static \")+(void 0!==r.type.params.contentName?r.type.params.contentName:\"element\")),t.addContent(s)}}return t},o.prototype.getTitle=function(){return H5P.createTitle(this.options.question.settings.questionTitle)};var k=function(e,t,n){var i={drag:new a.default([new p.default,new l.default]),drop:new a.default([new p.default,new c.default])};i.drag.useNegativeTabIndex(),i.drop.useNegativeTabIndex();var o,r=function(){o.draggable.trigger(\"dragend\"),o.element.$.removeClass(\"h5p-draggable-hover\"),f.default.setElementOpacity(o.element.$,o.draggable.backgroundOpacity),-1!==i.drop.elements.indexOf(n)&&(i.drop.removeElement(n),n.style.display=\"none\");for(var e=0;e<t.length;e++){var r=t[e];r.dehighlight(),-1!==i.drop.elements.indexOf(r.$dropZone[0])&&i.drop.removeElement(r.$dropZone[0])}if(o.element.$.is(\":visible\"))o.element.$.focus();else{var a=o.draggable.elements[o.draggable.elements.length-1].$;i.drag.setTabbable(a[0]),a.focus()}o=void 0};return i.drag.on(\"select\",function(a){var s=f.default.elementToDraggable(e,a.element);if(o)return void r();o=s,o.element.$.addClass(\"h5p-draggable-hover\"),f.default.setElementOpacity(o.element.$,o.draggable.backgroundOpacity),o.draggable.trigger(\"dragstart\",o.draggable.mustCopyElement(o.element)?\"copy\":\"move\"),i.drop.addElement(n),n.style.display=\"block\",n.style.left=o.draggable.x+\"%\",n.style.top=o.draggable.y+\"%\",n.style.width=o.draggable.width+\"em\",n.style.height=o.draggable.height+\"em\";for(var l,u=0;u<t.length;u++){var c=t[u];c.accepts(o.draggable,e)&&(c.highlight(),i.drop.addElement(c.$dropZone[0]),l&&o.element.dropZone!==c.id||(l=c.$dropZone))}l&&(i.drop.setTabbable(l[0]),l.focus())}),i.drop.on(\"select\",function(e){if(o){if(e.element===n)return void 0!==o.element.dropZone&&o.element.reset(),o.draggable.multiple||(o.element.$.css({left:o.draggable.x+\"%\",top:o.draggable.y+\"%\",width:o.draggable.width+\"em\",height:o.draggable.height+\"em\"}),o.draggable.updatePlacement(o.element)),o.element.$[0].setAttribute(\"aria-grabbed\",\"false\"),void r();var i=f.default.elementToDropZone(t,e.element);o.draggable.mustCopyElement(o.element)&&o.element.clone(),o.draggable.addToDropZone(o.index,o.element,i.id),o.element.$.css({left:i.x+\"%\",top:i.y+\"%\"}),-1===i.getIndexOf(o.element.$)&&i.alignables.push(o.element.$),i.autoAlign(),o.element.$[0].setAttribute(\"aria-grabbed\",\"false\"),r()}}),i};H5P.DragQuestion=o},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e},r=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),a=n(1),s=n(0),l=n(5),u=(0,a.removeAttribute)(\"tabindex\"),c=((0,s.forEach)(u),(0,a.setAttribute)(\"tabindex\",\"0\")),d=(0,a.setAttribute)(\"tabindex\",\"-1\"),p=(0,a.hasAttribute)(\"tabindex\"),h=function(){function e(t){i(this,e),o(this,(0,l.Eventful)()),this.plugins=t||[],this.elements=[],this.negativeTabIndexAllowed=!1,this.on(\"nextElement\",this.nextElement,this),this.on(\"previousElement\",this.previousElement,this),this.initPlugins()}return r(e,[{key:\"addElement\",value:function(e){this.elements.push(e),this.firesEvent(\"addElement\",e),1===this.elements.length&&this.setTabbable(e)}},{key:\"removeElement\",value:function(e){this.elements=(0,s.without)([e],this.elements),p(e)&&(this.setUntabbable(e),this.elements[0]&&this.setTabbable(this.elements[0])),this.firesEvent(\"removeElement\",e)}},{key:\"firesEvent\",value:function(e,t){var n=this.elements.indexOf(t);return this.fire(e,{element:t,index:n,elements:this.elements,oldElement:this.tabbableElement})}},{key:\"nextElement\",value:function(e){var t=e.index,n=t===this.elements.length-1,i=this.elements[n?0:t+1];this.setTabbable(i),i.focus()}},{key:\"setTabbable\",value:function(e){(0,s.forEach)(this.setUntabbable.bind(this),this.elements),c(e),this.tabbableElement=e}},{key:\"setUntabbable\",value:function(e){this.negativeTabIndexAllowed?d(e):u(e)}},{key:\"previousElement\",value:function(e){var t=e.index,n=0===t,i=this.elements[n?this.elements.length-1:t-1];this.setTabbable(i),i.focus()}},{key:\"useNegativeTabIndex\",value:function(){this.negativeTabIndexAllowed=!0,this.elements.forEach(function(e){e.hasAttribute(\"tabindex\")||d(e)})}},{key:\"initPlugins\",value:function(){this.plugins.forEach(function(e){void 0!==e.init&&e.init(this)},this)}}]),e}();t.default=h},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});t.Eventful=function(){return{listeners:{},on:function(e,t,n){var i={listener:t,scope:n};return this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(i),this},fire:function(e,t){return(this.listeners[e]||[]).every(function(e){return!1!==e.listener.call(e.scope||this,t)})},propagate:function(e,t){var n=this;e.forEach(function(e){return t.on(e,function(t){return n.fire(e,t)})})}}}},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=n(1),a=n(0),s=(0,r.setAttribute)(\"aria-grabbed\"),l=(0,r.attributeEquals)(\"aria-grabbed\",\"true\"),u=(0,a.filter)((0,r.hasAttribute)(\"aria-grabbed\")),c=(0,a.compose)((0,a.forEach)((0,r.setAttribute)(\"aria-grabbed\",\"false\")),u),d=(0,a.compose)((0,a.some)(l),u),p=function(){function e(){i(this,e)}return o(e,[{key:\"init\",value:function(e){this.controls=e,this.controls.on(\"select\",this.select,this)}},{key:\"addElement\",value:function(e){s(\"false\",e),this.controls.addElement(e)}},{key:\"setAllGrabbedToFalse\",value:function(){c(this.controls.elements)}},{key:\"hasAnyGrabbed\",value:function(){return d(this.controls.elements)}},{key:\"select\",value:function(e){var t=e.element,n=l(t);this.setAllGrabbedToFalse(),n||s(\"true\",t)}}]),e}();t.default=p},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=n(1),a=n(0),s=(0,r.setAttribute)(\"aria-dropeffect\",\"none\"),l=(0,r.setAttribute)(\"aria-dropeffect\",\"move\"),u=(0,a.filter)((0,r.hasAttribute)(\"aria-dropeffect\")),c=(0,a.compose)((0,a.forEach)(l),u),d=(0,a.compose)((0,a.forEach)(s),u),p=function(){function e(){i(this,e)}return o(e,[{key:\"init\",value:function(e){this.controls=e}},{key:\"setAllToMove\",value:function(){c(this.controls.elements)}},{key:\"setAllToNone\",value:function(){d(this.controls.elements)}}]),e}();t.default=p,p.DropEffect={COPY:\"copy\",MOVE:\"move\",EXECUTE:\"execute\",POPUP:\"popup\",NONE:\"none\"}},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=function(){function e(){i(this,e),this.selectability=!0}return o(e,[{key:\"init\",value:function(e){this.boundHandleKeyDown=this.handleKeyDown.bind(this),this.controls=e,this.controls.on(\"addElement\",this.listenForKeyDown,this),this.controls.on(\"removeElement\",this.removeKeyDownListener,this)}},{key:\"listenForKeyDown\",value:function(e){e.element.addEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"removeKeyDownListener\",value:function(e){e.element.removeEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"handleKeyDown\",value:function(e){switch(e.which){case 13:case 32:this.select(e.target),e.preventDefault();break;case 37:case 38:this.hasChromevoxModifiers(e)||(this.previousElement(e.target),e.preventDefault());break;case 39:case 40:this.hasChromevoxModifiers(e)||(this.nextElement(e.target),e.preventDefault())}}},{key:\"hasChromevoxModifiers\",value:function(e){return e.shiftKey||e.ctrlKey}},{key:\"previousElement\",value:function(e){this.controls.firesEvent(\"previousElement\",e)}},{key:\"nextElement\",value:function(e){this.controls.firesEvent(\"nextElement\",e)}},{key:\"select\",value:function(e){this.selectability&&!1!==this.controls.firesEvent(\"before-select\",e)&&(this.controls.firesEvent(\"select\",e),this.controls.firesEvent(\"after-select\",e))}},{key:\"disableSelectability\",value:function(){this.selectability=!1}},{key:\"enableSelectability\",value:function(){this.selectability=!0}}]),e}();t.default=r},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=n(2),a=function(e){return e&&e.__esModule?e:{default:e}}(r),s=H5P.jQuery,l=function(){function e(t,n,o){i(this,e);var r=this;H5P.EventDispatcher.call(r),r.id=n,r.showLabel=t.showLabel,r.label=t.label,r.x=t.x,r.y=t.y,r.width=t.width,r.height=t.height,r.backgroundOpacity=t.backgroundOpacity,r.tip=t.tipsAndFeedback.tip||\"\",r.single=t.single,r.autoAlignable=t.autoAlign,r.alignables=[],r.l10n=o}return o(e,[{key:\"appendTo\",value:function(e,t){var n=this,i='<div class=\"h5p-inner\"><\/div>',o=\"\";n.showLabel&&(i='<div class=\"h5p-label\">'+n.label+'<span class=\"h5p-hidden-read\"><\/span><\/div>'+i,o=\" h5p-has-label\"),i='<span class=\"h5p-hidden-read\">'+n.l10n.prefix.replace(\"{num}\",n.id+1)+\"<\/span>\"+i,n.$dropZone=s(\"<div\/>\",{class:\"h5p-dropzone\"+o,tabindex:\"-1\",role:\"button\",\"aria-disabled\":!0,css:{left:n.x+\"%\",top:n.y+\"%\",width:n.width+\"em\",height:n.height+\"em\"},html:i}).appendTo(e).children(\".h5p-inner\").droppable({activeClass:\"h5p-active\",tolerance:\"intersect\",accept:function(e){var i=a.default.elementToDraggable(t,e);return!!i&&n.accepts(i.draggable,t)},drop:function(e,t){var i=s(this);a.default.setOpacity(i.removeClass(\"h5p-over\"),\"background\",n.backgroundOpacity),t.draggable.data(\"addToZone\",n.id),-1===n.getIndexOf(t.draggable)&&n.alignables.push(t.draggable),n.autoAlignable.enabled&&n.autoAlign()},over:function(){a.default.setOpacity(s(this).addClass(\"h5p-over\"),\"background\",n.backgroundOpacity)},out:function(){a.default.setOpacity(s(this).removeClass(\"h5p-over\"),\"background\",n.backgroundOpacity)}}).end().focus(function(){r instanceof H5P.jQuery&&r.attr(\"tabindex\",\"0\")}).blur(function(){r instanceof H5P.jQuery&&r.attr(\"tabindex\",\"-1\")});var r=H5P.JoubelUI.createTip(n.tip,{tipLabel:n.l10n.tipLabel,tabcontrol:!0});r instanceof H5P.jQuery&&s(\"<span\/>\",{class:\"h5p-dq-tipwrap\",\"aria-label\":n.l10n.tipAvailable,append:r,appendTo:n.$dropZone}),t.forEach(function(e){var t=e.element.$;e.isInDropZone(n.id)&&-1===n.getIndexOf(t)&&n.alignables.push(t)}),n.autoAlignable.enabled&&n.autoAlign(),setTimeout(function(){a.default.setOpacity(n.$dropZone.children(\".h5p-label\"),\"background\",n.backgroundOpacity),a.default.setOpacity(n.$dropZone.children(\".h5p-inner\"),\"background\",n.backgroundOpacity)},0)}},{key:\"accepts\",value:function(e,t){var n=this;if(!e.hasDropZone(n.id))return!1;if(n.single)for(var i=0;i<t.length;i++)if(t[i]&&t[i].isInDropZone(n.id))return!1;return!0}},{key:\"getIndexOf\",value:function(e){for(var t=this,n=0;n<t.alignables.length;n++)if(t.alignables[n][0]===e[0])return n;return-1}},{key:\"removeAlignable\",value:function(e){var t=this,n=t.getIndexOf(e);-1!==n&&(t.alignables.splice(n,1),void 0===t.autoAlignTimer&&(t.autoAlignTimer=setTimeout(function(){delete t.autoAlignTimer,t.autoAlign()},1)))}},{key:\"autoAlign\",value:function(){for(var e,t,n=this,i=n.$dropZone.parent()[0].getBoundingClientRect(),o={x:n.autoAlignable.spacing\/n.autoAlignable.size.width*100,y:n.autoAlignable.spacing\/n.autoAlignable.size.height*100},r={x:n.x+o.x,y:n.y+o.y},a=n.$dropZone[0].getBoundingClientRect(),s={x:a.width-2*o.x,y:a.height-2*o.y},l={x:s.x,y:s.y},u=0,c=function(){e.css({left:r.x+\"%\",top:r.y+\"%\"}),n.trigger(\"elementaligned\",e);var o=t.width+n.autoAlignable.spacing;l.x-=o,r.x+=o\/i.width*100;var a=t.height+n.autoAlignable.spacing;a>u&&(u=a)},d=0;d<n.alignables.length;d++)if(e=n.alignables[d],t=e[0].getBoundingClientRect(),l.x>=t.width)c();else{if(l.x=s.x,r.x=n.x+o.x,u&&(l.y-=u,r.y+=u\/i.height*100,u=0),l.y<=0)return;c()}}},{key:\"highlight\",value:function(){this.$dropZone.attr(\"aria-disabled\",\"false\").children(\".h5p-inner\").addClass(\"h5p-active\")}},{key:\"dehighlight\",value:function(){this.$dropZone.attr(\"aria-disabled\",\"true\").children(\".h5p-inner\").removeClass(\"h5p-active\")}}]),e}();t.default=l},function(e,t,n){\"use strict\";function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function r(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),s=n(2),l=function(e){return e&&e.__esModule?e:{default:e}}(s),u=H5P.jQuery,c=function(e){function t(e,n,r,a){i(this,t);var s=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this)),l=s;if(l.$=u(l),l.id=n,l.elements=[],l.x=e.x,l.y=e.y,l.width=e.width,l.height=e.height,l.backgroundOpacity=e.backgroundOpacity,l.dropZones=e.dropZones,l.type=e.type,l.multiple=e.multiple,l.l10n=a,r){l.multiple&&l.elements.push({});for(var c=0;c<r.length;c++)l.elements.push({dropZone:r[c].dz,position:{left:r[c].x+\"%\",top:r[c].y+\"%\"}})}return s}return r(t,e),a(t,[{key:\"appendTo\",value:function(e,t){var n=this;if(n.elements.length)for(var i=0;i<n.elements.length;i++)n.attachElement(i,e,t);else n.attachElement(null,e,t)}},{key:\"attachElement\",value:function(e,t,n){var i,o=this;null===e?(i={},o.elements.push(i),e=o.elements.length-1):i=o.elements[e],u.extend(i,{clone:function(){o.attachElement(null,t,n)},reset:function(){void 0!==i.dropZone&&(o.trigger(\"leavingDropZone\",i),delete i.dropZone),o.multiple&&(i.$.remove(),delete o.elements[e],o.trigger(\"elementremove\",i.$[0])),delete i.position}}),i.$=u(\"<div\/>\",{class:\"h5p-draggable\",tabindex:\"-1\",role:\"button\",css:{left:o.x+\"%\",top:o.y+\"%\",width:o.width+\"em\",height:o.height+\"em\"},appendTo:t}).on(\"click\",function(){o.trigger(\"focus\",this)}).draggable({revert:function(e){t.removeClass(\"h5p-dragging\");var n=u(this);return n.data(\"uiDraggable\").originalPosition={top:o.y+\"%\",left:o.x+\"%\"},o.updatePlacement(i),n[0].setAttribute(\"aria-grabbed\",\"false\"),o.trigger(\"dragend\"),!e},start:function(){var e=u(this),n=o.mustCopyElement(i);n&&i.clone(),e.removeClass(\"h5p-wrong\").detach().appendTo(t),t.addClass(\"h5p-dragging\"),l.default.setElementOpacity(e,o.backgroundOpacity),this.setAttribute(\"aria-grabbed\",\"true\"),o.trigger(\"focus\",this),o.trigger(\"dragstart\",{element:this,effect:n?\"copy\":\"move\"})},stop:function(){var n=u(this);i.position=l.default.positionToPercentage(t,n),n.css(i.position);var r=n.data(\"addToZone\");void 0!==r?(n.removeData(\"addToZone\"),o.addToDropZone(e,i,r)):i.reset()}}).css(\"position\",\"\"),o.element=i,i.position&&(i.$.css(i.position),o.updatePlacement(i)),l.default.addHover(i.$,o.backgroundOpacity),H5P.newRunnable(o.type,n,i.$),u('<span class=\"h5p-hidden-read\">'+o.l10n.prefix.replace(\"{num}\",o.id+1)+\"<\/span>\").prependTo(i.$),u('<span class=\"h5p-hidden-read\"><\/span>').appendTo(i.$),setTimeout(function(){l.default.setElementOpacity(i.$,o.backgroundOpacity)},0),o.trigger(\"elementadd\",i.$[0])}},{key:\"setFeedback\",value:function(e,t){this.elements.forEach(function(n){n.dropZone===t&&(void 0===n.$feedback&&(n.$feedback=u(\"<span>\",{class:\"h5p-hidden-read\",appendTo:n.$})),n.$feedback.html(e))})}},{key:\"mustCopyElement\",value:function(e){return this.multiple&&void 0===e.dropZone}},{key:\"hasDropZone\",value:function(e){for(var t=this,n=0;n<t.dropZones.length;n++)if(parseInt(t.dropZones[n])===e)return!0;return!1}},{key:\"addToDropZone\",value:function(e,t,n){var i=this;if(i.multiple)for(var o=0;o<i.elements.length;o++)if(o!==e&&void 0!==i.elements[o]&&i.elements[o].dropZone===n)return void 0!==i.elements[e].dropZone&&i.elements[e].dropZone!==n&&i.trigger(\"leavingDropZone\",t),t.$.remove(),delete i.elements[e],void i.trigger(\"elementremove\",this.element.$[0]);void 0!==t.dropZone&&t.dropZone!==n&&i.trigger(\"leavingDropZone\",t),t.dropZone=n,i.updatePlacement(t),i.trigger(\"interacted\")}},{key:\"updatePlacement\",value:function(e){e.$suffix&&e.$suffix.remove(),void 0!==e.dropZone?(e.$.addClass(\"h5p-dropped\"),l.default.setElementOpacity(e.$,self.backgroundOpacity),e.$suffix=u('<span class=\"h5p-hidden-read\">'+this.l10n.suffix.replace(\"{num}\",e.dropZone+1)+\". <\/span>\").appendTo(e.$)):(e.$.removeClass(\"h5p-dropped\").removeClass(\"h5p-wrong\").removeClass(\"h5p-correct\").css({border:\"\",background:\"\"}),l.default.setElementOpacity(e.$,this.backgroundOpacity))}},{key:\"resetPosition\",value:function(){var e=this;this.elements.forEach(function(t){if(t.$feedback&&(t.$feedback.remove(),delete t.$feedback),void 0!==t.dropZone){var n=t.$;n.animate({left:e.x+\"%\",top:e.y+\"%\"},function(){e.multiple&&(void 0!==n.dropZone&&e.trigger(\"leavingDropZone\",n),n.remove(),e.elements.indexOf(t)>=0&&delete e.elements[e.elements.indexOf(t)],e.trigger(\"elementremove\",n[0]))}),e.updatePlacement(t)}}),void 0!==e.element.dropZone&&(e.trigger(\"leavingDropZone\",e.element),delete e.element.dropZone),e.updatePlacement(e.element)}},{key:\"findElement\",value:function(e){for(var t=this,n=0;n<t.elements.length;n++)if(void 0!==t.elements[n]&&t.elements[n].$.is(e))return{element:t.elements[n],index:n}}},{key:\"isInDropZone\",value:function(e){for(var t=this,n=0;n<t.elements.length;n++)if(void 0!==t.elements[n]&&t.elements[n].dropZone===e)return!0;return!1}},{key:\"disable\",value:function(){for(var e=this,t=0;t<e.elements.length;t++){var n=e.elements[t];n&&(n.$.draggable(\"disable\"),e.trigger(\"elementremove\",n.$[0]))}}},{key:\"enable\",value:function(){for(var e=this,t=0;t<e.elements.length;t++){var n=e.elements[t];n&&(n.$.draggable(\"enable\"),e.trigger(\"elementadd\",n.$[0]))}}},{key:\"results\",value:function(e,t,n){var i,o,r,a,s=this,l=0;if(s.rawPoints=0,void 0===t){for(i=0;i<s.elements.length;i++)void 0!==(r=s.elements[i])&&void 0!==r.dropZone&&(!0!==e&&s.markElement(r,\"wrong\",n),l--);return l}for(i=0;i<s.elements.length;i++)if(void 0!==(r=s.elements[i])&&void 0!==r.dropZone){for(a=!1,o=0;o<t.length;o++)if(r.dropZone===t[o]){!0!==e&&s.markElement(r,\"correct\",n),a=!0,s.rawPoints++,l++;break}a||(!0!==e&&s.markElement(r,\"wrong\",n),l--)}return l}},{key:\"markElement\",value:function(e,t,n){var i=u(\"<span\/>\",{class:\"h5p-hidden-read\",html:this.l10n[t+\"Answer\"]+\". \"});n&&(i=i.add(n.getElement(\"correct\"===t))),e.$suffix=e.$suffix.add(i),e.$.addClass(\"h5p-\"+t).append(i),l.default.setElementOpacity(e.$,this.backgroundOpacity)}}]),t}(H5P.EventDispatcher);t.default=c}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.SummaryTextualEditor-1.1\/summary-textual-editor.js?ver=1.1.1":"\n\/** @namespace H5PEditor *\/\nvar H5PEditor = H5PEditor || {};\n\nH5PEditor.SummaryTextualEditor = (function ($) {\n\n  \/**\n   * Creates a text input widget for editing summaries.\n   *\n   * @class\n   * @param {List}\n   *\/\n  function SummaryTextualEditor(list) {\n    var self = this;\n    var entity = list.getEntity();\n    var recreation = false;\n    var shouldWarn = false;\n\n    \/**\n     * Instructions as to how this editor widget is used.\n     * @public\n     *\/\n    self.helpText = t('helpText');\n\n    \/\/ Create list html\n    var $input = $('<textarea\/>', {\n      rows: 20,\n      css: {\n        resize: 'none'\n      },\n      placeholder: t('example'),\n      on: {\n        change: function () {\n          recreateList();\n        }\n      }\n    });\n\n    \/\/ Used to convert HTML to text and vice versa\n    var $cleaner = $('<div\/>');\n\n    \/**\n     * Clears all items from the list, processes the text and add the items\n     * from the text. This makes it possible to switch to another widget\n     * without losing datas.\n     *\n     * @private\n     *\/\n    var recreateList = function () {\n      \/\/ Get text input\n      var textLines = $input.val().split(\"\\n\");\n      textLines.push(''); \/\/ Add separator\n\n      \/\/ Reset list\n      list.removeAllItems();\n      recreation = true;\n      \/\/ TODO: recreation can be dropped when group structure can be created without being appended.\n      \/\/ Then the fields can be added back to the textarea like a validation.\n\n      \/\/ Go through text lines and add statements to list\n      var tip, statements = [];\n      for (var i = 0; i < textLines.length; i++) {\n        var textLine = textLines[i].trim();\n        if (textLine === '') {\n          \/\/ Task seperator\n          if (statements.length || tip !== undefined) {\n            \/\/ Add statements to list\n            list.addItem({\n              summary: statements,\n              tip: tip\n            });\n\n            \/\/ Start new list of statements\n            statements = [];\n            tip = undefined;\n          }\n          continue;\n        }\n\n        \/\/ Convert text to html\n        textLine = $cleaner.text(textLine).html();\n\n        if (!statements.length && textLine.substr(0, 1) === ':') {\n          \/\/ If first line begins with \":\", it's a tip\n          tip = textLine.substr(1, textLine.length);\n        }\n        else {\n          \/\/ Add statement\n          statements.push(textLine);\n        }\n      }\n\n      recreation = false;\n    };\n\n    \/**\n     * Find the name of the given field.\n     *\n     * @private\n     * @param {Object} field\n     * @return {String}\n     *\/\n    var getName = function (field) {\n      return (field.getName !== undefined ? field.getName() : field.field.name);\n    };\n\n    \/**\n     * Add items to the text input.\n     *\n     * @public\n     * @param {Object} item instance\n     *\/\n    self.addItem = function (item) {\n      if (recreation) {\n        return;\n      }\n      if (!(item instanceof H5PEditor.Group)) {\n        return;\n      }\n\n      var text = '';\n      item.forEachChild(function (child) {\n        switch (getName(child)) {\n          case 'summary':\n            \/\/ Cycle through statements list\n            child.forEachChild(function (grandChild) {\n              \/\/ Grab HTML from text fields\n              var html = grandChild.validate();\n              if (html !== false) {\n                \/\/ Strip all html tags and remove line breaks.\n                html = html.replace(\/(<[^>]*>|\\r\\n|\\n|\\r)\/gm, '').trim();\n                if (html !== '') {\n                 text += html + '\\n';\n                }\n              }\n            });\n            break;\n\n          case 'tip':\n            \/\/ Cycle through field in the tip group\n            child.forEachChild(function (grandChild) {\n              \/\/ Found text field containing tip\n              var tip = grandChild.validate();\n              if (tip !== false) {\n                tip = tip.trim();\n                if (tip !== '') {\n                  \/\/ Add tip to the beginning\n                  text = ':' + tip + '\\n' + text;\n                }\n              }\n            });\n            break;\n        }\n      });\n\n      if (text !== '') {\n        \/\/ Convert all escaped html to text\n        $cleaner.html(text);\n        text = $cleaner.text();\n\n        \/\/ Append text\n        var current = $input.val();\n        if (current !== '') {\n          current += '\\n';\n        }\n        $input.val(current + text);\n\n        if (!warned && !shouldWarn) {\n          shouldWarn = true;\n        }\n      }\n    };\n\n    \/**\n     * Puts this widget at the end of the given container.\n     *\n     * @public\n     * @param {jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      $input.appendTo($container);\n      if (shouldWarn && !warned) {\n        alert(t('warning'));\n        warned = true;\n      }\n    };\n\n    \/**\n     * Remove this widget from the editor DOM.\n     *\n     * @public\n     *\/\n    self.remove = function () {\n      $input.remove();\n    };\n  }\n\n  \/**\n   * Helps localize strings.\n   *\n   * @private\n   * @param {String} identifier\n   * @param {Object} [placeholders]\n   * @returns {String}\n   *\/\n  var t = function (identifier, placeholders) {\n    return H5PEditor.t('H5PEditor.SummaryTextualEditor', identifier, placeholders);\n  };\n\n  \/**\n  * Warn user the first time he uses the editor.\n  *\/\n  var warned = false;\n\n  return SummaryTextualEditor;\n})(H5P.jQuery);\n\n\n\/\/ Add translations\nH5PEditor.language['H5PEditor.SummaryTextualEditor'] = {\n  'libraryStrings': {\n    'helpText': 'Write each statement on a separate line.\\nUse an empty line to separate sets of statements.\\nFirst statement is always correct.\\nIf there is a tip - it is written on the first line with the prefix \" : \"',\n    'example': '2 + 2 = 4\\n0 * 4 = 4\\n\\n:Scandinavian city\\nOslo is the capital of Norway\\nOslo is the capital of Sweden\\nOslo is the capital of Island',\n    'warning': 'Warning! If you change the tasks in the textual editor all rich text formatting(incl. line breaks) will be removed.',\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Summary-1.8\/js\/stop-watch.js?ver=1.8.4":"\nvar H5P = H5P || {};\nH5P.Summary = H5P.Summary || {};\n\nH5P.Summary.StopWatch = (function () {\n  \/**\n   * @class {H5P.Summary.StopWatch}\n   * @constructor\n   *\/\n  function StopWatch() {\n    \/**\n     * @property {number} duration in ms\n     *\/\n    this.duration = 0;\n  }\n\n  \/**\n   * Starts the stop watch\n   *\n   * @public\n   * @return {H5P.Summary.StopWatch}\n   *\/\n  StopWatch.prototype.start = function(){\n    \/**\n     * @property {number}\n     *\/\n    this.startTime = Date.now();\n    return this;\n  };\n\n  \/**\n   * Stops the stopwatch, and returns the duration in seconds.\n   *\n   * @public\n   * @return {number}\n   *\/\n  StopWatch.prototype.stop = function(){\n    this.duration = this.duration + Date.now() - this.startTime;\n    return this.passedTime();\n  };\n\n  \/**\n   * Sets the duration to 0\n   *\n   * @public\n   *\/\n  StopWatch.prototype.reset = function(){\n    this.duration = 0;\n  };\n\n  \/**\n   * Returns the passed time in seconds\n   *\n   * @public\n   * @return {number}\n   *\/\n  StopWatch.prototype.passedTime = function(){\n    return Math.round(this.duration \/ 10) \/ 100;\n  };\n\n  return StopWatch;\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Summary-1.8\/js\/xapi-event-builder.js?ver=1.8.4":"\nvar H5P = H5P || {};\nH5P.Summary = H5P.Summary || {};\n\nH5P.Summary.XApiEventBuilder = (function ($, EventDispatcher) {\n  \/**\n   * @typedef {object} LocalizedString\n   * @property {string} en-US\n   *\/\n\n  \/**\n   * @class {H5P.Summary.XApiEventDefinitionBuilder}\n   * @constructor\n   *\/\n  function XApiEventDefinitionBuilder(){\n    EventDispatcher.call(this);\n    \/**\n     * @property {object} attributes\n     * @property {string} attributes.name\n     * @property {string} attributes.description\n     * @property {string} attributes.interactionType\n     * @property {string} attributes.correctResponsesPattern\n     * @property {object} attributes.optional\n     *\/\n    this.attributes = {};\n  }\n\n  XApiEventDefinitionBuilder.prototype = Object.create(EventDispatcher.prototype);\n  XApiEventDefinitionBuilder.prototype.constructor = XApiEventDefinitionBuilder;\n\n\n  \/**\n   * Sets name\n   * @param {string} name\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.name = function (name) {\n    this.attributes.name = name;\n    return this;\n  };\n\n  \/**\n   * Question text and any additional information to generate the report.\n   * @param {string} description\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.description = function (description) {\n    this.attributes.description = description;\n    return this;\n  };\n\n  \/**\n   * Type of the interaction.\n   * @param {string} interactionType\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#interaction-types|xAPI Spec}\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.interactionType = function (interactionType) {\n    this.attributes.interactionType = interactionType;\n    return this;\n  };\n\n  \/**\n   * A pattern for determining the correct answers of the interaction\n   * @param {string[]} correctResponsesPattern\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#response-patterns|xAPI Spec}\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.correctResponsesPattern = function (correctResponsesPattern) {\n    this.attributes.correctResponsesPattern = correctResponsesPattern;\n    return this;\n  };\n\n  \/**\n   * Sets optional attributes\n   * @param {object} optional Can have one of the following configuration objects: choices, scale, source, target, steps\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventDefinitionBuilder.prototype.optional = function (optional) {\n    this.attributes.optional = optional;\n    return this;\n  };\n\n  \/**\n   * @return {object}\n   *\/\n  XApiEventDefinitionBuilder.prototype.build = function () {\n    var definition = {};\n\n    \/\/ sets attributes\n    setAttribute(definition, 'name', localizeToEnUS(this.attributes.name));\n    setAttribute(definition, 'description', localizeToEnUS(this.attributes.description));\n    setAttribute(definition, 'interactionType', this.attributes.interactionType);\n    setAttribute(definition, 'correctResponsesPattern', this.attributes.correctResponsesPattern);\n    setAttribute(definition, 'type', 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction');\n\n    \/\/ adds the optional object to the definition\n    if(this.attributes.optional){\n      $.extend(definition, this.attributes.optional);\n    }\n\n    return definition;\n  };\n\n  \/\/ -----------------------------------------------------\n\n  \/**\n   *\n   * @constructor\n   *\/\n  function XApiEventResultBuilder(){\n    EventDispatcher.call(this);\n    \/**\n     * @property {object} attributes\n     * @property {string} attributes.completion\n     * @property {boolean} attributes.success\n     * @property {boolean} attributes.response\n     * @property {number} attributes.rawScore\n     * @property {number} attributes.maxScore\n     *\/\n    this.attributes = {};\n  }\n\n  XApiEventResultBuilder.prototype = Object.create(EventDispatcher.prototype);\n  XApiEventResultBuilder.prototype.constructor = XApiEventResultBuilder;\n\n  \/**\n   * @param {boolean} completion\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.completion = function (completion) {\n    this.attributes.completion = completion;\n    return this;\n  };\n\n  \/**\n   * @param {boolean} success\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.success = function (success) {\n    this.attributes.success = success;\n    return this;\n  };\n\n  \/**\n   * @param {number} duration The duraction in seconds\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.duration = function (duration) {\n    this.attributes.duration = duration;\n    return this;\n  };\n\n  \/**\n   * Sets response\n   * @param {string|string[]} response\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.response = function (response) {\n    this.attributes.response = (typeof response === 'string') ? response : response.join('[,]');\n    return this;\n  };\n\n  \/**\n   * Sets the score, and max score\n   * @param {number} score\n   * @param {number} maxScore\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventResultBuilder.prototype.score = function (score, maxScore) {\n    this.attributes.rawScore = score;\n    this.attributes.maxScore = maxScore;\n    return this;\n  };\n\n  \/**\n   * Builds the result object\n   * @return {object}\n   *\/\n  XApiEventResultBuilder.prototype.build = function () {\n    var result = {};\n\n    setAttribute(result, 'response', this.attributes.response);\n    setAttribute(result, 'completion', this.attributes.completion);\n    setAttribute(result, 'success', this.attributes.success);\n\n    if(isDefined(this.attributes.duration)){\n      setAttribute(result, 'duration','PT' +  this.attributes.duration + 'S');\n    }\n\n    \/\/ sets score\n    if (isDefined(this.attributes.rawScore)) {\n      result.score = {};\n      setAttribute(result.score, 'raw', this.attributes.rawScore);\n\n      if (isDefined(this.attributes.maxScore) && this.attributes.maxScore > 0) {\n        setAttribute(result.score, 'min', 0);\n        setAttribute(result.score, 'max', this.attributes.maxScore);\n        setAttribute(result.score, 'min', 0);\n        setAttribute(result.score, 'scaled', Math.round(this.attributes.rawScore \/ this.attributes.maxScore * 10000) \/ 10000);\n      }\n    }\n\n    return result;\n  };\n\n  \/\/ -----------------------------------------------------\n\n  \/**\n   * @class {H5P.Summary.XApiEventBuilder}\n   *\/\n  function XApiEventBuilder() {\n    EventDispatcher.call(this);\n    \/**\n     * @property {object} attributes\n     * @property {string} attributes.contentId\n     * @property {string} attributes.subContentId\n     *\/\n    this.attributes = {};\n  }\n\n  XApiEventBuilder.prototype = Object.create(EventDispatcher.prototype);\n  XApiEventBuilder.prototype.constructor = XApiEventBuilder;\n\n\n  \/**\n   * @param {object} verb\n   *\n   * @public\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.verb = function (verb) {\n    this.attributes.verb = verb;\n    return this;\n  };\n\n  \/**\n   * @param {string} name\n   * @param {string} mbox\n   * @param {string} objectType\n   *\n   * @public\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.actor = function (name, mbox, objectType) {\n    this.attributes.actor = {\n      name: name,\n      mbox: mbox,\n      objectType: objectType\n    };\n\n    return this;\n  };\n\n  \/**\n   * Sets contentId\n   * @param {string} contentId\n   * @param {string} [subContentId]\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.contentId = function (contentId, subContentId) {\n    this.attributes.contentId = contentId;\n    this.attributes.subContentId = subContentId;\n    return this;\n  };\n\n  \/**\n   * Sets parent in context\n   * @param {string} parentContentId\n   * @param {string} [parentSubContentId]\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.context = function (parentContentId, parentSubContentId) {\n    this.attributes.parentContentId = parentContentId;\n    this.attributes.parentSubContentId = parentSubContentId;\n    return this;\n  };\n\n  \/**\n   * @param {object} result\n   *\n   * @public\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.result = function (result) {\n    this.attributes.result = result;\n    return this;\n  };\n\n  \/**\n   * @param {object} objectDefinition\n   *\n   * @public\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.prototype.objectDefinition = function (objectDefinition) {\n    this.attributes.objectDefinition = objectDefinition;\n    return this;\n  };\n\n  \/**\n   * Returns the buildt event\n   * @public\n   * @return {H5P.XAPIEvent}\n   *\/\n  XApiEventBuilder.prototype.build = function(){\n    var event = new H5P.XAPIEvent();\n\n    event.setActor();\n    event.setVerb(this.attributes.verb);\n\n    \/\/ sets context\n    if(this.attributes.parentContentId || this.attributes.parentSubContentId){\n      event.data.statement.context = {\n        'contextActivities': {\n          'parent': [\n            {\n              'id': getContentXAPIId(this.attributes.parentContentId, this.attributes.parentSubContentId),\n              'objectType': \"Activity\"\n            }\n          ]\n        }\n      };\n    }\n\n    event.data.statement.object = {\n      'id': getContentXAPIId(this.attributes.contentId, this.attributes.subContentId),\n      'objectType': 'Activity'\n    };\n\n    setAttribute(event.data, 'actor', this.attributes.actor);\n    setAttribute(event.data.statement, 'result', this.attributes.result);\n    setAttribute(event.data.statement.object, 'definition', this.attributes.objectDefinition);\n\n    \/\/ sets h5p specific attributes\n    if(event.data.statement.object.definition && (this.attributes.contentId || this.attributes.subContentId)) {\n      var extensions = event.data.statement.object.definition.extensions = {};\n      setAttribute(extensions, 'http:\/\/h5p.test.schulcloud-thueringen.de\/x-api\/h5p-local-content-id', this.attributes.contentId);\n      setAttribute(extensions, 'http:\/\/h5p.test.schulcloud-thueringen.de\/x-api\/h5p-subContentId', this.attributes.subContentId);\n    }\n\n    return event;\n  };\n\n  \/**\n   * Creates a Localized String object for en-US\n   *\n   * @param str\n   * @return {LocalizedString}\n   *\/\n  var localizeToEnUS = function(str){\n    if(str != undefined){\n      return {\n        'en-US': cleanString(str)\n      };\n    }\n  };\n\n  \/**\n   * Generates an id for the content\n   * @param {string} contentId\n   * @param {string} [subContentId]\n   *\n   * @see {@link https:\/\/github.com\/h5p\/h5p-php-library\/blob\/master\/js\/h5p-x-api-event.js#L240-L249}\n   * @return {string}\n   *\/\n  var getContentXAPIId = function (contentId, subContentId) {\n    if (contentId && H5PIntegration && H5PIntegration.contents) {\n      var id =  H5PIntegration.contents['cid-' + contentId].url;\n\n      if (subContentId) {\n        id += '?subContentId=' +  subContentId;\n      }\n\n      return id;\n    }\n  };\n\n  \/**\n   * Removes html elements from string\n   *\n   * @param {string} str\n   * @return {string}\n   *\/\n  var cleanString = function (str) {\n    return $('<div>' + str + '<\/div>').text().trim();\n  };\n\n  var isDefined = function(val){\n    return typeof val !== 'undefined';\n  };\n\n  function setAttribute(obj, key, value, required){\n    if(isDefined(value)){\n      obj[key] = value;\n    } else if (required) {\n      console.error(\"xApiEventBuilder: No value for [\" + key + \"] in\", obj);\n    }\n  }\n\n  \/**\n   * Creates a new XApiEventBuilder\n   *\n   * @public\n   * @static\n   * @return {H5P.Summary.XApiEventBuilder}\n   *\/\n  XApiEventBuilder.create = function(){\n    return new XApiEventBuilder();\n  };\n\n  \/**\n   * Creates a new XApiEventDefinitionBuilder\n   *\n   * @public\n   * @static\n   * @return {XApiEventDefinitionBuilder}\n   *\/\n  XApiEventBuilder.createDefinition = function(){\n    return new XApiEventDefinitionBuilder();\n  };\n\n  \/**\n   * Creates a new XApiEventDefinitionBuilder\n   *\n   * @public\n   * @static\n   * @return {XApiEventResultBuilder}\n   *\/\n  XApiEventBuilder.createResult = function(){\n    return new XApiEventResultBuilder();\n  };\n\n  \/**\n   * Returns choice to be used with 'cmi.interaction' for Activity of type 'choice'\n   *\n   * @param {string} id\n   * @param {string} description\n   *\n   * @public\n   * @static\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#choice|xAPI-Spec}\n   * @return {object}\n   *\/\n  XApiEventBuilder.createChoice = function(id, description){\n    return {\n      id: id,\n      description: localizeToEnUS(description)\n    };\n  };\n\n  \/**\n   * Takes an array of correct ids, and joins them to a 'correct response pattern'\n   *\n   * @param {string[]} ids\n   *\n   * @public\n   * @static\n   * @see {@link https:\/\/github.com\/adlnet\/xAPI-Spec\/blob\/master\/xAPI-Data.md#choice|xAPI-Spec}\n   * @return {string}\n   *\/\n  XApiEventBuilder.createCorrectResponsePattern = function(ids){\n    return ids.join('[,]');\n  };\n\n  \/**\n   * Interaction types\n   *\n   * @readonly\n   * @enum {String}\n   *\/\n  XApiEventBuilder.interactionTypes = {\n    CHOICE: 'choice',\n    COMPOUND: 'compound',\n    FILL_IN: 'fill-in',\n    MATCHING: 'matching',\n    TRUE_FALSE: 'true-false'\n  };\n\n  \/**\n   * Verbs\n   *\n   * @readonly\n   * @enum {String}\n   *\/\n  XApiEventBuilder.verbs = {\n    ANSWERED: 'answered'\n  };\n\n  return XApiEventBuilder;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Summary-1.8\/js\/summary.js?ver=1.8.4":"\nH5P.Summary = (function ($, Question, XApiEventBuilder, StopWatch) {\n\n  var summaryId = 0;\n\n  function Summary(options, contentId, contentData) {\n    if (!(this instanceof H5P.Summary)) {\n      return new H5P.Summary(options, contentId);\n    }\n\n    this.id = this.contentId = contentId;\n    this.summaryId = summaryId;\n    Question.call(this, 'summary');\n    this.offset = 0;\n    this.score = 0;\n    this.progress = 0;\n    this.answers = [];\n    this.answer = [];\n    this.errorCounts = [];\n\n    summaryId += 1;\n\n    \/**\n     * The key is panel index, returns an array of the answer indexes the user tried.\n     *\n     * @property {number[][]}\n     *\/\n    this.userResponses = [];\n\n    \/**\n     * The first key is panel index, and the second key is data-bit, value is index in panel\n     *\n     * @property {number[][]}\n     *\/\n    this.dataBitMap = [];\n\n    \/\/ Remove empty summary to avoid JS-errors\n    if (options.summaries) {\n      options.summaries = options.summaries.filter(function (element) {\n        return element.summary !== undefined;\n      });\n    }\n\n    if (contentData && contentData.previousState !== undefined &&\n        contentData.previousState.progress !== undefined &&\n        contentData.previousState.answers) {\n      this.progress = contentData.previousState.progress || this.progress;\n      this.answers = contentData.previousState.answers || this.answers;\n\n      var currentProgress = this.progress;\n\n      \/\/ Do not count score screen as an error\n      if (this.progress >= options.summaries.length) {\n        currentProgress = options.summaries.length - 1;\n      }\n\n      for (var i = 0; i <= currentProgress; i++) {\n        if (this.errorCounts[i] === undefined) {\n          this.errorCounts[i] = 0;\n        }\n        if (this.answers[i]) {\n          this.score += this.answers[i].length;\n          this.errorCounts[i]++;\n        }\n      }\n    }\n    var that = this;\n\n    \/**\n     * @property {StopWatch[]} Stop watches for tracking duration of slides\n     *\/\n    this.stopWatches = [];\n    this.startStopWatch(this.progress);\n\n    this.options = H5P.jQuery.extend({}, {\n      overallFeedback: [],\n      resultLabel: \"Your result:\",\n      intro: \"Choose the correct statement.\",\n      solvedLabel: \"Solved:\",\n      scoreLabel: \"Wrong answers:\",\n      labelCorrect: \"Correct.\",\n      incorrectText: \"Incorrect! Please try again.\",\n      labelCorrectAnswers: \"List of correct answers.\",\n      postUserStatistics: (H5P.postUserStatistics === true),\n      tipButtonLabel: 'Show tip',\n      scoreBarLabel: 'You got :num out of :total points',\n      progressText: 'Progress :num of :total'\n    }, options);\n\n    this.summaries = that.options.summaries;\n\n    \/\/ Prevent the score bar from interrupting the progress counter\n    this.setBehaviour({disableReadSpeaker: true});\n\n    \/\/ Required questiontype contract function\n    this.showSolutions = function() {\n      \/\/ intentionally left blank, no solution view exists\n    };\n\n    \/\/ Required questiontype contract function\n    this.getMaxScore = function() {\n      return this.summaries.length;\n    };\n\n    this.getScore = function() {\n      var self = this;\n\n      \/\/ count single correct answers\n      return self.summaries.reduce(function(result, panel, index){\n        var userResponse = self.userResponses[index] || [];\n\n        return result + (self.correctOnFirstTry(userResponse) ? 1 : 0);\n      }, 0);\n    };\n\n    this.getTitle = function() {\n      return H5P.createTitle(this.options.intro);\n    };\n\n    this.getCurrentState = function () {\n      return {\n        progress: this.progress,\n        answers: this.answers\n      };\n    };\n  }\n\n  Summary.prototype = Object.create(Question.prototype);\n  Summary.prototype.constructor = Summary;\n\n  \/**\n   * Registers DOM elements before they are attached.\n   * Called from H5P.Question.\n   *\/\n  Summary.prototype.registerDomElements = function () {\n    \/\/ Register task content area\n    this.setContent(this.createQuestion());\n  };\n\n  \/\/ Function for attaching the multichoice to a DOM element.\n  Summary.prototype.createQuestion = function() {\n    var that = this;\n    var id = 0; \/\/ element counter\n     \/\/ variable to capture currently focused option.\n    var currentFocusedOption;\n    var elements = [];\n    var $ = H5P.jQuery;\n    this.$myDom = $('<div>', {\n      'class': 'summary-content'\n    });\n\n    if (that.summaries === undefined || that.summaries.length === 0) {\n      return;\n    }\n\n    \/\/ Create array objects\n    for (var panelIndex = 0; panelIndex < that.summaries.length; panelIndex++) {\n      if (!(that.summaries[panelIndex].summary && that.summaries[panelIndex].summary.length)) {\n        continue;\n      }\n\n      elements[panelIndex] = {\n        tip: that.summaries[panelIndex].tip,\n        summaries: []\n      };\n\n      for (var summaryIndex = 0; summaryIndex < that.summaries[panelIndex].summary.length; summaryIndex++) {\n        var isAnswer = (summaryIndex === 0);\n        that.answer[id] = isAnswer; \/\/ First claim is correct\n\n        \/\/ create mapping from data-bit to index in panel\n        that.dataBitMap[panelIndex] = this.dataBitMap[panelIndex] || [];\n        that.dataBitMap[panelIndex][id] = summaryIndex;\n\n        \/\/ checks the answer and updates the user response array\n        if(that.answers[panelIndex] && (that.answers[panelIndex].indexOf(id) !== -1)){\n          this.storeUserResponse(panelIndex, summaryIndex);\n        }\n\n        \/\/ adds to elements\n        elements[panelIndex].summaries[summaryIndex] = {\n          id: id++,\n          text: that.summaries[panelIndex].summary[summaryIndex]\n        };\n      }\n\n      \/\/ if we have progressed passed this point, the success pattern must also be saved\n      if(panelIndex < that.progress){\n        this.storeUserResponse(panelIndex, 0);\n      }\n\n      \/\/ Randomize elements\n      for (var k = elements[panelIndex].summaries.length - 1; k > 0; k--) {\n        var j = Math.floor(Math.random() * (k + 1));\n        var temp = elements[panelIndex].summaries[k];\n        elements[panelIndex].summaries[k] = elements[panelIndex].summaries[j];\n        elements[panelIndex].summaries[j] = temp;\n      }\n    }\n\n    \/\/ Create content panels\n    var $summary_container = $('<div class=\"summary-container\"><\/div>');\n    var $summary_list = $('<ul role=\"list\" aria-labelledby=\"answerListHeading-'+that.summaryId+'\"><\/ul>');\n    var $evaluation = $('<div class=\"summary-evaluation\"><\/div>');\n    var $evaluation_content = $('<div id=\"questionDesc-'+that.summaryId+'\" class=\"summary-evaluation-content\">' + that.options.intro + '<\/div>');\n    var $score = $('<div class=\"summary-score\"><\/div>');\n    var $options = $('<div class=\"summary-options\"><\/div>');\n    var $progress = $('<div class=\"summary-progress\" aria-live=\"polite\"><\/div>');\n    var $progressNumeric = $('<div class=\"summary-progress-numeric\" aria-hidden=\"true\"><\/div>');\n    var options_padding = parseInt($options.css('paddingLeft'));\n    \/\/ content div added for readspeaker that indicates list of correct answers.\n    var $answersListHeading = $('<div id=\"answerListHeading-'+that.summaryId+'\" class=\"h5p-hidden-read\">' + that.options.labelCorrectAnswers + '<\/div>');\n\n    if (this.score) {\n      $score.html(that.options.scoreLabel + ' ' + this.score).show();\n    }\n\n    \/\/ Insert content\n    \/\/ aria-hidden = true added for readspeaker to avoid reading empty answers list.\n    $summary_container.attr(\"aria-hidden\", \"true\");\n    $summary_container.html($answersListHeading);\n    $summary_container.append($summary_list);\n    this.$myDom.append($summary_container);\n    this.$myDom.append($evaluation);\n    this.$myDom.append($options);\n    $evaluation.append($evaluation_content);\n    $evaluation.append($evaluation);\n    $evaluation.append($progress);\n    $evaluation.append($progressNumeric);\n    $evaluation.append($score);\n\n    \/**\n     * Handle selected alternative\n     *\n     * @param {jQuery} $el Selected element\n     * @param {boolean} [setFocus] Set focus on first element of next panel.\n     *  Used when alt was selected with keyboard.\n     *\/\n    var selectedAlt = function ($el, setFocus) {\n      var nodeId = Number($el.attr('data-bit'));\n      var panelId = Number($el.parent().data('panel'));\n      var isRadioClicked = $el.attr('aria-checked');\n      if(isRadioClicked == 'true') return;\n\n      if (that.errorCounts[panelId] === undefined) {\n        that.errorCounts[panelId] = 0;\n      }\n\n      that.storeUserResponse(panelId, nodeId);\n\n      \/\/ Correct answer?\n      if (that.answer[nodeId]) {\n        that.stopStopWatch(panelId);\n\n        that.progress++;\n        var position = $el.position();\n        var summary = $summary_list.position();\n        var $answer = $('<li role=\"listitem\">' + $el.html() + '<\/li>');\n\n        $progressNumeric.html(that.options.solvedLabel + ' '  + (panelId + 1) + '\/' + that.summaries.length);\n\n        var interpolatedProgressText = that.options.progressText\n          .replace(':num', panelId + 1)\n          .replace(':total', that.summaries.length);\n        $progress.html(interpolatedProgressText);\n\n        $el.attr(\"aria-checked\", \"true\");\n\n        \/\/ Insert correct claim into summary list\n        $summary_list.append($answer);\n        $summary_container.addClass('has-results');\n        \/\/ change aria-hidden property as when correct answer is added inside list at top\n        $summary_container.attr(\"aria-hidden\", \"false\");\n        that.adjustTargetHeight($summary_container, $summary_list, $answer);\n\n\n        \/\/ Move into position over clicked element\n        $answer.css({display: 'block', width: $el.css('width'), height: $el.css('height')});\n        $answer.css({position: 'absolute', top: position.top, left: position.left});\n        $answer.css({backgroundColor: '#9dd8bb', border: ''});\n        setTimeout(function () {\n          $answer.css({backgroundColor: ''});\n        }, 1);\n        \/\/$answer.animate({backgroundColor: '#eee'}, 'slow');\n\n        var panel = parseInt($el.parent().attr('data-panel'));\n        var $curr_panel = $('.h5p-panel:eq(' + panel + ')', that.$myDom);\n        var $next_panel = $('.h5p-panel:eq(' + (panel + 1) + ')', that.$myDom);\n        var finished = ($next_panel.length === 0);\n        \/\/ Disable panel while waiting for animation\n        $curr_panel.addClass('panel-disabled');\n\n        \/\/ Update tip:\n        $evaluation_content.find('.joubel-tip-container').remove();\n        if (elements[that.progress] !== undefined &&\n          elements[that.progress].tip !== undefined &&\n          elements[that.progress].tip.trim().length > 0) {\n          $evaluation_content.append(H5P.JoubelUI.createTip(elements[that.progress].tip, {\n            tipLabel: that.options.tipButtonLabel\n          }));\n        }\n\n        $answer.animate(\n          {\n            top: summary.top + that.offset,\n            left: '-=' + options_padding + 'px',\n            width: '+=' + (options_padding * 2) + 'px'\n          },\n          {\n            complete: function() {\n              \/\/ Remove position (becomes inline);\n              $(this).css('position', '').css({\n                width: '',\n                height: '',\n                top: '',\n                left: ''\n              });\n              $summary_container.css('height', '');\n\n              \/\/ Calculate offset for next summary item\n              var tpadding = parseInt($answer.css('paddingTop')) * 2;\n              var tmargin = parseInt($answer.css('marginBottom'));\n              var theight = parseInt($answer.css('height'));\n              that.offset += theight + tpadding + tmargin + 1;\n\n              \/\/ Fade out current panel\n              $curr_panel.fadeOut('fast', function () {\n                $curr_panel.parent().css('height', 'auto');\n                \/\/ Show next panel if present\n                if (!finished) {\n                  \/\/ start next timer\n                  that.startStopWatch(that.progress);\n\n                  $next_panel.fadeIn('fast');\n\n                  \/\/ Focus first element of next panel\n                  if (setFocus) {\n                    $next_panel.children().get(0).focus();\n                  }\n                } else {\n                  \/\/ Hide intermediate evaluation\n                  $evaluation_content.html(that.options.resultLabel);\n\n                  that.doFinalEvaluation();\n                }\n                that.trigger('resize');\n              });\n            }\n          }\n        );\n      }\n      else {\n        \/\/ Remove event handler (prevent repeated clicks) and mouseover effect\n        $el.off('click');\n        $el.addClass('summary-failed');\n        $el.removeClass('summary-claim-unclicked');\n        $el.attr(\"aria-checked\", \"true\");\n        $evaluation.children('.summary-score').css('display', 'block');\n        $score.html(that.options.scoreLabel + ' ' + (++that.score));\n        that.errorCounts[panelId]++;\n        if (that.answers[panelId] === undefined) {\n          that.answers[panelId] = [];\n        }\n        that.answers[panelId].push(nodeId);\n      }\n\n      that.trigger('resize');\n      that.triggerXAPI('interacted');\n\n      \/\/ Trigger answered xAPI event on first try for the current\n      \/\/ statement group\n      if (that.userResponses[panelId].length === 1) {\n        that.trigger(that.createXApiAnsweredEvent(\n          that.summaries[panelId],\n          that.userResponses[panelId] || [],\n          panelId,\n          that.timePassedInStopWatch(panelId)));\n      }\n\n      \/\/ Trigger overall answered xAPI event when finished\n      if (finished) {\n        that.triggerXAPIScored(that.getScore(), that.getMaxScore(), 'answered');\n      }\n    };\n\n    \/\/ Initialize the visible and invisible progress counters\n    $progressNumeric.html(that.options.solvedLabel + ' ' + this.progress + '\/' + that.summaries.length);\n    var interpolatedProgressText = that.options.progressText\n      .replace(':num', that.progress)\n      .replace(':total', that.summaries.length);\n    $progress.html(interpolatedProgressText);\n\n    \/\/ Add elements to content\n    for (var i = 0; i < elements.length; i++) {\n      var element = elements[i];\n\n      if (i < that.progress) { \/\/ i is panelId\n        for (var j = 0; j < element.summaries.length; j++) {\n          var sum = element.summaries[j];\n          if (that.answer[sum.id]) {\n            $summary_list.append('<li style=\"display:block\">' + sum.text + '<\/li>');\n            $summary_container.addClass('has-results');\n            break;\n          }\n        }\n        \/\/ Cannot use continue; due to id\/animation system\n      }\n\n      \/\/ added aria-labelledby property for readspeaker to read, when first option receive focus\n      var $page = $('<ul aria-labelledby=\"questionDesc-'+that.summaryId+'\" role=\"radiogroup\" class=\"h5p-panel\" data-panel=\"' + i + '\"><\/ul>');\n\n\n      \/\/ Create initial tip for first summary-list if tip is available\n      if (i==0 && element.tip !== undefined && element.tip.trim().length > 0) {\n        $evaluation_content.append(H5P.JoubelUI.createTip(element.tip, {\n          tipLabel: that.options.tipButtonLabel\n        }));\n      }\n\n      for (var j = 0; j < element.summaries.length; j++) {\n        var summaryLineClass = 'summary-claim-unclicked';\n\n        \/\/ If progress is at current task\n        if (that.progress === i && that.answers[that.progress]) {\n          \/\/ Check if there are any previous wrong answers.\n          for (var k = 0; k < that.answers[that.progress].length; k++) {\n            if (that.answers[that.progress][k] === element.summaries[j].id) {\n              summaryLineClass = 'summary-failed';\n              break;\n            }\n          }\n        }\n\n        var $node = $('' +\n          '<li role=\"radio\" aria-checked=\"false\" data-name=\"'+j+'\" data-bit=\"' + element.summaries[j].id + '\" class=\"' + summaryLineClass + '\">' +\n            element.summaries[j].text +\n          '<\/li>');\n        \/\/ added tabindex = 0 for the first option to avoid accessing rest of the options via TAB\n        (j == 0) ? $node.attr(\"tabindex\", \"0\") : $node.attr(\"tabindex\", \"-1\");\n\n        $node.on('focus', function() {\n          var ind = $(this).attr('data-name');\n          setFocusIndex(ind);\n        });\n\n        \/\/ function captures the index of currently focused option\n        var setFocusIndex = function(idx) {\n          currentFocusedOption = idx;\n        };\n\n        \/\/ Do not add click event for failed nodes\n        if (summaryLineClass === 'summary-failed') {\n          $page.append($node);\n          continue;\n        }\n\n        $node.click(function() {\n          selectedAlt($(this));\n        }).keydown(function (e) {\n          switch (e.which) {\n            case 13: \/\/ Enter\n            case 32: \/\/ Space\n              selectedAlt($(this), true);\n              e.preventDefault();\n              break;\n\n            case 37: \/\/ Left Arrow\n            case 38: \/\/ Up Arrow\n              \/\/ Go to previous Option\n              that.gotoPreviousOption(that, currentFocusedOption);\n              e.preventDefault();\n              break;\n\n            case 39: \/\/ Right Arrow\n            case 40: \/\/ Down Arrow\n              \/\/ Go to next Option\n              that.gotoNextOption(that, currentFocusedOption);\n              e.preventDefault();\n              break;\n          }\n        });\n\n        $page.append($node);\n      }\n\n      $options.append($page);\n    }\n\n    if (that.progress === elements.length) {\n      $evaluation_content.html(that.options.resultLabel);\n      that.doFinalEvaluation();\n    }\n    else {\n      \/\/ Show first panel\n      $('.h5p-panel:eq(' + (that.progress) + ')', that.$myDom).css({display: 'block'});\n      if (that.progress) {\n        that.offset = ($('.summary-claim-unclicked:visible:first', that.$myDom).outerHeight() * that.errorCounts.length);\n      }\n    }\n\n    that.trigger('resize');\n\n    return this.$myDom;\n  };\n\n  \/**\n   * Returns true if answers have been given\n   *\n   * @return {boolean}\n   *\/\n  Summary.prototype.getAnswerGiven = function () {\n    return this.errorCounts.length > 0;\n  };\n\n  \/**\n   * Handles moving the focus from the current option to the previous option and changes tabindex accorindgly\n   *\n   *\/\n  Summary.prototype.gotoPreviousOption = function (that, currentFocusedOption) {\n    this.currentFocusedOption = currentFocusedOption;\n    var totOptions = that.summaries[that.progress].summary.length;\n    var prevRadioEle = $(\"ul[data-panel=\"+that.progress+\"] li[role='radio']\", this.$myDom);\n\n    \/\/prevRadioEle.removeAttr(\"tabindex\");\n    prevRadioEle.attr(\"tabindex\", \"-1\");\n    this.currentFocusedOption--;\n\n    if(this.currentFocusedOption < 0) {\n        var num = totOptions - 1;\n        prevRadioEle.eq(num).attr(\"tabindex\", \"0\");\n        prevRadioEle.eq(num).focus();\n      }\n      else {\n        prevRadioEle.eq(this.currentFocusedOption).attr(\"tabindex\", \"0\");\n        prevRadioEle.eq(this.currentFocusedOption).focus();\n      }\n    };\n\n  \/**\n   * Handles moving the focus from the current option to the next option and changes tabindex accorindgly\n   *\n   *\/\n  Summary.prototype.gotoNextOption = function (that, currentFocusedOption) {\n    this.currentFocusedOption = currentFocusedOption;\n    var totOptions = that.summaries[that.progress].summary.length;\n    var nextRadioEle = $(\"ul[data-panel=\"+that.progress+\"] li[role='radio']\", this.$myDom);\n\n    \/\/nextRadioEle.removeAttr(\"tabindex\");\n    nextRadioEle.attr(\"tabindex\", \"-1\");\n    this.currentFocusedOption++;\n\n    if(this.currentFocusedOption == totOptions) {\n      nextRadioEle.eq(0).attr(\"tabindex\", \"0\");\n      nextRadioEle.eq(0).focus();\n    }\n    else {\n      nextRadioEle.eq(this.currentFocusedOption).attr(\"tabindex\", \"0\");\n      nextRadioEle.eq(this.currentFocusedOption).focus();\n    }\n  };\n\n  \/**\n   * Calculate final score and display feedback.\n   *\n   * @param container\n   * @param options_panel\n   * @param list\n   * @param score\n   *\/\n  Summary.prototype.doFinalEvaluation = function () {\n    var that = this;\n    var errorCount = this.countErrors();\n    var maxScore = that.summaries.length;\n    var score = maxScore - errorCount;\n\n    \/\/ Calculate percentage\n    var percent = 100 - (errorCount \/ that.errorCounts.length * 100);\n\n    \/\/ Show final evaluation\n    var summary = H5P.Question.determineOverallFeedback(that.options.overallFeedback, percent \/ 100)\n      .replace('@score', score)\n      .replace('@total', maxScore)\n      .replace('@percent', Math.round(percent));\n\n    $(\".summary-evaluation-content\", this.$myDom).removeAttr(\"tabindex\");\n\n    var scoreBarLabel = that.options.scoreBarLabel.replace(':num', score).replace(':total', maxScore);\n\n    this.setFeedback(summary, score, maxScore, scoreBarLabel);\n\n    \/\/ Only read out the score after the progress is read\n    setTimeout(function() {\n      that.setBehaviour({disableReadSpeaker: false});\n      that.readFeedback();\n      that.read(scoreBarLabel);\n    }, 3000);\n\n    that.trigger('resize');\n  };\n\n  \/**\n   * Resets the complete task back to its' initial state.\n   * Used for contracts.\n   *\/\n  Summary.prototype.resetTask = function () {\n    \/\/ Summary is not yet able to Reset itself\n  };\n\n  \/**\n   * Adjust height of container.\n   *\n   * @param container\n   * @param elements\n   * @param el\n   *\/\n  Summary.prototype.adjustTargetHeight = function (container, elements, el) {\n    var new_height = parseInt(elements.outerHeight()) + parseInt(el.outerHeight()) + parseInt(el.css('marginBottom')) + parseInt(el.css('marginTop'));\n    if (new_height > parseInt(container.css('height'))) {\n      container.animate({height: new_height});\n    }\n  };\n\n  \/**\n   * Count amount of wrong answers\n   *\n   * @returns {number}\n   *\/\n  Summary.prototype.countErrors = function() {\n    var error_count = 0;\n\n    \/\/ Count boards without errors\n    for (var i = 0; i < this.summaries.length; i++) {\n      if (this.errorCounts[i] === undefined) {\n        error_count++;\n      }\n      else {\n        error_count += this.errorCounts[i] ? 1 : 0;\n      }\n    }\n\n    return error_count;\n  };\n\n  \/**\n   * Returns the choices array for xApi statements\n   *\n   * @param {String[]} answers\n   *\n   * @return {{ choices: []}}\n   *\/\n  Summary.prototype.getXApiChoices = function (answers) {\n    var choices = answers.map(function(answer, index){\n      return XApiEventBuilder.createChoice(index.toString(), answer);\n    });\n\n    return {\n      choices: choices\n    };\n  };\n\n  \/**\n   * Saves the user response\n   *\n   * @param {number} questionIndex\n   * @param {number} answerIndex\n   *\/\n  Summary.prototype.storeUserResponse = function (questionIndex, answerIndex) {\n    var self = this;\n    if(self.userResponses[questionIndex] === undefined){\n      self.userResponses[questionIndex] = [];\n    }\n\n    self.userResponses[questionIndex].push(this.dataBitMap[questionIndex][answerIndex]);\n  };\n\n  \/**\n   * Starts a stopwatch for indexed slide\n   *\n   * @param {number} index\n   *\/\n  Summary.prototype.startStopWatch = function (index) {\n    this.stopWatches[index] = this.stopWatches[index] || new StopWatch();\n    this.stopWatches[index].start();\n  };\n\n  \/**\n   * Stops a stopwatch for indexed slide\n   *\n   * @param {number} [index]\n   *\/\n  Summary.prototype.stopStopWatch = function (index) {\n    if(this.stopWatches[index]){\n      this.stopWatches[index].stop();\n    }\n  };\n\n  \/**\n   * Returns the passed time in seconds of a stopwatch on an indexed slide,\n   * or 0 if not existing\n   *\n   * @param {number} index\n   * @return {number}\n   *\/\n  Summary.prototype.timePassedInStopWatch = function (index) {\n    if(this.stopWatches[index] !== undefined){\n      return this.stopWatches[index].passedTime();\n    }\n    else {\n      \/\/ if not created, return no passed time,\n      return 0;\n    }\n  };\n\n  \/**\n   * Returns the time the user has spent on all questions so far\n   *\n   * @return {number}\n   *\/\n  Summary.prototype.getTotalPassedTime = function () {\n    return this.stopWatches\n      .filter(function(watch){\n        return watch !== undefined;\n      })\n      .reduce(function(sum, watch){\n        return sum + watch.passedTime();\n      }, 0);\n  };\n\n  \/**\n   * Creates an xAPI answered event for a single statement list\n   *\n   * @param {object} panel\n   * @param {number[]} userAnswer\n   * @param {number} panelIndex\n   * @param {number} duration\n   *\n   * @return {H5P.XAPIEvent}\n   *\/\n  Summary.prototype.createXApiAnsweredEvent = function (panel, userAnswer, panelIndex, duration) {\n    var self = this;\n\n    \/\/ creates the definition object\n    var definition = XApiEventBuilder.createDefinition()\n      .name('Summary statement')\n      .description(self.options.intro)\n      .interactionType(XApiEventBuilder.interactionTypes.CHOICE)\n      .correctResponsesPattern(['0'])\n      .optional(self.getXApiChoices(panel.summary))\n      .build();\n\n    \/\/ create the result object\n    var result = XApiEventBuilder.createResult()\n      .response(userAnswer.join('[,]'))\n      .duration(duration)\n      .score((self.correctOnFirstTry(userAnswer) ? 1 : 0), 1)\n      .build();\n\n    return XApiEventBuilder.create()\n      .verb(XApiEventBuilder.verbs.ANSWERED)\n      .objectDefinition(definition)\n      .context(self.contentId, self.subContentId)\n      .contentId(self.contentId, panel.subContentId)\n      .result(result)\n      .build();\n  };\n\n  Summary.prototype.correctOnFirstTry = function(userAnswer){\n    return (userAnswer.length === 1) && userAnswer[0] === 0;\n  };\n\n  \/**\n   * Retrieves the xAPI data necessary for generating result reports.\n   *\n   * @return {object}\n   *\/\n  Summary.prototype.getXAPIData = function(){\n    var self = this;\n\n    \/\/ create array with userAnswer\n    var children = self.summaries.map(function(panel, index) {\n        var userResponse = self.userResponses[index] || [];\n        var duration = self.timePassedInStopWatch(index);\n        var event = self.createXApiAnsweredEvent(panel, userResponse, index, duration);\n\n        return {\n          statement: event.data.statement\n        };\n    });\n\n    var result = XApiEventBuilder.createResult()\n      .score(self.getScore(), self.getMaxScore())\n      .duration(self.getTotalPassedTime())\n      .build();\n\n    \/\/ creates the definition object\n    var definition = XApiEventBuilder.createDefinition()\n      .interactionType(XApiEventBuilder.interactionTypes.COMPOUND)\n      .name(self.getTitle())\n      .description(self.options.intro)\n      .build();\n\n    var xAPIEvent = XApiEventBuilder.create()\n      .verb(XApiEventBuilder.verbs.ANSWERED)\n      .contentId(self.contentId, self.subContentId)\n      .context(self.getParentAttribute('contentId'), self.getParentAttribute('subContentId'))\n      .objectDefinition(definition)\n      .result(result)\n      .build();\n\n    return {\n      statement: xAPIEvent.data.statement,\n      children: children\n    };\n  };\n\n  \/**\n   * Returns an attribute from this.parent if it exists\n   *\n   * @param {string} attributeName\n   * @return {*|undefined}\n   *\/\n  Summary.prototype.getParentAttribute = function (attributeName) {\n    var self = this;\n\n    if(self.parent !== undefined){\n      return self.parent[attributeName];\n    }\n  };\n\n  return Summary;\n\n})(H5P.jQuery, H5P.Question, H5P.Summary.XApiEventBuilder, H5P.Summary.StopWatch);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/blob-1.0\/scripts\/Blob.js?ver=1.0.6":"\n\/* Blob.js\n * A Blob implementation.\n * 2014-07-24\n *\n * By Eli Grey, http:\/\/eligrey.com\n * By Devin Samarin, https:\/\/github.com\/dsamarin\n * License: MIT\n *   See https:\/\/github.com\/eligrey\/Blob.js\/blob\/master\/LICENSE.md\n *\/\n\n\/*global self, unescape *\/\n\/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,\n  plusplus: true *\/\n\n\/*! @source http:\/\/purl.eligrey.com\/github\/Blob.js\/blob\/master\/Blob.js *\/\n\n(function (view) {\n\t\"use strict\";\n\n\tview.URL = view.URL || view.webkitURL;\n\n\tif (view.Blob && view.URL) {\n\t\ttry {\n\t\t\tnew Blob;\n\t\t\treturn;\n\t\t} catch (e) {}\n\t}\n\n\t\/\/ Internally we use a BlobBuilder implementation to base Blob off of\n\t\/\/ in order to support older browsers that only have BlobBuilder\n\tvar BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {\n\t\tvar\n\t\t\t  get_class = function(object) {\n\t\t\t\treturn Object.prototype.toString.call(object).match(\/^\\[object\\s(.*)\\]$\/)[1];\n\t\t\t}\n\t\t\t, FakeBlobBuilder = function BlobBuilder() {\n\t\t\t\tthis.data = [];\n\t\t\t}\n\t\t\t, FakeBlob = function Blob(data, type, encoding) {\n\t\t\t\tthis.data = data;\n\t\t\t\tthis.size = data.length;\n\t\t\t\tthis.type = type;\n\t\t\t\tthis.encoding = encoding;\n\t\t\t}\n\t\t\t, FBB_proto = FakeBlobBuilder.prototype\n\t\t\t, FB_proto = FakeBlob.prototype\n\t\t\t, FileReaderSync = view.FileReaderSync\n\t\t\t, FileException = function(type) {\n\t\t\t\tthis.code = this[this.name = type];\n\t\t\t}\n\t\t\t, file_ex_codes = (\n\t\t\t\t  \"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR \"\n\t\t\t\t+ \"NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR\"\n\t\t\t).split(\" \")\n\t\t\t, file_ex_code = file_ex_codes.length\n\t\t\t, real_URL = view.URL || view.webkitURL || view\n\t\t\t, real_create_object_URL = real_URL.createObjectURL\n\t\t\t, real_revoke_object_URL = real_URL.revokeObjectURL\n\t\t\t, URL = real_URL\n\t\t\t, btoa = view.btoa\n\t\t\t, atob = view.atob\n\n\t\t\t, ArrayBuffer = view.ArrayBuffer\n\t\t\t, Uint8Array = view.Uint8Array\n\n\t\t\t, origin = \/^[\\w-]+:\\\/*\\[?[\\w\\.:-]+\\]?(?::[0-9]+)?\/\n\t\t;\n\t\tFakeBlob.fake = FB_proto.fake = true;\n\t\twhile (file_ex_code--) {\n\t\t\tFileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;\n\t\t}\n\t\t\/\/ Polyfill URL\n\t\tif (!real_URL.createObjectURL) {\n\t\t\tURL = view.URL = function(uri) {\n\t\t\t\tvar\n\t\t\t\t\t  uri_info = document.createElementNS(\"http:\/\/www.w3.org\/1999\/xhtml\", \"a\")\n\t\t\t\t\t, uri_origin\n\t\t\t\t;\n\t\t\t\turi_info.href = uri;\n\t\t\t\tif (!(\"origin\" in uri_info)) {\n\t\t\t\t\tif (uri_info.protocol.toLowerCase() === \"data:\") {\n\t\t\t\t\t\turi_info.origin = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\turi_origin = uri.match(origin);\n\t\t\t\t\t\turi_info.origin = uri_origin && uri_origin[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn uri_info;\n\t\t\t};\n\t\t}\n\t\tURL.createObjectURL = function(blob) {\n\t\t\tvar\n\t\t\t\t  type = blob.type\n\t\t\t\t, data_URI_header\n\t\t\t;\n\t\t\tif (type === null) {\n\t\t\t\ttype = \"application\/octet-stream\";\n\t\t\t}\n\t\t\tif (blob instanceof FakeBlob) {\n\t\t\t\tdata_URI_header = \"data:\" + type;\n\t\t\t\tif (blob.encoding === \"base64\") {\n\t\t\t\t\treturn data_URI_header + \";base64,\" + blob.data;\n\t\t\t\t} else if (blob.encoding === \"URI\") {\n\t\t\t\t\treturn data_URI_header + \",\" + decodeURIComponent(blob.data);\n\t\t\t\t} if (btoa) {\n\t\t\t\t\treturn data_URI_header + \";base64,\" + btoa(blob.data);\n\t\t\t\t} else {\n\t\t\t\t\treturn data_URI_header + \",\" + encodeURIComponent(blob.data);\n\t\t\t\t}\n\t\t\t} else if (real_create_object_URL) {\n\t\t\t\treturn real_create_object_URL.call(real_URL, blob);\n\t\t\t}\n\t\t};\n\t\tURL.revokeObjectURL = function(object_URL) {\n\t\t\tif (object_URL.substring(0, 5) !== \"data:\" && real_revoke_object_URL) {\n\t\t\t\treal_revoke_object_URL.call(real_URL, object_URL);\n\t\t\t}\n\t\t};\n\t\tFBB_proto.append = function(data\/*, endings*\/) {\n\t\t\tvar bb = this.data;\n\t\t\t\/\/ decode data to a binary string\n\t\t\tif (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {\n\t\t\t\tvar\n\t\t\t\t\t  str = \"\"\n\t\t\t\t\t, buf = new Uint8Array(data)\n\t\t\t\t\t, i = 0\n\t\t\t\t\t, buf_len = buf.length\n\t\t\t\t;\n\t\t\t\tfor (; i < buf_len; i++) {\n\t\t\t\t\tstr += String.fromCharCode(buf[i]);\n\t\t\t\t}\n\t\t\t\tbb.push(str);\n\t\t\t} else if (get_class(data) === \"Blob\" || get_class(data) === \"File\") {\n\t\t\t\tif (FileReaderSync) {\n\t\t\t\t\tvar fr = new FileReaderSync;\n\t\t\t\t\tbb.push(fr.readAsBinaryString(data));\n\t\t\t\t} else {\n\t\t\t\t\t\/\/ async FileReader won't work as BlobBuilder is sync\n\t\t\t\t\tthrow new FileException(\"NOT_READABLE_ERR\");\n\t\t\t\t}\n\t\t\t} else if (data instanceof FakeBlob) {\n\t\t\t\tif (data.encoding === \"base64\" && atob) {\n\t\t\t\t\tbb.push(atob(data.data));\n\t\t\t\t} else if (data.encoding === \"URI\") {\n\t\t\t\t\tbb.push(decodeURIComponent(data.data));\n\t\t\t\t} else if (data.encoding === \"raw\") {\n\t\t\t\t\tbb.push(data.data);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (typeof data !== \"string\") {\n\t\t\t\t\tdata += \"\"; \/\/ convert unsupported types to strings\n\t\t\t\t}\n\t\t\t\t\/\/ decode UTF-16 to binary string\n\t\t\t\tbb.push(unescape(encodeURIComponent(data)));\n\t\t\t}\n\t\t};\n\t\tFBB_proto.getBlob = function(type) {\n\t\t\tif (!arguments.length) {\n\t\t\t\ttype = null;\n\t\t\t}\n\t\t\treturn new FakeBlob(this.data.join(\"\"), type, \"raw\");\n\t\t};\n\t\tFBB_proto.toString = function() {\n\t\t\treturn \"[object BlobBuilder]\";\n\t\t};\n\t\tFB_proto.slice = function(start, end, type) {\n\t\t\tvar args = arguments.length;\n\t\t\tif (args < 3) {\n\t\t\t\ttype = null;\n\t\t\t}\n\t\t\treturn new FakeBlob(\n\t\t\t\t  this.data.slice(start, args > 1 ? end : this.data.length)\n\t\t\t\t, type\n\t\t\t\t, this.encoding\n\t\t\t);\n\t\t};\n\t\tFB_proto.toString = function() {\n\t\t\treturn \"[object Blob]\";\n\t\t};\n\t\tFB_proto.close = function() {\n\t\t\tthis.size = 0;\n\t\t\tdelete this.data;\n\t\t};\n\t\treturn FakeBlobBuilder;\n\t}(view));\n\n\tview.Blob = function(blobParts, options) {\n\t\tvar type = options ? (options.type || \"\") : \"\";\n\t\tvar builder = new BlobBuilder();\n\t\tif (blobParts) {\n\t\t\tfor (var i = 0, len = blobParts.length; i < len; i++) {\n\t\t\t\tif (Uint8Array && blobParts[i] instanceof Uint8Array) {\n\t\t\t\t\tbuilder.append(blobParts[i].buffer);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbuilder.append(blobParts[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar blob = builder.getBlob(type);\n\t\tif (!blob.slice && blob.webkitSlice) {\n\t\t\tblob.slice = blob.webkitSlice;\n\t\t}\n\t\treturn blob;\n\t};\n\n\tvar getPrototypeOf = Object.getPrototypeOf || function(object) {\n\t\treturn object.__proto__;\n\t};\n\tview.Blob.prototype = getPrototypeOf(new view.Blob());\n}(typeof self !== \"undefined\" && self || typeof window !== \"undefined\" && window || this.content || this));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/filesaver-1.0\/scripts\/FileSaver.js?ver=1.0.6":"\n\/* FileSaver.js\n * A saveAs() FileSaver implementation.\n * 1.1.20151003\n *\n * By Eli Grey, http:\/\/eligrey.com\n * License: MIT\n *   See https:\/\/github.com\/eligrey\/FileSaver.js\/blob\/master\/LICENSE.md\n *\/\n\n\/*global self *\/\n\/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true *\/\n\n\/*! @source http:\/\/purl.eligrey.com\/github\/FileSaver.js\/blob\/master\/FileSaver.js *\/\n\nvar saveAs = saveAs || (function(view) {\n\t\"use strict\";\n\t\/\/ IE <10 is explicitly unsupported\n\tif (typeof navigator !== \"undefined\" && \/MSIE [1-9]\\.\/.test(navigator.userAgent)) {\n\t\treturn;\n\t}\n\tvar\n\t\t  doc = view.document\n\t\t  \/\/ only get URL when necessary in case Blob.js hasn't overridden it yet\n\t\t, get_URL = function() {\n\t\t\treturn view.URL || view.webkitURL || view;\n\t\t}\n\t\t, save_link = doc.createElementNS(\"http:\/\/www.w3.org\/1999\/xhtml\", \"a\")\n\t\t, can_use_save_link = \"download\" in save_link\n\t\t, click = function(node) {\n\t\t\tvar event = new MouseEvent(\"click\");\n\t\t\tnode.dispatchEvent(event);\n\t\t}\n\t\t, is_safari = \/Version\\\/[\\d\\.]+.*Safari\/.test(navigator.userAgent)\n\t\t, webkit_req_fs = view.webkitRequestFileSystem\n\t\t, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem\n\t\t, throw_outside = function(ex) {\n\t\t\t(view.setImmediate || view.setTimeout)(function() {\n\t\t\t\tthrow ex;\n\t\t\t}, 0);\n\t\t}\n\t\t, force_saveable_type = \"application\/octet-stream\"\n\t\t, fs_min_size = 0\n\t\t\/\/ See https:\/\/code.google.com\/p\/chromium\/issues\/detail?id=375297#c7 and\n\t\t\/\/ https:\/\/github.com\/eligrey\/FileSaver.js\/commit\/485930a#commitcomment-8768047\n\t\t\/\/ for the reasoning behind the timeout and revocation flow\n\t\t, arbitrary_revoke_timeout = 500 \/\/ in ms\n\t\t, revoke = function(file) {\n\t\t\tvar revoker = function() {\n\t\t\t\tif (typeof file === \"string\") { \/\/ file is an object URL\n\t\t\t\t\tget_URL().revokeObjectURL(file);\n\t\t\t\t} else { \/\/ file is a File\n\t\t\t\t\tfile.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (view.chrome) {\n\t\t\t\trevoker();\n\t\t\t} else {\n\t\t\t\tsetTimeout(revoker, arbitrary_revoke_timeout);\n\t\t\t}\n\t\t}\n\t\t, dispatch = function(filesaver, event_types, event) {\n\t\t\tevent_types = [].concat(event_types);\n\t\t\tvar i = event_types.length;\n\t\t\twhile (i--) {\n\t\t\t\tvar listener = filesaver[\"on\" + event_types[i]];\n\t\t\t\tif (typeof listener === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlistener.call(filesaver, event || filesaver);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tthrow_outside(ex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t, auto_bom = function(blob) {\n\t\t\t\/\/ prepend BOM for UTF-8 XML and text\/* types (including HTML)\n\t\t\tif (\/^\\s*(?:text\\\/\\S*|application\\\/xml|\\S*\\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8\/i.test(blob.type)) {\n\t\t\t\treturn new Blob([\"\\ufeff\", blob], {type: blob.type});\n\t\t\t}\n\t\t\treturn blob;\n\t\t}\n\t\t, FileSaver = function(blob, name, no_auto_bom) {\n\t\t\tif (!no_auto_bom) {\n\t\t\t\tblob = auto_bom(blob);\n\t\t\t}\n\t\t\t\/\/ First try a.download, then web filesystem, then object URLs\n\t\t\tvar\n\t\t\t\t  filesaver = this\n\t\t\t\t, type = blob.type\n\t\t\t\t, blob_changed = false\n\t\t\t\t, object_url\n\t\t\t\t, target_view\n\t\t\t\t, dispatch_all = function() {\n\t\t\t\t\tdispatch(filesaver, \"writestart progress write writeend\".split(\" \"));\n\t\t\t\t}\n\t\t\t\t\/\/ on any filesys errors revert to saving with object URLs\n\t\t\t\t, fs_error = function() {\n\t\t\t\t\tif (\/*target_view &&*\/ is_safari && typeof FileReader !== \"undefined\") {\n\t\t\t\t\t\t\/\/ Safari doesn't allow downloading of blob urls\n\t\t\t\t\t\tvar reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = function() {\n\t\t\t\t\t\t\tvar base64Data = reader.result;\n\t\t\t\t\t\t\t\/*target_*\/view.location.href = \"data:attachment\/file\" + base64Data.slice(base64Data.search(\/[,;]\/));\n\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\tdispatch_all();\n\t\t\t\t\t\t};\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t\tfilesaver.readyState = filesaver.INIT;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\/\/ don't create more object URLs than needed\n\t\t\t\t\tif (blob_changed || !object_url) {\n\t\t\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t\t}\n\t\t\t\t\tif (target_view) {\n\t\t\t\t\t\ttarget_view.location.href = object_url;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar new_tab = view.open(object_url, \"_blank\");\n\t\t\t\t\t\tif (new_tab == undefined && is_safari) {\n\t\t\t\t\t\t\t\/\/Apple do not allow window.open, see http:\/\/bit.ly\/1kZffRI\n\t\t\t\t\t\t\tview.location.href = object_url\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t}\n\t\t\t\t, abortable = function(func) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif (filesaver.readyState !== filesaver.DONE) {\n\t\t\t\t\t\t\treturn func.apply(this, arguments);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t, create_if_not_found = {create: true, exclusive: false}\n\t\t\t\t, slice\n\t\t\t;\n\t\t\tfilesaver.readyState = filesaver.INIT;\n\t\t\tif (!name) {\n\t\t\t\tname = \"download\";\n\t\t\t}\n\t\t\tif (can_use_save_link) {\n\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tsave_link.href = object_url;\n\t\t\t\t\tsave_link.download = name;\n\t\t\t\t\tclick(save_link);\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\/\/ Object and web filesystem URLs have a problem saving in Google Chrome when\n\t\t\t\/\/ viewed in a tab, so I force save with application\/octet-stream\n\t\t\t\/\/ http:\/\/code.google.com\/p\/chromium\/issues\/detail?id=91158\n\t\t\t\/\/ Update: Google errantly closed 91158, I submitted it again:\n\t\t\t\/\/ https:\/\/code.google.com\/p\/chromium\/issues\/detail?id=389642\n\t\t\tif (view.chrome && type && type !== force_saveable_type) {\n\t\t\t\tslice = blob.slice || blob.webkitSlice;\n\t\t\t\tblob = slice.call(blob, 0, blob.size, force_saveable_type);\n\t\t\t\tblob_changed = true;\n\t\t\t}\n\t\t\t\/\/ Since I can't be sure that the guessed media type will trigger a download\n\t\t\t\/\/ in WebKit, I append .download to the filename.\n\t\t\t\/\/ https:\/\/bugs.webkit.org\/show_bug.cgi?id=65440\n\t\t\tif (webkit_req_fs && name !== \"download\") {\n\t\t\t\tname += \".download\";\n\t\t\t}\n\t\t\tif (type === force_saveable_type || webkit_req_fs) {\n\t\t\t\ttarget_view = view;\n\t\t\t}\n\t\t\tif (!req_fs) {\n\t\t\t\tfs_error();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfs_min_size += blob.size;\n\t\t\treq_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {\n\t\t\t\tfs.root.getDirectory(\"saved\", create_if_not_found, abortable(function(dir) {\n\t\t\t\t\tvar save = function() {\n\t\t\t\t\t\tdir.getFile(name, create_if_not_found, abortable(function(file) {\n\t\t\t\t\t\t\tfile.createWriter(abortable(function(writer) {\n\t\t\t\t\t\t\t\twriter.onwriteend = function(event) {\n\t\t\t\t\t\t\t\t\ttarget_view.location.href = file.toURL();\n\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\t\t\tdispatch(filesaver, \"writeend\", event);\n\t\t\t\t\t\t\t\t\trevoke(file);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\twriter.onerror = function() {\n\t\t\t\t\t\t\t\t\tvar error = writer.error;\n\t\t\t\t\t\t\t\t\tif (error.code !== error.ABORT_ERR) {\n\t\t\t\t\t\t\t\t\t\tfs_error();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\"writestart progress write abort\".split(\" \").forEach(function(event) {\n\t\t\t\t\t\t\t\t\twriter[\"on\" + event] = filesaver[\"on\" + event];\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\twriter.write(blob);\n\t\t\t\t\t\t\t\tfilesaver.abort = function() {\n\t\t\t\t\t\t\t\t\twriter.abort();\n\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.WRITING;\n\t\t\t\t\t\t\t}), fs_error);\n\t\t\t\t\t\t}), fs_error);\n\t\t\t\t\t};\n\t\t\t\t\tdir.getFile(name, {create: false}, abortable(function(file) {\n\t\t\t\t\t\t\/\/ delete file if it already exists\n\t\t\t\t\t\tfile.remove();\n\t\t\t\t\t\tsave();\n\t\t\t\t\t}), abortable(function(ex) {\n\t\t\t\t\t\tif (ex.code === ex.NOT_FOUND_ERR) {\n\t\t\t\t\t\t\tsave();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfs_error();\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}), fs_error);\n\t\t\t}), fs_error);\n\t\t}\n\t\t, FS_proto = FileSaver.prototype\n\t\t, saveAs = function(blob, name, no_auto_bom) {\n\t\t\treturn new FileSaver(blob, name, no_auto_bom);\n\t\t}\n\t;\n\t\/\/ IE 10+ (native saveAs)\n\tif (typeof navigator !== \"undefined\" && navigator.msSaveOrOpenBlob) {\n\t\treturn function(blob, name, no_auto_bom) {\n\t\t\tif (!no_auto_bom) {\n\t\t\t\tblob = auto_bom(blob);\n\t\t\t}\n\t\t\treturn navigator.msSaveOrOpenBlob(blob, name || \"download\");\n\t\t};\n\t}\n\n\tFS_proto.abort = function() {\n\t\tvar filesaver = this;\n\t\tfilesaver.readyState = filesaver.DONE;\n\t\tdispatch(filesaver, \"abort\");\n\t};\n\tFS_proto.readyState = FS_proto.INIT = 0;\n\tFS_proto.WRITING = 1;\n\tFS_proto.DONE = 2;\n\n\tFS_proto.error =\n\tFS_proto.onwritestart =\n\tFS_proto.onprogress =\n\tFS_proto.onwrite =\n\tFS_proto.onabort =\n\tFS_proto.onerror =\n\tFS_proto.onwriteend =\n\t\tnull;\n\n\treturn saveAs;\n}(\n\t   typeof self !== \"undefined\" && self\n\t|| typeof window !== \"undefined\" && window\n\t|| this.content\n));\n\/\/ `self` is undefined in Firefox for Android content script context\n\/\/ while `this` is nsIContentFrameMessageManager\n\/\/ with an attribute `content` that corresponds to the window\n\nif (typeof module !== \"undefined\" && module.exports) {\n  module.exports.saveAs = saveAs;\n} else if ((typeof define !== \"undefined\" && define !== null) && (define.amd != null)) {\n  define([], function() {\n    return saveAs;\n  });\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/swfobject-1.0\/scripts\/swfobject.js?ver=1.0.2":"\n\/*\tSWFObject v2.2 <http:\/\/code.google.com\/p\/swfobject\/> \n\tis released under the MIT License <http:\/\/www.opensource.org\/licenses\/mit-license.php> \n*\/\nif(swfobject === undefined) {\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application\/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?\/win\/.test(Y):\/win\/.test(ah),ac=Y?\/mac\/.test(Y):\/mac\/.test(ah),af=\/webkit\/.test(ah)?parseFloat(ah.replace(\/^.*webkit\\\/(\\d+(\\.\\d+)?).*$\/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(\/^.*\\s+(\\S+\\s+\\S+$)\/,\"$1\");ag[0]=parseInt(ab.replace(\/^(.*)\\..*$\/,\"$1\"),10);ag[1]=parseInt(ab.replace(\/^.*\\.(.*)\\s.*$\/,\"$1\"),10);ag[2]=\/[a-zA-Z]\/.test(ab)?parseInt(ab.replace(\/^.*[a-zA-Z]+(.*)$\/,\"$1\"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!\/loaded|complete\/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!\/%$\/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!\/%$\/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(\/&\/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" \/>'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"<\/object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text\/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=\/[\\\\\\\"<>\\.;]\/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(\/\\?\/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();\n}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/downloadify-1.0\/scripts\/downloadify.js?ver=1.0.3":"\n\/* Downloadify 0.2 (c) 2009 by Douglas Neiner. Licensed under the MIT license *\/\n\/* See http:\/\/github.com\/dcneiner\/Downloadify for license and more info *\/\n(function(jQuery) {\n(function(){Downloadify=window.Downloadify={queue:{},uid:new Date().getTime(),getTextForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getData();return\"\"},getFileNameForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getFilename();return\"\"},getDataTypeForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getDataType();return\"\"},saveComplete:function(a){var b=Downloadify.queue[a];if(b)b.complete();return true},saveCancel:function(a){var b=Downloadify.queue[a];if(b)b.cancel();return true},saveError:function(a){var b=Downloadify.queue[a];if(b)b.error();return true},addToQueue:function(a){Downloadify.queue[a.queue_name]=a},getUID:function(a){if(a.id==\"\")a.id='downloadify_'+Downloadify.uid++;return a.id}};Downloadify.create=function(a,b){var c=(typeof(a)==\"string\"?document.getElementById(a):a);return new Downloadify.Container(c,b)};Downloadify.Container=function(d,e){var f=this;f.el=d;f.enabled=true;f.dataCallback=null;f.filenameCallback=null;f.data=null;f.filename=null;var g=function(){f.options=e;if(!f.options.append)f.el.innerHTML=\"\";f.flashContainer=document.createElement('span');f.el.appendChild(f.flashContainer);f.queue_name=Downloadify.getUID(f.flashContainer);if(typeof(f.options.filename)===\"function\")f.filenameCallback=f.options.filename;else if(f.options.filename)f.filename=f.options.filename;if(typeof(f.options.data)===\"function\")f.dataCallback=f.options.data;else if(f.options.data)f.data=f.options.data;var a={queue_name:f.queue_name,width:f.options.width,height:f.options.height};var b={allowScriptAccess:'always'};var c={id:f.flashContainer.id,name:f.flashContainer.id};if(f.options.enabled===false)f.enabled=false;if(f.options.transparent===true)b.wmode=\"transparent\";if(f.options.downloadImage)a.downloadImage=f.options.downloadImage;swfobject.embedSWF(f.options.swf,f.flashContainer.id,f.options.width,f.options.height,\"10\",null,a,b,c);Downloadify.addToQueue(f)};f.enable=function(){var a=document.getElementById(f.flashContainer.id);a.setEnabled(true);f.enabled=true};f.disable=function(){var a=document.getElementById(f.flashContainer.id);a.setEnabled(false);f.enabled=false};f.getData=function(){if(!f.enabled)return\"\";if(f.dataCallback)return f.dataCallback();else if(f.data)return f.data;else return\"\"};f.getFilename=function(){if(f.filenameCallback)return f.filenameCallback();else if(f.filename)return f.filename;else return\"\"};f.getDataType=function(){if(f.options.dataType)return f.options.dataType;return\"string\"};f.complete=function(){if(typeof(f.options.onComplete)===\"function\")f.options.onComplete()};f.cancel=function(){if(typeof(f.options.onCancel)===\"function\")f.options.onCancel()};f.error=function(){if(typeof(f.options.onError)===\"function\")f.options.onError()};g()};Downloadify.defaultOptions={swf:'media\/downloadify.swf',downloadImage:'images\/download.png',width:100,height:30,transparent:true,append:false,dataType:\"string\"}})();if(typeof(jQuery)!=\"undefined\"){(function($){$.fn.downloadify=function(b){return this.each(function(){b=$.extend({},Downloadify.defaultOptions,b);var a=Downloadify.create(this,b);$(this).data('Downloadify',a)})}})(jQuery)};if(typeof(MooTools)!='undefined'){Element.implement({downloadify:function(a){a=$merge(Downloadify.defaultOptions,a);return this.store('Downloadify',Downloadify.create(this,a))}})};\n})(H5P.jQuery);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.ExportableTextArea-1.2\/scripts\/eta.js?ver=1.2.8":"\nvar H5P = H5P || {};\n\nH5P.ExportableTextArea = (function ($) {\n  \/**\n   * Constructor.\n   *\n   * @param {object} params Options for this library.\n   * @param {int} id Content identifier\n   *\/\n  function C(params, id, contentData) {\n    this.index = (params.index !== undefined ? params.index : -1);\n    this.header = (params.label !== undefined ? params.label : '');\n    this.notSupportedText = params.exportNotSupported;\n    this.defaultAnswer = (contentData && contentData.previousState ? contentData.previousState.answer : '');\n\n    var supportsExport = H5P.ExportableTextArea.Exporter.supportsExport();\n    this.$label = $('<div class=\"h5p-eta-label\">' + this.header + '<\/div>');\n    this.$input = $('<textarea class=\"h5p-eta-input\" ' + (supportsExport ? '' : 'placeholder=\"' + this.notSupportedText + '\"') + 'data-index=\"' + this.index + '\">' + this.defaultAnswer + '<\/textarea>');\n  }\n\n  C.prototype.attach = function ($wrapper) {\n    this.$content = $wrapper.addClass('h5p-eta')\n      .append(this.$label)\n      .append(this.$input);\n  };\n\n  C.prototype.onDelete = function (params, slideIndex, elementIndex) {\n    H5P.ExportableTextArea.CPInterface.onDelete(params, slideIndex, elementIndex, this);\n  };\n\n  C.prototype.onAdd = function (params, slideIndex) {\n    H5P.ExportableTextArea.CPInterface.onAdd(params, slideIndex, this);\n  };\n\n  C.prototype.exportAnswers = true;\n\n  C.prototype.getTitle = function() {\n    return H5P.createTitle(this.header);\n  };\n\n  C.prototype.getCurrentState = function () {\n    var text = this.$input.val();\n    if (text.trim()) {\n      return {\n        answer: text\n      };\n    }\n  };\n\n  return C;\n})(H5P.jQuery);\n\n\/**\n * Interface responsible for handling index calculations beeing done when\n * adding and removing Answer elements\n *\n * Implemented as singleton\n *\/\nH5P.ExportableTextArea.CPInterface = (function _eta_cp_interface_internal() {\n  if ( _eta_cp_interface_internal._singletonInstance ) {\n    return _eta_cp_interface_internal._singletonInstance;\n  }\n  _eta_cp_interface_internal._singletonInstance = this;\n\n  this.answerCounter = [];\n\n  this.onDelete = function (params, slideIndex, elementIndex, elementInstance) {\n    \/\/ Reorder index on current slide\n    var filtered = params.slides[slideIndex].elements.filter(function (element, index) {\n      return H5P.libraryFromString(element.action.library).machineName === 'H5P.ExportableTextArea';\n    }).sort(function (a, b) {\n      return a.action.params.index - b.action.params.index;\n    });\n\n    this.answerCounter[slideIndex] = [];\n    var $currentSlide = H5P.jQuery('.h5p-slides-wrapper > .h5p-current');\n    for (var i = 0; i < filtered.length; i++) {\n      filtered[i].action.params.index = i;\n      this.answerCounter[slideIndex][i] = true;\n      var $child = $currentSlide.children('.h5p-eta').has('[data-index=' + i + ']');\n      if (!$child.length) {\n        $child = $currentSlide.children('.h5p-eta').has('[data-index=' + (i + 1) + ']');\n        $child.find('.index').html(i + 1);\n        $child.find('.h5p-eta-input').attr('data-index', i);\n\n      }\n    }\n  };\n\n  this.onDeleteSlide = function (slideIndex) {\n    this.answerCounter[slideIndex] = [];\n  };\n\n  this.changeSlideIndex = function(left, right) {\n    var tmp = this.answerCounter[left];\n    this.answerCounter[left] = this.answerCounter[right];\n    this.answerCounter[right] = tmp;\n  };\n\n  this.onAdd = function (params, slideIndex, elementInstance) {\n    if (this.answerCounter[slideIndex] === undefined) {\n      this.answerCounter[slideIndex] = [];\n    }\n\n    if (params.action.params.index === undefined) {\n      params.action.params.index = this.answerCounter[slideIndex].length;\n    }\n\n    this.answerCounter[slideIndex][params.action.params.index] = true;\n  };\n\n  return this;\n})();\n\n\/**\n * Export all Answers\n *\n * Implemented as singleton\n *\/\nH5P.ExportableTextArea.Exporter = (function _eta_exporter_internal() {\n\n  if ( _eta_exporter_internal._singletonInstance ) {\n    return _eta_exporter_internal._singletonInstance;\n  }\n  _eta_exporter_internal._singletonInstance = this;\n\n  this.deviceIsIPx = undefined;\n  this.useFlash = undefined;\n\n  this.run = function (slides, elements) {\n    \/\/ Save it as a file:\n    if (this.useFileSaver()) {\n      var blob = new Blob([this.createDocContent(slides, elements)], {\n        type: \"application\/msword;charset=utf-8\"\n      });\n      saveAs(blob, 'exported-text.doc');\n    }\n  };\n\n  this.createDocContent = function (slides, elements) {\n    var html = '';\n\n    for (var i = 0; i < elements.length; i++) {\n      var slideHtml = [];\n\n      \/\/ Empty slide\n      if (!elements[i]) {\n        continue;\n      }\n\n      for (var j = 0; j < elements[i].length; j++) {\n        var element = elements[i][j];\n\n        if (element.libraryInfo && element.libraryInfo.machineName === 'H5P.ExportableTextArea') {\n          var params = slides[i].elements[j];\n          var input = (element.$input !== undefined ? element.$input.val() : '');\n          slideHtml[element.index] = element.header + '<p>' + input.replace(\/(\\r\\n|\\r|\\n)\/g, '<br>') + '<\/p>';\n\n          if (params.action.params.exportComments !== undefined && params.action.params.exportComments) {\n            slideHtml[element.index] += params.solution;\n          }\n        }\n      }\n\n      if (slideHtml.length) {\n        if (html) {\n          html += '<hr\/>';\n        }\n        html += slideHtml.join('');\n      }\n    }\n\n    \/\/ Create HTML:\n    \/\/ me + ta and other hacks to avoid that new relic injects script...\n    html = '<ht' + 'ml><he' + 'ad><me' + 'ta charset=\"UTF-8\"><\/me' + 'ta><\/he' + 'ad><bo' + 'dy><p><a href=\"' + document.URL + '\">' + document.URL + '<\/a><\/p>' + html + '<\/bo' + 'dy><\/ht' + 'ml>';\n\n    return html;\n  };\n\n  this.createExportButton = function (title) {\n    var self = this;\n\n    if (!H5P.ExportableTextArea.Exporter.supportsExport()) {\n      return '';\n    }\n\n    if (this.useFileSaver()) {\n      return '<a href=\"#\" class=\"h5p-eta-export\">' + title + '<\/a>';\n    } else {\n      var $downloadify = H5P.jQuery('<div><\/div>');\n      $downloadify.appendTo('body');\n\n      $downloadify.downloadify({\n        filename: function () {\n          return 'answer-text.doc';\n        },\n        data: function () {\n          return self.createDocContent();\n        },\n        onError: function () {\n          alert('You must put something in the File Contents or there will be nothing to save!');\n        },\n        swf: H5P.getLibraryPath('downloadify-1.0') + '\/resources\/downloadify.swf',\n        width: 100,\n        height: 30,\n        transparent: true,\n        append: false,\n        label: title\n      });\n\n      var html = '<a href=\"#\" class=\"h5p-eta-export flash\">' + $downloadify.html() + '<\/a>';\n      $downloadify.remove();\n      return html;\n    }\n  };\n\n  this.useFileSaver = function () {\n    if (useFlash === undefined) {\n      useFlash = (navigator.userAgent.match(\/MSIE 8\/i) !== null || navigator.userAgent.match(\/MSIE 9\/i) !== null);\n    }\n    return !useFlash;\n  };\n\n  \/**\n   *  Check if this device\/browser supports download\n   * at all\n   *\/\n  this.supportsExport = function () {\n    if (deviceIsIPx === undefined) {\n      deviceIsIPx = navigator.userAgent.match(\/iPad\/i) === null &&\n        navigator.userAgent.match(\/iPhone\/i) === null &&\n        navigator.userAgent.match(\/iPod\/i) === null;\n    }\n    return deviceIsIPx;\n  };\n\n  return this;\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Text-1.1\/scripts\/text.js?ver=1.1.6":"\nvar H5P = H5P || {};\n\n\/**\n * Constructor.\n *\n * @param {object} params Options for this library.\n *\/\nH5P.Text = function (params) {\n  this.text = params.text === undefined ? '<em>New text<\/em>' : params.text;\n};\n\n\/**\n * Wipe out the content of the wrapper and put our HTML in it.\n *\n * @param {jQuery} $wrapper\n *\/\nH5P.Text.prototype.attach = function ($wrapper) {\n  $wrapper.addClass('h5p-text').html(this.text);\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.Duration-1.1\/scripts\/duration.js?ver=1.1.2":"\nvar H5PEditor = H5PEditor || {};\n\n\/**\n * Duration widget module\n *\n * @param {jQuery} $\n *\/\nH5PEditor.widgets.duration = H5PEditor.Duration = (function ($) {\n\n  \/**\n   * Creates a time picker.\n   *\n   * @param {mixed} parent\n   * @param {object} field\n   * @param {mixed} params\n   * @param {function} setValue\n   * @returns {C}\n   *\/\n  function C(parent, field, params, setValue) {\n    this.parent = parent;\n    this.field = field;\n    this.params = params;\n    this.setValue = setValue;\n  }\n\n  \/**\n   * Append the field to the wrapper.\n   *\n   * @param {jQuery} $wrapper\n   * @returns {undefined}\n   *\/\n  C.prototype.appendTo = function ($wrapper) {\n    var that = this;\n\n    this.$item = $(this.createHtml()).appendTo($wrapper);\n    this.$inputs = this.$item.find('input');\n    this.$errors = this.$item.children('.h5p-errors');\n\n    this.$inputs.change(function () {\n      \/\/ Validate\n      var value = that.validate();\n\n      if (value) {\n        \/\/ Set param\n        that.params = value;\n        that.setValue(that.field, value);\n      }\n    }).click(function () {\n      return false;\n    });\n  };\n\n  \/**\n   * Creates HTML for the widget.\n   *\/\n  C.prototype.createHtml = function () {\n    var input = H5PEditor.createText(this.params !== undefined ? C.humanizeTime(this.params.from) : undefined, 15, 'From') + ' - ' + H5PEditor.createText(this.params !== undefined ? C.humanizeTime(this.params.to) : undefined, 15, 'To');\n    return H5PEditor.createFieldMarkup(this.field, input);\n  };\n\n  \/**\n   * Validate the current values.\n   *\/\n  C.prototype.validate = function () {\n    var that = this;\n    var duration = {};\n\n    if (that.$errors.children().length) {\n      \/\/ Field hasn't been fixed since last validate\n      return false;\n    }\n\n    this.$inputs.each(function (i) {\n      var $input = $(this);\n      var value = H5P.trim($input.val());\n      var field = that.field.fields[i];\n\n      \/\/ Check that the input isn't blank\n      if ((that.field.optional === undefined || !that.field.optional) && !value.length) {\n        that.$errors.append(H5PEditor.createError(H5PEditor.t('core', 'requiredProperty', {':property': field.name})));\n        return false;\n      }\n\n      \/\/ Split time format and check that we have between one and two colons.\n      var values = value.split(':', 4);\n      if (values.length !== 2 && values.length !== 3) {\n        that.$errors.append(H5PEditor.createError(C.t('invalidTime', {':property': field.name})));\n        return false;\n      }\n\n      \/\/ Validate seconds and add to value\n      var allowedChars = new RegExp('^[0-9]+$');\n      var j = values.length - 1;\n\n      value = parseInt(values[j]);\n      if (!values[j].match(allowedChars) || values[j].length !== 2 || value > 59) {\n        that.$errors.append(H5PEditor.createError(C.t('invalidTime', {':property': field.name})));\n        return false;\n      }\n\n      \/\/ Validate minutes\n      j = j - 1;\n      var minutes = parseInt(values[j]);\n      if (!values[j].match(allowedChars) || (values[j - 1] !== undefined && values[j].length !== 2) || (values[j - 1] === undefined && values[j].length !== (minutes + '').length) || minutes > 59) {\n        that.$errors.append(H5PEditor.createError(C.t('invalidTime', {':property': field.name})));\n        return false;\n      }\n      \/\/ Convert to seconds and add to value\n      value += minutes * 60;\n\n      \/\/ Validate hours\n      j = j - 1;\n      if (values[j] !== undefined) {\n        var hours = parseInt(values[j]);\n        if (!values[j].match(allowedChars) || values[j].length !== (hours + '').length || hours < 1) {\n          that.$errors.append(H5PEditor.createError(C.t('invalidTime', {':property': field.name})));\n          return false;\n        }\n        \/\/ Convert to seconds and add to value\n        value += hours * 3600;\n      }\n\n      \/\/ Check that field doesn't exceed its min and max values.\n      if (field.max !== undefined && value > field.max) {\n        that.$errors.append(H5PEditor.createError(H5PEditor.t('core', 'exceedsMax', {':property': field.name, ':max': C.humanizeTime(field.max)})));\n        return false;\n      }\n      else if (field.min !== undefined && value < field.min) {\n        that.$errors.append(H5PEditor.createError(C.t('exceedsMin', {':property': field.name, ':min': C.humanizeTime(field.min)})));\n        return false;\n      }\n\n      duration[field.name] = value;\n    });\n\n    \/\/ Check that \"To\" time always is after \"From\" time.\n    if (duration.from > duration.to) {\n      this.$errors.append(H5PEditor.createError(C.t('fromBiggerThanTo')));\n    }\n\n    return H5PEditor.checkErrors(this.$errors, this.$inputs, duration);\n  };\n\n  \/**\n   * Remove this item.\n   *\/\n  C.prototype.remove = function () {\n    this.$item.remove();\n  };\n\n  \/**\n   * Local translate function.\n   *\n   * @param {Atring} key\n   * @param {Object} params\n   * @returns {@exp;H5PEditor@call;t}\n   *\/\n  C.t = function (key, params) {\n    return H5PEditor.t('H5PEditor.Duration', key, params);\n  };\n\n  \/**\n   * Formats time in H:MM:SS.\n   *\n   * @param {float} seconds\n   * @returns {string}\n   *\/\n  C.humanizeTime = function (seconds) {\n    var minutes = Math.floor(seconds \/ 60);\n    var hours = Math.floor(minutes \/ 60);\n\n    minutes = minutes % 60;\n    seconds = Math.floor(seconds % 60);\n\n    var time = '';\n\n    if (hours !== 0) {\n      time += hours + ':';\n\n      if (minutes < 10) {\n        time += '0';\n      }\n    }\n\n    time += minutes + ':';\n\n    if (seconds < 10) {\n      time += '0';\n    }\n\n    time += seconds;\n\n    return time;\n  };\n\n  return C;\n})(H5P.jQuery);\n\n\/\/ Default english translations\nH5PEditor.language['H5PEditor.Duration'] = {\n  libraryStrings: {\n    exceedsMin: '\":property\" exceeds minimum value of :min.',\n    fromBiggerThanTo: '\"From\" must be earlier than \"To\".',\n    invalidTime: '\":property\" contains an invalid time format.'\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.Timecode-1.2\/timecode.js?ver=1.2.1":"\nba10987395a3eb867c03a79a5d69da\n\nPackage: gfs2-cluster\nSource: gfs2-utils\nVersion: 3.1.3-1.2\nInstalled-Size: 171\nMaintainer: Debian HA Maintainers <debian-ha-maintainers@lists.alioth.debian.org>\nArchitecture: amd64\nReplaces: cman (<= 3.0.17), gfs-pcmk (<= 3.0.17)\nDepends: libc6 (>= 2.14), libccs3 (>= 3.1.8), libcfg4 (>= 1.4.6), libcpg4 (>= 1.4.6), libdlmcontrol3 (>= 3.1.8), libfence4 (>= 3.1.8), liblogthread3 (>= 3.1.8), libquorum4 (>= 1.4.6), libsackpt3 (>= 1.1.4), corosync (>= 1.2.7), openais (>= 1.1.2), cman (>= 3.1.0)\nConflicts: cman (<= 3.0.17), gfs-pcmk (<= 3.0.17)\nDescription: Global File System 2 - cluster tools\nHomepage: http:\/\/sources.redhat.com\/cluster\/wiki\/\nDescription-md5: e1badce2524a2644399a12752f9af172\nSection: admin\nPriority: optional\nFilename: pool\/main\/g\/gfs2-utils\/gfs2-cluster_3.1.3-1.2_amd64.deb\nSize: 50272\nMD5sum: edcee0cca6b0db7c4082a53b58b9e222\nSHA1: 9d519d5a4b991fbba24f23f05768032d3db9c024\nSHA256: cbf5883f87e99a3e0bd73cda51e66dae502747d004434882b9a2a735bbf12a29\n\nPackage: gfs2-utils\nVersion: 3.1.3-1.2\nInstalled-Size: 754\nMaintainer: Debian HA Maintainers <debian-ha-maintainers@lists.alioth.debian.org>\nArchitecture: amd64\nReplaces: gfs2-tools (<= 3.0.17)\nDepends: libc6 (>= 2.14), libncurses5 (>= 5.5-5~), libtinfo5, zlib1g (>= 1:1.2.3.4), gfs2-cluster (= 3.1.3-1.2), psmisc, cman\nConflicts: gfs2-tools (<= 3.0.17)\nDescription: Global File System 2 - filesystem tools\nHomepage: http:\/\/sources.redhat.com\/cluster\/wiki\/\nDescription-md5: f08c6010a5375543fdf3b2495d21348a\nTag: uitoolkit::ncurses\nSection: admin\nPriority: optional\nFilename: pool\/main\/g\/gfs2-utils\/gfs2-utils_3.1.3-1.2_amd64.deb\nSize: 216796\nMD5sum: 8f1ea86e0e8b72ff5e06e747427bc0eb\nSHA1: 7ee9fe52f39a7732dc9b9bed8bb7f78711ccf08c\nSHA256: 1c02d698e44c13a6e41abf52ff061cbb6a7387c922e48059985d19a1117e0104\n\nPackage: gfsview\nVersion: 20121130+dfsg-1\nInstalled-Size: 606\nMaintainer: Debian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>\nArchitecture: amd64\nDepends: fonts-tlwg-garuda, libgfsgl0 (= 20121130+dfsg-1), zenity, libatk1.0-0 (>= 1.12.4), libc6 (>= 2.14), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.11), libfreetype6 (>= 2.2.1), libftgl2 (>= 2.1.3~rc5), libgdk-pixbuf2.0-0 (>= 2.22.0), libgfs-1.3-2, libgl1-mesa-glx | libgl1, libgl2ps0, libglib2.0-0 (>= 2.31.8), libglu1-mesa | libglu1, libgtk2.0-0 (>= 2.8.0), libgtkglext1, libgts-0.7-5 (>= 0.7.6), libhwloc5, libice6 (>= 1:1.0.0), libopenmpi1.6, libosmesa6 (>= 10.2~), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libpangoft2-1.0-0 (>= 1.14.0), libpangox-1.0-0 (>= 0.0.2), libsm6, libstartup-notification0 (>= 0.2), libx11-6, libxmu6, libxt6\nRecommends: gerris | gerris-mpi\nDescription: graphical viewer for Gerris simulation files\nHomepage: http:\/\/gfs.sourceforge.net\/\nDescription-md5: 85b566a298a53bbe0ad9cdd985de896f\nTag: uitoolkit::gtk\nSection: science\nPriority: optional\nFilename: pool\/main\/g\/gfsview\/gfsview_20121130+dfsg-1_amd64.deb\nSize: 147666\nMD5sum: c1dd35b3063ee8ea808e871af8dc3407\nSHA1: b349a2d22ace8bd9ac7490c902c58543f3869c2e\nSHA256: 14f26a1db94827c13b6c30324ab3dee580ba3eca2acf998fd8a02cd0358c855d\n\nPackage: libgfsgl-dev\nSource: gfsview\nVersion: 20121130+dfsg-1\nInstalled-Size: 211\nMaintainer: Debian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>\nArchitecture: amd64\nDepends: libgfsgl0 (= 20121130+dfsg-1)\nDescription: graphical viewer for Gerris simulation files. Development files\nMulti-Arch: same\nHomepage: http:\/\/gfs.sourceforge.net\/\nDescription-md5: 317029727c83796a4e914c9bde843000\nTag: devel::library, role::devel-lib\nSection: libdevel\nPriority: optional\nFilename: pool\/main\/g\/gfsview\/libgfsgl-dev_20121130+dfsg-1_amd64.deb\nSize: 39414\nMD5sum: 4aebeef09f5ef10d2ff8ba94abf121b8\nSHA1: 1db96a4d3537a8b441d8e69bd108c220e8744b65\nSHA256: 2bb6378d79ea4927ce2a642402e813a6d026a1c7cb351e074e7853a66d9deddf\n\nPackage: libgfsgl0\nSource: gfsview\nVersion: 20121130+dfsg-1\nInstalled-Size: 350\nMaintainer: Debian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>\nArchitecture: amd64\nDepends: libc6 (>= 2.14), libftgl2 (>= 2.1.3~rc5), libgfs-1.3-2, libgl2ps0, libglib2.0-0 (>= 2.12.0), libglu1-mesa | libglu1, libgts-0.7-5 (>= 0.7.6), libhwloc5, libopenmpi1.6, libosmesa6 (>= 10.2~)\nPre-Depends: multiarch-support\nDescription: graphical viewer for Gerris simulation files. Shared library\nMulti-Arch: same\nHomepage: http:\/\/gfs.sourceforge.net\/\nDescription-md5: 91251b9245d92c2dbf0ef5037e90ac09\nSection: science\nPriority: optional\nFilename: pool\/main\/g\/gfsview\/libgfsgl0_20121130+dfsg-1_amd64.deb\nSize: 93412\nMD5sum: d780b027b17425b3765b1d8889513772\nSHA1: f6200123f77384a7a37bdec258c72c8818357d75\nSHA256: 3332469978f15ed5d076751fc4054c29472ed94b94d52e8747c9fa6e653f826e\n\nPackage: gfxboot\nVersion: 4.5.2-1.1-5\nInstalled-Size: 116\nMaintainer: Debian QA Group <packages@qa.debian.org>\nArchitecture: amd64\nSuggests: gfxboot-themes\nDescription: tool to test and create graphical boot logos (runtime)\nHomepage: http:\/\/gfxboot.sourceforge.net\/\nDescription-md5: dacebcc0ca068d91673a1386979de16b\nSection: misc\nPriority: extra\nFilename: pool\/main\/g\/gfxboot\/gfxboot_4.5.2-1.1-5_amd64.deb\nSize: 23692\nMD5sum: dbbb41d10789ae258e5cbad19d0b68f9\nSHA1: 2978f2fd3f3cd2898a69d11b5db4b2c1ddb460c1\nSHA256: 87f40594d74224bab1a63738248e7d1069c56eff9fa837a3a1a49955073fe976\n\nPackage: gfxboot-dbg\nSource: gfxboot\nVersion: 4.5.2-1.1-5\nInstalled-Size: 117\nMaintainer: Debian QA Group <packages@qa.debian.org>\nArchitecture: amd64\nDepends: gfxboot (= 4.5.2-1.1-5), gfxboot-dev (= 4.5.2-1.1-5)\nDescription: tool to test and create graphical boot logos (debug)\nHomepage: http:\/\/gfxboot.sourceforge.net\/\nDescription-md5: 8c488286f55ee71638402b4179c91240\nSection: debug\nPriority: extra\nFilename: pool\/main\/g\/gfxboot\/gfxboot-dbg_4.5.2-1.1-5_amd64.deb\nSize: 60402\nMD5sum: 45e97ecd7e47541f3d02e8c1a521beec\nSHA1","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.SelectToggleFields-1.1\/select-toggle-fields.js?ver=1.1.0":"\nH5PEditor.SelectToggleFields = (function ($) {\n\n  if (Function.prototype.clone === undefined) {\n    Function.prototype.clone = function() {\n      var that = this;\n      var temp = function temporary() {\n        return that.apply(this, arguments);\n      };\n      for (var key in this) {\n        temp[key] = this[key];\n      }\n      return temp;\n    };\n  }\n\n  function SelectToggleFields(parent, field, params, setValue) {\n    var self = this;\n\n    \/\/ Set default value:\n    params = params || '';\n\n    self.field = field;\n    \/\/ Outsource readies\n    self.passReadies = true;\n    self.value = params;\n\n    var fieldsToHide = [];\n    var nameToFieldMap = {};\n\n    parent.ready(function () {\n      for (var i = 0; i < field.options.length; i++) {\n        var option = field.options[i];\n        if (option.hideFields) {\n          option.hideFields.forEach(function (path) {\n            var f = H5PEditor.findField(path, parent);\n            if (f.getDomElement !== undefined) {\n\n              var $element = f.getDomElement();\n              fieldsToHide.push($element);\n              if (nameToFieldMap[option.value] === undefined) {\n                nameToFieldMap[option.value] = [];\n              }\n              var originalValidate = f.validate.clone();\n              nameToFieldMap[option.value].push($element);\n              \/\/ Override validate function, so that we do not validate hidden\n              \/\/ elements\n              f.validate = function () {\n                \/\/ if not hidden - let's validate\n                return ($element.hasClass('h5peditor-select-toggle-field-hide') ? true : originalValidate());\n              };\n            }\n            else {\n              \/\/throw\n              console.error('Wrong usage - field need to implement getDomElement()');\n            }\n          });\n        }\n      }\n\n      $selectWrapper.find('select').val(params);\n      setValue(self.field, params);\n      updateUI(params);\n    });\n\n    var $selectWrapper = $('<div>', {});\n\n    var semantics = [\n      {\n        name: field.name,\n        type: field.type,\n        label: field.label,\n        options: field.options,\n        optional: field.optional,\n        default: field.default\n      }\n    ];\n\n    H5PEditor.processSemanticsChunk(semantics, params, $selectWrapper, self);\n\n    var updateUI = function (value) {\n      var fields = nameToFieldMap[value];\n\n      if (fields) {\n        \/\/ Unhide all fields:\n        for (var i = 0; i < fieldsToHide.length; i++) {\n          fieldsToHide[i].removeClass('h5peditor-select-toggle-field-hide');\n        }\n\n        fields.forEach(function (f) {\n          f.addClass('h5peditor-select-toggle-field-hide');\n        });\n      }\n      else {\n        \/\/ Hide all fields:\n        for (var i = 0; i < fieldsToHide.length; i++) {\n          fieldsToHide[i].addClass('h5peditor-select-toggle-field-hide');\n        }\n      }\n    };\n\n    $selectWrapper.find('select').on('change', function () {\n      self.value = $(this).val();\n      setValue(self.field, self.value);\n      updateUI(self.value);\n    });\n\n    \/**\n     *\n     *\/\n    self.appendTo = function ($wrapper) {\n      $wrapper.append($selectWrapper);\n    };\n\n    \/**\n     * Always validate\n     * @return {boolean}\n     *\/\n    self.validate = function () {\n      return true;\n    };\n\n    self.remove = function () {};\n  }\n\n  return SelectToggleFields;\n})(H5PEditor.$);\n\n\/\/ Register widget\nH5PEditor.widgets.selectToggleFields = H5PEditor.SelectToggleFields;\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.ColorSelector-1.2\/scripts\/spectrum.js?ver=1.2.3":"\n\/\/ Spectrum Colorpicker v1.8.0\n\/\/ https:\/\/github.com\/bgrins\/spectrum\n\/\/ Author: Brian Grinstead\n\/\/ License: MIT\n\n(function(jQuery) {\n\n(function (factory) {\n    \"use strict\";\n\n    if (typeof define === 'function' && define.amd) { \/\/ AMD\n        define(['jquery'], factory);\n    }\n    else if (typeof exports == \"object\" && typeof module == \"object\") { \/\/ CommonJS\n        module.exports = factory(require('jquery'));\n    }\n    else { \/\/ Browser\n        factory(jQuery);\n    }\n})(function($, undefined) {\n    \"use strict\";\n\n    var defaultOpts = {\n\n          \/\/ Callbacks\n          beforeShow: noop,\n          move: noop,\n          change: noop,\n          show: noop,\n          hide: noop,\n\n          \/\/ Options\n          color: false,\n          flat: false,\n          showInput: false,\n          allowEmpty: false,\n          showButtons: true,\n          clickoutFiresChange: true,\n          showInitial: false,\n          showPalette: false,\n          showPaletteOnly: false,\n          hideAfterPaletteSelect: false,\n          togglePaletteOnly: false,\n          showSelectionPalette: true,\n          localStorageKey: false,\n          appendTo: \"body .h5peditor-form\",\n          maxSelectionSize: 7,\n          cancelText: \"cancel\",\n          chooseText: \"choose\",\n          togglePaletteMoreText: \"more\",\n          togglePaletteLessText: \"less\",\n          clearText: \"Clear Color Selection\",\n          noColorSelectedText: \"No Color Selected\",\n          preferredFormat: false,\n          className: \"\", \/\/ Deprecated - use containerClassName and replacerClassName instead.\n          containerClassName: \"\",\n          replacerClassName: \"\",\n          showAlpha: false,\n          theme: \"sp-light\",\n          palette: [[\"#ffffff\", \"#000000\", \"#ff0000\", \"#ff8000\", \"#ffff00\", \"#008000\", \"#0000ff\", \"#4b0082\", \"#9400d3\"]],\n          selectionPalette: [],\n          disabled: false,\n          offset: null\n      },\n      spectrums = [],\n      IE = !!\/msie\/i.exec( window.navigator.userAgent ),\n      rgbaSupport = (function() {\n          function contains( str, substr ) {\n              return !!~('' + str).indexOf(substr);\n          }\n\n          var elem = document.createElement('div');\n          var style = elem.style;\n          style.cssText = 'background-color:rgba(0,0,0,.5)';\n          return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla');\n      })(),\n      replaceInput = [\n          \"<div class='sp-replacer'>\",\n          \"<div class='sp-preview'><div class='sp-preview-inner'><\/div><\/div>\",\n          \"<div class='sp-dd'>&#9660;<\/div>\",\n          \"<\/div>\"\n      ].join(''),\n      markup = (function () {\n\n          \/\/ IE does not support gradients with multiple stops, so we need to simulate\n          \/\/  that for the rainbow slider with 8 divs that each have a single gradient\n          var gradientFix = \"\";\n          if (IE) {\n              for (var i = 1; i <= 6; i++) {\n                  gradientFix += \"<div class='sp-\" + i + \"'><\/div>\";\n              }\n          }\n\n          return [\n              \"<div class='sp-container sp-hidden'>\",\n              \"<div class='sp-palette-container'>\",\n              \"<div class='sp-palette sp-thumb sp-cf'><\/div>\",\n              \"<div class='sp-palette-button-container sp-cf'>\",\n              \"<button type='button' class='sp-palette-toggle'><\/button>\",\n              \"<\/div>\",\n              \"<\/div>\",\n              \"<div class='sp-picker-container'>\",\n              \"<div class='sp-top sp-cf'>\",\n              \"<div class='sp-fill'><\/div>\",\n              \"<div class='sp-top-inner'>\",\n              \"<div class='sp-color'>\",\n              \"<div class='sp-sat'>\",\n              \"<div class='sp-val'>\",\n              \"<div class='sp-dragger'><\/div>\",\n              \"<\/div>\",\n              \"<\/div>\",\n              \"<\/div>\",\n              \"<div class='sp-clear sp-clear-display'>\",\n              \"<\/div>\",\n              \"<div class='sp-hue'>\",\n              \"<div class='sp-slider'><\/div>\",\n              gradientFix,\n              \"<\/div>\",\n              \"<\/div>\",\n              \"<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'><\/div><\/div><\/div>\",\n              \"<\/div>\",\n              \"<div class='sp-input-container sp-cf'>\",\n              \"<input class='sp-input' type='text' spellcheck='false'  \/>\",\n              \"<\/div>\",\n              \"<div class='sp-initial sp-thumb sp-cf'><\/div>\",\n              \"<div class='sp-button-container sp-cf'>\",\n              \"<a class='sp-cancel' href='#'><\/a>\",\n              \"<button type='button' class='sp-choose'><\/button>\",\n              \"<\/div>\",\n              \"<\/div>\",\n              \"<\/div>\"\n          ].join(\"\");\n      })();\n\n    function paletteTemplate (p, color, className, opts) {\n        var html = [];\n        for (var i = 0; i < p.length; i++) {\n            var current = p[i];\n            if(current) {\n                var tiny = tinycolor(current);\n                var c = tiny.toHsl().l < 0.5 ? \"sp-thumb-el sp-thumb-dark\" : \"sp-thumb-el sp-thumb-light\";\n                c += (tinycolor.equals(color, current)) ? \" sp-thumb-active\" : \"\";\n                var formattedString = tiny.toString(opts.preferredFormat || \"rgb\");\n                var swatchStyle = rgbaSupport ? (\"background-color:\" + tiny.toRgbString()) : \"filter:\" + tiny.toFilter();\n                html.push('<span title=\"' + formattedString + '\" data-color=\"' + tiny.toRgbString() + '\" class=\"' + c + '\"><span class=\"sp-thumb-inner\" style=\"' + swatchStyle + ';\" \/><\/span>');\n            } else {\n                var cls = 'sp-clear-display';\n                html.push($('<div \/>')\n                  .append($('<span data-color=\"\" style=\"background-color:transparent;\" class=\"' + cls + '\"><\/span>')\n                    .attr('title', opts.noColorSelectedText)\n                  )\n                  .html()\n                );\n            }\n        }\n        return \"<div class='sp-cf \" + className + \"'>\" + html.join('') + \"<\/div>\";\n    }\n\n    function hideAll() {\n        for (var i = 0; i < spectrums.length; i++) {\n            if (spectrums[i]) {\n                spectrums[i].hide();\n            }\n        }\n    }\n\n    function instanceOptions(o, callbackContext) {\n        var opts = $.extend({}, defaultOpts, o);\n        opts.callbacks = {\n            'move': bind(opts.move, callbackContext),\n            'change': bind(opts.change, callbackContext),\n            'show': bind(opts.show, callbackContext),\n            'hide': bind(opts.hide, callbackContext),\n            'beforeShow': bind(opts.beforeShow, callbackContext)\n        };\n\n        return opts;\n    }\n\n    function spectrum(element, o) {\n\n        var opts = instanceOptions(o, element),\n          flat = opts.flat,\n          showSelectionPalette = opts.showSelectionPalette,\n          localStorageKey = opts.localStorageKey,\n          theme = opts.theme,\n          callbacks = opts.callbacks,\n          resize = throttle(reflow, 10),\n          visible = false,\n          isDragging = false,\n          dragWidth = 0,\n          dragHeight = 0,\n          dragHelperHeight = 0,\n          slideHeight = 0,\n          slideWidth = 0,\n          alphaWidth = 0,\n          alphaSlideHelperWidth = 0,\n          slideHelperHeight = 0,\n          currentHue = 0,\n          currentSaturation = 0,\n          currentValue = 0,\n          currentAlpha = 1,\n          palette = [],\n          paletteArray = [],\n          paletteLookup = {},\n          selectionPalette = opts.selectionPalette.slice(0),\n          maxSelectionSize = opts.maxSelectionSize,\n          draggingClass = \"sp-dragging\",\n          shiftMovementDirection = null;\n\n        var doc = element.ownerDocument,\n          body = doc.body,\n          boundElement = $(element),\n          disabled = false,\n          container = $(markup, doc).addClass(theme),\n          pickerContainer = container.find(\".sp-picker-container\"),\n          dragger = container.find(\".sp-color\"),\n          dragHelper = container.find(\".sp-dragger\"),\n          slider = container.find(\".sp-hue\"),\n          slideHelper = container.find(\".sp-slider\"),\n          alphaSliderInner = container.find(\".sp-alpha-inner\"),\n          alphaSlider = container.find(\".sp-alpha\"),\n          alphaSlideHelper = container.find(\".sp-alpha-handle\"),\n          textInput = container.find(\".sp-input\"),\n          paletteContainer = container.find(\".sp-palette\"),\n          initialColorContainer = container.find(\".sp-initial\"),\n          cancelButton = container.find(\".sp-cancel\"),\n          clearButton = container.find(\".sp-clear\"),\n          chooseButton = container.find(\".sp-choose\"),\n          toggleButton = container.find(\".sp-palette-toggle\"),\n          isInput = boundElement.is(\"input\"),\n          isInputTypeColor = isInput && boundElement.attr(\"type\") === \"color\" && inputTypeColorSupport(),\n          shouldReplace = isInput && !flat,\n          replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]),\n          offsetElement = (shouldReplace) ? replacer : boundElement,\n          previewElement = replacer.find(\".sp-preview-inner\"),\n          initialColor = opts.color || (isInput && boundElement.val()),\n          colorOnShow = false,\n          currentPreferredFormat = opts.preferredFormat,\n          clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange,\n          isEmpty = !initialColor,\n          allowEmpty = opts.allowEmpty && !isInputTypeColor;\n\n        function applyOptions() {\n\n            if (opts.showPaletteOnly) {\n                opts.showPalette = true;\n            }\n\n            toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);\n\n            if (opts.palette) {\n                palette = opts.palette.slice(0);\n                paletteArray = $.isArray(palette[0]) ? palette : [palette];\n                paletteLookup = {};\n                for (var i = 0; i < paletteArray.length; i++) {\n                    for (var j = 0; j < paletteArray[i].length; j++) {\n                        var rgb = tinycolor(paletteArray[i][j]).toRgbString();\n                        paletteLookup[rgb] = true;\n                    }\n                }\n            }\n\n            container.toggleClass(\"sp-flat\", flat);\n            container.toggleClass(\"sp-input-disabled\", !opts.showInput);\n            container.toggleClass(\"sp-alpha-enabled\", opts.showAlpha);\n            container.toggleClass(\"sp-clear-enabled\", allowEmpty);\n            container.toggleClass(\"sp-buttons-disabled\", !opts.showButtons);\n            container.toggleClass(\"sp-palette-buttons-disabled\", !opts.togglePaletteOnly);\n            container.toggleClass(\"sp-palette-disabled\", !opts.showPalette);\n            container.toggleClass(\"sp-palette-only\", opts.showPaletteOnly);\n            container.toggleClass(\"sp-initial-disabled\", !opts.showInitial);\n            container.addClass(opts.className).addClass(opts.containerClassName);\n\n            reflow();\n        }\n\n        function initialize() {\n\n            if (IE) {\n                container.find(\"*:not(input)\").attr(\"unselectable\", \"on\");\n            }\n\n            applyOptions();\n\n            if (shouldReplace) {\n                boundElement.after(replacer).hide();\n            }\n\n            if (!allowEmpty) {\n                clearButton.hide();\n            }\n\n            if (flat) {\n                boundElement.after(container).hide();\n            }\n            else {\n\n                var appendTo = opts.appendTo === \"parent\" ? boundElement.parent() : $(opts.appendTo);\n                if (appendTo.length !== 1) {\n                    appendTo = $(\"body .h5peditor-form\");\n                }\n\n                appendTo.append(container);\n            }\n\n            updateSelectionPaletteFromStorage();\n\n            offsetElement.bind(\"click.spectrum touchstart.spectrum\", function (e) {\n                if (!disabled) {\n                    toggle();\n                }\n\n                e.stopPropagation();\n\n                if (!$(e.target).is(\"input\")) {\n                    e.preventDefault();\n                }\n            });\n\n            if(boundElement.is(\":disabled\") || (opts.disabled === true)) {\n                disable();\n            }\n\n            \/\/ Prevent clicks from bubbling up to document.  This would cause it to be hidden.\n            container.click(stopPropagation);\n\n            \/\/ Handle user typed input\n            textInput.change(setFromTextInput);\n            textInput.bind(\"paste\", function () {\n                setTimeout(setFromTextInput, 1);\n            });\n            textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } });\n\n            cancelButton.text(opts.cancelText);\n            cancelButton.bind(\"click.spectrum\", function (e) {\n                e.stopPropagation();\n                e.preventDefault();\n                revert();\n                hide();\n            });\n\n            clearButton.attr(\"title\", opts.clearText);\n            clearButton.bind(\"click.spectrum\", function (e) {\n                e.stopPropagation();\n                e.preventDefault();\n                isEmpty = true;\n                move();\n\n                if(flat) {\n                    \/\/for the flat style, this is a change event\n                    updateOriginalInput(true);\n                }\n            });\n\n            chooseButton.text(opts.chooseText);\n            chooseButton.bind(\"click.spectrum\", function (e) {\n                e.stopPropagation();\n                e.preventDefault();\n\n                if (IE && textInput.is(\":focus\")) {\n                    textInput.trigger('change');\n                }\n\n                if (isValid()) {\n                    updateOriginalInput(true);\n                    hide();\n                }\n            });\n\n            toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);\n            toggleButton.bind(\"click.spectrum\", function (e) {\n                e.stopPropagation();\n                e.preventDefault();\n\n                opts.showPaletteOnly = !opts.showPaletteOnly;\n\n                \/\/ To make sure the Picker area is drawn on the right, next to the\n                \/\/ Palette area (and not below the palette), first move the Palette\n                \/\/ to the left to make space for the picker, plus 5px extra.\n                \/\/ The 'applyOptions' function puts the whole container back into place\n                \/\/ and takes care of the button-text and the sp-palette-only CSS class.\n                if (!opts.showPaletteOnly && !flat) {\n                    container.css('left', '-=' + (pickerContainer.outerWidth(true) + 5));\n                }\n                applyOptions();\n            });\n\n            draggable(alphaSlider, function (dragX, dragY, e) {\n                currentAlpha = (dragX \/ alphaWidth);\n                isEmpty = false;\n                if (e.shiftKey) {\n                    currentAlpha = Math.round(currentAlpha * 10) \/ 10;\n                }\n\n                move();\n            }, dragStart, dragStop);\n\n            draggable(slider, function (dragX, dragY) {\n                currentHue = parseFloat(dragY \/ slideHeight);\n                isEmpty = false;\n                if (!opts.showAlpha) {\n                    currentAlpha = 1;\n                }\n                move();\n            }, dragStart, dragStop);\n\n            draggable(dragger, function (dragX, dragY, e) {\n\n                \/\/ shift+drag should snap the movement to either the x or y axis.\n                if (!e.shiftKey) {\n                    shiftMovementDirection = null;\n                }\n                else if (!shiftMovementDirection) {\n                    var oldDragX = currentSaturation * dragWidth;\n                    var oldDragY = dragHeight - (currentValue * dragHeight);\n                    var furtherFromX = Math.abs(dragX - oldDragX) > Math.abs(dragY - oldDragY);\n\n                    shiftMovementDirection = furtherFromX ? \"x\" : \"y\";\n                }\n\n                var setSaturation = !shiftMovementDirection || shiftMovementDirection === \"x\";\n                var setValue = !shiftMovementDirection || shiftMovementDirection === \"y\";\n\n                if (setSaturation) {\n                    currentSaturation = parseFloat(dragX \/ dragWidth);\n                }\n                if (setValue) {\n                    currentValue = parseFloat((dragHeight - dragY) \/ dragHeight);\n                }\n\n                isEmpty = false;\n                if (!opts.showAlpha) {\n                    currentAlpha = 1;\n                }\n\n                move();\n\n            }, dragStart, dragStop);\n\n            if (!!initialColor) {\n                set(initialColor);\n\n                \/\/ In case color was black - update the preview UI and set the format\n                \/\/ since the set function will not run (default color is black).\n                updateUI();\n                currentPreferredFormat = opts.preferredFormat || tinycolor(initialColor).format;\n\n                addColorToSelectionPalette(initialColor);\n            }\n            else {\n                updateUI();\n            }\n\n            if (flat) {\n                show();\n            }\n\n            function paletteElementClick(e) {\n                if (e.data && e.data.ignore) {\n                    set($(e.target).closest(\".sp-thumb-el\").data(\"color\"));\n                    move();\n                }\n                else {\n                    set($(e.target).closest(\".sp-thumb-el\").data(\"color\"));\n                    move();\n                    updateOriginalInput(true);\n                    if (opts.hideAfterPaletteSelect) {\n                        hide();\n                    }\n                }\n\n                return false;\n            }\n\n            var paletteEvent = IE ? \"mousedown.spectrum\" : \"click.spectrum touchstart.spectrum\";\n            paletteContainer.delegate(\".sp-thumb-el\", paletteEvent, paletteElementClick);\n            initialColorContainer.delegate(\".sp-thumb-el:nth-child(1)\", paletteEvent, { ignore: true }, paletteElementClick);\n        }\n\n        function updateSelectionPaletteFromStorage() {\n\n            if (localStorageKey && window.localStorage) {\n\n                \/\/ Migrate old palettes over to new format.  May want to remove this eventually.\n                try {\n                    var oldPalette = window.localStorage[localStorageKey].split(\",#\");\n                    if (oldPalette.length > 1) {\n                        delete window.localStorage[localStorageKey];\n                        $.each(oldPalette, function(i, c) {\n                            addColorToSelectionPalette(c);\n                        });\n                    }\n                }\n                catch(e) { }\n\n                try {\n                    selectionPalette = window.localStorage[localStorageKey].split(\";\");\n                }\n                catch (e) { }\n            }\n        }\n\n        function addColorToSelectionPalette(color) {\n            if (showSelectionPalette) {\n                var rgb = tinycolor(color).toRgbString();\n                if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) {\n                    selectionPalette.push(rgb);\n                    while(selectionPalette.length > maxSelectionSize) {\n                        selectionPalette.shift();\n                    }\n                }\n\n                if (localStorageKey && window.localStorage) {\n                    try {\n                        window.localStorage[localStorageKey] = selectionPalette.join(\";\");\n                    }\n                    catch(e) { }\n                }\n            }\n        }\n\n        function getUniqueSelectionPalette() {\n            var unique = [];\n            if (opts.showPalette) {\n                for (var i = 0; i < selectionPalette.length; i++) {\n                    var rgb = tinycolor(selectionPalette[i]).toRgbString();\n\n                    if (!paletteLookup[rgb]) {\n                        unique.push(selectionPalette[i]);\n                    }\n                }\n            }\n\n            return unique.reverse().slice(0, opts.maxSelectionSize);\n        }\n\n        function drawPalette() {\n\n            var currentColor = get();\n\n            var html = $.map(paletteArray, function (palette, i) {\n                return paletteTemplate(palette, currentColor, \"sp-palette-row sp-palette-row-\" + i, opts);\n            });\n\n            updateSelectionPaletteFromStorage();\n\n            if (selectionPalette) {\n                html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, \"sp-palette-row sp-palette-row-selection\", opts));\n            }\n\n            paletteContainer.html(html.join(\"\"));\n        }\n\n        function drawInitial() {\n            if (opts.showInitial) {\n                var initial = colorOnShow;\n                var current = get();\n                initialColorContainer.html(paletteTemplate([initial, current], current, \"sp-palette-row-initial\", opts));\n            }\n        }\n\n        function dragStart() {\n            if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) {\n                reflow();\n            }\n            isDragging = true;\n            container.addClass(draggingClass);\n            shiftMovementDirection = null;\n            boundElement.trigger('dragstart.spectrum', [ get() ]);\n        }\n\n        function dragStop() {\n            isDragging = false;\n            container.removeClass(draggingClass);\n            boundElement.trigger('dragstop.spectrum', [ get() ]);\n        }\n\n        function setFromTextInput() {\n\n            var value = textInput.val();\n\n            if ((value === null || value === \"\") && allowEmpty) {\n                set(null);\n                updateOriginalInput(true);\n            }\n            else {\n                var tiny = tinycolor(value);\n                if (tiny.isValid()) {\n                    set(tiny);\n                    updateOriginalInput(true);\n                }\n                else {\n                    textInput.addClass(\"sp-validation-error\");\n                }\n            }\n        }\n\n        function toggle() {\n            if (visible) {\n                hide();\n            }\n            else {\n                show();\n            }\n        }\n\n        function show() {\n            var event = $.Event('beforeShow.spectrum');\n\n            if (visible) {\n                reflow();\n                return;\n            }\n\n            boundElement.trigger(event, [ get() ]);\n\n            if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) {\n                return;\n            }\n\n            hideAll();\n            visible = true;\n\n            $(doc).bind(\"keydown.spectrum\", onkeydown);\n            $(doc).bind(\"click.spectrum\", clickout);\n            $(window).bind(\"resize.spectrum\", resize);\n            replacer.addClass(\"sp-active\");\n            container.removeClass(\"sp-hidden\");\n\n            reflow();\n            updateUI();\n\n            colorOnShow = get();\n\n            drawInitial();\n            callbacks.show(colorOnShow);\n            boundElement.trigger('show.spectrum', [ colorOnShow ]);\n        }\n\n        function onkeydown(e) {\n            \/\/ Close on ESC\n            if (e.keyCode === 27) {\n                hide();\n            }\n        }\n\n        function clickout(e) {\n            \/\/ Return on right click.\n            if (e.button == 2) { return; }\n\n            \/\/ If a drag event was happening during the mouseup, don't hide\n            \/\/ on click.\n            if (isDragging) { return; }\n\n            if (clickoutFiresChange) {\n                updateOriginalInput(true);\n            }\n            else {\n                revert();\n            }\n            hide();\n        }\n\n        function hide() {\n            \/\/ Return if hiding is unnecessary\n            if (!visible || flat) { return; }\n            visible = false;\n\n            $(doc).unbind(\"keydown.spectrum\", onkeydown);\n            $(doc).unbind(\"click.spectrum\", clickout);\n            $(window).unbind(\"resize.spectrum\", resize);\n\n            replacer.removeClass(\"sp-active\");\n            container.addClass(\"sp-hidden\");\n\n            callbacks.hide(get());\n            boundElement.trigger('hide.spectrum', [ get() ]);\n        }\n\n        function revert() {\n            set(colorOnShow, true);\n        }\n\n        function set(color, ignoreFormatChange) {\n            if (tinycolor.equals(color, get())) {\n                \/\/ Update UI just in case a validation error needs\n                \/\/ to be cleared.\n                updateUI();\n                return;\n            }\n\n            var newColor, newHsv;\n            if (!color && allowEmpty) {\n                isEmpty = true;\n            } else {\n                isEmpty = false;\n                newColor = tinycolor(color);\n                newHsv = newColor.toHsv();\n\n                currentHue = (newHsv.h % 360) \/ 360;\n                currentSaturation = newHsv.s;\n                currentValue = newHsv.v;\n                currentAlpha = newHsv.a;\n            }\n            updateUI();\n\n            if (newColor && newColor.isValid() && !ignoreFormatChange) {\n                currentPreferredFormat = opts.preferredFormat || newColor.getFormat();\n            }\n        }\n\n        function get(opts) {\n            opts = opts || { };\n\n            if (allowEmpty && isEmpty) {\n                return null;\n            }\n\n            return tinycolor.fromRatio({\n                h: currentHue,\n                s: currentSaturation,\n                v: currentValue,\n                a: Math.round(currentAlpha * 100) \/ 100\n            }, { format: opts.format || currentPreferredFormat });\n        }\n\n        function isValid() {\n            return !textInput.hasClass(\"sp-validation-error\");\n        }\n\n        function move() {\n            updateUI();\n\n            callbacks.move(get());\n            boundElement.trigger('move.spectrum', [ get() ]);\n        }\n\n        function updateUI() {\n\n            textInput.removeClass(\"sp-validation-error\");\n\n            updateHelperLocations();\n\n            \/\/ Update dragger background color (gradients take care of saturation and value).\n            var flatColor = tinycolor.fromRatio({ h: currentHue, s: 1, v: 1 });\n            dragger.css(\"background-color\", flatColor.toHexString());\n\n            \/\/ Get a format that alpha will be included in (hex and names ignore alpha)\n            var format = currentPreferredFormat;\n            if (currentAlpha < 1 && !(currentAlpha === 0 && format === \"name\")) {\n                if (format === \"hex\" || format === \"hex3\" || format === \"hex6\" || format === \"name\") {\n                    format = \"rgb\";\n                }\n            }\n\n            var realColor = get({ format: format }),\n              displayColor = '';\n\n            \/\/reset background info for preview element\n            previewElement.removeClass(\"sp-clear-display\");\n            previewElement.css('background-color', 'transparent');\n\n            if (!realColor && allowEmpty) {\n                \/\/ Update the replaced elements background with icon indicating no color selection\n                previewElement.addClass(\"sp-clear-display\");\n            }\n            else {\n                var realHex = realColor.toHexString(),\n                  realRgb = realColor.toRgbString();\n\n                \/\/ Update the replaced elements background color (with actual selected color)\n                if (rgbaSupport || realColor.alpha === 1) {\n                    previewElement.css(\"background-color\", realRgb);\n                }\n                else {\n                    previewElement.css(\"background-color\", \"transparent\");\n                    previewElement.css(\"filter\", realColor.toFilter());\n                }\n\n                if (opts.showAlpha) {\n                    var rgb = realColor.toRgb();\n                    rgb.a = 0;\n                    var realAlpha = tinycolor(rgb).toRgbString();\n                    var gradient = \"linear-gradient(left, \" + realAlpha + \", \" + realHex + \")\";\n\n                    if (IE) {\n                        alphaSliderInner.css(\"filter\", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex));\n                    }\n                    else {\n                        alphaSliderInner.css(\"background\", \"-webkit-\" + gradient);\n                        alphaSliderInner.css(\"background\", \"-moz-\" + gradient);\n                        alphaSliderInner.css(\"background\", \"-ms-\" + gradient);\n                        \/\/ Use current syntax gradient on unprefixed property.\n                        alphaSliderInner.css(\"background\",\n                          \"linear-gradient(to right, \" + realAlpha + \", \" + realHex + \")\");\n                    }\n                }\n\n                displayColor = realColor.toString(format);\n            }\n\n            \/\/ Update the text entry input as it changes happen\n            if (opts.showInput) {\n                textInput.val(displayColor);\n            }\n\n            if (opts.showPalette) {\n                drawPalette();\n            }\n\n            drawInitial();\n        }\n\n        function updateHelperLocations() {\n            var s = currentSaturation;\n            var v = currentValue;\n\n            if(allowEmpty && isEmpty) {\n                \/\/if selected color is empty, hide the helpers\n                alphaSlideHelper.hide();\n                slideHelper.hide();\n                dragHelper.hide();\n            }\n            else {\n                \/\/make sure helpers are visible\n                alphaSlideHelper.show();\n                slideHelper.show();\n                dragHelper.show();\n\n                \/\/ Where to show the little circle in that displays your current selected color\n                var dragX = s * dragWidth;\n                var dragY = dragHeight - (v * dragHeight);\n                dragX = Math.max(\n                  -dragHelperHeight,\n                  Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight)\n                );\n                dragY = Math.max(\n                  -dragHelperHeight,\n                  Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight)\n                );\n                dragHelper.css({\n                    \"top\": dragY + \"px\",\n                    \"left\": dragX + \"px\"\n                });\n\n                var alphaX = currentAlpha * alphaWidth;\n                alphaSlideHelper.css({\n                    \"left\": (alphaX - (alphaSlideHelperWidth \/ 2)) + \"px\"\n                });\n\n                \/\/ Where to show the bar that displays your current selected hue\n                var slideY = (currentHue) * slideHeight;\n                slideHelper.css({\n                    \"top\": (slideY - slideHelperHeight) + \"px\"\n                });\n            }\n        }\n\n        function updateOriginalInput(fireCallback) {\n            var color = get(),\n              displayColor = '',\n              hasChanged = !tinycolor.equals(color, colorOnShow);\n\n            if (color) {\n                displayColor = color.toString(currentPreferredFormat);\n                \/\/ Update the selection palette with the current color\n                addColorToSelectionPalette(color);\n            }\n\n            if (isInput) {\n                boundElement.val(displayColor);\n            }\n\n            if (fireCallback && hasChanged) {\n                callbacks.change(color);\n                boundElement.trigger('change', [ color ]);\n            }\n        }\n\n        function reflow() {\n            if (!visible) {\n                return; \/\/ Calculations would be useless and wouldn't be reliable anyways\n            }\n            dragWidth = dragger.width();\n            dragHeight = dragger.height();\n            dragHelperHeight = dragHelper.height();\n            slideWidth = slider.width();\n            slideHeight = slider.height();\n            slideHelperHeight = slideHelper.height();\n            alphaWidth = alphaSlider.width();\n            alphaSlideHelperWidth = alphaSlideHelper.width();\n\n            if (!flat) {\n                container.css(\"position\", \"absolute\");\n                if (opts.offset) {\n                    container.offset(opts.offset);\n                } else {\n                    container.offset(getOffset(container, offsetElement));\n                }\n            }\n\n            updateHelperLocations();\n\n            if (opts.showPalette) {\n                drawPalette();\n            }\n\n            boundElement.trigger('reflow.spectrum');\n        }\n\n        function destroy() {\n            boundElement.show();\n            offsetElement.unbind(\"click.spectrum touchstart.spectrum\");\n            container.remove();\n            replacer.remove();\n            spectrums[spect.id] = null;\n        }\n\n        function option(optionName, optionValue) {\n            if (optionName === undefined) {\n                return $.extend({}, opts);\n            }\n            if (optionValue === undefined) {\n                return opts[optionName];\n            }\n\n            opts[optionName] = optionValue;\n\n            if (optionName === \"preferredFormat\") {\n                currentPreferredFormat = opts.preferredFormat;\n            }\n            applyOptions();\n        }\n\n        function enable() {\n            disabled = false;\n            boundElement.attr(\"disabled\", false);\n            offsetElement.removeClass(\"sp-disabled\");\n        }\n\n        function disable() {\n            hide();\n            disabled = true;\n            boundElement.attr(\"disabled\", true);\n            offsetElement.addClass(\"sp-disabled\");\n        }\n\n        function setOffset(coord) {\n            opts.offset = coord;\n            reflow();\n        }\n\n        initialize();\n\n        var spect = {\n            show: show,\n            hide: hide,\n            toggle: toggle,\n            reflow: reflow,\n            option: option,\n            enable: enable,\n            disable: disable,\n            offset: setOffset,\n            set: function (c) {\n                set(c);\n                updateOriginalInput();\n            },\n            get: get,\n            destroy: destroy,\n            container: container\n        };\n\n        spect.id = spectrums.push(spect) - 1;\n\n        return spect;\n    }\n\n    \/**\n     * checkOffset - get the offset below\/above and left\/right element depending on screen position\n     * Thanks https:\/\/github.com\/jquery\/jquery-ui\/blob\/master\/ui\/jquery.ui.datepicker.js\n     *\/\n    function getOffset(picker, input) {\n        var extraY = 0;\n        var dpWidth = picker.outerWidth();\n        var dpHeight = picker.outerHeight();\n        var inputHeight = input.outerHeight();\n        var doc = picker[0].ownerDocument;\n        var docElem = doc.documentElement;\n        var viewWidth = docElem.clientWidth + $(doc).scrollLeft();\n        var viewHeight = docElem.clientHeight + $(doc).scrollTop();\n        var offset = input.offset();\n        offset.top += inputHeight;\n\n        offset.left -=\n          Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?\n            Math.abs(offset.left + dpWidth - viewWidth) : 0);\n\n        offset.top -=\n          Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?\n            Math.abs(dpHeight + inputHeight - extraY) : extraY));\n\n        return offset;\n    }\n\n    \/**\n     * noop - do nothing\n     *\/\n    function noop() {\n\n    }\n\n    \/**\n     * stopPropagation - makes the code only doing this a little easier to read in line\n     *\/\n    function stopPropagation(e) {\n        e.stopPropagation();\n    }\n\n    \/**\n     * Create a function bound to a given object\n     * Thanks to underscore.js\n     *\/\n    function bind(func, obj) {\n        var slice = Array.prototype.slice;\n        var args = slice.call(arguments, 2);\n        return function () {\n            return func.apply(obj, args.concat(slice.call(arguments)));\n        };\n    }\n\n    \/**\n     * Lightweight drag helper.  Handles containment within the element, so that\n     * when dragging, the x is within [0,element.width] and y is within [0,element.height]\n     *\/\n    function draggable(element, onmove, onstart, onstop) {\n        onmove = onmove || function () { };\n        onstart = onstart || function () { };\n        onstop = onstop || function () { };\n        var doc = document;\n        var dragging = false;\n        var offset = {};\n        var maxHeight = 0;\n        var maxWidth = 0;\n        var hasTouch = ('ontouchstart' in window);\n\n        var duringDragEvents = {};\n        duringDragEvents[\"selectstart\"] = prevent;\n        duringDragEvents[\"dragstart\"] = prevent;\n        duringDragEvents[\"touchmove mousemove\"] = move;\n        duringDragEvents[\"touchend mouseup\"] = stop;\n\n        function prevent(e) {\n            if (e.stopPropagation) {\n                e.stopPropagation();\n            }\n            if (e.preventDefault) {\n                e.preventDefault();\n            }\n            e.returnValue = false;\n        }\n\n        function move(e) {\n            if (dragging) {\n                \/\/ Mouseup happened outside of window\n                if (IE && doc.documentMode < 9 && !e.button) {\n                    return stop();\n                }\n\n                var t0 = e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[0];\n                var pageX = t0 && t0.pageX || e.pageX;\n                var pageY = t0 && t0.pageY || e.pageY;\n\n                var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));\n                var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));\n\n                if (hasTouch) {\n                    \/\/ Stop scrolling in iOS\n                    prevent(e);\n                }\n\n                onmove.apply(element, [dragX, dragY, e]);\n            }\n        }\n\n        function start(e) {\n            var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);\n\n            if (!rightclick && !dragging) {\n                if (onstart.apply(element, arguments) !== false) {\n                    dragging = true;\n                    maxHeight = $(element).height();\n                    maxWidth = $(element).width();\n                    offset = $(element).offset();\n\n                    $(doc).bind(duringDragEvents);\n                    $(doc.body).addClass(\"sp-dragging\");\n\n                    move(e);\n\n                    prevent(e);\n                }\n            }\n        }\n\n        function stop() {\n            if (dragging) {\n                $(doc).unbind(duringDragEvents);\n                $(doc.body).removeClass(\"sp-dragging\");\n\n                \/\/ Wait a tick before notifying observers to allow the click event\n                \/\/ to fire in Chrome.\n                setTimeout(function() {\n                    onstop.apply(element, arguments);\n                }, 0);\n            }\n            dragging = false;\n        }\n\n        $(element).bind(\"touchstart mousedown\", start);\n    }\n\n    function throttle(func, wait, debounce) {\n        var timeout;\n        return function () {\n            var context = this, args = arguments;\n            var throttler = function () {\n                timeout = null;\n                func.apply(context, args);\n            };\n            if (debounce) clearTimeout(timeout);\n            if (debounce || !timeout) timeout = setTimeout(throttler, wait);\n        };\n    }\n\n    function inputTypeColorSupport() {\n        return $.fn.spectrum.inputTypeColorSupport();\n    }\n\n    \/**\n     * Define a jQuery plugin\n     *\/\n    var dataID = \"spectrum.id\";\n    $.fn.spectrum = function (opts, extra) {\n\n        if (typeof opts == \"string\") {\n\n            var returnValue = this;\n            var args = Array.prototype.slice.call( arguments, 1 );\n\n            this.each(function () {\n                var spect = spectrums[$(this).data(dataID)];\n                if (spect) {\n                    var method = spect[opts];\n                    if (!method) {\n                        throw new Error( \"Spectrum: no such method: '\" + opts + \"'\" );\n                    }\n\n                    if (opts == \"get\") {\n                        returnValue = spect.get();\n                    }\n                    else if (opts == \"container\") {\n                        returnValue = spect.container;\n                    }\n                    else if (opts == \"option\") {\n                        returnValue = spect.option.apply(spect, args);\n                    }\n                    else if (opts == \"destroy\") {\n                        spect.destroy();\n                        $(this).removeData(dataID);\n                    }\n                    else {\n                        method.apply(spect, args);\n                    }\n                }\n            });\n\n            return returnValue;\n        }\n\n        \/\/ Initializing a new instance of spectrum\n        return this.spectrum(\"destroy\").each(function () {\n            var options = $.extend({}, opts, $(this).data());\n            var spect = spectrum(this, options);\n            $(this).data(dataID, spect.id);\n        });\n    };\n\n    $.fn.spectrum.load = true;\n    $.fn.spectrum.loadOpts = {};\n    $.fn.spectrum.draggable = draggable;\n    $.fn.spectrum.defaults = defaultOpts;\n    $.fn.spectrum.inputTypeColorSupport = function inputTypeColorSupport() {\n        if (typeof inputTypeColorSupport._cachedResult === \"undefined\") {\n            var colorInput = $(\"<input type='color'\/>\")[0]; \/\/ if color element is supported, value will default to not null\n            inputTypeColorSupport._cachedResult = colorInput.type === \"color\" && colorInput.value !== \"\";\n        }\n        return inputTypeColorSupport._cachedResult;\n    };\n\n    $.spectrum = { };\n    $.spectrum.localization = { };\n    $.spectrum.palettes = { };\n\n    $.fn.spectrum.processNativeColorInputs = function () {\n        var colorInputs = $(\"input[type=color]\");\n        if (colorInputs.length && !inputTypeColorSupport()) {\n            colorInputs.spectrum({\n                preferredFormat: \"hex6\"\n            });\n        }\n    };\n\n    \/\/ TinyColor v1.1.2\n    \/\/ https:\/\/github.com\/bgrins\/TinyColor\n    \/\/ Brian Grinstead, MIT License\n\n    (function() {\n\n        var trimLeft = \/^[\\s,#]+\/,\n          trimRight = \/\\s+$\/,\n          tinyCounter = 0,\n          math = Math,\n          mathRound = math.round,\n          mathMin = math.min,\n          mathMax = math.max,\n          mathRandom = math.random;\n\n        var tinycolor = function(color, opts) {\n\n            color = (color) ? color : '';\n            opts = opts || { };\n\n            \/\/ If input is already a tinycolor, return itself\n            if (color instanceof tinycolor) {\n                return color;\n            }\n            \/\/ If we are called as a function, call using new instead\n            if (!(this instanceof tinycolor)) {\n                return new tinycolor(color, opts);\n            }\n\n            var rgb = inputToRGB(color);\n            this._originalInput = color,\n              this._r = rgb.r,\n              this._g = rgb.g,\n              this._b = rgb.b,\n              this._a = rgb.a,\n              this._roundA = mathRound(100*this._a) \/ 100,\n              this._format = opts.format || rgb.format;\n            this._gradientType = opts.gradientType;\n\n            \/\/ Don't let the range of [0,255] come back in [0,1].\n            \/\/ Potentially lose a little bit of precision here, but will fix issues where\n            \/\/ .5 gets interpreted as half of the total, instead of half of 1\n            \/\/ If it was supposed to be 128, this was already taken care of by `inputToRgb`\n            if (this._r < 1) { this._r = mathRound(this._r); }\n            if (this._g < 1) { this._g = mathRound(this._g); }\n            if (this._b < 1) { this._b = mathRound(this._b); }\n\n            this._ok = rgb.ok;\n            this._tc_id = tinyCounter++;\n        };\n\n        tinycolor.prototype = {\n            isDark: function() {\n                return this.getBrightness() < 128;\n            },\n            isLight: function() {\n                return !this.isDark();\n            },\n            isValid: function() {\n                return this._ok;\n            },\n            getOriginalInput: function() {\n                return this._originalInput;\n            },\n            getFormat: function() {\n                return this._format;\n            },\n            getAlpha: function() {\n                return this._a;\n            },\n            getBrightness: function() {\n                var rgb = this.toRgb();\n                return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) \/ 1000;\n            },\n            setAlpha: function(value) {\n                this._a = boundAlpha(value);\n                this._roundA = mathRound(100*this._a) \/ 100;\n                return this;\n            },\n            toHsv: function() {\n                var hsv = rgbToHsv(this._r, this._g, this._b);\n                return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n            },\n            toHsvString: function() {\n                var hsv = rgbToHsv(this._r, this._g, this._b);\n                var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);\n                return (this._a == 1) ?\n                \"hsv(\"  + h + \", \" + s + \"%, \" + v + \"%)\" :\n                \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \"+ this._roundA + \")\";\n            },\n            toHsl: function() {\n                var hsl = rgbToHsl(this._r, this._g, this._b);\n                return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n            },\n            toHslString: function() {\n                var hsl = rgbToHsl(this._r, this._g, this._b);\n                var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);\n                return (this._a == 1) ?\n                \"hsl(\"  + h + \", \" + s + \"%, \" + l + \"%)\" :\n                \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \"+ this._roundA + \")\";\n            },\n            toHex: function(allow3Char) {\n                return rgbToHex(this._r, this._g, this._b, allow3Char);\n            },\n            toHexString: function(allow3Char) {\n                return '#' + this.toHex(allow3Char);\n            },\n            toHex8: function() {\n                return rgbaToHex(this._r, this._g, this._b, this._a);\n            },\n            toHex8String: function() {\n                return '#' + this.toHex8();\n            },\n            toRgb: function() {\n                return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n            },\n            toRgbString: function() {\n                return (this._a == 1) ?\n                \"rgb(\"  + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \")\" :\n                \"rgba(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \", \" + this._roundA + \")\";\n            },\n            toPercentageRgb: function() {\n                return { r: mathRound(bound01(this._r, 255) * 100) + \"%\", g: mathRound(bound01(this._g, 255) * 100) + \"%\", b: mathRound(bound01(this._b, 255) * 100) + \"%\", a: this._a };\n            },\n            toPercentageRgbString: function() {\n                return (this._a == 1) ?\n                \"rgb(\"  + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%)\" :\n                \"rgba(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n            },\n            toName: function() {\n                if (this._a === 0) {\n                    return \"transparent\";\n                }\n\n                if (this._a < 1) {\n                    return false;\n                }\n\n                return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n            },\n            toFilter: function(secondColor) {\n                var hex8String = '#' + rgbaToHex(this._r, this._g, this._b, this._a);\n                var secondHex8String = hex8String;\n                var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n\n                if (secondColor) {\n                    var s = tinycolor(secondColor);\n                    secondHex8String = s.toHex8String();\n                }\n\n                return \"progid:DXImageTransform.Microsoft.gradient(\"+gradientType+\"startColorstr=\"+hex8String+\",endColorstr=\"+secondHex8String+\")\";\n            },\n            toString: function(format) {\n                var formatSet = !!format;\n                format = format || this._format;\n\n                var formattedString = false;\n                var hasAlpha = this._a < 1 && this._a >= 0;\n                var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"name\");\n\n                if (needsAlphaFormat) {\n                    \/\/ Special case for \"transparent\", all other non-alpha formats\n                    \/\/ will return rgba when there is transparency.\n                    if (format === \"name\" && this._a === 0) {\n                        return this.toName();\n                    }\n                    return this.toRgbString();\n                }\n                if (format === \"rgb\") {\n                    formattedString = this.toRgbString();\n                }\n                if (format === \"prgb\") {\n                    formattedString = this.toPercentageRgbString();\n                }\n                if (format === \"hex\" || format === \"hex6\") {\n                    formattedString = this.toHexString();\n                }\n                if (format === \"hex3\") {\n                    formattedString = this.toHexString(true);\n                }\n                if (format === \"hex8\") {\n                    formattedString = this.toHex8String();\n                }\n                if (format === \"name\") {\n                    formattedString = this.toName();\n                }\n                if (format === \"hsl\") {\n                    formattedString = this.toHslString();\n                }\n                if (format === \"hsv\") {\n                    formattedString = this.toHsvString();\n                }\n\n                return formattedString || this.toHexString();\n            },\n\n            _applyModification: function(fn, args) {\n                var color = fn.apply(null, [this].concat([].slice.call(args)));\n                this._r = color._r;\n                this._g = color._g;\n                this._b = color._b;\n                this.setAlpha(color._a);\n                return this;\n            },\n            lighten: function() {\n                return this._applyModification(lighten, arguments);\n            },\n            brighten: function() {\n                return this._applyModification(brighten, arguments);\n            },\n            darken: function() {\n                return this._applyModification(darken, arguments);\n            },\n            desaturate: function() {\n                return this._applyModification(desaturate, arguments);\n            },\n            saturate: function() {\n                return this._applyModification(saturate, arguments);\n            },\n            greyscale: function() {\n                return this._applyModification(greyscale, arguments);\n            },\n            spin: function() {\n                return this._applyModification(spin, arguments);\n            },\n\n            _applyCombination: function(fn, args) {\n                return fn.apply(null, [this].concat([].slice.call(args)));\n            },\n            analogous: function() {\n                return this._applyCombination(analogous, arguments);\n            },\n            complement: function() {\n                return this._applyCombination(complement, arguments);\n            },\n            monochromatic: function() {\n                return this._applyCombination(monochromatic, arguments);\n            },\n            splitcomplement: function() {\n                return this._applyCombination(splitcomplement, arguments);\n            },\n            triad: function() {\n                return this._applyCombination(triad, arguments);\n            },\n            tetrad: function() {\n                return this._applyCombination(tetrad, arguments);\n            }\n        };\n\n        \/\/ If input is an object, force 1 into \"1.0\" to handle ratios properly\n        \/\/ String input requires \"1.0\" as input, so 1 will be treated as 1\n        tinycolor.fromRatio = function(color, opts) {\n            if (typeof color == \"object\") {\n                var newColor = {};\n                for (var i in color) {\n                    if (color.hasOwnProperty(i)) {\n                        if (i === \"a\") {\n                            newColor[i] = color[i];\n                        }\n                        else {\n                            newColor[i] = convertToPercentage(color[i]);\n                        }\n                    }\n                }\n                color = newColor;\n            }\n\n            return tinycolor(color, opts);\n        };\n\n        \/\/ Given a string or object, convert that input to RGB\n        \/\/ Possible string inputs:\n        \/\/\n        \/\/     \"red\"\n        \/\/     \"#f00\" or \"f00\"\n        \/\/     \"#ff0000\" or \"ff0000\"\n        \/\/     \"#ff000000\" or \"ff000000\"\n        \/\/     \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n        \/\/     \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n        \/\/     \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n        \/\/     \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n        \/\/     \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n        \/\/     \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n        \/\/     \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n        \/\/\n        function inputToRGB(color) {\n\n            var rgb = { r: 0, g: 0, b: 0 };\n            var a = 1;\n            var ok = false;\n            var format = false;\n\n            if (typeof color == \"string\") {\n                color = stringInputToObject(color);\n            }\n\n            if (typeof color == \"object\") {\n                if (color.hasOwnProperty(\"r\") && color.hasOwnProperty(\"g\") && color.hasOwnProperty(\"b\")) {\n                    rgb = rgbToRgb(color.r, color.g, color.b);\n                    ok = true;\n                    format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n                }\n                else if (color.hasOwnProperty(\"h\") && color.hasOwnProperty(\"s\") && color.hasOwnProperty(\"v\")) {\n                    color.s = convertToPercentage(color.s);\n                    color.v = convertToPercentage(color.v);\n                    rgb = hsvToRgb(color.h, color.s, color.v);\n                    ok = true;\n                    format = \"hsv\";\n                }\n                else if (color.hasOwnProperty(\"h\") && color.hasOwnProperty(\"s\") && color.hasOwnProperty(\"l\")) {\n                    color.s = convertToPercentage(color.s);\n                    color.l = convertToPercentage(color.l);\n                    rgb = hslToRgb(color.h, color.s, color.l);\n                    ok = true;\n                    format = \"hsl\";\n                }\n\n                if (color.hasOwnProperty(\"a\")) {\n                    a = color.a;\n                }\n            }\n\n            a = boundAlpha(a);\n\n            return {\n                ok: ok,\n                format: color.format || format,\n                r: mathMin(255, mathMax(rgb.r, 0)),\n                g: mathMin(255, mathMax(rgb.g, 0)),\n                b: mathMin(255, mathMax(rgb.b, 0)),\n                a: a\n            };\n        }\n\n\n        \/\/ Conversion Functions\n        \/\/ --------------------\n\n        \/\/ `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n        \/\/ <http:\/\/mjijackson.com\/2008\/02\/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n        \/\/ `rgbToRgb`\n        \/\/ Handle bounds \/ percentage checking to conform to CSS color spec\n        \/\/ <http:\/\/www.w3.org\/TR\/css3-color\/>\n        \/\/ *Assumes:* r, g, b in [0, 255] or [0, 1]\n        \/\/ *Returns:* { r, g, b } in [0, 255]\n        function rgbToRgb(r, g, b){\n            return {\n                r: bound01(r, 255) * 255,\n                g: bound01(g, 255) * 255,\n                b: bound01(b, 255) * 255\n            };\n        }\n\n        \/\/ `rgbToHsl`\n        \/\/ Converts an RGB color value to HSL.\n        \/\/ *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n        \/\/ *Returns:* { h, s, l } in [0,1]\n        function rgbToHsl(r, g, b) {\n\n            r = bound01(r, 255);\n            g = bound01(g, 255);\n            b = bound01(b, 255);\n\n            var max = mathMax(r, g, b), min = mathMin(r, g, b);\n            var h, s, l = (max + min) \/ 2;\n\n            if(max == min) {\n                h = s = 0; \/\/ achromatic\n            }\n            else {\n                var d = max - min;\n                s = l > 0.5 ? d \/ (2 - max - min) : d \/ (max + min);\n                switch(max) {\n                    case r: h = (g - b) \/ d + (g < b ? 6 : 0); break;\n                    case g: h = (b - r) \/ d + 2; break;\n                    case b: h = (r - g) \/ d + 4; break;\n                }\n\n                h \/= 6;\n            }\n\n            return { h: h, s: s, l: l };\n        }\n\n        \/\/ `hslToRgb`\n        \/\/ Converts an HSL color value to RGB.\n        \/\/ *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n        \/\/ *Returns:* { r, g, b } in the set [0, 255]\n        function hslToRgb(h, s, l) {\n            var r, g, b;\n\n            h = bound01(h, 360);\n            s = bound01(s, 100);\n            l = bound01(l, 100);\n\n            function hue2rgb(p, q, t) {\n                if(t < 0) t += 1;\n                if(t > 1) t -= 1;\n                if(t < 1\/6) return p + (q - p) * 6 * t;\n                if(t < 1\/2) return q;\n                if(t < 2\/3) return p + (q - p) * (2\/3 - t) * 6;\n                return p;\n            }\n\n            if(s === 0) {\n                r = g = b = l; \/\/ achromatic\n            }\n            else {\n                var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n                var p = 2 * l - q;\n                r = hue2rgb(p, q, h + 1\/3);\n                g = hue2rgb(p, q, h);\n                b = hue2rgb(p, q, h - 1\/3);\n            }\n\n            return { r: r * 255, g: g * 255, b: b * 255 };\n        }\n\n        \/\/ `rgbToHsv`\n        \/\/ Converts an RGB color value to HSV\n        \/\/ *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n        \/\/ *Returns:* { h, s, v } in [0,1]\n        function rgbToHsv(r, g, b) {\n\n            r = bound01(r, 255);\n            g = bound01(g, 255);\n            b = bound01(b, 255);\n\n            var max = mathMax(r, g, b), min = mathMin(r, g, b);\n            var h, s, v = max;\n\n            var d = max - min;\n            s = max === 0 ? 0 : d \/ max;\n\n            if(max == min) {\n                h = 0; \/\/ achromatic\n            }\n            else {\n                switch(max) {\n                    case r: h = (g - b) \/ d + (g < b ? 6 : 0); break;\n                    case g: h = (b - r) \/ d + 2; break;\n                    case b: h = (r - g) \/ d + 4; break;\n                }\n                h \/= 6;\n            }\n            return { h: h, s: s, v: v };\n        }\n\n        \/\/ `hsvToRgb`\n        \/\/ Converts an HSV color value to RGB.\n        \/\/ *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n        \/\/ *Returns:* { r, g, b } in the set [0, 255]\n        function hsvToRgb(h, s, v) {\n\n            h = bound01(h, 360) * 6;\n            s = bound01(s, 100);\n            v = bound01(v, 100);\n\n            var i = math.floor(h),\n              f = h - i,\n              p = v * (1 - s),\n              q = v * (1 - f * s),\n              t = v * (1 - (1 - f) * s),\n              mod = i % 6,\n              r = [v, q, p, p, t, v][mod],\n              g = [t, v, v, q, p, p][mod],\n              b = [p, p, t, v, v, q][mod];\n\n            return { r: r * 255, g: g * 255, b: b * 255 };\n        }\n\n        \/\/ `rgbToHex`\n        \/\/ Converts an RGB color to hex\n        \/\/ Assumes r, g, and b are contained in the set [0, 255]\n        \/\/ Returns a 3 or 6 character hex\n        function rgbToHex(r, g, b, allow3Char) {\n\n            var hex = [\n                pad2(mathRound(r).toString(16)),\n                pad2(mathRound(g).toString(16)),\n                pad2(mathRound(b).toString(16))\n            ];\n\n            \/\/ Return a 3 character hex if possible\n            if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n                return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n            }\n\n            return hex.join(\"\");\n        }\n        \/\/ `rgbaToHex`\n        \/\/ Converts an RGBA color plus alpha transparency to hex\n        \/\/ Assumes r, g, b and a are contained in the set [0, 255]\n        \/\/ Returns an 8 character hex\n        function rgbaToHex(r, g, b, a) {\n\n            var hex = [\n                pad2(convertDecimalToHex(a)),\n                pad2(mathRound(r).toString(16)),\n                pad2(mathRound(g).toString(16)),\n                pad2(mathRound(b).toString(16))\n            ];\n\n            return hex.join(\"\");\n        }\n\n        \/\/ `equals`\n        \/\/ Can be called with any tinycolor input\n        tinycolor.equals = function (color1, color2) {\n            if (!color1 || !color2) { return false; }\n            return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n        };\n        tinycolor.random = function() {\n            return tinycolor.fromRatio({\n                r: mathRandom(),\n                g: mathRandom(),\n                b: mathRandom()\n            });\n        };\n\n\n        \/\/ Modification Functions\n        \/\/ ----------------------\n        \/\/ Thanks to less.js for some of the basics here\n        \/\/ <https:\/\/github.com\/cloudhead\/less.js\/blob\/master\/lib\/less\/functions.js>\n\n        function desaturate(color, amount) {\n            amount = (amount === 0) ? 0 : (amount || 10);\n            var hsl = tinycolor(color).toHsl();\n            hsl.s -= amount \/ 100;\n            hsl.s = clamp01(hsl.s);\n            return tinycolor(hsl);\n        }\n\n        function saturate(color, amount) {\n            amount = (amount === 0) ? 0 : (amount || 10);\n            var hsl = tinycolor(color).toHsl();\n            hsl.s += amount \/ 100;\n            hsl.s = clamp01(hsl.s);\n            return tinycolor(hsl);\n        }\n\n        function greyscale(color) {\n            return tinycolor(color).desaturate(100);\n        }\n\n        function lighten (color, amount) {\n            amount = (amount === 0) ? 0 : (amount || 10);\n            var hsl = tinycolor(color).toHsl();\n            hsl.l += amount \/ 100;\n            hsl.l = clamp01(hsl.l);\n            return tinycolor(hsl);\n        }\n\n        function brighten(color, amount) {\n            amount = (amount === 0) ? 0 : (amount || 10);\n            var rgb = tinycolor(color).toRgb();\n            rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount \/ 100))));\n            rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount \/ 100))));\n            rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount \/ 100))));\n            return tinycolor(rgb);\n        }\n\n        function darken (color, amount) {\n            amount = (amount === 0) ? 0 : (amount || 10);\n            var hsl = tinycolor(color).toHsl();\n            hsl.l -= amount \/ 100;\n            hsl.l = clamp01(hsl.l);\n            return tinycolor(hsl);\n        }\n\n        \/\/ Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n        \/\/ Values outside of this range will be wrapped into this range.\n        function spin(color, amount) {\n            var hsl = tinycolor(color).toHsl();\n            var hue = (mathRound(hsl.h) + amount) % 360;\n            hsl.h = hue < 0 ? 360 + hue : hue;\n            return tinycolor(hsl);\n        }\n\n        \/\/ Combination Functions\n        \/\/ ---------------------\n        \/\/ Thanks to jQuery xColor for some of the ideas behind these\n        \/\/ <https:\/\/github.com\/infusion\/jQuery-xcolor\/blob\/master\/jquery.xcolor.js>\n\n        function complement(color) {\n            var hsl = tinycolor(color).toHsl();\n            hsl.h = (hsl.h + 180) % 360;\n            return tinycolor(hsl);\n        }\n\n        function triad(color) {\n            var hsl = tinycolor(color).toHsl();\n            var h = hsl.h;\n            return [\n                tinycolor(color),\n                tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),\n                tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })\n            ];\n        }\n\n        function tetrad(color) {\n            var hsl = tinycolor(color).toHsl();\n            var h = hsl.h;\n            return [\n                tinycolor(color),\n                tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),\n                tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),\n                tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })\n            ];\n        }\n\n        function splitcomplement(color) {\n            var hsl = tinycolor(color).toHsl();\n            var h = hsl.h;\n            return [\n                tinycolor(color),\n                tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),\n                tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})\n            ];\n        }\n\n        function analogous(color, results, slices) {\n            results = results || 6;\n            slices = slices || 30;\n\n            var hsl = tinycolor(color).toHsl();\n            var part = 360 \/ slices;\n            var ret = [tinycolor(color)];\n\n            for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {\n                hsl.h = (hsl.h + part) % 360;\n                ret.push(tinycolor(hsl));\n            }\n            return ret;\n        }\n\n        function monochromatic(color, results) {\n            results = results || 6;\n            var hsv = tinycolor(color).toHsv();\n            var h = hsv.h, s = hsv.s, v = hsv.v;\n            var ret = [];\n            var modification = 1 \/ results;\n\n            while (results--) {\n                ret.push(tinycolor({ h: h, s: s, v: v}));\n                v = (v + modification) % 1;\n            }\n\n            return ret;\n        }\n\n        \/\/ Utility Functions\n        \/\/ ---------------------\n\n        tinycolor.mix = function(color1, color2, amount) {\n            amount = (amount === 0) ? 0 : (amount || 50);\n\n            var rgb1 = tinycolor(color1).toRgb();\n            var rgb2 = tinycolor(color2).toRgb();\n\n            var p = amount \/ 100;\n            var w = p * 2 - 1;\n            var a = rgb2.a - rgb1.a;\n\n            var w1;\n\n            if (w * a == -1) {\n                w1 = w;\n            } else {\n                w1 = (w + a) \/ (1 + w * a);\n            }\n\n            w1 = (w1 + 1) \/ 2;\n\n            var w2 = 1 - w1;\n\n            var rgba = {\n                r: rgb2.r * w1 + rgb1.r * w2,\n                g: rgb2.g * w1 + rgb1.g * w2,\n                b: rgb2.b * w1 + rgb1.b * w2,\n                a: rgb2.a * p  + rgb1.a * (1 - p)\n            };\n\n            return tinycolor(rgba);\n        };\n\n\n        \/\/ Readability Functions\n        \/\/ ---------------------\n        \/\/ <http:\/\/www.w3.org\/TR\/AERT#color-contrast>\n\n        \/\/ `readability`\n        \/\/ Analyze the 2 colors and returns an object with the following properties:\n        \/\/    `brightness`: difference in brightness between the two colors\n        \/\/    `color`: difference in color\/hue between the two colors\n        tinycolor.readability = function(color1, color2) {\n            var c1 = tinycolor(color1);\n            var c2 = tinycolor(color2);\n            var rgb1 = c1.toRgb();\n            var rgb2 = c2.toRgb();\n            var brightnessA = c1.getBrightness();\n            var brightnessB = c2.getBrightness();\n            var colorDiff = (\n              Math.max(rgb1.r, rgb2.r) - Math.min(rgb1.r, rgb2.r) +\n              Math.max(rgb1.g, rgb2.g) - Math.min(rgb1.g, rgb2.g) +\n              Math.max(rgb1.b, rgb2.b) - Math.min(rgb1.b, rgb2.b)\n            );\n\n            return {\n                brightness: Math.abs(brightnessA - brightnessB),\n                color: colorDiff\n            };\n        };\n\n        \/\/ `readable`\n        \/\/ http:\/\/www.w3.org\/TR\/AERT#color-contrast\n        \/\/ Ensure that foreground and background color combinations provide sufficient contrast.\n        \/\/ *Example*\n        \/\/    tinycolor.isReadable(\"#000\", \"#111\") => false\n        tinycolor.isReadable = function(color1, color2) {\n            var readability = tinycolor.readability(color1, color2);\n            return readability.brightness > 125 && readability.color > 500;\n        };\n\n        \/\/ `mostReadable`\n        \/\/ Given a base color and a list of possible foreground or background\n        \/\/ colors for that base, returns the most readable color.\n        \/\/ *Example*\n        \/\/    tinycolor.mostReadable(\"#123\", [\"#fff\", \"#000\"]) => \"#000\"\n        tinycolor.mostReadable = function(baseColor, colorList) {\n            var bestColor = null;\n            var bestScore = 0;\n            var bestIsReadable = false;\n            for (var i=0; i < colorList.length; i++) {\n\n                \/\/ We normalize both around the \"acceptable\" breaking point,\n                \/\/ but rank brightness constrast higher than hue.\n\n                var readability = tinycolor.readability(baseColor, colorList[i]);\n                var readable = readability.brightness > 125 && readability.color > 500;\n                var score = 3 * (readability.brightness \/ 125) + (readability.color \/ 500);\n\n                if ((readable && ! bestIsReadable) ||\n                  (readable && bestIsReadable && score > bestScore) ||\n                  ((! readable) && (! bestIsReadable) && score > bestScore)) {\n                    bestIsReadable = readable;\n                    bestScore = score;\n                    bestColor = tinycolor(colorList[i]);\n                }\n            }\n            return bestColor;\n        };\n\n\n        \/\/ Big List of Colors\n        \/\/ ------------------\n        \/\/ <http:\/\/www.w3.org\/TR\/css3-color\/#svg-color>\n        var names = tinycolor.names = {\n            aliceblue: \"f0f8ff\",\n            antiquewhite: \"faebd7\",\n            aqua: \"0ff\",\n            aquamarine: \"7fffd4\",\n            azure: \"f0ffff\",\n            beige: \"f5f5dc\",\n            bisque: \"ffe4c4\",\n            black: \"000\",\n            blanchedalmond: \"ffebcd\",\n            blue: \"00f\",\n            blueviolet: \"8a2be2\",\n            brown: \"a52a2a\",\n            burlywood: \"deb887\",\n            burntsienna: \"ea7e5d\",\n            cadetblue: \"5f9ea0\",\n            chartreuse: \"7fff00\",\n            chocolate: \"d2691e\",\n            coral: \"ff7f50\",\n            cornflowerblue: \"6495ed\",\n            cornsilk: \"fff8dc\",\n            crimson: \"dc143c\",\n            cyan: \"0ff\",\n            darkblue: \"00008b\",\n            darkcyan: \"008b8b\",\n            darkgoldenrod: \"b8860b\",\n            darkgray: \"a9a9a9\",\n            darkgreen: \"006400\",\n            darkgrey: \"a9a9a9\",\n            darkkhaki: \"bdb76b\",\n            darkmagenta: \"8b008b\",\n            darkolivegreen: \"556b2f\",\n            darkorange: \"ff8c00\",\n            darkorchid: \"9932cc\",\n            darkred: \"8b0000\",\n            darksalmon: \"e9967a\",\n            darkseagreen: \"8fbc8f\",\n            darkslateblue: \"483d8b\",\n            darkslategray: \"2f4f4f\",\n            darkslategrey: \"2f4f4f\",\n            darkturquoise: \"00ced1\",\n            darkviolet: \"9400d3\",\n            deeppink: \"ff1493\",\n            deepskyblue: \"00bfff\",\n            dimgray: \"696969\",\n            dimgrey: \"696969\",\n            dodgerblue: \"1e90ff\",\n            firebrick: \"b22222\",\n            floralwhite: \"fffaf0\",\n            forestgreen: \"228b22\",\n            fuchsia: \"f0f\",\n            gainsboro: \"dcdcdc\",\n            ghostwhite: \"f8f8ff\",\n            gold: \"ffd700\",\n            goldenrod: \"daa520\",\n            gray: \"808080\",\n            green: \"008000\",\n            greenyellow: \"adff2f\",\n            grey: \"808080\",\n            honeydew: \"f0fff0\",\n            hotpink: \"ff69b4\",\n            indianred: \"cd5c5c\",\n            indigo: \"4b0082\",\n            ivory: \"fffff0\",\n            khaki: \"f0e68c\",\n            lavender: \"e6e6fa\",\n            lavenderblush: \"fff0f5\",\n            lawngreen: \"7cfc00\",\n            lemonchiffon: \"fffacd\",\n            lightblue: \"add8e6\",\n            lightcoral: \"f08080\",\n            lightcyan: \"e0ffff\",\n            lightgoldenrodyellow: \"fafad2\",\n            lightgray: \"d3d3d3\",\n            lightgreen: \"90ee90\",\n            lightgrey: \"d3d3d3\",\n            lightpink: \"ffb6c1\",\n            lightsalmon: \"ffa07a\",\n            lightseagreen: \"20b2aa\",\n            lightskyblue: \"87cefa\",\n            lightslategray: \"789\",\n            lightslategrey: \"789\",\n            lightsteelblue: \"b0c4de\",\n            lightyellow: \"ffffe0\",\n            lime: \"0f0\",\n            limegreen: \"32cd32\",\n            linen: \"faf0e6\",\n            magenta: \"f0f\",\n            maroon: \"800000\",\n            mediumaquamarine: \"66cdaa\",\n            mediumblue: \"0000cd\",\n            mediumorchid: \"ba55d3\",\n            mediumpurple: \"9370db\",\n            mediumseagreen: \"3cb371\",\n            mediumslateblue: \"7b68ee\",\n            mediumspringgreen: \"00fa9a\",\n            mediumturquoise: \"48d1cc\",\n            mediumvioletred: \"c71585\",\n            midnightblue: \"191970\",\n            mintcream: \"f5fffa\",\n            mistyrose: \"ffe4e1\",\n            moccasin: \"ffe4b5\",\n            navajowhite: \"ffdead\",\n            navy: \"000080\",\n            oldlace: \"fdf5e6\",\n            olive: \"808000\",\n            olivedrab: \"6b8e23\",\n            orange: \"ffa500\",\n            orangered: \"ff4500\",\n            orchid: \"da70d6\",\n            palegoldenrod: \"eee8aa\",\n            palegreen: \"98fb98\",\n            paleturquoise: \"afeeee\",\n            palevioletred: \"db7093\",\n            papayawhip: \"ffefd5\",\n            peachpuff: \"ffdab9\",\n            peru: \"cd853f\",\n            pink: \"ffc0cb\",\n            plum: \"dda0dd\",\n            powderblue: \"b0e0e6\",\n            purple: \"800080\",\n            rebeccapurple: \"663399\",\n            red: \"f00\",\n            rosybrown: \"bc8f8f\",\n            royalblue: \"4169e1\",\n            saddlebrown: \"8b4513\",\n            salmon: \"fa8072\",\n            sandybrown: \"f4a460\",\n            seagreen: \"2e8b57\",\n            seashell: \"fff5ee\",\n            sienna: \"a0522d\",\n            silver: \"c0c0c0\",\n            skyblue: \"87ceeb\",\n            slateblue: \"6a5acd\",\n            slategray: \"708090\",\n            slategrey: \"708090\",\n            snow: \"fffafa\",\n            springgreen: \"00ff7f\",\n            steelblue: \"4682b4\",\n            tan: \"d2b48c\",\n            teal: \"008080\",\n            thistle: \"d8bfd8\",\n            tomato: \"ff6347\",\n            turquoise: \"40e0d0\",\n            violet: \"ee82ee\",\n            wheat: \"f5deb3\",\n            white: \"fff\",\n            whitesmoke: \"f5f5f5\",\n            yellow: \"ff0\",\n            yellowgreen: \"9acd32\"\n        };\n\n        \/\/ Make it easy to access colors via `hexNames[hex]`\n        var hexNames = tinycolor.hexNames = flip(names);\n\n\n        \/\/ Utilities\n        \/\/ ---------\n\n        \/\/ `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\n        function flip(o) {\n            var flipped = { };\n            for (var i in o) {\n                if (o.hasOwnProperty(i)) {\n                    flipped[o[i]] = i;\n                }\n            }\n            return flipped;\n        }\n\n        \/\/ Return a valid alpha value [0,1] with all invalid values being set to 1\n        function boundAlpha(a) {\n            a = parseFloat(a);\n\n            if (isNaN(a) || a < 0 || a > 1) {\n                a = 1;\n            }\n\n            return a;\n        }\n\n        \/\/ Take input from [0, n] and return it as [0, 1]\n        function bound01(n, max) {\n            if (isOnePointZero(n)) { n = \"100%\"; }\n\n            var processPercent = isPercentage(n);\n            n = mathMin(max, mathMax(0, parseFloat(n)));\n\n            \/\/ Automatically convert percentage into number\n            if (processPercent) {\n                n = parseInt(n * max, 10) \/ 100;\n            }\n\n            \/\/ Handle floating point rounding errors\n            if ((math.abs(n - max) < 0.000001)) {\n                return 1;\n            }\n\n            \/\/ Convert into [0, 1] range if it isn't already\n            return (n % max) \/ parseFloat(max);\n        }\n\n        \/\/ Force a number between 0 and 1\n        function clamp01(val) {\n            return mathMin(1, mathMax(0, val));\n        }\n\n        \/\/ Parse a base-16 hex value into a base-10 integer\n        function parseIntFromHex(val) {\n            return parseInt(val, 16);\n        }\n\n        \/\/ Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n        \/\/ <http:\/\/stackoverflow.com\/questions\/7422072\/javascript-how-to-detect-number-as-a-decimal-including-1-0>\n        function isOnePointZero(n) {\n            return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n        }\n\n        \/\/ Check to see if string passed in is a percentage\n        function isPercentage(n) {\n            return typeof n === \"string\" && n.indexOf('%') != -1;\n        }\n\n        \/\/ Force a hex value to have 2 characters\n        function pad2(c) {\n            return c.length == 1 ? '0' + c : '' + c;\n        }\n\n        \/\/ Replace a decimal with it's percentage value\n        function convertToPercentage(n) {\n            if (n <= 1) {\n                n = (n * 100) + \"%\";\n            }\n\n            return n;\n        }\n\n        \/\/ Converts a decimal to a hex value\n        function convertDecimalToHex(d) {\n            return Math.round(parseFloat(d) * 255).toString(16);\n        }\n        \/\/ Converts a hex value to a decimal\n        function convertHexToDecimal(h) {\n            return (parseIntFromHex(h) \/ 255);\n        }\n\n        var matchers = (function() {\n\n            \/\/ <http:\/\/www.w3.org\/TR\/css3-values\/#integers>\n            var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n            \/\/ <http:\/\/www.w3.org\/TR\/css3-values\/#number-value>\n            var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n            \/\/ Allow positive\/negative integer\/number.  Don't capture the either\/or, just the entire outcome.\n            var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n            \/\/ Actual matching.\n            \/\/ Parentheses and commas are optional, but not required.\n            \/\/ Whitespace can take the place of commas or opening paren\n            var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n            var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n\n            return {\n                rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n                rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n                hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n                hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n                hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n                hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n                hex3: \/^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$\/,\n                hex6: \/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$\/,\n                hex8: \/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$\/\n            };\n        })();\n\n        \/\/ `stringInputToObject`\n        \/\/ Permissive string parsing.  Take in a number of formats, and output an object\n        \/\/ based on detected format.  Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n        function stringInputToObject(color) {\n\n            color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase();\n            var named = false;\n            if (names[color]) {\n                color = names[color];\n                named = true;\n            }\n            else if (color == 'transparent') {\n                return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n            }\n\n            \/\/ Try to match string input using regular expressions.\n            \/\/ Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n            \/\/ Just return an object and let the conversion functions handle that.\n            \/\/ This way the result will be the same whether the tinycolor is initialized with string or object.\n            var match;\n            if ((match = matchers.rgb.exec(color))) {\n                return { r: match[1], g: match[2], b: match[3] };\n            }\n            if ((match = matchers.rgba.exec(color))) {\n                return { r: match[1], g: match[2], b: match[3], a: match[4] };\n            }\n            if ((match = matchers.hsl.exec(color))) {\n                return { h: match[1], s: match[2], l: match[3] };\n            }\n            if ((match = matchers.hsla.exec(color))) {\n                return { h: match[1], s: match[2], l: match[3], a: match[4] };\n            }\n            if ((match = matchers.hsv.exec(color))) {\n                return { h: match[1], s: match[2], v: match[3] };\n            }\n            if ((match = matchers.hsva.exec(color))) {\n                return { h: match[1], s: match[2], v: match[3], a: match[4] };\n            }\n            if ((match = matchers.hex8.exec(color))) {\n                return {\n                    a: convertHexToDecimal(match[1]),\n                    r: parseIntFromHex(match[2]),\n                    g: parseIntFromHex(match[3]),\n                    b: parseIntFromHex(match[4]),\n                    format: named ? \"name\" : \"hex8\"\n                };\n            }\n            if ((match = matchers.hex6.exec(color))) {\n                return {\n                    r: parseIntFromHex(match[1]),\n                    g: parseIntFromHex(match[2]),\n                    b: parseIntFromHex(match[3]),\n                    format: named ? \"name\" : \"hex\"\n                };\n            }\n            if ((match = matchers.hex3.exec(color))) {\n                return {\n                    r: parseIntFromHex(match[1] + '' + match[1]),\n                    g: parseIntFromHex(match[2] + '' + match[2]),\n                    b: parseIntFromHex(match[3] + '' + match[3]),\n                    format: named ? \"name\" : \"hex\"\n                };\n            }\n\n            return false;\n        }\n\n        window.tinycolor = tinycolor;\n    })();\n\n    $(function () {\n        if ($.fn.spectrum.load) {\n            $.fn.spectrum.processNativeColorInputs();\n        }\n    });\n\n});\n\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.ColorSelector-1.2\/scripts\/color-selector.js?ver=1.2.3":"\n\/**\n * ColorSelector widget module\n *\n * @param {H5P.jQuery} $\n *\/\nH5PEditor.widgets.colorSelector = H5PEditor.ColorSelector = (function ($) {\n\n  \/**\n   * Creates a color selector.\n   *\n   * @class H5PEditor.ColorSelector\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   *\/\n  function ColorSelector(parent, field, params, setValue) {\n    this.parent = parent;\n    this.field = field;\n    this.params = params;\n    this.setValue = setValue;\n  }\n\n  \/**\n   * Append the field to the wrapper.\n   * @public\n   * @param {H5P.jQuery} $wrapper\n   *\/\n  ColorSelector.prototype.appendTo = function ($wrapper) {\n    var self = this;\n    var html = H5PEditor.createFieldMarkup(this.field, '<input type=\"text\" class=\"h5p-color-picker\">');\n    self.$item = H5PEditor.$(html);\n    self.$colorPicker = self.$item.find('.h5p-color-picker');\n\n    self.config = {\n      preferredFormat: 'hex',\n      color: self.getColor(),\n      change: function (color) {\n        self.setColor(color);\n      },\n      hide: function (color) {\n        \/\/ Need this to get color if cancel is clicked\n        self.setColor(color);\n      }\n    };\n\n    \/\/ Make it possible to set spectrum config\n    if (self.field.spectrum !== undefined) {\n      self.config = $.extend(self.config, self.field.spectrum);\n    }\n\n    \/\/ Create color picker widget\n    self.$colorPicker.spectrum(self.config);\n\n    self.$item.appendTo($wrapper);\n  };\n\n  \/**\n   * Return colorcode in \"css\" format\n   *\n   * @method colorToString\n   * @param  {Object}      color\n   * @return {String}\n   *\/\n  ColorSelector.prototype.colorToString = function (color) {\n    switch (this.config.preferredFormat) {\n      case 'rgb': return color.toRgbString();\n      case 'hsv': return color.toHsvString();\n      case 'hsl': return color.toHslString();\n      default: return color.toHexString();\n    }\n  };\n\n  \/**\n   * Hide color selector\n   * @method hide\n   *\/\n  ColorSelector.prototype.hide = function () {\n    this.$colorPicker.spectrum('hide');\n  };\n  \/**\n   * Save the color\n   *\n   * @param {Object} color The\n   *\/\n  ColorSelector.prototype.setColor = function (color) {\n    \/\/ Save the value, allow null\n    this.params = (color === null ? null : this.colorToString(color));\n    this.setValue(this.field, this.params);\n  };\n\n  ColorSelector.prototype.getColor = function () {\n    var isEmpty = (this.params === null || this.params === \"\");\n    return isEmpty ? null : this.params;\n  };\n\n  \/**\n   * Validate the current values.\n   *\/\n  ColorSelector.prototype.validate = function () {\n    this.hide();\n    return (this.params.length !== 0);\n  };\n\n  ColorSelector.prototype.remove = function () {};\n\n  return ColorSelector;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MarkTheWords-1.7\/scripts\/keyboard-nav.js?ver=1.7.4":"\n\/**\n * @class\n * @classdesc Keyboard navigation for accessibility support\n * @extends H5P.EventDispatcher\n *\/\nH5P.KeyboardNav = (function (EventDispatcher) {\n  \/**\n   * Construct a new KeyboardNav\n   * @constructor\n   *\/\n  function KeyboardNav() {\n    EventDispatcher.call(this);\n\n    \/** @member {boolean} *\/\n    this.selectability = true;\n\n    \/** @member {HTMLElement[]|EventTarget[]} *\/\n    this.elements = [];\n  }\n\n  KeyboardNav.prototype = Object.create(EventDispatcher.prototype);\n  KeyboardNav.prototype.constructor = KeyboardNav;\n\n  \/**\n   * Adds a new element to navigation\n   *\n   * @param {HTMLElement} el The element\n   * @public\n   *\/\n  KeyboardNav.prototype.addElement = function(el){\n    el.addEventListener('keydown', this.handleKeyDown.bind(this));\n    el.addEventListener('click', this.onClick.bind(this));\n\n    \/\/ add to array to navigate over\n    this.elements.push(el);\n\n    if(this.elements.length === 1){ \/\/ if first\n      this.setTabbableAt(0);\n    }\n  };\n\n  \/**\n   * Select the previous element in the list. Select the last element,\n   * if the current element is the first element in the list.\n   *\n   * @param {Number} index The index of currently selected element\n   * @public\n   * @fires KeyboardNav#previousOption\n   *\/\n  KeyboardNav.prototype.previousOption = function (index) {\n    var isFirstElement = index === 0;\n    this.focusOnElementAt(isFirstElement ? (this.elements.length - 1) : (index - 1));\n\n    \/**\n     * Previous option event\n     *\n     * @event KeyboardNav#previousOption\n     * @type KeyboardNavigationEventData\n     *\/\n    this.trigger('previousOption', this.createEventPayload(index));\n  };\n\n\n  \/**\n   * Select the next element in the list. Select the first element,\n   * if the current element is the first element in the list.\n   *\n   * @param {Number} index The index of the currently selected element\n   * @public\n   * @fires KeyboardNav#previousOption\n   *\/\n  KeyboardNav.prototype.nextOption = function (index) {\n    var isLastElement = index === this.elements.length - 1;\n    this.focusOnElementAt(isLastElement ? 0 : (index + 1));\n\n    \/**\n     * Previous option event\n     *\n     * @event KeyboardNav#nextOption\n     * @type KeyboardNavigationEventData\n     *\/\n    this.trigger('nextOption', this.createEventPayload(index));\n  };\n\n  \/**\n   * Focus on an element by index\n   *\n   * @param {Number} index The index of the element to focus on\n   * @public\n   *\/\n  KeyboardNav.prototype.focusOnElementAt = function (index) {\n    this.setTabbableAt(index);\n    this.elements[index].focus();\n  };\n\n  \/**\n   * Disable possibility to select a word trough click and space or enter\n   *\n   * @public\n   *\/\n  KeyboardNav.prototype.disableSelectability = function () {\n    this.selectability = false;\n  };\n\n  \/**\n   * Enable possibility to select a word trough click and space or enter\n   *\n   * @public\n   *\/\n  KeyboardNav.prototype.enableSelectability = function () {\n    this.selectability = true;\n  };\n\n  \/**\n   * Sets tabbable on a single element in the list, by index\n   * Also removes tabbable from all other elements in the list\n   *\n   * @param {Number} index The index of the element to set tabbale on\n   * @public\n   *\/\n  KeyboardNav.prototype.setTabbableAt = function (index) {\n    this.removeAllTabbable();\n    this.elements[index].setAttribute('tabindex', '0');\n  };\n\n  \/**\n   * Remove tabbable from all entries\n   *\n   * @public\n   *\/\n  KeyboardNav.prototype.removeAllTabbable = function () {\n    this.elements.forEach(function(el){\n      el.removeAttribute('tabindex');\n    });\n  };\n\n  \/**\n   * Toggles 'aria-selected' on an element, if selectability == true\n   *\n   * @param {EventTarget|HTMLElement} el The element to select\/unselect\n   * @private\n   * @fires KeyboardNav#select\n   *\/\n  KeyboardNav.prototype.toggleSelect = function(el){\n    if(this.selectability) {\n\n      \/\/ toggle selection\n      if (isElementSelected(el)) {\n        el.removeAttribute('aria-selected');\n      }\n      else {\n        el.setAttribute('aria-selected', 'true');\n      }\n\n      \/\/ focus current\n      el.setAttribute('tabindex', '0');\n      el.focus();\n\n      var index = this.elements.indexOf(el);\n\n      \/**\n       * Previous option event\n       *\n       * @event KeyboardNav#select\n       * @type KeyboardNavigationEventData\n       *\/\n      this.trigger('select', this.createEventPayload(index));\n    }\n  };\n\n  \/**\n   * Handles key down\n   *\n   * @param {KeyboardEvent} event Keyboard event\n   * @private\n   *\/\n  KeyboardNav.prototype.handleKeyDown = function(event){\n    var index;\n\n    switch (event.which) {\n      case 13: \/\/ Enter\n      case 32: \/\/ Space\n        \/\/ Select\n        this.toggleSelect(event.target);\n        event.preventDefault();\n        break;\n\n      case 37: \/\/ Left Arrow\n      case 38: \/\/ Up Arrow\n        \/\/ Go to previous Option\n        index = this.elements.indexOf(event.currentTarget);\n        this.previousOption(index);\n        event.preventDefault();\n        break;\n\n      case 39: \/\/ Right Arrow\n      case 40: \/\/ Down Arrow\n        \/\/ Go to next Option\n        index = this.elements.indexOf(event.currentTarget);\n        this.nextOption(index);\n        event.preventDefault();\n        break;\n    }\n  };\n\n  \/**\n   * Handles element click. Toggles 'aria-selected' on element\n   *\n   * @param {MouseEvent} event Mouse click event\n   * @private\n   *\/\n  KeyboardNav.prototype.onClick = function(event){\n    this.toggleSelect(event.currentTarget);\n  };\n\n  \/**\n   * Creates a paylod for event that is fired\n   *\n   * @param {Number} index\n   * @return {KeyboardNavigationEventData}\n   *\/\n  KeyboardNav.prototype.createEventPayload = function(index){\n    \/**\n     * Data that is passed along as the event parameter\n     *\n     * @typedef {Object} KeyboardNavigationEventData\n     * @property {HTMLElement} element\n     * @property {number} index\n     * @property {boolean} selected\n     *\/\n    return {\n      element: this.elements[index],\n      index: index,\n      selected: isElementSelected(this.elements[index])\n    };\n  };\n\n  \/**\n   * Sets aria-selected=\"true\" on an element\n   *\n   * @param {HTMLElement} el The element to set selected\n   * @return {boolean}\n   *\/\n  var isElementSelected = function(el){\n    return el.getAttribute('aria-selected') === 'true';\n  };\n\n  return KeyboardNav;\n})(H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MarkTheWords-1.7\/scripts\/xAPI-generator.js?ver=1.7.4":"\nH5P.MarkTheWords = H5P.MarkTheWords || {};\n\n\/**\n * Mark the words XapiGenerator\n *\/\nH5P.MarkTheWords.XapiGenerator = (function ($) {\n\n  \/**\n   * Xapi statements Generator\n   * @param {H5P.MarkTheWords} markTheWords\n   * @constructor\n   *\/\n  function XapiGenerator(markTheWords) {\n\n    \/**\n     * Generate answered event\n     * @return {H5P.XAPIEvent}\n     *\/\n    this.generateAnsweredEvent = function () {\n      var xAPIEvent = markTheWords.createXAPIEventTemplate('answered');\n\n      \/\/ Extend definition\n      var objectDefinition = createDefinition(markTheWords);\n      $.extend(true, xAPIEvent.getVerifiedStatementValue(['object', 'definition']), objectDefinition);\n\n      \/\/ Set score\n      xAPIEvent.setScoredResult(markTheWords.getScore(),\n        markTheWords.getMaxScore(),\n        markTheWords,\n        true,\n        markTheWords.getScore() === markTheWords.getMaxScore()\n      );\n\n      \/\/ Extend user result\n      var userResult = {\n        response: getUserSelections(markTheWords)\n      };\n\n      $.extend(xAPIEvent.getVerifiedStatementValue(['result']), userResult);\n\n      return xAPIEvent;\n    };\n  }\n\n  \/**\n   * Create object definition for question\n   *\n   * @param {H5P.MarkTheWords} markTheWords\n   * @return {Object} Object definition\n   *\/\n  function createDefinition(markTheWords) {\n    var definition = {};\n    definition.description = {\n      'en-US': replaceLineBreaks(markTheWords.params.taskDescription)\n    };\n    definition.type = 'http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction';\n    definition.interactionType = 'choice';\n    definition.correctResponsesPattern = [getCorrectResponsesPattern(markTheWords)];\n    definition.choices = getChoices(markTheWords);\n    definition.extensions = {\n      'https:\/\/h5p.test.schulcloud-thueringen.de\/x-api\/line-breaks': markTheWords.getIndexesOfLineBreaks()\n    };\n    return definition;\n  }\n\n  \/**\n   * Replace line breaks\n   *\n   * @param {string} description\n   * @return {string}\n   *\/\n  function replaceLineBreaks(description) {\n    var sanitized = $('<div>' + description + '<\/div>').text();\n    return sanitized.replace(\/(\\n)+\/g, '<br\/>');\n  }\n\n  \/**\n   * Get all choices that it is possible to choose between\n   *\n   * @param {H5P.MarkTheWords} markTheWords\n   * @return {Array}\n   *\/\n  function getChoices(markTheWords) {\n    return markTheWords.selectableWords.map(function (word, index) {\n      var text = word.getText();\n      if (text.charAt(0) === '*' && text.charAt(text.length - 1) === '*') {\n        text = text.substr(1, text.length - 2);\n      }\n\n      return {\n        id: index.toString(),\n        description: {\n          'en-US': $('<div>' + text + '<\/div>').text()\n        }\n      };\n    });\n  }\n\n  \/**\n   * Get selected words as a user response pattern\n   *\n   * @param {H5P.MarkTheWords} markTheWords\n   * @return {string}\n   *\/\n  function getUserSelections(markTheWords) {\n    return markTheWords.selectableWords\n      .reduce(function (prev, word, index) {\n        if (word.isSelected()) {\n          prev.push(index);\n        }\n        return prev;\n      }, []).join('[,]');\n  }\n\n  \/**\n   * Get correct response pattern from correct words\n   *\n   * @param {H5P.MarkTheWords} markTheWords\n   * @return {string}\n   *\/\n  function getCorrectResponsesPattern(markTheWords) {\n    return markTheWords.selectableWords\n      .reduce(function (prev, word, index) {\n        if (word.isAnswer()) {\n          prev.push(index);\n        }\n        return prev;\n      }, []).join('[,]');\n  }\n\n  return XapiGenerator;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MarkTheWords-1.7\/scripts\/word.js?ver=1.7.4":"\nH5P.MarkTheWords = H5P.MarkTheWords || {};\nH5P.MarkTheWords.Word = (function () {\n  \/**\n   * @constant\n   *\n   * @type {string}\n  *\/\n  Word.ID_MARK_MISSED = \"h5p-description-missed\";\n  \/**\n   * @constant\n   *\n   * @type {string}\n   *\/\n  Word.ID_MARK_CORRECT = \"h5p-description-correct\";\n  \/**\n   * @constant\n   *\n   * @type {string}\n   *\/\n  Word.ID_MARK_INCORRECT = \"h5p-description-incorrect\";\n\n  \/**\n   * Class for keeping track of selectable words.\n   *\n   * @class\n   * @param {jQuery} $word\n   *\/\n  function Word($word) {\n    var self = this;\n    H5P.EventDispatcher.call(self);\n\n    var input = $word.text();\n    var handledInput = input;\n\n    \/\/ Check if word is an answer\n    var isAnswer = checkForAnswer();\n\n    \/\/ Remove single asterisk and escape double asterisks.\n    handleAsterisks();\n\n    if (isAnswer) {\n      $word.text(handledInput);\n    }\n\n    \/**\n     * Checks if the word is an answer by checking the first, second to last and last character of the word.\n     *\n     * @private\n     * @return {Boolean} Returns true if the word is an answer.\n     *\/\n    function checkForAnswer() {\n      \/\/ Check last and next to last character, in case of punctuations.\n      var wordString = removeDoubleAsterisks(input);\n      if (wordString.charAt(0) === ('*') && wordString.length > 2) {\n        if (wordString.charAt(wordString.length - 1) === ('*')) {\n          handledInput = input.slice(1, input.length - 1);\n          return true;\n        }\n        \/\/ If punctuation, add the punctuation to the end of the word.\n        else if(wordString.charAt(wordString.length - 2) === ('*')) {\n          handledInput = input.slice(1, input.length - 2);\n          return true;\n        }\n        return false;\n      }\n      return false;\n    }\n\n    \/**\n     * Removes double asterisks from string, used to handle input.\n     *\n     * @private\n     * @param {String} wordString The string which will be handled.\n     * @return {String} Returns a string without double asterisks.\n     *\/\n    function removeDoubleAsterisks(wordString) {\n      var asteriskIndex = wordString.indexOf('*');\n      var slicedWord = wordString;\n\n      while (asteriskIndex !== -1) {\n        if (wordString.indexOf('*', asteriskIndex + 1) === asteriskIndex + 1) {\n          slicedWord = wordString.slice(0, asteriskIndex) + wordString.slice(asteriskIndex + 2, input.length);\n        }\n        asteriskIndex = wordString.indexOf('*', asteriskIndex + 1);\n      }\n\n      return slicedWord;\n    }\n\n    \/**\n     * Escape double asterisks ** = *, and remove single asterisk.\n     *\n     * @private\n     *\/\n    function handleAsterisks() {\n      var asteriskIndex = handledInput.indexOf('*');\n\n      while (asteriskIndex !== -1) {\n        handledInput = handledInput.slice(0, asteriskIndex) + handledInput.slice(asteriskIndex + 1, handledInput.length);\n        asteriskIndex = handledInput.indexOf('*', asteriskIndex + 1);\n      }\n    }\n\n    \/**\n     * Removes any score points added to the marked word.\n     *\/\n    self.clearScorePoint = function () {\n      for (var i = 0; $word[0].children.length; i++) {\n        var scorePoint = $word[0].children[i];\n        scorePoint.parentNode.removeChild(scorePoint);\n      }\n    };\n\n     \/**\n     * Get Word as a string\n     *\n     * @return {string} Word as text\n     *\/\n    this.getText = function () {\n      return input;\n    };\n\n    \/**\n     * Clears all marks from the word.\n     *\n     * @public\n     *\/\n    this.markClear = function () {\n      $word\n        .removeAttr('aria-selected')\n        .removeAttr('aria-describedby');\n\n      this.clearScorePoint();\n    };\n\n    \/**\n     * Check if the word is correctly marked and style it accordingly.\n     * Reveal result\n     *\n     * @public\n     * @param {H5P.Question.ScorePoints} scorePoints\n     *\/\n    this.markCheck = function (scorePoints) {\n      if (this.isSelected()) {\n        $word.attr('aria-describedby', isAnswer ? Word.ID_MARK_CORRECT : Word.ID_MARK_INCORRECT);\n\n        if (scorePoints) {\n          $word[0].appendChild(scorePoints.getElement(isAnswer));\n        }\n      }\n      else if (isAnswer) {\n        $word.attr('aria-describedby', Word.ID_MARK_MISSED);\n      }\n    };\n\n    \/**\n     * Checks if the word is marked correctly.\n     *\n     * @public\n     * @returns {Boolean} True if the marking is correct.\n     *\/\n    this.isCorrect = function () {\n      return (isAnswer && this.isSelected());\n    };\n\n    \/**\n     * Checks if the word is marked wrong.\n     *\n     * @public\n     * @returns {Boolean} True if the marking is wrong.\n     *\/\n    this.isWrong = function () {\n      return (!isAnswer && this.isSelected());\n    };\n\n    \/**\n     * Checks if the word is correct, but has not been marked.\n     *\n     * @public\n     * @returns {Boolean} True if the marking is missed.\n     *\/\n    this.isMissed = function () {\n      return (isAnswer && !this.isSelected());\n    };\n\n    \/**\n     * Checks if the word is an answer.\n     *\n     * @public\n     * @returns {Boolean} True if the word is an answer.\n     *\/\n    this.isAnswer = function () {\n      return isAnswer;\n    };\n\n    \/**\n     * Checks if the word is selected.\n     *\n     * @public\n     * @returns {Boolean} True if the word is selected.\n     *\/\n    this.isSelected = function () {\n      return $word.attr('aria-selected') === 'true';\n    };\n\n    \/**\n     * Sets that the Word is selected\n     *\n     * @public\n     *\/\n    this.setSelected = function () {\n      $word.attr('aria-selected', true);\n    };\n  }\n  Word.prototype = Object.create(H5P.EventDispatcher.prototype);\n  Word.prototype.constructor = Word;\n\n  return Word;\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MarkTheWords-1.7\/scripts\/mark-the-words.js?ver=1.7.4":"\n\/*global H5P*\/\n\n\/**\n * Mark The Words module\n * @external {jQuery} $ H5P.jQuery\n *\/\nH5P.MarkTheWords = (function ($, Question, Word, KeyboardNav, XapiGenerator) {\n  \/**\n   * Initialize module.\n   *\n   * @class H5P.MarkTheWords\n   * @extends H5P.Question\n   * @param {Object} params Behavior settings\n   * @param {Number} contentId Content identification\n   * @param {Object} contentData Object containing task specific content data\n   *\n   * @returns {Object} MarkTheWords Mark the words instance\n   *\/\n  function MarkTheWords(params, contentId, contentData) {\n    var self = this;\n    this.contentId = contentId;\n    this.introductionId = 'mark-the-words-introduction-' + contentId;\n\n    Question.call(this, 'mark-the-words');\n\n    \/\/ Set default behavior.\n    this.params = $.extend(true, {\n      taskDescription: \"\",\n      textField: \"This is a *nice*, *flexible* content type.\",\n      overallFeedback: [],\n      behaviour: {\n        enableRetry: true,\n        enableSolutionsButton: true,\n        showScorePoints: true\n      },\n      checkAnswerButton: \"Check\",\n      tryAgainButton: \"Retry\",\n      showSolutionButton: \"Show solution\",\n      correctAnswer: \"Correct!\",\n      incorrectAnswer: \"Incorrect!\",\n      missedAnswer: \"Missed!\",\n      displaySolutionDescription:  \"Task is updated to contain the solution.\",\n      scoreBarLabel: 'You got :num out of :total points'\n    }, params);\n\n    this.contentData = contentData;\n    if (this.contentData !== undefined && this.contentData.previousState !== undefined) {\n      this.previousState = this.contentData.previousState;\n    }\n\n    \/\/ Add keyboard navigation helper\n    this.keyboardNav = new KeyboardNav();\n\n    \/\/ on word clicked\n    this.keyboardNav.on('select', function () {\n      self.isAnswered = true;\n      self.triggerXAPI('interacted');\n    });\n\n    this.initMarkTheWords();\n    this.XapiGenerator = new XapiGenerator(this);\n  }\n\n  MarkTheWords.prototype = Object.create(H5P.EventDispatcher.prototype);\n  MarkTheWords.prototype.constructor = MarkTheWords;\n\n  \/**\n   * Initialize Mark The Words task\n   *\/\n  MarkTheWords.prototype.initMarkTheWords = function () {\n    this.$inner = $('<div class=\"h5p-word-inner\"><\/div>');\n\n    this.addTaskTo(this.$inner);\n\n    \/\/ Set user state\n    this.setH5PUserState();\n  };\n\n  \/**\n   * Recursive function that creates html for the words\n   * @method createHtmlForWords\n   * @param  {Array}           nodes Array of dom nodes\n   * @return {string}\n   *\/\n  MarkTheWords.prototype.createHtmlForWords = function (nodes) {\n    var self = this;\n    var html = '';\n    for (var i = 0; i < nodes.length; i++) {\n      var node = nodes[i];\n\n      if (node instanceof Text) {\n        var text = $(node).text();\n        var selectableStrings = text.replace(\/(&nbsp;|\\r\\n|\\n|\\r)\/g, ' ')\n          .match(\/ \\*[^\\*]+\\* |[^\\s]+\/g);\n\n        if (selectableStrings) {\n          selectableStrings.forEach(function (entry) {\n            entry = entry.trim();\n\n            \/\/ Words\n            if (html) {\n              \/\/ Add space before\n              html += ' ';\n            }\n\n            \/\/ Remove prefix punctuations from word\n            var prefix = entry.match(\/^[\\[\\({\u27e8\u00bf\u00a1\u201c\"\u00ab\u201e]+\/);\n            var start = 0;\n            if (prefix !== null) {\n              start = prefix[0].length;\n              html += prefix;\n            }\n\n            \/\/ Remove suffix punctuations from word\n            var suffix = entry.match(\/[\",\u2026.:;?!\\]\\)}\u27e9\u00bb\u201d]+$\/);\n            var end = entry.length - start;\n            if (suffix !== null) {\n              end -= suffix[0].length;\n            }\n\n            \/\/ Word\n            entry = entry.substr(start, end);\n            if (entry.length) {\n              html += '<span role=\"option\">' + entry + '<\/span>';\n            }\n\n            if (suffix !== null) {\n              html += suffix;\n            }\n          });\n        }\n        else if ((selectableStrings !== null) && text.length) {\n          html += '<span role=\"option\">' + text + '<\/span>';\n        }\n      }\n      else {\n        if (node.nodeName === 'BR') {\n          html += '<br\/>';\n        }\n        else {\n          var attributes = ' ';\n          for (var j = 0; j < node.attributes.length; j++) {\n            attributes +=node.attributes[j].name + '=\"' + node.attributes[j].nodeValue + '\" ';\n          }\n          html += '<' + node.nodeName +  attributes + '>';\n          html += self.createHtmlForWords(node.childNodes);\n          html += '<\/' + node.nodeName + '>';\n        }\n      }\n    }\n\n    return html;\n  };\n\n  \/**\n   * Search for the last children in every paragraph and\n   * return their indexes in an array\n   *\n   * @returns {Array}\n   *\/\n  MarkTheWords.prototype.getIndexesOfLineBreaks = function () {\n\n    var indexes = [];\n    var selectables = this.$wordContainer.find('span.h5p-word-selectable');\n\n    selectables.each(function(index, selectable) {\n      if ($(selectable).next().is('br')){\n        indexes.push(index);\n      }\n\n      if ($(selectable).parent('p') && !$(selectable).parent().is(':last-child') && $(selectable).is(':last-child')){\n        indexes.push(index);\n      }\n    });\n\n    return indexes;\n  };\n\n  \/**\n   * Handle task and add it to container.\n   * @param {jQuery} $container The object which our task will attach to.\n   *\/\n  MarkTheWords.prototype.addTaskTo = function ($container) {\n    var self = this;\n    self.selectableWords = [];\n    self.answers = 0;\n\n    \/\/ Wrapper\n    var $wordContainer = $('<div\/>', {\n      'class': 'h5p-word-selectable-words',\n      'aria-labelledby': self.introductionId,\n      'aria-multiselect': true,\n      'role': 'listbox',\n      html: self.createHtmlForWords($.parseHTML(self.params.textField))\n    });\n\n    $wordContainer.find('[role=\"option\"]').each(function () {\n      \/\/ Add keyboard navigation to this element\n      self.keyboardNav.addElement(this);\n\n      var selectableWord = new Word($(this));\n      if (selectableWord.isAnswer()) {\n        self.answers += 1;\n      }\n      self.selectableWords.push(selectableWord);\n    });\n\n    self.blankIsCorrect = (self.answers === 0);\n    if (self.blankIsCorrect) {\n      self.answers = 1;\n    }\n\n    $wordContainer.appendTo($container);\n    self.$wordContainer = $wordContainer;\n  };\n\n  \/**\n   * Add check solution and retry buttons.\n   *\/\n  MarkTheWords.prototype.addButtons = function () {\n    var self = this;\n    self.$buttonContainer = $('<div\/>', {\n      'class': 'h5p-button-bar'\n    });\n\n    this.addButton('check-answer', this.params.checkAnswerButton, function () {\n      self.isAnswered = true;\n      self.keyboardNav.setTabbableAt(0);\n      self.keyboardNav.disableSelectability();\n      var answers = self.calculateScore();\n      self.feedbackSelectedWords();\n      self.hideButton('check-answer');\n\n\n      if (!self.showEvaluation(answers)) {\n        \/\/ Only show if a correct answer was not found.\n        if (self.params.behaviour.enableSolutionsButton && (answers.correct < self.answers)) {\n          self.showButton('show-solution');\n        }\n        if (self.params.behaviour.enableRetry) {\n          self.showButton('try-again');\n        }\n      }\n      self.trigger(self.XapiGenerator.generateAnsweredEvent());\n    });\n\n    this.addButton('try-again', this.params.tryAgainButton, this.resetTask.bind(this), false);\n\n    this.addButton('show-solution', this.params.showSolutionButton, function () {\n      self.keyboardNav.setTabbableAt(0);\n      self.keyboardNav.disableSelectability();\n      self.setAllMarks();\n      self.hideButton('check-answer');\n      self.hideButton('show-solution');\n      if (self.params.behaviour.enableRetry) {\n        self.showButton('try-again');\n      }\n\n      self.read(self.params.displaySolutionDescription);\n    }, false);\n  };\n\n  \/**\n   * Get Xapi Data.\n   *\n   * @see used in contracts {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts#guides-header-6}\n   * @return {Object}\n   *\/\n  MarkTheWords.prototype.getXAPIData = function () {\n    return {\n      statement: this.XapiGenerator.generateAnsweredEvent().data.statement\n    };\n  };\n\n  \/**\n   * Mark the words as correct, wrong or missed.\n   *\n   * @fires MarkTheWords#resize\n   *\/\n  MarkTheWords.prototype.setAllMarks = function () {\n    this.selectableWords.forEach(function (entry) {\n      entry.markCheck();\n      entry.clearScorePoint();\n    });\n\n    \/**\n     * Resize event\n     *\n     * @event MarkTheWords#resize\n     *\/\n    this.trigger('resize');\n  };\n\n  \/**\n   * Mark the selected words as correct or wrong.\n   *\n   * @fires MarkTheWords#resize\n   *\/\n  MarkTheWords.prototype.feedbackSelectedWords = function () {\n    var self = this;\n\n    var scorePoints;\n    if (self.params.behaviour.showScorePoints) {\n      scorePoints = new H5P.Question.ScorePoints();\n    }\n\n    this.selectableWords.forEach(function (entry) {\n      if (entry.isSelected()) {\n        entry.markCheck(scorePoints);\n      }\n    });\n\n    this.$wordContainer.addClass('h5p-disable-hover');\n    this.trigger('resize');\n  };\n\n  \/**\n   * Evaluate task and display score text for word markings.\n   *\n   * @fires MarkTheWords#resize\n   * @return {Boolean} Returns true if maxScore was achieved.\n   *\/\n  MarkTheWords.prototype.showEvaluation = function (answers) {\n    this.hideEvaluation();\n    var score = answers.score;\n\n    \/\/replace editor variables with values, uses regexp to replace all instances.\n    var scoreText = H5P.Question.determineOverallFeedback(this.params.overallFeedback, score \/ this.answers).replace(\/@score\/g, score.toString())\n      .replace(\/@total\/g, this.answers.toString())\n      .replace(\/@correct\/g, answers.correct.toString())\n      .replace(\/@wrong\/g, answers.wrong.toString())\n      .replace(\/@missed\/g, answers.missed.toString());\n\n    this.setFeedback(scoreText, score, this.answers, this.params.scoreBarLabel);\n\n    this.trigger('resize');\n    return score === this.answers;\n  };\n\n  \/**\n   * Clear the evaluation text.\n   *\n   * @fires MarkTheWords#resize\n   *\/\n  MarkTheWords.prototype.hideEvaluation = function () {\n    this.removeFeedback();\n    this.trigger('resize');\n  };\n\n  \/**\n   * Calculate the score.\n   *\n   * @return {Answers}\n   *\/\n  MarkTheWords.prototype.calculateScore = function () {\n    var self = this;\n\n    \/**\n     * @typedef {Object} Answers\n     * @property {number} correct The number of correct answers\n     * @property {number} wrong The number of wrong answers\n     * @property {number} missed The number of answers the user missed\n     * @property {number} score The calculated score\n     *\/\n    var initial = {\n      correct: 0,\n      wrong: 0,\n      missed: 0,\n      score: 0\n    };\n\n    \/\/ iterate over words, and calculate score\n    var answers = self.selectableWords.reduce(function (result, word) {\n      if (word.isCorrect()) {\n        result.correct++;\n      }\n      else if (word.isWrong()) {\n        result.wrong++;\n      }\n      else if (word.isMissed()) {\n        result.missed++;\n      }\n\n      return result;\n    }, initial);\n\n    \/\/ if no wrong answers, and black is correct\n    if (answers.wrong === 0 && self.blankIsCorrect) {\n      answers.correct = 1;\n    }\n\n    \/\/ no negative score\n    answers.score = Math.max(answers.correct - answers.wrong, 0);\n\n    return answers;\n  };\n\n  \/**\n   * Clear styling on marked words.\n   *\n   * @fires MarkTheWords#resize\n   *\/\n  MarkTheWords.prototype.clearAllMarks = function () {\n    this.selectableWords.forEach(function (entry) {\n      entry.markClear();\n    });\n\n    this.$wordContainer.removeClass('h5p-disable-hover');\n    this.trigger('resize');\n  };\n\n  \/**\n   * Returns true if task is checked or a word has been clicked\n   *\n   * @see {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts|Needed for contracts.}\n   * @returns {Boolean} Always returns true.\n   *\/\n  MarkTheWords.prototype.getAnswerGiven = function () {\n    return this.blankIsCorrect ? true : this.isAnswered;\n  };\n\n  \/**\n   * Counts the score, which is correct answers subtracted by wrong answers.\n   *\n   * @see {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts|Needed for contracts.}\n   * @returns {Number} score The amount of points achieved.\n   *\/\n  MarkTheWords.prototype.getScore = function () {\n    return this.calculateScore().score;\n  };\n\n  \/**\n   * Gets max score for this task.\n   *\n   * @see {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts|Needed for contracts.}\n   * @returns {Number} maxScore The maximum amount of points achievable.\n   *\/\n  MarkTheWords.prototype.getMaxScore = function () {\n    return this.answers;\n  };\n\n  \/**\n   * Get title\n   * @returns {string}\n   *\/\n  MarkTheWords.prototype.getTitle = function () {\n    return H5P.createTitle(this.params.taskDescription);\n  };\n\n  \/**\n   * Display the evaluation of the task, with proper markings.\n   *\n   * @fires MarkTheWords#resize\n   * @see {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts|Needed for contracts.}\n   *\/\n  MarkTheWords.prototype.showSolutions = function () {\n    var answers = this.calculateScore();\n    this.showEvaluation(answers);\n    this.setAllMarks();\n    this.keyboardNav.setTabbableAt(0);\n    this.keyboardNav.disableSelectability();\n    this.read(this.params.displaySolutionDescription);\n    this.hideButton('try-again');\n    this.hideButton('show-solution');\n    this.hideButton('check-answer');\n\n    this.trigger('resize');\n  };\n\n  \/**\n   * Resets the task back to its' initial state.\n   *\n   * @fires MarkTheWords#resize\n   * @see {@link https:\/\/h5p.test.schulcloud-thueringen.de\/documentation\/developers\/contracts|Needed for contracts.}\n   *\/\n  MarkTheWords.prototype.resetTask = function () {\n    this.isAnswered = false;\n    this.clearAllMarks();\n    this.hideEvaluation();\n    this.keyboardNav.setTabbableAt(0);\n    this.keyboardNav.enableSelectability();\n    this.hideButton('try-again');\n    this.hideButton('show-solution');\n    this.showButton('check-answer');\n    this.trigger('resize');\n  };\n\n  \/**\n   * Returns an object containing the selected words\n   *\n   * @public\n   * @returns {object} containing indexes of selected words\n   *\/\n  MarkTheWords.prototype.getCurrentState = function () {\n    var selectedWordsIndexes = [];\n    if (this.selectableWords === undefined) {\n      return undefined;\n    }\n\n    this.selectableWords.forEach(function (selectableWord, swIndex) {\n      if (selectableWord.isSelected()) {\n        selectedWordsIndexes.push(swIndex);\n      }\n    });\n    return selectedWordsIndexes;\n  };\n\n  \/**\n   * Sets answers to current user state\n   *\/\n  MarkTheWords.prototype.setH5PUserState = function () {\n    var self = this;\n\n    \/\/ Do nothing if user state is undefined\n    if (this.previousState === undefined || this.previousState.length === undefined) {\n      return;\n    }\n\n    \/\/ Select words from user state\n    this.previousState.forEach(function (answeredWordIndex) {\n      if (isNaN(answeredWordIndex) || answeredWordIndex >= self.selectableWords.length || answeredWordIndex < 0) {\n        throw new Error('Stored user state is invalid');\n      }\n      self.selectableWords[answeredWordIndex].setSelected();\n    });\n  };\n\n  \/**\n   * Register dom elements\n   *\n   * @see {@link https:\/\/github.com\/h5p\/h5p-question\/blob\/1558b6144333a431dd71e61c7021d0126b18e252\/scripts\/question.js#L1236|Called from H5P.Question}\n   *\/\n  MarkTheWords.prototype.registerDomElements = function () {\n    \/\/ wrap introduction in div with id\n    var introduction = '<div id=\"' + this.introductionId + '\">' + this.params.taskDescription + '<\/div>';\n\n    \/\/ Register description\n    this.setIntroduction(introduction);\n\n    \/\/ creates aria descriptions for correct\/incorrect\/missed\n    this.createDescriptionsDom().appendTo(this.$inner);\n\n    \/\/ Register content\n    this.setContent(this.$inner, {\n      'class': 'h5p-word'\n    });\n\n    \/\/ Register buttons\n    this.addButtons();\n  };\n\n  \/**\n   * Creates dom with description to be used with aria-describedby\n   * @return {jQuery}\n   *\/\n  MarkTheWords.prototype.createDescriptionsDom = function () {\n    var self = this;\n    var $el = $('<div class=\"h5p-mark-the-words-descriptions\"><\/div>');\n\n    $('<div id=\"' + Word.ID_MARK_CORRECT + '\">' + self.params.correctAnswer + '<\/div>').appendTo($el);\n    $('<div id=\"' + Word.ID_MARK_INCORRECT + '\">' + self.params.incorrectAnswer + '<\/div>').appendTo($el);\n    $('<div id=\"' + Word.ID_MARK_MISSED + '\">' + self.params.missedAnswer + '<\/div>').appendTo($el);\n\n    return $el;\n  };\n\n  return MarkTheWords;\n}(H5P.jQuery, H5P.Question, H5P.MarkTheWords.Word, H5P.KeyboardNav, H5P.MarkTheWords.XapiGenerator));\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragText-1.6\/dist\/h5p-drag-text.js?ver=1.6.9":"\n!function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,\"a\",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"\",t(t.s=10)}([function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=t.curry=function(e){var t=e.length;return function r(){var n=Array.prototype.slice.call(arguments,0);return n.length>=t?e.apply(null,n):function(){var e=Array.prototype.slice.call(arguments,0);return r.apply(null,n.concat(e))}}},o=(t.compose=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce(function(e,t){return function(){return e(t.apply(void 0,arguments))}})},t.forEach=n(function(e,t){t.forEach(e)}),t.map=n(function(e,t){return t.map(e)}),t.filter=n(function(e,t){return t.filter(e)})),a=(t.some=n(function(e,t){return t.some(e)}),t.contains=n(function(e,t){return-1!=t.indexOf(e)}));t.without=n(function(e,t){return o(function(t){return!a(t,e)},t)}),t.inverseBooleanString=function(e){return(\"true\"!==e).toString()}},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.createElement=t.toggleClass=t.toggleVisibility=t.show=t.hide=t.removeClass=t.addClass=t.classListContains=t.removeChild=t.querySelectorAll=t.nodeListToArray=t.querySelector=t.appendChild=t.toggleAttribute=t.attributeEquals=t.hasAttribute=t.removeAttribute=t.setAttribute=t.getAttribute=void 0;var n=r(0),o=t.getAttribute=(0,n.curry)(function(e,t){return t.getAttribute(e)}),a=t.setAttribute=(0,n.curry)(function(e,t,r){return r.setAttribute(e,t)}),i=(t.removeAttribute=(0,n.curry)(function(e,t){return t.removeAttribute(e)}),t.hasAttribute=(0,n.curry)(function(e,t){return t.hasAttribute(e)}),t.attributeEquals=(0,n.curry)(function(e,t,r){return r.getAttribute(e)===t}),t.toggleAttribute=(0,n.curry)(function(e,t){var r=o(e,t);a(e,(0,n.inverseBooleanString)(r),t)}),t.appendChild=(0,n.curry)(function(e,t){return e.appendChild(t)}),t.querySelector=(0,n.curry)(function(e,t){return t.querySelector(e)}),t.nodeListToArray=function(e){return Array.prototype.slice.call(e)}),s=(t.querySelectorAll=(0,n.curry)(function(e,t){return i(t.querySelectorAll(e))}),t.removeChild=(0,n.curry)(function(e,t){return e.removeChild(t)}),t.classListContains=(0,n.curry)(function(e,t){return t.classList.contains(e)}),t.addClass=(0,n.curry)(function(e,t){return t.classList.add(e)})),l=t.removeClass=(0,n.curry)(function(e,t){return t.classList.remove(e)}),u=t.hide=s(\"hidden\"),c=t.show=l(\"hidden\");t.toggleVisibility=(0,n.curry)(function(e,t){return(e?c:u)(t)}),t.toggleClass=(0,n.curry)(function(e,t,r){r.classList[t?\"add\":\"remove\"](e)}),t.createElement=function(e){var t=e.tag,r=e.id,n=e.classes,o=e.attributes,a=document.createElement(t);return r&&(a.id=r),n&&n.forEach(function(e){a.classList.add(e)}),o&&Object.keys(o).forEach(function(e){a.setAttribute(e,o[e])}),a}},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){var t=e.length;return function r(){var n=Array.prototype.slice.call(arguments,0);return n.length>=t?e.apply(null,n):function(){var e=Array.prototype.slice.call(arguments,0);return r.apply(null,n.concat(e))}}},o=function(e,t){return t.substr(0,1)===e},a=function(e,t){return t.substr(-1)===e},i=n(function(e,t){return o(e,t)&&(t=t.slice(1)),a(e,t)&&(t=t.slice(0,-1)),t}),s=function(e){for(var t=e.length;t>0;){var r=Math.floor(Math.random()*t);t--;var n=e[t];e[t]=e[r],e[r]=n}return e},l=function(e){var t=document.createElement(\"span\");return t.innerHTML=e,t};t.default={curry:n,cleanCharacter:i,startsWith:o,endsWith:a,shuffle:s,createElementWithTextPart:l}},function(e,t,r){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=r(13),a=r(14),i=n(a),s=r(2),l=n(s),u=r(11),c=n(u),d=r(12),p=n(d),h=r(7),g=n(h),b=r(5),f=n(b),m=r(6),v=n(m),y=r(9),D=n(y);H5P.DragText=function(e,t,r){function n(r,n,o){var a=this;this.$=e(this),this.contentId=n,t.call(this,\"drag-text\"),this.params=e.extend(!0,{taskDescription:\"Set in adjectives in the following sentence\",textField:\"This is a *nice*, *flexible* content type, which allows you to highlight all the *wonderful* words in this *exciting* sentence.\\nThis is another line of *fantastic* text.\",overallFeedback:[],checkAnswer:\"Check\",tryAgain:\"Retry\",behaviour:{enableRetry:!0,enableSolutionsButton:!0,enableCheckButton:!0,instantFeedback:!1},showSolution:\"Show solution\",dropZoneIndex:\"Drop Zone @index.\",empty:\"Empty.\",contains:\"Drop Zone @index contains draggable @draggable.\",draggableIndex:\"Draggable. @index of @count.\",tipLabel:\"Show tip\",correctText:\"Correct!\",incorrectText:\"Incorrect!\",resetDropTitle:\"Reset drop\",resetDropDescription:\"Are you sure you want to reset this drop zone?\",grabbed:\"Draggable is grabbed.\",cancelledDragging:\"Cancelled dragging.\",correctAnswer:\"Correct answer:\",scoreBarLabel:\"You got :num out of :total points\"},r),this.contentData=o,void 0!==this.contentData&&void 0!==this.contentData.previousState&&void 0!==this.contentData.previousState.length&&(this.previousState=this.contentData.previousState),this.answered=!1,this.textFieldHtml=this.params.textField.replace(\/(\\r\\n|\\n|\\r)\/gm,\"<br\/>\"),this.introductionId=\"h5p-drag-text-\"+n+\"-introduction\",this.selectedElement=void 0,this.ariaDragControls=new f.default,this.ariaDropControls=new v.default,this.dragControls=new g.default([new D.default,this.ariaDragControls]),this.dragControls.useNegativeTabIndex(),this.dropControls=new g.default([new D.default,this.ariaDropControls]),this.dropControls.useNegativeTabIndex(),this.dragControls.on(\"before-select\",function(e){return!a.isElementDisabled(e.element)}),this.dragControls.on(\"select\",this.keyboardDraggableSelected,this),this.dropControls.on(\"select\",this.keyboardDroppableSelected,this),this.on(\"start\",this.addAllDroppablesToControls,this),this.on(\"revert\",this.removeControlsFromEmptyDropZones,this),this.on(\"stop\",function(e){e.data.target||a.removeControlsFromDropZonesIfAllEmpty()},this),this.on(\"drop\",this.removeControlsFromEmptyDropZones,this),this.on(\"start\",this.toggleDropEffect,this),this.on(\"stop\",this.toggleDropEffect,this),this.on(\"start\",function(e){var t=a.getDraggableByElement(e.data.element);a.setDraggableAriaLabel(t)}),this.on(\"stop\",function(e){var t=a.getDraggableByElement(e.data.element);a.setDraggableAriaLabel(t)}),this.on(\"start\",function(e){return e.data.element.setAttribute(\"aria-grabbed\",\"true\")}),this.on(\"stop\",function(e){return e.data.element.setAttribute(\"aria-grabbed\",\"false\")}),this.on(\"drop\",this.ariaDropControls.setAllToNone,this.ariaDropControls),this.on(\"drop\",function(e){this.dragControls.removeElement(e.data.element)},this),this.on(\"revert\",function(e){this.dragControls.insertElementAt(e.data.element,0)},this),this.on(\"drop\",this.updateDroppableElement,this),this.on(\"revert\",this.updateDroppableElement,this),this.initDragText(),this.stopWatch=new i.default,this.stopWatch.start(),this.on(\"resize\",this.resize,this),this.on(\"revert\",this.toggleDraggablesContainer,this),this.on(\"drop\",this.toggleDraggablesContainer,this),this.on(\"stop\",function(e){e.data.target||a.read(a.params.cancelledDragging)}),this.params.behaviour.instantFeedback&&this.on(\"revert\",function(){return a.instantFeedbackEvaluation()})}return n.prototype=Object.create(t.prototype),n.prototype.constructor=n,n.prototype.updateDroppableElement=function(e){var t=e.data.target,r=e.data.element,n=this.getDroppableByElement(t);t&&this.setDroppableLabel(t,r.textContent,n.getIndex())},n.prototype.removeControlsFromDropZonesIfAllEmpty=function(){this.anyDropZoneHasDraggable()||this.removeAllDroppablesFromControls()},n.prototype.removeControlsFromEmptyDropZones=function(){var e=this;this.droppables.filter(function(e){return!e.hasDraggable()}).map(function(e){return e.getElement()}).forEach(function(t){e.dropControls.removeElement(t)})},n.prototype.addAllDroppablesToControls=function(){var e=this;this.dropControls.count()>0&&this.removeAllDroppablesFromControls(),this.droppables.map(function(e){return e.getElement()}).forEach(function(t){return e.dropControls.addElement(t)})},n.prototype.removeAllDroppablesFromControls=function(){var e=this;this.droppables.map(function(e){return e.getElement()}).forEach(function(t){return e.dropControls.removeElement(t)})},n.prototype.anyDropZoneHasDraggable=function(){return this.droppables.some(function(e){return e.hasDraggable()})},n.prototype.setDroppableLabel=function(e,t,r){var n=this.params.dropZoneIndex.replace(\"@index\",r.toString()),o=e.classList.contains(\"h5p-drag-correct-feedback\"),a=e.classList.contains(\"h5p-drag-wrong-feedback\"),i=o||a,s=e.childNodes.length>0;if(e)if(i){var l=this.getDroppableByElement(e),u=\"\";u=o?l.correctFeedback?l.correctFeedback:this.params.correctText:l.incorrectFeedback?l.incorrectFeedback:this.params.incorrectText,e.setAttribute(\"aria-label\",n+\" \"+this.params.contains.replace(\"@index\",r.toString()).replace(\"@draggable\",t)+\" \"+u+\".\")}else s?e.setAttribute(\"aria-label\",n+\" \"+this.params.contains.replace(\"@index\",r.toString()).replace(\"@draggable\",t)):e.setAttribute(\"aria-label\",n+\" \"+this.params.empty.replace(\"@index\",r.toString()))},n.prototype.registerDomElements=function(){this.$introduction=e('<p id=\"'+this.introductionId+'\">'+this.params.taskDescription+\"<\/p>\"),this.setIntroduction(this.$introduction),this.$introduction.parent().attr(\"tabindex\",\"-1\"),this.setContent(this.$inner),this.addButtons()},n.prototype.initDragText=function(){return this.$inner=e(\"<div\/>\",{\"aria-describedby\":this.introductionId,class:\"h5p-drag-inner\"}),this.addTaskTo(this.$inner),this.setH5PUserState(),this.$inner},n.prototype.resize=function(){this.changeLayoutToFitWidth()},n.prototype.changeLayoutToFitWidth=function(){var e=this;e.addDropzoneWidth(),e.$inner.width()\/parseFloat(e.$inner.css(\"font-size\"),10)>43&&e.widestDraggable<=e.$inner.width()\/3?(e.$draggables.addClass(\"h5p-drag-wide-screen\"),e.$wordContainer.detach().appendTo(e.$taskContainer),e.draggables.forEach(function(e){e.getDraggableElement().addClass(\"h5p-drag-draggable-wide-screen\")}),e.$wordContainer.css({\"margin-right\":e.$draggables.width()})):(e.$wordContainer.css({\"margin-right\":0}),e.$draggables.removeClass(\"h5p-drag-wide-screen\"),e.$draggables.detach().appendTo(e.$taskContainer),e.draggables.forEach(function(e){e.getDraggableElement().removeClass(\"h5p-drag-draggable-wide-screen\")}))},n.prototype.addButtons=function(){var e=this;e.params.behaviour.enableCheckButton&&e.addButton(\"check-answer\",e.params.checkAnswer,function(){e.answered=!0,e.removeAllElementsFromDragControl(),e.showEvaluation()?(e.hideButton(\"show-solution\"),e.hideButton(\"try-again\"),e.hideButton(\"check-answer\")):(e.params.behaviour.enableRetry&&e.showButton(\"try-again\"),e.params.behaviour.enableSolutionsButton&&e.showButton(\"show-solution\"),e.hideButton(\"check-answer\"),e.disableDraggables()),e.$introduction.parent().focus()},!e.params.behaviour.instantFeedback),e.addButton(\"show-solution\",e.params.showSolution,function(){e.droppables.forEach(function(e){e.showSolution()}),e.draggables.forEach(function(t){return e.setDraggableAriaLabel(t)}),e.disableDraggables(),e.removeAllDroppablesFromControls(),e.hideButton(\"show-solution\")},e.initShowShowSolutionButton||!1),e.addButton(\"try-again\",e.params.tryAgain,function(){e.answered&&e.resetDraggables(),e.answered=!1,e.hideEvaluation(),e.hideExplanation(),e.hideButton(\"try-again\"),e.hideButton(\"show-solution\"),e.params.behaviour.instantFeedback?e.enableAllDropzonesAndDraggables():(e.showButton(\"check-answer\"),e.enableDraggables()),e.hideAllSolutions(),e.stopWatch.reset(),e.read(e.params.taskDescription)},e.initShowTryAgainButton||!1)},n.prototype.removeAllElementsFromDragControl=function(){var e=this;this.dragControls.elements.forEach(function(t){return e.dragControls.removeElement(t)})},n.prototype.keyboardDraggableSelected=function(e){var t=this.selectedElement,r=void 0!==this.selectedElement,n=this.selectedElement===e.element;r&&(this.selectedElement=void 0,this.trigger(\"stop\",{element:t})),r&&n||this.isElementDisabled(e.element)||(this.selectedElement=e.element,this.trigger(\"start\",{element:e.element}),this.focusOnFirstEmptyDropZone())},n.prototype.focusOnFirstEmptyDropZone=function(){var e=this.droppables.filter(function(e){return!e.hasDraggable()})[0],t=e.getElement();this.dropControls.setTabbable(t),t.focus()},n.prototype.isElementDisabled=function(e){return\"true\"===e.getAttribute(\"aria-disabled\")},n.prototype.keyboardDroppableSelected=function(e){var t=this,r=e.element,n=t.getDroppableByElement(r),o=t.getDraggableByElement(this.selectedElement),a=this.params.behaviour.instantFeedback&&n&&n.isCorrect(),i=!this.params.behaviour.instantFeedback&&n.hasFeedback();if(o&&n&&!a){var s=t.selectedElement;t.drop(o,n),t.selectedElement=void 0,this.trigger(\"stop\",{element:s,target:n.getElement()})}else if(n&&n.hasDraggable()&&!i&&!a){var l=r.querySelector(\"[aria-grabbed]\");this.createConfirmResetDialog(function(){t.revert(t.getDraggableByElement(l))}).show()}},n.prototype.toggleDraggablesContainer=function(){var e=0===this.$draggables.children().length;this.$draggables.toggleClass(\"hide\",e)},n.prototype.createConfirmResetDialog=function(e,t){var n=this,o=new r({headerText:n.params.resetDropTitle,dialogText:n.params.resetDropDescription});return o.appendTo(document.body),o.on(\"confirmed\",e,t||this),o},n.prototype.showDropzoneFeedback=function(){var e=this;this.droppables.forEach(function(t){t.addFeedback();var r=t.containedDraggable;t&&r&&(e.setDroppableLabel(t.getElement(),r.getElement().textContent,t.getIndex()),e.setDraggableAriaLabel(r))})},n.prototype.showExplanation=function(){var e=this,t=[];this.droppables.forEach(function(e){var r=e.containedDraggable;e&&r&&(e.isCorrect()&&e.correctFeedback&&t.push({correct:r.text,text:e.correctFeedback}),!e.isCorrect()&&e.incorrectFeedback&&t.push({correct:e.text,wrong:r.text,text:e.incorrectFeedback}))}),0!==t.length&&this.setExplanation(t,e.params.feedbackHeader)},n.prototype.showEvaluation=function(e){this.hideEvaluation(),this.showDropzoneFeedback(),this.showExplanation();var t=this.calculateScore(),r=this.droppables.length;if(!e){var n=this.createXAPIEventTemplate(\"answered\");this.addQuestionToXAPI(n),this.addResponseToXAPI(n),this.trigger(n)}var o=H5P.Question.determineOverallFeedback(this.params.overallFeedback,t\/r).replace(\/@score\/g,t.toString()).replace(\/@total\/g,r.toString());return t===r&&(this.hideButton(\"check-answer\"),this.hideButton(\"show-solution\"),this.hideButton(\"try-again\"),this.disableDraggables()),this.trigger(\"resize\"),this.setFeedback(o,t,r,this.params.scoreBarLabel),t===r},n.prototype.calculateScore=function(){return this.droppables.reduce(function(e,t){return e+(t.isCorrect()?1:0)},0)},n.prototype.hideEvaluation=function(){this.removeFeedback(),this.trigger(\"resize\")},n.prototype.hideExplanation=function(){this.setExplanation(),this.trigger(\"resize\")},n.prototype.hideAllSolutions=function(){this.droppables.forEach(function(e){e.hideSolution()}),this.trigger(\"resize\")},n.prototype.addTaskTo=function(t){var r=this;r.widest=0,r.widestDraggable=0,r.droppables=[],r.draggables=[],r.$taskContainer=e(\"<div\/>\",{class:\"h5p-drag-task\"}),r.$draggables=e(\"<div\/>\",{class:\"h5p-drag-draggables-container\"}),r.$wordContainer=e(\"<div\/>\",{class:\"h5p-drag-droppable-words\"}),(0,o.parseText)(r.textFieldHtml).forEach(function(e){if(r.isAnswerPart(e)){var t=(0,o.lex)(e),n=r.createDraggable(t.text),a=r.createDroppable(t.text,t.tip,t.correctFeedback,t.incorrectFeedback);r.params.behaviour.instantFeedback&&n.getDraggableElement().on(\"dragstop\",function(){a.addFeedback(),r.instantFeedbackEvaluation()})}else{var i=l.default.createElementWithTextPart(e);r.$wordContainer.append(i)}}),r.shuffleAndAddDraggables(r.$draggables),r.$draggables.appendTo(r.$taskContainer),r.$wordContainer.appendTo(r.$taskContainer),r.$taskContainer.appendTo(t),r.addDropzoneWidth()},n.prototype.isAnswerPart=function(e){return l.default.startsWith(\"*\",e)&&l.default.endsWith(\"*\",e)},n.prototype.addDropzoneWidth=function(){var e=this,t=0,r=0,n=parseInt(this.$inner.css(\"font-size\"),10),o=3*n,a=n;this.draggables.forEach(function(e){var n=e.getDraggableElement(),o=n.clone().css({position:\"absolute\",\"white-space\":\"nowrap\",width:\"auto\",padding:0,margin:0}).html(e.getAnswerText()).appendTo(n.parent()),i=o.outerWidth();r=i>r?i:r,o.text().length>=20&&(o.html(e.getShortFormat()),i=o.width()),i+a>t&&(t=i+a),o.remove()}),t<o&&(t=o),this.widestDraggable=r,this.widest=t,this.droppables.forEach(function(t){t.getDropzone().width(e.widest)})},n.prototype.createDraggable=function(t){var r=this,n=e(\"<div\/>\",{html:t,role:\"button\",\"aria-grabbed\":\"false\",tabindex:\"-1\"}).draggable({revert:function(e){return e||r.revert(o),!1},drag:r.propagateDragEvent(\"drag\",r),start:r.propagateDragEvent(\"start\",r),stop:function(e){r.trigger(\"stop\",{element:o.getElement(),target:e.target})},containment:r.$taskContainer}),o=new c.default(t,n,r.draggables.length);return o.on(\"addedToZone\",function(){r.triggerXAPI(\"interacted\")}),r.draggables.push(o),o},n.prototype.createDroppable=function(t,r,n,o){var a=this,i=this.draggables.length,s=e(\"<div\/>\",{class:\"h5p-drag-dropzone-container\"}),l=e(\"<div\/>\",{\"aria-dropeffect\":\"none\",\"aria-label\":this.params.dropZoneIndex.replace(\"@index\",i.toString())+\" \"+this.params.empty.replace(\"@index\",i.toString()),tabindex:\"-1\"}).appendTo(s).droppable({tolerance:\"pointer\",drop:function(e,t){var r=a.getDraggableByElement(t.draggable[0]),n=a.getDroppableByElement(e.target);r&&n&&a.drop(r,n)}}),u=new p.default(t,r,n,o,l,s,i,a.params);return u.appendDroppableTo(a.$wordContainer),a.droppables.push(u),u},n.prototype.propagateDragEvent=l.default.curry(function(e,t,r){t.trigger(e,{element:r.target})}),n.prototype.revert=function(e){var t=e.removeFromZone(),r=t?t.getElement():void 0;e.revertDraggableTo(this.$draggables),this.setDraggableAriaLabel(e),this.trigger(\"revert\",{element:e.getElement(),target:r}),this.trigger(\"resize\")},n.prototype.drop=function(e,t){var r=this;r.answered=!0,e.removeFromZone();var n=t.appendInsideDroppableTo(this.$draggables);n&&r.trigger(\"revert\",{element:n.getElement(),target:t.getElement()}),t.setDraggable(e),e.appendDraggableTo(t.getDropzone()),r.params.behaviour.instantFeedback&&(t.addFeedback(),r.instantFeedbackEvaluation(),r.params.behaviour.enableRetry&&!t.isCorrect()||t.disableDropzoneAndContainedDraggable()),this.trigger(\"drop\",{element:e.getElement(),target:t.getElement()}),this.trigger(\"resize\"),t.getElement().focus()},n.prototype.shuffleAndAddDraggables=function(e){var t=this;return l.default.shuffle(this.draggables).map(function(e,t){return e.setIndex(t)}).map(function(r){return t.addDraggableToContainer(e,r)}).map(function(e){return t.setDraggableAriaLabel(e)}).map(function(e){return t.addDraggableToControls(t.dragControls,e)})},n.prototype.setDraggableAriaLabel=function(e){e.text;if(e.isInsideDropZone()){e.getInsideDropzone().getDropzone().attr(\"aria-label\")}var t=this.draggables.length,r=this.params.draggableIndex.replace(\"@text\",e.text).replace(\"@index\",(e.getIndex()+1).toString()).replace(\"@count\",t.toString()),n=this.isGrabbed(e.getElement())?this.params.grabbed:\"\";return e.$draggable.attr(\"aria-label\",r+\" \"+n),e},n.prototype.isGrabbed=function(e){return\"true\"===e.getAttribute(\"aria-grabbed\")},n.prototype.addDraggableToContainer=function(e,t){return t.appendDraggableTo(e),t},n.prototype.addDraggableToControls=function(e,t){return e.addElement(t.getElement()),t},n.prototype.instantFeedbackEvaluation=function(){var e=this;e.isAllAnswersFilled()?(e.params.behaviour.enableSolutionsButton&&e.showButton(\"show-solution\"),e.params.behaviour.enableRetry&&e.showButton(\"try-again\"),e.showEvaluation()):(e.hideButton(\"try-again\"),e.hideButton(\"show-solution\"),e.hideEvaluation())},n.prototype.isAllAnswersFilled=function(){return this.draggables.every(function(e){return e.isInsideDropZone()})},n.prototype.enableAllDropzonesAndDraggables=function(){this.enableDraggables(),this.droppables.forEach(function(e){e.enableDropzone()})},n.prototype.disableDraggables=function(){this.draggables.forEach(function(e){e.disableDraggable()})},n.prototype.enableDraggables=function(){this.draggables.forEach(function(e){e.enableDraggable()})},n.prototype.getAnswerGiven=function(){return this.answered},n.prototype.getScore=function(){return this.calculateScore()},n.prototype.getMaxScore=function(){return this.droppables.length},n.prototype.getTitle=function(){return H5P.createTitle(this.params.taskDescription)},n.prototype.toggleDropEffect=function(){var e=void 0!==this.selectedElement;this.ariaDropControls[e?\"setAllToMove\":\"setAllToNone\"]()},n.prototype.getDraggableByElement=function(e){return this.draggables.filter(function(t){return t.$draggable.get(0)===e},this)[0]},n.prototype.getDroppableByElement=function(e){return this.droppables.filter(function(t){return t.$dropzone.get(0)===e},this)[0]},n.prototype.showSolutions=function(){this.showEvaluation(!0),this.droppables.forEach(function(e){e.addFeedback(),e.showSolution()}),this.removeAllDroppablesFromControls(),this.disableDraggables(),this.hideButton(\"try-again\"),this.hideButton(\"show-solution\"),this.hideButton(\"check-answer\"),this.trigger(\"resize\")},n.prototype.resetTask=function(){var e=this;e.answered=!1,e.resetDraggables(),e.hideEvaluation(),e.enableAllDropzonesAndDraggables(),e.hideButton(\"try-again\"),e.hideButton(\"show-solution\"),e.params.behaviour.instantFeedback||e.showButton(\"check-answer\"),e.hideAllSolutions(),this.trigger(\"resize\")},n.prototype.resetDraggables=function(){l.default.shuffle(this.draggables).forEach(this.revert,this)},n.prototype.getCurrentState=function(){var e=this;if(void 0!==this.draggables)return this.draggables.filter(function(e){return null!==e.getInsideDropzone()}).map(function(t){return{draggable:t.getInitialIndex(),droppable:e.droppables.indexOf(t.getInsideDropzone())}})},n.prototype.setH5PUserState=function(){var e=this,t=this;void 0!==this.previousState&&(this.previousState.forEach(function(r){if(!t.isValidIndex(r.draggable)||!t.isValidIndex(r.droppable))throw new Error(\"Stored user state is invalid\");var n=e.getDraggableByInitialIndex(r.draggable),o=t.droppables[r.droppable];t.drop(n,o),t.params.behaviour.instantFeedback&&(null!==o&&o.addFeedback(),o.isCorrect()&&o.disableDropzoneAndContainedDraggable())}),t.params.behaviour.instantFeedback&&t.isAllAnswersFilled()&&!t.showEvaluation()&&(t.params.behaviour.enableSolutionsButton&&(t.initShowShowSolutionButton=!0),t.params.behaviour.enableRetry&&(t.initShowTryAgainButton=!0)))},n.prototype.isValidIndex=function(e){return!isNaN(e)&&e<this.draggables.length&&e>=0},n.prototype.getDraggableByInitialIndex=function(e){return this.draggables.filter(function(t){return t.hasInitialIndex(e)})[0]},n.prototype.getXAPIData=function(){var e=this.createXAPIEventTemplate(\"answered\");return this.addQuestionToXAPI(e),this.addResponseToXAPI(e),{statement:e.data.statement}},n.prototype.addQuestionToXAPI=function(t){var r=t.getVerifiedStatementValue([\"object\",\"definition\"]);e.extend(r,this.getxAPIDefinition())},n.prototype.getxAPIDefinition=function(){var e={};e.interactionType=\"fill-in\",e.type=\"http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction\";var t=this.textFieldHtml,r=this.params.taskDescription+\"<br\/>\";return e.description={\"en-US\":r+this.replaceSolutionsWithBlanks(t)},e.correctResponsesPattern=[this.getSolutionsFromQuestion(t)],e},n.prototype.addResponseToXAPI=function(e){var t,r=this,n=r.getScore(),o=r.droppables.length;e.setScoredResult(n,o,r);var a={min:0,raw:n,max:o,scaled:Math.round(n\/o*1e4)\/1e4};r.stopWatch&&(t=\"PT\"+r.stopWatch.stop()+\"S\"),e.data.statement.result={response:r.getXAPIResponse(),score:a,duration:t,completion:!0}},n.prototype.getXAPIResponse=function(){return this.droppables.map(function(e){return e.hasDraggable()?e.containedDraggable.text:\"\"}).join(\"[,]\")},n.prototype.replaceSolutionsWithBlanks=function(e){var t=this;return(0,o.parseText)(e).map(function(e){return t.isAnswerPart(e)?\"__________\":e}).join(\"\")},n.prototype.getSolutionsFromQuestion=function(e){return(0,o.parseText)(e).filter(this.isAnswerPart).map(function(e){return(0,o.lex)(e)}).map(function(e){return e.text}).join(\"[,]\")},n}(H5P.jQuery,H5P.Question,H5P.ConfirmationDialog),t.default=H5P.DragText},function(e,t){},function(e,t,r){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),a=r(1),i=r(0),s=(0,a.setAttribute)(\"aria-grabbed\"),l=(0,a.attributeEquals)(\"aria-grabbed\",\"true\"),u=(0,i.filter)((0,a.hasAttribute)(\"aria-grabbed\")),c=(0,i.compose)((0,i.forEach)((0,a.setAttribute)(\"aria-grabbed\",\"false\")),u),d=(0,i.compose)((0,i.some)(l),u),p=function(){function e(){n(this,e)}return o(e,[{key:\"init\",value:function(e){this.controls=e,this.controls.on(\"select\",this.select,this)}},{key:\"addElement\",value:function(e){s(\"false\",e),this.controls.addElement(e)}},{key:\"setAllGrabbedToFalse\",value:function(){c(this.controls.elements)}},{key:\"hasAnyGrabbed\",value:function(){return d(this.controls.elements)}},{key:\"select\",value:function(e){var t=e.element,r=l(t);this.setAllGrabbedToFalse(),r||s(\"true\",t)}}]),e}();t.default=p},function(e,t,r){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),a=r(1),i=r(0),s=(0,a.setAttribute)(\"aria-dropeffect\",\"none\"),l=(0,a.setAttribute)(\"aria-dropeffect\",\"move\"),u=(0,i.filter)((0,a.hasAttribute)(\"aria-dropeffect\")),c=(0,i.compose)((0,i.forEach)(l),u),d=(0,i.compose)((0,i.forEach)(s),u),p=function(){function e(){n(this,e)}return o(e,[{key:\"init\",value:function(e){this.controls=e}},{key:\"setAllToMove\",value:function(){c(this.controls.elements)}},{key:\"setAllToNone\",value:function(){d(this.controls.elements)}}]),e}();t.default=p,p.DropEffect={COPY:\"copy\",MOVE:\"move\",EXECUTE:\"execute\",POPUP:\"popup\",NONE:\"none\"}},function(e,t,r){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},a=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),i=r(1),s=r(0),l=r(8),u=(0,i.removeAttribute)(\"tabindex\"),c=((0,s.forEach)(u),(0,i.setAttribute)(\"tabindex\",\"0\")),d=(0,i.setAttribute)(\"tabindex\",\"-1\"),p=(0,i.hasAttribute)(\"tabindex\"),h=function(){function e(t){n(this,e),o(this,(0,l.Eventful)()),this.plugins=t||[],this.elements=[],this.negativeTabIndexAllowed=!1,this.on(\"nextElement\",this.nextElement,this),this.on(\"previousElement\",this.previousElement,this),this.initPlugins()}return a(e,[{key:\"addElement\",value:function(e){this.elements.push(e),this.firesEvent(\"addElement\",e),1===this.elements.length&&this.setTabbable(e)}},{key:\"insertElementAt\",value:function(e,t){this.elements.splice(t,0,e),this.firesEvent(\"addElement\",e),1===this.elements.length&&this.setTabbable(e)}},{key:\"removeElement\",value:function(e){this.elements=(0,s.without)([e],this.elements),p(e)&&(this.setUntabbable(e),this.elements[0]&&this.setTabbable(this.elements[0])),this.firesEvent(\"removeElement\",e)}},{key:\"count\",value:function(){return this.elements.length}},{key:\"firesEvent\",value:function(e,t){var r=this.elements.indexOf(t);return this.fire(e,{element:t,index:r,elements:this.elements,oldElement:this.tabbableElement})}},{key:\"nextElement\",value:function(e){var t=e.index,r=t===this.elements.length-1,n=this.elements[r?0:t+1];this.setTabbable(n),n.focus()}},{key:\"setTabbable\",value:function(e){(0,s.forEach)(this.setUntabbable.bind(this),this.elements),c(e),this.tabbableElement=e}},{key:\"setUntabbable\",value:function(e){this.negativeTabIndexAllowed?d(e):u(e)}},{key:\"previousElement\",value:function(e){var t=e.index,r=0===t,n=this.elements[r?this.elements.length-1:t-1];this.setTabbable(n),n.focus()}},{key:\"useNegativeTabIndex\",value:function(){this.negativeTabIndexAllowed=!0,this.elements.forEach(function(e){e.hasAttribute(\"tabindex\")||d(e)})}},{key:\"initPlugins\",value:function(){this.plugins.forEach(function(e){void 0!==e.init&&e.init(this)},this)}}]),e}();t.default=h},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});t.Eventful=function(){return{listeners:{},on:function(e,t,r){var n={listener:t,scope:r};return this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(n),this},fire:function(e,t){return(this.listeners[e]||[]).every(function(e){return!1!==e.listener.call(e.scope||this,t)})},propagate:function(e,t){var r=this;e.forEach(function(e){return t.on(e,function(t){return r.fire(e,t)})})}}}},function(e,t,r){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),a=function(){function e(){n(this,e),this.selectability=!0}return o(e,[{key:\"init\",value:function(e){this.boundHandleKeyDown=this.handleKeyDown.bind(this),this.controls=e,this.controls.on(\"addElement\",this.listenForKeyDown,this),this.controls.on(\"removeElement\",this.removeKeyDownListener,this)}},{key:\"listenForKeyDown\",value:function(e){e.element.addEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"removeKeyDownListener\",value:function(e){e.element.removeEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"handleKeyDown\",value:function(e){switch(e.which){case 13:case 32:this.select(e.target),e.preventDefault();break;case 37:case 38:this.hasChromevoxModifiers(e)||(this.previousElement(e.target),e.preventDefault());break;case 39:case 40:this.hasChromevoxModifiers(e)||(this.nextElement(e.target),e.preventDefault())}}},{key:\"hasChromevoxModifiers\",value:function(e){return e.shiftKey||e.ctrlKey}},{key:\"previousElement\",value:function(e){this.controls.firesEvent(\"previousElement\",e)}},{key:\"nextElement\",value:function(e){this.controls.firesEvent(\"nextElement\",e)}},{key:\"select\",value:function(e){this.selectability&&!1!==this.controls.firesEvent(\"before-select\",e)&&(this.controls.firesEvent(\"select\",e),this.controls.firesEvent(\"after-select\",e))}},{key:\"disableSelectability\",value:function(){this.selectability=!1}},{key:\"enableSelectability\",value:function(){this.selectability=!0}}]),e}();t.default=a},function(e,t,r){\"use strict\";r(4),H5P=H5P||{},H5P.DragText=r(3).default},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),H5P.TextDraggable=function(e){function t(t,r,n){H5P.EventDispatcher.call(this);var o=this;o.text=t,o.insideDropzone=null,o.$draggable=e(r),o.index=n,o.initialIndex=n,o.shortFormat=o.text,o.shortFormat.length>20&&(o.shortFormat=o.shortFormat.slice(0,17)+\"...\")}return t.prototype=Object.create(H5P.EventDispatcher.prototype),t.prototype.constructor=t,t.prototype.getIndex=function(){return this.index},t.prototype.setIndex=function(e){return this.index=e,this},t.prototype.getInitialIndex=function(){return this.initialIndex},t.prototype.hasInitialIndex=function(e){return this.initialIndex===e},t.prototype.appendDraggableTo=function(e){this.$draggable.detach().css({left:0,top:0}).appendTo(e)},t.prototype.revertDraggableTo=function(e){var t=this.$draggable.offset().left-e.offset().left,r=this.$draggable.offset().top-e.offset().top;this.$draggable.detach().prependTo(e).css({left:t,top:r}).animate({left:0,top:0})},t.prototype.toggleDroppedFeedback=function(e){e?this.$draggable.addClass(\"h5p-drag-dropped\"):this.$draggable.removeClass(\"h5p-drag-dropped\")},t.prototype.disableDraggable=function(){this.$draggable.draggable({disabled:!0})},t.prototype.enableDraggable=function(){this.$draggable.draggable({disabled:!1})},t.prototype.getDraggableElement=function(){return this.$draggable},t.prototype.getElement=function(){return this.$draggable.get(0)},t.prototype.removeFromZone=function(){var e=this.insideDropzone;return null!==this.insideDropzone&&(this.insideDropzone.removeFeedback(),this.insideDropzone.removeDraggable()),this.toggleDroppedFeedback(!1),this.removeShortFormat(),this.insideDropzone=null,e},t.prototype.addToZone=function(e){null!==this.insideDropzone&&this.insideDropzone.removeDraggable(),this.toggleDroppedFeedback(!0),this.insideDropzone=e,this.setShortFormat(),this.trigger(\"addedToZone\")},t.prototype.getAnswerText=function(){return this.text},t.prototype.setShortFormat=function(){this.$draggable.html(this.shortFormat)},t.prototype.getShortFormat=function(){return this.shortFormat},t.prototype.removeShortFormat=function(){this.$draggable.html(this.text)},t.prototype.getInsideDropzone=function(){return this.insideDropzone},t.prototype.isInsideDropZone=function(){return!!this.insideDropzone},t}(H5P.jQuery),t.default=H5P.TextDraggable},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),H5P.TextDroppable=function(e){function t(t,n,o,a,i,s,l,u){var c=this;c.text=t,c.tip=n,c.correctFeedback=o,c.incorrectFeedback=a,c.index=l,c.params=u,c.containedDraggable=null,c.$dropzone=e(i),c.$dropzoneContainer=e(s),c.tip&&(c.$tip=H5P.JoubelUI.createTip(c.tip,{tipLabel:c.params.tipLabel}),c.$tip.attr(\"tabindex\",\"-1\"),c.$dropzoneContainer.append(c.$tip),c.$dropzone.focus(function(){return c.$tip.attr(\"tabindex\",\"0\")}),c.$dropzone.blur(function(){return c.removeTipTabIndexIfNoFocus()}),c.$tip.blur(function(){return c.removeTipTabIndexIfNoFocus()})),c.$incorrectText=e(\"<div\/>\",{html:c.params.incorrectText+\" \"+c.params.correctAnswer,class:\"correct-answer\"}),c.$correctText=e(\"<div\/>\",{html:c.params.correctText,class:\"correct-answer\"}),c.$showSolution=e(\"<div\/>\",{class:r}).appendTo(c.$dropzoneContainer).hide()}var r=\"h5p-drag-show-solution-container\",n=\"h5p-drag-correct-feedback\",o=\"h5p-drag-wrong-feedback\";return t.prototype.removeTipTabIndexIfNoFocus=function(){var e=this;setTimeout(function(){e.$dropzone.is(\":focus\")||e.$tip.is(\":focus\")||e.$tip.attr(\"tabindex\",\"-1\")},0)},t.prototype.showSolution=function(){null===this.containedDraggable||this.containedDraggable.getAnswerText()!==this.text?(this.$showSolution.html(this.text),this.$showSolution.prepend(this.$incorrectText)):this.$showSolution.prepend(this.$correctText),this.$showSolution.show()},t.prototype.hideSolution=function(){this.$showSolution.html(\"\"),this.$showSolution.hide()},t.prototype.getElement=function(){return this.$dropzone.get(0)},t.prototype.appendDroppableTo=function(e){this.$dropzoneContainer.appendTo(e)},t.prototype.appendInsideDroppableTo=function(e){if(null!==this.containedDraggable)return this.containedDraggable.revertDraggableTo(e),this.containedDraggable},t.prototype.setDraggable=function(e){var t=this;t.containedDraggable!==e&&(null!==t.containedDraggable&&t.containedDraggable.removeFromZone(),t.containedDraggable=e,e.addToZone(t))},t.prototype.hasDraggable=function(){return!!this.containedDraggable},t.prototype.removeDraggable=function(){null!==this.containedDraggable&&(this.containedDraggable=null)},t.prototype.isCorrect=function(){return null!==this.containedDraggable&&this.containedDraggable.getAnswerText()===this.text},t.prototype.addFeedback=function(){this.isCorrect()?(this.$dropzone.removeClass(o).addClass(n),this.containedDraggable.getDraggableElement().removeClass(\"h5p-drag-draggable-wrong\").addClass(\"h5p-drag-draggable-correct\")):null===this.containedDraggable?this.$dropzone.removeClass(o).removeClass(n):(this.$dropzone.removeClass(n).addClass(o),null!==this.containedDraggable&&this.containedDraggable.getDraggableElement().addClass(\"h5p-drag-draggable-wrong\").removeClass(\"h5p-drag-draggable-correct\"))},t.prototype.removeFeedback=function(){this.$dropzone.removeClass(o).removeClass(n),null!==this.containedDraggable&&this.containedDraggable.getDraggableElement().removeClass(\"h5p-drag-draggable-wrong\").removeClass(\"h5p-drag-draggable-correct\")},t.prototype.hasFeedback=function(){return this.$dropzone.hasClass(o)||this.$dropzone.hasClass(n)},t.prototype.setShortFormat=function(){null!==this.containedDraggable&&this.containedDraggable.setShortFormat()},t.prototype.disableDropzoneAndContainedDraggable=function(){null!==this.containedDraggable&&this.containedDraggable.disableDraggable(),this.$dropzone.droppable({disabled:!0})},t.prototype.enableDropzone=function(){this.$dropzone.droppable({disabled:!1})},t.prototype.removeShortFormat=function(){null!==this.containedDraggable&&this.containedDraggable.removeShortFormat()},t.prototype.getDropzone=function(){return this.$dropzone},t.prototype.getIndex=function(){return this.index},t}(H5P.jQuery),t.default=H5P.TextDroppable},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.lex=t.parseText=void 0;var n=r(2),o=function(e){return e&&e.__esModule?e:{default:e}}(n),a=function(e){return e.split(\/(\\*.*?\\*)\/).filter(function(e){return e.length>0})},i=function(e){var t=e.match(\/(:([^\\\\*]+))\/g),r=e.match(\/(\\\\\\+([^\\\\*:]+))\/g),n=e.match(\/(\\\\\\-([^\\\\*:]+))\/g),a=o.default.cleanCharacter(\"*\",e);return t&&(a=a.replace(t,\"\"),t=t[0].replace(\":\",\"\"),t=t.replace(\/\\s+$\/,\"\")),r&&(a=a.replace(r,\"\"),r=r[0].replace(\"\\\\+\",\"\"),r=r.replace(\/\\s+$\/,\"\")),n&&(a=a.replace(n,\"\"),n=n[0].replace(\"\\\\-\",\"\"),n=n.replace(\/\\s+$\/,\"\")),a=a.replace(\/\\s+$\/,\"\"),{tip:t,correctFeedback:r,incorrectFeedback:n,text:a}};t.parseText=a,t.lex=i},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=n||{};n.DragText=n.DragText||{},n.DragText.StopWatch=function(){function e(){this.duration=0}return e.prototype.start=function(){return this.startTime=Date.now(),this},e.prototype.stop=function(){return this.duration=this.duration+Date.now()-this.startTime,this.passedTime()},e.prototype.reset=function(){this.duration=0,this.startTime=Date.now()},e.prototype.passedTime=function(){return Math.round(this.duration\/10)\/100},e}(),t.default=n.DragText.StopWatch}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/Shepherd-1.0\/scripts\/shepherd.js?ver=1.0.3":"\nvar oldShepherd = window.Shepherd;\r\n\r\n(function(root, Tether, factory ) {\r\n  if (typeof define === 'function' && define.amd) {\r\n    define([\"tether\"], factory);\r\n  } else if (typeof exports === 'object') {\r\n    module.exports = factory(require('tether'));\r\n  } else {\r\n    root.Shepherd = factory(Tether);\r\n  }\r\n}(this, H5P.Tether, function(Tether) {\r\n\r\n\/* global Tether *\/\r\n\r\n'use strict';\r\n\r\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\r\n\r\nvar _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_again) { var object = _x4, property = _x5, receiver = _x6; desc = parent = getter = undefined; _again = false; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x4 = parent; _x5 = property; _x6 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\r\n\r\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\r\n\r\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }\r\n\r\nvar _Tether$Utils = Tether.Utils;\r\nvar Evented = _Tether$Utils.Evented;\r\nvar addClass = _Tether$Utils.addClass;\r\nvar extend = _Tether$Utils.extend;\r\nvar hasClass = _Tether$Utils.hasClass;\r\nvar removeClass = _Tether$Utils.removeClass;\r\nvar uniqueId = _Tether$Utils.uniqueId;\r\n\r\nvar Shepherd = new Evented();\r\n\r\nvar ATTACHMENT = {\r\n  'top': 'bottom center',\r\n  'left': 'middle right',\r\n  'right': 'middle left',\r\n  'bottom': 'top center',\r\n  'center': 'middle center'\r\n};\r\n\r\nfunction createFromHTML(html) {\r\n  var el = document.createElement('div');\r\n  el.innerHTML = html;\r\n  return el.children[0];\r\n}\r\n\r\nfunction matchesSelector(el, sel) {\r\n  var matches = undefined;\r\n  if (typeof el.matches !== 'undefined') {\r\n    matches = el.matches;\r\n  } else if (typeof el.matchesSelector !== 'undefined') {\r\n    matches = el.matchesSelector;\r\n  } else if (typeof el.msMatchesSelector !== 'undefined') {\r\n    matches = el.msMatchesSelector;\r\n  } else if (typeof el.webkitMatchesSelector !== 'undefined') {\r\n    matches = el.webkitMatchesSelector;\r\n  } else if (typeof el.mozMatchesSelector !== 'undefined') {\r\n    matches = el.mozMatchesSelector;\r\n  } else if (typeof el.oMatchesSelector !== 'undefined') {\r\n    matches = el.oMatchesSelector;\r\n  }\r\n  return matches.call(el, sel);\r\n}\r\n\r\nfunction parseShorthand(obj, props) {\r\n  if (obj === null || typeof obj === 'undefined') {\r\n    return obj;\r\n  } else if (typeof obj === 'object') {\r\n    return obj;\r\n  }\r\n\r\n  var vals = obj.split(' ');\r\n  var valsLen = vals.length;\r\n  var propsLen = props.length;\r\n  if (valsLen > propsLen) {\r\n    vals[0] = vals.slice(0, valsLen - propsLen + 1).join(' ');\r\n    vals.splice(1, (valsLen, propsLen));\r\n  }\r\n\r\n  var out = {};\r\n  for (var i = 0; i < propsLen; ++i) {\r\n    var prop = props[i];\r\n    out[prop] = vals[i];\r\n  }\r\n\r\n  return out;\r\n}\r\n\r\nvar Step = (function (_Evented) {\r\n  function Step(tour, options) {\r\n    _classCallCheck(this, Step);\r\n\r\n    _get(Object.getPrototypeOf(Step.prototype), 'constructor', this).call(this, tour, options);\r\n    this.tour = tour;\r\n    this.bindMethods();\r\n    this.setOptions(options);\r\n    return this;\r\n  }\r\n\r\n  _inherits(Step, _Evented);\r\n\r\n  _createClass(Step, [{\r\n    key: 'bindMethods',\r\n    value: function bindMethods() {\r\n      var _this = this;\r\n\r\n      var methods = ['_show', 'show', 'hide', 'isOpen', 'cancel', 'complete', 'scrollTo', 'destroy'];\r\n      methods.map(function (method) {\r\n        _this[method] = _this[method].bind(_this);\r\n      });\r\n    }\r\n  }, {\r\n    key: 'setOptions',\r\n    value: function setOptions() {\r\n      var options = arguments[0] === undefined ? {} : arguments[0];\r\n\r\n      this.options = options;\r\n      this.destroy();\r\n\r\n      this.id = this.options.id || this.id || 'step-' + uniqueId();\r\n\r\n      var when = this.options.when;\r\n      if (when) {\r\n        for (var _event in when) {\r\n          if (({}).hasOwnProperty.call(when, _event)) {\r\n            var handler = when[_event];\r\n            this.on(_event, handler, this);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!this.options.buttons) {\r\n        this.options.buttons = [{\r\n          text: 'Next',\r\n          action: this.tour.next\r\n        }];\r\n      }\r\n    }\r\n  }, {\r\n    key: 'getTour',\r\n    value: function getTour() {\r\n      return this.tour;\r\n    }\r\n  }, {\r\n    key: 'bindAdvance',\r\n    value: function bindAdvance() {\r\n      var _this2 = this;\r\n\r\n      \/\/ An empty selector matches the step element\r\n\r\n      var _parseShorthand = parseShorthand(this.options.advanceOn, ['selector', 'event']);\r\n\r\n      var event = _parseShorthand.event;\r\n      var selector = _parseShorthand.selector;\r\n\r\n      var handler = function handler(e) {\r\n        if (!_this2.isOpen()) {\r\n          return;\r\n        }\r\n\r\n        if (typeof selector !== 'undefined') {\r\n          if (matchesSelector(e.target, selector)) {\r\n            _this2.tour.next();\r\n          }\r\n        } else {\r\n          if (_this2.el && e.target === _this2.el) {\r\n            _this2.tour.next();\r\n          }\r\n        }\r\n      };\r\n\r\n      \/\/ TODO: this should also bind\/unbind on show\/hide\r\n      document.body.addEventListener(event, handler);\r\n      this.on('destroy', function () {\r\n        return document.body.removeEventListener(event, handler);\r\n      });\r\n    }\r\n  }, {\r\n    key: 'getAttachTo',\r\n    value: function getAttachTo() {\r\n      var opts = parseShorthand(this.options.attachTo, ['element', 'on']) || {};\r\n      var selector = opts.element;\r\n\r\n      if (typeof selector === 'string') {\r\n        opts.element = document.querySelector(selector);\r\n\r\n        if (!opts.element) {\r\n          throw new Error('The element for this Shepherd step was not found ' + selector);\r\n        }\r\n      }\r\n\r\n      return opts;\r\n    }\r\n  }, {\r\n    key: 'setupTether',\r\n    value: function setupTether() {\r\n      if (typeof Tether === 'undefined') {\r\n        throw new Error('Using the attachment feature of Shepherd requires the Tether library');\r\n      }\r\n\r\n      var opts = this.getAttachTo();\r\n      var attachment = ATTACHMENT[opts.on || 'right'];\r\n      if (typeof opts.element === 'undefined') {\r\n        opts.element = 'viewport';\r\n        attachment = 'middle center';\r\n      }\r\n\r\n      var tetherOpts = {\r\n        classPrefix: 'shepherd',\r\n        element: this.el,\r\n        constraints: [{\r\n          to: 'window',\r\n          pin: true,\r\n          attachment: 'together'\r\n        }],\r\n        target: opts.element,\r\n        offset: opts.offset || '0 0',\r\n        attachment: attachment\r\n      };\r\n\r\n      if (this.tether) {\r\n        this.tether.destroy();\r\n      }\r\n\r\n      this.tether = new Tether(extend(tetherOpts, this.options.tetherOptions));\r\n    }\r\n  }, {\r\n    key: 'show',\r\n    value: function show() {\r\n      var _this3 = this;\r\n\r\n      if (typeof this.options.beforeShowPromise !== 'undefined') {\r\n        var beforeShowPromise = this.options.beforeShowPromise();\r\n        if (typeof beforeShowPromise !== 'undefined') {\r\n          return beforeShowPromise.then(function () {\r\n            return _this3._show();\r\n          });\r\n        }\r\n      }\r\n      this._show();\r\n    }\r\n  }, {\r\n    key: '_show',\r\n    value: function _show() {\r\n      var _this4 = this;\r\n\r\n      this.trigger('before-show');\r\n\r\n      if (!this.el) {\r\n        this.render();\r\n      }\r\n\r\n      addClass(this.el, 'shepherd-open');\r\n\r\n      document.body.setAttribute('data-shepherd-step', this.id);\r\n\r\n      this.setupTether();\r\n\r\n      if (this.options.scrollTo) {\r\n        setTimeout(function () {\r\n          _this4.scrollTo();\r\n        });\r\n      }\r\n\r\n      this.trigger('show');\r\n    }\r\n  }, {\r\n    key: 'hide',\r\n    value: function hide() {\r\n      this.trigger('before-hide');\r\n\r\n      removeClass(this.el, 'shepherd-open');\r\n\r\n      document.body.removeAttribute('data-shepherd-step');\r\n\r\n      if (this.tether) {\r\n        this.tether.destroy();\r\n      }\r\n      this.tether = null;\r\n\r\n      this.trigger('hide');\r\n    }\r\n  }, {\r\n    key: 'isOpen',\r\n    value: function isOpen() {\r\n      return hasClass(this.el, 'shepherd-open');\r\n    }\r\n  }, {\r\n    key: 'cancel',\r\n    value: function cancel() {\r\n      this.tour.cancel();\r\n      this.trigger('cancel');\r\n    }\r\n  }, {\r\n    key: 'complete',\r\n    value: function complete() {\r\n      this.tour.complete();\r\n      this.trigger('complete');\r\n    }\r\n  }, {\r\n    key: 'scrollTo',\r\n    value: function scrollTo() {\r\n      var _getAttachTo = this.getAttachTo();\r\n\r\n      var element = _getAttachTo.element;\r\n\r\n      if (typeof this.options.scrollToHandler !== 'undefined') {\r\n        this.options.scrollToHandler(element);\r\n      } else if (typeof element !== 'undefined') {\r\n        element.scrollIntoView();\r\n      }\r\n    }\r\n  }, {\r\n    key: 'destroy',\r\n    value: function destroy() {\r\n      if (typeof this.el !== 'undefined') {\r\n        document.body.removeChild(this.el);\r\n        delete this.el;\r\n      }\r\n\r\n      if (this.tether) {\r\n        this.tether.destroy();\r\n      }\r\n      this.tether = null;\r\n\r\n      this.trigger('destroy');\r\n    }\r\n  }, {\r\n    key: 'render',\r\n    value: function render() {\r\n      var _this5 = this;\r\n\r\n      if (typeof this.el !== 'undefined') {\r\n        this.destroy();\r\n      }\r\n\r\n      this.el = createFromHTML('<div class=\\'shepherd-step ' + (this.options.classes || '') + '\\' data-id=\\'' + this.id + '\\' ' + (this.options.idAttribute ? 'id=\"' + this.options.idAttribute + '\"' : '') + '><\/div>');\r\n\r\n      var content = document.createElement('div');\r\n      content.className = 'shepherd-content';\r\n      this.el.appendChild(content);\r\n\r\n      var header = document.createElement('header');\r\n      content.appendChild(header);\r\n\r\n      if (typeof this.options.title !== 'undefined') {\r\n        header.innerHTML += '<h3 class=\\'shepherd-title\\'>' + this.options.title + '<\/h3>';\r\n        this.el.className += ' shepherd-has-title';\r\n      }\r\n\r\n      if (this.options.showCancelLink) {\r\n        var link = createFromHTML('<a href class=\\'shepherd-cancel-link\\'>\u2715<\/a>');\r\n        header.appendChild(link);\r\n\r\n        this.el.className += ' shepherd-has-cancel-link';\r\n\r\n        this.bindCancelLink(link);\r\n      }\r\n\r\n      if (typeof this.options.text !== 'undefined') {\r\n        (function () {\r\n          var text = createFromHTML('<div class=\\'shepherd-text\\'><\/div>');\r\n          var paragraphs = _this5.options.text;\r\n\r\n          if (typeof paragraphs === 'function') {\r\n            paragraphs = paragraphs.call(_this5, text);\r\n          }\r\n\r\n          if (paragraphs instanceof HTMLElement) {\r\n            text.appendChild(paragraphs);\r\n          } else {\r\n            if (typeof paragraphs === 'string') {\r\n              paragraphs = [paragraphs];\r\n            }\r\n\r\n            paragraphs.map(function (paragraph) {\r\n              text.innerHTML += '<p>' + paragraph + '<\/p>';\r\n            });\r\n          }\r\n\r\n          content.appendChild(text);\r\n        })();\r\n      }\r\n\r\n      var footer = document.createElement('footer');\r\n\r\n      if (this.options.buttons) {\r\n        (function () {\r\n          var buttons = createFromHTML('<ul class=\\'shepherd-buttons\\'><\/ul>');\r\n\r\n          _this5.options.buttons.map(function (cfg) {\r\n            var button = createFromHTML('<li><a class=\\'shepherd-button ' + (cfg.classes || '') + '\\'>' + cfg.text + '<\/a>');\r\n            buttons.appendChild(button);\r\n            _this5.bindButtonEvents(cfg, button.querySelector('a'));\r\n          });\r\n\r\n          footer.appendChild(buttons);\r\n        })();\r\n      }\r\n\r\n      content.appendChild(footer);\r\n\r\n      document.body.appendChild(this.el);\r\n\r\n      this.setupTether();\r\n\r\n      if (this.options.advanceOn) {\r\n        this.bindAdvance();\r\n      }\r\n    }\r\n  }, {\r\n    key: 'bindCancelLink',\r\n    value: function bindCancelLink(link) {\r\n      var _this6 = this;\r\n\r\n      link.addEventListener('click', function (e) {\r\n        e.preventDefault();\r\n        _this6.cancel();\r\n      });\r\n    }\r\n  }, {\r\n    key: 'bindButtonEvents',\r\n    value: function bindButtonEvents(cfg, el) {\r\n      var _this7 = this;\r\n\r\n      cfg.events = cfg.events || {};\r\n      if (typeof cfg.action !== 'undefined') {\r\n        \/\/ Including both a click event and an action is not supported\r\n        cfg.events.click = cfg.action;\r\n      }\r\n\r\n      for (var _event2 in cfg.events) {\r\n        if (({}).hasOwnProperty.call(cfg.events, _event2)) {\r\n          var handler = cfg.events[_event2];\r\n          if (typeof handler === 'string') {\r\n            (function () {\r\n              var page = handler;\r\n              handler = function () {\r\n                return _this7.tour.show(page);\r\n              };\r\n            })();\r\n          }\r\n          el.addEventListener(_event2, handler);\r\n        }\r\n      }\r\n\r\n      this.on('destroy', function () {\r\n        for (var _event3 in cfg.events) {\r\n          if (({}).hasOwnProperty.call(cfg.events, _event3)) {\r\n            var handler = cfg.events[_event3];\r\n            el.removeEventListener(_event3, handler);\r\n          }\r\n        }\r\n      });\r\n    }\r\n  }]);\r\n\r\n  return Step;\r\n})(Evented);\r\n\r\nvar Tour = (function (_Evented2) {\r\n  function Tour() {\r\n    var _this8 = this;\r\n\r\n    var options = arguments[0] === undefined ? {} : arguments[0];\r\n\r\n    _classCallCheck(this, Tour);\r\n\r\n    _get(Object.getPrototypeOf(Tour.prototype), 'constructor', this).call(this, options);\r\n    this.bindMethods();\r\n    this.options = options;\r\n    this.steps = this.options.steps || [];\r\n\r\n    \/\/ Pass these events onto the global Shepherd object\r\n    var events = ['complete', 'cancel', 'hide', 'start', 'show', 'active', 'inactive'];\r\n    events.map(function (event) {\r\n      (function (e) {\r\n        _this8.on(e, function (opts) {\r\n          opts = opts || {};\r\n          opts.tour = _this8;\r\n          Shepherd.trigger(e, opts);\r\n        });\r\n      })(event);\r\n    });\r\n\r\n    return this;\r\n  }\r\n\r\n  _inherits(Tour, _Evented2);\r\n\r\n  _createClass(Tour, [{\r\n    key: 'bindMethods',\r\n    value: function bindMethods() {\r\n      var _this9 = this;\r\n\r\n      var methods = ['next', 'back', 'cancel', 'complete', 'hide'];\r\n      methods.map(function (method) {\r\n        _this9[method] = _this9[method].bind(_this9);\r\n      });\r\n    }\r\n  }, {\r\n    key: 'addStep',\r\n    value: function addStep(name, step) {\r\n      if (typeof step === 'undefined') {\r\n        step = name;\r\n      }\r\n\r\n      if (!(step instanceof Step)) {\r\n        if (typeof name === 'string' || typeof name === 'number') {\r\n          step.id = name.toString();\r\n        }\r\n        step = extend({}, this.options.defaults, step);\r\n        step = new Step(this, step);\r\n      } else {\r\n        step.tour = this;\r\n      }\r\n\r\n      this.steps.push(step);\r\n      return this;\r\n    }\r\n  }, {\r\n    key: 'getById',\r\n    value: function getById(id) {\r\n      for (var i = 0; i < this.steps.length; ++i) {\r\n        var step = this.steps[i];\r\n        if (step.id === id) {\r\n          return step;\r\n        }\r\n      }\r\n    }\r\n  }, {\r\n    key: 'getCurrentStep',\r\n    value: function getCurrentStep() {\r\n      return this.currentStep;\r\n    }\r\n  }, {\r\n    key: 'next',\r\n    value: function next() {\r\n      var index = this.steps.indexOf(this.currentStep);\r\n\r\n      if (index === this.steps.length - 1) {\r\n        this.hide(index);\r\n        this.trigger('complete');\r\n        this.done();\r\n      } else {\r\n        this.show(index + 1);\r\n      }\r\n    }\r\n  }, {\r\n    key: 'back',\r\n    value: function back() {\r\n      var index = this.steps.indexOf(this.currentStep);\r\n      this.show(index - 1);\r\n    }\r\n  }, {\r\n    key: 'cancel',\r\n    value: function cancel() {\r\n      if (typeof this.currentStep !== 'undefined') {\r\n        this.currentStep.hide();\r\n      }\r\n      this.trigger('cancel');\r\n      this.done();\r\n    }\r\n  }, {\r\n    key: 'complete',\r\n    value: function complete() {\r\n      if (typeof this.currentStep !== 'undefined') {\r\n        this.currentStep.hide();\r\n      }\r\n      this.trigger('complete');\r\n      this.done();\r\n    }\r\n  }, {\r\n    key: 'hide',\r\n    value: function hide() {\r\n      if (typeof this.currentStep !== 'undefined') {\r\n        this.currentStep.hide();\r\n      }\r\n      this.trigger('hide');\r\n      this.done();\r\n    }\r\n  }, {\r\n    key: 'done',\r\n    value: function done() {\r\n      Shepherd.activeTour = null;\r\n      removeClass(document.body, 'shepherd-active');\r\n      this.trigger('inactive', { tour: this });\r\n    }\r\n  }, {\r\n    key: 'show',\r\n    value: function show() {\r\n      var key = arguments[0] === undefined ? 0 : arguments[0];\r\n\r\n      if (this.currentStep) {\r\n        this.currentStep.hide();\r\n      } else {\r\n        addClass(document.body, 'shepherd-active');\r\n        this.trigger('active', { tour: this });\r\n      }\r\n\r\n      Shepherd.activeTour = this;\r\n\r\n      var next = undefined;\r\n      if (typeof key === 'string') {\r\n        next = this.getById(key);\r\n      } else {\r\n        next = this.steps[key];\r\n      }\r\n\r\n      if (next) {\r\n        this.trigger('show', {\r\n          step: next,\r\n          previous: this.currentStep\r\n        });\r\n\r\n        this.currentStep = next;\r\n        next.show();\r\n      }\r\n    }\r\n  }, {\r\n    key: 'start',\r\n    value: function start() {\r\n      this.trigger('start');\r\n\r\n      this.currentStep = null;\r\n      this.next();\r\n    }\r\n  }]);\r\n\r\n  return Tour;\r\n})(Evented);\r\n\r\nextend(Shepherd, { Tour: Tour, Step: Step, Evented: Evented });\r\nreturn Shepherd;\r\n\r\n}));\r\n\r\nH5P.Shepherd = Shepherd;\r\nwindow.Shepherd = oldShepherd\r\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.GuidedTour-1.0\/scripts\/h5p-guided-tour.js?ver=1.0.5":"\nvar H5P = H5P || {};\n\n\/**\n * H5P Guided tour library.\n *\n * This is a utility library, which does not implement attach. I.e, it has to bee actively used by\n * other libraries\n *\n * @module\n *\/\nH5P.GuidedTour = (function ($) {\n\n  \/**\n   * @type {Object}\n   * @enum\n   *\/\n  var STEP_TYPES = {\n    FIRST: 0,\n    IN_BETWEEN: 1,\n    LAST: 2,\n    SINGLE: 3\n  };\n\n  \/**\n   * A class representing a step\n   *\n   * @class Step\n   * @private\n   * @param  {Object} options\n   * @param  {number} stepType\n   * @param  {H5P.Sheperd.Tour} tour\n   * @param  {Object} highlight Object containing css-properties that will be\n   * @param  {Object} labels Labels for buttons\n   * applied to current guided element (used if highlightElement === true)\n   *\/\n  function Step(options, stepType, tour, highlight, labels) {\n    var self = this;\n    options.classes = options.classes || '';\n    options.classes += ' h5p shepherd-theme-arrows';\n\n    \/\/ ************\n    \/\/ First button\n    \/\/ ************\n    options.buttons = [];\n    if (stepType === STEP_TYPES.FIRST) {\n      \/\/ First step - exit button\n      options.buttons.push({\n        text: labels.exit,\n        classes: 'shepherd-button-secondary',\n        action: tour.cancel\n      });\n\n      options.classes += ' first';\n    }\n    else if (stepType !== STEP_TYPES.SINGLE){\n      \/\/ All others - back button\n      options.buttons.push({\n        text: labels.back,\n        classes: 'shepherd-button-secondary',\n        action: tour.back\n      });\n    }\n\n    \/\/ *************\n    \/\/ Second button\n    \/\/ *************\n    if (stepType === STEP_TYPES.LAST || stepType === STEP_TYPES.SINGLE) {\n      \/\/ Last step - finish button\n      options.buttons.push({\n        text: labels.done,\n        action: tour.complete,\n        classes: 'shepherd-button-primary'\n      });\n\n      options.classes += ' last';\n    }\n    else {\n      \/\/ All others - next button\n      options.buttons.push({\n        text: labels.next,\n        action: tour.next,\n        classes: 'shepherd-button-primary'\n      });\n    }\n\n    var $element;\n    options.when = {\n      show: function () {\n        if (options.highlightElement) {\n          $element = $element || $(options.attachTo.element);\n          $element.css(highlight);\n        }\n        \/\/ Stop propagating click events, so that body don't get them\n        var el = this.el;\n        setTimeout(function() {\n          $(el).on('click.guided-tour', function () {\n            return false;\n          });\n        }, 0);\n      },\n      hide: function () {\n        if (options.highlightElement) {\n          $element = $element || $(options.attachTo.element);\n          for(var property in highlight) {\n            $element.css(property, '');\n          }\n        }\n        var el = this.el;\n        setTimeout(function () {\n          $(el).off('click.guided-tour');\n        }, 0);\n      }\n    };\n\n    if (options.noArrow) {\n      options.classes += ' h5p-guided-tour-step-no-arrow';\n    }\n\n    \/**\n     * Return options needed by Shepherd\n     * @method getOptions\n     * @return {Object}\n     *\/\n    self.getOptions = function () {\n      return options;\n    };\n  }\n\n  \/\/ Factory for creating storage instance\n  var storage = (function () {\n    var instance = {\n      get: function (key, next) {\n        var value;\n\n        \/\/ Get value from browser storage\n        if (window.localStorage !== undefined) {\n          value = !!window.localStorage.getItem(key);\n        }\n\n        \/\/ Try to get a better value from user data storage\n        try {\n          H5P.getUserData(0, key, function (err, result) {\n            if (!err) {\n              value = result;\n            }\n            next(value);\n          });\n        }\n        catch (err) {\n          next(value);\n        }\n      },\n      set: function (key, value) {\n\n        \/\/ Store in browser\n        if (window.localStorage !== undefined) {\n          window.localStorage.setItem(key, value);\n        }\n\n        \/\/ Try to store in user data storage\n        try {\n          H5P.setUserData(0, key, value);\n        }\n        catch (err) { \/* Suppress error messages *\/ }\n      },\n    };\n    return instance;\n  })();\n\n  \/**\n   * Main class\n   * @class H5P.GuidedTour\n   * @param  {Array}   steps   Array of step objects\n   * @param  {Object}  options Options\n   *\/\n  function GuidedTour(steps, options) {\n    var self = this;\n\n    options = $.extend({}, {\n      highlight: {\n        background: '#3288e6',\n        color: '#fff'\n      },\n      labels: {\n        exit: 'Exit',\n        done: 'Done',\n        back: 'Back',\n        next: 'Next'\n      }\n    }, options);\n\n    var tour = new H5P.Shepherd.Tour({\n      defaults: {\n        showCancelLink: true\n      }\n    });\n\n    for (var i = 0, numSteps = steps.length; i < steps.length; i++ ) {\n      var type = numSteps === 1 ? STEP_TYPES.SINGLE : (i === 0 ? STEP_TYPES.FIRST : (i+1 === numSteps ? STEP_TYPES.LAST : STEP_TYPES.IN_BETWEEN));\n      tour.addStep((new Step(steps[i], type, tour, options.highlight, options.labels)).getOptions());\n    }\n\n    \/**\n     * Start the guided tour\n     * @method start\n     * @memberof H5P.GuidedTour\n     * @return {boolean} Shown or not\n     *\/\n    self.start = function (force, started) {\n\n      \/\/ Check if first element in tour exists:\n      if(steps.length !== 0 && steps[0].attachTo && $(steps[0].attachTo.element).length === 0) {\n        return;\n      }\n\n      var start = function () {\n        \/\/ Remember the user has seen this guide\n        self.setTourSeen();\n\n        $('body').off('click.guided-tour');\n\n        try {\n          tour.start();\n        }\n        catch (err) { \/* Suppress error messages \/ Missing tour elements *\/ }\n\n        \/\/ Listen for click-events on body, so we can hide the guide:\n        $('body').on('click.guided-tour', function () {\n          tour.hide();\n        });\n\n        tour.on('complete', function () {\n          $('body').off('click.guided-tour');\n        });\n\n        started();\n      };\n\n      if (force) {\n        start();\n      }\n      else {\n        self.ifTourHasNotBeenSeen(start);\n      }\n    };\n\n    \/**\n     * Hides guide\n     * @method hide\n     * @memberof H5P.GuidedTour\n     *\/\n    self.hide = function () {\n      tour.hide();\n    };\n\n    \/**\n     * Destroys tour, i.e removes DOM elements and event listeners\n     *\/\n    self.destroy = function () {\n      self.hide();\n      $('body').off('click.guided-tour');\n      for (var i = 0; i < tour.steps.length; i++) {\n        var step = tour.steps[i];\n        step && step.destroy();\n      }\n    };\n\n    \/**\n     * Tells if tour is open or not\n     * @method isOpen\n     * @return {Boolean}\n     * @memberof H5P.GuidedTour\n     *\/\n    self.isOpen = function () {\n      var currentStep = tour.getCurrentStep();\n      return currentStep !== undefined && currentStep.isOpen();\n    };\n\n    \/**\n     * Mark this tour as seen. This is persisted using localstorage. If not present, nothing is persisted.\n     *\n     * @method setTourSeen\n     * @memberof H5P.GuidedTour\n     *\/\n    self.setTourSeen = function () {\n      storage.set(options.id + '-seen', true);\n    };\n\n    \/**\n     * Check if this tour has been seen by user. Reads value from localstorage\n     *\n     * @method hasTourBeenSeen\n     * @memberof H5P.GuidedTour\n     * @return {Boolean}\n     *\/\n    self.ifTourHasNotBeenSeen = function (action) {\n      storage.get(options.id + '-seen', function (value) {\n        if (value !== true) {\n          action();\n        }\n      });\n    };\n  }\n\n  return GuidedTour;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.GoToQuestion-1.3\/scripts\/go-to-question.js?ver=1.3.3":"\nH5P.GoToQuestion = (function ($, EventDispatcher, UI) {\n  var KEY_CODE_ENTER = 13;\n  var KEY_CODE_SPACE = 32;\n  var KEY_CODE_LEFT = 37;\n  var KEY_CODE_UP = 38;\n  var KEY_CODE_RIGHT = 39;\n  var KEY_CODE_DOWN = 40;\n\n  \/**\n   * Create a new Go To Question!\n   *\n   * @class H5P.GoToQuestion\n   * @extends H5P.EventDispatcher\n   * @param {Object} parameters\n   *\/\n  function GoToQuestion(parameters) {\n    var self = this;\n\n    \/\/ Initialize event inheritance\n    EventDispatcher.call(self);\n\n    \/\/ Clone parameters so that the parameters doesn't get the default values\n    parameters = $.extend(true, {}, parameters);\n\n    \/\/ Content defaults\n    setDefaults(parameters, {\n      text: 'Choose your side',\n      choices: [\n        {\n          text: \"Dark side\",\n          goTo: 1\n        },\n        {\n          text: \"Light side\",\n          goTo: 0\n        }\n      ],\n      continueButtonLabel: 'Continue'\n    });\n\n    \/\/ Private class variables\n    var $wrapper;\n    var $text;\n    var $choices;\n    var $chosenText;\n    var $continueMsg;\n    var $continueButton;\n\n    \/**\n     * Creates the basic HTML elements that are needed to begin with.\n     *\n     * @private\n     *\/\n    var createHtml = function () {\n      \/\/ Create question wrapper\n      $wrapper = $('<div\/>', {\n        'class': GoToQuestion.htmlClass + '-wrapper'\n      });\n\n      \/\/ Create and append question text\n      var labelId = getNextId();\n      $text = $('<div\/>', {\n        'class': GoToQuestion.htmlClass + '-text',\n        id: labelId,\n        html: parameters.text,\n        appendTo: $wrapper\n      });\n\n      \/\/ Create and append choices wrapper\n      $choices = $('<ul\/>', {\n        'class': GoToQuestion.htmlClass + '-choices',\n        role: 'group',\n        'aria-labelledby': labelId,\n        appendTo: $wrapper\n      });\n\n      \/\/ Append choices to wrapper\n      for (var i = 0; i < parameters.choices.length; i++) {\n        createChoice(parameters.choices[i], i === 0);\n      }\n\n      \/\/ Add chosen option text\n      $chosenText = $('<div\/>', {\n        'class': GoToQuestion.htmlClass + '-chosentext'\n      });\n\n      \/\/ Create continune message\n      $continueMsg = $('<div\/>', {\n        'class': GoToQuestion.htmlClass + '-continuemsg',\n        'aria-live': 'polite',\n        appendTo: $wrapper\n      });\n\n      \/\/ Create continue button\n      $continueButton = UI.createButton({\n        'class': GoToQuestion.htmlClass + '-continue',\n        html: parameters.continueButtonLabel,\n        title: parameters.continueButtonLabel\n      });\n    };\n\n    \/**\n     * Create HTML for choice.\n     *\n     * @private\n     * @param {object} choiceParams\n     * @param {string} choiceParams.text\n     * @param {int} choiceParams.goTo\n     * @param {string} choiceParams.ifChosenText\n     * @param {number} isFirst\n     *\/\n    var createChoice = function (choiceParams, isFirst) {\n      \/\/ Wrapper and list element\n      var $li = $('<li\/>', {\n        'class': GoToQuestion.htmlClass + '-choice',\n        appendTo: $choices\n      });\n\n      \/\/ The button for choosing\n      var $button = $('<div\/>', {\n        'class': GoToQuestion.htmlClass + '-button',\n        role: 'button',\n        'aria-disabled': false,\n        html: choiceParams.text,\n        on: {\n          click: function () {\n            choose.call(this, choiceParams);\n          },\n          keypress: function (event) {\n            if (event.which === KEY_CODE_ENTER || event.which === KEY_CODE_SPACE) {\n              \/\/ Space bar pressed\n              choose.call(this, choiceParams);\n              event.preventDefault();\n            }\n          },\n          keydown: function (event) {\n            var direction;\n            switch (event.which) {\n              case KEY_CODE_LEFT:\n              case KEY_CODE_UP:\n                \/\/ Prev\n                direction = 'previousElementSibling';\n                break;\n\n              case KEY_CODE_RIGHT:\n              case KEY_CODE_DOWN:\n                \/\/ Next\n                direction = 'nextElementSibling';\n                break;\n            }\n\n            if (direction && this.parentElement[direction]) {\n              \/\/ Move focus to prev\/next button\n              var button = this.parentElement[direction].firstElementChild;\n              button.setAttribute('tabindex', '0');\n              button.focus();\n              this.removeAttribute('tabindex');\n              event.preventDefault();\n            }\n          }\n        },\n        appendTo: $li\n      });\n      if (isFirst) {\n        $button.attr('tabindex', '0');\n      }\n    };\n\n    \/**\n     * Choice chosen.\n     *\n     * @private\n     * @param {object} choiceParams\n     * @param {string} choiceParams.text\n     * @param {int} choiceParams.goTo\n     * @param {string} choiceParams.ifChosenText\n     *\/\n    var choose = function (choiceParams) {\n      var $button = $(this);\n      if ($button.attr('aria-disabled') === 'true') {\n        return; \/\/ Prevent choosing another option while animation is running\n      }\n\n      \/\/ Disable all buttons\n      var $buttons = $choices.find('.' + GoToQuestion.htmlClass + '-button')\n          .attr('aria-disabled', true);\n\n      \/\/ Use parent LI as placeholder\n      var $li = $button.parent();\n      $li.css('height', $li[0].getBoundingClientRect().height);\n\n      \/\/ Mark button as chosen and animate\n      var buttonStyle = window.getComputedStyle($button[0]);\n      var borderWidth = parseFloat(buttonStyle.borderTopWidth);\n      $button.addClass(GoToQuestion.htmlClass + '-chosen').css('top', $button[0].offsetTop + borderWidth);\n\n      \/**\n       * Resets the choices UI\n       * @private\n       *\/\n      var resetChoices = function () {\n        $li.css('height', '');\n        $button.removeClass(GoToQuestion.htmlClass + '-chosen').css('top', '');\n        $buttons.attr('aria-disabled', false);\n      };\n\n      \/\/ Animate the choice if we're going to have continue screen\n      if (choiceParams.ifChosenText) {\n        setTimeout(function () {\n          \/\/ Start animation\n          buttonStyle = window.getComputedStyle($button[0]);\n          $button.css('top', $text[0].getBoundingClientRect().height - parseFloat(buttonStyle.paddingTop));\n        }, 0);\n\n        \/\/ Give some time for the animation to play before we continue\n        setTimeout(function () {\n          \/\/ Show message and continue button before proceeding\n          continueScreen(choiceParams.text, choiceParams.ifChosenText, choiceParams.goTo);\n          setTimeout(resetChoices, 0);\n        }, 250);\n      }\n      else {\n        \/\/ No animation, but let the choices stay for a while\n        setTimeout(function () {\n          \/\/ Done\n          self.trigger('chosen', choiceParams.goTo);\n          setTimeout(resetChoices, 0);\n        }, 500);\n      }\n    };\n\n    \/**\n     * Displays the continue message and button.\n     *\n     * @private\n     * @param {string} chosenText Text from the chosen option\n     * @param {string} continueMsg Message to display before continue\n     * @param {number} goTo Where to continue\n     *\/\n    var continueScreen = function (chosenText, continueMsg, goTo) {\n\n      \/\/ Remove choices\n      $choices.detach();\n\n      \/\/ Update elements\n      $chosenText.html(chosenText).insertBefore($continueMsg);\n      $continueMsg.html(continueMsg);\n      $continueButton.appendTo($wrapper).on('click', createContinueHandler(goTo)).focus();\n\n      \/\/ Makes it easy to re-style the task in this state\n      $wrapper.addClass(GoToQuestion.htmlClass + '-continuestate');\n    };\n\n    \/**\n     * Factory function for generating continue button handlers\n     *\n     * @private\n     * @param {number} goTo\n     *\/\n    var createContinueHandler = function (goTo) {\n      return function () {\n        self.trigger('chosen', goTo);\n        \/\/ Use timeout to avoid flickering\n        setTimeout(function () {\n          $continueButton.off('click').add($chosenText).detach();\n          $continueMsg.html('');\n\n          $choices.insertBefore($continueMsg);\n          $wrapper.removeClass(GoToQuestion.htmlClass + '-continuestate');\n        }, 1);\n      };\n    };\n\n    \/**\n     * Attach the question to the given container.\n     *\n     * @param {H5P.jQuery} $container\n     *\/\n    self.attach = function ($container) {\n      if ($wrapper === undefined) {\n        \/\/ Only create the HTML on the first attach\n        createHtml();\n      }\n\n      \/\/ Add to DOM\n      $container.addClass(GoToQuestion.htmlClass).html('').append($wrapper);\n    };\n  }\n\n  \/\/ Extends the event dispatcher\n  GoToQuestion.prototype = Object.create(EventDispatcher.prototype);\n  GoToQuestion.prototype.constructor = GoToQuestion;\n\n  \/\/ Set static html class base\n  GoToQuestion.htmlClass = 'h5p-gotoquestion';\n\n  \/\/ Counter for creating unique IDs\n  var id = 0;\n\n  \/**\n   * Generate unique page IDs\n   *\/\n  var getNextId = function () {\n    return GoToQuestion.htmlClass + '-' + (id++);\n  };\n\n  \/**\n   * Simple recusive function the helps set default values without\n   * destroying object references.\n   *\n   * @param {object} params values\n   * @param {object} values default values\n   *\/\n  var setDefaults = function (params, values) {\n    for (var prop in values) {\n      if (values.hasOwnProperty(prop)) {\n        if (params[prop] === undefined) {\n          \/\/ Not set, use default\n          params[prop] = values[prop];\n        }\n        else if (params[prop] instanceof Object) {\n          if (params[prop] instanceof Array) {\n            \/\/ Check if array has valid objects\n            if (!arrayHasObjects(params[prop], Object.keys(values[prop][0]))) {\n              \/\/ Empty array, use default options\n              params[prop] = values[prop];\n            }\n          }\n          else {\n            \/\/ Handle object\n            setDefaults(params[prop], values[prop]);\n          }\n        }\n      }\n    }\n  };\n\n  \/**\n   * Check to see if the array has objects with the required properties.\n   * Will strip away empty objects inserted by the editor.\n   *\n   * @param Array arr\n   * @param Array objProps\n   * @returns boolean\n   *\/\n  var arrayHasObjects = function (arr, objProps) {\n    \/\/ Reverse traverse to make removal of objects easier\n    var i = arr.length;\n    while (i--) {\n      if (arr[i] instanceof Object && !objectHasProps(arr[i], objProps)) {\n        \/\/ Missing required object properties, remove from array\n        arr.splice(i, 1);\n      }\n    }\n    return !!arr.length;\n  };\n\n  \/**\n   * Checks to see if object has all the specified props.\n   *\n   * @param Object obj\n   * @param Array props\n   * @returns boolean\n   *\/\n  var objectHasProps = function (obj, props) {\n    for (var i = 0; i < props.length; i++) {\n      if (obj[props[i]] === undefined) {\n        return false;\n      }\n    }\n\n    \/\/ Object had all props\n    return true;\n  };\n\n  return GoToQuestion;\n})(H5P.jQuery, H5P.EventDispatcher, H5P.JoubelUI);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.IVHotspot-1.2\/scripts\/iv-hotspot.js?ver=1.2.4":"\nH5P.IVHotspot = (function ($, EventDispatcher) {\n\n  \/**\n   * Create a new IV Hotspot!\n   *\n   * @class H5P.IVHotspot\n   * @extends H5P.EventDispatcher\n   * @param {Object} parameters\n   *\/\n  function IVHotspot(parameters) {\n    var self = this;\n    self.instanceIndex = getAndIncrementGlobalCounter();\n\n    if (typeof parameters.texts === 'string') {\n      parameters.texts = {};\n    }\n\n    parameters = $.extend(true, {\n      destination: {\n        type: 'timecode',\n        time: '0'\n      },\n      visuals: {\n        shape: 'rectangular',\n        backgroundColor: 'rgba(255, 255, 255, 0)'\n      },\n      texts: {}\n    }, parameters);\n\n    EventDispatcher.call(self);\n\n    \/**\n     * Attach the hotspot to the given container.\n     *\n     * @param {H5P.jQuery} $container\n     *\/\n    self.attach = function ($container) {\n      $container.addClass('h5p-ivhotspot').css({\n        backgroundColor: parameters.visuals.backgroundColor\n      }).addClass(parameters.visuals.shape);\n\n      var $a;\n      if (parameters.destination.type === 'url') {\n        var link = new H5P.Link({\n          title: '',\n          linkWidget: parameters.destination.url\n        });\n\n        link.attach($container);\n        $a = $container.find('a');\n        $a.keypress(function (event) {\n            if (event.which === 32) {\n              this.click();\n            }\n        });\n      }\n      else {\n        $a = $('<a>', {\n          href: '#',\n          'aria-labelledby': 'ivhotspot-' + self.instanceIndex + '-description'\n        }).on('click', function (event) {\n          self.trigger('goto', parameters.destination.time);\n          event.preventDefault();\n        }).keypress(function (event) {\n          if (event.which === 32) {\n            self.trigger('goto', parameters.destination.time);\n          }\n        });\n        $container.html($a);\n      }\n\n      $a.css({cursor: parameters.visuals.pointerCursor ? 'pointer' : 'default'});\n\n      if (parameters.visuals.animation) {\n        $container.append($('<div>', {\n          'class': 'blinking-hotspot'\n        }));\n      }\n      var alternativeTextContent = [parameters.texts.alternativeText, parameters.texts.label]\n        .filter(function (text) {\n          return text !== undefined;\n        }).join('. ');\n\n      $('<p>', {\n        id: 'ivhotspot-' + self.instanceIndex + '-description',\n        class: 'h5p-ivhotspot-invisible',\n        text: alternativeTextContent\n      }).appendTo($container);\n\n      if (parameters.texts.label !== undefined) {\n        var $label = $('<p>', {\n          class: 'h5p-ivhotspot-interaction-title',\n          text: parameters.texts.label\n        }).appendTo($a);\n\n        if (!parameters.texts.showLabel) {\n          $label.addClass('h5p-ivhotspot-invisible');\n        }\n\n        else if (parameters.texts.labelColor) {\n          $a.css('color', parameters.texts.labelColor);\n        }\n      }\n    };\n  }\n\n  \/**\n   * Use a global counter to separate instances of iv-hotspots,\n   * to maintain unique ids.\n   *\n   * Note that ids does not have to be unique across iframes.\n   *\n   * @return {number}\n   *\/\n  function getAndIncrementGlobalCounter() {\n    if (window.interactiveVideoCounter === undefined) {\n      window.interactiveVideoCounter = 0;\n    }\n\n    return window.interactiveVideoCounter++;\n  }\n\n  IVHotspot.prototype = Object.create(EventDispatcher.prototype);\n  IVHotspot.prototype.constructor = IVHotspot;\n\n\n  return IVHotspot;\n\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.OpenEndedQuestion-1.0\/dist\/dist.js?ver=1.0.7":"\n!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p=\"\",t(0)}([function(e,t,n){\"use strict\";H5P.OpenEndedQuestion=n(1).default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0}),n(3);var u=n(2),c=r(u),s=function(e){function t(e){var n=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,arguments.length>2&&void 0!==arguments[2]?arguments[2]:{});o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this)),a=e.question,u=void 0===a?\"Do you like cake?\":a,s=e.placeholderText,p=void 0===s?\"\":s,l=e.inputRows,d=void 0===l?1:l;return r.currentInput=\"\",r.xApiGenerator=new c.default(u),r.createQuestion=function(e){var t=document.createElement(\"div\");return t.className=\"h5p-open-ended-question-text\",t.innerHTML=e,t},r.createInput=function(e,t){var n=document.createElement(\"textarea\");return n.placeholder=t||\"\",n.textContent=this.currentInput,n.rows=e,n.style.resize=\"none\",n},r.attach=function(e){var t=this,n=document.createElement(\"div\");n.classList.add(\"h5p-open-ended-question\");var r=document.createElement(\"div\");r.classList.add(\"h5p-open-ended-question-question\"),r.classList.add(\"h5p-subcontent-question\");var o=this.createQuestion(u);r.appendChild(o);var i=document.createElement(\"div\");i.classList.add(\"h5p-open-ended-question-content\"),i.classList.add(\"h5p-subcontent-body\");var a=this.createInput(d,p);a.className=\"h5p-open-ended-question-input\",a.addEventListener(\"blur\",function(){var e=t.createXAPIEventTemplate(\"interacted\"),n=t.xApiGenerator.generateXApi(e,a.value);t.currentInput=a.value,t.trigger(n)}),i.appendChild(a),n.appendChild(r),n.appendChild(i),e.get(0).appendChild(n)},r.getCurrentState=function(){return this.currentInput},r.restorePreviousState=function(){n.previousState&&(this.currentInput=n.previousState)},r.restorePreviousState(),r}return a(t,e),t}(H5P.EventDispatcher);t.default=s},function(e,t){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(){function e(t){n(this,e),this.event={description:{\"en-US\":t},type:\"http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction\",interactionType:\"fill-in\"}}return o(e,[{key:\"generateXApi\",value:function(e,t){var n=e.data.statement;if(r(n,{result:{response:t}}),n.object){var o=n.object.definition;r(o,this.event)}return e}}]),e}();t.default=i},function(e,t){}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SimpleMultiChoice-1.1\/dist\/dist.js?ver=1.1.4":"\n!function(e){function t(i){if(n[i])return n[i].exports;var a=n[i]={exports:{},id:i,loaded:!1};return e[i].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n={};return t.m=e,t.c=n,t.p=\"\",t(0)}([function(e,t,n){\"use strict\";H5P.SimpleMultiChoice=n(1).default},function(e,t,n){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function r(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function c(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}();n(3);var u=n(2),l=i(u),h=0,d=function(e){function t(e){var n=e.question,i=e.alternatives,c=void 0===i?[]:i,s=e.inputType,u=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,arguments.length>2&&void 0!==arguments[2]?arguments[2]:{});a(this,t);var d=r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return d.uniqueName=\"h5p-simple-multiple-choice-\"+h,h+=1,d.listItems=[],d.feedbackElements=[],d.state=c.map(function(e,t){return{id:t,text:e.text,checked:!1}}),d.hasFeedback=c.some(function(e){return e.feedback.chosenFeedback||e.feedback.notChosenFeedback}),d.feedbackShown=!1,d.xapiGenerator=new l.default({question:n,alternatives:c}),d.attach=function(e){var t=document.createElement(\"div\");t.className=\"h5p-simple-multiple-choice\";var n=document.createElement(\"div\");n.classList.add(\"h5p-simple-multiple-choice-question\"),n.classList.add(\"h5p-subcontent-question\");var i=this.createQuestion(this.uniqueName);n.appendChild(i),t.appendChild(n);var a=this.createAlternativesList(this.uniqueName);t.appendChild(a),e.get(0).appendChild(t)},d.createQuestion=function(e){var t=document.createElement(\"div\");return t.id=e,t.innerHTML=n,t},d.handleInputChange=function(e){this.feedbackShown&&(this.feedbackElements.forEach(function(e){e.parentNode.removeChild(e)}),this.feedbackElements=[],this.feedbackShown=!1,this.trigger(\"allow-finish-changed\")),this.state=this.state.map(function(t,n){var i=n===e;return\"radio\"!==s&&(i=n===e?!t.checked:t.checked),o({},t,{checked:i})});var t=this.createXAPIEventTemplate(\"interacted\"),n=this.xapiGenerator.generateXApi(t,this.state);this.trigger(n)},d.createAlternativesList=function(e){var t=this;if(!this.state.length){var n=document.createElement(\"div\");return n.className=\"h5p-simple-multiple-choice-alternatives-error\",n.textContent=\"ERROR: No alternatives chosen\",n}var i=document.createElement(\"ul\");return i.classList.add(\"h5p-simple-multiple-choice-alternatives\"),i.classList.add(\"h5p-subcontent-body\"),i.setAttribute(\"role\",\"listbox\"),i.setAttribute(\"aria-labelledby\",e),this.state.forEach(function(e){var n=e.id,a=e.text,r=e.checked,c=document.createElement(\"li\");c.className=\"h5p-simple-multiple-choice-alternative-li\";var o=document.createElement(\"label\"),u=document.createElement(\"input\");u.className=\"h5p-simple-multiple-choice-alternative-input\",u.type=s||\"checkbox\",u.name=t.uniqueName,r&&u.setAttribute(\"checked\",\"checked\"),o.addEventListener(\"change\",t.handleInputChange.bind(t,n)),o.appendChild(u),o.innerHTML+=a,c.appendChild(o),i.appendChild(c),t.listItems.push(c)}),i},d.getCurrentState=function(){return l.default.getResultPattern(this.state)},d.restorePreviousState=function(){var e=this;if(u.previousState){var t=u.previousState.split(\"[,]\");t.forEach(function(t){e.state[t].checked=!0})}},d.allowFinish=function(){return this.hasFeedback?this.hasFeedback&&this.feedbackShown?t.AllowFinish.ALLOW:t.AllowFinish.DENY:t.AllowFinish.ALWAYS},d.finish=function(){var e=this;return c.forEach(function(t,n){if(t.feedback){var i=void 0,a=e.state[n].checked;if(a&&t.feedback.chosenFeedback?i=t.feedback.chosenFeedback:!a&&t.feedback.notChosenFeedback&&(i=t.feedback.notChosenFeedback),i){var r=document.createElement(\"div\");r.className=\"h5p-simple-multiple-choice-alternative-feedback \"+(a?\"chosen\":\"not-chosen\"),r.innerHTML=i,e.feedbackElements.push(r),e.listItems[n].appendChild(r)}}}),this.feedbackShown=!0,0===this.feedbackElements.length},d.restorePreviousState(),d}return c(t,e),s(t,null,[{key:\"AllowFinish\",get:function(){return{ALWAYS:0,DENY:1,ALLOW:2}}}]),t}(H5P.EventDispatcher);t.default=d},function(e,t){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e},a=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=function(){function e(t){var i=t.question,a=t.alternatives;n(this,e);var r=a.map(function(e,t){return{id:\"\"+t,description:{\"en-US\":e.text}}});this.event={description:{\"en-US\":i},type:\"http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction\",interactionType:\"choice\",choices:r}}return a(e,[{key:\"generateXApi\",value:function(t,n){var a=e.getResultPattern(n),r=t.data.statement;if(i(r,{result:{response:a}}),r.object){var c=r.object.definition;i(c,this.event)}return t}}],[{key:\"getResultPattern\",value:function(e){return e.reduce(function(e,t,n){return t.checked&&(e+=(e.length?\"[,]\":\"\")+n),e},\"\")}}]),e}();t.default=r},function(e,t){}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Questionnaire-1.2\/dist\/dist.js?ver=1.2.4":"\n!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"\",t(0)}([function(e,t,n){\"use strict\";H5P.Questionnaire=n(6).default},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(12);var s=function(){function e(){r(this,e)}return i(e,null,[{key:\"createButton\",value:function(t,n,r){var i=e.createElement(\"button\",{className:\"h5p-questionnaire-button \"+n,type:\"button\",textContent:t});return r&&i.addEventListener(\"click\",function(){r.trigger(n)}),i}},{key:\"createElement\",value:function(e,t){var n=document.createElement(e);return Object.keys(t).forEach(function(e){n[e]=t[e]}),n}},{key:\"createDiv\",value:function(t){return e.createElement(\"div\",t)}}]),e}();t.default=s},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function s(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(14);var u=n(1),c=r(u),l=function(e){function t(e){i(this,t);var n=s(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return n.footerWrapper=document.createElement(\"div\"),n.footerWrapper.className=\"h5p-questionnaire-footer\",n.footerWrapper.appendChild(n.createButton(e.prevLabel,\"previous\")),n.footerWrapper.appendChild(n.createButton(e.nextLabel,\"next\")),n.footerWrapper.appendChild(n.createButton(e.continueLabel,\"next\",\"continue\")),n}return a(t,e),o(t,[{key:\"setForwardNavigationButton\",value:function(e){this.trigger(\"disable-next\"),this.trigger(\"disable-continue\"),this.trigger(\"enable-\"+e)}},{key:\"createButton\",value:function(e,t,n){var r=c.default.createButton(e,t,this);return this.on(\"enable-\"+(n||t),function(){r.classList.remove(\"disable\")}),this.on(\"disable-\"+(n||t),function(){r.classList.add(\"disable\")}),r}},{key:\"hide\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.footerWrapper.classList[e?\"add\":\"remove\"](\"hide\")}},{key:\"attachTo\",value:function(e){e.appendChild(this.footerWrapper)}}]),t}(H5P.EventDispatcher);t.default=l},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(10);var s=function(){function e(t,n){r(this,e),this.numberWidget=document.createElement(\"div\"),this.numberWidget.className=\"h5p-questionnaire-progress-bar-widget\",this.numberWidget.setAttribute(\"aria-hidden\",\"true\"),this.currentIndex=document.createElement(\"div\"),this.currentIndex.className=\"h5p-questionnaire-progress-bar-widget-current\",this.currentIndex.textContent=t;var i=document.createElement(\"div\");i.className=\"h5p-questionnaire-progress-bar-widget-separator\",i.textContent=\"\/\";var s=document.createElement(\"div\");s.className=\"h5p-questionnaire-progress-bar-widget-max\",s.textContent=n,this.numberWidget.appendChild(this.currentIndex),this.numberWidget.appendChild(i),this.numberWidget.appendChild(s)}return i(e,[{key:\"setCurrentIndex\",value:function(e){this.currentIndex.textContent=e}},{key:\"attachTo\",value:function(e){e.appendChild(this.numberWidget)}}]),e}();t.default=s},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(11);var a=n(3),o=r(a),u=function(){function e(t){var n=t.currentIndex,r=t.maxIndex,s=t.uiElements;i(this,e),this.maxIndex=r,this.uiElements=s,this.progressBar=document.createElement(\"div\"),this.progressBar.className=\"h5p-questionnaire-progress-bar\",this.progressBar.setAttribute(\"tabindex\",\"-1\"),this.progressBar.setAttribute(\"role\",\"progressbar\"),this.progressBar.setAttribute(\"aria-valuemin\",\"0\"),this.progressBar.setAttribute(\"aria-valuemax\",r),this.updateAriaValues(n),this.currentProgress=document.createElement(\"div\"),this.currentProgress.className=\"h5p-questionnaire-progress-bar-current\",this.numberWidget=new o.default(n,r),this.move(n),this.progressBar.appendChild(this.currentProgress)}return s(e,[{key:\"updateAriaValues\",value:function(e){this.progressBar.setAttribute(\"aria-valuenow\",e),this.progressBar.setAttribute(\"aria-valuetext\",this.uiElements.accessibility.progressBarText.replace(\"%current\",e).replace(\"%max\",this.maxIndex))}},{key:\"move\",value:function(e){this.numberWidget.setCurrentIndex(e),this.currentProgress.style.width=e\/this.maxIndex*100+\"%\",this.updateAriaValues(e),this.progressBar.focus()}},{key:\"hide\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.progressBar.classList[e?\"add\":\"remove\"](\"hide\")}},{key:\"attachNumberWidgetTo\",value:function(e){this.numberWidget.attachTo(e)}},{key:\"attachTo\",value:function(e){e.appendChild(this.progressBar)}}]),e}();t.default=u},function(e,t){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function r(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e){function t(e){var i=e.progressBar,s=e.params,a=e.contentId,o=e.requiredField,u=(e.index,e.uiElements);n(this,t);var c=r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return c.progressBar=i,c.questionnaireElement=document.createElement(\"div\"),c.questionnaireElement.className=\"h5p-questionnaire-element hide\",c.instance=H5P.newRunnable(s,a,H5P.jQuery(c.questionnaireElement),void 0,{parent:c}),c.requiredField=o,c.answered=s.userDatas&&s.userDatas.state&&s.userDatas.state.length,c.attachRequiredField(o,u),c.instance.on(\"xAPI\",c.handleInteraction.bind(c)),c.instance.on(\"allow-finish-changed\",c.trigger.bind(c)),c}return i(t,e),s(t,null,[{key:\"AllowFinish\",get:function(){return{ALWAYS:0,DENY:1,ALLOW:2}}}]),s(t,[{key:\"attachRequiredField\",value:function(e,t){if(e){var n=this.questionnaireElement.querySelector(\".h5p-subcontent-question\");this.questionnaireElement.classList.add(\"h5p-questionnaire-required\");var r=document.createElement(\"div\");r.textContent=\"* \"+t.requiredText,r.className=\"h5p-questionnaire-required-symbol\",n&&n.insertBefore(r,n.firstChild)}}},{key:\"handleInteraction\",value:function(e){if(\"http:\/\/adlnet.gov\/expapi\/verbs\/interacted\"===e.data.statement.verb.id){var t=e.data.statement.result.response;t.trim&&(t=t.trim()),this.answered=!!t.length,this.trigger(\"handledInteraction\")}}},{key:\"allowFinish\",value:function(){return void 0!==this.instance.allowFinish?this.instance.allowFinish():t.AllowFinish.ALWAYS}},{key:\"finish\",value:function(){if(this.instance.finish)return this.instance.finish()}},{key:\"getCurrentState\",value:function(){return this.instance.getCurrentState?this.instance.getCurrentState():null}},{key:\"getElement\",value:function(){return this.questionnaireElement}},{key:\"isRequired\",value:function(){return this.requiredField}},{key:\"isAnswered\",value:function(){return this.answered}},{key:\"hide\",value:function(e){this.questionnaireElement.classList[e?\"add\":\"remove\"](\"hide\")}},{key:\"setActivityStarted\",value:function(){this.instance.setActivityStarted&&this.instance.setActivityStarted()}}]),t}(H5P.EventDispatcher);t.default=a},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function s(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};n(13),n(15);var u=n(9),c=r(u),l=n(8),d=r(l),h=n(7),f=r(h),p=n(2),b=r(p),v=n(4),m=r(v),g=n(5),y=r(g),w=function(e){function t(e){var n=e.questionnaireElements,r=void 0===n?[]:n,a=e.successScreenOptions,u=void 0===a?{}:a,l=e.uiElements,h=void 0===l?{}:l,p=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,v=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};i(this,t);var g=s(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));g.contentId=p,g.state={questionnaireElements:[],currentIndex:0},h=H5P.jQuery.extend(!0,{buttonLabels:{prevLabel:\"Back\",nextLabel:\"Next\",submitLabel:\"Submit\",continueLabel:\"Continue\"},accessibility:{requiredTextExitLabel:\"Close error message\",progressBarText:\"Question %current of %max\"},requiredMessage:\"This question requires an answer\",requiredText:\"required\",submitScreenTitle:\"You successfully answered all of the questions\",submitScreenSubtitle:\"Click below to submit your answers\"},h),g.createQuestionnaireBody=function(){var e=this,t=document.createElement(\"div\");return t.className=\"h5p-questionnaire-content\",r.forEach(function(n,r){var i=n.requiredField,s=n.library,a=e.createQuestionContent(i,s,r);t.appendChild(a.getElement()),e.state.questionnaireElements.push(a)}),this.createSubmitScreen().attachTo(t),u.enableSuccessScreen&&this.createSuccessScreen().attachTo(t),t},g.createQuestionContent=function(e,t,n){var r=this,i=new y.default({progressBar:this.progressBar,params:t,contentId:this.contentId,requiredField:e,index:n,uiElements:h});return i.on(\"handledInteraction\",function(){r.trigger(\"resize\"),r.requiredMessage.trigger(\"hideMessage\")}),i.on(\"allow-finish-changed\",function(){r.setForwardNavigationButton(r.state.currentIndex)}),i},g.createQuestionnaire=function(){var e=document.createElement(\"div\");if(e.className=\"h5p-questionnaire\",1===r.length&&!r[0].library)return e.classList.add(\"h5p-invalid-questionnaire\"),e.textContent=\"Invalid content\",e;this.createProgressBar(r).attachTo(e);var t=this.createQuestionnaireBody();e.appendChild(t),this.requiredMessage=new f.default(h),this.requiredMessage.attachTo(e);var n=this.createFooter();return n.attachTo(e),this.state.questionnaireElements.length&&this.state.questionnaireElements[0].setActivityStarted(),this.state.finished?u.enableSuccessScreen?this.showSuccessScreen():this.showSubmitScreen():this.move(this.state.currentIndex,this.state.currentIndex>0),e},g.createSubmitScreen=function(){var e=this;return this.submitScreen=new d.default({title:h.submitScreenTitle,subtitle:h.submitScreenSubtitle,backLabel:h.buttonLabels.prevLabel,submitLabel:h.buttonLabels.submitLabel}),this.submitScreen.on(\"submit\",this.handleSubmit.bind(this)),this.submitScreen.on(\"previous\",function(){e.submitScreen.hide(),e.hideQuestion(!1),e.trigger(\"resize\")}),this.submitScreen},g.hideQuestion=function(e){this.state.questionnaireElements[this.state.questionnaireElements.length-1].hide(e),this.progressBar.hide(e),this.footer.hide(e)},g.createSuccessScreen=function(){var e=this;return this.successScreen=new c.default(u,this),this.successScreen.on(\"imageLoaded\",function(){e.trigger(\"resize\")}),this.successScreen},g.createProgressBar=function(e){return this.progressBar=new m.default({currentIndex:this.state.currentIndex+1,maxIndex:e.length,uiElements:h}),this.progressBar},g.showSubmitScreen=function(){this.hideQuestion(!0),this.submitScreen.show(),this.trigger(\"resize\")},g.showSuccessScreen=function(){this.hideQuestion(!0),this.submitScreen.hide(),this.successScreen.show(),this.trigger(\"resize\")},g.handleSubmit=function(){u.enableSuccessScreen?this.showSuccessScreen():this.trigger(\"noSuccessScreen\"),this.state.finished=!0,this.triggerXAPI(\"completed\")},g.createFooter=function(){var e=this,t=new b.default(h.buttonLabels);return t.on(\"next\",function(){e.move(e.state.currentIndex+1)&&e.showSubmitScreen()}),t.on(\"previous\",function(){e.move(e.state.currentIndex-1)}),t.trigger(\"disable-previous\"),this.footer=t,t},g.setForwardNavigationButton=function(e){if(!(e>this.state.questionnaireElements.length-1)){var t=this.state.questionnaireElements[e].allowFinish(),n=t===y.default.AllowFinish.ALLOW?\"next\":\"continue\";this.footer.setForwardNavigationButton(n)}},g.triggerRequiredQuestion=function(){this.requiredMessage.trigger(\"showMessage\"),this.trigger(\"resize\")},g.move=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.state,r=n.currentIndex,i=n.questionnaireElements,s=i[r];if(e<0)return!1;if(!t&&e>r){if(!this.isValidAnswer(s))return this.triggerRequiredQuestion(),!1;if(s.allowFinish()===y.default.AllowFinish.DENY&&!s.finish())return this.setForwardNavigationButton(r),this.trigger(\"resize\"),!1}if(e>i.length-1)return!0;this.footer.trigger(0===e?\"disable-previous\":\"enable-previous\"),this.setForwardNavigationButton(e),this.requiredMessage.trigger(\"hideMessage\"),i[r].hide(!0);var a=i[e];a.hide(!1);var u=a.getElement().querySelector(\".h5p-subcontent-question\");if(this.progressBar.attachNumberWidgetTo(u),this.trigger(\"resize\"),this.state=o(this.state,{currentIndex:e}),this.progressBar.move(e+1),0!==e&&0!==r){var c=this.createXAPIEventTemplate(\"progressed\");c.data.statement.object&&(c.data.statement.object.definition.extensions[\"http:\/\/id.tincanapi.com\/extension\/ending-point\"]=e+1,this.trigger(c))}return i[e].setActivityStarted(),!1},g.isValidAnswer=function(e){return!e.isRequired()||e.isAnswered()},g.attach=function(e){e.get(0).classList.add(\"h5p-questionnaire-wrapper\"),e.get(0).appendChild(w)},g.getCurrentState=function(){var e=this.state.questionnaireElements.map(function(e){return e.getCurrentState()});return{questions:e,progress:this.state.currentIndex,finished:this.state.finished,version:1}},g.setPreviousState=function(){var e=v.previousState;if(e&&e.questions){if(this.state.finished=e.finished,e.progress){this.state.currentIndex=e.progress;var t=this.state.currentIndex>=r.length;void 0===e.version&&t&&(this.state.currentIndex=r.length-1,this.state.finished=!0)}e.questions.forEach(function(e,t){r[t].library.userDatas=r[t].library.userDatas||{},r[t].library.userDatas.state=e})}},g.setPreviousState();var w=g.createQuestionnaire();return g}return a(t,e),t}(H5P.EventDispatcher);t.default=w},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function s(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(16);var o=function(e){function t(e){r(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));n.requiredElement=document.createElement(\"div\"),n.requiredElement.classList.add(\"h5p-questionnaire-choice-required\"),n.requiredElement.classList.add(\"hide\"),n.requiredMessage=document.createElement(\"div\"),n.requiredMessage.textContent=e.requiredMessage,n.requiredMessage.className=\"h5p-questionnaire-choice-required-message\",n.requiredMessage.setAttribute(\"role\",\"alert\");var s=document.createElement(\"button\");return s.className=\"h5p-questionnaire-choice-required-exit\",s.setAttribute(\"aria-label\",e.accessibility.requiredTextExitLabel),s.addEventListener(\"click\",function(){n.hideMessage()}),n.on(\"hideMessage\",function(){n.hideMessage()}),n.on(\"showMessage\",function(){n.showMessage()}),n.requiredElement.appendChild(n.requiredMessage),n.requiredElement.appendChild(s),n}return s(t,e),a(t,[{key:\"showMessage\",value:function(){this.requiredElement.classList.remove(\"hide\")}},{key:\"hideMessage\",value:function(){this.requiredElement.classList.add(\"hide\")}},{key:\"attachTo\",value:function(e){e.appendChild(this.requiredElement)}}]),t}(H5P.EventDispatcher);t.default=o},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function s(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(17);var u=n(1),c=r(u),l=function(e){function t(e){var n=e.title,r=e.subtitle,a=e.backLabel,o=e.submitLabel;i(this,t);var u=s(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return u.wrapper=c.default.createDiv({className:\"h5p-questionnaire-submit-screen hide\"}),u.wrapper.setAttribute(\"tabindex\",\"-1\"),u.wrapper.appendChild(c.default.createDiv({className:\"h5p-questionnaire-submit-screen-title\",textContent:n})),u.wrapper.appendChild(c.default.createDiv({className:\"h5p-questionnaire-submit-screen-subtitle\",textContent:r})),u.wrapper.appendChild(c.default.createButton(a,\"previous\",u)),u.wrapper.appendChild(c.default.createButton(o,\"submit\",u)),u.show=function(){this.wrapper.classList.remove(\"hide\"),this.wrapper.focus()},u.hide=function(){this.wrapper.classList.add(\"hide\")},u}return a(t,e),o(t,[{key:\"attachTo\",value:function(e){e.appendChild(this.wrapper)}}]),t}(H5P.EventDispatcher);t.default=l},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function s(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(18);var o=function(e){function t(e,n){var s=e.successScreenImage,a=void 0===s?{}:s,o=e.successMessage,u=void 0===o?\"\":o;r(this,t);var c=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));c.wrapper=document.createElement(\"div\"),c.wrapper.className=\"h5p-questionnaire-success\",c.wrapper.setAttribute(\"tabindex\",\"-1\"),c.wrapper.classList.add(\"hide\");var l=document.createElement(\"div\");l.className=\"h5p-questionnaire-success-center\",c.wrapper.appendChild(l);var d=document.createElement(\"div\");if(d.className=\"h5p-questionnaire-success-icon\",a.params&&a.params.file){d.classList.add(\"image\");var h=H5P.newRunnable(a,n.contentId,H5P.jQuery(d),void 0,{parent:n});h.on(\"loaded\",function(){c.trigger(\"imageLoaded\")})}else d.classList.add(\"standard-icon\");var f=document.createElement(\"div\");return f.className=\"h5p-questionnaire-success-message\",f.innerHTML=u,l.appendChild(d),l.appendChild(f),c.show=function(){this.wrapper.classList.remove(\"hide\"),this.wrapper.focus()},c}return s(t,e),a(t,[{key:\"attachTo\",value:function(e){e.appendChild(this.wrapper)}}]),t}(H5P.EventDispatcher);t.default=o},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/Scripts\/image-radio-button-group.js?ver=1.17.4":"\n\/**\n * ImageRadioButtonGroup widget module\n *\n * @param {H5P.jQuery} $\n *\/\nH5PEditor.widgets.imageRadioButtonGroup = (function ($) {\n\n  var idCounter = 0;\n  \/**\n   * Creates an image radio button group.\n   *\n   * @class H5PEditor.ImageRadioButtonGroup\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   *\/\n  function ImageRadioButtonGroup(parent, field, params, setValue) {\n    this.parent = parent;\n    this.field = field;\n    this.params = params;\n    this.setValue = setValue;\n  }\n\n  \/**\n   * Append the field to the wrapper.\n   * @public\n   * @param {H5P.jQuery} $wrapper\n   *\/\n  ImageRadioButtonGroup.prototype.appendTo = function ($wrapper) {\n    var self = this;\n\n    self.$container = $('<div>', {\n      'class': 'field text h5p-image-radio-button-group'\n    });\n\n    \/\/ Add header:\n    $('<div>', {\n      'class': 'h5peditor-label',\n      html: self.field.label\n    }).appendTo(self.$container);\n\n    var $buttonGroup = $('<div>', {\n      'class': 'h5p-image-radio-button-container'\n    }).appendTo(self.$container);\n\n    for (var i=0, numOptions = self.field.options.length; i < numOptions; i++) {\n      var option = self.field.options[i];\n      var imgPath = H5P.getLibraryPath(self.field.library) + '\/' + option.image;\n      var inputId = 'h5p-image-radio-button-' + (idCounter++);\n\n      var $button = $('<div>', {\n        'class': 'h5p-image-radio-button ' + option.value\n      }).appendTo($buttonGroup);\n\n      $('<input>', {\n        type: 'radio',\n        name: self.field.name,\n        value: option.value,\n        id: inputId,\n        checked: (self.params === option.value),\n        change: function () {\n          self.params = $('input[name=' + self.field.name + ']:checked', $buttonGroup).val();\n          self.setValue(self.field, self.params);\n        }\n      }).appendTo($button);\n\n      $('<label>', {\n        'for': inputId\n      }).append($('<div>', {\n        'class': 'image-container',\n        alt: option.label\n      })).append($('<span>', {\n        html: option.label\n      })).appendTo($button);\n\n      if (option.description) {\n        $('<div>', {\n          'class': 'h5p-option-description',\n          html: option.description\n        }).appendTo($button);\n      }\n    }\n\n    \/\/ Add description:\n    $('<div>', {\n      'class': 'h5peditor-field-description',\n      html: self.field.description\n    }).appendTo(self.$container);\n\n    self.$container.appendTo($wrapper);\n  };\n\n\n  \/**\n   * Validate the current values.\n   *\/\n  ImageRadioButtonGroup.prototype.validate = function () {\n    return true;\n  };\n\n  ImageRadioButtonGroup.prototype.remove = function () {};\n\n  return ImageRadioButtonGroup;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/Scripts\/interactive-video-editor.js?ver=1.17.4":"\n\/*global H5PEditor, H5P*\/\nH5PEditor.widgets.interactiveVideo = H5PEditor.InteractiveVideo = (function ($) {\n\n  \/**\n   * Initialize interactive video editor.\n   *\n   * @class H5PEditor.InteractiveVideo\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   *\/\n  function InteractiveVideoEditor(parent, field, params, setValue) {\n    var that = this;\n\n    this.parent = parent;\n    this.field = field;\n\n    this.findField(this.field.video, function (field) {\n      if (field.field.type !== 'video') {\n        throw t('notVideoField', {':path': that.field.video});\n      }\n\n      if (field.params !== undefined) {\n        that.setVideo(field.params);\n      }\n\n      field.changes.push(function (file) {\n        that.setVideo(field.params);\n      });\n    });\n\n    this.findField(this.field.poster, function (field) {\n      if (field.field.type !== 'image') {\n        throw t('notImageField', {':path': that.field.poster});\n      }\n\n      if (field.params !== undefined) {\n        that.setPoster(field.params);\n      }\n\n      field.changes.push(function () {\n        that.setPoster(field.params);\n      });\n    });\n\n    this.params = $.extend({\n      interactions: [],\n      bookmarks: []\n    }, params);\n    setValue(field, this.params);\n\n    this.children = [];\n\n    this.passReadies = true;\n    parent.ready(function () {\n      that.passReadies = false;\n\n      \/\/ Set active right away to generate common fields for interactions.\n      that.setActive();\n    });\n\n    H5P.$window.on('resize', function () {\n      if (that.IV) {\n        that.IV.trigger('resize');\n      }\n    });\n\n    \/\/ Tour de editor\n    this.currentTabIndex = 0;\n\n    \/\/ When wizard changes step\n    parent.on('stepChanged', function (event) {\n      that.currentTabIndex = event.data.id;\n      that.startGuidedTour(H5PEditor.InteractiveVideo.GuidedTours.isOpen());\n    });\n  }\n\n  \/**\n   * Must be changed if the semantics for the elements changes.\n   * @private\n   * @type {string}\n   *\/\n  InteractiveVideoEditor.clipboardKey = 'H5PEditor.InteractiveVideo';\n  \/**\n   * Find a field, then run the callback.\n   *\n   * @param {function} callback\n   *\/\n  InteractiveVideoEditor.prototype.findField = function (path, callback) {\n    var that = this;\n    \/\/ Find field when tree is ready.\n    this.parent.ready(function () {\n      var field = H5PEditor.findField(path, that.parent);\n\n      if (!field) {\n        throw H5PEditor.t('core', 'unknownFieldPath', {':path': path});\n      }\n\n      callback(field);\n    });\n  };\n\n  \/**\n   * Our tab has been set active. Create a new player if necessary.\n   *\/\n  InteractiveVideoEditor.prototype.setActive = function () {\n    if (this.IV !== undefined) {\n      \/\/ A video has been loaded, no need to recreate.\n      \/\/ (but we can do some resizing :D)\n      this.IV.trigger('resize');\n      return;\n    }\n\n    \/\/ Reset css\n    this.$editor.css({\n      width: '',\n      height: '',\n      fontSize: ''\n    });\n\n    if (this.video === undefined) {\n      this.$editor.html(this.noVideoSourceMessage(this.parent)).removeClass('h5p-interactive-video');\n      return;\n    }\n\n    var that = this;\n\n    \/\/ Create new player.\n    this.IV = new H5P.InteractiveVideo({\n      interactiveVideo: {\n        video: {\n          files: this.video,\n          startScreenOptions: {\n            poster: this.poster\n          }\n        },\n        assets: this.params\n      }\n    }, H5PEditor.contentId);\n    this.IV.editor = this;\n    $(window).on('resize', function () {\n      if (that.dnb) {\n        that.dnb.resize();\n      }\n    });\n    for (var i = 0; i < this.IV.interactions.length; i++) {\n      this.processInteraction(this.IV.interactions[i], this.params.interactions[i]);\n    }\n    this.IV.on('controls', function () {\n      if (!that.IV) {\n        return; \/\/ Video source or poster may have changed \u2013 abort!\n      }\n\n      \/\/ Add DragNBar.\n      that.$bar = $('<div class=\"h5p-interactive-video-dragnbar\">' + t('loading') + '<\/div>').prependTo(that.$editor);\n      var interactions = findField('interactions', that.field.fields);\n      var action = findField('action', interactions.field.fields);\n      H5PEditor.LibraryListCache.getLibraries(\n        action.options,\n        function (libraries) {\n          this.createDragNBar(libraries);\n          this.setInteractionTitles();\n          this.startGuidedTour();\n          this.IV.trigger('dnbEditorReady');\n        },\n        that\n      );\n\n      \/\/ Add \"Add bookmark\" to bookmarks menu.\n      $('<div\/>', {\n        'class': 'h5p-add-bookmark',\n        html: t('addBookmark'),\n        role: 'button',\n        tabindex: 0,\n        on: {\n          click: function () {\n            that.addBookmark();\n          }\n        },\n        appendTo: that.IV.controls.$bookmarksChooser\n      });\n    });\n    this.IV.on('bookmarkAdded', that.bookmarkAdded, that);\n    this.IV.attach(this.$editor);\n\n    \/\/ Create a focus handler\n    this.$focusHandler = $('<div>', {\n      'class': 'h5peditor-iv-focus-handler'\n    }).click(function () {\n      if (!that.dnb.focusedElement || !that.dnb.focusedElement.$element.is(':focus')) {\n\n        \/\/ No focused element, remove overlay\n        that.$focusHandler.removeClass('show');\n        that.IV.$overlay.removeClass('h5p-visible');\n      }\n    }).appendTo(this.IV.$videoWrapper);\n\n    this.pToEm = (this.IV.width \/ this.IV.fontSize) \/ 100;\n  };\n\n  \/**\n   * Set custom interaction titles when libraries are registered.\n   *\/\n  InteractiveVideoEditor.prototype.setInteractionTitles = function () {\n    var self = this;\n\n    this.IV.interactions.forEach(function (interaction) {\n      \/\/ Try to figure out a title for the dialog\n      var title = self.findLibraryTitle(interaction.getLibraryName());\n      if (!title) {\n        \/\/ Couldn't find anything, use default\n        title = self.IV.l10n.interaction;\n      }\n\n      interaction.setTitle(title);\n    });\n\n    \/\/ Create title element\n    this.$interactionTitle = $('<div>', {\n      'class': 'h5p-interaction-button-title'\n    }).appendTo(this.$editor);\n\n  };\n\n  InteractiveVideoEditor.prototype.showInteractionTitle = function (title, $interaction) {\n    if (!this.$interactionTitle) {\n      return;\n    }\n\n    \/\/ Set static margin\n    var fontSize = parseInt(this.IV.$videoWrapper.css('font-size'), 10);\n    var staticMargin = 0.3 * fontSize;\n\n    var videoOffsetX = $interaction.position().left;\n    var videoOffsetY = $interaction.position().top;\n    var dnbOffsetY = this.$bar.height();\n\n    this.$interactionTitle.html(title);\n\n    \/\/ center title\n    var totalOffsetX = videoOffsetX - (this.$interactionTitle.outerWidth(true) \/ 2) + ($interaction.width() \/ 2);\n    if (totalOffsetX < 0) {\n      totalOffsetX = 0;\n    } else if(totalOffsetX + this.$interactionTitle.outerWidth(true) > this.IV.$videoWrapper.width()) {\n      totalOffsetX = this.IV.$videoWrapper.width() - this.$interactionTitle.outerWidth(true);\n    }\n    var totalOffsetY = videoOffsetY + dnbOffsetY - this.$interactionTitle.height() - 1;\n\n    this.$interactionTitle.css({\n      'left': totalOffsetX,\n      'top': totalOffsetY - staticMargin\n    }).addClass('show');\n  };\n\n  InteractiveVideoEditor.prototype.hideInteractionTitle = function () {\n    if (!this.$interactionTitle) {\n      return;\n    }\n\n    this.$interactionTitle.removeClass('show');\n  };\n\n  \/**\n   * Add bookmark\n   *\/\n  InteractiveVideoEditor.prototype.addBookmark = function () {\n    var time = this.IV.video.getCurrentTime();\n\n    \/\/ Find out where to place the bookmark\n    for (var i = 0; i < this.params.bookmarks.length; i++) {\n      if (this.params.bookmarks[i].time > time) {\n        \/\/ Insert before this.\n        break;\n      }\n    }\n\n    var tenth = Math.floor(time * 10) \/ 10;\n    if (this.IV.bookmarksMap[tenth] !== undefined) {\n      \/\/ Create warning:\n      this.displayMessage(t('bookmarkAlreadyExists'));\n      return; \/\/ Not space for another bookmark.\n    }\n\n    \/\/ Hide dialog\n    if (this.IV.controls.$more.attr('aria-expanded') === 'true') {\n      this.IV.controls.$more.click();\n    }\n    else {\n      this.IV.controls.$bookmarks.click();\n    }\n\n    \/\/ Move other increament other ids.\n    this.IV.trigger('bookmarksChanged', {'index': i, 'number': 1});\n\n    this.params.bookmarks.splice(i, 0, {\n      time: time,\n      label: t('newBookmark')\n    });\n\n    var $bookmark = this.IV.addBookmark(i, tenth);\n    $bookmark.addClass('h5p-show');\n    $bookmark.find('.h5p-bookmark-text').click();\n  };\n\n  \/**\n   * Display a popup containing a message.\n   *\n   * @param {string} message\n   *\/\n  InteractiveVideoEditor.prototype.displayMessage = function (message) {\n    var timeout;\n    var $warning = $('<div\/>', {\n      'class': 'h5p-iv-message-popup',\n      text: message,\n      click: function () {\n        clearTimeout(timeout);\n        $warning.remove();\n      }\n    }).appendTo(this.$editor);\n\n    timeout = setTimeout(function(){\n      $warning.remove();\n    }, 3000);\n  };\n\n  \/**\n   * Gets called whenever a bookmark is added to the UI.\n   *\n   * @param {H5P.Event} event\n   *\/\n  InteractiveVideoEditor.prototype.bookmarkAdded = function (event) {\n    var self = this;\n    var $bookmark = event.data.bookmark;\n\n    $('<a class=\"h5p-remove-bookmark\" href=\"#\"><\/a>')\n      .appendTo($bookmark.find('.h5p-bookmark-label'))\n      .click(function () {\n        var id = $bookmark.data('id');\n        self.params.bookmarks.splice(id, 1);\n        self.IV.trigger('bookmarksChanged', {'index': id, 'number': -1});\n        $bookmark.remove();\n        return false;\n      });\n\n    \/\/ Click to edit label.\n    $bookmark.find('.h5p-bookmark-text').click(function () {\n      if ($bookmark.hasClass('h5p-force-show')) {\n        return; \/\/ Double click\n      }\n      $bookmark.addClass('h5p-force-show');\n      var $text = $(this);\n\n      \/\/ This is a IE-fix. Without this, text is not shown when editing\n      $text.css({overflow: 'visible'});\n\n      var $input = $text.html('<input type=\"text\" class=\"h5p-bookmark-input\" style=\"width:' + ($text.width() - 19) + 'px\" maxlength=\"255\" value=\"' + $text.text() + '\"\/>')\n        .children()\n        .blur(function () {\n          var newText = $input.val();\n          if (H5P.trim(newText) === '') {\n            newText = t('newBookmark');\n          }\n          $text.text(newText);\n          $bookmark.removeClass('h5p-force-show').mouseover().mouseout();\n          $text.css({overflow: 'hidden'});\n\n          var id = $bookmark.data('id');\n          self.params.bookmarks[id].label = newText;\n          self.IV.controls.$bookmarksChooser.find('li:eq(' + id + ')').text(newText);\n        })\n        .keydown(function (event) {\n          if (event.which === 13) {\n            $input.blur();\n          }\n        })\n        .focus();\n\n      if ($input.val() === t('newBookmark')) {\n        \/\/ Delete default value when editing\n        $input.val('');\n      }\n    });\n  };\n\n  \/**\n   * Initialize the toolbar for creating interactivties.\n   *\n   * @param {Array} libraries\n   *\/\n  InteractiveVideoEditor.prototype.createDragNBar = function (libraries) {\n    var that = this;\n\n    this.libraries = libraries;\n    this.dnb = new H5P.DragNBar(this.getButtons(libraries), this.IV.$videoWrapper, this.IV.$container);\n    this.dnb.overflowThreshold = 16;\n\n    \/**\n     * @private\n     * @param {string} lib uber name\n     * @returns {boolean}\n     *\/\n    var supported = function (lib) {\n      for (var i = 0; i < libraries.length; i++) {\n        if (libraries[i].restricted !== true && libraries[i].uberName === lib) {\n          return true; \/\/ Library is supported and allowed\n        }\n      }\n\n      return false;\n    };\n\n    this.dnb.on('paste', function (event) {\n      var pasted = event.data;\n      var options = {\n        width: pasted.width,\n        height: pasted.height,\n        pasted: true\n      };\n\n      if (pasted.from === InteractiveVideoEditor.clipboardKey) {\n        \/\/ Pasted content comes from the same version of IV\n\n        if (!pasted.generic) {\n          \/\/ Non generic part, must be a something not created yet\n          that.dnb.focus(that.addInteraction(pasted.specific, options));\n        }\n        else if (supported(pasted.generic.library)) {\n          \/\/ Has generic part and the generic libray is supported\n          that.dnb.focus(that.addInteraction(pasted.specific, options));\n        }\n        else {\n          alert(H5PEditor.t('H5P.DragNBar', 'unableToPaste'));\n        }\n      }\n      else if (pasted.generic) {\n        if (supported(pasted.generic.library)) {\n          \/\/ Supported library from another content type\n\n          if (pasted.specific.displayAsButton) {\n            \/\/ Make sure buttons from CP still are buttons.\n            options.displayType = 'button';\n          }\n          options.action = pasted.generic;\n          that.dnb.focus(that.addInteraction(pasted.generic.library, options));\n        }\n        else {\n          alert(H5PEditor.t('H5P.DragNBar', 'unableToPaste'));\n        }\n      }\n    });\n\n    that.dnb.dnr.on('stoppedResizing', function (event) {\n      \/\/ Set size in em\n      that.interaction.setSize(event.data.width, event.data.height);\n\n      if (event.data.left !== undefined && event.data.top !== undefined) {\n        \/\/ Set pos in %\n        var containerStyle = window.getComputedStyle(that.dnb.$container[0]);\n        that.interaction.setPosition(event.data.left \/ (parseFloat(containerStyle.width) \/ 100), event.data.top \/ (parseFloat(containerStyle.height) \/ 100));\n      }\n    });\n\n    \/\/ Make sure that dialog can't be closed without validation\n    that.dnb.dialog.on('open', function () {\n      that.dnb.dialog.disableOverlay = true;\n    });\n\n    this.dnb.dnd.startMovingCallback = function () {\n      that.dnb.dnd.min = {x: 0, y: 0};\n      that.dnb.dnd.max = {\n        x: that.dnb.$container.width() - that.dnb.$element.outerWidth(),\n        y: that.dnb.$container.height() - that.dnb.$element.outerHeight()\n      };\n\n      if (that.dnb.newElement) {\n        that.dnb.dnd.adjust.x = 10;\n        that.dnb.dnd.adjust.y = 10;\n        that.dnb.dnd.min.y -= that.dnb.$list.height();\n      }\n\n      return true;\n    };\n\n    \/\/ Update params when the element is dropped.\n    this.dnb.stopMovingCallback = function (x, y) {\n      that.interaction.positionLabel(that.IV.$videoWrapper.width());\n      that.interaction.setPosition(x, y);\n    };\n\n    this.dnb.dnd.releaseCallback = function () {\n      \/\/ Edit element when it is dropped.\n      if (that.dnb.newElement) {\n        that.dnb.dnd.$element.dblclick();\n        that.dnb.blurAll();\n      }\n    };\n    that.IV.interactions.forEach(function (interaction) {\n      \/\/ Add drag functionality if interaction has element\n      if (interaction.getElement()) {\n        var libraryName = interaction.getLibraryName();\n        var options = {\n          cornerLock: (libraryName === 'H5P.Image'),\n          disableResize: (libraryName === 'H5P.Link') || interaction.isButton()\n        };\n        that.addInteractionToDnb(interaction, interaction.getElement(), options);\n      }\n    });\n\n    if (that.IV.scaledFontSize) {\n      \/\/ Set the container em since the resizing is useless without it\n      that.dnb.dnr.setContainerEm(that.IV.scaledFontSize);\n    }\n\n    this.dnb.attach(this.$bar);\n  };\n\n  \/**\n   * Create form for interaction.\n   *\n   * @param {H5P.InteractiveVideoInteraction} interaction\n   * @param {Object} parameters\n   *\/\n  InteractiveVideoEditor.prototype.createInteractionForm = function (interaction, parameters) {\n    var self = this;\n\n    var $semanticFields = $('<div>', {\n      'class': 'h5p-dialog-inner-semantics'\n    });\n\n    \/\/ Create form\n    interaction.$form = $semanticFields;\n    var interactions = findField('interactions', this.field.fields);\n\n    \/\/ Clone semantics to avoid changing them for all interactions\n    var interactionFields = H5PEditor.$.extend(true, [], interactions.field.fields);\n\n    \/\/ Hide some fields for some interaction types\n    var type = interaction.getLibraryName();\n\n    if (InteractiveVideoEditor.XAPI_QUESTION_TYPES.indexOf(type) === -1) {\n      hideFields(interactionFields, ['adaptivity']);\n    }\n    if (type === 'H5P.Nil') {\n      hideFields(interactionFields, ['displayType']);\n    }\n    if (type !== 'H5P.Text' && type !== 'H5P.Image') {\n      hideFields(interactionFields, ['goto']);\n    }\n    if (['H5P.Text', 'H5P.Image', 'H5P.Link', 'H5P.Table'].indexOf(type) === -1) {\n      hideFields(interactionFields, ['visuals']);\n    }\n    if (type === 'H5P.Summary') {\n      var adaptivityFields = findField('adaptivity', interactionFields);\n      hideFields(adaptivityFields.fields, ['requireCompletion']);\n    }\n\n    if (parameters.visuals === undefined) {\n\n      \/\/ Make Image background transparent by default\n      if (type === 'H5P.Image') {\n        parameters.visuals = {\n          backgroundColor: 'rgba(0,0,0,0)',\n          boxShadow: true\n        };\n      }\n      \/\/ Set default link visuals\n      else if (type === 'H5P.Link') {\n        parameters.visuals = {\n          backgroundColor: 'rgba(0,0,0,0.5)',\n          boxShadow: true\n        };\n      }\n    }\n\n    \/\/ Always show link as poster\n    if (type === 'H5P.Link' || type === 'H5P.GoToQuestion' || type === 'H5P.IVHotspot') {\n      var field = findField('displayType', interactionFields);\n      \/\/ Must set default to false and hide\n      field.default = 'poster';\n      field.widget = 'none';\n\n      \/\/ Hide label field\n      var labelField = findField('label', interactionFields);\n      labelField.widget = 'none';\n\n      if (type === 'H5P.GoToQuestion' && parameters.pause === undefined) {\n        parameters.pause = true;\n      }\n    }\n\n    \/\/ Set default displayType of images to poster\n    if (type === 'H5P.Image') {\n      var field = findField('displayType', interactionFields);\n      field.default = 'poster';\n    }\n\n    H5PEditor.processSemanticsChunk(interactionFields, parameters, $semanticFields, self);\n\n    self.setLibraryName(interaction.$form, type);\n  };\n\n  \/**\n   * Process interaction.\n   *\n   * @param {H5P.InteractiveVideoInteraction} interaction\n   * @param {Object} parameters\n   *\/\n  InteractiveVideoEditor.prototype.processInteraction = function (interaction, parameters) {\n    var self = this;\n    var type = interaction.getLibraryName();\n    this.createInteractionForm(interaction, parameters);\n\n    \/\/ Keep track of form elements\n    interaction.children = this.children;\n    this.children = undefined;\n\n    \/\/ Interaction fields object generated from interaction children\n    var interactionFields = self.getInteractionFields(interaction);\n\n    \/\/ Add classes to form elements if they exist\n    if (interactionFields.duration.$item) {\n      interactionFields.duration.$item.addClass('h5peditor-interaction-duration');\n    }\n\n    if (interactionFields.pause.$item) {\n      interactionFields.pause.$item.addClass('h5peditor-interaction-pause');\n    }\n\n    if (interactionFields.label.$item) {\n      interactionFields.label.$item.addClass('h5peditor-interaction-label');\n\n      \/\/ Remove label when displayType is poster\n      var $displayTypeRadios = $('.h5p-image-radio-button-group input:radio', interaction.$form);\n      var $labelWrapper = interactionFields.label.$item;\n\n      $displayTypeRadios.change(function () {\n        $labelWrapper.toggleClass('hide', !interaction.isButton());\n        if (!interaction.isButton() && interactionFields.pause.$item) {\n          interactionFields.pause.$input[0].checked = true;\n          interactionFields.pause.$input.trigger('change');\n        }\n      });\n\n      $labelWrapper.toggleClass('hide', !interaction.isButton());\n    }\n\n    if (interactionFields.buttonOnMobile.$item) {\n      var $buttonOnMobile = interactionFields.buttonOnMobile.$item;\n\n      if (type == 'H5P.Image') {\n        $displayTypeRadios.change(function () {\n          $buttonOnMobile.toggleClass('hide', interaction.isButton());\n        });\n\n        $buttonOnMobile.addClass((interaction.isButton() ? 'hide' : ''));\n      } else {\n        $buttonOnMobile.remove();\n      }\n    }\n\n    if (interactionFields.visuals.$group) {\n      $('.h5p-image-radio-button-group input:radio', interaction.$form).change(function () {\n        interactionFields.visuals.$group.toggleClass('hide', $(this).val() !== 'poster');\n      });\n\n      interactionFields.visuals.$group.toggleClass('hide', parameters.displayType !== 'poster');\n    }\n\n    \/\/ Create require completion instances for content types with scores.\n    \/\/ Summary is filtered out because it can't be retried.\n    var eligibleForRequireCompletion = InteractiveVideoEditor.XAPI_QUESTION_TYPES\n      .filter(function (questionType) {\n        return questionType !== 'H5P.Summary';\n      }).indexOf(interaction.getLibraryName()) >= 0;\n\n    if (eligibleForRequireCompletion) {\n      new H5PEditor.InteractiveVideo.RequireCompletion(self, interaction);\n    }\n\n    interaction.on('display', function (event) {\n      var $interaction = event.data;\n      \/\/ Customize rendering of interaction\n      self.newInteraction(interaction, $interaction);\n    });\n\n    \/\/ Find library field instance\n    var libraryFieldInstance;\n    for (var i = 0; i < interaction.children.length; i++) {\n      if (interaction.children[i] instanceof H5PEditor.Library) {\n        libraryFieldInstance = interaction.children[i];\n      }\n    }\n\n    if (libraryFieldInstance) {\n      \/**\n       * Callback for when library changes.\n       *\n       * @private\n       *\/\n      var libraryChange = function () {\n        var lib = libraryFieldInstance.currentLibrary.split(' ')[0];\n        if (lib !== 'H5P.Image') {\n          return;\n        }\n\n        \/**\n         * Callback for when image changes.\n         *\n         * @private\n         * @param {Object} newParams\n         *\/\n        var imageChange = function (newParams) {\n          if (newParams !== undefined && newParams.width !== undefined && newParams.height !== undefined) {\n            self.setImageSize(parameters, newParams);\n          }\n        };\n\n        \/\/ Add callback to the correct field\n        libraryFieldInstance.forEachChild(function (child) {\n          if (child.field.name === 'file') {\n            child.changes.push(imageChange);\n            return true;\n          }\n        });\n      };\n\n      \/\/ Add callback\n      libraryFieldInstance.changes.push(libraryChange);\n      if (libraryFieldInstance.children !== undefined) {\n        \/\/ Trigger right away\n        libraryChange();\n      }\n    }\n\n    if (parameters.pasted) {\n      if (type === 'H5P.Image' && parameters.action.params.file !== undefined) {\n        self.setImageSize(parameters, parameters.action.params.file);\n      }\n      delete parameters.pasted;\n    }\n  };\n\n  \/**\n   * Get interaction fields from interaction children\n   * @param {Object} interaction\n   * @return {Object} All interaction fields as object properties\n   *\/\n  InteractiveVideoEditor.prototype.getInteractionFields = function (interaction) {\n    return interaction.children.reduce(function (prev, child) {\n      if (child.field && child.field.name) {\n        prev[child.field.name] = child;\n      }\n      return prev;\n    }, {});\n  };\n\n  \/**\n   * Help set size for new images and keep aspect ratio.\n   *\n   * @param {object} parameters\n   * @param {object} newParams\n   *\/\n  InteractiveVideoEditor.prototype.setImageSize = function (parameters, newParams) {\n    if (newParams === undefined || newParams.width === undefined || newParams.height === undefined) {\n      return;\n    }\n    var self = this;\n\n    \/\/ Avoid to small images\n    var fontSize = Number(self.IV.$videoWrapper.css('fontSize').replace('px', ''));\n    if (newParams.width < fontSize) {\n      newParams.width = fontSize;\n    }\n    if (newParams.height < fontSize) {\n      newParams.height = fontSize;\n    }\n\n    \/\/ Reduce height for tiny images, stretched pixels looks horrible\n    var suggestedHeight = newParams.height \/ fontSize;\n    if (suggestedHeight < parameters.height) {\n      parameters.height = suggestedHeight;\n    }\n\n    \/\/ Calculate new width\n    parameters.width = (parameters.height * (newParams.width \/ newParams.height));\n  };\n\n  \/**\n   * Add library name to library form.\n   *\n   * @param {H5P.jQuery} $form\n   *   Interaction view form\n   * @param {string} libraryType\n   *   Library type, e.g. H5P.Blanks\n   *\/\n  InteractiveVideoEditor.prototype.setLibraryName = function ($form, libraryType) {\n    var libraryName = libraryType.replace('.', '-').toLowerCase() + '-library';\n    var $libraryForm = $form.children('.library');\n    $libraryForm.addClass(libraryName);\n  };\n\n  \/**\n   *\n   * @param interaction\n   *\/\n  InteractiveVideoEditor.prototype.openInteractionDialog = function (interaction) {\n    var that = this;\n    if (that.lastState !== H5P.Video.PAUSED && that.lastState !== H5P.Video.ENDED) {\n      \/\/ Pause video\n      that.IV.video.pause();\n    }\n\n    \/\/ Try to figure out a title for the dialog\n    var title = interaction.getTitle();\n    if (title === that.IV.l10n.interaction) {\n      \/\/ Try to find something better than the default title\n      title = that.findLibraryTitle(interaction.getLibraryName());\n      if (!title) {\n        \/\/ Couldn't find anything, use default\n        title = that.IV.l10n.interaction;\n      }\n    }\n\n    \/\/ Add dialog buttons\n    var $doneButton = $('<a href=\"#\" class=\"h5p-button h5p-done\">' + t('done') + '<\/a>')\n      .click(function () {\n        if (H5PEditor.Html) {\n          \/\/ Need to do this before form is validated\n          H5PEditor.Html.removeWysiwyg();\n        }\n        if (that.validDialog(interaction)) {\n          that.dnb.dialog.close();\n          interaction.focus();\n        }\n        that.IV.addSliderInteractions();\n        return false;\n      });\n\n    var $removeButton = $('<a href=\"#\" class=\"h5p-button h5p-remove\">' + t('remove') + '<\/a>')\n      .click(function () {\n        if (H5PEditor.Html) {\n          \/\/ Need to do this before form is validated\n          H5PEditor.Html.removeWysiwyg();\n        }\n        if (confirm(t('removeInteraction'))) {\n          that.removeInteraction(interaction);\n          that.dnb.dialog.close();\n        }\n        that.IV.addSliderInteractions();\n        that.dnb.blurAll();\n        return false;\n      });\n\n    var $buttons = $('<div class=\"h5p-dialog-buttons\"><\/div>')\n      .append($doneButton)\n      .append($removeButton);\n\n    interaction.setTitle(title);\n    interaction.trigger('openEditDialog');\n    that.dnb.dialog.open(interaction.$form, title, interaction.getClass() + '-icon', $buttons);\n\n    \/\/ Blur context menu when opening dialog\n    setTimeout(function () {\n      that.dnb.blurAll();\n    }, 0);\n  };\n\n  \/**\n   * Add interaction to drag n bar and initialize listeners.\n   * @param {H5P.InteractiveVideoInteraction} interaction Interaction\n   * @param {H5P.jQuery} $interaction Interaction element\n   * @param {Object} [options] Options for new dnb element\n   *\/\n  InteractiveVideoEditor.prototype.addInteractionToDnb = function (interaction, $interaction, options) {\n    var that = this;\n    var newDnbElement = that.dnb.add($interaction, interaction.getClipboardData(), options);\n    var createdNewElement = interaction.setDnbElement(newDnbElement);\n\n    if (!interaction.isButton()) {\n      \/\/ For posters, we don't want the elements inside the interaction to be tabbable in the editor.\n      $interaction.find('.h5p-interaction-inner').find('*').attr('tabindex', '-1');\n    }\n\n    \/\/ New DragNBarElement was set, register listeners\n    if (createdNewElement) {\n      newDnbElement.contextMenu.on('contextMenuEdit', function () {\n        that.openInteractionDialog(interaction);\n        newDnbElement.hideContextMenu();\n      });\n\n      newDnbElement.contextMenu.on('contextMenuRemove', function () {\n        if (confirm(t('removeInteraction'))) {\n          that.removeInteraction(interaction);\n          that.dnb.dialog.close();\n        }\n        that.IV.addSliderInteractions();\n        that.dnb.blurAll();\n      });\n\n      newDnbElement.contextMenu.on('contextMenuBringToFront', function () {\n        \/\/ Find interaction index\n        var oldZ;\n        for (var i = 0; i < that.IV.interactions.length; i++) {\n          if (that.IV.interactions[i] === interaction) {\n            oldZ = i;\n            break;\n          }\n        }\n\n        \/\/ Add to end of params\n        that.params.interactions.push(that.params.interactions.splice(oldZ, 1)[0]);\n\n        \/\/ Update internally for IV player\n        that.IV.interactions.push(that.IV.interactions.splice(oldZ, 1)[0]);\n\n        \/\/ Update visuals\n        $interaction.appendTo(that.IV.$overlay);\n      });\n\n      newDnbElement.contextMenu.on('contextMenuSendToBack', function () {\n        \/\/ Find interaction index\n        var oldZ;\n        for (var i = 0; i < that.IV.interactions.length; i++) {\n          if (that.IV.interactions[i] === interaction) {\n            oldZ = i;\n            break;\n          }\n        }\n\n        \/\/ Add to end of params\n        that.params.interactions.unshift(that.params.interactions.splice(oldZ, 1)[0]);\n\n        \/\/ Update internally for IV player\n        that.IV.interactions.unshift(that.IV.interactions.splice(oldZ, 1)[0]);\n\n        \/\/ Update visuals\n        $interaction.prependTo(that.IV.$overlay);\n      });\n    }\n  };\n\n  \/**\n   * Called when rendering a new interaction.\n   *\n   * @param {H5P.InteractiveVideoInteraction} interaction\n   * @param {H5P.jQuery} $interaction\n   *\/\n  InteractiveVideoEditor.prototype.newInteraction = function (interaction, $interaction) {\n    var that = this;\n    var libraryName = interaction.getLibraryName();\n    var options = {\n      cornerLock: (libraryName === 'H5P.Image'),\n      disableResize: (libraryName === 'H5P.Link') || interaction.isButton()\n    };\n\n    if (!interaction.isButton()) {\n      \/\/ Add overlay\n      $('<div\/>', {\n        'class': 'h5p-interaction-overlay'\n      }).appendTo($interaction);\n    }\n\n    if (that.dnb !== undefined) {\n      \/\/ Add resizing, context menu etc.\n      that.addInteractionToDnb(interaction, $interaction, options);\n    }\n\n    if (!interaction.isButton()) {\n      \/\/ Pause video on resizing\n      $interaction.children('.h5p-dragnresize-handle').mousedown(function (event) {\n        that.interaction = interaction;\n        that.IV.video.pause();\n      });\n    }\n\n    \/\/ Disable the normal dialog\n    interaction.dialogDisabled = true;\n\n    $interaction.mousedown(function (event) {\n      \/\/ Keep track of last state\n      that.IV.lastState = that.IV.currentState;\n\n      that.interaction = interaction;\n    }).dblclick(function () {\n      if (that.dnb !== undefined) {\n        that.openInteractionDialog(interaction);\n      }\n    }).focus(function () {\n      \/\/ On focus, show overlay\n      that.$focusHandler.addClass('show');\n    });\n  };\n\n  \/**\n   * Validate the current dialog to see if it can be closed.\n   *\n   * @param {H5P.InteractiveVideoInteraction} interaction\n   * @returns {boolean}\n   *\/\n  InteractiveVideoEditor.prototype.validDialog = function (interaction) {\n    var valid = true;\n    var elementKids = interaction.children;\n    for (var i = 0; i < elementKids.length; i++) {\n      if (elementKids[i].validate() === false) {\n        valid = false;\n      }\n    }\n\n    if (valid) {\n      \/\/ Keep form\n      interaction.$form.detach();\n\n      \/\/ Remove interaction from display\n      interaction.remove(true);\n\n      \/\/ Recreate content instance\n      interaction.reCreate();\n\n      \/\/ Make sure the element is inside the container the next time it's displayed\n      interaction.fit = true;\n\n      \/\/ Check if we should show again\n      interaction.toggle(this.IV.video.getCurrentTime(), true);\n\n      if (this.dnb) {\n        this.dnb.blurAll();\n      }\n    }\n\n    return valid;\n  };\n\n  \/**\n   * Makes sure the given interaction doesn't stick out of the video container.\n   *\n   * @param {H5P.jQuery} $interaction\n   * @param {Object} interactionParams\n   *\/\n  InteractiveVideoEditor.prototype.fit = function ($interaction, interactionParams) {\n    var self = this;\n\n    var sizeNPosition = self.dnb.getElementSizeNPosition($interaction);\n    var updated = H5P.DragNBar.fitElementInside(sizeNPosition);\n\n    \/\/ Set the updated properties\n    var style = {};\n\n    if (updated.width !== undefined) {\n      interactionParams.width = updated.width \/ self.IV.scaledFontSize;\n      style.width = interactionParams.width + 'em';\n    }\n    if (updated.left !== undefined) {\n      interactionParams.x = updated.left \/ (sizeNPosition.containerWidth \/ 100);\n      style.left = interactionParams.x + '%';\n    }\n    if (updated.height !== undefined) {\n      interactionParams.height = updated.height \/ self.IV.scaledFontSize;\n      style.height = interactionParams.height + 'em';\n    }\n    if (updated.top !== undefined) {\n      interactionParams.y = updated.top \/ (sizeNPosition.containerHeight \/ 100);\n      style.top = interactionParams.y + '%';\n    }\n\n    \/\/ Apply style\n    $interaction.css(style);\n  };\n\n  \/**\n   * Revert our customization to the dialog.\n   *\/\n  InteractiveVideoEditor.prototype.hideDialog = function () {\n    this.IV.hideDialog();\n    this.IV.$dialog.children('.h5p-dialog-inner').css({\n      height: '',\n      width: ''\n    });\n    this.IV.$dialog.children('.h5p-dialog-hide').show();\n    this.IV.$dialog.children('.h5p-dialog-buttons').remove();\n  };\n\n  \/**\n   * Remove interaction from video.\n   *\n   * @param {number} id\n   *\/\n  InteractiveVideoEditor.prototype.removeInteraction = function (interaction) {\n    for (var i = 0; i < this.IV.interactions.length; i++) {\n      if (this.IV.interactions[i] === interaction) {\n        this.params.interactions.splice(i, 1);\n        this.IV.interactions.splice(i, 1);\n        break;\n      }\n    }\n    H5PEditor.removeChildren(interaction.children);\n    interaction.remove();\n  };\n\n  \/**\n   * Returns buttons for the DragNBar.\n   *\n   * @param {Array} libraries\n   * @returns {Array}\n   *\/\n  InteractiveVideoEditor.prototype.getButtons = function (libraries) {\n    var buttons = [];\n    for (var i = 0; i < libraries.length; i++) {\n      if (libraries[i].restricted === undefined || !libraries[i].restricted) {\n        buttons.push(this.getButton(libraries[i]));\n      }\n    }\n\n    return buttons;\n  };\n\n  \/**\n   * Find the title for the given library.\n   *\n   * @param {string} libraryName\n   * @returns {string}\n   *\/\n  InteractiveVideoEditor.prototype.findLibraryTitle = function (libraryName) {\n    if (!this.libraries) {\n      return;\n    }\n\n    for (var i = 0; i < this.libraries.length; i++) {\n      if (this.libraries[i].name === libraryName) {\n        return this.getLibraryTitle(this.libraries[i]);\n      }\n    }\n  };\n\n  \/**\n   * Determines a human readable name for the library to use in the editor.\n   *\n   * @param {string} library\n   * @returns {string}\n   *\/\n  InteractiveVideoEditor.prototype.getLibraryTitle = function (library) {\n    \/\/ Determine title\n    switch (library.name) {\n      case 'H5P.Summary':\n        return 'Statements';\n      case 'H5P.Nil':\n        return 'Label';\n      default:\n        return library.title;\n    }\n  };\n\n  \/**\n   * Returns button data for the given library.\n   *\n   * @param {string} library\n   * @returns {Object}\n   *\/\n  InteractiveVideoEditor.prototype.getButton = function (library) {\n    var that = this;\n    var id = library.name.split('.')[1].toLowerCase();\n\n    return {\n      id: id,\n      title: that.getLibraryTitle(library),\n      createElement: function () {\n        return that.addInteraction(library.uberName);\n      }\n    };\n  };\n\n  \/**\n   * Add a new interaction to the interactive video.\n   *\n   * @param {string|object} library Content type or parameters\n   * @param {object} [options] Override the default options\n   * @returns {H5P.jQuery}\n   *\/\n  InteractiveVideoEditor.prototype.addInteraction = function (library, options) {\n    this.IV.$overlay.addClass('h5p-visible');\n    options = options || {};\n    var self = this;\n    self.IV.video.pause();\n\n    var params;\n    if (!(library instanceof String || typeof library === 'string')) {\n      params = library;\n    }\n\n    var from = Math.floor(self.IV.video.getCurrentTime());\n    if (!params) {\n      var type = library.split(' ')[0];\n\n      params = {\n        x: 47.813153766, \/\/ Center button\n        y: 46.112273361,\n        width: 10,\n        height: 10,\n        duration: {\n          from: from,\n          to: from + 10\n        },\n        libraryTitle: self.findLibraryTitle(type)\n      };\n      if (options.action) {\n        params.action = options.action;\n        params.displayType = options.displayType ? options.displayType : 'poster';\n      }\n      else {\n        params.action = {\n          library: library,\n          params: {}\n        };\n      }\n      if (options.width && options.height && !options.displayType) {\n        params.width = options.width * this.pToEm;\n        params.height = options.height * this.pToEm;\n      }\n      params.action.subContentId = H5P.createUUID();\n\n      if (type === 'H5P.Nil') {\n        params.label = 'Lorem ipsum dolor sit amet...';\n      }\n      else if (type === 'H5P.Link') {\n        \/\/ Links are always posters\n        params.displayType = 'poster';\n      }\n      if (options.pasted) {\n        params.pasted = true;\n      }\n    }\n    else {\n      \/\/ Change starting time, but keep the same length\n      params.duration.to = from + (params.duration.to - params.duration.from);\n      params.duration.from = from;\n    }\n\n    var duration = Math.floor(self.IV.video.getDuration());\n    if (params.duration.to > duration) {\n      \/\/ Keep interaction inside video play time\n      params.duration.to = duration;\n    }\n\n    \/\/ Make sure we don't overlap another visible element\n    var size = window.getComputedStyle(this.IV.$videoWrapper[0]);\n    var widthToPx = parseFloat(size.width) \/ 100;\n    var heightToPx = parseFloat(size.height) \/ 100;\n    var pos = {\n      x: params.x * widthToPx,\n      y: params.y * heightToPx\n    };\n    this.dnb.avoidOverlapping(pos, {\n      width: params.width * this.IV.scaledFontSize,\n      height: params.height * this.IV.scaledFontSize,\n    });\n    params.x = pos.x \/ widthToPx;\n    params.y = pos.y \/ heightToPx;\n\n    self.params.interactions.push(params);\n    var i = self.params.interactions.length - 1;\n    self.interaction = self.IV.initInteraction(i);\n    self.processInteraction(self.interaction, params);\n\n    var $interaction = self.interaction.toggle(from);\n    this.IV.addSliderInteractions();\n    return $interaction;\n  };\n\n  \/**\n   * Set new video params and remove old player.\n   *\n   * @param {Object} files\n   *\/\n  InteractiveVideoEditor.prototype.setVideo = function (files) {\n    this.video = files;\n\n    if (this.IV !== undefined) {\n      delete this.IV;\n    }\n  };\n\n  \/**\n   * Set new poster and remove old player.\n   *\n   * @param {Object} poster\n   *\/\n  InteractiveVideoEditor.prototype.setPoster = function (poster) {\n    this.poster = poster;\n\n    if (this.IV !== undefined) {\n      delete this.IV;\n    }\n  };\n\n  \/**\n   * Disable guided tour\n   *\n   * @method disableGuidedTour\n   *\/\n  InteractiveVideoEditor.disableGuidedTour = function () {\n    InteractiveVideoEditor.showGuidedTour = false;\n  };\n  InteractiveVideoEditor.showGuidedTour = true;\n  \/**\n   * Start the guided tour if not disabled\n   *\n   * @method startGuidedTour\n   * @param  {Boolean}        force If true, don't care if user already has seen it\n   *\/\n  InteractiveVideoEditor.prototype.startGuidedTour = function (force) {\n    if (InteractiveVideoEditor.showGuidedTour) {\n      H5PEditor.InteractiveVideo.GuidedTours.start(this.currentTabIndex, force || false, t);\n      \/\/ Make sure the guided tour stays behind other important popups\n    }\n  };\n\n  \/**\n   * Append field to wrapper.\n   *\n   * @param {H5P.jQuery} $wrapper\n   *\/\n  InteractiveVideoEditor.prototype.appendTo = function ($wrapper) {\n    var self = this;\n    \/\/ Added to support older versions of core. Needed when using IV in CP.\n    var $libwrap = $wrapper.parent().parent();\n    if ($libwrap.hasClass('libwrap')) {\n      $libwrap.addClass('h5p-interactivevideo-editor');\n    }\n\n    this.$item = $(this.createHtml()).appendTo($wrapper);\n    this.$editor = this.$item.children('.h5peditor-interactions');\n    this.$errors = this.$item.children('.h5p-errors');\n    this.$bar = this.$item.children('.h5peditor-dragnbar');\n\n    $('<span>', {\n      'class': 'h5peditor-guided-tour',\n      html: t('tourButtonStart'),\n      click: function () {\n        self.startGuidedTour(true);\n        return false;\n      }\n    }).appendTo('.h5p-interactivevideo-editor .field-name-interactiveVideo > .h5peditor-label-wrapper > .h5peditor-label');\n    self.startGuidedTour();\n  };\n\n  \/**\n   * Create HTML for the field.\n   *\n   * @returns {string}\n   *\/\n  InteractiveVideoEditor.prototype.createHtml = function () {\n    return H5PEditor.createItem(this.field.widget, '<div class=\"h5peditor-interactions\"><\/div>');\n  };\n\n  \/**\n   * Create HTML for the no video source message.\n   *\n   * @param {Object} parent\n   * @returns {jQuery}\n   *\/\n  InteractiveVideoEditor.prototype.noVideoSourceMessage = function (parent) {\n    var $html = $('<div\/>');\n\n    var $icon = $('<div\/>', {\n      'class': 'h5p-no-video-icon',\n      appendTo: $html\n    });\n\n    var $title = $('<div\/>', {\n      'class': 'h5p-no-video-title',\n      text: t('noVideoSource'),\n      appendTo: $html\n    });\n\n    var $text = $('<div\/>', {\n      'class': 'h5p-no-video-text',\n      text: t('selectVideo'),\n      appendTo: $html\n    });\n\n    var $button = $('<button\/>', {\n      'class': 'h5p-no-video-button h5p-joubelui-button',\n      type: 'button',\n      text: t('tourButtonBack'),\n      click: function () {\n        parent.$tabs[0].click()\n      },\n      appendTo: $html\n    });\n\n    return $html;\n  };\n\n  \/**\n   * Validate the current field.\n   *\n   * @returns {boolean}\n   *\/\n  InteractiveVideoEditor.prototype.validate = function () {\n    \/\/ We must stops the playpack of any media!\n    if (this.IV && this.IV.video) {\n      this.IV.video.pause();\n    }\n\n    \/\/ Run validate on interactions to trigger the storing of values\n    if (this.IV) {\n      for (var i = 0; i < this.IV.interactions.length; i++) {\n        var interaction = this.IV.interactions[i];\n        for (var j = 0; j < interaction.children.length; j++) {\n          interaction.children[j].validate();\n        }\n      }\n    }\n\n    return true; \/\/ An interactive video is always valid :-)\n  };\n\n  \/**\n   * Remove this item.\n   *\/\n  InteractiveVideoEditor.prototype.remove = function () {\n    if (this.dnb !== undefined) {\n      this.dnb.remove();\n    }\n    H5PEditor.InteractiveVideo.GuidedTours.remove();\n    this.$item.remove();\n  };\n\n  \/**\n   * Collect functions to execute once the tree is complete.\n   *\n   * @param {function} ready\n   *\/\n  InteractiveVideoEditor.prototype.ready = function (ready) {\n    if (this.passReadies) {\n      this.parent.ready(ready);\n    }\n    else {\n      this.readies.push(ready);\n    }\n  };\n\n  \/**\n   * Translate UI texts for this library.\n   *\n   * @private\n   * @param {string} key\n   * @param {Object} [vars] Placeholders\n   * @returns {string}\n   *\/\n  var t = InteractiveVideoEditor.t = function (key, vars) {\n    return H5PEditor.t('H5PEditor.InteractiveVideo', key, vars);\n  };\n\n  \/**\n   * Look for field with the given name in the given collection.\n   *\n   * @private\n   * @param {string} name of field\n   * @param {Array} fields collection to look in\n   * @returns {Object} field object\n   *\/\n  var findField = function (name, fields) {\n    for (var i = 0; i < fields.length; i++) {\n      if (fields[i].name === name) {\n        return fields[i];\n      }\n    }\n  };\n\n  \/**\n   * Hide the given fields from the given form.\n   *\n   * @private\n   * @param {Array} interactionFields to be form\n   * @param {Array} fields to hide\n   *\/\n  var hideFields = function (interactionFields, fields) {\n    \/\/ Find and hide fields in list\n    for (var i = 0; i < fields.length; i++) {\n      var field = findField(fields[i], interactionFields);\n      if (field) {\n        field.widget = 'none';\n      }\n    }\n  };\n\n  \/**\n   * A maintained list of strings with content types that has a score.\n   * @type {string[]}\n   *\/\n  InteractiveVideoEditor.XAPI_QUESTION_TYPES = [\n    'H5P.MultiChoice',\n    'H5P.SingleChoiceSet',\n    'H5P.Blanks',\n    'H5P.DragQuestion',\n    'H5P.Summary',\n    'H5P.MarkTheWords',\n    'H5P.DragText',\n    'H5P.TrueFalse'\n  ];\n\n  return InteractiveVideoEditor;\n})(H5P.jQuery);\n\n\/\/ Default english translations\nH5PEditor.language['H5PEditor.InteractiveVideo'] = {\n  libraryStrings: {\n    selectVideo: 'You must select a video before adding interactions.',\n    noVideoSource: 'No Video Source',\n    notVideoField: '\":path\" is not a video.',\n    notImageField: '\":path\" is not a image.',\n    insertElement: 'Click and drag to place :type',\n    popupTitle: 'Edit :type',\n    done: 'Done',\n    loading: 'Loading...',\n    remove: 'Remove',\n    removeInteraction: 'Are you sure you wish to remove this interaction?',\n    addBookmark: 'Add bookmark',\n    newBookmark: 'New bookmark',\n    bookmarkAlreadyExists: 'Bookmark already exists here. Move playhead and add a bookmark at another time.',\n    tourButtonStart: 'Tour',\n    tourButtonExit: 'Exit',\n    tourButtonDone: 'Done',\n    tourButtonBack: 'Back',\n    tourButtonNext: 'Next',\n    tourStepUploadIntroText: '<p>This tour guides you through the most important features of the Interactive Video editor.<\/p><p>Start this tour at any time by pressing the Tour button in the top right corner.<\/p><p>Press EXIT to skip this tour or press NEXT to continue.<\/p>',\n    tourStepUploadFileTitle: 'Adding video',\n    tourStepUploadFileText: '<p>Start by adding a video file. You can upload a file from your computer or paste a URL to a YouTube video or a supported video file.<\/p><p>To ensure compatibility across browsers, you can upload multiple file formats of the same video, such as mp4 and webm.<\/p>',\n    tourStepUploadAddInteractionsTitle: 'Adding interactions',\n    tourStepUploadAddInteractionsText: '<p>Once you have added a video, you can start adding interactions.<\/p><p>Press the <em>Add interactions<\/em> tab to get started.<\/p>',\n    tourStepCanvasToolbarTitle: 'Adding interactions',\n    tourStepCanvasToolbarText: 'To add an interaction, drag an element from the toolbar and drop it onto the video.',\n    tourStepCanvasEditingTitle: 'Editing interactions',\n    tourStepCanvasEditingText: '<p>Once an interaction has been added, you can drag to reposition it.<\/p><p>To resize an interaction, press on the handles and drag.<\/p><p>When you select an interaction, a context menu will appear. To edit the content of the interaction, press the Edit button in the context menu. You can remove an interaction by pressing the Remove button on the context menu.<\/p>',\n    tourStepCanvasBookmarksTitle: 'Bookmarks',\n    tourStepCanvasBookmarksText: 'You can add Bookmarks from the Bookmarks menu. Press the Bookmark button to open the menu.',\n    tourStepCanvasPreviewTitle: 'Preview your interactive video',\n    tourStepCanvasPreviewText: 'Press the Play button to preview your interactive video while editing.',\n    tourStepCanvasSaveTitle: 'Save and view',\n    tourStepCanvasSaveText: \"When you're done adding interactions to your video, press Save\/Create to view the result.\",\n    tourStepSummaryText: 'This optional Summary quiz will appear at the end of the video.',\n    fullScoreRequiredPause: '\"Full score required\" option requires that \"Pause\" is enabled.',\n    fullScoreRequiredRetry: '\"Full score required\" option requires that \"Retry\" is enabled',\n    fullScoreRequiredTimeFrame: 'There already exists an interaction that requires full score at the same interval as this interaction.<br> Only one of the interactions will be required to answer.'\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/Scripts\/guided-tours.js?ver=1.17.4":"\nH5PEditor.InteractiveVideo.GuidedTours = (function ($) {\n\n  \/\/ Shorthand for translate function:\n  var t = H5PEditor.InteractiveVideo.t;\n\n  var currentTourId;\n\n  \/**\n   * @class H5PEditor.InteractiveVideo.GuidedTours\n   *\/\n  function GuidedTours () {}\n\n  \/**\n   * Defines the different tours in IV\n   * @return {Array}\n   *\/\n  GuidedTours.setup = function () {\n\n    if (GuidedTours.tours === undefined) {\n      GuidedTours.tours = [\n        \/\/ Upload video tab\n        {\n          steps: [\n            {\n              text: t('tourStepUploadIntroText'),\n              attachTo: {element: '.field.wizard .h5peditor-label', on: 'bottom'},\n              noArrow: true\n            },\n            {\n              title: t('tourStepUploadFileTitle'),\n              text: t('tourStepUploadFileText'),\n              attachTo: {element: '.field.video .h5p-add-file', on: 'left'},\n              highlightElement: true\n            },\n            {\n              title: t('tourStepUploadAddInteractionsTitle'),\n              text: t('tourStepUploadAddInteractionsText'),\n              attachTo: {element: '.h5peditor-tab-assets', on: 'bottom'},\n              highlightElement: true\n            }\n          ],\n          options: {\n            id: 'h5p-editor-interactive-video-initial-v1'\n          }\n        },\n        \/\/ Interactions tab\n        {\n          steps: [\n            {\n              title: t('tourStepCanvasToolbarTitle'),\n              text: t('tourStepCanvasToolbarText'),\n              attachTo: {element: '.h5peditor-dragnbar', on: 'bottom'},\n              highlightElement: true\n            },\n            {\n              title: t('tourStepCanvasEditingTitle'),\n              text: t('tourStepCanvasEditingText'),\n              attachTo: {element: '.h5p-video-wrapper', on: 'center'},\n              noArrow: true,\n              scrollTo: true\n            },\n            {\n              title: t('tourStepCanvasBookmarksTitle'),\n              text: t('tourStepCanvasBookmarksText'),\n              attachTo: {element: '.h5p-control.h5p-bookmarks', on: 'right'},\n              highlightElement: true,\n              scrollTo: true\n            },\n            {\n              title: t('tourStepCanvasPreviewTitle'),\n              text: t('tourStepCanvasPreviewText'),\n              attachTo: {element: '.h5p-control.h5p-play', on: 'right'},\n              highlightElement: true,\n              scrollTo: true\n            },\n            {\n              title: t('tourStepCanvasSaveTitle'),\n              text: t('tourStepCanvasSaveText'),\n              attachTo: {element: '.h5p-video-wrapper', on: 'center'},\n              noArrow: true,\n              scrollTo: true\n            }\n          ],\n          options: {\n            id: 'h5p-editor-interactive-video-interactions-v1'\n          }\n        },\n        \/\/ Summary tab\n        {\n          steps: [\n            {\n              text: t('tourStepSummaryText'),\n              attachTo: {element: '.h5peditor-tabs', on: 'bottom'},\n              noArrow: true\n            }\n          ],\n          options: {\n            id: 'h5p-editor-interactive-video-summary-v1'\n          }\n        }\n      ];\n    }\n\n    return GuidedTours.tours;\n  };\n\n  \/**\n   * Starts a guided tour\n   *\n   * @method GuidedTours.start\n   * @static\n   * @param  {number} tourId The index of the guide (as defined in the tours array)\n   * @param  {boolean} force Force displaying the guide (even if it has been displayed before)\n   *\/\n  GuidedTours.start = function (tourId, force, t) {\n    force = force || false;\n\n    var tours = GuidedTours.setup();\n\n    if ((tourId < 0 || (tourId+1) > tours.length) ||\n        (tourId === currentTourId && tours[currentTourId].instance.isOpen())) {\n      return;\n    }\n\n    \/\/ Hide guide if another guide is allready present - only one guide at a time\n    if (currentTourId !== undefined) {\n      tours[currentTourId].instance.hide();\n    }\n\n    var tour = tours[tourId];\n\n    \/\/ Add labels:\n    tour.options.labels = {\n      exit: t('tourButtonExit'),\n      done: t('tourButtonDone'),\n      back: t('tourButtonBack'),\n      next: t('tourButtonNext')\n    };\n\n    if (tour !== undefined) {\n      if (tour.instance === undefined) {\n        tour.instance = new H5P.GuidedTour(tour.steps, tour.options);\n      }\n      tour.instance.start(force, function () {\n        currentTourId = tourId;\n      });\n    }\n  };\n\n  \/**\n   * Checks if any guided tour is open\n   *\n   * @method GuidedTours.isOpen\n   * @static\n   *\/\n  GuidedTours.isOpen = function () {\n    if (GuidedTours.tours) {\n      for (var i = 0; i < GuidedTours.tours.length; i++) {\n        if (GuidedTours.tours[i].instance && GuidedTours.tours[i].instance.isOpen()) {\n          return true;\n        }\n      }\n    }\n    return false;\n  };\n\n  \/**\n   * Removes all guided tours\n   *\n   * @method GuidedTours.remove\n   * @static\n   *\/\n  GuidedTours.remove = function () {\n    for (var i = 0; i < GuidedTours.tours.length; i++) {\n      var tour = GuidedTours.tours[i].instance;\n      tour && tour.destroy();\n    }\n  };\n\n  return GuidedTours;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/Scripts\/require-completion.js?ver=1.17.4":"\n\/**\n * @class H5PEditor.InteractiveVideo.RequireCompletion\n *\/\nH5PEditor.InteractiveVideo.RequireCompletion = (function () {\n\n  \/**\n   * Handles the require completion option and the way it affects the interaction\n   * and other interactions.\n   *\n   * @param {H5PEditor.InteractiveVideo} IVEditor\n   * @param {Object} interaction\n   * @constructor\n   *\/\n  function RequireCompletion (IVEditor, interaction) {\n\n    \/\/ Shorthand for translating texts\n    var t = H5PEditor.InteractiveVideo.t;\n\n    \/\/ Determines if retry is enabled for this interaction\n    var enableRetry;\n\n    \/**\n     * Interaction fields gathers all fields of the interaction\n     *\n     * @type {Object} interactionFields\n     * @param {Object} interactionFields.adaptivity\n     *\/\n    var interactionFields = IVEditor.getInteractionFields(interaction);\n\n    \/**\n     * A group with adaptivity settings of the interaction\n     *\n     * @type {Object} adaptivityFields\n     * @param {Object} adaptivityFields.requireCompletion\n     *\/\n    var adaptivityFields = IVEditor.getInteractionFields(interactionFields.adaptivity);\n\n    \/\/ Message to show that triggering retry has been disabled\n    var enableRetryDisabledMsg = document.createElement('div');\n    enableRetryDisabledMsg.textContent = t('fullScoreRequiredRetry');\n    enableRetryDisabledMsg.className = [\n      'h5peditor-field-description',\n      'h5peditor-enable-retry-disabled-msg',\n      'h5p-hide'\n    ].join(' ');\n\n    \/\/ Message to show that triggering pause option has been disabled\n    var pauseDisabledMsg = document.createElement('div');\n    pauseDisabledMsg.textContent = t('fullScoreRequiredPause');\n    pauseDisabledMsg.className = [\n      'h5peditor-field-description',\n      'h5peditor-pause-disabled-msg',\n      'h5p-hide'\n    ].join(' ');\n    interactionFields.pause.$item.get(0).appendChild(pauseDisabledMsg);\n\n    \/\/ Message showing that two interactions have a time conflict\n    var conflictingTimeMsg = document.createElement('div');\n    conflictingTimeMsg.innerHTML = t('fullScoreRequiredTimeFrame');\n    conflictingTimeMsg.className = [\n      'h5peditor-field-description',\n      'h5peditor-conflicting-time-msg',\n      'h5p-hide'\n    ].join(' ');\n\n    interactionFields.pause.$item.get(0).parentNode\n      .insertBefore(conflictingTimeMsg, interactionFields.pause.$item.get(0).nextSibling);\n\n    \/\/ Handle behavioural changes of $form when require completion input is changed\n    adaptivityFields.requireCompletion.$input.change(function () {\n      handleRequireCompletionToggled();\n    });\n\n    \/\/ Check if conflict message should be shown when duration is changed\n    interactionFields.duration.$inputs.change(function () {\n      toggleDuration(adaptivityFields.requireCompletion.$input[0].checked);\n    });\n\n    \/\/ Check if conflicting message should be shown when dialog is opened\n    interaction.on('openEditDialog', function () {\n      pollForLoadedSemantics(interactionFields);\n    });\n\n    \/**\n     * Poll for when semantics of the interaction library has loaded\n     *\/\n    function pollForLoadedSemantics(fields) {\n      var hasLoaded = fields.action.children;\n\n      if (hasLoaded) {\n        insertRetryButtonMessage(fields.action);\n        handleRequireCompletionToggled();\n      }\n      else {\n        setTimeout(function () {\n          pollForLoadedSemantics(fields)\n        }, 20);\n      }\n    }\n\n    \/**\n     * Insert retry button message into the library specific semantics.\n     *\n     * @param {Object} library Library fields\n     *\/\n    function insertRetryButtonMessage(library) {\n      var libraryFields = IVEditor.getInteractionFields(library);\n      if (!libraryFields.behaviour) {\n        return;\n      }\n\n      var behaviour = IVEditor.getInteractionFields(libraryFields.behaviour);\n      enableRetry = behaviour.enableRetry;\n\n      if (enableRetry && !enableRetryDisabledMsg.parentNode) {\n        enableRetry.$item.get(0).parentNode\n          .insertBefore(enableRetryDisabledMsg, enableRetry.$item.get(0).nextSibling);\n      }\n    }\n\n    \/**\n     * If interaction has the require completion option enabled it will\n     * search through all other interactions to determine if any of them\n     * has a conflicting duration with this interaction, in which case a conflict\n     * message will be displayed\n     *\n     * @param {Object} interaction Interaction that we are interested in checking\n     * @param {Array} otherInteractions List of interactions that will be checked\n     *  for conflicting duration time with given interaction\n     *\/\n    function handleConflictingInteractions(interaction, otherInteractions) {\n      if (!interaction.getRequiresCompletion()) {\n        return;\n      }\n\n      var conflictingInteractions = getConflictingInteractions(interaction, otherInteractions);\n      conflictingTimeMsg.classList.toggle('h5p-hide', !conflictingInteractions.length);\n    }\n\n    \/**\n     * Checks if an interaction is at a given time interval\n     *\n     * @param {Object} time Time we are comparing against\n     * @param {number} time.from Showing from\n     * @param {number} time.to End of the interval we are checking\n     * @param {Object} interaction Interaction time interval\n     *\n     * @return {boolean} Returns true if the interaction starts or ends within\n     *  the given interval\n     *\/\n    function hasDurationWithin(time, interaction) {\n      var duration = interaction.getDuration();\n      return time.from >= duration.from  &&  time.from <= duration.to\n        || time.to >= duration.from && time.to <= duration.to;\n    }\n\n    \/**\n     * Checks if an interaction requires completion\n     *\n     * @param {Object} interaction Interaction that we are checking the settings of\n     * @return {boolean} Returns true if the interaction requires completion\n     *\/\n    function hasRequireCompletion(interaction) {\n      return interaction.getRequiresCompletion()\n    }\n\n    \/**\n     * Checks if an interaction has conflicting interval time with other interactions\n     *\n     * @param {Object} interaction Interaction we are checking\n     * @param {Array} allInteractions Interactions that we are checking for conflicts\n     * @return {Array} List of conflicting interactions\n     *\/\n    function getConflictingInteractions(interaction, allInteractions) {\n      return allInteractions\n        .filter(hasDurationWithin.bind(this, interaction.getDuration()))\n        .filter(hasRequireCompletion)\n        .filter(function (ia) {\n          return ia !== interaction;\n        });\n    }\n\n    \/**\n     * Checks the state of require completion checkbox and toggles messages\n     * and disabled states of buttons accordingly\n     *\/\n    function handleRequireCompletionToggled() {\n      var isChecked = adaptivityFields.requireCompletion.$input[0].checked;\n      togglePause(isChecked);\n      toggleRetry(isChecked);\n      toggleDuration(isChecked);\n    }\n\n    \/**\n     * Toggles message for conflicting interval times of interactions\n     *\n     * @param {boolean} isChecked Require completion option checked state\n     *\/\n    function toggleDuration(isChecked) {\n      if (!isChecked) {\n        conflictingTimeMsg.classList.add('h5p-hide');\n        return;\n      }\n\n      handleConflictingInteractions(interaction, IVEditor.IV.interactions);\n    }\n\n    \/**\n     * Toggles message and button state for pause option of interaction\n     *\n     * @param {boolean} isChecked Require completion option checked state\n     *\/\n    function togglePause(isChecked) {\n      toggleBoolean(interactionFields.pause, isChecked);\n      interactionFields.pause.$item.toggleClass('h5p-has-disabled-msg', isChecked);\n      pauseDisabledMsg.classList.toggle('h5p-hide', !isChecked);\n    }\n\n    \/**\n     * Toggles message and button state for enable retry option of interaction\n     *\n     * @param {boolean} isChecked Require completion option checked state\n     *\/\n    function toggleRetry(isChecked) {\n      if (enableRetry) {\n        toggleBoolean(enableRetry, isChecked);\n        enableRetryDisabledMsg.classList.toggle('h5p-hide', !isChecked);\n      }\n    }\n\n    \/**\n     * Toggles a boolean semantics field and its disabled state\n     *\n     * @param {Object} boolean A boolean semantics field\n     * @param {boolean} enable Require completion option checked state\n     *\/\n    function toggleBoolean(boolean, enable) {\n      if (enable) {\n        boolean.$input[0].checked = true;\n        boolean.$input.trigger('change');\n      }\n      boolean.$input.attr('disabled', enable);\n    }\n  }\n\n  return RequireCompletion;\n})();\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/h5p-interactive-video.js?ver=1.17.5":"\n!function(t){function e(n){if(o[n])return o[n].exports;var i=o[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var o={};e.m=t,e.c=o,e.d=function(t,o,n){e.o(t,o)||Object.defineProperty(t,o,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var o=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(o,\"a\",o),o},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=4)}([function(t,e,o){\"use strict\";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e,o){var n,r,a=this;H5P.EventDispatcher.call(a),a.contentId=e,a.instanceIndex=y(),a.bookmarksMenuId=\"interactive-video-\"+this.contentId+\"-bookmarks-chooser\",a.qualityMenuId=\"interactive-video-\"+this.contentId+\"-quality-chooser\",a.captionsMenuId=\"interactive-video-\"+this.contentId+\"-captions-chooser\",a.playbackRateMenuId=\"interactive-video-\"+this.contentId+\"-playback-rate-chooser\",a.isMinimal=!1,a.options=v.extend({video:{},assets:{}},t.interactiveVideo),a.options.video.startScreenOptions=a.options.video.startScreenOptions||{},a.options.video.startScreenOptions.title||(a.options.video.startScreenOptions.title=\"Interactive Video\"),a.startScreenOptions=v.extend({hideStartTitle:!1,shortStartDescription:\"\"},a.options.video.startScreenOptions),t.override&&(t.override.showSolutionButton||t.override.retryButton)&&(a.override={},t.override.showSolutionButton&&(a.override.enableSolutionsButton=\"on\"===t.override.showSolutionButton),t.override.retryButton&&(a.override.enableRetry=\"on\"===t.override.retryButton)),void 0!==t.override&&(a.showRewind10=void 0!==t.override.showRewind10&&t.override.showRewind10,a.showBookmarksmenuOnLoad=void 0!==t.override.showBookmarksmenuOnLoad&&t.override.showBookmarksmenuOnLoad,a.preventSkipping=t.override.preventSkipping||!1,a.deactivateSound=t.override.deactivateSound||!1),a.l10n=v.extend({interaction:\"Interaction\",play:\"Play\",pause:\"Pause\",mute:\"Mute\",unmute:\"Unmute\",quality:\"Video quality\",captions:\"Captions\",close:\"Close\",fullscreen:\"Fullscreen\",exitFullscreen:\"Exit fullscreen\",summary:\"Summary\",bookmarks:\"Bookmarks\",defaultAdaptivitySeekLabel:\"Continue\",continueWithVideo:\"Continue with video\",more:\"More\",playbackRate:\"Playback rate\",rewind10:\"Rewind 10 seconds\",navDisabled:\"Navigation is disabled\",sndDisabled:\"Sound is disabled\",requiresCompletionWarning:\"You need to answer all the questions correctly before continuing.\",back:\"Back\",hours:\"Hours\",minutes:\"Minutes\",seconds:\"Seconds\",currentTime:\"Current time:\",totalTime:\"Total time:\",navigationHotkeyInstructions:\"Use key 'k' for starting and stopping video at any time\",singleInteractionAnnouncement:\"Interaction appeared:\",multipleInteractionsAnnouncement:\"Multiple interactions appeared:\",videoPausedAnnouncement:\"Video was paused\",content:\"Content\"},t.l10n),o&&void 0!==o.previousState&&void 0!==o.previousState.progress&&void 0!==o.previousState.answers&&(a.previousState=o.previousState),a.lastState=H5P.Video.ENDED,a.on(\"resize\",function(){a.resize()}),a.justVideo=!1;var s=navigator.userAgent.match(\/(iPhone|iPod) OS (\\d*)_\/i);if(null!==s&&3===s.length&&(a.justVideo=s[2]<10),n=a.previousState&&a.previousState.progress?Math.floor(a.previousState.progress):0,0===n&&t.override&&t.override.startVideoAt&&(n=t.override.startVideoAt),r=t.override&&!!t.override.loop,this.autoplay=t.override&&!!t.override.autoplay,a.video=H5P.newRunnable({library:\"H5P.Video 1.3\",params:{sources:a.options.video.files,visuals:{poster:a.options.video.startScreenOptions.poster,controls:a.justVideo,fit:!1,disableRemotePlayback:!0},startAt:n,a11y:a.options.video.textTracks}},a.contentId,void 0,void 0,{parent:a}),a.justVideo)return void a.video.on(\"loaded\",function(){a.trigger(\"resize\")});var l=!1;a.video.on(\"loaded\",function(){l=!0,a.loaded()}),a.video.on(\"error\",function(){a.removeSplash()});var c=!0;if(a.video.on(\"stateChange\",function(e){!a.controls&&l&&(a.addControls(),a.trigger(\"resize\"));var o=e.data;if(a.currentState!==i.SEEKING)switch(o){case H5P.Video.ENDED:if(a.currentState=H5P.Video.ENDED,a.controls.$play.addClass(\"h5p-pause\").attr(\"aria-label\",a.l10n.play),a.timeUpdate(a.video.getCurrentTime()),a.updateCurrentTime(a.getDuration()),a.complete(),r){a.video.play();var n=t.override&&t.override.startVideoAt?t.override.startVideoAt:0;a.video.seek(n)}break;case H5P.Video.PLAYING:c&&(a.addQualityChooser(),a.addPlaybackRateChooser(),a.removeSplash(),a.startUpdatingBufferBar(),a.toggleBookmarksChooser(!1,c),c=!1),a.currentState=H5P.Video.PLAYING,a.controls.$play.removeClass(\"h5p-pause\").attr(\"aria-label\",a.l10n.pause),a.controls.$play.is(\":focus\")&&(a.controls.$play.blur(),a.controls.$play.focus()),a.timeUpdate(a.video.getCurrentTime());break;case H5P.Video.PAUSED:a.currentState=H5P.Video.PAUSED,a.controls.$play.addClass(\"h5p-pause\").attr(\"aria-label\",a.l10n.play),a.focusInteraction?(a.focusInteraction.getFirstTabbableElement().focus(),delete a.focusInteraction):a.controls.$play.is(\":focus\")&&(a.controls.$play.blur(),a.controls.$play.focus()),a.timeUpdate(a.video.getCurrentTime());break;case H5P.Video.BUFFERING:a.currentState=H5P.Video.BUFFERING,a.removeSplash(),a.startUpdatingBufferBar()}}),a.video.on(\"qualityChange\",function(t){var e=t.data;a.controls.$qualityChooser&&a.controls.$qualityChooser.find(\"li\").attr(\"aria-checked\",\"false\").filter('[data-quality=\"'+e+'\"]').attr(\"aria-checked\",\"true\")}),a.video.on(\"playbackRateChange\",function(t){var e=t.data;a.controls&&a.controls.$playbackRateChooser&&a.controls.$playbackRateChooser.find(\"li\").attr(\"aria-checked\",\"false\").filter('[playback-rate=\"'+e+'\"]').attr(\"aria-checked\",\"true\")}),a.on(\"enterFullScreen\",function(){a.hasFullScreen=!0,a.$container.parent(\".h5p-content\").css(\"height\",\"100%\"),a.controls.$fullscreen.addClass(\"h5p-exit\").attr(\"aria-label\",a.l10n.exitFullscreen),a.controls.$fullscreen.blur(),a.controls.$fullscreen.focus(),a.resizeInteractions()}),a.on(\"exitFullScreen\",function(){a.$container.hasClass(\"h5p-standalone\")&&a.$container.hasClass(\"h5p-minimal\")&&a.pause(),a.hasFullScreen=!1,a.$container.parent(\".h5p-content\").css(\"height\",\"\"),a.controls.$fullscreen.removeClass(\"h5p-exit\").attr(\"aria-label\",a.l10n.fullscreen),a.controls.$fullscreen.blur(),a.controls.$fullscreen.focus(),a.resizeInteractions(),a.dnb&&a.dnb.dialog&&!a.hasUncompletedRequiredInteractions()&&a.dnb.dialog.close()}),a.video.on(\"captions\",function(t){a.controls||(a.addControls(),a.trigger(\"resize\")),a.setCaptionTracks(t.data)}),a.interactions=[],a.options.assets.interactions)for(var u=0;u<a.options.assets.interactions.length;u++)this.initInteraction(u);a.accessibility=new f.default(a.l10n)}Object.defineProperty(e,\"__esModule\",{value:!0}),e.KEY_CODE_START_PAUSE=void 0;var r=o(7),a=n(r),s=o(1),l=n(s),c=o(3),u=n(c),d=o(10),h=n(d),p=o(11),f=n(p),v=H5P.jQuery;i.prototype=Object.create(H5P.EventDispatcher.prototype),i.prototype.constructor=i,i.prototype.setCaptionTracks=function(t){var e=this;if(t.unshift(new H5P.Video.LabelValue(\"Off\",\"off\")),e.captionsTrackSelector)return void e.captionsTrackSelector.updateOptions(t);var o=e.video.getCaptionsTrack();o||(o=t[0]),e.captionsTrackSelector=new a.default(\"captions\",t,o,\"menuitemradio\",e.l10n,e.contentId),e.captionsTrackSelector.on(\"select\",function(t){e.video.setCaptionsTrack(\"off\"===t.data.value?null:t.data)}),e.captionsTrackSelector.on(\"close\",function(){\"true\"===e.controls.$more.attr(\"aria-expanded\")&&e.controls.$more.click()}),e.captionsTrackSelector.on(\"open\",function(){e.controls.$overlayButtons.addClass(\"h5p-hide\")}),v(e.captionsTrackSelector.control).insertAfter(e.controls.$volume),v(e.captionsTrackSelector.popup).css(e.controlsCss).insertAfter(v(e.captionsTrackSelector.control)),v(e.captionsTrackSelector.overlayControl).insertAfter(e.controls.$qualityButtonMinimal),e.controls.$overlayButtons=e.controls.$overlayButtons.add(e.captionsTrackSelector.overlayControl),e.minimalMenuKeyboardControls.insertElementAt(e.captionsTrackSelector.overlayControl,2)},i.prototype.getCurrentState=function(){var t=this;if(t.video.play){for(var e={progress:t.video.getCurrentTime(),answers:[]},o=0;o<t.interactions.length;o++)e.answers[o]=t.interactions[o].getCurrentState();return e.progress?e:t.previousState&&t.previousState.progress?t.previousState:void 0}},i.prototype.removeSplash=function(){void 0!==this.$splash&&(this.$splash.remove(),delete this.$splash)},i.prototype.attach=function(t){var e=this,o=this;if(void 0!==this.isRoot&&this.isRoot()&&this.setActivityStarted(),this.$container=t,t.addClass(\"h5p-interactive-video\").html('<div class=\"h5p-video-wrapper\"><\/div><div role=\"toolbar\" class=\"h5p-controls\"><\/div>'),this.fontSize=16,this.width=640,this.interactions&&this.interactions.forEach(function(t){t.reCreate()}),this.$videoWrapper=t.children(\".h5p-video-wrapper\"),this.attachVideo(this.$videoWrapper),this.justVideo)return this.$videoWrapper.find(\"video\").css(\"minHeight\",\"200px\"),void t.children(\":not(.h5p-video-wrapper)\").remove();this.$read=v(\"<div\/>\",{\"aria-live\":\"polite\",class:\"hidden-but-read\",appendTo:t}),this.readText=null,this.$controls=t.children(\".h5p-controls\").addClass(\"hidden\"),void 0===this.editor?(this.dnb=new H5P.DragNBar([],this.$videoWrapper,this.$container,{disableEditor:!0}),this.dnb.dialog.on(\"open\",function(){o.lastState=o.currentState,o.currentState!==H5P.Video.PAUSED&&o.currentState!==H5P.Video.ENDED&&o.video.pause()}),this.dnb.dialog.on(\"close\",function(){o.restoreTabIndexes(),o.lastState!==H5P.Video.PAUSED&&o.lastState!==H5P.Video.ENDED&&o.video.play()})):o.on(\"dnbEditorReady\",function(){o.dnb=o.editor.dnb,o.dnb.dialog.disableOverlay=!0}),this.video.pressToPlay||(this.currentState===i.LOADED?this.addControls():this.addSplash()),t.attr(\"tabindex\",\"-1\"),t.on(\"keyup\",function(t){var n=o.controls&&o.controls.$play,i=75===t.which;if(n&&i){if(\"INPUT\"===t.target.nodeName)return;if(e.hasUncompletedRequiredInteractions()){var r=v(document.activeElement);e.showWarningMask().find(\".h5p-button-back\").click(function(){return r.focus()})}else o.controls.$play.click()}}),this.$container.prepend(v(this.accessibility.getHotkeyInstructor())),this.$container.append(v(this.accessibility.getInteractionAnnouncer())),this.currentState=i.ATTACHED,this.autoplay&&o.video.play()},i.prototype.attachVideo=function(t){this.video.attach(t),this.justVideo||(this.$overlay=v('<div class=\"h5p-overlay h5p-ie-transparent-background\"><\/div>').appendTo(t))},i.prototype.addSplash=function(){var t=this;void 0!==this.editor||this.video.pressToPlay||!this.video.play||this.$splash||(this.$splash=v('<div class=\"h5p-splash-wrapper\"><div class=\"h5p-splash-outer\"><div class=\"h5p-splash\" role=\"button\" tabindex=\"0\"><div class=\"h5p-splash-main\"><div class=\"h5p-splash-main-outer\"><div class=\"h5p-splash-main-inner\"><div class=\"h5p-splash-play-icon\" aria-label=\"'+this.l10n.play+'\"><\/div><div class=\"h5p-splash-title\">'+this.options.video.startScreenOptions.title+'<\/div><\/div><\/div><\/div><div class=\"h5p-splash-footer\"><div class=\"h5p-splash-footer-holder\"><div class=\"h5p-splash-description\">'+t.startScreenOptions.shortStartDescription+\"<\/div><\/div><\/div><\/div><\/div><\/div>\").click(function(){t.video.play()}).appendTo(this.$overlay).find(\".h5p-interaction-button\").click(function(){return!1}).end(),v(\".h5p-splash\",this.$splash).keydown(function(e){var o=e.which;32!==o&&13!==o||(t.video.play(),e.preventDefault(),t.$controls.find(\".h5p-play\").focus())}),void 0!==this.startScreenOptions.shortStartDescription&&this.startScreenOptions.shortStartDescription.length||this.$splash.addClass(\"no-description\"),this.startScreenOptions.hideStartTitle&&this.$splash.addClass(\"no-title\"))},i.prototype.getDuration=function(){return void 0===this.duration&&(this.duration=this.video.getDuration()),this.duration},i.prototype.addControls=function(){var t=this,e=this;this.addSplash(),this.attachControls(this.$controls.removeClass(\"hidden\"));var o=this.getDuration(),n=i.humanizeTime(o),r=i.formatTimeForA11y(o,e.l10n);this.controls.$totalTime.find(\".human-time\").html(n),this.controls.$totalTime.find(\".hidden-but-read\").html(e.l10n.totalTime+\" \"+r),this.controls.$slider.slider(\"option\",\"max\",o),this.bookmarkMenuKeyboardControls=new l.default([new u.default]),this.bookmarkMenuKeyboardControls.on(\"close\",function(){return t.toggleBookmarksChooser(!1)}),this.addSliderInteractions(),this.addBookmarks(),this.trigger(\"controls\")},i.prototype.loaded=function(){var t=this.getDuration();if(this.oneSecondInPercentage=100\/t,t=Math.floor(t),void 0!==this.editor){var e=b(\"interactions\",this.editor.field.fields),o=b(\"duration\",e.field.fields).fields;o[0].max=o[1].max=t,o[0].min=o[1].min=0;for(var n=b(\"adaptivity\",e.field.fields).fields,r=0;r<n.length;r++)n[r].fields&&(b(\"seekTo\",n[r].fields).max=t)}if(this.hasMainSummary()){var a=t-this.options.summary.displayAt;a<0&&(a=0),void 0===this.options.assets.interactions&&(this.options.assets.interactions=[]),this.options.assets.interactions.push({action:this.options.summary.task,x:80,y:80,duration:{from:a,to:t},displayType:\"button\",bigDialog:!0,className:\"h5p-summary-interaction h5p-end-summary\",label:\"<p>\"+this.l10n.summary+\"<\/p>\",mainSummary:!0}),this.initInteraction(this.options.assets.interactions.length-1)}this.currentState===i.ATTACHED&&(this.video.pressToPlay||this.addControls(),this.trigger(\"resize\")),this.currentState=i.LOADED},i.prototype.initInteraction=function(t){var e=this,o=e.options.assets.interactions[t];if(e.override){var n={};o.adaptivity&&o.adaptivity.requireCompletion&&(n.enableRetry=!0),H5P.jQuery.extend(o.action.params.behaviour,e.override,n)}var i;void 0!==e.previousState&&void 0!==e.previousState.answers&&null!==e.previousState.answers[t]&&(i=e.previousState.answers[t]);var r=new h.default(o,e,i);return r.on(\"display\",function(t){var o=t.data;o.appendTo(e.$overlay),r.repositionToWrapper(e.$videoWrapper);var n=void 0!==e.video.pressToPlay;g(n?100:null,function(){(e.currentState===H5P.Video.PLAYING||e.currentState===H5P.Video.BUFFERING)&&r.pause()&&(e.focusInteraction||(e.focusInteraction=r),e.video.pause())}),e.seekingTo&&(e.seekingTo=void 0,o.focus()),setTimeout(function(){r.positionLabel(e.$videoWrapper.width())},0)}),r.on(\"hide\",function(t){t.data}),r.on(\"xAPI\",function(t){-1!==v.inArray(t.getVerb(),[\"completed\",\"answered\"])&&(t.setVerb(\"answered\"),r.isMainSummary()&&t.isFromChild()&&setTimeout(function(){e.complete()},0)),void 0===t.data.statement.context.extensions&&(t.data.statement.context.extensions={}),t.data.statement.context.extensions[\"http:\/\/id.tincanapi.com\/extension\/ending-point\"]=\"PT\"+Math.floor(e.video.getCurrentTime())+\"S\"}),e.interactions.push(r),r},i.prototype.hasMainSummary=function(){var t=this.options.summary;return!(void 0===t||void 0===t.displayAt||void 0===t.task||void 0===t.task.params||void 0===t.task.params.summaries||!t.task.params.summaries.length||void 0===t.task.params.summaries[0].summary||!t.task.params.summaries[0].summary.length)},i.prototype.addSliderInteractions=function(){var t=this;this.controls.$interactionsContainer.children().remove(),H5P.jQuery.extend([],this.interactions).sort(function(t,e){return t.getDuration().from-e.getDuration().from}).forEach(function(e){var o=e.addDot();void 0!==o&&(o.appendTo(t.controls.$interactionsContainer),t.preventSkipping||t.interactionKeyboardControls.addElement(o.get(0)))})},i.prototype.addBookmarks=function(){if(this.bookmarksMap={},void 0!==this.options.assets.bookmarks&&!this.preventSkipping)for(var t=0;t<this.options.assets.bookmarks.length;t++)this.addBookmark(t)},i.prototype.toggleBookmarksChooser=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.controls.$bookmarksButton){t=void 0===t?!this.controls.$bookmarksChooser.hasClass(\"h5p-show\"):t;var o=this.controls.$bookmarksChooser.hasClass(\"h5p-show\");t?(this.controls.$more.attr(\"aria-expanded\",\"true\"),this.controls.$minimalOverlay.addClass(\"h5p-show\"),this.controls.$minimalOverlay.find(\".h5p-minimal-button\").addClass(\"h5p-hide\"),this.controls.$bookmarksButton.attr(\"aria-expanded\",\"true\"),this.controls.$bookmarksChooser.css({maxHeight:t?this.controlsCss.maxHeight:\"32px\"}).addClass(\"h5p-show\"),this.controls.$bookmarksChooser.find('[tabindex=\"0\"]').first().focus()):(this.controls.$more.attr(\"aria-expanded\",\"false\"),this.controls.$minimalOverlay.removeClass(\"h5p-show\"),this.controls.$minimalOverlay.find(\".h5p-minimal-button\").removeClass(\"h5p-hide\"),this.controls.$bookmarksButton.attr(\"aria-expanded\",\"false\"),this.controls.$bookmarksChooser.css({maxHeight:t?this.controlsCss.maxHeight:\"32px\"}).removeClass(\"h5p-show\"),e||this.controls.$bookmarksButton.focus()),this.controls.$bookmarksChooser.toggleClass(\"h5p-transitioning\",t||o)}},i.prototype.showPreventSkippingMessage=function(t){var e=this;e.preventSkippingWarningTimeout||(e.$preventSkippingMessage||(e.$preventSkippingMessage=v(\"<div>\",{class:\"h5p-prevent-skipping-message\",appendTo:e.controls.$bookmarksContainer}),e.$preventSkippingMessageText=v(\"<div>\",{class:\"h5p-prevent-skipping-message-text\",html:e.l10n.navDisabled,appendTo:e.$preventSkippingMessage}),e.$preventSkippingMessageTextA11y=v(\"<div>\",{class:\"hidden-but-read\",html:e.l10n.navDisabled,appendTo:e.controls.$slider})),e.$preventSkippingMessage.css(\"left\",t),setTimeout(function(){e.$preventSkippingMessage.addClass(\"h5p-show\").attr(\"aria-hidden\",\"false\")},0),e.preventSkippingWarningTimeout=setTimeout(function(){e.$preventSkippingMessage.removeClass(\"h5p-show\").attr(\"aria-hidden\",\"true\"),setTimeout(function(){e.preventSkippingWarningTimeout=void 0},500)},2e3))},i.prototype.onBookmarkSelect=function(t,e){var o=this;o.currentState!==H5P.Video.PLAYING&&(t.mouseover().mouseout(),setTimeout(function(){o.timeUpdate(o.video.getCurrentTime())},0)),\"true\"===o.controls.$more.attr(\"aria-expanded\")&&o.$container.hasClass(\"h5p-minimal\")?o.controls.$more.click():o.toggleBookmarksChooser(!1),o.video.play(),o.video.seek(e.time);var n=i.formatTimeForA11y(e.time,o.l10n);setTimeout(function(){return o.read(o.l10n.currentTime+\" \"+n)},150)},i.prototype.addBookmark=function(t,e){var o=this,n=o.options.assets.bookmarks[t];void 0===e&&(e=Math.floor(10*n.time)\/10);var i=o.bookmarksMap[e]=v('<div class=\"h5p-bookmark\" style=\"left:'+n.time*o.oneSecondInPercentage+'%\"><div class=\"h5p-bookmark-label\"><div class=\"h5p-bookmark-text\">'+n.label+\"<\/div><\/div><\/div>\").appendTo(o.controls.$bookmarksContainer).data(\"id\",t).hover(function(){void 0!==o.bookmarkTimeout&&clearTimeout(o.bookmarkTimeout),o.controls.$bookmarksContainer.children(\".h5p-show\").removeClass(\"h5p-show\"),i.addClass(\"h5p-show\")},function(){o.bookmarkTimeout=setTimeout(function(){i.removeClass(\"h5p-show\")},2e3)});i.find(\".h5p-bookmark-label\").css(\"maxWidth\",parseInt(o.controls.$slider.parent().css(\"marginRight\"))-35),void 0===o.controls.$bookmarksList&&(o.controls.$bookmarksList=v('<ul role=\"menu\"><\/ul>').insertAfter(o.controls.$bookmarksChooser.find(\"h3\")));var r=v('<li role=\"menuitem\" aria-describedby=\"'+o.bookmarksMenuId+'\">'+n.label+\"<\/li>\").click(function(){return o.onBookmarkSelect(i,n)}).keydown(function(t){32!==t.which&&13!==t.which||o.onBookmarkSelect(i,n),t.stopPropagation()});o.bookmarkMenuKeyboardControls.addElement(r.get(0));var a=o.controls.$bookmarksList.children(\":eq(\"+t+\")\");return 0!==a.length?r.insertBefore(a):r.appendTo(o.controls.$bookmarksList),o.on(\"bookmarksChanged\",function(n){var a=n.data.index,s=n.data.number;a===t&&s<0?(r.remove(),delete o.bookmarksMap[e]):t>=a&&(t+=s,i.data(\"id\",t))}),o.trigger(\"bookmarkAdded\",{bookmark:i}),i},i.prototype.attachControls=function(t){var e=this,o=v(\"<div\/>\",{class:\"h5p-controls-left\",appendTo:t}),n=v(\"<div\/>\",{class:\"h5p-control h5p-slider\",appendTo:t}),r=v(\"<div\/>\",{class:\"h5p-controls-right\",appendTo:t});e.preventSkipping&&e.setDisabled(n),e.controls={},e.controls.$play=e.createButton(\"play\",\"h5p-control h5p-pause\",o,function(){var t=e.isDisabled(e.controls.$play);if(e.controls.$play.hasClass(\"h5p-pause\")&&!t){var o=!screen||Math.min(screen.width,screen.height)<=e.width;!e.hasFullScreen&&o&&e.$container.hasClass(\"h5p-standalone\")&&e.$container.hasClass(\"h5p-minimal\")&&e.toggleFullScreen(),e.video.play()}else e.video.pause()}),e.showRewind10&&(e.controls.$rewind10=e.createButton(\"rewind10\",\"h5p-control\",o,function(){if(e.video.getCurrentTime()>0){var t=Math.max(e.video.getCurrentTime()-10,0);e.video.seek(t),e.currentState===H5P.Video.PAUSED&&e.timeUpdate(t),e.currentState===H5P.Video.ENDED&&e.video.play()}}));var a=function(){var t=e.$container.hasClass(\"h5p-minimal\")&&\"true\"===e.controls.$more.attr(\"aria-expanded\");return t&&e.controls.$more.click(),t},s=function(t,o){return function(){var n=e.controls[t],i=e.controls[o],r=\"true\"===n.attr(\"aria-disabled\"),s=\"true\"===n.attr(\"aria-expanded\");r||(s?(n.attr(\"aria-expanded\",\"false\"),i.removeClass(\"h5p-show\"),n.focus(),a()):(n.attr(\"aria-expanded\",\"true\"),i.addClass(\"h5p-show\"),i.find('[tabindex=\"0\"]').focus()))}},c=e.options.assets.bookmarks&&e.options.assets.bookmarks.length,d=e.editor||c&&!e.preventSkipping;d&&(e.controls.$bookmarksChooser=H5P.jQuery(\"<div\/>\",{class:\"h5p-chooser h5p-bookmarks\",role:\"dialog\",html:'<h3 id=\"'+e.bookmarksMenuId+'\">'+e.l10n.bookmarks+\"<\/h3>\"}),e.controls.$bookmarksChooser.append(v(\"<span>\",{role:\"button\",class:\"h5p-chooser-close-button\",tabindex:\"0\",\"aria-label\":e.l10n.close,click:function(){return e.toggleBookmarksChooser()},keydown:function(t){13!==t.which&&32!==t.which||(e.toggleBookmarksChooser(),t.preventDefault())}})),e.showRewind10&&e.controls.$bookmarksChooser.addClass(\"h5p-rewind-displacement\"),e.controls.$bookmarksButton=e.createButton(\"bookmarks\",\"h5p-control\",o,function(){e.toggleBookmarksChooser()}),e.controls.$bookmarksButton.attr(\"aria-haspopup\",\"true\"),e.controls.$bookmarksButton.attr(\"aria-expanded\",\"false\"),e.controls.$bookmarksChooser.insertAfter(e.controls.$bookmarksButton),e.controls.$bookmarksChooser.bind(\"transitionend\",function(){e.controls.$bookmarksChooser.removeClass(\"h5p-transitioning\")}));var h='<time class=\"h5p-current\">\\n      <span class=\"hidden-but-read\"><\/span>\\n      <span class=\"human-time\" aria-hidden=\"true\">0:00<\/span>\\n    <\/time>',p=v('<div class=\"h5p-control h5p-simple-time\">'+h+\"<\/div>\").appendTo(o);e.controls.$currentTimeSimple=p.find(\".human-time\"),e.controls.$currentTimeA11ySimple=p.find(\".hidden-but-read\");var f=i.formatTimeForA11y(0,e.l10n),m=v('<div class=\"h5p-control h5p-time\">\\n    '+h+'\\n    <span aria-hidden=\"true\"> \/ <\/span>\\n    <time class=\"h5p-total\">\\n      <span class=\"hidden-but-read\">'+e.l10n.totalTime+\" \"+f+'<\/span>\\n      <span class=\"human-time\" aria-hidden=\"true\">0:00<\/span>\\n    <\/time>\\n  <\/div>').appendTo(r),b=m.find(\".h5p-current\");e.controls.$currentTime=b.find(\".human-time\"),e.controls.$currentTimeA11y=b.find(\".hidden-but-read\"),e.controls.$totalTime=m.find(\".h5p-total\"),e.updateCurrentTime(0);var g=function(){e.controls.$minimalOverlay.removeClass(\"h5p-show\"),e.controls.$more.attr(\"aria-expanded\",\"false\"),e.controls.$more.focus(),e.toggleBookmarksChooser(!1),e.controls.$qualityButton&&\"true\"===e.controls.$qualityButton.attr(\"aria-expanded\")&&e.controls.$qualityButton.click(),e.controls.$playbackRateButton&&\"true\"===e.controls.$playbackRateButton.attr(\"aria-expanded\")&&e.controls.$playbackRateButton.click(),setTimeout(function(){e.controls.$overlayButtons.removeClass(\"h5p-hide\")},150)};e.controls.$more=e.createButton(\"more\",\"h5p-control\",r,function(){\"true\"===e.controls.$more.attr(\"aria-expanded\")?g():(e.controls.$minimalOverlay.addClass(\"h5p-show\"),e.controls.$more.attr(\"aria-expanded\",\"true\"),e.removeSplash(),setTimeout(function(){e.controls.$minimalOverlay.find('[tabindex=\"0\"]').focus()},150)),d?e.controls.$bookmarksChooser.add(e.controls.$qualityChooser).removeClass(\"h5p-show\"):(e.controls.$qualityChooser.removeClass(\"h5p-show\"),e.controls.$playbackRateChooser.removeClass(\"h5p-show\"))}),e.controls.$playbackRateChooser=H5P.jQuery(\"<div\/>\",{class:\"h5p-chooser h5p-playbackRate\",role:\"dialog\",html:'<h3 id=\"'+e.playbackRateMenuId+'\">'+e.l10n.playbackRate+\"<\/h3>\"}),e.controls.$playbackRateButton=e.createButton(\"playbackRate\",\"h5p-control\",r,s(\"$playbackRateButton\",\"$playbackRateChooser\")),e.setDisabled(e.controls.$playbackRateButton),e.controls.$playbackRateButton.attr(\"aria-haspopup\",\"true\"),e.controls.$playbackRateButton.attr(\"aria-expanded\",\"false\"),e.controls.$playbackRateChooser.insertAfter(e.controls.$playbackRateButton),function(){return-1!==navigator.userAgent.indexOf(\"Android\")}()||function(){return-1!==navigator.userAgent.indexOf(\"iPad\")}()||(e.controls.$volume=e.createButton(\"mute\",\"h5p-control\",r,function(){var t=e.controls.$volume;e.deactivateSound||(t.hasClass(\"h5p-muted\")?(t.removeClass(\"h5p-muted\").attr(\"aria-label\",e.l10n.mute),e.video.unMute()):(t.addClass(\"h5p-muted\").attr(\"aria-label\",e.l10n.unmute),e.video.mute()),t.blur(),t.focus())}),e.deactivateSound&&(e.controls.$volume.addClass(\"h5p-muted\").attr(\"aria-label\",e.l10n.sndDisabled),e.setDisabled(e.controls.$volume))),e.deactivateSound&&e.video.mute(),e.controls.$qualityChooser=H5P.jQuery(\"<div\/>\",{class:\"h5p-chooser h5p-quality\",role:\"dialog\",html:'<h3 id=\"'+e.qualityMenuId+'\">'+e.l10n.quality+\"<\/h3>\"});var y=function(){e.isMinimal?e.controls.$more.click():e.controls.$qualityButton.click()};e.controls.$qualityChooser.append(v(\"<span>\",{role:\"button\",class:\"h5p-chooser-close-button\",tabindex:\"0\",\"aria-label\":e.l10n.close,click:function(){return y()},keydown:function(t){32!==t.which&&13!==t.which||(y(),t.preventDefault())}})),e.controls.$qualityButton=e.createButton(\"quality\",\"h5p-control\",r,s(\"$qualityButton\",\"$qualityChooser\")),e.setDisabled(e.controls.$qualityButton),e.controls.$qualityButton.attr(\"aria-haspopup\",\"true\"),e.controls.$qualityButton.attr(\"aria-expanded\",\"false\"),e.controls.$qualityChooser.insertAfter(e.controls.$qualityButton),e.editor||!1===H5P.fullscreenSupported||(e.controls.$fullscreen=e.createButton(\"fullscreen\",\"h5p-control\",r,function(){e.toggleFullScreen()})),e.controls.$minimalOverlay=H5P.jQuery(\"<div\/>\",{class:\"h5p-minimal-overlay\",appendTo:e.$container});var k=H5P.jQuery(\"<div\/>\",{role:\"menu\",class:\"h5p-minimal-wrap\",appendTo:e.controls.$minimalOverlay});e.minimalMenuKeyboardControls=new l.default([new u.default]),e.minimalMenuKeyboardControls.on(\"close\",function(){return g()}),e.controls.$overlayButtons=H5P.jQuery([]),d&&(e.controls.$bookmarkButtonMinimal=e.createButton(\"bookmarks\",\"h5p-minimal-button\",k,function(){e.controls.$overlayButtons.addClass(\"h5p-hide\"),e.toggleBookmarksChooser(!0)},!0),e.controls.$bookmarkButtonMinimal.attr(\"role\",\"menuitem\"),e.controls.$bookmarkButtonMinimal.attr(\"tabindex\",\"-1\"),e.controls.$overlayButtons=e.controls.$overlayButtons.add(e.controls.$bookmarkButtonMinimal),e.minimalMenuKeyboardControls.addElement(e.controls.$bookmarkButtonMinimal.get(0))),e.controls.$qualityButtonMinimal=e.createButton(\"quality\",\"h5p-minimal-button\",k,function(){e.isDisabled(e.controls.$qualityButton)||(e.controls.$overlayButtons.addClass(\"h5p-hide\"),e.controls.$qualityButton.click())},!0),e.setDisabled(e.controls.$qualityButtonMinimal),e.controls.$qualityButtonMinimal.attr(\"role\",\"menuitem\"),e.controls.$overlayButtons=e.controls.$overlayButtons.add(e.controls.$qualityButtonMinimal),e.minimalMenuKeyboardControls.addElement(e.controls.$qualityButtonMinimal.get(0)),e.controls.$playbackRateButtonMinimal=e.createButton(\"playbackRate\",\"h5p-minimal-button\",k,function(){e.isDisabled(e.controls.$playbackRateButton)||(e.controls.$overlayButtons.addClass(\"h5p-hide\"),e.controls.$playbackRateButton.click())},!0),e.controls.$playbackRateButtonMinimal.attr(\"role\",\"menuitem\"),e.setDisabled(e.controls.$playbackRateButtonMinimal),e.controls.$overlayButtons=e.controls.$overlayButtons.add(e.controls.$playbackRateButtonMinimal),e.minimalMenuKeyboardControls.addElement(e.controls.$playbackRateButtonMinimal.get(0)),e.addQualityChooser(),e.addPlaybackRateChooser(),e.interactionKeyboardControls=new l.default([new u.default]),e.controls.$interactionsContainer=v(\"<div\/>\",{role:\"menu\",class:\"h5p-interactions-container\",\"aria-label\":e.l10n.interaction,appendTo:n}),e.controls.$bookmarksContainer=v(\"<div\/>\",{class:\"h5p-bookmarks-container\",appendTo:n}),e.hasPlayPromise=!1,e.hasQueuedPause=!1,e.delayed=!1,e.controls.$slider=v(\"<div\/>\",{appendTo:n}).slider({value:0,step:.01,orientation:\"horizontal\",range:\"min\",max:0,create:function(t){var o=v(t.target).find(\".ui-slider-handle\");o.attr(\"role\",\"slider\").attr(\"aria-valuemin\",\"0\").attr(\"aria-valuemax\",e.getDuration().toString()).attr(\"aria-valuetext\",i.formatTimeForA11y(0,e.l10n)).attr(\"aria-valuenow\",\"0\"),e.preventSkipping&&e.setDisabled(o).attr(\"aria-hidden\",\"true\")},start:function(){e.currentState!==i.SEEKING&&(e.delayedState||(e.currentState===H5P.Video.ENDED?e.lastState=H5P.Video.PLAYING:e.currentState===H5P.Video.BUFFERING&&e.lastState||(e.lastState=e.currentState)),e.delayedState=!0,clearTimeout(e.delayTimeout),e.delayTimeout=setTimeout(function(){e.delayedState=!1},200),e.hasPlayPromise?e.hasQueuedPause=!0:e.video.pause(),e.currentState=i.SEEKING,e.removeSplash(),e.$overlay.addClass(\"h5p-visible\"))},slide:function(t,o){var n=[\"Right\",\"Left\",\"ArrowRight\",\"ArrowLeft\"],i=-1!==n.indexOf(t.key),r=!i,a=o.value;if(i){var s=e.getDuration();a=-1!==t.key.indexOf(\"Right\")?Math.min(a+5,s):Math.max(a-5,0),e.timeUpdate(a,!0)}return e.video.seek(a),e.updateInteractions(a),e.updateCurrentTime(a),r},stop:function(t,o){e.currentState=e.lastState,e.video.seek(o.value),e.recreateCurrentInteractions();var n=e.lastState===H5P.Video.PLAYING||e.lastState===H5P.Video.VIDEO_CUED||e.hasQueuedPause;if(e.hasPlayPromise)e.hasQueuedPause=!1;else if(n){e.hasQueuedPause=!1;var i=e.video.play();e.hasQueuedPause=!1,i&&i.then?(e.hasPlayPromise=!0,i.then(function(){setTimeout(function(){(e.hasQueuedPause||e.hasActivePauseInteraction())&&e.video.pause(),e.hasPlayPromise=!1},0)})):e.hasActivePauseInteraction()&&(e.video.play(),setTimeout(function(){e.video.pause()},50))}else e.timeUpdate(o.value);e.$overlay.removeClass(\"h5p-visible\")}}),e.preventSkipping&&(e.controls.$slider.slider(\"disable\"),e.controls.$slider.click(function(t){return e.showPreventSkippingMessage(t.offsetX),!1})),e.showBookmarksmenuOnLoad&&!1===e.video.pressToPlay&&e.toggleBookmarksChooser(!0),e.controls.$buffered=v(\"<div\/>\",{class:\"h5p-buffered\",prependTo:e.controls.$slider})},i.prototype.hasActivePauseInteraction=function(){var t=!1;return this.interactions.forEach(function(e){e.getElement()&&e.pause()&&(t=!0)}),t},i.prototype.createButton=function(t,e,o,n,i){var r=this,a={role:\"button\",tabindex:0,class:(void 0===e?\"\":e+\" \")+\"h5p-\"+t,on:{click:function(){n.call(this)},keydown:function(t){13!==t.which&&32!==t.which||(n.call(this),t.preventDefault(),t.stopPropagation())}},appendTo:o};return a[i?\"text\":\"aria-label\"]=r.l10n[t],H5P.jQuery(\"<div\/>\",a)},i.prototype.addQualityChooser=function(){var t=this;if(t.qualityMenuKeyboardControls=new l.default([new u.default]),t.qualityMenuKeyboardControls.on(\"close\",function(){return t.controls.$qualityButton.click()}),this.video.getQualities){var e=this.video.getQualities();if(e&&void 0!==this.controls.$qualityButton&&t.isDisabled(t.controls.$qualityButton)){for(var o=this.video.getQuality(),n=\"\",i=0;i<e.length;i++){var r=e[i],a=r.name===o;n+='<li role=\"menuitemradio\" data-quality=\"'+r.name+'\" aria-checked=\"'+a+'\" aria-describedby=\"'+t.qualityMenuId+'\">'+r.label+\"<\/li>\"}var s=v('<ul role=\"menu\">'+n+\"<\/ul>\").appendTo(this.controls.$qualityChooser);s.children().click(function(){var e=v(this).attr(\"data-quality\");t.updateQuality(e)}).keydown(function(e){if(32===e.which||13===e.which){var o=v(this).attr(\"data-quality\");t.updateQuality(o)}e.stopPropagation()});s.find(\"li\").get().forEach(function(e){t.qualityMenuKeyboardControls.addElement(e);var o=\"true\"===e.getAttribute(\"aria-checked\");m(e,o)}),t.removeDisabled(this.controls.$qualityButton.add(this.controls.$qualityButtonMinimal))}}},i.prototype.updateQuality=function(t){var e=this;e.video.setQuality(t),\"true\"===e.controls.$more.attr(\"aria-expanded\")?e.controls.$more.click():(e.controls.$qualityButton.click(),e.controls.$qualityButton.focus())},i.prototype.addPlaybackRateChooser=function(){var t=this,e=this;if(this.playbackRateMenuKeyboardControls=new l.default([new u.default]),this.playbackRateMenuKeyboardControls.on(\"close\",function(){return e.controls.$playbackRateButton.click()}),this.video.getPlaybackRates){var o=this.video.getPlaybackRates();if(!(o.length<2)&&o&&void 0!==this.controls.$playbackRateButton&&e.isDisabled(this.controls.$playbackRateButton)){for(var n=this.video.getPlaybackRate(),i=\"\",r=0;r<o.length;r++){var a=o[r];i+='<li role=\"menuitemradio\" playback-rate=\"'+a+'\" aria-checked=\"'+(a===n)+'\" aria-describedby=\"'+e.playbackRateMenuId+'\">'+a+\"<\/li>\"}var s=v('<ul role=\"menu\">'+i+\"<\/ul>\").appendTo(this.controls.$playbackRateChooser);s.children().click(function(){var t=v(this).attr(\"playback-rate\");e.updatePlaybackRate(t)}).keydown(function(t){if(32===t.which||13===t.which){var o=v(this).attr(\"playback-rate\");e.updatePlaybackRate(o)}t.stopPropagation()}),s.find(\"li\").get().forEach(function(e){t.playbackRateMenuKeyboardControls.addElement(e);var o=\"true\"===e.getAttribute(\"aria-checked\");m(e,o)}),e.removeDisabled(this.controls.$playbackRateButton.add(this.controls.$playbackRateButtonMinimal))}}},i.prototype.updatePlaybackRate=function(t){var e=this;e.video.setPlaybackRate(t),\"true\"===e.controls.$more.attr(\"aria-expanded\")?e.controls.$more.click():e.controls.$playbackRateButton.click()},i.prototype.startUpdatingBufferBar=function(){var t=this;if(!t.bufferLoop){!function e(){var o=t.video.getBuffered();o&&t.controls.$buffered&&t.controls.$buffered.css(\"width\",o+\"%\"),t.bufferLoop=setTimeout(e,500)}()}},i.prototype.resize=function(){if(this.$container){var t=this.$container.hasClass(\"h5p-fullscreen\")||this.$container.hasClass(\"h5p-semi-fullscreen\");this.$videoWrapper.css({marginTop:\"\",marginLeft:\"\",width:\"\",height:\"\"}),this.video.trigger(\"resize\");var e,o,n=this.justVideo?0:this.$controls.height(),i=this.$container.height();if(t){if((o=this.$videoWrapper.height())+n<=i)this.$videoWrapper.css(\"marginTop\",(i-n-o)\/2),e=this.$videoWrapper.width();else{var r=this.$videoWrapper.width()\/o,a=i-n;e=a*r,this.$videoWrapper.css({marginLeft:(this.$container.width()-e)\/2,width:e,height:a})}this.video.trigger(\"resize\")}else e=this.$container.width();this.scaledFontSize=e>this.width?this.fontSize*(e\/this.width):this.fontSize,this.$container.css(\"fontSize\",this.scaledFontSize+\"px\"),this.editor||(e<this.width?this.$container.hasClass(\"h5p-minimal\")||this.$container.addClass(\"h5p-minimal\"):this.$container.hasClass(\"h5p-minimal\")&&this.$container.removeClass(\"h5p-minimal\")),this.isMinimal=this.$container.hasClass(\"h5p-minimal\");var s=this.$videoWrapper.height();if(this.controlsCss={bottom:\"\",maxHeight:s+\"px\"},t){var l=n;o+n<=i&&(l=n+(i-n-o)\/2),this.controlsCss.bottom=l+\"px\"}this.controls&&this.controls.$minimalOverlay&&this.controls.$minimalOverlay.css(this.controlsCss),this.$container.find(\".h5p-chooser\").css(this.controlsCss),this.editor?this.editor.dnb&&this.editor.dnb.dnr.setContainerEm(this.scaledFontSize):(this.resizeMobileView(),void 0!==this.$splash&&this.resizeStartScreen()),this.resizeInteractions()}},i.prototype.resizeMobileView=function(){if(!isNaN(this.currentState)){if(this.$container.width()\/parseInt(this.$container.css(\"font-size\"),10)<30){if(this.resizeInteractions(),!this.isMobileView){if(this.$container.addClass(\"mobile\"),this.isMobileView=!0,this.hasUncompletedRequiredInteractions()){var t=v(\".h5p-dialog\",this.$container);t.show()}else this.restoreTabIndexes(),this.dnb.dialog.closeOverlay();this.recreateCurrentInteractions()}}else if(this.isMobileView){if(this.dnb&&this.dnb.dialog&&!this.hasUncompletedRequiredInteractions()){this.dnb.dialog.close(!0);var e=this.$container.find(\".h5p-dialog .h5p-image img\");e.css({width:\"\",height:\"\"})}this.$container.removeClass(\"mobile\"),this.isMobileView=!1,this.recreateCurrentInteractions()}}},i.prototype.resizeInteractions=function(){if(!isNaN(this.currentState)){var t=this;this.interactions.forEach(function(e){e.resizeInteraction(),e.repositionToWrapper(t.$videoWrapper),e.positionLabel(t.$videoWrapper.width())})}},i.prototype.recreateCurrentInteractions=function(){this.dnb.blurAll(),this.interactions.forEach(function(t){t.reCreateInteraction()})},i.prototype.resizeStartScreen=function(){var t=50,e=!0,o=!0;void 0!==this.startScreenOptions.shortStartDescription&&this.startScreenOptions.shortStartDescription.length||(e=!1,this.startScreenOptions.hideStartTitle&&(o=!1,t=45));var n=v(\".h5p-splash-description\",this.$splash),i=v(\".h5p-splash-title\",this.$splash),r=n.clone().css(\"position\",\"absolute\").addClass(\"minimum-font-size\").appendTo(n.parent()),a=i.clone().css(\"position\",\"absolute\").addClass(\"minimum-font-size\").appendTo(i.parent()),s=parseInt(r.css(\"font-size\"),10),l=parseInt(a.css(\"font-size\"),10),c=this.$container.width(),u=parseInt(c\/t,10);e||(o&&u<s?u=s:u<10&&(u=10)),c<510?this.$splash.addClass(\"mobile\"):this.$splash.removeClass(\"mobile\"),.8*u<s?n.addClass(\"minimum-font-size\"):n.removeClass(\"minimum-font-size\"),1.5*u<l?i.addClass(\"minimum-font-size\"):i.removeClass(\"minimum-font-size\"),this.$splash.css(\"font-size\",u),r.remove(),a.remove()},i.prototype.toggleFullScreen=function(){var t=this;H5P.isFullscreen||this.$container.hasClass(\"h5p-fullscreen\")||this.$container.hasClass(\"h5p-semi-fullscreen\")?void 0!==H5P.exitFullScreen&&void 0!==H5P.fullScreenBrowserPrefix?H5P.exitFullScreen():(void 0===H5P.fullScreenBrowserPrefix?v(\".h5p-disable-fullscreen\").click():\"\"===H5P.fullScreenBrowserPrefix?window.top.document.exitFullScreen():\"ms\"===H5P.fullScreenBrowserPrefix?window.top.document.msExitFullscreen():window.top.document[H5P.fullScreenBrowserPrefix+\"CancelFullScreen\"](),t.trigger(\"exitFullScreen\")):(H5P.fullScreen(this.$container,this),void 0===H5P.exitFullScreen&&t.trigger(\"enterFullScreen\")),this.resizeInteractions()},i.prototype.timeUpdate=function(t,e){var o=this;if(t>=0)try{var n=o.controls.$slider.find(\".ui-slider-handle\"),r=i.formatTimeForA11y(t,o.l10n);o.controls.$slider.slider(\"option\",\"value\",t),n.attr(\"aria-valuetext\",r),n.attr(\"aria-valuenow\",t.toString())}catch(t){return}o.updateInteractions(t),e||setTimeout(function(){(o.currentState===H5P.Video.PLAYING||o.currentState===H5P.Video.BUFFERING&&o.lastState===H5P.Video.PLAYING)&&o.timeUpdate(o.video.getCurrentTime())},40)},i.prototype.updateInteractions=function(t){var e=this,o=Math.floor(10*t)\/10;o!==e.lastTenth&&void 0!==e.bookmarksMap&&void 0!==e.bookmarksMap[o]&&e.bookmarksMap[o].mouseover().mouseout(),e.lastTenth=o;var n=Math.floor(t);n!==e.lastSecond&&(e.toggleInteractions(n),e.currentState!==H5P.Video.PLAYING&&e.currentState!==H5P.Video.PAUSED||e.updateCurrentTime(n)),e.lastSecond=n},i.prototype.updateCurrentTime=function(t){var e=this;t=Math.max(t,0);var o=i.humanizeTime(t),n=i.formatTimeForA11y(t,e.l10n);e.controls.$currentTime.html(o),e.controls.$currentTimeA11y.html(e.l10n.currentTime+\" \"+n),e.controls.$currentTimeSimple.html(o),e.controls.$currentTimeA11ySimple.html(e.l10n.currentTime+\" \"+n)},i.prototype.complete=function(){this.editor||(this.completedSent||this.triggerXAPIScored(this.getUsersScore(),this.getUsersMaxScore(),\"completed\"),this.completedSent=!0)},i.prototype.getUsersScore=function(){for(var t=0,e=0;e<this.interactions.length;e++)this.interactions[e].score&&(t+=this.interactions[e].score);return t},i.prototype.getUsersMaxScore=function(){for(var t=0,e=0;e<this.interactions.length;e++)this.interactions[e].maxScore&&(t+=this.interactions[e].maxScore);return t},i.prototype.getScore=function(){return this.getUsersScore()},i.prototype.getMaxScore=function(){return this.getUsersMaxScore()},i.prototype.showOverlayMask=function(){var t=this;t.$videoWrapper.addClass(\"h5p-disable-opt-out\"),t.disableTabIndexes(),t.dnb.dialog.openOverlay(),t.restorePosterTabIndexes(),t.$container.find(\".h5p-dialog-wrapper\").click(function(){t.hasUncompletedRequiredInteractions()&&t.showWarningMask()}),t.toggleFocusTrap()},i.prototype.restorePosterTabIndexes=function(){var t=this;t.$overlay.find(\".h5p-interaction.h5p-poster\").each(function(){t.restoreTabIndexes(v(this))})},i.prototype.disableTabIndexes=function(){var t=this,e=t.$container.find(\".h5p-dialog-wrapper\");t.$tabbables=t.$container.find(\"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]\").filter(function(){var t=v(this),o=v.contains(e.get(0),t.get(0));if(t.data(\"tabindex\"))return!0;if(!o){var n=t.attr(\"tabindex\");return t.data(\"tabindex\",n),t.attr(\"tabindex\",\"-1\"),!0}return!1})},i.prototype.restoreTabIndexes=function(t){var e=this;e.$tabbables&&(e.$tabbables.each(function(){var e=v(this),o=e.data(\"tabindex\");if(t&&!v.contains(t.get(0),e.get(0)))return!0;e.hasClass(\"ui-slider-handle\")?(e.attr(\"tabindex\",0),e.removeData(\"tabindex\")):void 0!==o?(e.attr(\"tabindex\",o),e.removeData(\"tabindex\")):e.removeAttr(\"tabindex\")}),t||(e.$tabbables=void 0))},i.prototype.toggleFocusTrap=function(){var t=this,e=this.getVisibleInteractions().filter(function(t){return t.getRequiresCompletion()&&!t.hasFullScore()});e.length>0?this.$container.off(\"focusin\").on(\"focusin\",function(o){return t.trapFocusInInteractions(e,v(o.target))}):this.$container.off(\"focusin\",\"**\")},i.prototype.trapFocusInInteractions=function(t,e){var o=t.some(function(t){var o=t.getElement();return $(o,e)}),n=!!this.$mask&&$(this.$mask,e);if(!o&&!n){var i=t[0].getElement();i&&i.focus()}},i.prototype.hideOverlayMask=function(){var t=this;return t.restoreTabIndexes(),t.dnb.dialog.closeOverlay(),t.$videoWrapper.removeClass(\"h5p-disable-opt-out\"),t.toggleFocusTrap(),t.$container.find(\".h5p-dialog-wrapper\")},i.prototype.showWarningMask=function(){var t=this,e=\"interactive-video-\"+t.contentId+\"-\"+t.instanceIndex+\"-completion-warning-text\";return t.$mask||(t.$mask=v('<div class=\"h5p-warning-mask\" role=\"alertdialog\" aria-describedby=\"'+e+'\">\\n        <div class=\"h5p-warning-mask-wrapper\">\\n          <div id=\"'+e+'\" class=\"h5p-warning-mask-content\">'+t.l10n.requiresCompletionWarning+'<\/div>\\n          <button type=\"button\" class=\"h5p-joubelui-button h5p-button-back\">'+t.l10n.back+\"<\/button>\\n        <\/div>\\n      <\/div>\").click(function(){t.$mask.hide()}).appendTo(t.$container)),t.$mask.show(),t.$mask.find(\".h5p-button-back\").focus(),t.$mask},i.prototype.setDisabled=function(t){return t.attr(\"aria-disabled\",\"true\").attr(\"tabindex\",\"-1\")},i.prototype.isDisabled=function(t){return\"true\"===t.attr(\"aria-disabled\")},i.prototype.removeDisabled=function(t){return t.removeAttr(\"aria-disabled\").attr(\"tabindex\",\"0\")},i.prototype.hasUncompletedRequiredInteractions=function(t){var e=this;return(void 0!==t?e.getVisibleInteractionsAt(t):e.getVisibleInteractions()).some(function(t){return t.getRequiresCompletion()&&!t.hasFullScore()})},i.prototype.getVisibleInteractions=function(){return this.interactions.filter(function(t){return t.isVisible()})},i.prototype.getVisibleInteractionsAt=function(t){return this.interactions.filter(function(e){return e.visibleAt(t)})},i.prototype.showSolutions=function(){},i.prototype.getTitle=function(){return H5P.createTitle(this.options.video.startScreenOptions.title)},i.prototype.toggleInteractions=function(t){for(var e=0;e<this.interactions.length;e++)this.interactions[e].toggle(t),this.interactions[e].repositionToWrapper(this.$videoWrapper);this.accessibility.announceInteractions(this.interactions)},i.prototype.play=function(){this.video.play()},i.prototype.seek=function(t){this.video.seek(t)},i.prototype.pause=function(){this.video&&this.video.pause&&this.video.pause()},i.prototype.resetTask=function(){if(void 0!==this.controls){this.seek(0),this.timeUpdate(-1),this.controls.$slider.slider(\"option\",\"value\",0);for(var t=0;t<this.interactions.length;t++)this.interactions[t].resetTask()}},i.prototype.read=function(t){var e=this;e.$read&&(e.readText?e.readText+=(\".\"===e.readText.substr(-1,1)?\" \":\". \")+t:e.readText=t,e.$read.html(e.readText),setTimeout(function(){e.readText=null,e.$read.html(\"\")},100))},i.prototype.getCopyrights=function(){var t=this,e=new H5P.ContentCopyrights;void 0!==t.options.video.files&&void 0!==t.options.video.files[0]&&e.addMedia(new H5P.MediaCopyright(t.options.video.files[0].copyright,t.l10n)),void 0!==t.options.video.startScreenOptions.copyright&&e.addMedia(t.options.video.startScreenOptions.copyright);var o=t.options.video.startScreenOptions.poster;if(o&&void 0!==o.copyright){var n=new H5P.MediaCopyright(o.copyright,t.l10n),i=H5P.getPath(o.path,t.contentId);n.setThumbnail(new H5P.Thumbnail(i,o.width,o.height)),e.addMedia(n)}for(var r=0;r<t.interactions.length;r++){var a=t.interactions[r].getCopyrights();a&&e.addContent(a)}return e},i.SEEKING=4,i.LOADED=5,i.ATTACHED=6,i.humanizeTime=function(t){var e=i.secondsToMinutesAndHours(t),o=\"\";return 0!==e.hours&&(o+=e.hours+\":\",e.minutes<10&&(o+=\"0\")),o+=e.minutes+\":\",e.seconds<10&&(o+=\"0\"),o+=e.seconds},i.formatTimeForA11y=function(t,e){var o=i.secondsToMinutesAndHours(t);return(o.hours>0?o.hours+\" \"+e.hours+\", \":\"\")+o.minutes+\" \"+e.minutes+\", \"+o.seconds+\" \"+e.seconds},i.secondsToMinutesAndHours=function(t){var e=Math.floor(t\/60);return{seconds:Math.floor(t%60),minutes:e%60,hours:Math.floor(e\/60)}};var m=function(t,e){e?t.setAttribute(\"tabindex\",\"0\"):t.removeAttribute(\"tabindex\")},b=function(t,e){for(var o=0;o<e.length;o++)if(e[o].name===t)return e[o]},g=function(t,e){null===t?e():setTimeout(e,t)},y=function(){return void 0===window.interactiveVideoCounter&&(window.interactiveVideoCounter=0),window.interactiveVideoCounter++};i.prototype.getXAPIData=function(){var t=this,e=this.createXAPIEventTemplate(\"answered\");k(e),e.setScoredResult(t.getScore(),t.getMaxScore(),t,!0,t.getScore()===t.getMaxScore());var o=C(t.interactions);return{statement:e.data.statement,children:o}};var k=function(t){var e=t.getVerifiedStatementValue([\"object\",\"definition\"]);H5P.jQuery.extend(e,S())},S=function(){var t={};return t.interactionType=\"compound\",t.type=\"http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction\",t.description={\"en-US\":\"\"},t},$=function(t,e){return void 0!==t&&void 0!==e&&(t.is(e)||v.contains(t.get(0),e.get(0)))},C=function(t){return t.map(function(t){return t.getXAPIData()}).filter(function(t){return!!t})};e.default=i;e.KEY_CODE_START_PAUSE=75},function(t,e,o){\"use strict\";function n(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var i=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(t[n]=o[n])}return t},r=function(){function t(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,o,n){return o&&t(e.prototype,o),n&&t(e,n),e}}(),a=o(8),s=o(2),l=o(9),c=(0,a.removeAttribute)(\"tabindex\"),u=((0,s.forEach)(c),(0,a.setAttribute)(\"tabindex\",\"0\")),d=(0,a.setAttribute)(\"tabindex\",\"-1\"),h=(0,a.hasAttribute)(\"tabindex\"),p=function(){function t(e){n(this,t),i(this,(0,l.Eventful)()),this.plugins=e||[],this.elements=[],this.negativeTabIndexAllowed=!1,this.on(\"nextElement\",this.nextElement,this),this.on(\"previousElement\",this.previousElement,this),this.initPlugins()}return r(t,[{key:\"addElement\",value:function(t){this.elements.push(t),this.firesEvent(\"addElement\",t),1===this.elements.length&&this.setTabbable(t)}},{key:\"insertElementAt\",value:function(t,e){this.elements.splice(e,0,t),this.firesEvent(\"addElement\",t),1===this.elements.length&&this.setTabbable(t)}},{key:\"removeElement\",value:function(t){this.elements=(0,s.without)([t],this.elements),h(t)&&(this.setUntabbable(t),this.elements[0]&&this.setTabbable(this.elements[0])),this.firesEvent(\"removeElement\",t)}},{key:\"count\",value:function(){return this.elements.length}},{key:\"firesEvent\",value:function(t,e){var o=this.elements.indexOf(e);return this.fire(t,{element:e,index:o,elements:this.elements,oldElement:this.tabbableElement})}},{key:\"nextElement\",value:function(t){var e=t.index,o=e===this.elements.length-1,n=this.elements[o?0:e+1];this.setTabbable(n),n.focus()}},{key:\"setTabbable\",value:function(t){(0,s.forEach)(this.setUntabbable.bind(this),this.elements),u(t),this.tabbableElement=t}},{key:\"setUntabbable\",value:function(t){this.negativeTabIndexAllowed?d(t):c(t)}},{key:\"previousElement\",value:function(t){var e=t.index,o=0===e,n=this.elements[o?this.elements.length-1:e-1];this.setTabbable(n),n.focus()}},{key:\"useNegativeTabIndex\",value:function(){this.negativeTabIndexAllowed=!0,this.elements.forEach(function(t){t.hasAttribute(\"tabindex\")||d(t)})}},{key:\"initPlugins\",value:function(){this.plugins.forEach(function(t){void 0!==t.init&&t.init(this)},this)}}]),t}();e.default=p},function(t,e,o){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=e.curry=function(t){var e=t.length;return function o(){var n=Array.prototype.slice.call(arguments,0);return n.length>=e?t.apply(null,n):function(){var t=Array.prototype.slice.call(arguments,0);return o.apply(null,n.concat(t))}}},i=(e.compose=function(){for(var t=arguments.length,e=Array(t),o=0;o<t;o++)e[o]=arguments[o];return e.reduce(function(t,e){return function(){return t(e.apply(void 0,arguments))}})},e.forEach=n(function(t,e){e.forEach(t)}),e.map=n(function(t,e){return e.map(t)}),e.filter=n(function(t,e){return e.filter(t)})),r=(e.some=n(function(t,e){return e.some(t)}),e.contains=n(function(t,e){return-1!=e.indexOf(t)}));e.without=n(function(t,e){return i(function(e){return!r(e,t)},e)}),e.inverseBooleanString=function(t){return(\"true\"!==t).toString()}},function(t,e,o){\"use strict\";function n(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var i=function(){function t(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,o,n){return o&&t(e.prototype,o),n&&t(e,n),e}}(),r=function(){function t(){n(this,t),this.selectability=!0}return i(t,[{key:\"init\",value:function(t){this.boundHandleKeyDown=this.handleKeyDown.bind(this),this.controls=t,this.controls.on(\"addElement\",this.listenForKeyDown,this),this.controls.on(\"removeElement\",this.removeKeyDownListener,this)}},{key:\"listenForKeyDown\",value:function(t){t.element.addEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"removeKeyDownListener\",value:function(t){t.element.removeEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"handleKeyDown\",value:function(t){switch(t.which){case 27:this.close(t.target),t.preventDefault(),t.stopPropagation();break;case 13:case 32:this.select(t.target),t.preventDefault(),t.stopPropagation();break;case 37:case 38:this.hasChromevoxModifiers(t)||(this.previousElement(t.target),t.preventDefault(),t.stopPropagation());break;case 39:case 40:this.hasChromevoxModifiers(t)||(this.nextElement(t.target),t.preventDefault(),t.stopPropagation())}}},{key:\"hasChromevoxModifiers\",value:function(t){return t.shiftKey||t.ctrlKey}},{key:\"previousElement\",value:function(t){this.controls.firesEvent(\"previousElement\",t)}},{key:\"nextElement\",value:function(t){this.controls.firesEvent(\"nextElement\",t)}},{key:\"select\",value:function(t){this.selectability&&!1!==this.controls.firesEvent(\"before-select\",t)&&(this.controls.firesEvent(\"select\",t),this.controls.firesEvent(\"after-select\",t))}},{key:\"disableSelectability\",value:function(){this.selectability=!1}},{key:\"enableSelectability\",value:function(){this.selectability=!0}},{key:\"close\",value:function(t){!1!==this.controls.firesEvent(\"before-close\",t)&&(this.controls.firesEvent(\"close\",t),this.controls.firesEvent(\"after-close\",t))}}]),t}();e.default=r},function(t,e,o){\"use strict\";o(5),o(6);var n=o(0),i=function(t){return t&&t.__esModule?t:{default:t}}(n);H5P=H5P||{},H5P.InteractiveVideo=i.default},function(t,e){},function(t,e){},function(t,e,o){\"use strict\";function n(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,\"__esModule\",{value:!0});var i=o(1),r=n(i),a=o(3),s=n(a),l={ICON:0,TEXT:1},c=function(t,e,o,n,i,a){var c=this,h=\"interactive-video-\"+a+\"-menu-\"+t,p=new r.default([new s.default]);p.on(\"close\",function(){return b()});var f=[];H5P.EventDispatcher.call(c);var v,m=function(){c.control.setAttribute(\"aria-expanded\",\"true\"),c.popup.classList.add(\"h5p-show\"),c.trigger(\"open\"),c.popup.querySelector('li[tabindex=\"0\"]').focus()},b=function(){c.control.setAttribute(\"aria-expanded\",\"false\"),c.control.focus(),c.popup.classList.remove(\"h5p-show\"),c.trigger(\"close\")},g=function(){\"true\"===c.control.getAttribute(\"aria-expanded\")?b():m()},y=function(t,e,o){for(var n=0;n<t.length;n++)e.call(o,t[n],n)},k=function(t,e){o=e;var n=v.querySelectorAll('[aria-checked=\"true\"]');y(n,function(t){return t.setAttribute(\"aria-checked\",\"false\")},this),t.setAttribute(\"aria-checked\",\"true\"),b(),c.trigger(\"select\",e)},S=function(t){var e=t.value===o.value,i=d(null,l.TEXT,t.label,function(){k(this,t)},\"li\",n);return f.push({option:t,element:i}),i.setAttribute(\"aria-checked\",e.toString()),i.setAttribute(\"aria-describedby\",h),p.addElement(i),e?i.setAttribute(\"tabindex\",\"0\"):i.removeAttribute(\"tabindex\"),i};c.updateOptions=function(t){v&&v.parentNode.removeChild(v),v=u(null,null,\"ol\"),v.setAttribute(\"role\",\"menu\");for(var e=0;e<t.length;e++)v.appendChild(S(t[e]));c.popup.appendChild(v)},c.popup=u(\"h5p-chooser h5p-\"+t,'<h3 id=\"'+h+'\">'+i[t]+\"<\/h3>\"),c.popup.setAttribute(\"role\",\"dialog\");var $=d(\"h5p-chooser-close-button\",l.ICON,i.close,g,\"div\",\"button\");c.popup.appendChild($),c.control=d(\"h5p-control h5p-\"+t,l.ICON,i[t],g,\"div\",\"button\"),c.control.setAttribute(\"aria-haspopup\",\"true\"),c.overlayControl=d(\"h5p-minimal-button h5p-\"+t,l.TEXT,i[t],g,\"div\",\"menuitem\"),c.overlayControl.tabIndex=\"-1\",c.overlayControl.classList.add(\"h5p-hide\"),c.updateOptions(e)};c.prototype=Object.create(H5P.EventDispatcher.prototype),c.prototype.constructor=c;var u=function(t,e,o){var n=document.createElement(o||\"div\");return t&&(n.className=t),e&&(n.innerHTML=e),n},d=function(t,e,o,n,i,r){var a=u(t,e===l.TEXT?o:\"\",i);return a.tabIndex=0,a.setAttribute(\"role\",r),e===l.ICON&&(a.title=o),a.addEventListener(\"click\",function(t){n.call(a,t)},!1),a.addEventListener(\"keydown\",function(t){32!==t.which&&13!==t.which||(t.preventDefault(),n.call(a,t))},!1),a};e.default=c},function(t,e,o){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.createElement=e.toggleClass=e.toggleVisibility=e.show=e.hide=e.removeClass=e.addClass=e.classListContains=e.removeChild=e.querySelectorAll=e.nodeListToArray=e.querySelector=e.appendChild=e.toggleAttribute=e.attributeEquals=e.hasAttribute=e.removeAttribute=e.setAttribute=e.getAttribute=void 0;var n=o(2),i=e.getAttribute=(0,n.curry)(function(t,e){return e.getAttribute(t)}),r=e.setAttribute=(0,n.curry)(function(t,e,o){return o.setAttribute(t,e)}),a=(e.removeAttribute=(0,n.curry)(function(t,e){return e.removeAttribute(t)}),e.hasAttribute=(0,n.curry)(function(t,e){return e.hasAttribute(t)}),e.attributeEquals=(0,n.curry)(function(t,e,o){return o.getAttribute(t)===e}),e.toggleAttribute=(0,n.curry)(function(t,e){var o=i(t,e);r(t,(0,n.inverseBooleanString)(o),e)}),e.appendChild=(0,n.curry)(function(t,e){return t.appendChild(e)}),e.querySelector=(0,n.curry)(function(t,e){return e.querySelector(t)}),e.nodeListToArray=function(t){return Array.prototype.slice.call(t)}),s=(e.querySelectorAll=(0,n.curry)(function(t,e){return a(e.querySelectorAll(t))}),e.removeChild=(0,n.curry)(function(t,e){return t.removeChild(e)}),e.classListContains=(0,n.curry)(function(t,e){return e.classList.contains(t)}),e.addClass=(0,n.curry)(function(t,e){return e.classList.add(t)})),l=e.removeClass=(0,n.curry)(function(t,e){return e.classList.remove(t)}),c=e.hide=s(\"hidden\"),u=e.show=l(\"hidden\");e.toggleVisibility=(0,n.curry)(function(t,e){return(t?u:c)(e)}),e.toggleClass=(0,n.curry)(function(t,e,o){o.classList[e?\"add\":\"remove\"](t)}),e.createElement=function(t){var e=t.tag,o=t.id,n=t.classes,i=t.attributes,r=document.createElement(e);return o&&(r.id=o),n&&n.forEach(function(t){r.classList.add(t)}),i&&Object.keys(i).forEach(function(t){r.setAttribute(t,i[t])}),r}},function(t,e,o){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.Eventful=function(){return{listeners:{},on:function(t,e,o){var n={listener:e,scope:o};return this.listeners[t]=this.listeners[t]||[],this.listeners[t].push(n),this},fire:function(t,e){return(this.listeners[t]||[]).every(function(t){return!1!==t.listener.call(t.scope||this,e)})},propagate:function(t,e){var o=this;t.forEach(function(t){return e.on(t,function(e){return o.fire(t,e)})})}}}},function(t,e,o){\"use strict\";function n(t,e,o){var n=this;H5P.EventDispatcher.call(n);var d,p,v,m,b=t.action;o&&(b.userDatas={state:o});var g,y,k,S=b.library.split(\" \")[0],$=e.l10n[h(S,t)?\"content\":\"interaction\"],C=\"H5P.Nil\"!==S&&\"button\"===t.displayType,w=[b.params.contentName,C?l(t.label):\"\",t.libraryTitle].filter(s)[0],T=!1,P=!1,x=!1;this.on(\"open-dialog\",function(){q()}),this.on(\"show-mask\",function(){N(this.getElement())});var I=function(){return a.extend({},{backgroundColor:\"rgb(255,255,255)\",boxShadow:!0},t.visuals)},E=function(o){d=a(\"<div\/>\",{tabindex:0,role:\"button\",class:\"h5p-interaction \"+g+(o?\"\":\" h5p-hidden\"),\"aria-popup\":\"true\",\"aria-expanded\":\"false\",\"aria-label\":w,css:{left:t.x+\"%\",top:t.y+\"%\",width:\"\",height:\"\"},on:{click:function(){n.dialogDisabled||(q(),d.attr(\"aria-expanded\",\"true\"))},keydown:function(t){13!==t.which&&32!==t.which||n.dialogDisabled||(q(),d.attr(\"aria-expanded\",\"true\"),t.preventDefault())}}}),d.on(\"keyup\",M),n.on(\"closeDialog\",function(){d&&(d.focus(),d.attr(\"aria-expanded\",\"false\"))}),n.getRequiresCompletion()&&void 0===e.editor&&e.currentState!==H5P.InteractiveVideo.SEEKING&&q(!0),a(\"<div\/>\",{class:\"h5p-touch-area\"}).appendTo(d),a(\"<div\/>\",{class:\"h5p-interaction-button\"}).appendTo(d),e.editor&&d.hover(function(){d.is(\".focused\")||d.is(\":focus\")||e.dnb&&(!e.dnb||e.dnb.newElement)?(e.editor.hideInteractionTitle(),T=!1):(e.editor.showInteractionTitle(w,d),T=!0)},function(){e.editor.hideInteractionTitle(),T=!1}).focus(function(){e.editor.hideInteractionTitle(),T=!1}).click(function(){e.editor.hideInteractionTitle()});var i=s(l(t.label));t.label&&i&&(p=A(t.label,\"h5p-interaction\").appendTo(d)),n.trigger(\"display\",d),setTimeout(function(){d&&d.removeClass(\"h5p-hidden\")},0)},A=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";return a(\"<div\/>\",{class:\"h5p-interaction-label \"+e,html:'<div class=\"h5p-interaction-label-text\">'+t+\"<\/div>\"})},B=function(){return d=A(t.label,\"h5p-interaction h5p-interaction-label-standalone\"),d=d.css({left:t.x+\"%\",top:t.y+\"%\",width:\"\",height:\"initial\"}),n.trigger(\"display\",d),setTimeout(function(){d&&d.removeClass(\"h5p-hidden\")},0),d},M=function(t){t.which===r.KEY_CODE_START_PAUSE&&t.stopPropagation()},H=function(e){if(\"timecode\"===t.goto.type)e.click(function(e){1===e.which&&F({data:t.goto.time})}).keypress(function(e){32===e.which&&F({data:t.goto.time})}).attr(\"href\",\"#\").attr(\"tabindex\",\"0\");else{var o=t.goto.url;e.keypress(function(t){32===t.which&&this.click()}).attr({href:(\"other\"!==o.protocol?o.protocol:\"\")+o.url,target:\"_blank\"})}return e.addClass(\"goto-clickable\")},D=function(t){var o=!e.hasUncompletedRequiredInteractions(t);n.trigger(\"hide\",d),n.isButton()?o&&e.dnb.dialog.close():(e.isMobileView&&o&&e.dnb.dialog.close(),d.detach()),n.trigger(\"remove\",d),o&&U(d)},V=function(){var t=document.createElement(\"button\");return t.innerHTML=e.l10n.continueWithVideo,t.className=\"h5p-interaction-continue-button\",t.addEventListener(\"click\",function(){D(),e.play()}),t},O=function(t){if(\"H5P.Questionnaire\"===S){if(t.find(\".h5p-interaction-continue-button\").length)return;var o=V(),n=t.find(\".h5p-questionnaire-success-center\");n.length&&n.get(0).appendChild(o),y.on(\"noSuccessScreen\",function(){D(),e.play()})}},R=function(t,e){var o=function(t){return e.target===t.get(0)},n=9===e.which,i=t.first(),r=t.last();n&&e.shiftKey&&o(i)?(r.focus(),e.preventDefault()):n&&o(r)&&(i.focus(),e.preventDefault())},q=function(o){var i=e.$container.find(\".h5p-dialog-wrapper\");\"function\"==typeof y.setActivityStarted&&\"function\"==typeof y.getScore&&y.setActivityStarted();var r=n.isGotoClickable(),s=i.find(\"[tabindex]\"),l=a(r?\"<a>\":\"<div>\",{class:\"h5p-dialog-interaction h5p-frame\"});!r&&f(S)&&l.attr(\"tabindex\",\"0\"),l.on(\"keyup\",M),void 0!==e.editor?l.attr(\"tabindex\",-1):0===s.length&&l.attr(\"tabindex\",0),n.getRequiresCompletion()&&i.keydown(function(t){var e=i.find('[tabindex=\"0\"], button, input').filter(\":visible\");R(e,t)});var h=r?H(l):l;if(y.attach(h),O(h),G(y)&&(n.score=y.getScore(),n.maxScore=y.getMaxScore()),!n.hasFullScore()||!o){n.getRequiresCompletion()&&!n.hasFullScore()&&(e.dnb.dialog.hideCloseButton(),e.dnb.dialog.disableOverlay=!0,i.click(function(){if(!n.hasFullScore()){e.showWarningMask().find(\".h5p-button-back\").click(function(){return l.find(\"button\").last().focus()})}})),e.dnb.dialog.open(l),e.disableTabIndexes(),e.dnb.dialog.addLibraryClass(S),e.dnb.dialog.toggleClass(\"goto-clickable-visualize\",!(!r||!t.goto.visualize)),e.dnb.dialog.toggleClass(\"h5p-goto-timecode\",u(t,c.TIME_CODE)),e.dnb.dialog.disableOverlay&&e.restorePosterTabIndexes();var p=function t(){this.off(\"close\",t),e.dnb.$dialogContainer.one(\"transitionend\",function(){if(l.is(\".h5p-image\")){l.find(\"img\").css({width:\"\",height:\"\"})}});try{void 0!==y.pause&&(y.pause instanceof Function||\"function\"==typeof y.pause)&&y.pause()}catch(t){H5P.error(t)}};e.dnb.dialog.on(\"close\",p),e.dnb.dialog.on(\"close\",function(){return n.trigger(\"closeDialog\")});var v=function t(){n.dialogWidth=e.dnb.dialog.getDialogWidth(),e.dnb.dialog.off(\"close\",t)};if(e.dnb.dialog.on(\"close\",v),\"H5P.Image\"===S){var m=e.dnb.dialog.getMaxSize(d),g=l.find(\"img\");b.params.file.width&&b.params.file.height?L(g,m,{width:b.params.file.width,height:b.params.file.height},!e.isMobileView):(g.load(function(){g.is(\":visible\")&&L(g,m,{width:this.width,height:this.height},!e.isMobileView)}),e.dnb.dialog.position(d))}else e.isMobileView||e.dnb.dialog.position(d,{width:n.dialogWidth\/16},!(\"H5P.Text\"===S||\"H5P.Table\"===S));if(\"H5P.Summary\"===S){var k=0;H5P.on(y,\"resize\",function(){var t=l.height();(k>t+10||k<t-10)&&setTimeout(function(){e.dnb.dialog.scroll(t,300)},500),k=t})}setTimeout(function(){H5P.trigger(y,\"resize\")},0)}},L=function(t,o,n,i){n.width\/=16,n.height\/=16,n.height>o.height&&(n.width=n.width*o.height\/n.height,n.height=o.height),n.width>o.width&&(n.height=n.height*o.width\/n.width,n.width=o.width);var r=16\/Number(t.css(\"fontSize\").replace(\"px\",\"\"));t.css({width:n.width*r+\"em\",height:n.height*r+\"em\"}),i&&e.dnb.dialog.position(d,n)},F=function(t){n.isButton()&&e.dnb.dialog.close(),e.currentState!==H5P.Video.PAUSED&&e.currentState!==H5P.Video.ENDED||e.play(),e.seek(t.data)},z=function(){var o=t.height||10,n=t.width||10,i=e.width\/e.fontSize;return{height:o\/(i\/(e.$videoWrapper.width()\/e.$videoWrapper.height()))*100+\"%\",width:n\/i*100+\"%\"}},N=function(t){t.css(\"zIndex\",52),e.showOverlayMask()},U=function(t){t&&t.css(\"zIndex\",\"\"),e.hideOverlayMask()},j=function(){var o=n.isGotoClickable(),i=z(),r=I();if(d=a(\"<div\/>\",{\"aria-label\":e.l10n.interaction,tabindex:\"-1\",class:\"h5p-interaction h5p-poster \"+g+(o&&t.goto.visualize?\" goto-clickable-visualize\":\"\"),css:{left:t.x+\"%\",top:t.y+\"%\",width:i.width,height:i.height}}),d.on(\"keyup\",M),\"H5P.IVHotspot\"!==S){d.css(\"background\",r.backgroundColor);var s=r.backgroundColor.split(\",\");if(s[3]){0===parseFloat(s[3].replace(\")\",\"\"))&&d.addClass(\"h5p-transparent-interaction\")}}!1===r.boxShadow&&d.addClass(\"h5p-box-shadow-disabled\"),\"H5P.Link\"===S&&(d.css(\"height\",\"auto\"),d.css(\"width\",\"auto\"),void 0===e.editor&&d.click(function(){return window.open(y.getUrl()),e.pause(),!1})),m=a(\"<div>\",{class:\"h5p-interaction-outer\"}).appendTo(d),v=a(o?\"<a>\":\"<div>\",{class:\"h5p-interaction-inner h5p-frame\"}).appendTo(m),!o&&f(S)&&v.attr(\"tabindex\",\"0\"),void 0!==e.editor&&y.disableAutoPlay&&y.disableAutoPlay();var l=o?H(v):v;y.attach(l),O(l),n.trigger(\"display\",d),n.getRequiresCompletion()&&e.currentState!==H5P.InteractiveVideo.SEEKING&&void 0===e.editor&&!n.hasFullScore()&&(N(d),d.focus()),setTimeout(function(){H5P.trigger(y,\"resize\")},0),\"function\"==typeof y.setActivityStarted&&\"function\"==typeof y.getScore&&y.setActivityStarted()},W=function(){var o,i,r=!0;if(t.adaptivity&&(i=n.hasFullScore(),r=!n.getRequiresCompletion()||i,i?o=t.adaptivity.correct:i||(o=t.adaptivity.wrong)),!o||void 0===o.seekTo)return void(void 0!==y.hasButton&&(y.hasButton(\"iv-continue\")||y.addButton(\"iv-continue\",e.l10n.defaultAdaptivitySeekLabel,function(){D(),_()}),y[r?\"showButton\":\"hideButton\"](\"iv-continue\")));e.pause(),!o.allowOptOut&&d&&(n.isButton()?(e.dnb.dialog.disableOverlay=!0,e.dnb.dialog.hideCloseButton()):N(d));var a=i?\"correct\":\"wrong\",s=o.seekLabel?o.seekLabel:e.l10n.defaultAdaptivitySeekLabel;y.hideButton(\"iv-continue\").addButton(\"iv-adaptivity-\"+a,s,function(){D(o.seekTo),!i&&y.resetTask&&(y.resetTask(),y.hideButton(\"iv-adaptivity-\"+a)),n.remove(),_(o.seekTo)}).showButton(\"iv-adaptivity-\"+a,1).hideButton(\"iv-adaptivity-\"+(i?\"wrong\":\"correct\"),1).hideButton(\"check-answer\",1).hideButton(\"show-solution\",1).hideButton(\"try-again\",1),void 0!==y.disableInput&&(y.disableInput instanceof Function||\"function\"==typeof y.disableInput)&&y.disableInput(),setTimeout(function(){var t=o.message.replace(\"<p>\",\"\").replace(\"<\/p>\",\"\");y.updateFeedbackContent(t,!0),y.read(t)},0)},_=function(t){var o=K(),n=o.filter(function(t){return!t.isButton()});if(n.length?o=n:o.length&&e.$container.find(\".h5p-dialog-wrapper .h5p-dialog\").show(),o.length){var i=o[0];return i.isButton()?i.trigger(\"open-dialog\"):i.trigger(\"show-mask\"),void e.pause()}e.currentState!==H5P.Video.ENDED&&(void 0!==t&&(e.pause(),e.seek(t)),e.play(),e.controls.$play.focus())},K=function(){return e.getVisibleInteractions().filter(function(t){return t!==n}).filter(function(t){return t.getRequiresCompletion()&&!t.hasFullScore()})},Q=function(){var e=t.className;if(void 0===e){var o=b.library.split(\" \")[0].toLowerCase().split(\".\");e=o[0]+\"-\"+o[1]+\"-interaction\"}return t.goto&&\"timecode\"===t.goto.type&&(e+=\" h5p-goto-timecode\"),e};n.isGotoClickable=function(){return-1!==[\"H5P.Text\",\"H5P.Image\"].indexOf(S)&&t.goto&&-1!==[\"timecode\",\"url\"].indexOf(t.goto.type)},n.getCurrentState=function(){if(y&&(y.getCurrentState instanceof Function||\"function\"==typeof y.getCurrentState))return y.getCurrentState()},n.getDuration=function(){return{from:t.duration.from,to:t.duration.to}},n.getRequiresCompletion=function(){return!!t.adaptivity&&!!t.adaptivity.requireCompletion},n.pause=function(){return t.pause},n.isButton=function(){return\"button\"===t.displayType||!(!e.isMobileView||\"H5P.IVHotspot\"===S)&&(\"H5P.Image\"!==S||!1!==t.buttonOnMobile)},n.isStandaloneLabel=function(){return\"H5P.Nil\"===S},n.isMainSummary=function(){return!0===t.mainSummary},n.selectDot=function(){e.preventSkipping||(e.seekingTo=!0,Math.floor(10*e.video.getCurrentTime())!==Math.floor(10*t.duration.from)&&(e.currentState===H5P.Video.VIDEO_CUED?(e.play(),e.seek(t.duration.from)):e.currentState===H5P.Video.PLAYING?e.seek(t.duration.from):(e.play(),e.seek(t.duration.from),e.pause())))},n.addDot=function(){if(\"H5P.Nil\"!==S){var o=\"h5p-seekbar-interaction \"+g,i=a(\"<div\/>\",{role:\"menuitem\",class:o,\"aria-label\":$+\". \"+w,title:w,css:{left:t.duration.from*e.oneSecondInPercentage+\"%\"},on:{click:n.selectDot,keydown:function(t){if(13===t.which||32===t.which)return n.selectDot(),!1}}});return e.preventSkipping&&i.attr(\"aria-disabled\",\"true\").attr(\"tabindex\",\"-1\"),i}},n.isVisible=function(){return x},n.visibleAt=function(e){return!(e<t.duration.from||e>t.duration.to)},n.toggle=function(o,i){return o=Math.floor(o),n.visibleAt(o)?d?void 0:(x=!0,n.isStandaloneLabel()?B():n.isButton()?E(i):j(),void 0===e.editor?k=e.dnb.add(d,void 0,{dnbElement:k,disableContextMenu:!0}):(n.fit&&(e.editor.fit(d,t),n.fit=!1),d.focus(function(){e.pause()})),d):(x=!1,void(d&&(k&&(k.hideContextMenu(),k===e.dnb.focusedElement&&(k.blur(),delete e.dnb.focusedElement)),e.editor&&T&&(e.editor.hideInteractionTitle(),T=!1),n.remove())))},n.setTitle=function(t){d&&d.attr(\"aria-label\",t),w=t},n.reCreateInteraction=function(){\"H5P.IVHotspot\"!==S&&d&&(n.trigger(\"hide\",d),d.detach(),n.isStandaloneLabel()?B():n.isButton()?E(!0):j())},n.resizeInteraction=function(){n.isStandaloneLabel()||H5P.trigger(y,\"resize\")},n.positionLabel=function(t){d&&n.isButton()&&p&&!n.isStandaloneLabel()&&(p.removeClass(\"h5p-left-label\"),parseInt(d.css(\"left\"))+p.position().left+p.outerWidth()>t&&p.addClass(\"h5p-left-label\"))},n.setPosition=function(e,o){t.x=e,t.y=o,d.css({left:e+\"%\",top:o+\"%\"})},n.setSize=function(e,o){e&&(t.width=e),o&&(t.height=o),H5P.trigger(y,\"resize\")},n.remove=function(){d&&(n.trigger(\"domHidden\",{$dom:d,key:\"videoProgressedPast\"},{bubbles:!0,external:!0}),n.trigger(\"hide\",d),d.detach(),d=void 0)},n.reCreate=function(){g=Q(),n.isStandaloneLabel()||(b.params=b.params||{},y=H5P.newRunnable(b,e.contentId,void 0,void 0,{parent:e}),b.userDatas&&G(y)&&(n.score=y.getScore(),n.maxScore=y.getMaxScore()),y.on&&(y.on(\"xAPI\",function(t){var o=t.getVerifiedStatementValue([\"context\",\"contextActivities\",\"parent\"])||[],i=t.getContentXAPIId(e),r=\"completed\"===t.getVerb()||\"answered\"===t.getVerb();o.some(function(t){return t.id===i})&&r&&t.getMaxScore()&&null!==t.getScore()&&(n.score=t.getScore(),n.maxScore=t.getMaxScore(),W()),n.trigger(t)}),y.on(\"question-finished\",function(){W()}),y.on(\"resize\",function(){delete n.dialogWidth,e&&e.dnb&&e.dnb.dialog.removeStaticWidth()}),\"H5P.IVHotspot\"===S&&y.on(\"goto\",F),\"H5P.GoToQuestion\"===S&&y.on(\"chosen\",F)))};var G=function(t){return\"undefined\"!==(void 0===t?\"undefined\":i(t))&&\"function\"==typeof t.getScore&&\"function\"==typeof t.getMaxScore};n.setDnbElement=function(t){return k!==t&&(k=t,!0)},n.hasFullScore=function(){return n.score>=n.maxScore},n.getLibraryName=function(){return S},n.getTitle=function(){return w},n.getClass=function(){return g},n.getCopyrights=function(){if(!n.isStandaloneLabel()){var o=H5P.newRunnable(b,e.contentId);if(void 0!==o){var i=new H5P.ContentCopyrights;return i.addContent(H5P.getCopyrights(o,t,e.contentId)),i.setLabel(w+\" \"+H5P.InteractiveVideo.humanizeTime(t.duration.from)+\" - \"+H5P.InteractiveVideo.humanizeTime(t.duration.to)),i}}},n.getXAPIData=function(){if(y&&(y.getXAPIData instanceof Function||\"function\"==typeof y.getXAPIData))return y.getXAPIData()},n.getSubcontentId=function(){return b.subContentId},n.getElement=function(){return d},n.getFirstTabbableElement=function(){var t=a(d.get(0)).find(\"[tabindex]\");return t&&t.length?t.get(0):d},n.focus=function(){d&&d.focus()},n.getClipboardData=function(){return H5P.DragNBar.clipboardify(H5PEditor.InteractiveVideo.clipboardKey,t,\"action\")},n.repositionToWrapper=function(e){if(d&&\"H5P.IVHotspot\"!==S){if(P&&(d.css({top:t.y+\"%\",left:t.x+\"%\"}),d.css(n.isButton()?{height:\"\",width:\"\"}:z()),P=!1),d.position().top+d.height()>e.height()){var o=(e.height()-d.height())\/e.height()*100;if(o<0){o=0;var i=e.height()\/parseFloat(d.css(\"font-size\"));d.css(\"height\",i+\"em\")}d.css(\"top\",o+\"%\"),P=!0}if(d.position().left+d.width()>e.width()){var r=(e.width()-d.width())\/e.width()*100;if(r<0){r=0;var a=e.width()\/parseFloat(d.css(\"font-size\"));d.css(\"width\",a+\"em\")}d.css(\"left\",r+\"%\"),P=!0}}},n.resetTask=function(){void 0!==b.userDatas&&void 0!==b.userDatas.state&&delete b.userDatas.state,delete n.score,delete n.maxScore,n.reCreate()},n.reCreate()}Object.defineProperty(e,\"__esModule\",{value:!0});var i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},r=o(0),a=H5P.jQuery,s=function(t){return void 0!==t&&\"string\"==typeof t&&t.length>0},l=function(t){return s(t)?a(\"<div>\"+t+\"<\/div>\").text():void 0},c={TIME_CODE:\"timecode\",URL:\"url\"},u=function(t,e){return void 0!==t.goto&&t.goto.type===e},d=[\"H5P.Image\",\"H5P.Nil\",\"H5P.Table\",\"H5P.Link\",\"H5P.GoToQuestion\",\"H5P.IVHotspot\",\"H5P.Text\"],h=function(t,e){return-1!==d.indexOf(t)||u(e,c.TIME_CODE)},p=[\"H5P.Text\",\"H5P.Table\"],f=function(t){return-1!==p.indexOf(t)};n.prototype=Object.create(H5P.EventDispatcher.prototype),n.prototype.constructor=n,e.default=n},function(t,e,o){\"use strict\";function n(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var i=function(){function t(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,o,n){return o&&t(e.prototype,o),n&&t(e,n),e}}(),r=function(t,e){return-1!==t.indexOf(e)},a=function(){function t(e){n(this,t),this.l10n=e;var o=document.createElement(\"div\");o.classList.add(\"h5p-iv-interactions-announcer\"),o.setAttribute(\"aria-live\",\"polite\"),o.setAttribute(\"aria-hidden\",\"true\"),this.interactionsAnnouncer=o;var i=document.createElement(\"div\");i.classList.add(\"h5p-iv-hotkey-instructions\"),i.textContent=e.navigationHotkeyInstructions,this.hotkeyInstructor=i,this.announcedInteractionIds=[]}return i(t,[{key:\"getHotkeyInstructor\",value:function(){return this.hotkeyInstructor}},{key:\"getInteractionAnnouncer\",value:function(){return this.interactionsAnnouncer}},{key:\"announceInteractions\",value:function(t){var e=this,o=t.filter(function(t){return t.isVisible()}),n=o.filter(function(t){return!r(e.announcedInteractionIds,t.getSubcontentId())});n.length>0&&(this.interactionsAnnouncer.textContent=\"\",this.interactionsAnnouncer.textContent=\"\\n        \"+this.getAnnouncementMessage(n.length)+\" \\n        \"+this.getTitleAnnouncement(n.length,n[0])+\"\\n        \"+this.getPauseAnnouncement(n)),this.announcedInteractionIds=o.map(function(t){return t.getSubcontentId()})}},{key:\"getAnnouncementMessage\",value:function(t){return 0===t?\"\":1===t?this.l10n.singleInteractionAnnouncement:this.l10n.multipleInteractionsAnnouncement}},{key:\"getTitleAnnouncement\",value:function(t,e){return 1===t?e.getTitle():\"\"}},{key:\"getPauseAnnouncement\",value:function(t){return t.some(function(t){return t.pause()})?\". \"+this.l10n.videoPausedAnnouncement:\"\"}}]),t}();e.default=a}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/h5p-course-presentation.js?ver=1.17.7":"\n!function(e){function t(n){if(i[n])return i[n].exports;var r=i[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var i={};t.m=e,t.c=i,t.d=function(e,i,n){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,\"a\",i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"\",t(t.s=5)}([function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.stripHTML=t.addClickAndKeyboardListeners=t.keyCode=t.defaultValue=t.contains=t.isIOS=t.isIPad=t.kebabCase=t.isFunction=t.flattenArray=void 0;var n=i(1),r=(t.flattenArray=function(e){return e.concat.apply([],e)},t.isFunction=function(e){return\"function\"==typeof e},t.kebabCase=function(e){return e.replace(\/[\\W]\/g,\"-\")},t.isIPad=null!==navigator.userAgent.match(\/iPad\/i),t.isIOS=null!==navigator.userAgent.match(\/iPad|iPod|iPhone\/i),t.contains=function(e,t){return-1!==e.indexOf(t)}),s=(t.defaultValue=function(e,t){return void 0!==e?e:t},t.keyCode={ENTER:13,ESC:27,SPACE:32}),o=(t.addClickAndKeyboardListeners=function(e,t,i){e.click(function(e){t.call(i||this,e)}),e.keydown(function(e){r([s.ENTER,s.SPACE],e.which)&&(e.preventDefault(),t.call(i||this,e))})},(0,n.jQuery)(\"<div>\"));t.stripHTML=function(e){return o.html(e).text().trim()}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});t.jQuery=H5P.jQuery,t.EventDispatcher=H5P.EventDispatcher,t.JoubelUI=H5P.JoubelUI},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e},s=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),o=i(18),a=i(3),l=i(19),d=(0,o.removeAttribute)(\"tabindex\"),c=((0,a.forEach)(d),(0,o.setAttribute)(\"tabindex\",\"0\")),u=(0,o.setAttribute)(\"tabindex\",\"-1\"),h=(0,o.hasAttribute)(\"tabindex\"),p=function(){function e(t){n(this,e),r(this,(0,l.Eventful)()),this.plugins=t||[],this.elements=[],this.negativeTabIndexAllowed=!1,this.on(\"nextElement\",this.nextElement,this),this.on(\"previousElement\",this.previousElement,this),this.on(\"firstElement\",this.firstElement,this),this.on(\"lastElement\",this.lastElement,this),this.initPlugins()}return s(e,[{key:\"addElement\",value:function(e){this.elements.push(e),this.firesEvent(\"addElement\",e),1===this.elements.length&&this.setTabbable(e)}},{key:\"insertElementAt\",value:function(e,t){this.elements.splice(t,0,e),this.firesEvent(\"addElement\",e),1===this.elements.length&&this.setTabbable(e)}},{key:\"removeElement\",value:function(e){this.elements=(0,a.without)([e],this.elements),h(e)&&(this.setUntabbable(e),this.elements[0]&&this.setTabbable(this.elements[0])),this.firesEvent(\"removeElement\",e)}},{key:\"count\",value:function(){return this.elements.length}},{key:\"firesEvent\",value:function(e,t){var i=this.elements.indexOf(t);return this.fire(e,{element:t,index:i,elements:this.elements,oldElement:this.tabbableElement})}},{key:\"nextElement\",value:function(e){var t=e.index,i=t===this.elements.length-1,n=this.elements[i?0:t+1];this.setTabbable(n),n.focus()}},{key:\"firstElement\",value:function(){var e=this.elements[0];this.setTabbable(e),e.focus()}},{key:\"lastElement\",value:function(){var e=this.elements[this.elements.length-1];this.setTabbable(e),e.focus()}},{key:\"setTabbableByIndex\",value:function(e){var t=this.elements[e];t&&this.setTabbable(t)}},{key:\"setTabbable\",value:function(e){(0,a.forEach)(this.setUntabbable.bind(this),this.elements),c(e),this.tabbableElement=e}},{key:\"setUntabbable\",value:function(e){this.negativeTabIndexAllowed?u(e):d(e)}},{key:\"previousElement\",value:function(e){var t=e.index,i=0===t,n=this.elements[i?this.elements.length-1:t-1];this.setTabbable(n),n.focus()}},{key:\"useNegativeTabIndex\",value:function(){this.negativeTabIndexAllowed=!0,this.elements.forEach(function(e){e.hasAttribute(\"tabindex\")||u(e)})}},{key:\"initPlugins\",value:function(){this.plugins.forEach(function(e){void 0!==e.init&&e.init(this)},this)}}]),e}();t.default=p},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=t.curry=function(e){var t=e.length;return function i(){var n=Array.prototype.slice.call(arguments,0);return n.length>=t?e.apply(null,n):function(){var e=Array.prototype.slice.call(arguments,0);return i.apply(null,n.concat(e))}}},r=(t.compose=function(){for(var e=arguments.length,t=Array(e),i=0;i<e;i++)t[i]=arguments[i];return t.reduce(function(e,t){return function(){return e(t.apply(void 0,arguments))}})},t.forEach=n(function(e,t){t.forEach(e)}),t.map=n(function(e,t){return t.map(e)}),t.filter=n(function(e,t){return t.filter(e)})),s=(t.some=n(function(e,t){return t.some(e)}),t.contains=n(function(e,t){return-1!=t.indexOf(e)}));t.without=n(function(e,t){return r(function(t){return!s(t,e)},t)}),t.inverseBooleanString=function(e){return(\"true\"!==e).toString()}},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),s=function(){function e(){n(this,e),this.selectability=!0}return r(e,[{key:\"init\",value:function(e){this.boundHandleKeyDown=this.handleKeyDown.bind(this),this.controls=e,this.controls.on(\"addElement\",this.listenForKeyDown,this),this.controls.on(\"removeElement\",this.removeKeyDownListener,this)}},{key:\"listenForKeyDown\",value:function(e){e.element.addEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"removeKeyDownListener\",value:function(e){e.element.removeEventListener(\"keydown\",this.boundHandleKeyDown)}},{key:\"handleKeyDown\",value:function(e){switch(e.which){case 27:this.close(e.target),e.preventDefault(),e.stopPropagation();break;case 35:this.lastElement(e.target),e.preventDefault(),e.stopPropagation();break;case 36:this.firstElement(e.target),e.preventDefault(),e.stopPropagation();break;case 13:case 32:this.select(e.target),e.preventDefault(),e.stopPropagation();break;case 37:case 38:this.hasChromevoxModifiers(e)||(this.previousElement(e.target),e.preventDefault(),e.stopPropagation());break;case 39:case 40:this.hasChromevoxModifiers(e)||(this.nextElement(e.target),e.preventDefault(),e.stopPropagation())}}},{key:\"hasChromevoxModifiers\",value:function(e){return e.shiftKey||e.ctrlKey}},{key:\"previousElement\",value:function(e){!1!==this.controls.firesEvent(\"beforePreviousElement\",e)&&(this.controls.firesEvent(\"previousElement\",e),this.controls.firesEvent(\"afterPreviousElement\",e))}},{key:\"nextElement\",value:function(e){!1!==this.controls.firesEvent(\"beforeNextElement\",e)&&(this.controls.firesEvent(\"nextElement\",e),this.controls.firesEvent(\"afterNextElement\",e))}},{key:\"select\",value:function(e){this.selectability&&!1!==this.controls.firesEvent(\"before-select\",e)&&(this.controls.firesEvent(\"select\",e),this.controls.firesEvent(\"after-select\",e))}},{key:\"firstElement\",value:function(e){!1!==this.controls.firesEvent(\"beforeFirstElement\",e)&&(this.controls.firesEvent(\"firstElement\",e),this.controls.firesEvent(\"afterFirstElement\",e))}},{key:\"lastElement\",value:function(e){!1!==this.controls.firesEvent(\"beforeLastElement\",e)&&(this.controls.firesEvent(\"lastElement\",e),this.controls.firesEvent(\"afterLastElement\",e))}},{key:\"disableSelectability\",value:function(){this.selectability=!1}},{key:\"enableSelectability\",value:function(){this.selectability=!0}},{key:\"close\",value:function(e){!1!==this.controls.firesEvent(\"before-close\",e)&&(this.controls.firesEvent(\"close\",e),this.controls.firesEvent(\"after-close\",e))}}]),e}();t.default=s},function(e,t,i){\"use strict\";i(6),i(7),i(8),i(9),i(10),i(11),i(12);var n=i(13),r=function(e){return e&&e.__esModule?e:{default:e}}(n);H5P=H5P||{},H5P.CoursePresentation=r.default},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){var i=[],n=!0,r=!1,s=void 0;try{for(var o,a=e[Symbol.iterator]();!(n=(o=a.next()).done)&&(i.push(o.value),!t||i.length!==t);n=!0);}catch(e){r=!0,s=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw s}}return i}return function(t,i){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,i);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},o=i(14),a=n(o),l=i(15),d=n(l),c=i(16),u=n(c),h=i(20),p=n(h),f=i(21),v=n(f),m=i(1),y=i(0),g=function(e,t,i){m.EventDispatcher.call(this);var n=this;this.presentation=e.presentation,this.slides=this.presentation.slides,this.contentId=t,this.elementInstances=[],this.elementsAttached=[],this.slidesWithSolutions=[],this.hasAnswerElements=!1,this.ignoreResize=!1,i.cpEditor&&(this.editor=i.cpEditor),i&&(this.previousState=i.previousState),this.currentSlideIndex=this.previousState&&this.previousState.progress?this.previousState.progress:0,this.presentation.keywordListEnabled=void 0===e.presentation.keywordListEnabled||e.presentation.keywordListEnabled,this.l10n=m.jQuery.extend({slide:\"Slide\",yourScore:\"Your score\",maxScore:\"Max score\",goodScore:\"Congratulations! You got @percent correct!\",okScore:\"Nice effort! You got @percent correct!\",badScore:\"You need to work more on this. You only got @percent correct...\",total:\"TOTAL\",showSolutions:\"Show solutions\",summary:\"summary\",retry:\"Retry\",exportAnswers:\"Export text\",close:\"Close\",hideKeywords:\"Hide keywords list\",showKeywords:\"Show keywords list\",fullscreen:\"Fullscreen\",exitFullscreen:\"Exit fullscreen\",prevSlide:\"Previous slide\",nextSlide:\"Next slide\",currentSlide:\"Current slide\",lastSlide:\"Last slide\",solutionModeTitle:\"Exit solution mode\",solutionModeText:\"Solution Mode\",summaryMultipleTaskText:\"Multiple tasks\",scoreMessage:\"You achieved:\",shareFacebook:\"Share on Facebook\",shareTwitter:\"Share on Twitter\",shareGoogle:\"Share on Google+\",goToSlide:\"Go to slide :num\",solutionsButtonTitle:\"Show comments\",printTitle:\"Print\",printIngress:\"How would you like to print this presentation?\",printAllSlides:\"Print all slides\",printCurrentSlide:\"Print current slide\",noTitle:\"No title\",accessibilitySlideNavigationExplanation:\"Use left and right arrow to change slide in that direction whenever canvas is selected.\",containsNotCompleted:\"@slideName contains not completed interaction\",containsCompleted:\"@slideName contains completed interaction\",slideCount:\"Slide @index of @total\",accessibilityCanvasLabel:\"Presentation canvas. Use left and right arrow to move between slides.\",containsOnlyCorrect:\"@slideName only has correct answers\",containsIncorrectAnswers:\"@slideName has incorrect answers\"},void 0!==e.l10n?e.l10n:{}),e.override&&(this.activeSurface=!!e.override.activeSurface,this.hideSummarySlide=!!e.override.hideSummarySlide,this.enablePrintButton=!!e.override.enablePrintButton,e.override.social&&(this.enableTwitterShare=!!e.override.social.showTwitterShare,this.enableFacebookShare=!!e.override.social.showFacebookShare,this.enableGoogleShare=!!e.override.social.showGoogleShare,this.twitterShareStatement=e.override.social.twitterShare.statement,this.twitterShareHashtags=e.override.social.twitterShare.hashtags,this.twitterShareUrl=e.override.social.twitterShare.url,this.facebookShareUrl=e.override.social.facebookShare.url,this.facebookShareQuote=e.override.social.facebookShare.quote,this.googleShareUrl=e.override.social.googleShareUrl)),this.keywordMenu=new v.default({l10n:this.l10n,currentIndex:void 0!==this.previousState?this.previousState.progress:0}),this.setElementsOverride(e.override),this.on(\"resize\",this.resize,this),this.on(\"printing\",function(e){n.ignoreResize=!e.data.finished,e.data.finished?n.resize():e.data.allSlides&&n.attachAllElements()})};g.prototype=Object.create(m.EventDispatcher.prototype),g.prototype.constructor=g,g.prototype.getCurrentState=function(){var e=this,t=this.previousState?this.previousState:{};t.progress=this.getCurrentSlideIndex(),t.answers||(t.answers=[]),t.answered=this.elementInstances.map(function(t,i){return e.slideHasAnsweredTask(i)});for(var i=0;i<this.elementInstances.length;i++)if(this.elementInstances[i])for(var n=0;n<this.elementInstances[i].length;n++){var r=this.elementInstances[i][n];(r.getCurrentState instanceof Function||\"function\"==typeof r.getCurrentState)&&(t.answers[i]||(t.answers[i]=[]),t.answers[i][n]=r.getCurrentState())}return t},g.prototype.slideHasAnsweredTask=function(e){return(this.slidesWithSolutions[e]||[]).filter(function(e){return(0,y.isFunction)(e.getAnswerGiven)}).some(function(e){return e.getAnswerGiven()})},g.prototype.attach=function(e){var t=this,i=this;void 0!==this.isRoot&&this.isRoot()&&this.setActivityStarted();var n='<div class=\"h5p-keymap-explanation hidden-but-read\">'+this.l10n.accessibilitySlideNavigationExplanation+'<\/div><div class=\"h5p-wrapper\" tabindex=\"0\" aria-label=\"'+this.l10n.accessibilityCanvasLabel+'\">  <div class=\"h5p-current-slide-announcer hidden-but-read\" aria-live=\"polite\"><\/div>  <div tabindex=\"-1\"><\/div>  <div class=\"h5p-box-wrapper\">    <div class=\"h5p-presentation-wrapper\">      <div class=\"h5p-keywords-wrapper\"><\/div>     <div class=\"h5p-slides-wrapper\"><\/div>    <\/div>  <\/div>  <nav class=\"h5p-cp-navigation\">    <ol class=\"h5p-progressbar list-unstyled\"><\/ol>  <\/nav>  <div class=\"h5p-footer\"><\/div><\/div>';e.attr(\"role\",\"application\").addClass(\"h5p-course-presentation\").html(n),this.$container=e,this.$slideAnnouncer=e.find(\".h5p-current-slide-announcer\"),this.$slideTop=this.$slideAnnouncer.next(),this.$wrapper=e.children(\".h5p-wrapper\").focus(function(){i.initKeyEvents()}).blur(function(){void 0!==i.keydown&&(H5P.jQuery(\"body\").unbind(\"keydown\",i.keydown),delete i.keydown)}).click(function(e){var t=H5P.jQuery(e.target);t.is(\"input, textarea, a\")||i.editor||i.$wrapper.focus(),i.presentation.keywordListEnabled&&!i.presentation.keywordListAlwaysShow&&i.presentation.keywordListAutoHide&&!t.is(\"textarea, .h5p-icon-pencil, span\")&&i.hideKeywords()});var r=parseInt(this.$wrapper.css(\"width\"));this.width=0!==r?r:640;var s=parseInt(this.$wrapper.css(\"height\"));this.height=0!==s?s:400,this.ratio=16\/9,this.fontSize=16,this.$boxWrapper=this.$wrapper.children(\".h5p-box-wrapper\");var o=this.$boxWrapper.children(\".h5p-presentation-wrapper\");this.$slidesWrapper=o.children(\".h5p-slides-wrapper\"),this.$keywordsWrapper=o.children(\".h5p-keywords-wrapper\"),this.$progressbar=this.$wrapper.find(\".h5p-progressbar\"),this.$footer=this.$wrapper.children(\".h5p-footer\"),this.initKeywords=void 0===this.presentation.keywordListEnabled||!0===this.presentation.keywordListEnabled||void 0!==this.editor,this.activeSurface&&void 0===this.editor&&(this.initKeywords=!1,this.$boxWrapper.css(\"height\",\"100%\")),this.isSolutionMode=!1,this.createSlides(this.slides),this.elementsAttached[this.currentSlideIndex]=!0;var a;if(this.showSummarySlide=!1,this.hideSummarySlide?this.showSummarySlide=!this.hideSummarySlide:this.slidesWithSolutions.forEach(function(e){i.showSummarySlide=e.length}),void 0===this.editor&&(this.showSummarySlide||this.hasAnswerElements)){var l={elements:[],keywords:[]};this.slides.push(l),a=H5P.jQuery(g.createSlide(l)).appendTo(this.$slidesWrapper),a.addClass(\"h5p-summary-slide\"),this.isCurrentSlide(this.slides.length-1)&&(this.$current=a)}var c=this.getKeywordMenuConfig();c.length>0||this.isEditor()?(this.keywordMenu.init(c),this.keywordMenu.on(\"select\",function(e){return t.keywordClick(e.data.index)}),this.keywordMenu.on(\"close\",function(){return t.hideKeywords()}),this.keywordMenu.on(\"select\",function(){t.$currentKeyword=t.$keywords.children(\".h5p-current\")}),this.$keywords=(0,m.jQuery)(this.keywordMenu.getElement()).appendTo(this.$keywordsWrapper),this.$currentKeyword=this.$keywords.children(\".h5p-current\"),this.setKeywordsOpacity(void 0===this.presentation.keywordListOpacity?90:this.presentation.keywordListOpacity),this.presentation.keywordListAlwaysShow&&this.showKeywords()):(this.$keywordsWrapper.remove(),this.initKeywords=!1),void 0===this.editor&&this.activeSurface?(this.$progressbar.add(this.$footer).remove(),H5P.fullscreenSupported&&(this.$fullScreenButton=H5P.jQuery(\"<div\/>\",{class:\"h5p-toggle-full-screen\",title:this.l10n.fullscreen,role:\"button\",tabindex:0,appendTo:this.$wrapper}),(0,y.addClickAndKeyboardListeners)(this.$fullScreenButton,function(){return i.toggleFullScreen()}))):(this.initTouchEvents(),this.navigationLine=new u.default(this),this.previousState&&this.previousState.progress||this.setSlideNumberAnnouncer(0,!1),this.summarySlideObject=new d.default(this,a)),new p.default(this),this.previousState&&this.previousState.progress&&this.jumpToSlide(this.previousState.progress)},g.prototype.updateKeywordMenuFromSlides=function(){this.keywordMenu.removeAllMenuItemElements();var e=this.getKeywordMenuConfig();return(0,m.jQuery)(this.keywordMenu.init(e))},g.prototype.getKeywordMenuConfig=function(){var e=this;return this.slides.map(function(t,i){return{title:e.createSlideTitle(t),subtitle:e.l10n.slide+\" \"+(i+1),index:i}}).filter(function(e){return null!==e.title})},g.prototype.createSlideTitle=function(e){var t=this.isEditor()?this.l10n.noTitle:null;return this.hasKeywords(e)?e.keywords[0].main:t},g.prototype.isEditor=function(){return void 0!==this.editor},g.prototype.hasKeywords=function(e){return void 0!==e.keywords&&e.keywords.length>0},g.prototype.createSlides=function(e){for(var t=0;t<e.length;t++){var i=e[t],n=(0,m.jQuery)(g.createSlide(i)).appendTo(this.$slidesWrapper);t===this.currentSlideIndex&&(this.$current=n.addClass(\"h5p-current\")),this.addElements(i,n,t)}},g.prototype.hasScoreData=function(e){return\"undefined\"!==(void 0===e?\"undefined\":s(e))&&\"function\"==typeof e.getScore&&\"function\"==typeof e.getMaxScore},g.prototype.getScore=function(){var e=this;return(0,y.flattenArray)(e.slidesWithSolutions).reduce(function(t,i){return t+(e.hasScoreData(i)?i.getScore():0)},0)},g.prototype.getMaxScore=function(){var e=this;return(0,y.flattenArray)(e.slidesWithSolutions).reduce(function(t,i){return t+(e.hasScoreData(i)?i.getMaxScore():0)},0)},g.prototype.setProgressBarFeedback=function(e){var t=this;void 0!==e&&e?e.forEach(function(e){var i=t.progressbarParts[e.slide-1].find(\".h5p-progressbar-part-has-task\");if(i.hasClass(\"h5p-answered\")){var n=e.score>=e.maxScore;i.addClass(n?\"h5p-is-correct\":\"h5p-is-wrong\"),t.navigationLine.updateSlideTitle(e.slide-1)}}):this.progressbarParts.forEach(function(e){e.find(\".h5p-progressbar-part-has-task\").removeClass(\"h5p-is-correct\").removeClass(\"h5p-is-wrong\")})},g.prototype.toggleKeywords=function(){this[this.$keywordsWrapper.hasClass(\"h5p-open\")?\"hideKeywords\":\"showKeywords\"]()},g.prototype.hideKeywords=function(){this.$keywordsWrapper.hasClass(\"h5p-open\")&&(void 0!==this.$keywordsButton&&(this.$keywordsButton.attr(\"title\",this.l10n.showKeywords),this.$keywordsButton.attr(\"aria-expanded\",\"false\"),this.$keywordsButton.focus()),this.$keywordsWrapper.removeClass(\"h5p-open\"))},g.prototype.showKeywords=function(){void 0!==this.$keywordsButton&&(this.$keywordsButton.attr(\"title\",this.l10n.hideKeywords),this.$keywordsButton.attr(\"aria-expanded\",\"true\")),this.$keywordsWrapper.addClass(\"h5p-open\"),this.$keywordsWrapper.find('li[tabindex=\"0\"]').focus()},g.prototype.setKeywordsOpacity=function(e){var t=this.$keywordsWrapper.css(\"background-color\").split(\/\\(|\\)|,\/g),i=r(t,3),n=i[0],s=i[1],o=i[2];this.$keywordsWrapper.css(\"background-color\",\"rgba(\"+n+\", \"+s+\", \"+o+\", \"+e\/100+\")\")},g.prototype.fitCT=function(){void 0===this.editor&&this.$current.find(\".h5p-ct\").each(function(){for(var e=100,t=H5P.jQuery(this),i=t.parent().height();t.outerHeight()>i&&(e--,t.css({fontSize:e+\"%\",lineHeight:e+65+\"%\"}),!(e<0)););})},g.prototype.resize=function(){var e=H5P.$body.hasClass(\"h5p-fullscreen\")||H5P.$body.hasClass(\"h5p-semi-fullscreen\");if(!this.ignoreResize){this.$wrapper.css(\"width\",\"auto\");var t=this.$container.width(),i={};if(e){var n=this.$container.height();t\/n>this.ratio&&(t=n*this.ratio,i.width=t+\"px\")}var r=t\/this.width;i.height=t\/this.ratio+\"px\",i.fontSize=this.fontSize*r+\"px\",void 0!==this.editor&&this.editor.setContainerEm(this.fontSize*r*.75),this.$wrapper.css(i),this.swipeThreshold=100*r;var s=this.elementInstances[this.$current.index()];if(void 0!==s)for(var o=this.slides[this.$current.index()].elements,a=0;a<s.length;a++){var l=s[a];void 0!==l.preventResize&&!1!==l.preventResize||void 0===l.$||o[a].displayAsButton||H5P.trigger(l,\"resize\")}this.fitCT()}},g.prototype.toggleFullScreen=function(){H5P.isFullscreen||this.$container.hasClass(\"h5p-fullscreen\")||this.$container.hasClass(\"h5p-semi-fullscreen\")?(this.$footer.removeClass(\"footer-full-screen\"),this.$fullScreenButton.attr(\"title\",this.l10n.fullscreen),void 0!==H5P.exitFullScreen&&void 0!==H5P.fullScreenBrowserPrefix?H5P.exitFullScreen():void 0===H5P.fullScreenBrowserPrefix?H5P.jQuery(\".h5p-disable-fullscreen\").click():\"\"===H5P.fullScreenBrowserPrefix?window.top.document.exitFullScreen():\"ms\"===H5P.fullScreenBrowserPrefix?window.top.document.msExitFullscreen():window.top.document[H5P.fullScreenBrowserPrefix+\"CancelFullScreen\"]()):(this.$footer.addClass(\"footer-full-screen\"),this.$fullScreenButton.attr(\"title\",this.l10n.exitFullscreen),H5P.fullScreen(this.$container,this),void 0===H5P.fullScreenBrowserPrefix&&H5P.jQuery(\".h5p-disable-fullscreen\").hide())},g.prototype.focus=function(){this.$wrapper.focus()},g.prototype.keywordClick=function(e){this.shouldHideKeywordsAfterSelect()&&this.hideKeywords(),this.jumpToSlide(e,!0)},g.prototype.shouldHideKeywordsAfterSelect=function(){return this.presentation.keywordListEnabled&&!this.presentation.keywordListAlwaysShow&&this.presentation.keywordListAutoHide&&void 0===this.editor},g.prototype.addElements=function(e,t,i){if(void 0!==e.elements){for(var n=this.isEditor()||0===i||1===i||this.isCurrentSlide(i),r=0;r<e.elements.length;r++){var s=e.elements[r],o=this.addElement(s,t,i);n&&this.attachElement(s,o,t,i)}n&&(this.elementsAttached[i]=!0,this.trigger(\"domChanged\",{$target:t,library:\"CoursePresentation\",key:\"newSlide\"},{bubbles:!0,external:!0}))}},g.prototype.setElementsOverride=function(e){this.elementsOverride={params:{}},e&&(this.elementsOverride.params.behaviour={},e.showSolutionButton&&(this.elementsOverride.params.behaviour.enableSolutionsButton=\"on\"===e.showSolutionButton),e.retryButton&&(this.elementsOverride.params.behaviour.enableRetry=\"on\"===e.retryButton))},g.prototype.addElement=function(e,t,i){var n,r=this;if(void 0===e.action)n=new a.default(e,{l10n:this.l10n,currentIndex:i}),this.isEditor()||n.on(\"navigate\",function(e){var t=e.data;r.jumpToSlide(t)});else{var s;s=void 0!==this.editor?H5P.jQuery.extend(!0,{},e.action,this.elementsOverride):H5P.jQuery.extend(!0,e.action,this.elementsOverride),s.params.autoplay?(s.params.autoplay=!1,s.params.cpAutoplay=!0):s.params.playback&&s.params.playback.autoplay?(s.params.playback.autoplay=!1,s.params.cpAutoplay=!0):s.params.media&&s.params.media.params&&s.params.media.params.playback&&s.params.media.params.playback.autoplay?(s.params.media.params.playback.autoplay=!1,s.params.cpAutoplay=!0):s.params.media&&s.params.media.params&&s.params.media.params.autoplay&&(s.params.media.params.autoplay=!1,s.params.cpAutoplay=!0);var o=this.elementInstances[i]?this.elementInstances[i].length:0;this.previousState&&this.previousState.answers&&this.previousState.answers[i]&&this.previousState.answers[i][o]&&(s.userDatas={state:this.previousState.answers[i][o]}),s.params=s.params||{},n=H5P.newRunnable(s,this.contentId,void 0,void 0,{parent:this}),void 0!==n.preventResize&&(n.preventResize=!0)}return void 0===this.elementInstances[i]?this.elementInstances[i]=[n]:this.elementInstances[i].push(n),this.checkForSolutions(n)&&(n.coursePresentationIndexOnSlide=this.elementInstances[i].length-1,void 0===this.slidesWithSolutions[i]&&(this.slidesWithSolutions[i]=[]),this.slidesWithSolutions[i].push(n)),void 0!==n.exportAnswers&&n.exportAnswers&&(this.hasAnswerElements=!0),n},g.prototype.attachElements=function(e,t){if(void 0===this.elementsAttached[t]){var i=this.slides[t],n=this.elementInstances[t];if(void 0!==i.elements)for(var r=0;r<i.elements.length;r++)this.attachElement(i.elements[r],n[r],e,t);this.trigger(\"domChanged\",{$target:e,library:\"CoursePresentation\",key:\"newSlide\"},{bubbles:!0,external:!0}),this.elementsAttached[t]=!0}},g.prototype.attachElement=function(e,t,i,n){var r=void 0!==e.displayAsButton&&e.displayAsButton,s=void 0!==e.buttonSize?\"h5p-element-button-\"+e.buttonSize:\"\",o=\"h5p-element\"+(r?\" h5p-element-button-wrapper\":\"\")+(s.length?\" \"+s:\"\"),a=H5P.jQuery(\"<div>\",{class:o}).css({left:e.x+\"%\",top:e.y+\"%\",width:e.width+\"%\",height:e.height+\"%\"}).appendTo(i),l=void 0===e.backgroundOpacity||0===e.backgroundOpacity;if(a.toggleClass(\"h5p-transparent\",l),r){this.createInteractionButton(e,t).appendTo(a)}else{var d=e.action&&e.action.library,c=d?this.getLibraryTypePmz(e.action.library):\"other\",u=H5P.jQuery(\"<div>\",{class:\"h5p-element-outer \"+c+\"-outer-element\"}).css({background:\"rgba(255,255,255,\"+(void 0===e.backgroundOpacity?0:e.backgroundOpacity\/100)+\")\"}).appendTo(a),h=H5P.jQuery(\"<div>\",{class:\"h5p-element-inner\"}).appendTo(u);if(\"h5p-advancedtext\"!==c&&\"h5p-table\"!==c||h.attr(\"tabindex\",0),t.attach(h),void 0!==e.action&&\"H5P.InteractiveVideo\"===e.action.library.substr(0,20)){var p=function(){t.$container.addClass(\"h5p-fullscreen\"),t.controls.$fullscreen&&t.controls.$fullscreen.remove(),t.hasFullScreen=!0,t.controls.$play.hasClass(\"h5p-pause\")?t.$controls.addClass(\"h5p-autohide\"):t.enableAutoHide()};void 0!==t.controls?p():t.on(\"controls\",p)}}return void 0!==this.editor?this.editor.processElement(e,a,n,t):(e.solution&&this.addElementSolutionButton(e,t,a),this.hasAnswerElements=this.hasAnswerElements||void 0!==t.exportAnswers),a},g.prototype.disableTabIndexes=function(){var e=this.$container.find(\".h5p-popup-container\");this.$tabbables=this.$container.find(\"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]\").filter(function(){var t=(0,m.jQuery)(this),i=m.jQuery.contains(e.get(0),t.get(0));if(t.data(\"tabindex\"))return!0;if(!i){var n=t.attr(\"tabindex\");return t.data(\"tabindex\",n),t.attr(\"tabindex\",\"-1\"),!0}return!1})},g.prototype.restoreTabIndexes=function(){this.$tabbables&&this.$tabbables.each(function(){var e=(0,m.jQuery)(this),t=e.data(\"tabindex\");e.hasClass(\"ui-slider-handle\")?(e.attr(\"tabindex\",0),e.removeData(\"tabindex\")):void 0!==t?(e.attr(\"tabindex\",t),e.removeData(\"tabindex\")):e.removeAttr(\"tabindex\")})},g.prototype.createInteractionButton=function(e,t){var i=this,n=e.action.params&&e.action.params.cpAutoplay,r=e.action.params&&e.action.params.contentName||\"\",s=this.getLibraryTypePmz(e.action.library),o=function(e){return function(){return e.attr(\"aria-expanded\",\"false\")}},a=(0,m.jQuery)(\"<div>\",{role:\"button\",tabindex:0,\"aria-label\":r,\"aria-popup\":!0,\"aria-expanded\":!1,class:\"h5p-element-button h5p-element-button-\"+e.buttonSize+\" \"+s+\"-button\"}),l=(0,m.jQuery)('<div class=\"h5p-button-element\"><\/div>');return t.attach(l),(0,y.addClickAndKeyboardListeners)(a,function(){a.attr(\"aria-expanded\",\"true\"),i.showInteractionPopup(t,a,l,s,n,o(a)),i.disableTabIndexes()}),void 0!==e.action&&\"H5P.InteractiveVideo\"===e.action.library.substr(0,20)&&t.on(\"controls\",function(){t.controls.$fullscreen&&t.controls.$fullscreen.remove()}),a},g.prototype.showInteractionPopup=function(e,t,i,n,r,s){var o=this,a=function(){o.$footer.removeClass(\"footer-full-screen\"),o.$fullScreenButton.attr(\"title\",o.l10n.fullscreen),e.trigger(\"resize\")};if(!this.isEditor()){this.on(\"exitFullScreen\",a),i.appendTo(this.showPopup(\"\",t,function(){o.pauseMedia(e),i.detach(),o.off(\"exitFullScreen\",a),s()},n).find(\".h5p-popup-wrapper\")),H5P.trigger(e,\"resize\"),\"h5p-image\"===n&&this.resizePopupImage(i);i.closest(\".h5p-popup-container\").on(\"transitionend\",function(){var e=i.find(\":input\").add(i.find(\"[tabindex]\"));e.length?e[0].focus():(i.attr(\"tabindex\",0),i.focus())}),(0,y.isFunction)(e.setActivityStarted)&&(0,y.isFunction)(e.getScore)&&e.setActivityStarted(),r&&(0,y.isFunction)(e.play)&&e.play()}},g.prototype.getLibraryTypePmz=function(e){return(0,y.kebabCase)(e.split(\" \")[0]).toLowerCase()},g.prototype.resizePopupImage=function(e){var t=Number(e.css(\"fontSize\").replace(\"px\",\"\")),i=e.find(\"img\"),n=function(i,n){if(!(n\/t<18.5)){var r=i\/n;n=18.5*t,e.css({width:n*r,height:n})}};i.height()?n(i.width(),i.height()):i.one(\"load\",function(){n(this.width,this.height)})},g.prototype.addElementSolutionButton=function(e,t,i){var n=this;t.showCPComments=function(){if(0===i.children(\".h5p-element-solution\").length&&(0,y.stripHTML)(e.solution).length>0){var t=(0,m.jQuery)(\"<div\/>\",{role:\"button\",tabindex:0,title:n.l10n.solutionsButtonTitle,\"aria-popup\":!0,\"aria-expanded\":!1,class:\"h5p-element-solution\"}).append('<span class=\"joubel-icon-comment-normal\"><span class=\"h5p-icon-shadow\"><\/span><span class=\"h5p-icon-speech-bubble\"><\/span><span class=\"h5p-icon-question\"><\/span><\/span>').appendTo(i);(0,y.addClickAndKeyboardListeners)(t,function(){return n.showPopup(e.solution,t)})}},void 0!==e.alwaysDisplayComments&&e.alwaysDisplayComments&&t.showCPComments()},g.prototype.showPopup=function(e,t,i){var n,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"h5p-popup-comment-field\",s=this,o=function(e){if(n)return void(n=!1);void 0!==i&&setTimeout(function(){i(),s.restoreTabIndexes()},100),e.preventDefault(),a.addClass(\"h5p-animate\"),a.find(\".h5p-popup-container\").addClass(\"h5p-animate\"),setTimeout(function(){a.remove()},100),t.focus()},a=(0,m.jQuery)('<div class=\"h5p-popup-overlay h5p-animate '+r+'\"><div class=\"h5p-popup-container h5p-animate\" role=\"dialog\"><div class=\"h5p-cp-dialog-titlebar\"><div class=\"h5p-dialog-title\"><\/div><div role=\"button\" tabindex=\"0\" class=\"h5p-close-popup\" title=\"'+this.l10n.close+'\"><\/div><\/div><div class=\"h5p-popup-wrapper\" role=\"document\">'+e+\"<\/div><\/div><\/div>\").prependTo(this.$wrapper).focus().removeClass(\"h5p-animate\").click(o).find(\".h5p-popup-container\").removeClass(\"h5p-animate\").click(function(){n=!0}).keydown(function(e){e.which===y.keyCode.ESC&&o(e)}).end();return(0,y.addClickAndKeyboardListeners)(a.find(\".h5p-close-popup\"),function(e){return o(e)}),a},g.prototype.checkForSolutions=function(e){return void 0!==e.showSolutions||void 0!==e.showCPComments},g.prototype.initKeyEvents=function(){if(void 0===this.keydown&&!this.activeSurface){var e=this,t=!1;this.keydown=function(i){t||(37===i.keyCode&&e.previousSlide()?t=!0:39===i.keyCode&&e.nextSlide()&&(t=!0),t&&setTimeout(function(){t=!1},300))},H5P.jQuery(\"body\").keydown(this.keydown)}},g.prototype.initTouchEvents=function(){var e,t,i,n,r,s,o=this,a=!1,l=function(e){return{\"-webkit-transform\":e,\"-moz-transform\":e,\"-ms-transform\":e,transform:e}},d=l(\"\"),c=function(e){for(var t=[\"\",\"-webkit-\",\"-moz-\",\"-ms-\"],i=0;i<t.length;i++){var n=e.css(t[i]+\"transform\");if(void 0!==n)return parseInt(n.match(\/\\d+\/g)[4])}};this.$slidesWrapper.bind(\"touchstart\",function(l){a=!1,i=e=l.originalEvent.touches[0].pageX,t=l.originalEvent.touches[0].pageY,n=-c(o.$current.prev().addClass(\"h5p-touch-move\")),r=c(o.$current.next().addClass(\"h5p-touch-move\")),s=null}).bind(\"touchmove\",function(c){var u=c.originalEvent.touches;i=u[0].pageX;var h=e-i;null===s&&(s=Math.abs(t-c.originalEvent.touches[0].pageY)>Math.abs(h)),1!==u.length||s||(c.preventDefault(),a||(h<0?(o.$current.next().css(d),o.$current.prev().css(l(\"translateX(\"+(n-h)+\"px\"))):(o.$current.prev().css(d),o.$current.next().css(l(\"translateX(\"+(r-h)+\"px)\"))),o.$current.css(l(\"translateX(\"+-h+\"px)\"))))}).bind(\"touchend\",function(){if(!s){var t=e-i;if(t>o.swipeThreshold&&o.nextSlide()||t<-o.swipeThreshold&&o.previousSlide())return}o.$slidesWrapper.children().css(d).removeClass(\"h5p-touch-move\")})},g.prototype.updateTouchPopup=function(e,t,i,n){if(arguments.length<=0)return void(void 0!==this.touchPopup&&this.touchPopup.remove());var r=\"\";if(void 0!==this.$keywords&&void 0!==this.$keywords.children(\":eq(\"+t+\")\").find(\"span\").html())r+=this.$keywords.children(\":eq(\"+t+\")\").find(\"span\").html();else{var s=t+1;r+=this.l10n.slide+\" \"+s}void 0===this.editor&&t>=this.slides.length-1&&(r=this.l10n.showSolutions),void 0===this.touchPopup?this.touchPopup=H5P.jQuery(\"<div\/>\",{class:\"h5p-touch-popup\"}).insertAfter(e):this.touchPopup.insertAfter(e),n-.15*e.parent().height()<0?n=0:n-=.15*e.parent().height(),this.touchPopup.css({\"max-width\":e.width()-i,left:i,top:n}),this.touchPopup.html(r)},g.prototype.previousSlide=function(e){var t=this.$current.prev();return!!t.length&&this.jumpToSlide(t.index(),e,!1)},g.prototype.nextSlide=function(e){var t=this.$current.next();return!!t.length&&this.jumpToSlide(t.index(),e,!1)},g.prototype.isCurrentSlide=function(e){return this.currentSlideIndex===e},g.prototype.getCurrentSlideIndex=function(){return this.currentSlideIndex},g.prototype.attachAllElements=function(){for(var e=this.$slidesWrapper.children(),t=0;t<this.slides.length;t++)this.attachElements(e.eq(t),t);void 0!==this.summarySlideObject&&this.summarySlideObject.updateSummarySlide(this.slides.length-1,!0)},g.prototype.jumpToSlide=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=this;if(void 0===this.editor){var r=this.createXAPIEventTemplate(\"progressed\");r.data.statement.object.definition.extensions[\"http:\/\/id.tincanapi.com\/extension\/ending-point\"]=e+1,this.trigger(r)}if(!this.$current.hasClass(\"h5p-animate\")){var s=this.$current.addClass(\"h5p-animate\"),o=n.$slidesWrapper.children(),a=o.filter(\":lt(\"+e+\")\");this.$current=o.eq(e).addClass(\"h5p-animate\");var l=this.currentSlideIndex;this.currentSlideIndex=e,this.attachElements(this.$current,e);var d=this.$current.next();d.length&&this.attachElements(d,e+1);var c=this.elementInstances[l];if(void 0!==c)for(var u=0;u<c.length;u++)this.slides[l].elements[u].displayAsButton||n.pauseMedia(c[u]);return setTimeout(function(){s.removeClass(\"h5p-current\"),o.css({\"-webkit-transform\":\"\",\"-moz-transform\":\"\",\"-ms-transform\":\"\",transform:\"\"}).removeClass(\"h5p-touch-move\").removeClass(\"h5p-previous\"),a.addClass(\"h5p-previous\"),n.$current.addClass(\"h5p-current\"),n.trigger(\"changedSlide\",n.$current.index())},1),setTimeout(function(){if(n.$slidesWrapper.children().removeClass(\"h5p-animate\"),void 0===n.editor){var e=n.elementInstances[n.currentSlideIndex],t=n.slides[n.currentSlideIndex].elements;if(void 0!==e)for(var i=0;i<e.length;i++)t[i]&&t[i].action&&t[i].action.params&&t[i].action.params.cpAutoplay&&!t[i].displayAsButton&&\"function\"==typeof e[i].play&&e[i].play(),t[i].displayAsButton||\"function\"!=typeof e[i].setActivityStarted||\"function\"!=typeof e[i].getScore||e[i].setActivityStarted()}},250),void 0!==this.$keywords&&(this.keywordMenu.setCurrentSlideIndex(e),this.$currentKeyword=this.$keywords.find(\".h5p-current\"),t||this.keywordMenu.scrollToKeywords(e)),n.presentation.keywordListEnabled&&n.presentation.keywordListAlwaysShow&&n.showKeywords(),n.navigationLine&&(n.navigationLine.updateProgressBar(e,l,this.isSolutionMode),n.navigationLine.updateFooter(e),this.setSlideNumberAnnouncer(e,i)),n.summarySlideObject&&n.summarySlideObject.updateSummarySlide(e,!0),void 0!==this.editor&&void 0!==this.editor.dnb&&(this.editor.dnb.setContainer(this.$current),this.editor.dnb.blurAll()),this.trigger(\"resize\"),this.fitCT(),!0}},g.prototype.setSlideNumberAnnouncer=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=\"\";if(!this.navigationLine)return i;var n=this.slides[e];n.keywords&&n.keywords.length>0&&!this.navigationLine.isSummarySlide(e)&&(i+=this.l10n.slide+\" \"+(e+1)+\": \"),i+=this.navigationLine.createSlideTitle(e),this.$slideAnnouncer.html(i),t&&this.$slideTop.focus()},g.createSlide=function(e){return'<div role=\"document\" class=\"h5p-slide\"'+(void 0!==e.background?' style=\"background:'+e.background+'\"':\"\")+\"><\/div>\"},g.prototype.resetTask=function(){this.summarySlideObject.toggleSolutionMode(!1);for(var e=0;e<this.slidesWithSolutions.length;e++)if(void 0!==this.slidesWithSolutions[e])for(var t=0;t<this.slidesWithSolutions[e].length;t++){var i=this.slidesWithSolutions[e][t];i.resetTask&&i.resetTask()}this.navigationLine.updateProgressBar(0),this.jumpToSlide(0,!1),this.$container.find(\".h5p-popup-overlay\").remove()},g.prototype.showSolutions=function(){for(var e=!1,t=[],i=!1,n=0;n<this.slidesWithSolutions.length;n++)if(void 0!==this.slidesWithSolutions[n]){this.elementsAttached[n]||this.attachElements(this.$slidesWrapper.children(\":eq(\"+n+\")\"),n),e||(this.jumpToSlide(n,!1),e=!0);for(var r=0,s=0,o=[],a=0;a<this.slidesWithSolutions[n].length;a++){var l=this.slidesWithSolutions[n][a];void 0!==l.addSolutionButton&&l.addSolutionButton(),l.showSolutions&&l.showSolutions(),l.showCPComments&&l.showCPComments(),void 0!==l.getMaxScore&&(s+=l.getMaxScore(),r+=l.getScore(),i=!0,o.push(l.coursePresentationIndexOnSlide))}t.push({indexes:o,slide:n+1,score:r,maxScore:s})}if(i)return t},g.prototype.getSlideScores=function(e){for(var t=!0===e,i=[],n=!1,r=0;r<this.slidesWithSolutions.length;r++)if(void 0!==this.slidesWithSolutions[r]){this.elementsAttached[r]||this.attachElements(this.$slidesWrapper.children(\":eq(\"+r+\")\"),r),t||(this.jumpToSlide(r,!1),t=!0);for(var s=0,o=0,a=[],l=0;l<this.slidesWithSolutions[r].length;l++){var d=this.slidesWithSolutions[r][l];void 0!==d.getMaxScore&&(o+=d.getMaxScore(),s+=d.getScore(),n=!0,a.push(d.coursePresentationIndexOnSlide))}i.push({indexes:a,slide:r+1,score:s,maxScore:o})}if(n)return i},g.prototype.getCopyrights=function(){var e,t=new H5P.ContentCopyrights;if(this.presentation&&this.presentation.globalBackgroundSelector&&this.presentation.globalBackgroundSelector.imageGlobalBackground){var i=this.presentation.globalBackgroundSelector.imageGlobalBackground,n=new H5P.MediaCopyright(i.copyright);n.setThumbnail(new H5P.Thumbnail(H5P.getPath(i.path,this.contentId),i.width,i.height)),t.addMedia(n)}for(var r=0;r<this.slides.length;r++){var s=new H5P.ContentCopyrights;if(s.setLabel(this.l10n.slide+\" \"+(r+1)),this.slides[r]&&this.slides[r].slideBackgroundSelector&&this.slides[r].slideBackgroundSelector.imageSlideBackground){var o=this.slides[r].slideBackgroundSelector.imageSlideBackground,a=new H5P.MediaCopyright(o.copyright);a.setThumbnail(new H5P.Thumbnail(H5P.getPath(o.path,this.contentId),o.width,o.height)),s.addMedia(a)}if(void 0!==this.elementInstances[r])for(var l=0;l<this.elementInstances[r].length;l++){var d=this.elementInstances[r][l];if(this.slides[r].elements[l].action){var c=this.slides[r].elements[l].action.params;e=void 0,void 0!==d.getCopyrights&&(e=d.getCopyrights()),void 0===e&&(e=new H5P.ContentCopyrights,H5P.findCopyrights(e,c,this.contentId));var u=l+1;void 0!==c.contentName?u+=\": \"+c.contentName:void 0!==d.getTitle?u+=\": \"+d.getTitle():c.l10n&&c.l10n.name&&(u+=\": \"+c.l10n.name),e.setLabel(u),s.addContent(e)}}t.addContent(s)}return t},g.prototype.pauseMedia=function(e){try{void 0!==e.pause&&(e.pause instanceof Function||\"function\"==typeof e.pause)?e.pause():void 0!==e.video&&void 0!==e.video.pause&&(e.video.pause instanceof Function||\"function\"==typeof e.video.pause)?e.video.pause():void 0!==e.stop&&(e.stop instanceof Function||\"function\"==typeof e.stop)&&e.stop()}catch(e){H5P.error(e)}},g.prototype.getXAPIData=function(){var e=this.createXAPIEventTemplate(\"answered\"),t=e.getVerifiedStatementValue([\"object\",\"definition\"]);H5P.jQuery.extend(t,{interactionType:\"compound\",type:\"http:\/\/adlnet.gov\/expapi\/activities\/cmi.interaction\"});var i=this.getScore(),n=this.getMaxScore();e.setScoredResult(i,n,this,!0,i===n);var r=(0,y.flattenArray)(this.slidesWithSolutions).map(function(e){if(e&&e.getXAPIData)return e.getXAPIData()}).filter(function(e){return!!e});return{statement:e.data.statement,children:r}},t.default=g},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),s=i(0),o=i(1),a={SPECIFIED:\"specified\",NEXT:\"next\",PREVIOUS:\"previous\"},l=function(){function e(t,i){var r=this,l=t.title,d=t.goToSlide,c=void 0===d?1:d,u=t.invisible,h=t.goToSlideType,p=void 0===h?a.SPECIFIED:h,f=i.l10n,v=i.currentIndex;n(this,e),this.eventDispatcher=new o.EventDispatcher;var m=\"h5p-press-to-go\",y=0;if(u)l=void 0,y=-1;else{if(!l)switch(p){case a.SPECIFIED:l=f.goToSlide.replace(\":num\",c.toString());break;case a.NEXT:l=f.goToSlide.replace(\":num\",f.nextSlide);break;case a.PREVIOUS:l=f.goToSlide.replace(\":num\",f.prevSlide)}m+=\" h5p-visible\"}var g=c-1;p===a.NEXT?g=v+1:p===a.PREVIOUS&&(g=v-1),this.$element=(0,o.jQuery)(\"<a\/>\",{href:\"#\",class:m,tabindex:y,title:l}),(0,s.addClickAndKeyboardListeners)(this.$element,function(e){r.eventDispatcher.trigger(\"navigate\",g),e.preventDefault()})}return r(e,[{key:\"attach\",value:function(e){e.html(\"\").addClass(\"h5p-go-to-slide\").append(this.$element)}},{key:\"on\",value:function(e,t){this.eventDispatcher.on(e,t)}}]),e}();t.default=l},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(1),r=i(0),s=function(){function e(e,t){this.$summarySlide=t,this.cp=e}return e.prototype.updateSummarySlide=function(e,t){var i=this,r=void 0===this.cp.editor&&void 0!==this.$summarySlide&&e>=this.cp.slides.length-1,s=!this.cp.showSummarySlide&&this.cp.hasAnswerElements;if(r){i.cp.presentation.keywordListEnabled&&i.cp.presentation.keywordListAlwaysShow&&i.cp.hideKeywords(),this.$summarySlide.children().remove();var o=i.cp.getSlideScores(t),a=i.outputScoreStats(o);if((0,n.jQuery)(a).appendTo(i.$summarySlide),!s){var l=i.totalScores(o);if(isNaN(l.totalPercentage)?n.JoubelUI.createProgressCircle(0).appendTo((0,n.jQuery)(\".h5p-score-message-percentage\",i.$summarySlide)):n.JoubelUI.createProgressCircle(l.totalPercentage).appendTo((0,n.jQuery)(\".h5p-score-message-percentage\",i.$summarySlide)),1==i.cp.enableTwitterShare){var d=(0,n.jQuery)(\".h5p-summary-twitter-message\",i.$summarySlide);this.addTwitterScoreLinkTo(d,l)}if(1==i.cp.enableFacebookShare){var c=(0,n.jQuery)(\".h5p-summary-facebook-message\",i.$summarySlide);this.addFacebookScoreLinkTo(c,l)}if(1==i.cp.enableGoogleShare){var u=(0,n.jQuery)(\".h5p-summary-google-message\",i.$summarySlide);this.addGoogleScoreLinkTo(u)}i.$summarySlide.find(\".h5p-td > .h5p-slide-link\").each(function(){var e=(0,n.jQuery)(this);e.click(function(t){i.cp.jumpToSlide(parseInt(e.data(\"slide\"),10)-1),t.preventDefault()})})}var h=(0,n.jQuery)(\".h5p-summary-footer\",i.$summarySlide);n.JoubelUI.createButton({class:\"h5p-show-solutions\",html:i.cp.l10n.showSolutions,on:{click:function(){i.toggleSolutionMode(!0)}},appendTo:h}),n.JoubelUI.createButton({class:\"h5p-cp-retry-button\",html:i.cp.l10n.retry,on:{click:function(){i.cp.resetTask()}},appendTo:h}),i.cp.hasAnswerElements&&n.JoubelUI.createButton({class:\"h5p-eta-export\",html:i.cp.l10n.exportAnswers,on:{click:function(){H5P.ExportableTextArea.Exporter.run(i.cp.slides,i.cp.elementInstances)}},appendTo:h})}},e.prototype.outputScoreStats=function(e){var t=this;if(void 0===e)return this.$summarySlide.addClass(\"h5p-summary-only-export\"),'<div class=\"h5p-summary-footer\"><\/div>';var i,n=this,r=0,s=0,o=\"\",a=0,l=\"\";for(i=0;i<e.length;i+=1)l=t.getSlideDescription(e[i]),a=Math.round(e[i].score\/e[i].maxScore*100),isNaN(a)&&(a=0),o+='<tr><td class=\"h5p-td h5p-summary-task-title\"><a href=\"#\" class=\"h5p-slide-link\"  aria-label=\" '+n.cp.l10n.slide+\" \"+e[i].slide+\": \"+l.replace(\/(<([^>]+)>)\/gi,\"\")+\" \"+a+'%\" data-slide=\"'+e[i].slide+'\">'+n.cp.l10n.slide+\" \"+e[i].slide+\": \"+l.replace(\/(<([^>]+)>)\/gi,\"\")+'<\/a><\/td><td class=\"h5p-td h5p-summary-score-bar\"><div class=\"h5p-summary-score-meter\"><span style=\"width: '+a+\"%; opacity: \"+a\/100+'\"><\/span><\/div><\/td><\/tr>',r+=e[i].score,s+=e[i].maxScore;n.cp.triggerXAPICompleted(r,s);var d=Math.round(r\/s*100),c=1==n.cp.enableTwitterShare?'<div class=\"h5p-summary-twitter-message\" aria-label=\"Share on Twitter\"><\/div>':\"\",u=1==n.cp.enableFacebookShare?'<div class=\"h5p-summary-facebook-message\" aria-label=\"Share on Facebook\"><\/div>':\"\",h=1==n.cp.enableGoogleShare?'<div class=\"h5p-summary-google-message\" aria-label=\"Share on Google Plus\"><\/div>':\"\";return'<div class=\"h5p-score-message\"><div class=\"h5p-score-message-percentage\">'+n.cp.l10n.scoreMessage+\"<\/div>\"+u+c+h+'<\/div><div class=\"h5p-summary-table-holder\"> <div class=\"h5p-summary-table-pages\">   <table class=\"h5p-score-table\">     <tbody>'+o+'<\/tbody>   <\/table> <\/div> <table class=\"h5p-summary-total-table\" style=\"width: 100%\">    <tr>     <td class=\"h5p-td h5p-summary-task-title\">'+n.cp.l10n.total+'<\/td>     <td class=\"h5p-td h5p-summary-score-bar\">       <p class=\"hidden-but-read\">'+d+'%<\/p>       <div title=\"'+d+'%\" class=\"h5p-summary-score-meter\">         <span style=\"width: '+d+\"%; opacity: \"+d\/100+'\"><\/span>       <\/div>     <\/td>   <\/tr> <\/table><\/div><div class=\"h5p-summary-footer\"><\/div>'},e.prototype.getSlideDescription=function(e){var t,i,n=this,r=n.cp.slides[e.slide-1].elements;if(e.indexes.length>1)t=n.cp.l10n.summaryMultipleTaskText;else if(void 0!==r[e.indexes[0]]&&r[0])if(i=r[e.indexes[0]].action,\"function\"==typeof n.cp.elementInstances[e.slide-1][e.indexes[0]].getTitle)t=n.cp.elementInstances[e.slide-1][e.indexes[0]].getTitle();else if(void 0!==i.library&&i.library){var s=i.library.split(\" \")[0].split(\".\")[1].split(\/(?=[A-Z])\/),o=\"\";s.forEach(function(e,t){0!==t&&(e=e.toLowerCase()),o+=e,t<=s.length-1&&(o+=\" \")}),t=o}return t},e.prototype.addTwitterScoreLinkTo=function(e,t){var i=this,n=i.cp.twitterShareStatement||\"\",s=i.cp.twitterShareHashtags||\"\",o=i.cp.twitterShareUrl||\"\";o=o.replace(\"@currentpageurl\",window.location.href),n=n.replace(\"@percentage\",t.totalPercentage+\"%\").replace(\"@currentpageurl\",window.location.href),s=s.trim().replace(\" \",\"\"),n=encodeURIComponent(n),s=encodeURIComponent(s),o=encodeURIComponent(o);var a=\"http:\/\/twitter.com\/intent\/tweet?\";a+=n.length>0?\"text=\"+n+\"&\":\"\",a+=o.length>0?\"url=\"+o+\"&\":\"\",a+=s.length>0?\"hashtags=\"+s:\"\";var l=window.innerWidth\/2,d=window.innerHeight\/2;e.attr(\"tabindex\",\"0\").attr(\"role\",\"button\"),(0,r.addClickAndKeyboardListeners)(e,function(){return window.open(a,i.cp.l10n.shareTwitter,\"width=800,height=300,left=\"+l+\",top=\"+d),!1})},e.prototype.addFacebookScoreLinkTo=function(e,t){var i=this,n=i.cp.facebookShareUrl||\"\",s=i.cp.facebookShareQuote||\"\";n=n.replace(\"@currentpageurl\",window.location.href).replace(\"@percentage\",t.totalPercentage+\"%\"),s=s.replace(\"@currentpageurl\",window.location.href).replace(\"@percentage\",t.totalPercentage+\"%\"),n=encodeURIComponent(n),s=encodeURIComponent(s);var o=\"https:\/\/www.facebook.com\/sharer\/sharer.php?\";o+=n.length>0?\"u=\"+n+\"&\":\"\",o+=s.length>0?\"quote=\"+s:\"\";var a=window.innerWidth\/2,l=window.innerHeight\/2;e.attr(\"tabindex\",\"0\").attr(\"role\",\"button\"),(0,r.addClickAndKeyboardListeners)(e,function(){return window.open(o,i.cp.l10n.shareFacebook,\"width=800,height=300,left=\"+a+\",top=\"+l),!1})},e.prototype.addGoogleScoreLinkTo=function(e){var t=this,i=t.cp.googleShareUrl||\"\";i=i.replace(\"@currentpageurl\",window.location.href),i=encodeURIComponent(i);var n=\"https:\/\/plus.google.com\/share?\";n+=i.length>0?\"url=\"+i:\"\";var s=window.innerWidth\/2,o=window.innerHeight\/2;e.attr(\"tabindex\",\"0\").attr(\"role\",\"button\"),(0,r.addClickAndKeyboardListeners)(e,function(){return window.open(n,t.cp.l10n.shareGoogle,\"width=401,height=437,left=\"+s+\",top=\"+o),!1})},e.prototype.totalScores=function(e){if(void 0===e)return{totalScore:0,totalMaxScore:0,totalPercentage:0};var t,i=0,n=0;for(t=0;t<e.length;t+=1)i+=e[t].score,n+=e[t].maxScore;var r=Math.round(i\/n*100);return isNaN(r)&&(r=0),{totalScore:i,totalMaxScore:n,totalPercentage:r}},e.prototype.toggleSolutionMode=function(e){var t=this;if(this.cp.isSolutionMode=e,e){var i=t.cp.showSolutions();this.cp.setProgressBarFeedback(i),this.cp.$footer.addClass(\"h5p-footer-solution-mode\"),this.setFooterSolutionModeText(this.cp.l10n.solutionModeText)}else this.cp.$footer.removeClass(\"h5p-footer-solution-mode\"),this.setFooterSolutionModeText(),this.cp.setProgressBarFeedback()},e.prototype.setFooterSolutionModeText=function(e){void 0!==e&&e?this.cp.$exitSolutionModeText.html(e):this.cp.$exitSolutionModeText&&this.cp.$exitSolutionModeText.html(\"\")},e}();t.default=s},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}Object.defineProperty(t,\"__esModule\",{value:!0});var s=i(17),o=n(s),a=i(2),l=n(a),d=i(4),c=n(d),u=i(0),h={NO_INTERACTIONS:\"none\",NOT_ANSWERED:\"not-answered\",ANSWERED:\"answered\",CORRECT:\"has-only-correct\",INCORRECT:\"has-incorrect\"},p=function(e){function t(e){var t;this.cp=e,this.answeredLabels=(t={},r(t,h.NOT_ANSWERED,this.cp.l10n.containsNotCompleted),r(t,h.ANSWERED,this.cp.l10n.containsCompleted),r(t,h.CORRECT,this.cp.l10n.containsOnlyCorrect),r(t,h.INCORRECT,this.cp.l10n.containsIncorrectAnswers),r(t,h.NO_INTERACTIONS,\"@slideName\"),t),this.initProgressbar(this.cp.slidesWithSolutions),this.initFooter(),this.initTaskAnsweredListener(),this.toggleNextAndPreviousButtonDisabled(this.cp.getCurrentSlideIndex())}return t.prototype.initTaskAnsweredListener=function(){var e=this;this.cp.elementInstances.forEach(function(t,i){t.filter(function(e){return(0,u.isFunction)(e.on)}).forEach(function(t){t.on(\"xAPI\",function(t){var n=t.getVerb();if((0,u.contains)([\"interacted\",\"answered\",\"attempted\"],n)){var r=e.cp.slideHasAnsweredTask(i);e.setTaskAnswered(i,r)}else\"completed\"===n&&t.setVerb(\"answered\");void 0===t.data.statement.context.extensions&&(t.data.statement.context.extensions={}),t.data.statement.context.extensions[\"http:\/\/id.tincanapi.com\/extension\/ending-point\"]=i+1})})})},t.prototype.initProgressbar=function(t){var i=this,n=this,r=n.cp.previousState&&n.cp.previousState.progress||0;this.progresbarKeyboardControls=new l.default([new c.default]),this.progresbarKeyboardControls.negativeTabIndexAllowed=!0,this.progresbarKeyboardControls.on(\"select\",function(t){n.displaySlide(e(t.element).data(\"slideNumber\"))}),this.progresbarKeyboardControls.on(\"beforeNextElement\",function(e){return e.index!==e.elements.length-1}),this.progresbarKeyboardControls.on(\"beforePreviousElement\",function(e){return 0!==e.index}),void 0!==this.cp.progressbarParts&&this.cp.progressbarParts&&this.cp.progressbarParts.forEach(function(e){n.progresbarKeyboardControls.removeElement(e.children(\"a\").get(0)),e.remove()}),n.cp.progressbarParts=[];for(var s=function(t){t.preventDefault();var i=e(this).data(\"slideNumber\");n.progresbarKeyboardControls.setTabbableByIndex(i),n.displaySlide(i)},o=0;o<this.cp.slides.length;o+=1){var a=this.cp.slides[o],d=this.createSlideTitle(o),h=e(\"<li>\",{class:\"h5p-progressbar-part\"}).appendTo(n.cp.$progressbar),p=e(\"<a>\",{href:\"#\",html:'<span class=\"h5p-progressbar-part-title hidden-but-read\">'+d+\"<\/span>\",tabindex:\"-1\"}).data(\"slideNumber\",o).click(s).appendTo(h);if(this.progresbarKeyboardControls.addElement(p.get(0)),u.isIOS||function(){var t=e(\"<div\/>\",{class:\"h5p-progressbar-popup\",html:d,\"aria-hidden\":\"true\"}).appendTo(h);h.mouseenter(function(){return i.ensurePopupVisible(t)})}(),this.isSummarySlide(o)&&h.addClass(\"progressbar-part-summary-slide\"),0===o&&h.addClass(\"h5p-progressbar-part-show\"),o===r&&h.addClass(\"h5p-progressbar-part-selected\"),n.cp.progressbarParts.push(h),this.updateSlideTitle(o),this.cp.slides.length<=60&&a.elements&&a.elements.length>0){var f=t[o]&&t[o].length>0,v=!!(n.cp.previousState&&n.cp.previousState.answered&&n.cp.previousState.answered[o]);f&&(e(\"<div>\",{class:\"h5p-progressbar-part-has-task\"}).appendTo(p),this.setTaskAnswered(o,v))}}},t.prototype.ensurePopupVisible=function(e){var t=this.cp.$container.width(),i=e.outerWidth(),n=e.offset().left;n<0?(e.css(\"left\",0),e.css(\"transform\",\"translateX(0)\")):n+i>t&&(e.css(\"left\",\"auto\"),e.css(\"right\",0),e.css(\"transform\",\"translateX(0)\"))},t.prototype.displaySlide=function(e){var t=this.cp.getCurrentSlideIndex();this.updateSlideTitle(e,{isCurrent:!0}),this.updateSlideTitle(t,{isCurrent:!1}),this.cp.jumpToSlide(e),this.toggleNextAndPreviousButtonDisabled(e)},t.prototype.createSlideTitle=function(e){var t=this.cp.slides[e];return t.keywords&&t.keywords.length>0?t.keywords[0].main:this.isSummarySlide(e)?this.cp.l10n.summary:this.cp.l10n.slide+\" \"+(e+1)},t.prototype.isSummarySlide=function(e){return!(void 0!==this.cp.editor||e!==this.cp.slides.length-1||!this.cp.showSummarySlide)},t.prototype.initFooter=function(){var t=this,i=this,n=this.cp.$footer,r=e(\"<div\/>\",{class:\"h5p-footer-left-adjusted\"}).appendTo(n),s=e(\"<div\/>\",{class:\"h5p-footer-center-adjusted\"}).appendTo(n),a=e(\"<div\/>\",{role:\"toolbar\",class:\"h5p-footer-right-adjusted\"}).appendTo(n);this.cp.$keywordsButton=e(\"<div\/>\",{class:\"h5p-footer-button h5p-footer-toggle-keywords\",\"aria-expanded\":\"false\",\"aria-label\":this.cp.l10n.showKeywords,title:this.cp.l10n.showKeywords,role:\"button\",tabindex:\"0\",html:'<span class=\"h5p-icon-menu\"><\/span><span class=\"current-slide-title\"><\/span>'}).appendTo(r),(0,u.addClickAndKeyboardListeners)(this.cp.$keywordsButton,function(e){i.cp.presentation.keywordListAlwaysShow||(i.cp.toggleKeywords(),e.stopPropagation())}),!this.cp.presentation.keywordListAlwaysShow&&this.cp.initKeywords||this.cp.$keywordsButton.hide(),this.cp.presentation.keywordListEnabled||this.cp.$keywordsWrapper.add(this.$keywordsButton).hide(),this.updateFooterKeyword(0),this.cp.$prevSlideButton=e(\"<div\/>\",{class:\"h5p-footer-button h5p-footer-previous-slide\",title:this.cp.l10n.prevSlide,role:\"button\",tabindex:\"-1\",\"aria-disabled\":\"true\"}).appendTo(s),(0,u.addClickAndKeyboardListeners)(this.cp.$prevSlideButton,function(){return t.cp.previousSlide()});var l=e(\"<div\/>\",{class:\"h5p-footer-slide-count\"}).appendTo(s);this.cp.$footerCurrentSlide=e(\"<div\/>\",{html:\"1\",class:\"h5p-footer-slide-count-current\",title:this.cp.l10n.currentSlide,\"aria-hidden\":\"true\"}).appendTo(l),this.cp.$footerCounter=e(\"<div\/>\",{class:\"hidden-but-read\",html:this.cp.l10n.slideCount.replace(\"@index\",\"1\").replace(\"@total\",this.cp.slides.length.toString())}).appendTo(s),e(\"<div\/>\",{html:\"\/\",class:\"h5p-footer-slide-count-delimiter\",\"aria-hidden\":\"true\"}).appendTo(l),this.cp.$footerMaxSlide=e(\"<div\/>\",{html:this.cp.slides.length,class:\"h5p-footer-slide-count-max\",title:this.cp.l10n.lastSlide,\"aria-hidden\":\"true\"}).appendTo(l),this.cp.$nextSlideButton=e(\"<div\/>\",{class:\"h5p-footer-button h5p-footer-next-slide\",title:this.cp.l10n.nextSlide,role:\"button\",tabindex:\"0\"}).appendTo(s),(0,u.addClickAndKeyboardListeners)(this.cp.$nextSlideButton,function(){return t.cp.nextSlide()}),void 0===this.cp.editor&&(this.cp.$exitSolutionModeButton=e(\"<div\/>\",{role:\"button\",class:\"h5p-footer-exit-solution-mode\",title:this.cp.l10n.solutionModeTitle,tabindex:\"0\"}).appendTo(a),(0,u.addClickAndKeyboardListeners)(this.cp.$exitSolutionModeButton,function(){return i.cp.jumpToSlide(i.cp.slides.length-1)}),this.cp.enablePrintButton&&o.default.supported()&&(this.cp.$printButton=e(\"<div\/>\",{class:\"h5p-footer-button h5p-footer-print\",title:this.cp.l10n.printTitle,role:\"button\",tabindex:\"0\"}).appendTo(a),(0,u.addClickAndKeyboardListeners)(this.cp.$printButton,function(){return i.openPrintDialog()})),H5P.fullscreenSupported&&(this.cp.$fullScreenButton=e(\"<div\/>\",{class:\"h5p-footer-button h5p-footer-toggle-full-screen\",title:this.cp.l10n.fullscreen,role:\"button\",tabindex:\"0\"}),(0,u.addClickAndKeyboardListeners)(this.cp.$fullScreenButton,function(){return i.cp.toggleFullScreen()}),this.cp.$fullScreenButton.appendTo(a))),this.cp.$exitSolutionModeText=e(\"<div\/>\",{html:\"\",class:\"h5p-footer-exit-solution-mode-text\"}).appendTo(this.cp.$exitSolutionModeButton)},t.prototype.openPrintDialog=function(){var t=this,i=e(\".h5p-wrapper\");o.default.showDialog(this.cp.l10n,i,function(e){o.default.print(t.cp,i,e)}).children('[role=\"dialog\"]').focus()},t.prototype.updateProgressBar=function(e,t,i){var n,r=this;for(n=0;n<r.cp.progressbarParts.length;n+=1)e+1>n?r.cp.progressbarParts[n].addClass(\"h5p-progressbar-part-show\"):r.cp.progressbarParts[n].removeClass(\"h5p-progressbar-part-show\");if(r.progresbarKeyboardControls.setTabbableByIndex(e),r.cp.progressbarParts[e].addClass(\"h5p-progressbar-part-selected\").siblings().removeClass(\"h5p-progressbar-part-selected\"),void 0===t)return void r.cp.progressbarParts.forEach(function(e,t){r.setTaskAnswered(t,!1)});i||r.cp.editor},t.prototype.setTaskAnswered=function(e,t){this.cp.progressbarParts[e].find(\".h5p-progressbar-part-has-task\").toggleClass(\"h5p-answered\",t),this.updateSlideTitle(e,{state:t?h.ANSWERED:h.NOT_ANSWERED})},t.prototype.updateSlideTitle=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.state,n=t.isCurrent;this.setSlideTitle(e,{state:(0,u.defaultValue)(i,this.getAnsweredState(e)),isCurrent:(0,u.defaultValue)(n,this.cp.isCurrentSlide(e))})},t.prototype.setSlideTitle=function(e,t){var i=t.state,n=void 0===i?h.NO_INTERACTIONS:i,r=t.isCurrent,s=void 0!==r&&r,o=this.cp.slides.length,a=this.cp.progressbarParts[e],l=a.find(\".h5p-progressbar-part-title\"),d=this.cp.l10n.slideCount.replace(\"@index\",e+1).replace(\"@total\",o),c=this.answeredLabels[n].replace(\"@slideName\",this.createSlideTitle(e)),u=s?this.cp.l10n.currentSlide:\"\";l.html(d+\": \"+c+\". \"+u)},t.prototype.getAnsweredState=function(e){var t=this.cp.progressbarParts[e],i=this.slideHasInteraction(e),n=this.cp.slideHasAnsweredTask(e);return i?t.find(\".h5p-is-correct\").length>0?h.CORRECT:t.find(\".h5p-is-wrong\").length>0?h.INCORRECT:n?h.ANSWERED:h.NOT_ANSWERED:h.NO_INTERACTIONS},t.prototype.slideHasInteraction=function(e){return this.cp.progressbarParts[e].find(\".h5p-progressbar-part-has-task\").length>0},t.prototype.updateFooter=function(e){this.cp.$footerCurrentSlide.html(e+1),this.cp.$footerMaxSlide.html(this.cp.slides.length),this.cp.$footerCounter.html(this.cp.l10n.slideCount.replace(\"@index\",(e+1).toString()).replace(\"@total\",this.cp.slides.length.toString())),this.cp.isSolutionMode&&e===this.cp.slides.length-1?this.cp.$footer.addClass(\"summary-slide\"):this.cp.$footer.removeClass(\"summary-slide\"),this.toggleNextAndPreviousButtonDisabled(e),this.updateFooterKeyword(e)},t.prototype.toggleNextAndPreviousButtonDisabled=function(e){var t=this.cp.slides.length-1;this.cp.$prevSlideButton.attr(\"aria-disabled\",(0===e).toString()),this.cp.$nextSlideButton.attr(\"aria-disabled\",(e===t).toString()),this.cp.$prevSlideButton.attr(\"tabindex\",0===e?\"-1\":\"0\"),this.cp.$nextSlideButton.attr(\"tabindex\",e===t?\"-1\":\"0\")},t.prototype.updateFooterKeyword=function(e){var t=this.cp.slides[e],i=\"\";t&&t.keywords&&t.keywords[0]&&(i=t.keywords[0].main),!this.cp.isEditor()&&this.cp.showSummarySlide&&e>=this.cp.slides.length-1&&(i=this.cp.l10n.summary),this.cp.$keywordsButton.children(\".current-slide-title\").html((0,u.defaultValue)(i,\"\"))},t}(H5P.jQuery);t.default=p},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(0),r=function(e){function t(){}var i=0;return t.supported=function(){return\"function\"==typeof window.print},t.print=function(t,i,n){t.trigger(\"printing\",{finished:!1,allSlides:n});var r=e(\".h5p-slide.h5p-current\"),s=r.height(),o=r.width(),a=o\/670,l=e(\".h5p-slide\");l.css({height:s\/a+\"px\",width:\"670px\",fontSize:Math.floor(100\/a)+\"%\"});var d=i.height();i.css(\"height\",\"auto\"),l.toggleClass(\"doprint\",!0===n),r.addClass(\"doprint\"),setTimeout(function(){window.print(),l.css({height:\"\",width:\"\",fontSize:\"\"}),i.css(\"height\",d+\"px\"),t.trigger(\"printing\",{finished:!0})},500)},t.showDialog=function(t,r,s){var o=this,a=i++,l=\"h5p-cp-print-dialog-\"+a+\"-title\",d=\"h5p-cp-print-dialog-\"+a+\"-ingress\",c=e('<div class=\"h5p-popup-dialog h5p-print-dialog\">\\n                      <div role=\"dialog\" aria-labelledby=\"'+l+'\" aria-describedby=\"'+d+'\" tabindex=\"-1\" class=\"h5p-inner\">\\n                        <h2 id=\"'+l+'\">'+t.printTitle+'<\/h2>\\n                        <div class=\"h5p-scroll-content\"><\/div>\\n                        <div class=\"h5p-close\" role=\"button\" tabindex=\"0\" title=\"'+H5P.t(\"close\")+'\">\\n                      <\/div>\\n                    <\/div>').insertAfter(r).click(function(){o.close()}).children(\".h5p-inner\").click(function(){return!1}).end();(0,n.addClickAndKeyboardListeners)(c.find(\".h5p-close\"),function(){return o.close()});var u=c.find(\".h5p-scroll-content\");return u.append(e(\"<div>\",{class:\"h5p-cp-print-ingress\",id:d,html:t.printIngress})),H5P.JoubelUI.createButton({html:t.printAllSlides,class:\"h5p-cp-print-all-slides\",click:function(){o.close(),s(!0)}}).appendTo(u),H5P.JoubelUI.createButton({html:t.printCurrentSlide,class:\"h5p-cp-print-current-slide\",click:function(){o.close(),s(!1)}}).appendTo(u),this.open=function(){setTimeout(function(){c.addClass(\"h5p-open\"),H5P.jQuery(o).trigger(\"dialog-opened\",[c])},1)},this.close=function(){c.removeClass(\"h5p-open\"),setTimeout(function(){c.remove()},200)},this.open(),c},t}(H5P.jQuery);t.default=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.createElement=t.toggleClass=t.toggleVisibility=t.show=t.hide=t.removeClass=t.addClass=t.classListContains=t.removeChild=t.querySelectorAll=t.nodeListToArray=t.querySelector=t.appendChild=t.toggleAttribute=t.attributeEquals=t.hasAttribute=t.removeAttribute=t.setAttribute=t.getAttribute=void 0;var n=i(3),r=t.getAttribute=(0,n.curry)(function(e,t){return t.getAttribute(e)}),s=t.setAttribute=(0,n.curry)(function(e,t,i){return i.setAttribute(e,t)}),o=(t.removeAttribute=(0,n.curry)(function(e,t){return t.removeAttribute(e)}),t.hasAttribute=(0,n.curry)(function(e,t){return t.hasAttribute(e)}),t.attributeEquals=(0,n.curry)(function(e,t,i){return i.getAttribute(e)===t}),t.toggleAttribute=(0,n.curry)(function(e,t){var i=r(e,t);s(e,(0,n.inverseBooleanString)(i),t)}),t.appendChild=(0,n.curry)(function(e,t){return e.appendChild(t)}),t.querySelector=(0,n.curry)(function(e,t){return t.querySelector(e)}),t.nodeListToArray=function(e){return Array.prototype.slice.call(e)}),a=(t.querySelectorAll=(0,n.curry)(function(e,t){return o(t.querySelectorAll(e))}),t.removeChild=(0,n.curry)(function(e,t){return e.removeChild(t)}),t.classListContains=(0,n.curry)(function(e,t){return t.classList.contains(e)}),t.addClass=(0,n.curry)(function(e,t){return t.classList.add(e)})),l=t.removeClass=(0,n.curry)(function(e,t){return t.classList.remove(e)}),d=t.hide=a(\"hidden\"),c=t.show=l(\"hidden\");t.toggleVisibility=(0,n.curry)(function(e,t){return(e?c:d)(t)}),t.toggleClass=(0,n.curry)(function(e,t,i){i.classList[t?\"add\":\"remove\"](e)}),t.createElement=function(e){var t=e.tag,i=e.id,n=e.classes,r=e.attributes,s=document.createElement(t);return i&&(s.id=i),n&&n.forEach(function(e){s.classList.add(e)}),r&&Object.keys(r).forEach(function(e){s.setAttribute(e,r[e])}),s}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});t.Eventful=function(){return{listeners:{},on:function(e,t,i){var n={listener:t,scope:i};return this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(n),this},fire:function(e,t){return(this.listeners[e]||[]).every(function(e){return!1!==e.listener.call(e.scope||this,t)})},propagate:function(e,t){var i=this;e.forEach(function(e){return t.on(e,function(t){return i.fire(e,t)})})}}}},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var r=i(1),s=function e(t){n(this,e);var i=t.presentation;i=r.jQuery.extend(!0,{globalBackgroundSelector:{fillGlobalBackground:\"\",imageGlobalBackground:{}},slides:[{slideBackgroundSelector:{fillSlideBackground:\"\",imageSlideBackground:{}}}]},i);var s=function(e,i,n){var r=t.$slidesWrapper.children().filter(\":not(.h5p-summary-slide)\");void 0!==n&&(r=r.eq(n)),e&&\"\"!==e?r.addClass(\"has-background\").css(\"background-image\",\"\").css(\"background-color\",e):i&&i.path&&r.addClass(\"has-background\").css(\"background-color\",\"\").css(\"background-image\",\"url(\"+H5P.getPath(i.path,t.contentId)+\")\")};!function(){var e=i.globalBackgroundSelector;s(e.fillGlobalBackground,e.imageGlobalBackground)}(),function(){i.slides.forEach(function(e,t){var i=e.slideBackgroundSelector;i&&s(i.fillSlideBackground,i.imageSlideBackground,t)})}()};t.default=s},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),o=i(2),a=n(o),l=i(4),d=n(l),c=i(0),u=i(1),h=function(e){return parseInt(e.dataset.index)},p=function(){function e(t){var i=this,n=t.l10n,s=t.currentIndex;r(this,e),this.l10n=n,this.state={currentIndex:(0,c.defaultValue)(s,0)},this.eventDispatcher=new u.EventDispatcher,this.controls=new a.default([new d.default]),this.controls.on(\"select\",function(e){i.onMenuItemSelect(h(e.element))}),this.controls.on(\"close\",function(){return i.eventDispatcher.trigger(\"close\")}),this.menuElement=this.createMenuElement(),this.currentSlideMarkerElement=this.createCurrentSlideMarkerElement()}return s(e,[{key:\"init\",value:function(e){var t=this;return this.menuItemElements=e.map(function(e){return t.createMenuItemElement(e)}),this.menuItemElements.forEach(function(e){return t.menuElement.appendChild(e)}),this.menuItemElements.forEach(function(e){return t.controls.addElement(e)}),this.setCurrentSlideIndex(this.state.currentIndex),this.menuItemElements}},{key:\"on\",value:function(e,t){this.eventDispatcher.on(e,t)}},{key:\"getElement\",value:function(){return this.menuElement}},{key:\"removeAllMenuItemElements\",value:function(){var e=this;this.menuItemElements.forEach(function(t){e.controls.removeElement(t),e.menuElement.removeChild(t)}),this.menuItemElements=[]}},{key:\"createMenuElement\",value:function(){var e=this.menuElement=document.createElement(\"ol\");return e.setAttribute(\"role\",\"menu\"),e.classList.add(\"list-unstyled\"),e}},{key:\"createMenuItemElement\",value:function(e){var t=this,i=document.createElement(\"li\");return i.setAttribute(\"role\",\"menuitem\"),i.addEventListener(\"click\",function(e){t.onMenuItemSelect(h(e.currentTarget))}),this.applyConfigToMenuItemElement(i,e),i}},{key:\"applyConfigToMenuItemElement\",value:function(e,t){e.innerHTML='<div class=\"h5p-keyword-subtitle\">'+t.subtitle+'<\/div><span class=\"h5p-keyword-title\">'+t.title+\"<\/span>\",e.dataset.index=t.index}},{key:\"onMenuItemSelect\",value:function(e){this.state.currentIndex!==e&&(this.setCurrentSlideIndex(e),this.eventDispatcher.trigger(\"select\",{index:e}))}},{key:\"setCurrentSlideIndex\",value:function(e){var t=this.getElementByIndex(this.menuItemElements,e);t&&(this.state.currentIndex=e,this.updateCurrentlySelected(this.menuItemElements,this.state),this.controls.setTabbable(t))}},{key:\"updateCurrentlySelected\",value:function(e,t){var i=this;e.forEach(function(e){var n=t.currentIndex===h(e);e.classList.toggle(\"h5p-current\",n),n&&e.appendChild(i.currentSlideMarkerElement)})}},{key:\"scrollToKeywords\",value:function(e){var t=this.getFirstElementAfter(e);if(t){var i=(0,u.jQuery)(this.menuElement),n=i.scrollTop()+(0,u.jQuery)(t).position().top-8;c.isIPad?i.scrollTop(n):i.stop().animate({scrollTop:n},250)}}},{key:\"getFirstElementAfter\",value:function(e){return this.menuItemElements.filter(function(t){return h(t)>=e})[0]}},{key:\"getElementByIndex\",value:function(e,t){return e.filter(function(e){return h(e)===t})[0]}},{key:\"createCurrentSlideMarkerElement\",value:function(){var e=document.createElement(\"div\");return e.classList.add(\"hidden-but-read\"),e.innerHTML=this.l10n.currentSlide,e}}]),e}();t.default=p}]);","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TwitterUserFeed-1.0\/twitter-user-feed.js?ver=1.0.11":"\nvar H5P = H5P || {};\n\nH5P.TwitterUserFeed = (function ($) {\n\n  \/**\n   * Constructor function.\n   *\/\n  function C(options, id) {\n    H5P.EventDispatcher.call(this);\n\n    \/\/ Extend defaults with provided options\n    this.options = $.extend(true, {}, {\n      userName: 'H5PTechnology',\n      showReplies: false,\n      numTweets: 5\n    }, options);\n    \/\/ Keep provided id.\n    this.id = id;\n  }\n\n  \/\/ Inheritance\n  C.prototype = Object.create(H5P.EventDispatcher.prototype);\n  C.prototype.constructor = C;\n\n  \/**\n   * Attach function called by H5P framework to insert H5P content into\n   * page\n   *\n   * @param {jQuery} $container\n   *\/\n  C.prototype.attach = function ($container) {\n    var self = this;\n    this.setUpTwitter();\n\n    \/\/ notify that twitter feed has been loaded\n    twttr.ready(function (twttr) {\n        twttr.events.bind('loaded', function () { self.trigger('loaded'); });\n      }\n    );\n\n    \/\/ Set class on container to identify twitter user feed\n    $container.addClass(\"h5p-twitter-user-feed\");\n\n    $container.append(\n      '<a class=\"twitter-timeline\" href=\"https:\/\/twitter.com\/twitterapi\"' +\n      'data-widget-id=\"558756407995273216\" data-screen-name=\"' + this.options.userName +\n      '\" data-show-replies=\"' + this.options.showReplies +\n      '\" data-tweet-limit=\"' + this.options.numTweets + '\">Tweets by @' +\n      this.options.userName + '<\/a>');\n\n    if (window.twttr !== undefined && window.twttr.widgets !== undefined) {\n      window.twttr.widgets.load($container.get(0));\n    }\n  };\n\n  C.prototype.setUpTwitter = function() {\n    if (window.twttr) {\n      return; \/\/ Already set up\n    }\n\n    \/\/ Load widgets api if not already done\n    var id = 'twitter-wjs';\n    if (!document.getElementById(id)) {\n      \/\/ Create script tag\n      var js = document.createElement('script');\n      js.id = id;\n      js.src = \"https:\/\/platform.twitter.com\/widgets.js\";\n\n      \/\/ Insert before first head JS\n      var firstJS = document.getElementsByTagName('script')[0];\n      firstJS.parentNode.insertBefore(js, firstJS);\n    }\n\n    \/\/ Create twttr object used by script\n    window.twttr = {\n      _e: [],\n      ready: function (callback) {\n        window.twttr._e.push(callback);\n      }\n    };\n  };\n\n  return C;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.AppearIn-1.0\/h5p-appear-in.js?ver=1.0.9":"\nvar H5P = H5P || {};\n\nH5P.AppearIn = (function ($) {\n\n  \/**\n   * Constructor function.\n   *\/\n  function C(options, contentId) {\n    \/\/ Extend defaults with provided options\n    this.options = $.extend(true, {}, {\n      appearRoom: 'h5p',\n      appearHeight: '400',\n      appearWidth: '550',\n      fitToContainer: true\n    }, options);\n    \/\/ Keep provided id.\n    this.contentId = contentId;\n  }\n\n  \/**\n   * Attach function called by H5P framework to insert H5P content into\n   * page\n   *\n   * @param {jQuery} $container\n   *\/\n  C.prototype.attach = function ($container) {\n    \/\/ Set class on container to identify it as a appear.in\n    \/\/ container.  Allows for styling later.\n    $container.addClass(\"h5p-appear-in\");\n\n    var iframeParams = {\n      src: \"https:\/\/appear.in\/\" + this.options.appearRoom\n    };\n    if (!this.options.fitToContainer) {\n      iframeParams.width = this.options.appearWidth;\n      iframeParams.height = this.options.appearHeight;\n    }\n\n    \/\/ Creates the Box wrapper\n    var content = $('<iframe\/>', iframeParams);\n    if (this.options.fitToContainer) {\n      content.css({height: '100%', width: '100%'});\n    }\n    content.appendTo($container);\n  };\n\n  return C;\n})(H5P.jQuery);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Dialogcards-1.6\/js\/dialogcards.js?ver=1.6.4":"\nvar H5P = H5P || {};\n\n\/**\n * Dialogcards module\n *\n * @param {jQuery} $\n *\/\nH5P.Dialogcards = (function ($, Audio, JoubelUI) {\n\n  \/**\n   * Initialize module.\n   *\n   * @param {Object} params Behavior settings\n   * @param {Number} id Content identification\n   * @returns {C} self\n   *\/\n  function C(params, id) {\n    var self = this;\n    H5P.EventDispatcher.call(this);\n\n    self.contentId = self.id = id;\n\n    \/\/ Set default behavior.\n    self.params = $.extend({\n      title: \"Dialogue\",\n      description: \"Sit in pairs and make up sentences where you include the expressions below.<br\/>Example: I should have said yes, HOWEVER I kept my mouth shut.\",\n      next: \"Next\",\n      prev: \"Previous\",\n      retry: \"Retry\",\n      answer: \"Turn\",\n      progressText: \"Card @card of @total\",\n      cardFrontLabel: \"Card front\",\n      cardBackLabel: \"Card back\",\n      tipButtonLabel: 'Show tip',\n      audioNotSupported: 'Your browser does not support this audio',\n      dialogs: [\n        {\n          text: 'Horse',\n          answer: 'Hest'\n        },\n        {\n          text: 'Cow',\n          answer: 'Ku'\n        }\n      ],\n      behaviour: {\n        enableRetry: true,\n        \/\/randomAnswers: false, \/\/ This param is not used!\n        scaleTextNotCard: false,\n        randomCards: false\n      }\n    }, params);\n\n    self._current = -1;\n    self._turned = [];\n    self.$images = [];\n    self.audios = [];\n  }\n\n  C.prototype = Object.create(H5P.EventDispatcher.prototype);\n  C.prototype.constructor = C;\n\n  \/**\n   * Attach h5p inside the given container.\n   *\n   * @param {jQuery} $container\n   *\/\n  C.prototype.attach = function ($container) {\n    var self = this;\n    self.$inner = $container\n      .addClass('h5p-dialogcards')\n      .append($('' +\n      '<div class=\"h5p-dialogcards-title\"><div class=\"h5p-dialogcards-title-inner\">' + self.params.title + '<\/div><\/div>' +\n      '<div class=\"h5p-dialogcards-description\">' + self.params.description + '<\/div>'\n      ));\n\n    if (self.params.behaviour.scaleTextNotCard) {\n      $container.addClass('h5p-text-scaling');\n    }\n\n    self.initCards(self.params.dialogs)\n      .appendTo(self.$inner);\n\n    self.$cardSideAnnouncer = $('<div>', {\n      html: self.params.cardFrontLabel,\n      'class': 'h5p-dialogcards-card-side-announcer',\n      'aria-live': 'polite',\n      'aria-hidden': 'true'\n    }).appendTo(self.$inner);\n\n    self.createFooter()\n      .appendTo(self.$inner);\n\n    self.updateNavigation();\n\n    self.on('reset', function () {\n      self.reset();\n    });\n\n    self.on('resize', self.resize);\n    self.trigger('resize');\n  };\n\n  \/**\n   * Create footer\/navigation line\n   *\n   * @returns {*|jQuery|HTMLElement} Footer element\n   *\/\n  C.prototype.createFooter = function () {\n    var self = this;\n    var $footer = $('<nav>', {\n      'class': 'h5p-dialogcards-footer',\n      'role': 'navigation'\n    });\n\n    self.$prev = JoubelUI.createButton({\n      'class': 'h5p-dialogcards-footer-button h5p-dialogcards-prev truncated',\n      'title': self.params.prev\n    }).click(function () {\n      self.prevCard();\n    }).appendTo($footer);\n\n    self.$next = JoubelUI.createButton({\n      'class': 'h5p-dialogcards-footer-button h5p-dialogcards-next truncated',\n      'title': self.params.next\n    }).click(function () {\n      self.nextCard();\n    }).appendTo($footer);\n\n    self.$retry = JoubelUI.createButton({\n      'class': 'h5p-dialogcards-footer-button h5p-dialogcards-retry h5p-dialogcards-disabled',\n      'title': self.params.retry,\n      'html': self.params.retry\n    }).click(function () {\n      self.trigger('reset');\n    }).appendTo($footer);\n\n    self.$progress = $('<div>', {\n      'class': 'h5p-dialogcards-progress',\n      'aria-live': 'assertive'\n    }).appendTo($footer);\n\n    return $footer;\n  };\n\n  \/**\n   * Called when all cards has been loaded.\n   *\/\n  C.prototype.updateImageSize = function () {\n    var self = this;\n\n    \/\/ Find highest card content\n    var relativeHeightCap = 15;\n    var height = 0;\n    var i;\n    var foundImage = false;\n    for (i = 0; i < self.params.dialogs.length; i++) {\n      var card = self.params.dialogs[i];\n      var $card = self.$current.find('.h5p-dialogcards-card-content');\n\n      if (card.image === undefined) {\n        continue;\n      }\n      foundImage = true;\n      var imageHeight = card.image.height \/ card.image.width * $card.get(0).getBoundingClientRect().width;\n\n      if (imageHeight > height) {\n        height = imageHeight;\n      }\n    }\n\n    if (foundImage) {\n      var relativeImageHeight = height \/ parseFloat(self.$inner.css('font-size'));\n      if (relativeImageHeight > relativeHeightCap) {\n        relativeImageHeight = relativeHeightCap;\n      }\n      self.$images.forEach(function ($img) {\n        $img.parent().css('height', relativeImageHeight + 'em');\n      });\n    }\n  };\n\n  \/**\n   * Adds tip to a card\n   *\n   * @param {jQuery} $card The card\n   * @param {String} [side=front] Which side of the card\n   * @param {Number} [index] Index of card\n   *\/\n  C.prototype.addTipToCard = function($card, side, index) {\n    var self = this;\n\n    \/\/ Make sure we have a side\n    if (side !== 'back') {\n      side = 'front';\n    }\n\n    \/\/ Make sure we have an index\n\n    if (index === undefined) {\n      index = self.$current.index();\n    }\n\n    \/\/ Remove any old tips\n    $card.find('.joubel-tip-container').remove();\n\n    \/\/ Add new tip if set and has length after trim\n    var tips = self.params.dialogs[index].tips;\n    if (tips !== undefined && tips[side] !== undefined) {\n      var tip = tips[side].trim();\n      if (tip.length) {\n        $card.find('.h5p-dialogcards-card-text-wrapper .h5p-dialogcards-card-text-inner')\n          .after(JoubelUI.createTip(tip, {\n            tipLabel: self.params.tipButtonLabel\n          }));\n      }\n    }\n  };\n\n  \/**\n   * Creates all cards and appends them to card wrapper.\n   *\n   * @param {Array} cards Card parameters\n   * @returns {*|jQuery|HTMLElement} Card wrapper set\n   *\/\n  C.prototype.initCards = function (cards) {\n    var self = this;\n    var loaded = 0;\n    var initLoad = 2;\n\n    \/\/ Randomize cards order\n    if (self.params.behaviour.randomCards) {\n      cards = H5P.shuffleArray(cards);\n    }\n\n    self.$cardwrapperSet = $('<div>', {\n      'class': 'h5p-dialogcards-cardwrap-set'\n    });\n\n    var setCardSizeCallback = function () {\n      loaded++;\n      if (loaded === initLoad) {\n        self.resize();\n      }\n    };\n\n\n    for (var i = 0; i < cards.length; i++) {\n\n      \/\/ Load cards progressively\n      if (i >= initLoad) {\n        break;\n      }\n\n      var $cardWrapper = self.createCard(cards[i], i, setCardSizeCallback);\n\n      \/\/ Set current card\n      if (i === 0) {\n        $cardWrapper.addClass('h5p-dialogcards-current');\n        self.$current = $cardWrapper;\n      }\n\n      self.addTipToCard($cardWrapper.find('.h5p-dialogcards-card-content'), 'front', i);\n\n      self.$cardwrapperSet.append($cardWrapper);\n    }\n\n    return self.$cardwrapperSet;\n  };\n\n  \/**\n   * Create a single card card\n   *\n   * @param {Object} card Card parameters\n   * @param {number} cardNumber Card number in order of appearance\n   * @param {Function} [setCardSizeCallback] Set card size callback\n   * @returns {*|jQuery|HTMLElement} Card wrapper\n   *\/\n  C.prototype.createCard = function (card, cardNumber, setCardSizeCallback) {\n    var self = this;\n    var $cardWrapper = $('<div>', {\n      'class': 'h5p-dialogcards-cardwrap'\n    });\n\n    var $cardHolder = $('<div>', {\n      'class': 'h5p-dialogcards-cardholder'\n    }).appendTo($cardWrapper);\n\n    \/\/ Progress for assistive technologies\n    var progressText = self.params.progressText\n      .replace('@card', (cardNumber + 1).toString())\n      .replace('@total', (self.params.dialogs.length).toString());\n\n    $('<div>', {\n      'class': 'h5p-dialogcards-at-progress',\n      'text': progressText\n    }).appendTo($cardHolder);\n\n    self.createCardContent(card, cardNumber, setCardSizeCallback)\n      .appendTo($cardHolder);\n\n    return $cardWrapper;\n\n  };\n\n  \/**\n   * Create content for a card\n   *\n   * @param {Object} card Card parameters\n   * @param {number} cardNumber Card number in order of appearance\n   * @param {Function} [setCardSizeCallback] Set card size callback\n   * @returns {*|jQuery|HTMLElement} Card content wrapper\n   *\/\n  C.prototype.createCardContent = function (card, cardNumber, setCardSizeCallback) {\n    var self = this;\n    var $cardContent = $('<div>', {\n      'class': 'h5p-dialogcards-card-content'\n    });\n\n\n    self.createCardImage(card, setCardSizeCallback)\n      .appendTo($cardContent);\n\n    var $cardTextWrapper = $('<div>', {\n      'class': 'h5p-dialogcards-card-text-wrapper'\n    }).appendTo($cardContent);\n\n    var $cardTextInner = $('<div>', {\n      'class': 'h5p-dialogcards-card-text-inner'\n    }).appendTo($cardTextWrapper);\n\n    var $cardTextInnerContent = $('<div>', {\n      'class': 'h5p-dialogcards-card-text-inner-content'\n    }).appendTo($cardTextInner);\n\n    self.createCardAudio(card)\n      .appendTo($cardTextInnerContent);\n\n    var $cardText = $('<div>', {\n      'class': 'h5p-dialogcards-card-text'\n    }).appendTo($cardTextInnerContent);\n\n    $('<div>', {\n      'class': 'h5p-dialogcards-card-text-area',\n      'tabindex': '-1',\n      'html': card.text\n    }).appendTo($cardText);\n\n    if (!card.text || !card.text.length) {\n      $cardText.addClass('hide');\n    }\n\n    self.createCardFooter()\n      .appendTo($cardTextWrapper);\n\n    return $cardContent;\n  };\n\n  \/**\n   * Create card footer\n   *\n   * @returns {*|jQuery|HTMLElement} Card footer element\n   *\/\n  C.prototype.createCardFooter = function () {\n    var self = this;\n    var $cardFooter = $('<div>', {\n      'class': 'h5p-dialogcards-card-footer'\n    });\n\n    JoubelUI.createButton({\n      'class': 'h5p-dialogcards-turn',\n      'html': self.params.answer\n    }).click(function () {\n      self.turnCard($(this).parents('.h5p-dialogcards-cardwrap'));\n    }).appendTo($cardFooter);\n\n    return $cardFooter;\n  };\n\n  \/**\n   * Create card image\n   *\n   * @param {Object} card Card parameters\n   * @param {Function} [loadCallback] Function to call when loading image\n   * @returns {*|jQuery|HTMLElement} Card image wrapper\n   *\/\n  C.prototype.createCardImage = function (card, loadCallback) {\n    var self = this;\n    var $image;\n    var $imageWrapper = $('<div>', {\n      'class': 'h5p-dialogcards-image-wrapper'\n    });\n\n    if (card.image !== undefined) {\n      $image = $('<img class=\"h5p-dialogcards-image\" src=\"' + H5P.getPath(card.image.path, self.id) + '\"\/>');\n      if (loadCallback) {\n        $image.load(loadCallback);\n      }\n\n      if (card.imageAltText) {\n        $image.attr('alt', card.imageAltText);\n      }\n    }\n    else {\n      $image = $('<div class=\"h5p-dialogcards-image\"><\/div>');\n      if (loadCallback) {\n        loadCallback();\n      }\n    }\n    self.$images.push($image);\n    $image.appendTo($imageWrapper);\n\n    return $imageWrapper;\n  };\n\n  \/**\n   * Create card audio\n   *\n   * @param {Object} card Card parameters\n   * @returns {*|jQuery|HTMLElement} Card audio element\n   *\/\n  C.prototype.createCardAudio = function (card) {\n    var self = this;\n    var audio;\n    var $audioWrapper = $('<div>', {\n      'class': 'h5p-dialogcards-audio-wrapper'\n    });\n    if (card.audio !== undefined) {\n\n      var audioDefaults = {\n        files: card.audio,\n        audioNotSupported: self.params.audioNotSupported\n      };\n\n      audio = new Audio(audioDefaults, self.id);\n      audio.attach($audioWrapper);\n\n      \/\/ Have to stop else audio will take up a socket pending forever in chrome.\n      if (audio.audio && audio.audio.preload) {\n        audio.audio.preload = 'none';\n      }\n    }\n    else {\n      $audioWrapper.addClass('hide');\n    }\n    self.audios.push(audio);\n\n    return $audioWrapper;\n  };\n\n  \/**\n   * Update navigation text and show or hide buttons.\n   *\/\n  C.prototype.updateNavigation = function () {\n    var self = this;\n\n    if (self.$current.next('.h5p-dialogcards-cardwrap').length) {\n      self.$next.removeClass('h5p-dialogcards-disabled');\n      self.$retry.addClass('h5p-dialogcards-disabled');\n    }\n    else {\n      self.$next.addClass('h5p-dialogcards-disabled');\n    }\n\n    if (self.$current.prev('.h5p-dialogcards-cardwrap').length && !self.params.behaviour.disableBackwardsNavigation) {\n      self.$prev.removeClass('h5p-dialogcards-disabled');\n    }\n    else {\n      self.$prev.addClass('h5p-dialogcards-disabled');\n    }\n\n    self.$progress.text(self.params.progressText.replace('@card', self.$current.index() + 1).replace('@total', self.params.dialogs.length));\n    self.resizeOverflowingText();\n  };\n\n  \/**\n   * Show next card.\n   *\/\n  C.prototype.nextCard = function () {\n    var self = this;\n    var $next = self.$current.next('.h5p-dialogcards-cardwrap');\n\n    \/\/ Next card not loaded or end of cards\n    if ($next.length) {\n      self.stopAudio(self.$current.index());\n      self.$current.removeClass('h5p-dialogcards-current').addClass('h5p-dialogcards-previous');\n      self.$current = $next.addClass('h5p-dialogcards-current');\n      self.setCardFocus(self.$current);\n\n      \/\/ Add next card.\n      var $loadCard = self.$current.next('.h5p-dialogcards-cardwrap');\n      if (!$loadCard.length && self.$current.index() + 1 < self.params.dialogs.length) {\n        var $cardWrapper = self.createCard(self.params.dialogs[self.$current.index() + 1], self.$current.index() + 1)\n          .appendTo(self.$cardwrapperSet);\n        self.addTipToCard($cardWrapper.find('.h5p-dialogcards-card-content'), 'front', self.$current.index() + 1);\n        self.resize();\n      }\n\n      \/\/ Update navigation\n      self.updateNavigation();\n    }\n  };\n\n  \/**\n   * Show previous card.\n   *\/\n  C.prototype.prevCard = function () {\n    var self = this;\n    var $prev = self.$current.prev('.h5p-dialogcards-cardwrap');\n\n    if ($prev.length) {\n      self.stopAudio(self.$current.index());\n      self.$current.removeClass('h5p-dialogcards-current');\n      self.$current = $prev.addClass('h5p-dialogcards-current').removeClass('h5p-dialogcards-previous');\n      self.setCardFocus(self.$current);\n      self.updateNavigation();\n    }\n  };\n\n  \/**\n   * Show the opposite site of the card.\n   *\n   * @param {jQuery} $card\n   *\/\n  C.prototype.turnCard = function ($card) {\n    var self = this;\n    var $c = $card.find('.h5p-dialogcards-card-content');\n    var $ch = $card.find('.h5p-dialogcards-cardholder').addClass('h5p-dialogcards-collapse');\n\n    \/\/ Removes tip, since it destroys the animation:\n    $c.find('.joubel-tip-container').remove();\n\n    \/\/ Check if card has been turned before\n    var turned = $c.hasClass('h5p-dialogcards-turned');\n    self.$cardSideAnnouncer.html(turned ? self.params.cardFrontLabel : self.params.cardBackLabel);\n\n    \/\/ Update HTML class for card\n    $c.toggleClass('h5p-dialogcards-turned', !turned);\n\n    setTimeout(function () {\n      $ch.removeClass('h5p-dialogcards-collapse');\n      self.changeText($c, self.params.dialogs[$card.index()][turned ? 'text' : 'answer']);\n      if (turned) {\n        $ch.find('.h5p-audio-inner').removeClass('hide');\n      }\n      else {\n        self.removeAudio($ch);\n      }\n\n      \/\/ Add backside tip\n      \/\/ Had to wait a little, if not Chrome will displace tip icon\n      setTimeout(function () {\n        self.addTipToCard($c, turned ? 'front' : 'back');\n        if (!self.$current.next('.h5p-dialogcards-cardwrap').length) {\n          if (self.params.behaviour.enableRetry) {\n            self.$retry.removeClass('h5p-dialogcards-disabled');\n            self.truncateRetryButton();\n            self.resizeOverflowingText();\n          }\n        }\n      }, 200);\n\n      self.resizeOverflowingText();\n\n      \/\/ Focus text\n      $card.find('.h5p-dialogcards-card-text-area').focus();\n    }, 200);\n  };\n\n  \/**\n   * Change text of card, used when turning cards.\n   *\n   * @param $card\n   * @param text\n   *\/\n  C.prototype.changeText = function ($card, text) {\n    var $cardText = $card.find('.h5p-dialogcards-card-text-area');\n    $cardText.html(text);\n    $cardText.toggleClass('hide', (!text || !text.length));\n  };\n\n  \/**\n   * Stop audio of card with cardindex\n\n   * @param {Number} cardIndex Index of card\n   *\/\n  C.prototype.stopAudio = function (cardIndex) {\n    var self = this;\n    var audio = self.audios[cardIndex];\n    if (audio && audio.stop) {\n      audio.stop();\n    }\n  };\n\n  \/**\n   * Hide audio button\n   *\n   * @param $card\n   *\/\n  C.prototype.removeAudio = function ($card) {\n    var self = this;\n    self.stopAudio($card.closest('.h5p-dialogcards-cardwrap').index());\n    $card.find('.h5p-audio-inner')\n      .addClass('hide');\n  };\n\n  \/**\n   * Show all audio buttons\n   *\/\n  C.prototype.showAllAudio = function () {\n    var self = this;\n    self.$cardwrapperSet.find('.h5p-audio-inner')\n      .removeClass('hide');\n  };\n\n  \/**\n   * Reset the task so that the user can do it again.\n   *\/\n  C.prototype.reset = function () {\n    var self = this;\n    var $cards = self.$inner.find('.h5p-dialogcards-cardwrap');\n\n    self.stopAudio(self.$current.index());\n    self.$current.removeClass('h5p-dialogcards-current');\n    self.$current = $cards.filter(':first').addClass('h5p-dialogcards-current');\n    self.updateNavigation();\n\n    $cards.each(function (index) {\n      var $card = $(this).removeClass('h5p-dialogcards-previous');\n      self.changeText($card, self.params.dialogs[$card.index()].text);\n      var $cardContent = $card.find('.h5p-dialogcards-card-content');\n      $cardContent.removeClass('h5p-dialogcards-turned');\n      self.addTipToCard($cardContent, 'front', index);\n    });\n    self.$retry.addClass('h5p-dialogcards-disabled');\n    self.showAllAudio();\n    self.resizeOverflowingText();\n    self.setCardFocus(self.$current);\n  };\n\n  \/**\n   * Update the dimensions of the task when resizing the task.\n   *\/\n  C.prototype.resize = function () {\n    var self = this;\n    var maxHeight = 0;\n    self.updateImageSize();\n    if (!self.params.behaviour.scaleTextNotCard) {\n      self.determineCardSizes();\n    }\n\n    \/\/ Reset card-wrapper-set height\n    self.$cardwrapperSet.css('height', 'auto');\n\n    \/\/Find max required height for all cards\n    self.$cardwrapperSet.children().each( function () {\n      var wrapperHeight = $(this).css('height', 'initial').outerHeight();\n      $(this).css('height', 'inherit');\n      maxHeight = wrapperHeight > maxHeight ? wrapperHeight : maxHeight;\n\n      \/\/ Check height\n      if (!$(this).next('.h5p-dialogcards-cardwrap').length) {\n        var initialHeight = $(this).find('.h5p-dialogcards-cardholder').css('height', 'initial').outerHeight();\n        maxHeight = initialHeight > maxHeight ? initialHeight : maxHeight;\n        $(this).find('.h5p-dialogcards-cardholder').css('height', 'inherit');\n      }\n    });\n    var relativeMaxHeight = maxHeight \/ parseFloat(self.$cardwrapperSet.css('font-size'));\n    self.$cardwrapperSet.css('height', relativeMaxHeight + 'em');\n    self.scaleToFitHeight();\n    self.truncateRetryButton();\n    self.resizeOverflowingText();\n  };\n\n  \/**\n   * Resizes each card to fit its text\n   *\/\n  C.prototype.determineCardSizes = function () {\n    var self = this;\n\n    if (self.cardSizeDetermined === undefined) {\n      \/\/ Keep track of which cards we've already determined size for\n      self.cardSizeDetermined = [];\n    }\n\n    \/\/ Go through each card\n    self.$cardwrapperSet.children(':visible').each(function (i) {\n      if (self.cardSizeDetermined.indexOf(i) !== -1) {\n        return; \/\/ Already determined, no need to determine again.\n      }\n      self.cardSizeDetermined.push(i);\n\n      var $content = $('.h5p-dialogcards-card-content', this);\n      var $text = $('.h5p-dialogcards-card-text-inner-content', $content);\n\n      \/\/ Grab size with text\n      var textHeight = $text[0].getBoundingClientRect().height;\n\n      \/\/ Change to answer\n      self.changeText($content, self.params.dialogs[i].answer);\n\n      \/\/ Grab size with answer\n      var answerHeight = $text[0].getBoundingClientRect().height;\n\n      \/\/ Use highest\n      var useHeight = (textHeight > answerHeight ? textHeight : answerHeight);\n\n      \/\/ Min. limit\n      var minHeight = parseFloat($text.parent().parent().css('minHeight'));\n      if (useHeight < minHeight) {\n        useHeight =  minHeight;\n      }\n\n      \/\/ Convert to em\n      var fontSize = parseFloat($content.css('fontSize'));\n      useHeight \/= fontSize;\n\n      \/\/ Set height\n      $text.parent().css('height', useHeight + 'em');\n\n      \/\/ Change back to text\n      self.changeText($content, self.params.dialogs[i].text);\n    });\n  };\n\n  C.prototype.scaleToFitHeight = function () {\n    var self = this;\n    if (!self.$cardwrapperSet || !self.$cardwrapperSet.is(':visible') || !self.params.behaviour.scaleTextNotCard) {\n      return;\n    }\n\n    \/\/ Resize font size to fit inside CP\n    if (self.$inner.parents('.h5p-course-presentation').length) {\n      var $parentContainer = self.$inner.parent();\n      if (self.$inner.parents('.h5p-popup-container').length) {\n        $parentContainer = self.$inner.parents('.h5p-popup-container');\n      }\n      var containerHeight = $parentContainer.get(0).getBoundingClientRect().height;\n      var getContentHeight = function () {\n        var contentHeight = 0;\n        self.$inner.children().each(function () {\n          contentHeight += $(this).get(0).getBoundingClientRect().height +\n          parseFloat($(this).css('margin-top')) + parseFloat($(this).css('margin-bottom'));\n        });\n        return contentHeight;\n      };\n      var contentHeight = getContentHeight();\n      var parentFontSize = parseFloat(self.$inner.parent().css('font-size'));\n      var newFontSize = parseFloat(self.$inner.css('font-size'));\n\n      \/\/ Decrease font size\n      if (containerHeight < contentHeight) {\n        while (containerHeight < contentHeight) {\n          newFontSize -= C.SCALEINTERVAL;\n\n          \/\/ Cap at min font size\n          if (newFontSize < C.MINSCALE) {\n            break;\n          }\n\n          \/\/ Set relative font size to scale with full screen.\n          self.$inner.css('font-size', (newFontSize \/ parentFontSize) + 'em');\n          contentHeight = getContentHeight();\n        }\n      }\n      else { \/\/ Increase font size\n        var increaseFontSize = true;\n        while (increaseFontSize) {\n          newFontSize += C.SCALEINTERVAL;\n\n          \/\/ Cap max font size\n          if (newFontSize > C.MAXSCALE) {\n            increaseFontSize = false;\n            break;\n          }\n\n          \/\/ Set relative font size to scale with full screen.\n          var relativeFontSize = newFontSize \/ parentFontSize;\n          self.$inner.css('font-size', relativeFontSize + 'em');\n          contentHeight = getContentHeight();\n          if (containerHeight <= contentHeight) {\n            increaseFontSize = false;\n            relativeFontSize = (newFontSize - C.SCALEINTERVAL) \/ parentFontSize;\n            self.$inner.css('font-size', relativeFontSize + 'em');\n          }\n        }\n      }\n    }\n    else { \/\/ Resize mobile view\n      self.resizeOverflowingText();\n    }\n  };\n\n  \/**\n   * Resize the font-size of text areas that tend to overflow when dialog cards\n   * is squeezed into a tiny container.\n   *\/\n  C.prototype.resizeOverflowingText = function () {\n    var self = this;\n\n    if (!self.params.behaviour.scaleTextNotCard) {\n      return; \/\/ No text scaling today\n    }\n\n    \/\/ Resize card text if needed\n    var $textContainer = self.$current.find('.h5p-dialogcards-card-text');\n    var $text = $textContainer.children();\n    self.resizeTextToFitContainer($textContainer, $text);\n  };\n\n  \/**\n   * Increase or decrease font size so text wil fit inside container.\n   *\n   * @param {jQuery} $textContainer Outer container, must have a set size.\n   * @param {jQuery} $text Inner text container\n   *\/\n  C.prototype.resizeTextToFitContainer = function ($textContainer, $text) {\n    var self = this;\n\n    \/\/ Reset text size\n    $text.css('font-size', '');\n\n    \/\/ Measure container and text height\n    var currentTextContainerHeight = $textContainer.get(0).getBoundingClientRect().height;\n    var currentTextHeight = $text.get(0).getBoundingClientRect().height;\n    var parentFontSize = parseFloat($textContainer.css('font-size'));\n    var fontSize = parseFloat($text.css('font-size'));\n    var mainFontSize = parseFloat(self.$inner.css('font-size'));\n\n    \/\/ Decrease font size\n    if (currentTextHeight > currentTextContainerHeight) {\n      var decreaseFontSize = true;\n      while (decreaseFontSize) {\n\n        fontSize -= C.SCALEINTERVAL;\n\n        if (fontSize < C.MINSCALE) {\n          decreaseFontSize = false;\n          break;\n        }\n\n        $text.css('font-size', (fontSize \/ parentFontSize) + 'em');\n\n        currentTextHeight = $text.get(0).getBoundingClientRect().height;\n        if (currentTextHeight <= currentTextContainerHeight) {\n          decreaseFontSize = false;\n        }\n      }\n\n    }\n    else { \/\/ Increase font size\n      var increaseFontSize = true;\n      while (increaseFontSize) {\n        fontSize += C.SCALEINTERVAL;\n\n        \/\/ Cap at  16px\n        if (fontSize > mainFontSize) {\n          increaseFontSize = false;\n          break;\n        }\n\n        \/\/ Set relative font size to scale with full screen.\n        $text.css('font-size', fontSize \/ parentFontSize + 'em');\n        currentTextHeight = $text.get(0).getBoundingClientRect().height;\n        if (currentTextHeight >= currentTextContainerHeight) {\n          increaseFontSize = false;\n          fontSize = fontSize- C.SCALEINTERVAL;\n          $text.css('font-size', fontSize \/ parentFontSize + 'em');\n        }\n      }\n    }\n  };\n\n  \/**\n   * Set focus to a given card\n   *\n   * @param {jQuery} $card Card that should get focus\n   *\/\n  C.prototype.setCardFocus = function ($card) {\n    \/\/ Wait for transition, then set focus\n    $card.one('transitionend', function () {\n      $card.find('.h5p-dialogcards-card-text-area').focus();\n    });\n  };\n\n  \/**\n   * Truncate retry button if width is small.\n   *\/\n  C.prototype.truncateRetryButton = function () {\n    var self = this;\n    if (!self.$retry) {\n      return;\n    }\n\n    \/\/ Reset button to full size\n    self.$retry.removeClass('truncated');\n    self.$retry.html(self.params.retry);\n\n    \/\/ Measure button\n    var maxWidthPercentages = 0.3;\n    var retryWidth = self.$retry.get(0).getBoundingClientRect().width +\n        parseFloat(self.$retry.css('margin-left')) + parseFloat(self.$retry.css('margin-right'));\n    var retryWidthPercentage = retryWidth \/ self.$retry.parent().get(0).getBoundingClientRect().width;\n\n    \/\/ Truncate button\n    if (retryWidthPercentage > maxWidthPercentages) {\n      self.$retry.addClass('truncated');\n      self.$retry.html('');\n    }\n  };\n\n  C.SCALEINTERVAL = 0.2;\n  C.MAXSCALE = 16;\n  C.MINSCALE = 4;\n\n  return C;\n})(H5P.jQuery, H5P.Audio, H5P.JoubelUI);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.RadioSelector-1.2\/radio-selector.js?ver=1.2.1":"\nH5PEditor.widgets.radioSelector = H5PEditor.RadioSelector = (function ($, EventDispatcher) {\n\n  var idCounter = 0;\n\n  \/**\n   * Creates a Radio Selector widget.\n   *\n   * @class H5PEditor.RadioSelector\n   * @param {Object} parent\n   * @param {Object} field\n   * @param {Object} params\n   * @param {function} setValue\n   *\/\n  function RadioSelector(parent, field, params, setValue) {\n    var self = this;\n\n    \/\/ Inheritance\n    EventDispatcher.call(self);\n\n    \/\/ Wrapper for widget\n    var $container = $('<div class=\"h5p-radio-selector\">');\n\n    \/\/ Wrapper for radio buttons\n    var $options = $('<div class=\"h5p-radio-selector-options\">').appendTo($container);\n\n    \/\/ Wrapper for content corresponding to radio buttons\n    var $values = $('<div class=\"h5p-radio-selector-values\">').appendTo($container);\n\n    \/\/ Unique radio selector id\n    var uniqueId = 'h5p-radio-selector-' + idCounter++;\n\n    \/\/ Stored options\n    var storedOptions = [];\n\n    \/\/ Make parent handle readies\n    self.passReadies = true;\n\n    \/\/ Processed semantics object\n    self.children = [];\n\n    \/\/ Default selected option\n    var currentOption = 0;\n\n    \/\/ Default params\n    params = params || {};\n\n    \/\/ Set current option from params\n    field.fields.forEach(function (semanticField, idx) {\n      if (semanticField.name && params[semanticField.name]) {\n        currentOption = idx;\n      }\n    });\n\n    \/\/ Make sure params are updated when fields are changed\n    setValue(field, params);\n\n    \/**\n     * @typedef {Object} StoredOption Stored options\n     * @property {string} type Type (e.g. 'image', 'bgColor')\n     * @property {string|*} value Value of type\n     *\/\n\n    \/**\n     * Add option at given index\n     *\n     * @private\n     * @param {number} i Index of radio option\n     * @param {StoredOption} option Stored option\n     *\/\n    var addOption = function (i, option) {\n      storedOptions[i] = option;\n      triggerOption(i);\n    };\n\n    \/**\n     * Remove given radio option\n     *\n     * @private\n     * @param {number} [i] Index of radio option\n     *\/\n    var removeOption = function (i) {\n      i = i || currentOption;\n      storedOptions[i] = undefined;\n      triggerOptionRemoval();\n    };\n\n    \/**\n     * Trigger type removal to parent\n     * @private\n     *\/\n    var triggerOptionRemoval = function () {\n      self.trigger('backgroundRemoved');\n    };\n\n    \/**\n     * Trigger type added to parent\n     *\n     * @private\n     * @param {number} i Index of option triggered\n     *\/\n    var triggerOption = function (i) {\n      currentOption = i;\n      self.trigger('backgroundAdded');\n    };\n\n    \/**\n     * Create radio content and show selected\n     * @private\n     *\/\n    var createRadioContent = function () {\n      H5PEditor.processSemanticsChunk(field.fields, params, $values, self);\n      $values.children().eq(currentOption).addClass('show');\n    };\n\n    \/**\n     * Create radio buttons\n     * @private\n     *\/\n    var createRadioButtons = function () {\n      $values.children().each(function (idx) {\n        var show = '';\n        var label = field.fields[idx].label;\n\n        \/\/ Show current option\n        if (idx === currentOption) {\n          show = ' checked=\"checked\"';\n          $(this).addClass('show');\n        }\n\n        \/\/ Create radio button for content\n        $('<label class=\"h5p-radio-selector-label\">' +\n            '<input type=\"radio\"' + show + ' name=\"' + uniqueId + '\">' + label +\n          '<\/label>')\n          .change(function () {\n\n            \/\/ Show radio option\n            triggerOptionRemoval();\n            triggerOption(idx);\n            self.showContent(idx);\n            self.reflow();\n            currentOption = idx;\n          }).appendTo($options);\n      });\n    };\n\n    \/**\n     * Store initial options from processed parameters\n     * @private\n     *\/\n    var storeInitialOptions = function () {\n      self.children.forEach(function (child, idx) {\n\n        \/\/ Has params, store option\n        if (child.params) {\n          var type = '';\n          var value;\n          if (child instanceof ns.File) {\n            type = 'image';\n            if (child.params && child.params.path) {\n              value = H5P.getPath(child.params.path, H5PEditor.contentId);\n            }\n          }\n          else if (child instanceof H5PEditor.ColorSelector && child.params.length) {\n            type = 'bgColor';\n            value = child.params;\n          }\n\n          \/\/ Store options if we found a value\n          if (value) {\n            storedOptions[idx] = {type: type, value: value};\n          }\n        }\n      });\n    };\n\n    \/**\n     * Handle changes in semantics\n     * @private\n     *\/\n    var handleSemanticsEvents = function () {\n      self.children.forEach(function (child, i) {\n        handleImages(child, i);\n        handleColors(child, i);\n      });\n    };\n\n    \/**\n     * Try handling child as image\n     *\n     * @private\n     * @param {Object} child Processed semantics instance\n     * @param {number} i Index of instance in semantics\n     *\/\n    var handleImages = function (child, i) {\n      if (!(child instanceof ns.File) || !child.changes) {\n        return;\n      }\n\n      \/\/ Add to changes callback\n      child.changes.push(function (img) {\n        var type = 'image';\n\n        \/\/ Check for image path\n        if (img && img.path) {\n\n          \/\/ Add image\n          var value = H5P.getPath(img.path, H5PEditor.contentId);\n          addOption(i, {type: type, value: value});\n        }\n        else {\n\n          \/\/ Remove image\n          removeOption(i);\n        }\n      });\n    };\n\n    \/**\n     * Try handling child as color selector\n     *\n     * @private\n     * @param {Object} child Processed semantics instance\n     * @param {number} i Index of instance in semantics\n     *\/\n    var handleColors = function (child, i) {\n      if (!(child instanceof H5PEditor.ColorSelector)) {\n        return;\n      }\n\n      var type = 'bgColor';\n\n      \/**\n       * Trigger color change, update params and reflow color picker\n       *\n       * @private\n       * @param [tinycolor] Optional new color\n       *\/\n      var changeSpectrumColor = function (tinycolor) {\n        tinycolor = tinycolor || child.$colorPicker.spectrum('get', tinycolor);\n\n        \/\/ Make sure we are the current option, avoid unintentional changes\n        if (currentOption === i) {\n\n          \/\/ Add color\n          if (tinycolor) {\n            addOption(i, {type: type, value: tinycolor.toHexString()});\n          }\n          else {\n            \/\/ Remove color\n            removeOption(i);\n          }\n        }\n\n        \/\/ Update ColorSelector manually, since it does not auto update when flat\n        child.setColor(tinycolor);\n        child.$colorPicker.spectrum('reflow');\n      };\n\n      child.$colorPicker.on('move.spectrum', function (e, tinycolor) {\n        changeSpectrumColor(tinycolor);\n      }).on('change', function (e, tinycolor) {\n        changeSpectrumColor(tinycolor);\n      });\n    };\n\n    \/**\n     * Append the field to the wrapper.\n     *\n     * @param {jQuery} $wrapper\n     * @returns {H5PEditor.RadioSelector}\n     *\/\n    self.appendTo = function ($wrapper) {\n      createRadioContent();\n      createRadioButtons();\n      handleSemanticsEvents();\n      storeInitialOptions();\n      $container.appendTo($wrapper);\n\n      return self;\n    };\n\n    \/**\n     * Show content with given index\n     *\n     * @param index Index of content\n     * @returns {H5PEditor.RadioSelector}\n     *\/\n    self.showContent = function (index) {\n      $values.children().removeClass('show');\n      $values.children().eq(index).addClass('show');\n\n      return self;\n    };\n\n    \/**\n     * Reset currently selected option\n     *\n     * @returns {H5PEditor.RadioSelector}\n     *\/\n    self.resetCheckedOption = function () {\n      var resetOption = self.children[currentOption];\n\n      if (resetOption instanceof ns.File) {\n        \/\/ TODO: Make core h5peditor-file export a reset function\n        \/\/ Temp solution, click 'close' using jquery\n        $values.children().eq(currentOption)\n          .find('.file > a.remove').click();\n      }\n      else if (resetOption instanceof H5PEditor.ColorSelector) {\n        resetOption.$colorPicker.spectrum('set', null);\n        removeOption();\n      }\n    };\n\n    \/**\n     * Get currently selected option\n     *\n     * @returns {StoredOption} Stored option\n     *\/\n    self.getStoredOption = function () {\n      return storedOptions[currentOption];\n    };\n\n    \/**\n     * Get selected index\n     *\n     * @returns {number} Currently selected index\n     *\/\n    self.getSelectedIndex = function () {\n      return currentOption;\n    };\n\n    \/**\n     * Reflow\/repaint current option if it is a ColorSelector\n     *\n     * @returns {H5PEditor.RadioSelector}\n     *\/\n    self.reflow = function () {\n      var selected = self.children[currentOption];\n      if (selected instanceof H5PEditor.ColorSelector) {\n        selected.$colorPicker.spectrum('reflow');\n      }\n\n      return self;\n    };\n\n    \/**\n     * Set selected index\n     *\n     * @param {number} index Index to select\n     * @returns {H5PEditor.RadioSelector}\n     *\/\n    self.setSelectedIndex = function (index) {\n      var $input = $options.children().eq(index).find('input');\n      if (!$input.is(':checked')) {\n        $input.attr('checked', true);\n        $input.trigger('change');\n      }\n\n      return self;\n    };\n\n    \/**\n     * Set radio labels\n     *\n     * @param {array} radioLabels Labels for radio buttons\n     * @returns {boolean} Success\n     *\/\n    self.setRadioLabels = function (radioLabels) {\n      var $optionLabels = $options.children();\n\n      \/\/ Validate length\n      if ($optionLabels.length !== radioLabels.length) {\n        return false;\n      }\n\n      $optionLabels.each(function (idx) {\n        $(this).get(0).lastChild.nodeValue = radioLabels[idx];\n      });\n\n      return true;\n    };\n\n    \/**\n     * Validate user input and prune unused params.\n     *\n     * @returns {Boolean} Valid or not\n     *\/\n    self.validate = function () {\n      \/\/ Prune unused params\n      $options.find('input').each(function (idx) {\n        if (!$(this).is(':checked')) {\n          delete params[field.fields[idx].name];\n        }\n        else if (self.children[idx] instanceof H5PEditor.ColorSelector) {\n          \/\/ Make sure ColorSelector is saved\n          var colorPicker = self.children[idx];\n          colorPicker.setColor(colorPicker.$colorPicker.spectrum('get'));\n        }\n      });\n\n      return true;\n    };\n  }\n\n  \/\/ Inheritance\n  RadioSelector.prototype = Object.create(EventDispatcher.prototype);\n  RadioSelector.prototype.constructor = RadioSelector;\n\n  \/**\n   * Communicate that we are ready.\n   *\n   * @returns {boolean}\n   *\/\n  RadioSelector.prototype.ready = function () {\n    return true; \/\/ Always ready\n  };\n\n  \/**\n   * Remove me. Invoked by core\n   *\/\n  RadioSelector.prototype.remove = function () {\n  };\n\n  return RadioSelector;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/scripts\/disposable-boolean.js?ver=1.17.4":"\n\/*global ns*\/\n\/\/ Create a new editor widget for boolean fields\nns.widgets.disposableBoolean = (function ($, EventDispatcher) {\n\n  \/**\n   * A special boolean option that only can be used once.\n   * Requires confirmation before checking it.\n   *\n   * @class\n   * @param {object} parent\n   * @param {object} field\n   * @param {boolean} params\n   * @param {function} setValue\n   *\/\n  function DisposableBoolean(parent, field, params, setValue) {\n    var self = this;\n\n    \/\/ Inherit event support\n    EventDispatcher.call(self);\n\n    var $element;\n    var checked = (params !== undefined && params);\n    setValue(field, checked);\n\n    \/\/ Expose field props\n    self.field = field;\n\n    \/**\n     * Build the DOM element string and then create the HTML.\n     *\n     * @private\n     * @returns {H5P.jQuery}\n     *\/\n    var createElement = function () {\n      var state = checked ? ' checked=\"checked\" disabled=\"disabled\"' : '';\n      var content = '<input type=\"checkbox\"' + state + ' \/>';\n\n      $element = $(ns.createBooleanFieldMarkup(field, content));\n\n      if (checked) {\n        $element.addClass('disabled');\n      }\n\n      var $input = $element.find('input').on('change', function () {\n        if (confirm(H5PEditor.t('H5PEditor.CoursePresentation', 'activeSurfaceWarning'))) {\n          checked = $input.is(':checked');\n          setValue(field, checked);\n          $input.attr('disabled', true);\n          $element.addClass('disabled');\n          self.trigger('checked');\n        }\n        else {\n          \/\/ Reset\n          $input.attr('checked', false);\n        }\n      });\n    };\n\n    \/**\n     * Appends this fields elements to the given container.\n     *\n     * @param {H5P.jQuery} $container\n     *\/\n    self.appendTo = function ($container) {\n      if ($element === undefined) {\n        createElement();\n      }\n      $element.appendTo($container);\n    };\n\n    \/**\n     * Checks to see if this fields value is valid.\n     *\n     * @returns {boolean}\n     *\/\n    self.validate = function () {\n      return true; \/\/ Always valid\n    };\n\n    \/**\n     * Removes this field from the DOM.\n     *\/\n    self.remove = function () {\n      $element.detach();\n    };\n  }\n\n  DisposableBoolean.prototype = Object.create(EventDispatcher.prototype);\n  DisposableBoolean.prototype.constructor = DisposableBoolean;\n\n  return DisposableBoolean;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/scripts\/cp-editor.js?ver=1.17.4":"\n\/*global H5P,ns*\/\nvar H5PEditor = H5PEditor || {};\n\n\/**\n * Create a field for the form.\n *\n * @param {mixed} parent\n * @param {Object} field\n * @param {mixed} params\n * @param {function} setValue\n * @returns {H5PEditor.Text}\n *\/\nH5PEditor.CoursePresentation = function (parent, field, params, setValue) {\n  var that = this;\n  H5P.EventDispatcher.call(this);\n\n  if (params === undefined) {\n    params = {\n      slides: [{\n        elements: [],\n        keywords: []\n      }]\n    };\n\n    setValue(field, params);\n  }\n\n  this.parent = parent;\n  this.field = field;\n  this.params = params;\n  \/\/ Elements holds a mix of forms and params, not element instances\n  this.elements = [];\n  this.slideRatio = 1.9753;\n\n  this.passReadies = true;\n  parent.ready(function () {\n    that.passReadies = false;\n\n    \/\/ Active surface mode\n    var activeSurfaceCheckbox = H5PEditor.findField('override\/activeSurface', parent);\n    activeSurfaceCheckbox.on('checked', function () {\n      \/\/ Make note of current height\n      var oldHeight = parseFloat(window.getComputedStyle(that.cp.$current[0]).height);\n\n      \/\/ Enable adjustments\n      that.cp.$container.addClass('h5p-active-surface');\n\n      \/\/ Remove navigation\n      that.cp.$progressbar.remove();\n\n      \/\/ Find change in %\n      var newHeight = parseFloat(window.getComputedStyle(that.cp.$current[0]).height);\n      var change = (newHeight - oldHeight) \/ newHeight;\n\n      \/\/ Update elements\n      that.updateElementSizes(1 - change);\n    });\n  });\n\n  if (H5PEditor.InteractiveVideo !== undefined) {\n    \/\/ Disable IV's guided tour within CP\n    H5PEditor.InteractiveVideo.disableGuidedTour();\n  }\n};\n\nH5PEditor.CoursePresentation.prototype = Object.create(H5P.EventDispatcher.prototype);\nH5PEditor.CoursePresentation.prototype.constructor = H5PEditor.CoursePresentation;\n\n\/**\n * Must be changed if the semantics for the elements changes.\n * @type {string}\n *\/\nH5PEditor.CoursePresentation.clipboardKey = 'H5PEditor.CoursePresentation';\n\n\/**\n * Will change the size of all elements using the given ratio.\n *\n * @param {number} heightRatio\n *\/\nH5PEditor.CoursePresentation.prototype.updateElementSizes = function (heightRatio) {\n  var $slides = this.cp.$slidesWrapper.children();\n\n  \/\/ Go through all slides\n  for (var i = 0; i < this.params.slides.length; i++) {\n    var slide = this.params.slides[i];\n    var $slideElements = $slides.eq(i).children();\n\n    for (var j = 0; j < slide.elements.length; j++) {\n      var element = slide.elements[j];\n\n      \/\/ Update params\n      element.height *= heightRatio;\n      element.y *= heightRatio;\n\n      \/\/ Update visuals if possible\n      $slideElements.eq(j).css({\n        height: element.height + '%',\n        top: element.y + '%'\n      });\n    }\n  }\n};\n\n\/**\n * Add an element to the current slide and params.\n *\n * @param {string|object} library Content type or parameters\n * @param {object} [options] Override the default options\n * @returns {object}\n *\/\nH5PEditor.CoursePresentation.prototype.addElement = function (library, options) {\n  options = options || {};\n  var elementParams;\n  if (!(library instanceof String || typeof library === 'string')) {\n    elementParams = library;\n  }\n\n  if (!elementParams) {\n    \/\/ Create default start parameters\n    elementParams = {\n      x: 30,\n      y: 30,\n      width: 40,\n      height: 40\n    };\n\n    if (library === 'GoToSlide') {\n      elementParams.goToSlide = 1;\n    }\n    else {\n      elementParams.action = (options.action ? options.action : {\n        library: library,\n        params: {}\n      });\n      elementParams.action.subContentId = H5P.createUUID();\n\n      var libraryName = library.split(' ')[0];\n      switch (libraryName) {\n        case 'H5P.Audio':\n          elementParams.width = 2.577632696;\n          elementParams.height = 5.091753604;\n          elementParams.action.params.fitToWrapper = true;\n          break;\n\n        case 'H5P.DragQuestion':\n          elementParams.width = 50;\n          elementParams.height = 50;\n          break;\n      }\n    }\n\n    if (options.width && options.height && !options.displayAsButton) {\n      \/\/ Use specified size\n      elementParams.width = options.width;\n      elementParams.height = options.height * this.slideRatio;\n    }\n    if (options.displayAsButton) {\n      elementParams.displayAsButton = true;\n    }\n  }\n  if (options.pasted) {\n    elementParams.pasted = true;\n  }\n\n  var slideIndex = this.cp.$current.index();\n  var slideParams = this.params.slides[slideIndex];\n\n  if (slideParams.elements === undefined) {\n    \/\/ No previous elements\n    slideParams.elements = [elementParams];\n  }\n  else {\n    var containerStyle = window.getComputedStyle(this.dnb.$container[0]);\n    var containerWidth = parseFloat(containerStyle.width);\n    var containerHeight = parseFloat(containerStyle.height);\n\n    \/\/ Make sure we don't overlap another element\n    var pToPx = containerWidth \/ 100;\n    var pos = {\n      x: elementParams.x * pToPx,\n      y: (elementParams.y * pToPx) \/ this.slideRatio\n    };\n    this.dnb.avoidOverlapping(pos, {\n      width: (elementParams.width \/ 100) * containerWidth,\n      height: (elementParams.height \/ 100) * containerHeight,\n    });\n    elementParams.x = pos.x \/ pToPx;\n    elementParams.y = (pos.y \/ pToPx) * this.slideRatio;\n\n    \/\/ Add as last element\n    slideParams.elements.push(elementParams);\n  }\n\n  this.cp.$boxWrapper.add(this.cp.$boxWrapper.find('.h5p-presentation-wrapper:first')).css('overflow', 'visible');\n\n  var instance = this.cp.addElement(elementParams, this.cp.$current, slideIndex);\n  return this.cp.attachElement(elementParams, instance, this.cp.$current, slideIndex);\n};\n\n\/**\n * Append field to wrapper.\n *\n * @param {type} $wrapper\n * @returns {undefined}\n *\/\nH5PEditor.CoursePresentation.prototype.appendTo = function ($wrapper) {\n  var that = this;\n\n  this.$item = H5PEditor.$(this.createHtml()).appendTo($wrapper);\n  this.$editor = this.$item.children('.editor');\n  this.$errors = this.$item.children('.h5p-errors');\n\n  \/\/ Create new presentation.\n  var presentationParams = (this.parent instanceof ns.Library ? this.parent.params.params : this.parent.params);\n  this.cp = new H5P.CoursePresentation(presentationParams, H5PEditor.contentId, {cpEditor: this});\n  this.cp.attach(this.$editor);\n  if (this.cp.$wrapper.is(':visible')) {\n    this.cp.trigger('resize');\n  }\n  var $settingsWrapper = H5PEditor.$('<div>', {\n    'class': 'h5p-settings-wrapper hidden',\n    appendTo: that.cp.$boxWrapper.children('.h5p-presentation-wrapper')\n  });\n\n\n  \/\/ Add drag and drop menu bar.\n  that.initializeDNB();\n\n  \/\/ Find BG selector fields and init slide selector\n  var globalBackgroundField = H5PEditor.CoursePresentation.findField('globalBackgroundSelector', this.field.fields);\n  var slideFields = H5PEditor.CoursePresentation.findField('slides', this.field.fields);\n  this.backgroundSelector = new H5PEditor.CoursePresentation.SlideSelector(that, that.cp.$slidesWrapper, globalBackgroundField, slideFields, that.params)\n    .appendTo($settingsWrapper);\n\n  \/\/ Add and bind slide controls.\n  var slideControls = {\n    $add: H5PEditor.$('<a href=\"#\" aria-label=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'newSlide') + '\" class=\"h5p-slidecontrols-button h5p-slidecontrols-button-add\"><\/a>'),\n    $clone: H5PEditor.$('<a href=\"#\" aria-label=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'cloneSlide') + '\" class=\"h5p-clone-slide h5p-slidecontrols-button h5p-slidecontrols-button-clone\"><\/a>'),\n    $background: H5PEditor.$('<a href=\"#\" aria-label=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'backgroundSlide') + '\" class=\"h5p-slidecontrols-button h5p-slidecontrols-button-background\"><\/a>'),\n    $sortLeft: H5PEditor.$('<a href=\"#\" aria-label=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'sortSlide', {':dir': 'left'}) + '\" class=\"h5p-slidecontrols-button h5p-slidecontrols-button-sort-left\"><\/a>'),\n    $sortRight: H5PEditor.$('<a href=\"#\" aria-label=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'sortSlide', {':dir': 'right'}) + '\" class=\"h5p-slidecontrols-button h5p-slidecontrols-button-sort-right\"><\/a>'),\n    $delete: H5PEditor.$('<a href=\"#\" aria-label=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'removeSlide') + '\" class=\"h5p-slidecontrols-button h5p-slidecontrols-button-delete\"><\/a>')\n  };\n  this.slideControls = slideControls;\n\n  H5PEditor.$('<div class=\"h5p-slidecontrols\">').append([\n    slideControls.$add,\n    slideControls.$clone,\n    slideControls.$background,\n    slideControls.$sortLeft,\n    slideControls.$sortRight,\n    slideControls.$delete\n  ]).appendTo(this.cp.$wrapper)\n    .children('a:first')\n    .click(function () {\n      that.addSlide();\n      that.updateSlidesSidebar();\n      return false;\n    })\n    .next()\n    .click(function () {\n      var newSlide = H5P.cloneObject(that.params.slides[that.cp.$current.index()], true);\n      newSlide.keywords = [];\n      that.addSlide(newSlide);\n      H5P.ContinuousText.Engine.run(that);\n      that.updateSlidesSidebar();\n      return false;\n    })\n    .next()\n    .click(function () {\n      that.backgroundSelector.toggleOpen();\n      H5PEditor.$(this).toggleClass('active');\n      return false;\n    })\n    .next()\n    .click(function () {\n      that.sortSlide(that.cp.$current.prev(), -1);\n      return false;\n    })\n    .next()\n    .click(function () {\n      that.sortSlide(that.cp.$current.next(), 1);\n      return false;\n    })\n    .next()\n    .click(function () {\n      var removeIndex = that.cp.$current.index();\n      var removed = that.removeSlide();\n      if (removed !== false) {\n        that.trigger('removeSlide', removeIndex);\n      }\n      that.updateSlidesSidebar();\n      return false;\n    });\n\n  if (this.cp.activeSurface) {\n    \/\/ Enable adjustments\n    this.cp.$container.addClass('h5p-active-surface');\n\n    \/\/ Remove navigation\n    this.cp.$progressbar.remove();\n  }\n\n  \/\/ Relay window resize to CP view\n  H5P.$window.on('resize', function () {\n    that.cp.trigger('resize');\n  });\n\n  this.updateSlidesSidebar();\n};\n\nH5PEditor.CoursePresentation.prototype.addDNBButton = function (library) {\n  var that = this;\n  var id = library.name.split('.')[1].toLowerCase();\n\n  return {\n    id: id,\n    title: library.title,\n    createElement: function () {\n      return that.addElement(library.uberName);\n    }\n  };\n};\n\nH5PEditor.CoursePresentation.prototype.setContainerEm = function (containerEm) {\n  this.containerEm = containerEm;\n\n  if (this.dnb !== undefined && this.dnb.dnr !== undefined) {\n    this.dnb.dnr.setContainerEm(this.containerEm);\n  }\n};\n\n\/**\n * Initialize the drag and drop menu bar.\n *\n * @returns {undefined}\n *\/\nH5PEditor.CoursePresentation.prototype.initializeDNB = function () {\n  var that = this;\n\n  this.$bar = H5PEditor.$('<div class=\"h5p-dragnbar\">' + H5PEditor.t('H5PEditor.CoursePresentation', 'loading') + '<\/div>').insertBefore(this.cp.$boxWrapper);\n  var slides = H5PEditor.CoursePresentation.findField('slides', this.field.fields);\n  var elementFields = H5PEditor.CoursePresentation.findField('elements', slides.field.fields).field.fields;\n  var action = H5PEditor.CoursePresentation.findField('action', elementFields);\n  H5PEditor.LibraryListCache.getLibraries(action.options, function (libraries) {\n    that.libraries = libraries;\n    var buttons = [];\n    for (var i = 0; i < libraries.length; i++) {\n      if (libraries[i].restricted !== true) {\n        buttons.push(that.addDNBButton(libraries[i]));\n      }\n    }\n    \/\/ Add go to slide button\n    var goToSlide = H5PEditor.CoursePresentation.findField('goToSlide', elementFields);\n    if (goToSlide) {\n      buttons.splice(5, 0, {\n        id: 'gotoslide',\n        title: H5PEditor.t('H5PEditor.CoursePresentation', 'goToSlide'),\n        createElement: function () {\n          return that.addElement('GoToSlide');\n        }\n      });\n    }\n\n    that.dnb = new H5P.DragNBar(buttons, that.cp.$current, that.$editor, {$blurHandlers: that.cp.$boxWrapper});\n    that.$dnbContainer = that.cp.$current;\n    that.dnb.dnr.snap = 10;\n    that.dnb.dnr.setContainerEm(that.containerEm);\n\n    \/\/ Register all attached elements with dnb\n    that.elements.forEach(function (slide, slideIndex) {\n      slide.forEach(function (element, elementIndex) {\n        var elementParams = that.params.slides[slideIndex].elements[elementIndex];\n        var type = (elementParams.action ? elementParams.action.library.split(' ')[0] : null);\n\n        that.addToDragNBar(element, elementParams, {\n          disableResize: elementParams.displayAsButton,\n          lock: (type === 'H5P.Chart' && elementParams.action.params.graphMode === 'pieChart'),\n          cornerLock: (type === 'H5P.Image')\n        });\n      });\n    });\n\n    var reflowLoop;\n    var reflowInterval = 250;\n    var reflow = function () {\n      H5P.ContinuousText.Engine.run(that);\n      reflowLoop = setTimeout(reflow, reflowInterval);\n    };\n\n    \/\/ Resizing listener\n    that.dnb.dnr.on('startResizing', function () {\n      var elementParams = that.params.slides[that.cp.$current.index()].elements[that.dnb.$element.index()];\n\n      \/\/ Check for continuous text\n      if (elementParams.action && elementParams.action.library.split(' ')[0] === 'H5P.ContinuousText') {\n        reflowLoop = setTimeout(reflow, reflowInterval);\n      }\n    });\n\n    \/\/ Resizing has stopped\n    that.dnb.dnr.on('stoppedResizing', function () {\n      var elementParams = that.params.slides[that.cp.$current.index()].elements[that.dnb.$element.index()];\n\n      \/\/ Store new element position\n      elementParams.width = that.dnb.$element.width() \/ (that.cp.$current.innerWidth() \/ 100);\n      elementParams.height = that.dnb.$element.height() \/ (that.cp.$current.innerHeight() \/ 100);\n      elementParams.y = ((parseFloat(that.dnb.$element.css('top')) \/ that.cp.$current.innerHeight()) * 100);\n      elementParams.x = ((parseFloat(that.dnb.$element.css('left')) \/ that.cp.$current.innerWidth()) * 100);\n\n      \/\/ Stop reflow loop and run one last reflow\n      if (elementParams.action && elementParams.action.library.split(' ')[0] === 'H5P.ContinuousText') {\n        clearTimeout(reflowLoop);\n        H5P.ContinuousText.Engine.run(that);\n      }\n\n      \/\/ Trigger element resize\n      var elementInstance = that.cp.elementInstances[that.cp.$current.index()][that.dnb.$element.index()];\n      H5P.trigger(elementInstance, 'resize');\n    });\n\n    \/\/ Update params when the element is dropped.\n    that.dnb.stopMovingCallback = function (x, y) {\n      var params = that.params.slides[that.cp.$current.index()].elements[that.dnb.$element.index()];\n      params.x = x;\n      params.y = y;\n    };\n\n    \/\/ Update params when the element is moved instead, to prevent timing issues.\n    that.dnb.dnd.moveCallback = function (x, y) {\n      var params = that.params.slides[that.cp.$current.index()].elements[that.dnb.$element.index()];\n      params.x = x;\n      params.y = y;\n\n      that.dnb.updateCoordinates();\n    };\n\n    \/\/ Edit element when it is dropped.\n    that.dnb.dnd.releaseCallback = function () {\n      var params = that.params.slides[that.cp.$current.index()].elements[that.dnb.$element.index()];\n      var element = that.elements[that.cp.$current.index()][that.dnb.$element.index()];\n\n      if (that.dnb.newElement) {\n        that.cp.$boxWrapper.add(that.cp.$boxWrapper.find('.h5p-presentation-wrapper:first')).css('overflow', '');\n\n        if (params.action !== undefined && H5P.libraryFromString(params.action.library).machineName === 'H5P.ContinuousText') {\n          H5P.ContinuousText.Engine.run(that);\n          if (!that.params.ct) {\n            \/\/ No CT text but there could be elements\n            var CTs = that.getCTs(false, true);\n            if (CTs.length === 1) {\n              \/\/ First element, open form\n              that.showElementForm(element, that.dnb.$element, params);\n            }\n          }\n        }\n        else {\n          that.showElementForm(element, that.dnb.$element, params);\n        }\n      }\n    };\n\n    \/**\n     * @private\n     * @param {string} lib uber name\n     * @returns {boolean}\n     *\/\n    var supported = function (lib) {\n      for (var i = 0; i < libraries.length; i++) {\n        if (libraries[i].restricted !== true && libraries[i].uberName === lib) {\n          return true; \/\/ Library is supported and allowed\n        }\n      }\n\n      return false;\n    };\n\n    that.dnb.on('paste', function (event) {\n      var pasted = event.data;\n      var options = {\n        width: pasted.width,\n        height: pasted.height,\n        pasted: true\n      };\n\n      if (pasted.from === H5PEditor.CoursePresentation.clipboardKey) {\n        \/\/ Pasted content comes from the same version of CP\n\n        if (!pasted.generic) {\n          \/\/ Non generic part, must be content like gotoslide or similar\n          that.dnb.focus(that.addElement(pasted.specific, options));\n        }\n        else if (supported(pasted.generic.library)) {\n          \/\/ Special case for ETA - can't copy the index, then export won't include\n          \/\/ the original, since they will have the same index.\n          if (pasted.generic.library.split(' ')[0] === 'H5P.ExportableTextArea') {\n            delete pasted.generic.params.index;\n          }\n          \/\/ Has generic part and the generic libray is supported\n          that.dnb.focus(that.addElement(pasted.specific, options));\n        }\n        else {\n          alert(H5PEditor.t('H5P.DragNBar', 'unableToPaste'));\n        }\n      }\n      else if (pasted.generic) {\n        if (supported(pasted.generic.library)) {\n          \/\/ Supported library from another content type)\n\n          if (pasted.specific.displayType === 'button') {\n            \/\/ Make sure buttons from IV  still are buttons.\n            options.displayAsButton = true;\n          }\n          options.action = pasted.generic;\n          that.dnb.focus(that.addElement(pasted.generic.library, options));\n        }\n        else {\n          alert(H5PEditor.t('H5P.DragNBar', 'unableToPaste'));\n        }\n      }\n    });\n\n    that.dnb.attach(that.$bar);\n\n    \/\/ Bind keyword interactions.\n    that.initKeywordInteractions();\n\n    \/\/ Trigger event\n    that.trigger('librariesReady');\n  });\n};\n\n\/**\n * Create HTML for the field.\n *\/\nH5PEditor.CoursePresentation.prototype.createHtml = function () {\n  return H5PEditor.createFieldMarkup(this.field, '<div class=\"editor\"><\/div>');\n};\n\n\/**\n * Validate the current field.\n *\/\nH5PEditor.CoursePresentation.prototype.validate = function () {\n  \/\/ Validate all form elements\n  var valid = true;\n  var firstCT = true;\n  for (var i = 0; i < this.elements.length; i++) {\n    if (!this.elements[i]) {\n      continue;\n    }\n    for (var j = 0; j < this.elements[i].length; j++) {\n      \/\/ We must make sure form values are stored if the dialog was never closed\n      var elementParams = this.params.slides[i].elements[j];\n      var isCT = (elementParams.action !== undefined && elementParams.action.library.split(' ')[0] === 'H5P.ContinuousText');\n      if (isCT && !firstCT) {\n        continue; \/\/ Only need to process the first CT\n      }\n\n      \/\/ Validate element form\n      for (var k = 0; k < this.elements[i][j].children.length; k++) {\n        if (this.elements[i][j].children[k].validate() === false && valid) {\n          valid = false;\n        }\n      }\n\n      if (isCT) {\n        if (!this.params.ct) {\n          \/\/ Store complete text in CT param\n          this.params.ct = elementParams.action.params.text;\n        }\n        firstCT = false;\n      }\n    }\n  }\n  valid &= this.backgroundSelector.validate();\n\n  \/\/ Distribute CT text across elements\n  H5P.ContinuousText.Engine.run(this);\n  return valid;\n};\n\n\/**\n * Remove this item.\n *\/\nH5PEditor.CoursePresentation.prototype.remove = function () {\n  if (this.dnb !== undefined) {\n    this.dnb.remove();\n  }\n  this.$item.remove();\n};\n\n\/**\n * Initialize keyword interactions.\n *\n * @returns {undefined} Nothing\n *\/\nH5PEditor.CoursePresentation.prototype.initKeywordInteractions = function () {\n  var that = this;\n  \/\/ Add our own menu to the drag and drop menu bar.\n  that.$keywordsDNB = H5PEditor.$(\n    '<ul class=\"h5p-dragnbar-ul h5p-dragnbar-left\">' +\n      '<li class=\"h5p-slides-menu\">' +\n        '<div title=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'slides') + '\" class=\"h5p-dragnbar-keywords\" role=\"button\" tabindex=\"0\">' +\n          '<span>' + H5PEditor.t('H5PEditor.CoursePresentation', 'slides') + '<\/span>' +\n        '<\/div>' +\n        '<div class=\"h5p-keywords-dropdown\">' +\n          '<label class=\"h5p-keywords-enable\">' +\n            '<input type=\"checkbox\"\/>' +\n            H5PEditor.t('H5PEditor.CoursePresentation', 'showTitles') +\n          '<\/label>' +\n          '<label class=\"h5p-keywords-always\"><input type=\"checkbox\"\/>' + H5PEditor.t('H5PEditor.CoursePresentation', 'alwaysShow') + '<\/label>' +\n          '<label class=\"h5p-keywords-hide\"><input type=\"checkbox\"\/>' + H5PEditor.t('H5PEditor.CoursePresentation', 'autoHide') + '<\/label>' +\n          '<label class=\"h5p-keywords-opacity\"><input type=\"text\"\/> % ' + H5PEditor.t('H5PEditor.CoursePresentation', 'opacity') + '<\/label>' +\n          '<div class=\"h5peditor-button h5peditor-button-textual importance-low\" role=\"button\" tabindex=\"0\" aria-disabled=\"false\">' +\n            H5PEditor.t('H5PEditor.CoursePresentation', 'ok') +\n          '<\/div>' +\n        '<\/div>' +\n      '<\/li>' +\n    '<\/ul>').prependTo(this.$bar);\n\n  that.initKeywordMenu();\n\n  \/\/ Make keywords drop down menu come alive\n  var $slidesMenu = this.$bar.find('.h5p-dragnbar-keywords');\n  var $dropdown = this.$bar.find('.h5p-keywords-dropdown');\n  var preventClose = false;\n  var closeDropdown = function () {\n    if (preventClose) {\n      preventClose = false;\n    }\n    else {\n      $slidesMenu.removeClass('h5p-open');\n      $dropdown.removeClass('h5p-open');\n      that.cp.$container.off('click', closeDropdown);\n    }\n  };\n\n  $dropdown.find('.h5peditor-button').click(closeDropdown);\n\n  \/\/ Make sure keywords settings and button is hidden on load if disabled\n  if (!this.params.keywordListEnabled) {\n    $dropdown.children().first().siblings().hide().last().show();\n    that.cp.$keywordsButton.hide();\n  }\n\n  \/\/ Open dropdown when clicking the dropdown button\n  $slidesMenu.click(function () {\n    if (!$dropdown.hasClass('h5p-open')) {\n      that.cp.$container.on('click', closeDropdown);\n      $slidesMenu.addClass('h5p-open');\n      $dropdown.addClass('h5p-open');\n      preventClose = true;\n    }\n  });\n\n  \/\/ Prevent closing when clicking on the dropdown dialog it self\n  $dropdown.click(function () {\n    preventClose = true;\n  });\n\n  \/\/ Enable keywords list\n  var $enableKeywords = this.$bar.find('.h5p-keywords-enable input').change(function () {\n    that.params.keywordListEnabled = $enableKeywords.is(':checked');\n    if (that.params.keywordListEnabled) {\n      if (that.params.keywordListAlwaysShow) {\n        that.cp.$keywordsWrapper.show().add(that.cp.$keywordsButton).addClass('h5p-open');\n        that.cp.$keywordsButton.hide();\n      }\n      else {\n        that.cp.$keywordsWrapper.add(that.cp.$keywordsButton).show();\n      }\n      ns.$(this).parent().siblings().show();\n    }\n    else {\n      that.cp.$keywordsWrapper.add(that.cp.$keywordsButton).hide();\n      ns.$(this).parent().siblings().hide().last().show();\n    }\n  });\n\n  \/\/ Always show keywords list\n  var $alwaysKeywords = this.$bar.find('.h5p-keywords-always input').change(function () {\n    var checked = $alwaysKeywords.is(':checked');\n\n    that.params.keywordListAlwaysShow = checked;\n\n    if (checked) {\n      \/\/ Disable auto hide\n      that.params.keywordListAutoHide = false;\n      that.$bar.find('.h5p-keywords-hide input')\n        .attr('checked', false)\n        .attr(\"disabled\", true)\n        .parent().addClass('h5p-disabled');\n    }\n    else {\n      that.$bar.find('.h5p-keywords-hide input')\n        .attr(\"disabled\", false)\n        .parent().removeClass('h5p-disabled');\n    }\n\n    if (!that.params.keywordListEnabled) {\n      that.cp.hideKeywords();\n      that.cp.$keywordsButton.hide();\n      return;\n    }\n    else if (!that.params.keywordListAlwaysShow) {\n      that.cp.$keywordsButton.show();\n    }\n    if (that.params.keywordListAlwaysShow) {\n      that.cp.$keywordsButton.hide();\n      that.cp.showKeywords();\n    }\n    else if (that.params.keywordListEnabled) {\n      that.cp.$keywordsButton.show();\n      that.cp.showKeywords();\n    }\n  });\n\n  \/\/ Auto hide keywords list\n  var $hideKeywords = this.$bar.find('.h5p-keywords-hide input').change(function () {\n    that.params.keywordListAutoHide = $hideKeywords.is(':checked');\n  });\n\n  \/\/ Opacity for keywords list\n  var $opacityKeywords = this.$bar.find('.h5p-keywords-opacity input').change(function () {\n    var opacity = parseInt($opacityKeywords.val());\n    if (isNaN(opacity)) {\n      opacity = 90;\n    }\n    if (opacity > 100) {\n      opacity = 100;\n    }\n    if (opacity < 0) {\n      opacity = 0;\n    }\n    that.params.keywordListOpacity = opacity;\n    that.cp.setKeywordsOpacity(opacity);\n  });\n\n  \/**\n   * Help set default values if undefined.\n   *\n   * @private\n   * @param {String} option\n   * @param {*} defaultValue\n   *\/\n  var checkDefault = function (option, defaultValue) {\n    if (that.params[option] === undefined) {\n      that.params[option] = defaultValue;\n    }\n  };\n\n  \/\/ Set defaults if undefined\n  checkDefault('keywordListEnabled', true);\n  checkDefault('keywordListAlwaysShow', false);\n  checkDefault('keywordListAutoHide', false);\n  checkDefault('keywordListOpacity', 90);\n\n  \/\/ Update HTML\n  $enableKeywords.attr('checked', that.params.keywordListEnabled);\n  $alwaysKeywords.attr('checked', that.params.keywordListAlwaysShow);\n  $hideKeywords.attr('checked', that.params.keywordListAutoHide);\n  $opacityKeywords.val(that.params.keywordListOpacity);\n};\n\n\/**\n * Initiates the keyword menu\n *\/\nH5PEditor.CoursePresentation.prototype.initKeywordMenu = function () {\n  var that = this;\n  \/\/ Keyword events\n  var keywordClick = function (event) {\n    \/\/ Convert keywords into text areas when clicking.\n    if (that.editKeyword(H5PEditor.$(this)) !== false) {\n      event.stopPropagation();\n      H5PEditor.$(event.target).parent().addClass('h5p-editing');\n    }\n  };\n\n  \/\/ Make existing keywords editable\n  this.cp.$keywords.find('.h5p-keyword-title').click(keywordClick);\n};\n\n\n\/**\n * Adds slide after current slide.\n *\n * @param {object} slideParams\n * @returns {undefined} Nothing\n *\/\nH5PEditor.CoursePresentation.prototype.addSlide = function (slideParams) {\n  var that = this;\n\n  if (slideParams === undefined) {\n    \/\/ Set new slide params\n    slideParams = {\n      elements: [],\n      keywords: []\n    };\n  }\n\n  var index = this.cp.$current.index() + 1;\n  this.params.slides.splice(index, 0, slideParams);\n  this.elements.splice(index, 0, []);\n  this.cp.elementInstances.splice(index, 0, []);\n  this.cp.elementsAttached.splice(index, 0, []);\n\n  \/\/ Add slide with elements\n  var $slide = H5P.jQuery(H5P.CoursePresentation.createSlide(slideParams)).insertAfter(this.cp.$current);\n  that.trigger('addedSlide', index);\n  this.cp.addElements(slideParams, $slide, index);\n\n  this.cp.updateKeywordMenuFromSlides();\n  this.initKeywordMenu();\n\n  \/\/ Update progressbar\n  this.updateNavigationLine(index);\n\n  \/\/ Switch to the new slide.\n  this.cp.nextSlide();\n};\n\nH5PEditor.CoursePresentation.prototype.updateNavigationLine = function (index) {\n  var that = this;\n  \/\/ Update slides with solutions.\n  var hasSolutionArray = [];\n  this.cp.slides.forEach(function (instanceArray, slideNumber) {\n    var isTaskWithSolution = false;\n\n    if (that.cp.elementInstances[slideNumber] !== undefined && that.cp.elementInstances[slideNumber].length) {\n      that.cp.elementInstances[slideNumber].forEach(function (elementInstance) {\n        if (that.cp.checkForSolutions(elementInstance)) {\n          isTaskWithSolution = true;\n        }\n      });\n    }\n\n    if (isTaskWithSolution) {\n      hasSolutionArray.push([[isTaskWithSolution]]);\n    } else {\n      hasSolutionArray.push([]);\n    }\n  });\n\n  \/\/ Update progressbar and footer\n  this.cp.navigationLine.initProgressbar(hasSolutionArray);\n  this.cp.navigationLine.updateProgressBar(index);\n  this.cp.navigationLine.updateFooter(index);\n};\n\n\/**\n * Remove the current slide\n *\n * @returns {Boolean} Indicates success\n *\/\nH5PEditor.CoursePresentation.prototype.removeSlide = function () {\n  var index = this.cp.$current.index();\n  var $remove = this.cp.$current.add(this.cp.$currentKeyword);\n  var isRemovingDnbContainer = this.cp.$current.index() === this.$dnbContainer.index();\n\n  \/\/ Confirm\n  if (!confirm(H5PEditor.t('H5PEditor.CoursePresentation', 'confirmDeleteSlide'))) {\n    return false;\n  }\n\n  \/\/ Remove elements from slide\n  var slideKids = this.elements[index];\n  if (slideKids !== undefined) {\n    for (var i = 0; i < slideKids.length; i++) {\n      this.removeElement(slideKids[i], slideKids[i].$wrapper, this.cp.elementInstances[index][i].libraryInfo && this.cp.elementInstances[index][i].libraryInfo.machineName === 'H5P.ContinuousText');\n    }\n  }\n  this.elements.splice(index, 1);\n\n  \/\/ Change slide\n  var move = this.cp.previousSlide() ? -1 : (this.cp.nextSlide(true) ? 0 : undefined);\n\n  \/\/ Replace existing DnB container used for calculating dimensions of elements\n  if (isRemovingDnbContainer) {\n    \/\/ Set new dnb container\n    this.$dnbContainer = this.cp.$current;\n    this.dnb.setContainer(this.$dnbContainer);\n  }\n  if (move === undefined) {\n    return false; \/\/ No next or previous slide\n  }\n\n  \/\/ ExportableTextArea needs to know about the deletion:\n  H5P.ExportableTextArea.CPInterface.onDeleteSlide(index);\n\n  \/\/ Update presentation params.\n  this.params.slides.splice(index, 1);\n\n  \/\/ Update the list of element instances\n  this.cp.elementInstances.splice(index, 1);\n  this.cp.elementsAttached.splice(index, 1);\n\n  this.cp.updateKeywordMenuFromSlides();\n  this.initKeywordMenu();\n  this.updateNavigationLine(index + move);\n\n  \/\/ Remove visuals.\n  $remove.remove();\n\n  H5P.ContinuousText.Engine.run(this);\n};\n\n\/**\n * Animate navigation line slide icons when the slides are sorted\n *\n * @param {number} direction 1 for next, -1 for prev.\n *\/\nH5PEditor.CoursePresentation.prototype.animateNavigationLine = function (direction) {\n  var that = this;\n\n  var $selectedProgressPart = that.cp.$progressbar.find('.h5p-progressbar-part-selected');\n  $selectedProgressPart.css('transform', 'translateX(' + (-100 * direction) + '%)');\n\n  var $selectedNext = (direction == 1 ? $selectedProgressPart.prev() : $selectedProgressPart.next());\n  $selectedNext.css('transform', 'translateX(' + (100 * direction) + '%)');\n\n  setTimeout(function () { \/\/ Next tick triggers animation\n    $selectedProgressPart.add($selectedNext).css('transform', '');\n  }, 0);\n};\n\n\/**\n * Update the slides sidebar\n *\/\nH5PEditor.CoursePresentation.prototype.updateSlidesSidebar = function () {\n  var self = this;\n  var $keywords = this.cp.$keywords.children();\n\n  \/\/ Update the sub titles\n  $keywords.each(function (index) {\n\n    var $keyword = H5PEditor.$(this);\n\n    $keyword.find('.h5p-keyword-subtitle').html(self.cp.l10n.slide + ' ' + (index + 1));\n    $keyword.find('.joubel-icon-edit').remove();\n\n    var $editIcon = H5PEditor.$(\n      '<a href=\"#\" class=\"joubel-icon-edit h5p-hidden\" title=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'edit') + '\" tabindex=\"0\">' +\n        '<span class=\"h5p-icon-circle\"><\/span>' +\n        '<span class=\"h5p-icon-pencil\"><\/span>' +\n      '<\/a>')\n    .click(function() {\n      \/\/ If clicked is not already active, do a double click\n      if (!H5PEditor.$(this).parents('[role=\"menuitem\"]').hasClass('h5p-current')) {\n        H5PEditor.$(this).siblings('span').click().click();\n      }\n      else {\n        H5PEditor.$(this).siblings('span').click();\n      }\n      $editIcon.siblings('textarea').select();\n      return false;\n    }).keydown(function (event) {\n      if ([13,32].indexOf(event.which) !== -1) {\n        H5PEditor.$(this).click();\n        return false;\n      }\n\n      \/\/ Ignore arrow keys for now to avoid JS-error\n      if (event.which >= 37 && event.which <= 40) {\n        return false;\n      }\n    }).blur(function() {\n      $editIcon.addClass('h5p-hidden');\n    })\n    .appendTo($keywords.eq(index));\n\n    H5PEditor.$(this).focus(function() {\n      $editIcon.removeClass('h5p-hidden');\n    })\n    .hover(function() {\n      if (!H5PEditor.$(this).hasClass('h5p-editing')) {\n        $editIcon.removeClass('h5p-hidden');\n      }\n    })\n    .mouseleave(function() {\n      $editIcon.addClass('h5p-hidden');\n    })\n    .blur(function(e) {\n      if (e.relatedTarget && e.relatedTarget.className !== 'joubel-icon-edit' || !e.relatedTarget) {\n        $editIcon.addClass('h5p-hidden');\n      }\n    });\n  });\n};\n\n\/**\n * Sort current slide in the given direction.\n *\n * @param {H5PEditor.$} $element The next\/prev slide.\n * @param {int} direction 1 for next, -1 for prev.\n * @returns {Boolean} Indicates success.\n *\/\nH5PEditor.CoursePresentation.prototype.sortSlide = function ($element, direction) {\n  if (!$element.length) {\n    return false;\n  }\n\n  var index = this.cp.$current.index();\n  var keywordsEnabled = this.cp.$currentKeyword !== undefined;\n\n  \/\/ Move slides and keywords.\n  if (direction === -1) {\n    this.cp.$current.insertBefore($element.removeClass('h5p-previous'));\n    if (keywordsEnabled) {\n      var $prev = this.cp.$currentKeyword.prev();\n      this.cp.$currentKeyword.insertBefore($prev);\n      this.swapIndexes(this.cp.$currentKeyword, $prev);\n    }\n  }\n  else {\n    this.cp.$current.insertAfter($element.addClass('h5p-previous'));\n    if (keywordsEnabled) {\n      var $next = this.cp.$currentKeyword.next();\n      this.cp.$currentKeyword.insertAfter($next);\n      this.swapIndexes(this.cp.$currentKeyword, $next);\n    }\n  }\n\n  if (keywordsEnabled) {\n    this.cp.keywordMenu.scrollToKeywords();\n  }\n\n  \/\/ Jump to sorted slide number\n  var newIndex = index + direction;\n  this.cp.jumpToSlide(newIndex);\n\n  \/\/ Need to inform exportable text area about the change:\n  H5P.ExportableTextArea.CPInterface.changeSlideIndex(direction > 0 ? index : index-1, direction > 0 ? index+1 : index);\n\n  \/\/ Update params.\n  this.params.slides.splice(newIndex, 0, this.params.slides.splice(index, 1)[0]);\n  this.elements.splice(newIndex, 0, this.elements.splice(index, 1)[0]);\n  this.cp.elementInstances.splice(newIndex, 0, this.cp.elementInstances.splice(index, 1)[0]);\n  this.cp.elementsAttached.splice(newIndex, 0, this.cp.elementsAttached.splice(index, 1)[0]);\n\n  this.updateNavigationLine(newIndex);\n  H5P.ContinuousText.Engine.run(this);\n  this.updateSlidesSidebar();\n\n  this.animateNavigationLine(direction);\n  this.trigger('sortSlide', direction);\n\n  return true;\n};\n\n\/**\n * Swaps the [data-index] values of two elements\n *\n * @param {jQuery} $current\n * @param {jQuery} $other\n *\/\nH5PEditor.CoursePresentation.prototype.swapIndexes = function ($current, $other) {\n  var currentIndex = $current.attr('data-index');\n  var otherIndex = $other.attr('data-index');\n  $current.attr('data-index', otherIndex);\n  $other.attr('data-index', currentIndex);\n};\n\n\/**\n * Edit keyword.\n *\n * @param {H5PEditor.$} $span Keyword wrapper.\n * @returns {unresolved} Nothing\n *\/\nH5PEditor.CoursePresentation.prototype.editKeyword = function ($span) {\n  var that = this;\n\n  var $li = $span.parent();\n  if (!$li.hasClass('h5p-current')) {\n    return false; \/\/ Can only edit title for the current slide\n  }\n\n  var oldTitle = $span.text(); \/\/ Used for reset \/ cancel\n  var slideIndex = that.cp.$current.index();\n  if (!that.params.slides[slideIndex].keywords || !that.params.slides[slideIndex].keywords.length) {\n    oldTitle = ''; \/\/ Prevent editing 'No title' string\n  }\n\n  var $delete = H5PEditor.$(\n    '<a href=\"#\" class=\"joubel-icon-cancel\" title=\"' + H5PEditor.t('H5PEditor.CoursePresentation', 'cancel') + '\">' +\n      '<span class=\"h5p-icon-circle\"><\/span>' +\n      '<span class=\"h5p-icon-cross\"><\/span>' +\n    '<\/a>');\n\n  var $textarea = H5PEditor.$('<textarea><\/textarea>')\n    .val(oldTitle)\n    .insertBefore($span.hide())\n    .keydown(function (event) {\n      if (event.keyCode === 13) {\n        $textarea.blur();\n        $li.focus();\n        return false;\n      }\n\n      \/\/ don't propagate key events from textarea\n      event.stopPropagation();\n    }).keyup(function () {\n      $textarea.css('height', $textarea[0].scrollHeight);\n    }).blur(function (event) {\n      if (event.relatedTarget && event.relatedTarget.className !== 'joubel-icon-cancel' || !event.relatedTarget) {\n        var keyword = $textarea.val(); \/\/ Text not HTML\n\n        that.updateKeyword(keyword, slideIndex, $span.html());\n\n        \/\/ Remove textarea\n        $li.removeClass('h5p-editing');\n        $span.css({'display': 'inline-block'});\n        $textarea.add($delete).remove();\n      }\n    }).focus();\n\n  $textarea.keyup();\n\n  $delete.insertAfter($textarea).click(function(e) {\n    e.preventDefault();\n    $textarea.val(oldTitle).blur();\n    H5PEditor.$('[role=\"menuitem\"].h5p-current').focus();\n  }).keydown(function (e) {\n    if ([32,13].indexOf(e.which) !== -1) {\n      H5PEditor.$(this).click();\n      return false;\n    }\n    \/\/ Ignore arrow keys for now to avoid JS-error\n    if (event.which >= 37 && event.which <= 40) {\n      return false;\n    }\n  }).blur(function(e) {\n    if (e.relatedTarget && e.relatedTarget.tagName !== 'TEXTAREA' || !e.relatedTarget) {\n      $textarea.blur();\n    }\n  });\n};\n\n\/**\n * Updates the configs with the new keyword\n *\n * @param {string} keyword\n * @param {number} slideIndex\n * @param {string} oldTitle\n *\/\nH5PEditor.CoursePresentation.prototype.updateKeyword = function (keyword, slideIndex, oldTitle) {\n  var that = this;\n  var hasTitle = true;\n\n  if (H5P.trim(keyword) === '') {\n    \/\/ Title is blank, use placeholder text\n    keyword = that.cp.l10n.noTitle;\n    hasTitle = false;\n  }\n\n  \/\/ Update navigation bar display?\n  that.cp.progressbarParts[slideIndex].data('keyword', oldTitle);\n\n  \/\/ Update keywords button\n  H5PEditor.$('.current-slide-title').html(oldTitle);\n\n  \/\/ Update params\n  if (hasTitle) {\n    that.params.slides[slideIndex].keywords = [{\n      main: keyword\n    }];\n  }\n  else {\n    delete that.params.slides[slideIndex].keywords;\n  }\n\n  \/\/ Update keyword list item\n  H5PEditor.$('[role=\"menuitem\"].h5p-current .h5p-keyword-title').text(keyword);\n};\n\n\/**\n * Generate element form.\n *\n * @param {Object} elementParams\n * @param {String} type\n * @returns {Object}\n *\/\nH5PEditor.CoursePresentation.prototype.generateForm = function (elementParams, type) {\n  var self = this;\n\n  if (type === 'H5P.ContinuousText' && self.ct) {\n    \/\/ Continuous Text shares a single form across all elements\n    return {\n      '$form': self.ct.element.$form,\n      children: self.ct.element.children\n    };\n  }\n\n  \/\/ Get semantics for the elements field\n  var slides = H5PEditor.CoursePresentation.findField('slides', this.field.fields);\n  var elementFields = H5PEditor.$.extend(true, [], H5PEditor.CoursePresentation.findField('elements', slides.field.fields).field.fields);\n\n  \/\/ Manipulate semantics into only using a given set of fields\n  if (type === 'goToSlide') {\n    \/\/ Hide all others\n    self.showFields(elementFields, ['title', 'goToSlide', 'goToSlideType', 'invisible']);\n  }\n  else {\n    var hideFields = ['title', 'goToSlide', 'goToSlideType', 'invisible'];\n\n    if (type === 'H5P.ContinuousText' || type === 'H5P.Audio') {\n      \/\/ Continuous Text or Go To Slide cannot be displayed as a button\n      hideFields.push('displayAsButton');\n      hideFields.push('buttonSize');\n    }\n\n    \/\/ Only display goToSlide field for goToSlide elements\n    self.hideFields(elementFields, hideFields);\n  }\n\n  var element = {\n    '$form': H5P.jQuery('<div\/>')\n  };\n\n  \/\/ Find title for form (used by popup dialog)\n  self.findElementTitle(type, function (title) {\n    element.$form.attr('title', H5PEditor.t('H5PEditor.CoursePresentation', 'popupTitle', {':type': title}));\n  });\n\n  \/\/ Render element fields\n  H5PEditor.processSemanticsChunk(elementFields, elementParams, element.$form, self);\n  element.children = self.children;\n\n  \/\/ Hide library selector\n  element.$form.children('.library:first').children('label, select').hide().end().children('.libwrap').css('margin-top', '0');\n\n  \/\/ Show or hide button size dropdown depending on display as button checkbox\n  element.$form.find('.field-name-displayAsButton').each(function() { \/\/ TODO: Use showWhen in semantics.json instead\u2026\n    var buttonSizeField = ns.$(this).parent().find('.field-name-buttonSize');\n\n    if (!ns.$(this).find(\"input\")[0].checked) {\n      buttonSizeField.addClass(\"h5p-hidden2\");\n    }\n\n    ns.$(this).find(\"input\").change(function(e) {\n      if (e.target.checked) {\n        buttonSizeField.removeClass(\"h5p-hidden2\");\n      } else {\n        buttonSizeField.addClass(\"h5p-hidden2\");\n      }\n    });\n  });\n\n  \/\/ Set correct aspect ratio on new images.\n  \/\/ TODO: Do not use\/rely on magic numbers!\n  var library = element.children[4];\n  if (!(library instanceof H5PEditor.None)) {\n    var libraryChange = function () {\n      if (library.children[0].field.type === 'image') {\n        library.children[0].changes.push(function (params) {\n          self.setImageSize(element, elementParams, params);\n        });\n      }\n    };\n    if (library.children === undefined) {\n      library.changes.push(libraryChange);\n    }\n    else {\n      libraryChange();\n    }\n  }\n\n  return element;\n};\n\n\/**\n * Help set size for new images and keep aspect ratio.\n *\n * @param {object} element\n * @param {object} elementParams\n * @param {object} fileParams\n *\/\nH5PEditor.CoursePresentation.prototype.setImageSize = function (element, elementParams, fileParams) {\n  if (fileParams === undefined || fileParams.width === undefined || fileParams.height === undefined) {\n    return;\n  }\n\n  \/\/ Avoid to small images\n  var minSize = parseInt(element.$wrapper.css('font-size')) +\n                element.$wrapper.outerHeight() -\n                element.$wrapper.innerHeight();\n\n  \/\/ Use minSize\n  if (fileParams.width < minSize) {\n    fileParams.width = minSize;\n  }\n  if (fileParams.height < minSize) {\n    fileParams.height = minSize;\n  }\n\n  \/\/ Reduce height for tiny images, stretched pixels looks horrible\n  var suggestedHeight = fileParams.height \/ (this.cp.$current.innerHeight() \/ 100);\n  if (suggestedHeight < elementParams.height) {\n    elementParams.height = suggestedHeight;\n  }\n\n  \/\/ Calculate new width\n  elementParams.width = (elementParams.height * (fileParams.width \/ fileParams.height)) \/ this.slideRatio;\n};\n\n\/**\n * Hide all fields in the given list. All others are shown.\n *\n * @param {Object[]} elementFields\n * @param {String[]} fields\n *\/\nH5PEditor.CoursePresentation.prototype.hideFields = function (elementFields, fields) {\n  \/\/ Find and hide fields in list\n  for (var i = 0; i < fields.length; i++) {\n    var field = H5PEditor.CoursePresentation.findField(fields[i], elementFields);\n    if (field) {\n      field.widget = 'none';\n    }\n  }\n};\n\n\/**\n * Show all fields in the given list. All others are hidden.\n *\n * @param {Object[]} elementFields\n * @param {String[]} fields\n *\/\nH5PEditor.CoursePresentation.prototype.showFields = function (elementFields, fields) {\n  \/\/ Find and hide all fields not in list\n  for (var i = 0; i < elementFields.length; i++) {\n    var field = elementFields[i];\n    var found = false;\n\n    for (var j = 0; j < fields.length; j++) {\n      if (field.name === fields[j]) {\n        found = true;\n        break;\n      }\n    }\n\n    if (!found) {\n      field.widget = 'none';\n    }\n  }\n};\n\n\/**\n * Find the title for the given element type.\n *\n * @param {String} type Element type\n * @param {Function} next Called when we've found the title\n *\/\nH5PEditor.CoursePresentation.prototype.findElementTitle = function (type, next) {\n  var self = this;\n\n  if (type === 'goToSlide') {\n    \/\/ Find field label\n    var slides = H5PEditor.CoursePresentation.findField('slides', this.field.fields);\n    var elements = H5PEditor.CoursePresentation.findField('elements', slides.field.fields);\n    var field = H5PEditor.CoursePresentation.findField(type, elements.field.fields);\n    next(field.label);\n  }\n  else if (type.substring(0,4) === 'H5P.') {\n    self.findLibraryTitle(type, next);\n  }\n  else {\n    \/\/ Generic\n    next(H5PEditor.t('H5PEditor.CoursePresentation', 'element'));\n  }\n};\n\n\/**\n* Find the title for the given library.\n*\n* @param {String} type Library name\n* @param {Function} next Called when we've found the title\n*\/\nH5PEditor.CoursePresentation.prototype.findLibraryTitle = function (library, next) {\n  var self = this;\n\n  \/** @private *\/\n  var find = function () {\n    for (var i = 0; i < self.libraries.length; i++) {\n      if (self.libraries[i].name === library) {\n        next(self.libraries[i].title);\n        return;\n      }\n    }\n  };\n\n  if (self.libraries === undefined) {\n    \/\/ Must wait until library titles are loaded\n    self.once('librariesReady', find);\n  }\n  else {\n    find();\n  }\n};\n\n\/**\n * Callback used by CP when a new element is added.\n *\n * @param {Object} elementParams\n * @param {jQuery} $wrapper\n * @param {Number} slideIndex\n * @param {Object} elementInstance\n * @returns {undefined}\n *\/\nH5PEditor.CoursePresentation.prototype.processElement = function (elementParams, $wrapper, slideIndex, elementInstance) {\n  var that = this;\n\n  \/\/ Detect type\n  var type;\n  if (elementParams.action !== undefined) {\n    type = elementParams.action.library.split(' ')[0];\n  }\n  else {\n    type = 'goToSlide';\n  }\n\n  \/\/ Find element identifier\n  var elementIndex = $wrapper.index();\n\n  \/\/ Generate element form\n  if (this.elements[slideIndex] === undefined) {\n    this.elements[slideIndex] = [];\n  }\n  if (this.elements[slideIndex][elementIndex] === undefined) {\n    this.elements[slideIndex][elementIndex] = this.generateForm(elementParams, type);\n  }\n\n  \/\/ Get element\n  var element = this.elements[slideIndex][elementIndex];\n  element.$wrapper = $wrapper;\n\n  H5P.jQuery('<div\/>', {\n    'class': 'h5p-element-overlay'\n  }).appendTo($wrapper);\n\n  if (that.dnb) {\n    that.addToDragNBar(element, elementParams, {\n      disableResize: elementParams.displayAsButton,\n      lock: (type === 'H5P.Chart' && elementParams.action.params.graphMode === 'pieChart'),\n      cornerLock: (type === 'H5P.Image')\n    });\n  }\n\n  \/\/ Open form dialog when double clicking element\n  $wrapper.dblclick(function () {\n    that.showElementForm(element, $wrapper, elementParams);\n  });\n\n  if (type === 'H5P.ContinuousText' && that.ct === undefined) {\n    \/\/ Keep track of first CT element!\n    that.ct = {\n      element: element,\n      params: elementParams\n    };\n  }\n\n  if (elementParams.pasted) {\n    if (type === 'H5P.ContinuousText') {\n      H5P.ContinuousText.Engine.run(this);\n    }\n\n    delete elementParams.pasted;\n  }\n\n  if (elementInstance.onAdd) {\n    \/\/ Some sort of callback event thing\n    elementInstance.onAdd(elementParams, slideIndex);\n  }\n};\n\n\/**\n * Make sure element can be moved and stop moving while resizing.\n *\n * @param {Object} element\n * @param {Object} elementParams\n * @param {Object} options\n * @returns {H5P.DragNBarElement}\n *\/\nH5PEditor.CoursePresentation.prototype.addToDragNBar = function(element, elementParams, options) {\n  var self = this;\n\n  var clipboardData = H5P.DragNBar.clipboardify(H5PEditor.CoursePresentation.clipboardKey, elementParams, 'action');\n  var dnbElement = self.dnb.add(element.$wrapper, clipboardData, options);\n  dnbElement.contextMenu.on('contextMenuEdit', function () {\n    self.showElementForm(element, element.$wrapper, elementParams);\n  });\n  element.$wrapper.find('*').attr('tabindex', '-1');\n\n  dnbElement.contextMenu.on('contextMenuRemove', function () {\n    if (!confirm(H5PEditor.t('H5PEditor.CoursePresentation', 'confirmRemoveElement'))) {\n      return;\n    }\n    if (H5PEditor.Html) {\n      H5PEditor.Html.removeWysiwyg();\n    }\n    self.removeElement(element, element.$wrapper, (elementParams.action !== undefined && H5P.libraryFromString(elementParams.action.library).machineName === 'H5P.ContinuousText'));\n    self.dnb.blurAll();\n  });\n\n  dnbElement.contextMenu.on('contextMenuBringToFront', function () {\n    \/\/ Old index\n    var oldZ = element.$wrapper.index();\n\n    \/\/ Current slide index\n    var slideIndex = self.cp.$current.index();\n\n    \/\/ Update visuals\n    element.$wrapper.appendTo(self.cp.$current);\n\n    \/\/ Find slide params\n    var slide = self.params.slides[slideIndex].elements;\n\n    \/\/ Remove from old pos\n    slide.splice(oldZ, 1);\n\n    \/\/ Add to top\n    slide.push(elementParams);\n\n    \/\/ Re-order elements in the same fashion\n    self.elements[slideIndex].splice(oldZ, 1);\n    self.elements[slideIndex].push(element);\n  });\n\n  dnbElement.contextMenu.on('contextMenuSendToBack', function () {\n    \/\/ Old index\n    var oldZ = element.$wrapper.index();\n\n    \/\/ Current slide index\n    var slideIndex = self.cp.$current.index();\n\n    \/\/ Update visuals\n    element.$wrapper.prependTo(self.cp.$current);\n\n    \/\/ Find slide params\n    var slide = self.params.slides[slideIndex].elements;\n\n    \/\/ Remove from old pos\n    slide.splice(oldZ, 1);\n\n    \/\/ Add to top\n    slide.unshift(elementParams);\n\n    \/\/ Re-order elements in the same fashion\n    self.elements[slideIndex].splice(oldZ, 1);\n    self.elements[slideIndex].unshift(element);\n  });\n\n  return dnbElement;\n};\n\n\/**\n * Removes element from slide.\n *\n * @param {Object} element\n * @param {jQuery} $wrapper\n * @param {Boolean} isContinuousText\n * @returns {undefined}\n *\/\nH5PEditor.CoursePresentation.prototype.removeElement = function (element, $wrapper, isContinuousText) {\n  var slideIndex = this.cp.$current.index();\n  var elementIndex = $wrapper.index();\n\n  var elementInstance = this.cp.elementInstances[slideIndex][elementIndex];\n  var removeForm = (element.children.length ? true : false);\n\n  if (isContinuousText) {\n    var CTs = this.getCTs(false, true);\n    if (CTs.length === 2) {\n      \/\/ Prevent removing form while there are still some CT elements left\n      removeForm = false;\n\n      if (element === CTs[0].element && CTs.length === 2) {\n        CTs[1].params.action.params = CTs[0].params.action.params;\n      }\n    }\n    else {\n      delete this.params.ct;\n      delete this.ct;\n    }\n  }\n\n  if (removeForm) {\n    H5PEditor.removeChildren(element.children);\n  }\n\n  \/\/ Completely remove element from CP\n  if (elementInstance.onDelete) {\n    elementInstance.onDelete(this.params, slideIndex, elementIndex);\n  }\n  this.elements[slideIndex].splice(elementIndex, 1);\n  this.cp.elementInstances[slideIndex].splice(elementIndex, 1);\n  this.params.slides[slideIndex].elements.splice(elementIndex, 1);\n\n  $wrapper.remove();\n\n  if (isContinuousText) {\n    H5P.ContinuousText.Engine.run(this);\n  }\n};\n\n\/**\n * Displays the given form in a popup.\n *\n * @param {jQuery} $form\n * @param {jQuery} $wrapper\n * @param {object} element Params\n * @returns {undefined}\n *\/\nH5PEditor.CoursePresentation.prototype.showElementForm = function (element, $wrapper, elementParams) {\n  var that = this;\n\n  \/\/ Determine element type\n  var machineName;\n  if (elementParams.action !== undefined) {\n    machineName = H5P.libraryFromString(elementParams.action.library).machineName;\n  }\n\n  \/\/ Special case for Continuous Text\n  var isContinuousText = (machineName === 'H5P.ContinuousText');\n  if (isContinuousText && that.ct) {\n    \/\/ Get CT text from storage\n    that.ct.element.$form.find('.text .ckeditor').first().html(that.params.ct);\n    that.ct.params.action.params.text = that.params.ct;\n  }\n\n  \/\/ Disable guided tour for IV\n  if (machineName === 'H5P.InteractiveVideo') {\n    \/\/ Recreate IV form, workaround for Youtube API not firing\n    \/\/ onStateChange when IV is reopened.\n    element = that.generateForm(elementParams, 'H5P.InteractiveVideo');\n  }\n\n  \/\/ Display dialog with form\n  element.$form.dialog({\n    modal: true,\n    draggable: false,\n    resizable: false,\n    width: '90%',\n    maxHeight: H5P.jQuery('.h5p-coursepresentation-editor').innerHeight(),\n    position: {my: 'top', at: 'top', of: '.h5p-coursepresentation-editor'},\n    dialogClass: \"h5p-dialog-no-close\",\n    appendTo: '.h5p-course-presentation',\n    buttons: [\n      {\n        text: H5PEditor.t('H5PEditor.CoursePresentation', 'remove'),\n        class: 'h5p-remove',\n        click: function () {\n          if (!confirm(H5PEditor.t('H5PEditor.CoursePresentation', 'confirmRemoveElement'))) {\n            return;\n          }\n          if (H5PEditor.Html) {\n            H5PEditor.Html.removeWysiwyg();\n          }\n          element.$form.dialog('close');\n          that.removeElement(element, $wrapper, isContinuousText);\n          that.dnb.blurAll();\n          that.dnb.preventPaste = false;\n        }\n      },\n      {\n        text: H5PEditor.t('H5PEditor.CoursePresentation', 'done'),\n        class: 'h5p-done',\n        click: function () {\n          \/\/ Validate \/ save children\n          for (var i = 0; i < element.children.length; i++) {\n            element.children[i].validate();\n          }\n\n          if (isContinuousText) {\n            \/\/ Store complete CT on slide 0\n            that.params.ct = that.ct.params.action.params.text;\n\n            \/\/ Split up text and place into CT elements\n            H5P.ContinuousText.Engine.run(that);\n\n            setTimeout(function () {\n              \/\/ Put focus back on ct element\n              that.dnb.focus($wrapper);\n            }, 1);\n          }\n          else {\n            that.redrawElement($wrapper, element, elementParams);\n          }\n\n          if (H5PEditor.Html) {\n            H5PEditor.Html.removeWysiwyg();\n          }\n          element.$form.dialog('close');\n          that.dnb.preventPaste = false;\n        }\n      }\n    ]\n  });\n\n  if (that.dnb !== undefined) {\n    that.dnb.preventPaste = true;\n    setTimeout(function () {\n      that.dnb.blurAll();\n    }, 0);\n  }\n\n  var library = element.children[4];\n  var focusFirstField = function () {\n    \/\/ Find the first ckeditor or texteditor field that is not hidden.\n    \/\/ h5p-editor dialog is copyright dialog\n    \/\/ h5p-dialog-box is IVs video choose dialog\n    H5P.jQuery('.ckeditor, .h5peditor-text', library.$myField)\n      .not('.h5p-editor-dialog .ckeditor, ' +\n      '.h5p-editor-dialog .h5peditor-text, ' +\n      '.h5p-dialog-box .ckeditor, ' +\n      '.h5p-dialog-box .h5peditor-text', library.$myField)\n      .eq(0)\n      .focus();\n  };\n  if (library instanceof ns.Library && library.currentLibrary === undefined) {\n    library.change(focusFirstField);\n  }\n  else {\n    focusFirstField();\n  }\n};\n\n\/**\n*\n*\/\nH5PEditor.CoursePresentation.prototype.redrawElement = function($wrapper, element, elementParams) {\n  var elementIndex = $wrapper.index();\n  var slideIndex = this.cp.$current.index();\n  var elementsParams = this.params.slides[slideIndex].elements;\n  var elements = this.elements[slideIndex];\n  var elementInstances = this.cp.elementInstances[slideIndex];\n\n  if (elementParams.action && elementParams.action.library.split(' ')[0] === 'H5P.Chart' &&\n      elementParams.action.params.graphMode === 'pieChart') {\n    elementParams.width = elementParams.height \/ this.slideRatio;\n  }\n\n  \/\/ Remove instance of lib:\n  elementInstances.splice(elementIndex, 1);\n\n  \/\/ Update params\n  elementsParams.splice(elementIndex, 1);\n  elementsParams.push(elementParams);\n\n  \/\/ Update elements\n  elements.splice(elementIndex, 1);\n  elements.push(element);\n\n  \/\/ Update visuals\n  $wrapper.remove();\n  var instance = this.cp.addElement(elementParams, this.cp.$current, slideIndex);\n  var $element = this.cp.attachElement(elementParams, instance, this.cp.$current, slideIndex);\n\n  \/\/ Make sure we're inside the container\n  this.fitElement($element, elementParams);\n\n  \/\/ Resize element.\n  instance = elementInstances[elementInstances.length - 1];\n  if ((instance.preventResize === undefined || instance.preventResize === false) && instance.$ !== undefined && !elementParams.displayAsButton) {\n    H5P.trigger(instance, 'resize');\n  }\n\n  var that = this;\n  setTimeout(function () {\n    \/\/ Put focus back on element\n    that.dnb.focus($element);\n  }, 1);\n};\n\n\/**\n * Applies the updated position and size properties to the given element.\n *\n * All properties are converted to percentage.\n *\n * @param {H5P.jQuery} $element\n * @param {Object} elementParams\n *\/\nH5PEditor.CoursePresentation.prototype.fitElement = function ($element, elementParams) {\n  var self = this;\n\n  var sizeNPosition = self.dnb.getElementSizeNPosition($element);\n  var updated = H5P.DragNBar.fitElementInside(sizeNPosition);\n\n  var pW = (sizeNPosition.containerWidth \/ 100);\n  var pH = (sizeNPosition.containerHeight \/ 100);\n\n  \/\/ Set the updated properties\n  var style = {};\n\n  if (updated.width !== undefined) {\n    elementParams.width = updated.width \/ pW;\n    style.width = elementParams.width + '%';\n  }\n  if (updated.left !== undefined) {\n    elementParams.x = updated.left \/ pW;\n    style.left = elementParams.x + '%';\n  }\n  if (updated.height !== undefined) {\n    elementParams.height = updated.height \/ pH;\n    style.height = elementParams.height + '%';\n  }\n  if (updated.top !== undefined) {\n    elementParams.y = updated.top \/ pH;\n    style.top = elementParams.y + '%';\n  }\n\n  \/\/ Apply style\n  $element.css(style);\n};\n\n\/**\n* Find ContinuousText elements.\n*\n* @param {Boolean} [firstOnly] Return first element only\n* @param {Boolean} [maxTwo] Return after two elements have been found\n* @returns {{Object[]|Object}}\n*\/\nH5PEditor.CoursePresentation.prototype.getCTs = function (firstOnly, maxTwo) {\n  var self = this;\n\n  var CTs = [];\n\n  for (var i = 0; i < self.elements.length; i++) {\n    var slideElements = self.elements[i];\n    if (!self.params.slides[i] || !self.params.slides[i].elements) {\n      continue;\n    }\n\n    for (var j = 0; slideElements !== undefined && j < slideElements.length; j++) {\n      var element = slideElements[j];\n      var params = self.params.slides[i].elements[j];\n      if (params.action !== undefined && params.action.library.split(' ')[0] === 'H5P.ContinuousText') {\n        CTs.push({\n          element: element,\n          params: params\n        });\n\n        if (firstOnly) {\n          return CTs[0];\n        }\n        if (maxTwo && CTs.length === 2) {\n          return CTs;\n        }\n      }\n    }\n  }\n\n  return firstOnly ? null : CTs;\n};\n\n\/**\n * Collect functions to execute once the tree is complete.\n *\n * @param {function} ready\n * @returns {undefined}\n *\/\nH5PEditor.CoursePresentation.prototype.ready = function (ready) {\n  if (this.passReadies) {\n    this.parent.ready(ready);\n  }\n  else {\n    this.readies.push(ready);\n  }\n};\n\n\/**\n * Look for field with the given name in the given collection.\n *\n * @param {String} name of field\n * @param {Array} fields collection to look in\n * @returns {Object} field object\n *\/\nH5PEditor.CoursePresentation.findField = function (name, fields) {\n  for (var i = 0; i < fields.length; i++) {\n    if (fields[i].name === name) {\n      return fields[i];\n    }\n  }\n};\n\n\/\/ Tell the editor what widget we are.\nH5PEditor.widgets.coursepresentation = H5PEditor.CoursePresentation;\n\n\/\/ Add translations\nH5PEditor.language[\"H5PEditor.CoursePresentation\"] = {\n  \"libraryStrings\": {\n    \"confirmDeleteSlide\": \"Are you sure you wish to delete this slide?\",\n    \"sortSlide\": \"Move slide :dir\",\n    \"backgroundSlide\": \"Slide background\",\n    \"removeSlide\": \"Delete slide\",\n    \"cloneSlide\": \"Clone slide\",\n    \"newSlide\": \"Add new slide\",\n    \"insertElement\": \"Click and drag to place :type\",\n    \"newKeyword\": \"New keyword\",\n    \"save\": \"Save\",\n    \"removeElement\": \"Remove this element\",\n    \"confirmRemoveElement\": \"Are you sure you wish to remove this element?\",\n    \"cancel\": \"Cancel\",\n    \"done\": \"Done\",\n    \"remove\": \"Remove\",\n    \"edit\": \"Edit\",\n    \"keywordsTip\": \"Drag in keywords using the two buttons above.\",\n    \"popupTitle\": \"Edit :type\",\n    \"loading\": \"Loading...\",\n    \"slides\": \"Slides\",\n    \"element\": \"Element\",\n    \"resetToDefault\": \"Reset to default\",\n    \"resetToTemplate\": \"Reset to template\",\n    \"slideBackground\": \"Slide background\",\n    \"setImageBackground\": \"Image background\",\n    \"setColorFillBackground\": \"Color fill background\",\n    \"activeSurfaceWarning\": \"Are you sure you want to activate Active Surface Mode? This action cannot be undone.\",\n    \"template\": \"Template\",\n    \"templateDescription\": \"Will be applied to all slides not overridden by any \\\":currentSlide\\\" settings.\",\n    \"currentSlide\": \"This slide\",\n    \"currentSlideDescription\": \"Will be applied to this slide only, and will override any \\\":template\\\" settings.\",\n    \"showTitles\": \"Show titles\",\n    \"alwaysShow\": \"Always show\",\n    \"autoHide\": \"Auto hide\",\n    \"ok\": \"OK\",\n    \"slide\": \"Slide\",\n    \"opacity\": \"Opacity\",\n    \"goToSlide\": \"Go to slide\"\n  }\n};\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/scripts\/slide-selector.js?ver=1.17.4":"\nH5PEditor.CoursePresentation.SlideSelector = (function ($, EventDispatcher) {\n\n  \/**\n   * Create a Slide Selector with background settings\n   *\n   * @class H5PEditor.CoursePresentation.SlideSelector\n   * @extends H5P.EventDispatcher Enables pub\/sub\n   * @param {H5PEditor.CoursePresentation} cpEditor CP editor for listening to events\n   * @param {jQuery} $slides Targeted slides\n   * @param {Object} globalFields Global semantic fields\n   * @param {Object} slideFields Single slide semantic fields\n   * @param {Object} params Parameters for semantic fields\n   *\/\n  function SlideSelector(cpEditor, $slides, globalFields, slideFields, params) {\n    var self = this;\n\n    \/\/ Inheritance\n    EventDispatcher.call(self);\n\n    \/\/ Background selector open state\n    var isOpen = false;\n\n    \/\/ Keep track of single slides\n    var singleSlides = [];\n\n    \/\/ Keep track of the global background selector\n    var globalBackground;\n\n    \/\/ Keep track of current slide\n    var currentSlide = 0;\n\n    \/\/ DOM elements\n    var $popup = $('<div class=\"h5p-background-selector\">');\n    var $title = $('<div class=\"h5p-background-selector-title\">')\n      .html(H5PEditor.t('H5PEditor.CoursePresentation', 'slideBackground', {}))\n      .appendTo($popup);\n    $('<div>', {\n      class: 'h5p-background-selector-close',\n      role: 'button',\n      tabIndex: '0',\n      click: function () {\n        cpEditor.slideControls.$background.click();\n      },\n      keydown: function (e) {\n        if (e.which ===32) {\n          $(this).click();\n          e.preventDefault();\n        }\n      }\n    }).prependTo($title);\n    var $header = $('<div>').appendTo($popup);\n    var $contentWrapper = $('<div class=\"h5p-background-selector-content-wrapper\">').appendTo($popup);\n    var $globalContent;\n    var $slideContent;\n\n    \/\/ Single slide semantic fields\n    var singleSlideFields = H5PEditor.CoursePresentation.findField('slideBackgroundSelector', slideFields.field.fields);\n\n    \/**\n     * Init background selectors\n     * @private\n     *\/\n    var initBgSelectors = function () {\n\n      \/\/ Global bg selector\n      var templateString = H5PEditor.t('H5PEditor.CoursePresentation', 'template');\n      var currentSlideString = H5PEditor.t('H5PEditor.CoursePresentation', 'currentSlide');\n      $globalContent = createSlideSelector(templateString, true);\n      globalBackground = new H5PEditor.CoursePresentation.BackgroundSelector($slides.children())\n        .addBgSelector(globalFields, params, $globalContent, {isVisible: true})\n        .setDescription(H5PEditor.t('H5PEditor.CoursePresentation', 'templateDescription', {':currentSlide': currentSlideString}))\n        .addResetButton();\n\n      \/\/ Single slide bg selector\n      $slideContent = createSlideSelector(currentSlideString, false);\n      $slides.children().each(function (idx) {\n        initSingleSlide($slideContent, idx)\n          .setDescription(H5PEditor.t('H5PEditor.CoursePresentation', 'currentSlideDescription', {':template': templateString}))\n          .addResetButton(H5PEditor.t('H5PEditor.CoursePresentation', 'resetToTemplate'));\n      });\n\n      \/\/ Select single slide if first slide has single slide options\n      if (singleSlides[0].getSettings()) {\n        changeSlideType($slideContent);\n      }\n\n      \/\/ Resize header items\n      $header.children().css('width', (100 \/ $header.children().length) + '%');\n    };\n\n    \/**\n     * Init listeners for slide operations\n     * @private\n     *\/\n    var initSlideOperationsListeners = function () {\n      \/\/ Register changed slide listener\n      cpEditor.cp.on('changedSlide', function (e) {\n        if (currentSlide !== e.data) {\n          changeToSlide(e.data);\n        }\n      });\n\n      cpEditor.on('sortSlide', function (e) {\n        sortSlide(e.data);\n      });\n\n      cpEditor.on('removeSlide', function (e) {\n        removeSlide(e.data);\n      });\n      cpEditor.on('addedSlide', function (e) {\n        addSlide(e.data);\n      });\n    };\n\n    \/**\n     * Sanitize parameters of slide index, so they can be easily processed\n     *\n     * @private\n     * @param {number} idx Index of slide parameters\n     *\/\n    var sanitizeSlideParams = function (idx) {\n      var slideParams =  params.slides[idx].slideBackgroundSelector;\n      if (!slideParams) {\n        return;\n      }\n\n      if (slideParams.fillSlideBackground && !slideParams.fillSlideBackground.length) {\n        slideParams.fillSlideBackground = undefined;\n      }\n\n      if (slideParams.imageSlideBackground && !slideParams.imageSlideBackground.path) {\n        slideParams.imageSlideBackground = undefined;\n      }\n    };\n\n    \/**\n     * Add slide selector at specified index\n     *\n     * @private\n     * @param {number} newSlideIndex Index for new slide\n     *\/\n    var addSlide = function (newSlideIndex) {\n      \/\/ Must sanitize params before processing semantics\n      sanitizeSlideParams(newSlideIndex);\n      initSingleSlide($slideContent, newSlideIndex)\n        .setDescription(H5PEditor.t('H5PEditor.CoursePresentation', 'currentSlideDescription', {\n          ':template': H5PEditor.t('H5PEditor.CoursePresentation', 'template')\n        }))\n        .addResetButton(H5PEditor.t('H5PEditor.CoursePresentation', 'resetToTemplate'));\n\n      \/\/ Change to selected radio button\n      var selectedIndex = singleSlides[newSlideIndex - 1].getSelectedIndex();\n      singleSlides[newSlideIndex].setSelectedIndex(selectedIndex);\n    };\n\n    \/**\n     * Remove slide selector at specified index\n     *\n     * @private\n     * @param {number} removeIndex Index of removed slide\n     *\/\n    var removeSlide = function (removeIndex) {\n      var removed = singleSlides.splice(removeIndex, 1);\n      removed.forEach(function (singleSlide) {\n        singleSlide.removeElement();\n      });\n    };\n\n    \/**\n     * Sort current slide selector to the specified direction\n     *\n     * @private\n     * @param {number} dir Negative or positive direction and value of sort.\n     *\/\n    var sortSlide = function (dir) {\n      \/\/ Validate sort\n      if ((currentSlide + dir >= 0) && (currentSlide + dir < $slides.children().length)) {\n\n        \/\/ Sort single slide settings in direction\n        var temp = singleSlides[currentSlide + dir];\n        singleSlides[currentSlide + dir] = singleSlides[currentSlide];\n        singleSlides[currentSlide] = temp;\n\n        \/\/ Swap elements\n        var prev = currentSlide + (dir < 0 ? 0 : dir);\n        var next = currentSlide + (dir < 0 ? dir : 0);\n        $slideContent.children().eq(prev)\n          .insertBefore($slideContent.children().eq(next));\n\n        \/\/ Must update internal current slide, since CPs is transition based\n        currentSlide += dir;\n      }\n    };\n\n    \/**\n     * Initialize a single slide\n     *\n     * @private\n     * @param {jQuery} $wrapper Element the single slide will be attached to\n     * @param {number} idx Index single slide will be inserted at\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector} Background selector that was created\n     *\/\n    var initSingleSlide = function ($wrapper, idx) {\n      var slideParams = params.slides[idx];\n\n      var singleSlide = new H5PEditor.CoursePresentation.BackgroundSelector($slides.children().eq(idx), true);\n\n      \/\/ Trigger fallback to global background when single slide is removed\n      globalBackground.setBackgroundSlides($slides.children());\n      singleSlide.on('turnedGlobal', function () {\n        globalBackground.addBackground();\n      });\n\n      \/\/ Create background selector\n      singleSlide.addBgSelector(singleSlideFields, slideParams, $wrapper, {\n        isSingle: true,\n        isVisible: (idx === 0),\n        index: idx\n      });\n\n      singleSlides.splice(idx, 0, singleSlide);\n      return singleSlide;\n    };\n\n    \/**\n     * Change to specified slide\n     *\n     * @private\n     * @param {number} index Index of slide we will change to\n     *\/\n    var changeToSlide = function (index) {\n      \/\/ Slide has not been created yet\n      if (index >= singleSlides.length) {\n        return;\n      }\n\n      \/\/ Show new slide if we changed slide\n      $slideContent.children().removeClass('show');\n      $slideContent.children().eq(index).addClass('show');\n\n      \/\/ Show slide specific options\n      var $changeToSlide = singleSlides[index].getSettings() ? $slideContent : $globalContent;\n      changeSlideType($changeToSlide);\n\n      \/\/ Show new slide bg selector\n      currentSlide = index;\n      updateColorPicker();\n    };\n\n    \/**\n     * Change slide type\n     *\n     * @private\n     * @param {jQuery} $content The element that we will show\n     *\/\n    var changeSlideType = function ($content) {\n      var $headerButton = $header.children().eq($content.index());\n      if ($content.hasClass('show') && $headerButton.hasClass('active')) {\n        return;\n      }\n\n      \/\/ Show new content\n      $contentWrapper.children().removeClass('show');\n      $content.addClass('show');\n\n      \/\/ Set button as active\n      $header.children().removeClass('active').attr('aria-pressed', false);\n      $headerButton.addClass('active').attr('aria-pressed', true);\n\n      updateColorPicker();\n    };\n\n    \/**\n     * Create slide selector\n     *\n     * @private\n     * @param {string} option Label of slide selector\n     * @param {boolean} isVisible Initial visibility of slide selector\n     * @returns {jQuery} Slide selector that was created\n     *\/\n    var createSlideSelector = function (option, isVisible) {\n      \/\/ First slide selector will be active\n      var first = isVisible ? ' show' : '';\n      var active = isVisible ? ' active' : '';\n\n      \/\/ Content element\n      var $content = $('<div>', {\n        class: 'h5p-slide-selector-content' + first\n      }).appendTo($contentWrapper);\n\n      \/\/ Option for showing content\n      var $slideSelectorOption = $('<a>', {\n        'class': 'h5p-slide-selector-option' + active,\n        href: 'javascript:void(0)',\n        html: option,\n        on: {\n          click: function () {\n            changeSlideType($content);\n          },\n          keypress: function (event) {\n            if (event.which === 32) { \/\/ Space\n              changeSlideType($content);\n              return false;\n            }\n\n          }\n        },\n        appendTo: $header\n      });\n\n      if (isVisible) {\n        $slideSelectorOption.attr('aria-pressed', true);\n      }\n\n      return $content;\n    };\n\n    \/**\n     * Update color picker in current slide\n     *\n     * @private\n     *\/\n    var updateColorPicker = function () {\n      if (isSingleSlide()) {\n        singleSlides[currentSlide].updateColorPicker();\n      }\n      else {\n        globalBackground.updateColorPicker();\n      }\n    };\n\n    \/**\n     * Determine if selected slide is a single slide\n     *\n     * @private\n     * @returns {boolean} True if currently selected slide is a single slide\n     *\/\n    var isSingleSlide = function () {\n      return $slideContent.hasClass('show');\n    };\n\n    \/**\n     * Append slide selector to wrapper\n     *\n     * @param {jQuery} $wrapper Wrapper we attach to\n     * @returns {H5PEditor.CoursePresentation.SlideSelector}\n     *\/\n    self.appendTo = function ($wrapper) {\n      self.$wrapper = $wrapper;\n      initBgSelectors();\n      initSlideOperationsListeners();\n      $popup.appendTo($wrapper);\n\n      return self;\n    };\n\n    \/**\n     * Open popup\n     * @returns {H5PEditor.CoursePresentation.SlideSelector}\n     *\/\n    self.open = function () {\n      if (self.$wrapper) {\n        self.$wrapper.removeClass('hidden');\n        isOpen = true;\n      }\n\n      return self;\n    };\n\n    \/**\n     * Close popup\n     * @returns {H5PEditor.CoursePresentation.SlideSelector}\n     *\/\n    self.close = function () {\n      if (self.$wrapper) {\n        self.$wrapper.addClass('hidden');\n        isOpen = false;\n      }\n\n      return self;\n    };\n\n    \/**\n     * Toggle popup state\n     * @returns {H5PEditor.CoursePresentation.SlideSelector}\n     *\/\n    self.toggleOpen = function () {\n      if (self.$wrapper) {\n        if (isOpen) {\n          self.close();\n        } else {\n          self.open();\n        }\n\n        updateColorPicker();\n      }\n\n      return self;\n    };\n\n    \/**\n     * Communicate when we are ready\n     *\n     * @returns {boolean} True if ready\n     *\/\n    self.ready = function () {\n      return true; \/\/ Always ready\n    };\n\n    \/**\n     * Checks validity of user input\n     *\n     * @returns {boolean} True if valid\n     *\/\n    self.validate = function () {\n      var valid = true;\n      valid &= globalBackground.validate();\n\n      singleSlides.forEach(function (singleSlide) {\n        valid &= singleSlide.validate();\n      });\n\n      return valid;\n    };\n  }\n\n  \/\/ Inheritance\n  SlideSelector.prototype = Object.create(EventDispatcher.prototype);\n  SlideSelector.prototype.constructor = SlideSelector;\n\n  return SlideSelector;\n})(H5P.jQuery, H5P.EventDispatcher);\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/scripts\/bg-selector.js?ver=1.17.4":"\nH5PEditor.CoursePresentation.BackgroundSelector = (function ($, EventDispatcher) {\n\n  \/**\n   * Create a Background Selector.\n   *\n   * @class H5PEditor.CoursePresentation.BackgroundSelector\n   * @extends H5P.EventDispatcher Allows pub\/sub\n   * @param {jQuery} $backgroundSlides Elements to paint\n   * @param {boolean} [isSingleSlide] Background selector is for a single element\n   *\/\n  function BackgroundSelector($backgroundSlides, isSingleSlide) {\n    var self = this;\n\n    \/\/ Inheritance\n    EventDispatcher.call(self);\n\n    \/\/ Background selector wrapper\n    var $bgSelector = $('<div>', {\n      'class': 'h5p-bg-selector'\n    });\n\n    \/\/ Description field\n    var $descriptionField = $('<div>', {\n      'class': 'h5p-bg-selector-description',\n      appendTo: $bgSelector\n    });\n\n    \/\/ Bg selector widget\n    var $bgSelectorContent = $('<div>', {\n      'class': 'h5p-bg-selector-content',\n      appendTo: $bgSelector\n    });\n\n    \/\/ Area for reset button\n    var $resetButtonArea = $('<div>', {\n      'class': 'h5p-bg-selector-reset-area',\n      appendTo: $bgSelector\n    });\n\n    \/\/ Button for resetting background\n    var $resetButton;\n\n    \/\/ Outsource readies\n    self.passReadies = true;\n\n    \/\/ Collection of processed semantics\n    self.children = [];\n\n    \/\/ Default to false\n    isSingleSlide = isSingleSlide || false;\n\n    \/\/ Labels for radio buttons\n    var radioLabels = [\n      H5PEditor.t('H5PEditor.CoursePresentation', 'setImageBackground', {}),\n      H5PEditor.t('H5PEditor.CoursePresentation', 'setColorFillBackground', {})\n    ];\n\n    \/**\n     * Get slide(s) that will be painted\n     *\n     * @private\n     * @returns {jQuery} Slide(s)\n     *\/\n    var getTargetSlides = function () {\n      return isSingleSlide ? $backgroundSlides : $backgroundSlides.filter('.global');\n    };\n\n    \/**\n     * Paint slide(s) with current settings\n     * @private\n     *\/\n    var paintElement = function () {\n      var settings = self.getSettings();\n\n      if (!settings) {\n        settings = {\n          type: 'reset'\n        };\n      }\n      var $targetSlides = getTargetSlides();\n\n      \/\/ Reset\n      $targetSlides.removeClass('has-background')\n        .css('background', '')\n        .css('background-image', '')\n        .css('background-color', '');\n\n      if (settings.type === 'image') {\n        $targetSlides.addClass('has-background')\n          .css('background-image', 'url(' + settings.value + ')');\n      }\n      else if (settings.type === 'bgColor') {\n        $targetSlides.addClass('has-background')\n          .css('background-color', settings.value);\n      }\n    };\n\n    \/**\n     * Add listener for when backgrounds are changed\n     * @private\n     *\/\n    var addOptionListeners = function () {\n      var radioSelector = getRadioSelector();\n      radioSelector.on('backgroundAdded', function () {\n        self.addBackground();\n      });\n\n      radioSelector.on('backgroundRemoved', function () {\n        removeBackground();\n      });\n    };\n\n    \/**\n     * Get processed Radio Selector instance\n     *\n     * @private\n     * @returns {H5PEditor.RadioSelector}\n     *\/\n    var getRadioSelector = function () {\n      return self.children[0];\n    };\n\n    \/**\n     * Remove background from slide(s)\n     * @private\n     *\/\n    var removeBackground = function () {\n\n      \/\/ Trigger global background\n      if (isSingleSlide) {\n        $backgroundSlides.addClass('global');\n        self.trigger('turnedGlobal');\n      }\n      else {\n        \/\/ Remove global background\n        paintElement();\n      }\n\n      if ($resetButton) {\n        $resetButton.removeClass('show');\n      }\n    };\n\n    \/**\n     * Add background to slide(s) with current settings\n     *\/\n    self.addBackground = function () {\n      var settings = self.getSettings();\n\n      \/\/ Invalid background\n      if (!settings) {\n        removeBackground();\n        return;\n      }\n\n      \/\/ Store single slide data\n      if (isSingleSlide && settings.value) {\n        $backgroundSlides.removeClass('global');\n      }\n\n      paintElement();\n\n      if ($resetButton) {\n        $resetButton.addClass('show');\n      }\n    };\n\n\n    \/**\n     * @typedef {Object} bgOptions Background options object\n     * @property {boolean} [isSingle] Initialized for single slides\n     * @property {boolean} [isVisible] Initialized as visible\n     * @property {number} [index] Optional insert index\n     *\/\n\n    \/**\n     * Create a new background selector and add to collection\n     *\n     * @param {array|Object} fields Semantics for processing background selector\n     * @param {Object} params Parameters belonging to semantics\n     * @param {jQuery} $wrapper Element that we will append to\n     * @param {bgOptions} [options] Additional background options\n     *\/\n    self.addBgSelector = function (fields, params, $wrapper, options) {\n      options = options || {};\n\n      $bgSelector.toggleClass('single', options.isSingle)\n        .toggleClass('show', options.isVisible);\n\n      \/\/ Process semantics into background selector\n      H5PEditor.processSemanticsChunk(H5P.jQuery.makeArray(fields), params, $bgSelectorContent, self);\n      addOptionListeners();\n      getRadioSelector().setRadioLabels(radioLabels);\n\n      \/\/ Check if single slide should use global settings\n      if (isSingleSlide && !self.getSettings()) {\n        $backgroundSlides.addClass('global');\n        self.trigger('turnedGlobal');\n      }\n      else {\n        paintElement();\n      }\n\n      \/\/ Insert after previous index\n      if (options.index && (options.index > 0) && (options.index < $wrapper.children().length)) {\n        $bgSelector.insertAfter($wrapper.children('.single').eq(options.index - 1));\n      }\n      else {\n        $bgSelector.appendTo($wrapper);\n      }\n\n      return self;\n    };\n\n\n    \/**\n     * Add reset button for resetting background slides\n     *\n     * @param {string} [text] Optional text for reset button\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector}\n     *\/\n    self.addResetButton = function (text) {\n      text = text || H5PEditor.t('H5PEditor.CoursePresentation', 'resetToDefault');\n\n      $resetButton = $('<button>', {\n        'html': text,\n        'class': 'h5p-background-selector-reset'\n      }).click(function () {\n        getRadioSelector().resetCheckedOption();\n      });\n\n      if (self.getSettings()) {\n        $resetButton.addClass('show');\n      }\n\n      \/\/ Remove reset button elements\n      $resetButtonArea.children().each(function () {\n        $(this).remove();\n      });\n\n      \/\/ Add reset button to reset button area\n      $resetButton.appendTo($resetButtonArea);\n\n      return self;\n    };\n\n    \/**\n     * Set description at the top of the background selector\n     *\n     * @param {string} description\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector}\n     *\/\n    self.setDescription = function (description) {\n      $descriptionField.html(description);\n\n      return self;\n    };\n\n    \/**\n     * Validate background selector.\n     *\n     * @returns {Boolean} Validity of inputs\n     *\/\n    self.validate = function () {\n      return getRadioSelector().validate();\n    };\n\n    \/**\n     * Get current settings\n     *\/\n    self.getSettings = function () {\n      return getRadioSelector().getStoredOption();\n    };\n\n    \/**\n     * Set target elements for background operations\n     *\n     * @param {jQuery} $newBackgroundSlides Target elements\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector}\n     *\/\n    self.setBackgroundSlides = function ($newBackgroundSlides) {\n      $backgroundSlides = $newBackgroundSlides;\n      return self;\n    };\n\n    \/**\n     * Remove background selector element, used when deleting slides.\n     *\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector}\n     *\/\n    self.removeElement = function () {\n      if ($bgSelector) {\n        $bgSelector.remove();\n      }\n      return self;\n    };\n\n    \/**\n     * Update color picker in Radio Selector, used when changing slides.\n     *\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector}\n     *\/\n    self.updateColorPicker = function () {\n      getRadioSelector().reflow();\n      return self;\n    };\n\n    \/**\n     * Get selected index in Radio Selector.\n     *\/\n    self.getSelectedIndex = function () {\n      return getRadioSelector().getSelectedIndex();\n    };\n\n    \/**\n     * Set selected index in Radio Selector.\n     *\n     * @param {number} index New index for Radio Selector\n     * @returns {H5PEditor.CoursePresentation.BackgroundSelector}\n     *\/\n    self.setSelectedIndex = function (index) {\n      getRadioSelector().setSelectedIndex(index);\n      return self;\n    };\n  }\n\n  \/\/ Inheritance\n  BackgroundSelector.prototype = Object.create(EventDispatcher.prototype);\n  BackgroundSelector.prototype.constructor = BackgroundSelector;\n\n  return BackgroundSelector;\n})(H5P.jQuery, H5P.EventDispatcher);\n","0541f5407fcf6b2c63d41d68e8cfa17b":"; H5PEditor.language[\"H5P.DragNBar\"] = {\n  \"libraryStrings\":{\n    \"transformLabel\":\"Transformeren\",\n    \"editLabel\":\"Wijzig\",\n    \"removeLabel\":\"Verwijder\",\n    \"bringToFrontLabel\":\"Naar voorgrond\",\n    \"sendToBackLabel\":\"Send to Back\",\n    \"unableToPaste\":\"Kan dit object niet plakken. Helaas, het object dat je probeert te plakken wordt niet ondersteund door dit inhoudstype of versie.\",\n    \"sizeLabel\":\"Maat\",\n    \"positionLabel\":\"Positie\",\n    \"heightLabel\":\"Hoogte\",\n    \"widthLabel\":\"Breedte\"\n  }\n};","6d25fad43858b04a60aaee0daf0bb312":"; H5PEditor.language[\"H5P.Image\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Image\"\n    },\n    {\n      \"label\":\"Alternative text\",\n      \"description\":\"Required. If the browser can't load the image this text will be displayed instead. Also used by readspeakers.\"\n    },\n    {\n      \"label\":\"Hover text\",\n      \"description\":\"Optional. This text is displayed when the user hovers his pointing device over the image.\"\n    },\n    {\n      \"label\":\"Copyright information\",\n      \"fields\":[\n        {\n          \"label\":\"Title\",\n          \"placeholder\":\"La Gioconda\"\n        },\n        {\n          \"label\":\"Author\",\n          \"placeholder\":\"Leonardo da Vinci\"\n        },\n        {\n          \"label\":\"Source\",\n          \"placeholder\":\"http:\/\/en.wikipedia.org\/wiki\/Mona_Lisa\",\n          \"regexp\":{\n            \n          }\n        },\n        {\n          \"label\":\"License\",\n          \"default\":\"U\",\n          \"options\":[\n            {\n              \"label\":\"Undisclosed\"\n            },\n            {\n              \"label\":\"Attribution\"\n            },\n            {\n              \"label\":\"Attribution-ShareAlike\"\n            },\n            {\n              \"label\":\"Attribution-NoDerivs\"\n            },\n            {\n              \"label\":\"Attribution-NonCommercial\"\n            },\n            {\n              \"label\":\"Attribution-NonCommercial-ShareAlike\"\n            },\n            {\n              \"label\":\"Attribution-NonCommercial-NoDerivs\"\n            },\n            {\n              \"label\":\"General Public License\"\n            },\n            {\n              \"label\":\"Public Domain\"\n            },\n            {\n              \"label\":\"Public Domain Dedication and Licence\"\n            },\n            {\n              \"label\":\"Public Domain Mark\"\n            },\n            {\n              \"label\":\"Copyright\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"label\":\"Image content name\",\n      \"default\":\"Image\"\n    }\n  ]\n};","c6c4ccf134ec44a03259e60d222cee52":"; H5PEditor.language[\"H5P.AdvancedText\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Tekst\"\n    }\n  ]\n};","1f5b2c462ddc92e9425e71d23f465ba7":"; H5PEditor.language[\"H5P.Link\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Title\"\n    },\n    {\n      \"fields\":[\n        {\n          \"label\":\"Protocol\",\n          \"options\":[\n            {\n              \"label\":\"http:\/\/\"\n            },\n            {\n              \"label\":\"https:\/\/\"\n            },\n            {\n              \"label\":\"(root relative)\"\n            },\n            {\n              \"label\":\"other\"\n            }\n          ],\n          \"default\":\"http:\/\/\"\n        },\n        {\n          \"label\":\"URL\"\n        }\n      ]\n    }\n  ]\n};","806bc02bc3c70f6fdd642f1381434f0a":"; H5PEditor.language[\"H5P.ContinuousText\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Tekst\"\n    }\n  ]\n};","663e435b426665426403eb06a0e332d0":"; H5PEditor.language[\"H5P.Video\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Video sources\",\n      \"description\":\"To ensure that the video works in all browsers you should add both WebM and MP4 formatted sources.\"\n    },\n    {\n      \"label\":\"Visuals\",\n      \"fields\":[\n        {\n          \"label\":\"Poster image\"\n        },\n        {\n          \"label\":\"Fit video player to use all available space\",\n          \"description\":\"If not set the video player will have the same aspect ratio as the video.\"\n        },\n        {\n          \"label\":\"Show video player controls\",\n          \"description\":\"Add controls to the video player. This allows users to play, pause, etc.\"\n        }\n      ]\n    },\n    {\n      \"label\":\"Playback\",\n      \"fields\":[\n        {\n          \"label\":\"Auto-play video\",\n          \"description\":\"Start playing the video automatically. May not work on mobile devices.\"\n        },\n        {\n          \"label\":\"Loop video\",\n          \"description\":\"Automatically start the video over again when it ends.\"\n        }\n      ]\n    },\n    {\n      \"label\":\"Video localization\",\n      \"fields\":[\n        {\n          \"label\":\"Name\",\n          \"default\":\"Video\",\n          \"description\":\"Helps identify content of this type.\"\n        },\n        {\n          \"label\":\"Loading\",\n          \"default\":\"Video player loading...\"\n        },\n        {\n          \"label\":\"No players found\",\n          \"default\":\"Found no video players that supports the given video format.\"\n        },\n        {\n          \"label\":\"No sources\",\n          \"default\":\"Video is missing sources.\"\n        },\n        {\n          \"label\":\"Aborted\",\n          \"default\":\"Media playback has been aborted.\"\n        },\n        {\n          \"label\":\"Network failure\",\n          \"default\":\"Network failure.\"\n        },\n        {\n          \"label\":\"Cannot decode video source\",\n          \"default\":\"Unable to decode media.\"\n        },\n        {\n          \"label\":\"Format not supported\",\n          \"default\":\"Video format not supported.\"\n        },\n        {\n          \"label\":\"Media encrypted\",\n          \"default\":\"Media encrypted.\"\n        },\n        {\n          \"label\":\"Unknown error\",\n          \"default\":\"Unknown error.\"\n        },\n        {\n          \"label\":\"Invalid YouTube ID\",\n          \"default\":\"Invalid YouTube ID.\"\n        },\n        {\n          \"label\":\"Unkown YouTube ID\",\n          \"default\":\"Unable to find video with the given YouTube ID.\"\n        },\n        {\n          \"label\":\"Restricted YouTube video\",\n          \"default\":\"The owner of this video does not allow it to be embedded.\"\n        }\n      ]\n    },\n    {\n      \"label\":\"Accessibility\",\n      \"fields\":[\n        {\n          \"label\":\"Add video track\",\n          \"entity\":\"Track\",\n          \"field\":{\n            \"label\":\"Track\",\n            \"fields\":[\n              {\n                \"label\":\"Track label\"\n              },\n              {\n                \"label\":\"Type kind, refer to <a target='_blank' href=https:\/\/html.spec.whatwg.org\/multipage\/embedded-content.html#the-track-element>HTML living standard<\/a>\",\n                \"default\":\"descriptions\",\n                \"options\":[\n                  {\n                    \"label\":\"Subtitles\"\n                  },\n                  {\n                    \"label\":\"Captions\"\n                  },\n                  {\n                    \"label\":\"Descriptions\"\n                  },\n                  {\n                    \"label\":\"Chapters\"\n                  }\n                ]\n              },\n              {\n                \"label\":\"Source language, must be defined for subtitles\",\n                \"default\":\"en\",\n                \"description\":\"Must be a valid BCP 47 language tag. If the kind attribute is set to subtitles, then srclang must be defined.\"\n              },\n              {\n                \"label\":\"Track file (WebVTT)\"\n              }\n            ]\n          }\n        }\n      ]\n    }\n  ]\n};","d11d04a2a476fc34b4b836947e19332d":"; H5PEditor.language[\"H5P.Audio\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Source files\"\n    },\n    {\n      \"label\": \"Player mode\",\n      \"description\": \"Select the layout of the player.\",\n      \"options\": [\n        {\n          \"label\": \"Minimalistic\"\n        },\n        {\n          \"label\": \"Full\"\n        },\n        {\n          \"label\": \"Transparent\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Fit to wrapper\"\n    },\n    {\n      \"label\": \"Enable controls\",\n      \"description\": \"Controls allow the user to for instance pause the audio\"\n    },\n    {\n      \"label\": \"Enable autoplay\",\n      \"description\": \"With autoplay the audio starts to play immediately. If autoplay is disabled the user presses a play button to start the audio.\"\n    },\n    {\n      \"label\": \"Copyright information\",\n      \"fields\": [\n        {\n          \"label\": \"Title\",\n          \"placeholder\": \"F\u00fcr Elise\"\n        },\n        {\n          \"label\": \"Author\",\n          \"placeholder\": \"Ludwig van Beethoven\"\n        },\n        {\n          \"label\": \"Source\",\n          \"placeholder\": \"http:\/\/en.wikipedia.org\/wiki\/F%C3%BCr_Elise\"\n        },\n        {\n          \"label\": \"License\",\n          \"options\": [\n            {\n              \"label\": \"Undisclosed\"\n            },\n            {\n              \"label\": \"Attribution\"\n            },\n            {\n              \"label\": \"Attribution-ShareAlike\"\n            },\n            {\n              \"label\": \"Attribution-NoDerivs\"\n            },\n            {\n              \"label\": \"Attribution-NonCommercial\"\n            },\n            {\n              \"label\": \"Attribution-NonCommercial-ShareAlike\"\n            },\n            {\n              \"label\": \"Attribution-NonCommercial-NoDerivs\"\n            },\n            {\n              \"label\": \"General Public License\"\n            },\n            {\n              \"label\": \"Public Domain\"\n            },\n            {\n              \"label\": \"Public Domain Dedication and Licence\"\n            },\n            {\n              \"label\": \"Public Domain Mark\"\n            },\n            {\n              \"label\": \"Copyright\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"label\": \"Audio content name\",\n      \"default\": \"Audio\"\n    },\n    {\n      \"label\": \"Audio not supported message\",\n      \"default\": \"Your browser does not support this audio\"\n    }\n  ]\n};","32ae22eba14b4be4cb63ba5317bbfc93":"; H5PEditor.language[\"H5P.Blanks\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Media\",\n      \"fields\": [\n        {\n          \"label\": \"Type\",\n          \"description\": \"Optionele media, die boven de vragen worden getoond\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Beschrijving taak\",\n      \"default\": \"Fill in the missing words\",\n      \"description\": \"A guide telling the user how to answer this task.\"\n    },\n    {\n      \"label\": \"Text blocks\",\n      \"entity\": \"text block\",\n      \"field\": {\n        \"label\": \"Line of text\",\n        \"placeholder\": \"Oslo is the capital of *Norway*.\",\n        \"description\": \"\",\n        \"important\": {\n          \"description\": \"<ul><li>Blanks are added with an asterisk (*) in front and behind the correct word\/phrase.<\/li><li>Alternative answers are separated with a forward slash (\/).<\/li><li>You may add a textual tip, using a colon (:) in front of the tip.<\/li><\/ul>\"\n        }\n      }\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Default\"\n            }\n          ],\n          \"label\": \"Define custom feedback for any score range\",\n          \"description\": \"Click the \\\"Add range\\\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback for defined score range\",\n                \"placeholder\": \"Fill in the feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"Text for \\\"Show solutions\\\" button\",\n      \"default\": \"Toon oplossing\"\n    },\n    {\n      \"label\": \"Text for \\\"Retry\\\" button\",\n      \"default\": \"Retry\"\n    },\n    {\n      \"label\": \"Text for \\\"Check\\\" button\",\n      \"default\": \"Check\"\n    },\n    {\n      \"label\": \"Text for \\\"Not filled out\\\" message\",\n      \"default\": \"Please fill in all blanks to view solution\"\n    },\n    {\n      \"label\": \"Text for \\\"':ans' is correct\\\" message\",\n      \"default\": \"':ans' is correct\"\n    },\n    {\n      \"label\": \"Text for \\\"':ans' is wrong\\\" message\",\n      \"default\": \"':ans' is wrong\"\n    },\n    {\n      \"label\": \"Text for \\\"Answered correctly\\\" message\",\n      \"default\": \"Answered correctly\"\n    },\n    {\n      \"label\": \"Text for \\\"Answered incorrectly\\\" message\",\n      \"default\": \"Answered incorrectly\"\n    },\n    {\n      \"label\": \"Assistive technology label for solution\",\n      \"default\": \"Correct answer:\"\n    },\n    {\n      \"label\": \"Assistive technology label for input field\",\n      \"description\": \"Use @num and @total to replace current cloze number and total cloze number\",\n      \"default\": \"Blank input @num of @total\"\n    },\n    {\n      \"label\": \"Assistive technology label for saying an input has a tip tied to it\",\n      \"default\": \"Tip available\"\n    },\n    {\n      \"label\": \"Tip icon label\",\n      \"default\": \"Tip\"\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Met deze opties kun je instellen hoe de taak zich gedraagt.\",\n      \"fields\": [\n        {\n          \"label\": \"Schakel de knop \\\"Opnieuw\\\" in\"\n        },\n        {\n          \"label\": \"Enable \\\"Show solutions\\\" button\"\n        },\n        {\n          \"label\": \"Automatically check answers after input\"\n        },\n        {\n          \"label\": \"Case sensitive\",\n          \"description\": \"Makes sure the user input has to be exactly the same as the answer.\"\n        },\n        {\n          \"label\": \"Require all fields to be answered before the solution can be viewed\"\n        },\n        {\n          \"label\": \"Put input fields on separate lines\"\n        },\n        {\n          \"label\": \"Disable image zooming for question image\"\n        },\n        {\n          \"label\": \"Show confirmation dialog on \\\"Check\\\"\",\n          \"description\": \"This options is not compatible with the \\\"Automatically check answers after input\\\" option\"\n        },\n        {\n          \"label\": \"Show confirmation dialog on \\\"Retry\\\"\"\n        },\n        {\n          \"label\": \"Accept minor spelling errors\",\n          \"description\": \"If activated, an answer will also count as correct with minor spelling errors\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Check confirmation dialog\",\n      \"fields\": [\n        {\n          \"label\": \"Header text\",\n          \"default\": \"Finish ?\"\n        },\n        {\n          \"label\": \"Body text\",\n          \"default\": \"Are you sure you wish to finish ?\"\n        },\n        {\n          \"label\": \"Cancel button label\",\n          \"default\": \"Cancel\"\n        },\n        {\n          \"label\": \"Confirm button label\",\n          \"default\": \"Finish\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Retry confirmation dialog\",\n      \"fields\": [\n        {\n          \"label\": \"Header text\",\n          \"default\": \"Retry ?\"\n        },\n        {\n          \"label\": \"Body text\",\n          \"default\": \"Are you sure you wish to retry ?\"\n        },\n        {\n          \"label\": \"Cancel button label\",\n          \"default\": \"Cancel\"\n        },\n        {\n          \"label\": \"Confirm button label\",\n          \"default\": \"Confirm\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n      \"default\": \"You got :num out of :total points\"\n    }\n  ]\n};","9d16fedcae848512b740b0ba5fe928f2":"; H5PEditor.language[\"H5P.SingleChoiceSet\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"List of questions\",\n      \"entity\": \"question\",\n      \"field\": {\n        \"label\": \"Question & alternatives\",\n        \"fields\": [\n          {\n            \"label\": \"Vraag\"\n          },\n          {\n            \"label\": \"Alternatives - first alternative is the correct one.\",\n            \"entity\": \"answer\",\n            \"field\": {\n              \"label\": \"Alternative\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Standaard\"\n            }\n          ],\n          \"label\": \"Define custom feedback for any score range\",\n          \"description\": \"Click the \\\"Add range\\\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback for defined score range\",\n                \"placeholder\": \"Fill in the feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"fields\": [\n        {\n          \"label\": \"Auto continue\",\n          \"description\": \"Automatically go to next question when alternative is selected\"\n        },\n        {\n          \"label\": \"Timeout on correct answers\",\n          \"description\": \"Value in milliseconds\"\n        },\n        {\n          \"label\": \"Timeout on wrong answers\",\n          \"description\": \"Value in milliseconds\"\n        },\n        {\n          \"label\": \"Enable sound effects\"\n        },\n        {\n          \"label\": \"Enable retry button\"\n        },\n        {\n          \"label\": \"Enable show solution button\"\n        },\n        {\n          \"label\": \"Slagingspercentage\",\n          \"description\": \"Percentage van de Totale score die vereist is om te slagen.\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Localize single choice set\",\n      \"fields\": [\n        {\n          \"label\": \"Label for the \\\"Show solution\\\" button\",\n          \"default\": \"Toon oplossing\"\n        },\n        {\n          \"label\": \"Label for the \\\"Retry\\\" button\",\n          \"default\": \"Opnieuw proberen\"\n        },\n        {\n          \"label\": \"Title for the show solution view\",\n          \"default\": \"Solution\"\n        },\n        {\n          \"label\": \"Readspeaker text for correct answer\",\n          \"default\": \"Correct!\"\n        },\n        {\n          \"label\": \"Readspeaker text for incorrect answer\",\n          \"default\": \"Incorrect!\"\n        },\n        {\n          \"label\": \"Label for the \\\"mute\\\" button, to disable feedback sound\",\n          \"default\": \"Mute feedback sound\"\n        },\n        {\n          \"label\": \"Label for the \\\"Close\\\" button\",\n          \"default\": \"Close\"\n        },\n        {\n          \"label\": \"Slide number text\",\n          \"default\": \"Slide :num of :total\"\n        },\n        {\n          \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n          \"description\": \"Announces current slide and total number of slides, variables are :num and :total\",\n          \"default\": \"You got :num out of :total points\"\n        },\n        {\n          \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n          \"default\": \"You got :num out of :total points\"\n        }\n      ]\n    }\n  ]\n};","ef9137c73d8629817e15dd838fc0d944":"; H5PEditor.language[\"H5P.MultiChoice\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Media\",\n      \"fields\": [\n        {\n          \"label\": \"Type\",\n          \"description\": \"Optionele media, die boven de vragen worden getoond\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Vraag\"\n    },\n    {\n      \"label\": \"Beschikbare opties\",\n      \"entity\": \"optie\",\n      \"field\": {\n        \"label\": \"Optie\",\n        \"fields\": [\n          {\n            \"label\": \"Tekst\"\n          },\n          {\n            \"label\": \"Juist\"\n          },\n          {\n            \"label\": \"Tips en feedback\",\n            \"fields\": [\n              {\n                \"label\": \"Tekst voor tip\",\n                \"description\": \"Hint voor de gebruiker. Deze zal verschijnen voordat de gebruiker zijn antwoord(en) controleert.\"\n              },\n              {\n                \"label\": \"Weer te geven bericht als antwoord is geselecteerd\",\n                \"description\": \"Bericht zal onder antwoord verschijnen bij controleren als dit antwoord is geselecteerd.\"\n              },\n              {\n                \"label\": \"Weer te geven bericht als antwoord niet is geselecteerd\",\n                \"description\": \"Bericht zal onder het antwoord verschijnen bij controleren als dit antwoord niet is geselecteerd.\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Default\"\n            }\n          ],\n          \"label\": \"Defineer aangepaste feedback voor elke score\",\n          \"description\": \"Voorbeeld: 0-20% Slechte score, 21-91% Gemiddelde Score, 91-100% Schitterende Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback bij gedefinieerde score range\",\n                \"placeholder\": \"Formuleer de feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"User interface vertalingen voor multichoice\",\n      \"fields\": [\n        {\n          \"label\": \"Controleer antwoord knop label\",\n          \"default\": \"Controleer\"\n        },\n        {\n          \"label\": \"Toon oplossing  knop label\",\n          \"default\": \"Toon oplossing\"\n        },\n        {\n          \"label\": \"Probeer opnieuw knop label\",\n          \"default\": \"Probeer opnieuw\"\n        },\n        {\n          \"label\": \"Tip label\",\n          \"default\": \"Toon tip\"\n        },\n        {\n          \"label\": \"Score Balk Label\",\n          \"default\": \"Score\"\n        },\n        {\n          \"label\": \"Tip Aanwezig (niet getoond)\",\n          \"default\": \"Tip aanwezig\",\n          \"description\": \"Aanwezige tekst voor readspeakers\"\n        },\n        {\n          \"label\": \"Feedback aanwezig (niet getoond)\",\n          \"default\": \"Feedback aanwezig\",\n          \"description\": \"Toegankelijkheidstekst voor readspeakers\"\n        },\n        {\n          \"label\": \"Lees Feedback (niet getoond)\",\n          \"default\": \"Lees feedback\",\n          \"description\": \"Toegankelijkheidstekst voor readspeakers\"\n        },\n        {\n          \"label\": \"Verkeerd Antwoord (niet getoond)\",\n          \"default\": \"Verkeerd antwoord\",\n          \"description\": \"Toegankelijkheidstekst voor readspeakers\"\n        },\n        {\n          \"label\": \"Correct Antwoord (niet weergegeven)\",\n          \"default\": \"Correct antwoord\",\n          \"description\": \"Toegankelijkheidstekst voor readspeakers\"\n        },\n        {\n          \"label\": \"Optie zou gemarkeerd moeten zijn\",\n          \"default\": \"Zou gemarkeerd moeten zijn\"\n        },\n        {\n          \"label\": \"Optie zou niet gemarkeerd moeten zijn\",\n          \"default\": \"Zou niet gemarkeerd mogen zijn\"\n        },\n        {\n          \"label\": \"Tekst voor \\\"Antwoord vereist\\\" bericht\",\n          \"default\": \"Gelieve te antwoorden voor je de oplossing bekijkt\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Behavioural settings\",\n      \"description\": \"These options will let you control how the task behaves.\",\n      \"fields\": [\n        {\n          \"label\": \"Schakel \\\"Opnieuw Proberen\\\" knop in\"\n        },\n        {\n          \"label\": \"Schakel \\\"Toon Oplossing\\\" knop in\"\n        },\n        {\n          \"label\": \"VraagType\",\n          \"description\": \"Selecteer het uiterlijk en het gedrag van de vraag.\",\n          \"options\": [\n            {\n              \"label\": \"Automatisch\"\n            },\n            {\n              \"label\": \"Multiple Choice (Checkboxes)\"\n            },\n            {\n              \"label\": \"Single Choice (Radio Buttons)\"\n            }\n          ]\n        },\n        {\n          \"label\": \"Geef een punt voor de hele taak\",\n          \"description\": \"Schakel in om een totaal van een punt te geven voor meerdere juiste antwoorden. Dit is geen optie bij \\\"Single answer\\\" modus.\"\n        },\n        {\n          \"label\": \"Randomiseer antwoorden\",\n          \"description\": \"Schakel in om de volgorde van de vragen te randomiseren.\"\n        },\n        {\n          \"label\": \"Eis een antwoord voordat de oplossing getoond kan worden\"\n        },\n        {\n          \"label\": \"Deactiveer zoomen op een afbeelding bij een vraag afbeelding\"\n        },\n        {\n          \"label\": \"Toon bevestigingsvenster bij \\\"Controleer\\\"\"\n        },\n        {\n          \"label\": \"Toon bevestigingsvenster on \\\"Probeer opnieuw\\\"\"\n        },\n        {\n          \"label\": \"Controleer antwoorden automatisch\",\n          \"description\": \"Deze optie inschakelen zorgt voor moeilijke toegankelijkheid. Zorg ervoor dat je zeker bent van je keuze.\"\n        },\n        {\n          \"label\": \"Slaagpercentage\",\n          \"description\": \"Deze instelling heeft vaak geen effect. Dit is het percentage van de totale scole die vereist is om 1 punt te krijgen voor een hele taak wanneer dit ingeschakeld is alsook om een result.success te krijgen in de xAPI statements.\"\n        },\n        {\n          \"label\": \"Toon scorepunten\",\n          \"description\": \"Toon verdiende punten voor elk antwoord.\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Controleer bevestigingsvenster\",\n      \"fields\": [\n        {\n          \"label\": \"Koptekst\",\n          \"default\": \"Klaar?\"\n        },\n        {\n          \"label\": \"Bodytekst\",\n          \"default\": \"Ben je zeker dat je deze sessie wil be\u00ebindigen?\"\n        },\n        {\n          \"label\": \"Tekst van de \\\"Annuleer\\\"-knop\",\n          \"default\": \"Annuleren\"\n        },\n        {\n          \"label\": \"Tekst van de \\\"Bevestig\\\"-knop\",\n          \"default\": \"Be\u00ebndigen\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Opnieuw proberen bevestigingsvenster\",\n      \"fields\": [\n        {\n          \"label\": \"Hoofding tekst\",\n          \"default\": \"Opnieuw proberen?\"\n        },\n        {\n          \"label\": \"Body text\",\n          \"default\": \"Ben je zeker dat je opnieuw wil proberen?\"\n        },\n        {\n          \"label\": \"Annuleer knop label\",\n          \"default\": \"Annuleer\"\n        },\n        {\n          \"label\": \"Bevestig knop label\",\n          \"default\": \"Bevestig\"\n        }\n      ]\n    }\n  ]\n};","3299ad1e106eaba1a78f038b9a3adad3":"; H5PEditor.language[\"H5P.TrueFalse\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Media\",\n      \"fields\": [\n        {\n          \"label\": \"Type\",\n          \"description\": \"Optionele media, die boven de vragen worden getoond\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Vraag\"\n    },\n    {\n      \"label\": \"Juist antwoord\",\n      \"options\": [\n        {\n          \"label\": \"Waar\"\n        },\n        {\n          \"label\": \"Niet Waar\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Vertalingen van de gebruikersinterface voor Waar\/ Niet waar-Vragen\",\n      \"fields\": [\n        {\n          \"label\": \"Onderschrift voor de \\\"Waar\\\"-knop\",\n          \"default\": \"Waar\"\n        },\n        {\n          \"label\": \"Onderschrift voor de \\\"Niet waar\\\"-knop\",\n          \"default\": \"Niet Waar\"\n        },\n        {\n          \"label\": \"Feedback tekst\",\n          \"default\": \"Je hebt @score van @total punten\",\n          \"description\": \"Feedbacktekst, beschikbare variabelen: @score en @total. Voorbeeld: 'Je hebt @score van @total mogelijke punten.'\"\n        },\n        {\n          \"label\": \"Tekst voor de \\\"Controleer\\\"-knop\",\n          \"default\": \"Controleer\"\n        },\n        {\n          \"label\": \"Tekst voor de \\\"Toon oplossing\\\"-knop\",\n          \"default\": \"Toon oplossing\"\n        },\n        {\n          \"label\": \"Tekst voor de \\\"Opnieuw proberen\\\"-knop\",\n          \"default\": \"Opnieuw proberen\"\n        },\n        {\n          \"label\": \"Onjuist antwoord\",\n          \"default\": \"Onjuist antwoord\"\n        },\n        {\n          \"label\": \"Juist antwoord\",\n          \"default\": \"Juist antwoord\"\n        },\n        {\n          \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n          \"default\": \"You got :num out of :total points\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Deze opties bepalen hoe de taak op de input reageert.\",\n      \"fields\": [\n        {\n          \"label\": \"\\\"Opnieuw proberen\\\"-knop inschakelen\"\n        },\n        {\n          \"label\": \"\\\"Toon oplossing\\\"-knop inschakelen\"\n        },\n        {\n          \"label\": \"Deactiveer het zoomen voor afbeeldingsvragen.\"\n        },\n        {\n          \"label\": \"Toon de bevestigingsdialoog bij \\\"Controleer\\\"\"\n        },\n        {\n          \"label\": \"Toon de bevestigingsdialoog bij \\\"Opnieuw proberen\\\"\"\n        },\n        {\n          \"label\": \"Het antwoord automatisch controleren\",\n          \"description\": \"Als deze optie ingeschakeld wordt, dan zal dit de toegankelijkheid verminderen\"\n        },\n        {\n          \"label\": \"Feedback bij het juiste antwoord\",\n          \"description\": \"Deze tekst overschrijft de standaard feedback tekst. Beschikbare variabelen zijn: @score en @total\"\n        },\n        {\n          \"label\": \"Feedback bij het onjuiste antwoord\",\n          \"description\": \"Deze tekst overschrijft de standaard feedback tekst. Beschikbare variabelen zijn: @score en @total\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Bevestigingsdialoog bij het afronden\",\n      \"fields\": [\n        {\n          \"label\": \"Koptekst\",\n          \"default\": \"Be\u00ebindigen?\"\n        },\n        {\n          \"label\": \"Bodytekst\",\n          \"default\": \"Ben je er zeker van dat je wilt stoppen?\"\n        },\n        {\n          \"label\": \"Tekst van de \\\"Annuleer\\\"-knop\",\n          \"default\": \"Annuleren\"\n        },\n        {\n          \"label\": \"Tekst van de \\\"Bevestig\\\"-knop\",\n          \"default\": \"Be\u00ebindigen\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Bevestigingsdialoog bij Opnieuw proberen\",\n      \"fields\": [\n        {\n          \"label\": \"Koptekst\",\n          \"default\": \"Opnieuw proberen?\"\n        },\n        {\n          \"label\": \"Bodytekst\",\n          \"default\": \"Ben je er zeker van dat je opnieuw wilt proberen?\"\n        },\n        {\n          \"label\": \"Tekst van de \\\"Annuleer\\\"-knop\",\n          \"default\": \"Annuleren\"\n        },\n        {\n          \"label\": \"Tekst van de \\\"Bevestig\\\"-knop\",\n          \"default\": \"Bevestigen\"\n        }\n      ]\n    }\n  ]\n};","b92604ddac2c491fda5de19843c807bc":"; H5PEditor.language[\"H5PEditor.Wizard\"] = {\n  \"libraryStrings\":{\n    \"previousStep\":\"previousStep\",\n    \"nextStep\":\"next step\",\n    \"step\":\"step :index\"\n  }\n};","8f167f1c271e456207c5dd878c09d4e1":"; H5PEditor.language[\"H5PEditor.DragQuestion\"] = {\n  \"libraryStrings\":{\n    \"insertElement\":\"Add :type\",\n    \"done\":\"Done\",\n    \"remove\":\"Remove\",\n    \"image\":\"Image\",\n    \"text\":\"Text\",\n    \"noTaskSize\":\"Please specify task size first.\",\n    \"confirmRemoval\":\"Are you sure you wish to remove this element?\",\n    \"backgroundOpacityOverridden\":\"The background opacity is overridden\",\n    \"advancedtext\":\"Text\",\n    \"dropzone\":\"Drop Zone\",\n    \"selectAll\":\"Select all\",\n    \"deselectAll\":\"Deselect all\"\n  }\n};","be5c642a7169429886e75e0e3d2ad877":"; H5PEditor.language[\"H5P.DragQuestion\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Check answer button\",\n      \"default\": \"Controleer\"\n    },\n    {\n      \"label\": \"Retry button\",\n      \"default\": \"Opnieuw proberen\"\n    },\n    {\n      \"label\": \"Score explanation text\",\n      \"default\": \"Correct answers give +1 point. Incorrect answers give -1 point. The lowest possible score is 0.\"\n    },\n    {\n      \"fields\": [\n        {\n          \"label\": \"Settings\",\n          \"fields\": [\n            {\n              \"label\": \"The title of this question\",\n              \"default\": \"Drag and Drop\",\n              \"description\": \"Gebruikt in samenvattingen, statistieken, enz.\"\n            },\n            {\n              \"label\": \"Show Title\",\n              \"description\": \"Uncheck this option if you do not want this title to be displayed. The title will only be displayed in summaries, statistics etc.\"\n            },\n            {\n              \"label\": \"Achtergrondafbeelding\",\n              \"description\": \"Optional. Select an image to use as background for your drag and drop task.\"\n            },\n            {\n              \"label\": \"Task size\",\n              \"description\": \"Specify how large (in px) the play area should be.\"\n            }\n          ]\n        },\n        {\n          \"label\": \"Task\",\n          \"description\": \"Start by placing your drop zones.<br\/>Next, place your droppable elements and check off the appropriate drop zones.<br\/>Last, edit your drop zone again and check off the correct answers.\",\n          \"fields\": [\n            {\n              \"label\": \"Elements\",\n              \"entity\": \"element\",\n              \"field\": {\n                \"label\": \"Element\",\n                \"fields\": [\n                  {\n                    \"description\": \"Choose the type of content you would like to add.\"\n                  },\n                  {},\n                  {},\n                  {},\n                  {},\n                  {\n                    \"label\": \"Select drop zones\"\n                  },\n                  {\n                    \"label\": \"Ondoorzichtigheid achtergrond\"\n                  },\n                  {\n                    \"label\": \"Infinite number of element instances\",\n                    \"description\": \"Clones this element so that it can be dragged to multiple drop zones.\"\n                  }\n                ]\n              }\n            },\n            {\n              \"label\": \"Drop Zones\",\n              \"entity\": \"Drop Zone\",\n              \"field\": {\n                \"label\": \"Drop Zone\",\n                \"fields\": [\n                  {\n                    \"label\": \"Label\"\n                  },\n                  {\n                    \"label\": \"Show label\"\n                  },\n                  {},\n                  {},\n                  {},\n                  {},\n                  {\n                    \"label\": \"Select correct elements\"\n                  },\n                  {\n                    \"label\": \"Ondoorzichtigheid achtergrond\"\n                  },\n                  {\n                    \"label\": \"Tips en feedback\",\n                    \"fields\": [\n                      {\n                        \"label\": \"Tekst voor tip\"\n                      },\n                      {\n                        \"label\": \"Message displayed on correct match\",\n                        \"description\": \"Message will appear below the task on \\\"check\\\" if correct droppable is matched.\"\n                      },\n                      {\n                        \"label\": \"Message displayed on incorrect match\",\n                        \"description\": \"Message will appear below the task on \\\"check\\\" if the match is incorrect.\"\n                      }\n                    ]\n                  },\n                  {\n                    \"label\": \"This drop zone can only contain one element\",\n                    \"description\": \"Make sure there is only one correct answer for this dropzone\"\n                  },\n                  {\n                    \"label\": \"Enable Auto-Align\",\n                    \"description\": \"Will auto-align all draggables dropped in this zone.\"\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Standaard\"\n            }\n          ],\n          \"label\": \"Define custom feedback for any score range\",\n          \"description\": \"Click the \\\"Add range\\\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback for defined score range\",\n                \"placeholder\": \"Fill in the feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Deze opties bepalen hoe de taak op de input reageert.\",\n      \"fields\": [\n        {\n          \"label\": \"Schakel de knop \\\"Opnieuw\\\" in\"\n        },\n        {\n          \"label\": \"Enable \\\"Check\\\" button\"\n        },\n        {\n          \"label\": \"Require user input before the solution can be viewed\"\n        },\n        {\n          \"label\": \"Geef een punt voor de gehele taak\",\n          \"description\": \"Disable to give one point for each draggable that is placed correctly.\"\n        },\n        {\n          \"label\": \"Apply penalties\",\n          \"description\": \"Apply penalties for elements dropped in the wrong drop zones. This must be enabled when the same element(s) are able to be dropped into multiple drop zones, or if there is only one drop-zone. If this is not enabled, learners may match all items to all drop-zones and always receive a full score.\"\n        },\n        {\n          \"label\": \"Enable score explanation\",\n          \"description\": \"Display a score explanation to user when checking their answers (if the 'Apply penalties' option has been selected).\"\n        },\n        {\n          \"label\": \"Background opacity for draggables\",\n          \"description\": \"If this field is set, it will override opacity set on all draggable elements. This should be a number between 0 and 100, where 0 means full transparency and 100 means no transparency\"\n        },\n        {\n          \"label\": \"Drop Zone Highlighting\",\n          \"description\": \"Choose when to highlight drop zones.\",\n          \"options\": [\n            {\n              \"label\": \"When dragging\"\n            },\n            {\n              \"label\": \"Always\"\n            },\n            {\n              \"label\": \"Never\"\n            }\n          ]\n        },\n        {\n          \"label\": \"Spacing for Auto-Align (in px)\"\n        },\n        {\n          \"label\": \"Enable FullScreen\",\n          \"description\": \"Check this option to enable the full screen button.\"\n        },\n        {\n          \"label\": \"Show score points\",\n          \"description\": \"Show points earned for each answer. Not available when the 'Give one point for the whole task' option is enabled.\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Localiseren\",\n      \"fields\": [\n        {\n          \"label\": \"Titel voor \\\"Volledig scherm\\\"-knop\",\n          \"default\": \"Volledig scherm\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volledig scherm afsluiten\\\"-knop\",\n          \"default\": \"Volledig scherm afsluiten\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Grabbable prefix\",\n      \"default\": \"Grabbable {num} of {total}.\"\n    },\n    {\n      \"label\": \"Grabbable suffix\",\n      \"default\": \"Placed in dropzone {num}.\"\n    },\n    {\n      \"label\": \"Dropzone prefix\",\n      \"default\": \"Dropzone {num} of {total}.\"\n    },\n    {\n      \"label\": \"No dropzone selection label\",\n      \"default\": \"No dropzone.\"\n    },\n    {\n      \"label\": \"Label for show tip button\",\n      \"default\": \"Show tip.\"\n    },\n    {\n      \"label\": \"Label for tip available\",\n      \"default\": \"Tip beschikbaar\"\n    },\n    {\n      \"label\": \"Label for correct answer\",\n      \"default\": \"Juist antwoord\"\n    },\n    {\n      \"label\": \"Label for incorrect answer\",\n      \"default\": \"Onjuist antwoord\"\n    },\n    {\n      \"label\": \"Header for panel containing feedback for correct\/incorrect answers\",\n      \"default\": \"Feedback\"\n    },\n    {\n      \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n      \"default\": \"You got :num out of :total points\"\n    },\n    {\n      \"label\": \"Textual representation of the score explanation button\",\n      \"default\": \"Show score explanation\"\n    }\n  ]\n};","d7ed9d95e9f3f7e4cfeaf3a89e552284":"; H5PEditor.language[\"H5P.Summary\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Inleidende tekst\",\n      \"default\": \"Kies de juiste stelling.\",\n      \"description\": \"Zal worden weergegeven boven de samenvattende taak.\"\n    },\n    {\n      \"widgets\": [\n        {\n          \"label\": \"Standaard\"\n        },\n        {\n          \"label\": \"Tekstueel\"\n        }\n      ],\n      \"label\": \"Samenvatting\",\n      \"entity\": \"statements\",\n      \"field\": {\n        \"label\": \"Set of statements\",\n        \"fields\": [\n          {\n            \"label\": \"List of statements for the summary - the first statement is correct.\",\n            \"entity\": \"statement\",\n            \"field\": {\n              \"label\": \"Statement\"\n            }\n          },\n          {\n            \"label\": \"Tip\",\n            \"fields\": [\n              {\n                \"label\": \"Tekst voor tip\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Standaard\"\n            }\n          ],\n          \"label\": \"Define custom feedback for any score range\",\n          \"description\": \"Click the \\\"Add range\\\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback for defined score range\",\n                \"placeholder\": \"Fill in the feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"Text displayed before number of statements solved in the summary task.\",\n      \"default\": \"Progress:\",\n      \"description\": \"Will be displayed above the statements. Example: 'Progress: 2\/5'\"\n    },\n    {\n      \"label\": \"Text displayed before number of wrong statements selected in the summary task.\",\n      \"default\": \"Wrong answers:\",\n      \"description\": \"Will be displayed above the statements. Example: 'Wrong answers: 4'\"\n    },\n    {\n      \"label\": \"Summary feedback header\",\n      \"default\": \"Your result\",\n      \"description\": \"Will be displayed above the summary feedback.\"\n    },\n    {\n      \"label\": \"Readspeaker text for correct answer\",\n      \"default\": \"Correct.\"\n    },\n    {\n      \"label\": \"Readspeaker text for incorrect answer\",\n      \"default\": \"Incorrect! Please try again.\"\n    },\n    {\n      \"label\": \"Label list of correct answers\",\n      \"default\": \"Correct answers.\"\n    },\n    {\n      \"label\": \"Label for the show tip button\",\n      \"default\": \"Show tip\"\n    },\n    {\n      \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n      \"description\": \":num and :total are special keywords which are programmatically updated\",\n      \"default\": \"You got :num out of :total points\"\n    },\n    {\n      \"label\": \"Text used for readspeakers to communicate progress\",\n      \"description\": \":num and :total are special keywords which are programmatically updated\",\n      \"default\": \"Progress :num of :total\"\n    }\n  ]\n};","6a663edbd66b853dd8b5c93da10a1c34":"; H5PEditor.language[\"H5P.ExportableTextArea\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Label\",\n      \"description\":\"Label\/heading for answer when user exports all answers\"\n    },\n    {\n      \n    },\n    {\n      \"label\":\"Export not supported label\",\n      \"default\":\"Export not supported on your device\"\n    },\n    {\n      \"label\":\"Include comments in the exported document\"\n    }\n  ]\n};","92bc0abee5c2ed824451e388cd1c883d":"; H5PEditor.language[\"H5P.Text\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Text\"\n    }\n  ]\n};","638ee29821dead7328b1e045d67d539e":"; H5PEditor.language[\"H5P.MarkTheWords\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Beschrijving taak\",\n      \"description\": \"Beschrijf hoe de gebruiker de taak moet uitvoeren.\",\n      \"placeholder\": \"Click on all the verbs in the text that follows.\"\n    },\n    {\n      \"label\": \"Textfield\",\n      \"placeholder\": \"This is an answer: *answer*.\",\n      \"description\": \"\",\n      \"important\": {\n        \"description\": \"<ul><li>Marked words are added with an asterix (*).<\/li><li>An asterix may be escaped with another asterix, resulting in ** = *.<\/li><\/ul>\"\n      }\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Standaard\"\n            }\n          ],\n          \"label\": \"Define custom feedback for any score range\",\n          \"description\": \"Click the \\\"Add range\\\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback for defined score range\",\n                \"placeholder\": \"Fill in the feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"Tekst voor de \\\"Controleer\\\"-knop\",\n      \"default\": \"Controleer\"\n    },\n    {\n      \"label\": \"Tekst voor de \\\"Opnieuw proberen\\\"-knop\",\n      \"default\": \"Opnieuw proberen\"\n    },\n    {\n      \"label\": \"Tekst voor de \\\"Toon oplossing\\\"-knop\",\n      \"default\": \"Toon oplossing\"\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Deze opties bepalen hoe de taak op de input reageert.\",\n      \"fields\": [\n        {\n          \"label\": \"Schakel de knop \\\"Opnieuw\\\" in\"\n        },\n        {\n          \"label\": \"Enable \\\"Show solution\\\" button\"\n        },\n        {\n          \"label\": \"Show score points\",\n          \"description\": \"Show points earned for each answer.\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Correct answer text\",\n      \"default\": \"Correct!\",\n      \"description\": \"Text used to indicate that an answer is correct\"\n    },\n    {\n      \"label\": \"Incorrect answer text\",\n      \"default\": \"Incorrect!\",\n      \"description\": \"Text used to indicate that an answer is incorrect\"\n    },\n    {\n      \"label\": \"Missed answer text\",\n      \"default\": \"Missed!\",\n      \"description\": \"Text used to indicate that an answer is missing\"\n    },\n    {\n      \"label\": \"Description for Display Solution\",\n      \"default\": \"Task is updated to contain the solution.\",\n      \"description\": \"This text tells the user that the tasks has been updated with the solution.\"\n    },\n    {\n      \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n      \"default\": \"You got :num out of :total points\"\n    }\n  ]\n};","bc2c095eb06165d681e5941431826e1c":"; H5PEditor.language[\"H5P.DragText\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Beschrijving taak\",\n      \"description\": \"Beschrijf hoe de gebruiker de taak moet uitvoeren.\",\n      \"default\": \"Sleep de woorden naar de juiste vakjes.\"\n    },\n    {\n      \"label\": \"Tekst\",\n      \"placeholder\": \"*Amsterdam* is de hoofdstad van Nederland, *Brussel* is de hoofdstad van Belgi\u00eb en *Luxemburg* is de hoofdstad van Luxemburg.\",\n      \"description\": \"\",\n      \"important\": {\n        \"description\": \"<ul><li>Droppable words are added with an asterisk (*) in front and behind the correct word\/phrase.<\/li><li>You may add a textual tip, using a colon (:) in front of the tip.<\/li><li>For every empty spot there is only one correct word.<\/li><li>You may add feedback to be displayed when a task is completed. Use '\\\\+' for correct and '\\\\-' for incorrect feedback.<\/li><\/ul>\"\n      }\n    },\n    {\n      \"label\": \"Overall Feedback\",\n      \"fields\": [\n        {\n          \"widgets\": [\n            {\n              \"label\": \"Standaard\"\n            }\n          ],\n          \"label\": \"Define custom feedback for any score range\",\n          \"description\": \"Click the \\\"Add range\\\" button to add as many ranges as you need. Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!\",\n          \"entity\": \"range\",\n          \"field\": {\n            \"fields\": [\n              {\n                \"label\": \"Score Range\"\n              },\n              {},\n              {\n                \"label\": \"Feedback for defined score range\",\n                \"placeholder\": \"Fill in the feedback\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"label\": \"Tekst voor de \\\"Controleer\\\"-knop\",\n      \"default\": \"Controleer\"\n    },\n    {\n      \"label\": \"Tekst voor de \\\"Opnieuw proberen\\\"-knop\",\n      \"default\": \"Opnieuw proberen\"\n    },\n    {\n      \"label\": \"Tekst voor de knop \\\"Toon oplossing\\\"\",\n      \"default\": \"Toon oplossing\"\n    },\n    {\n      \"label\": \"Numbered Drop zone label\",\n      \"default\": \"Drop Zone @index.\",\n      \"description\": \"Label used for accessibility, where the Read speaker will read the index of a drop zone. Variable available: @index\"\n    },\n    {\n      \"label\": \"Empty Drop Zone label\",\n      \"default\": \"Drop Zone @index is empty.\",\n      \"description\": \"Label used for accessibility, where the Read speaker will read that the drop zone is empty\"\n    },\n    {\n      \"label\": \"Contains Drop Zone label\",\n      \"default\": \"Drop Zone @index contains draggable @draggable.\",\n      \"description\": \"Label used for accessibility, where the Read speaker will read that the drop zone contains a draggable\"\n    },\n    {\n      \"label\": \"Draggable elements label\",\n      \"default\": \"Draggable @text. @index of @count draggables.\",\n      \"description\": \"Label used for accessibility, where the Read speaker reads that this is a draggable element. Variable available: @index, @count\"\n    },\n    {\n      \"label\": \"Label for show tip button\",\n      \"default\": \"Toon tip\",\n      \"description\": \"Label used for accessibility, where the Read speaker reads it before the tip is read out\"\n    },\n    {\n      \"label\": \"Readspeaker text for correct answer\",\n      \"default\": \"Correct!\"\n    },\n    {\n      \"label\": \"Readspeaker text for incorrect answer\",\n      \"default\": \"Incorrect!\"\n    },\n    {\n      \"label\": \"Confirmation dialog title that user wants to reset a droppable\",\n      \"default\": \"Reset drop\"\n    },\n    {\n      \"label\": \"Confirmation dialog description that user wants to reset a droppable\",\n      \"default\": \"Are you sure you want to reset this drop?\"\n    },\n    {\n      \"label\": \"Label used for accessibility, where the read speaker indicates that dragging is initiated\",\n      \"default\": \"Draggable is grabbed.\"\n    },\n    {\n      \"label\": \"Label used for accessibility, where the read speaker indicates that dragging is canceled\",\n      \"default\": \"Cancelled dragging.\"\n    },\n    {\n      \"label\": \"Label used for accessibility, where the read speaker indicates that a text is the correct answer\",\n      \"default\": \"Correct answer:\"\n    },\n    {\n      \"label\": \"Header for panel containing feedback for correct\/incorrect answers\",\n      \"default\": \"Feedback\"\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Deze opties bepalen hoe de taak op de input reageert.\",\n      \"fields\": [\n        {\n          \"label\": \"Schakel de knop \\\"Opnieuw\\\" in\"\n        },\n        {\n          \"label\": \"\\\"Toon oplossing\\\"-knop inschakelen\"\n        },\n        {\n          \"label\": \"Enable \\\"Check\\\" button\"\n        },\n        {\n          \"label\": \"Geef direct feedback (Antwoorden)\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Textual representation of the score bar for those using a readspeaker\",\n      \"default\": \"You got :num out of :total points\"\n    }\n  ]\n};","5dd7b0def418d5ed93c424dad588a36f":"; H5PEditor.language[\"H5P.GoToQuestion\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Question Text\",\n      \"description\":\"The question that the user will make a choice based upon.\"\n    },\n    {\n      \"label\":\"Choices\",\n      \"entity\":\"choice\",\n      \"field\":{\n        \"fields\":[\n          {\n            \"label\":\"Choice Text\",\n            \"description\":\"The label that will displayed on the choice button.\"\n          },\n          {\n            \"label\":\"Go To\",\n            \"description\":\"The target time the user will be taken to upon pressing the choice button. Enter timecode in the format M:SS.\"\n          },\n          {\n            \"label\":\"If Chosen Text\",\n            \"description\":\"An optional confirmation text that will be displayed after the user has pressed the choice button.\"\n          }\n        ]\n      }\n    },\n    {\n      \"label\":\"Continue Button Label\",\n      \"default\":\"Continue\"\n    }\n  ]\n};","6d2765d3b66614b85c0047738831431f":"; H5PEditor.language[\"H5P.OpenEndedQuestion\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Question or description\"\n    },\n    {\n      \"label\":\"Placeholder text\",\n      \"default\":\"Start writing...\",\n      \"description\":\"Text that initially will be shown in the input field. Will be removed automatically when the user starts writing.\"\n    },\n    {\n      \"label\":\"Input rows\",\n      \"description\":\"Determines the height of the input field.\",\n      \"options\":[\n        {\n          \"label\":\"1 line\"\n        },\n        {\n          \"label\":\"2 lines\"\n        },\n        {\n          \"label\":\"3 lines\"\n        },\n        {\n          \"label\":\"10 lines\"\n        }\n      ],\n      \"default\":\"1\"\n    }\n  ]\n};","7cac228f662cf89f84097561d020059e":"; H5PEditor.language[\"H5P.SimpleMultiChoice\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Question\"\n    },\n    {\n      \"label\":\"Multiple choice type\",\n      \"options\":[\n        {\n          \"label\":\"Multiple answers\"\n        },\n        {\n          \"label\":\"Single answer\"\n        }\n      ],\n      \"default\":\"checkbox\"\n    },\n    {\n      \"label\":\"Answer alternatives\",\n      \"entity\":\"Alternative\",\n      \"field\":{\n        \"label\":\"Alternative\",\n        \"fields\":[\n          {\n            \"label\":\"Text\"\n          },\n          {\n            \"label\":\"Feedback\",\n            \"fields\":[\n              {\n                \"label\":\"Message displayed if answer is selected\",\n                \"description\":\"Message will appear below the answer on \\\"continue\\\" if this answer is selected.\"\n              },\n              {\n                \"label\":\"Message displayed if answer is not selected\",\n                \"description\":\"Message will appear below the answer on \\\"continue\\\" if this answer is not selected.\"\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n};","3f037424729a029c480131a7b7685bde":"; H5PEditor.language[\"H5P.Questionnaire\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Questionnaire elements\",\n      \"widgets\":[\n        {\n          \"label\":\"Default\"\n        }\n      ],\n      \"entity\":\"element\",\n      \"field\":{\n        \"label\":\"Choose library\",\n        \"fields\":[\n          {\n            \"label\":\"Library\",\n            \"description\":\"Choose a library\"\n          },\n          {\n            \"label\":\"Required field\"\n          }\n        ]\n      }\n    },\n    {\n      \"label\":\"Success screen options\",\n      \"fields\":[\n        {\n          \"label\":\"Enable success screen\"\n        },\n        {\n          \"label\":\"Add success screen image\",\n          \"fields\":[\n            {\n              \"label\":\"Replace success icon with image\"\n            }\n          ]\n        },\n        {\n          \"label\":\"Text to display on submit\",\n          \"default\":\"You have completed the questionnaire.\"\n        }\n      ]\n    },\n    {\n      \"label\":\"UI Elements\",\n      \"fields\":[\n        {\n          \"label\":\"Button labels\",\n          \"fields\":[\n            {\n              \"label\":\"Previous button label\",\n              \"default\":\"Back\"\n            },\n            {\n              \"label\":\"Continue button label\",\n              \"default\":\"Continue\"\n            },\n            {\n              \"label\":\"Next button label\",\n              \"default\":\"Next\"\n            },\n            {\n              \"label\":\"Submit button label\",\n              \"default\":\"Submit\"\n            }\n          ]\n        },\n        {\n          \"label\":\"Accessibility\",\n          \"fields\":[\n            {\n              \"label\":\"Required message exit button label\",\n              \"default\":\"Close error message\"\n            },\n            {\n              \"label\":\"Progress bar text\",\n              \"default\":\"Question %current of %max\",\n              \"description\":\"Used to tell assistive technologies what question it is. Variables: [ %current, %max ]\"\n            }\n          ]\n        },\n        {\n          \"label\":\"Required message\",\n          \"default\":\"This question requires an answer\",\n          \"description\":\"Will display if this field is unanswered and required by a wrapper content type\"\n        },\n        {\n          \"label\":\"Required symbol text\",\n          \"default\":\"required\",\n          \"description\":\"Text that will accompany an asterisk to signal that a question is required\"\n        },\n        {\n          \"label\":\"Title for the submit screen\",\n          \"default\":\"You successfully answered all of the questions\"\n        },\n        {\n          \"label\":\"Subtitle for the submit screen\",\n          \"default\":\"Click below to submit your answers\"\n        }\n      ]\n    }\n  ]\n};","7af335fb3edc254e04b691f8bd4f1d72":"; H5PEditor.language[\"H5PEditor.InteractiveVideo\"] = {\n  \"libraryStrings\":{\n    \"selectVideo\":\"selectVideo\",\n    \"noVideoSource\":\"noVideoSource\",\n    \"notVideoField\":\"notVideoField\",\n    \"notImageField\":\"notImageField\",\n    \"insertElement\":\"insertElement\",\n    \"popupTitle\":\"popupTitle\",\n    \"done\":\"done\",\n    \"loading\":\"loading\",\n    \"remove\":\"remove\",\n    \"removeInteraction\":\"removeInteraction\",\n    \"addBookmark\":\"addBookmark\",\n    \"newBookmark\":\"newBookmark\",\n    \"bookmarkAlreadyExists\":\"bookmarkAlreadyExists\",\n    \"tourButtonStart\":\"tourButtonStart\",\n    \"tourButtonExit\":\"tourButtonExit\",\n    \"tourButtonDone\":\"tourButtonDone\",\n    \"tourButtonBack\":\"tourButtonBack\",\n    \"tourButtonNext\":\"tourButtonNext\",\n    \"tourStepUploadIntroText\":\"tourStepUploadIntroText\",\n    \"tourStepUploadFileTitle\":\"tourStepUploadFileTitle\",\n    \"tourStepUploadFileText\":\"tourStepUploadFileText\",\n    \"tourStepUploadAddInteractionsTitle\":\"tourStepUploadAddInteractionsTitle\",\n    \"tourStepUploadAddInteractionsText\":\"tourStepUploadAddInteractionsText\",\n    \"tourStepCanvasToolbarTitle\":\"tourStepCanvasToolbarTitle\",\n    \"tourStepCanvasToolbarText\":\"tourStepCanvasToolbarText\",\n    \"tourStepCanvasEditingTitle\":\"tourStepCanvasEditingTitle\",\n    \"tourStepCanvasEditingText\":\"tourStepCanvasEditingText\",\n    \"tourStepCanvasBookmarksTitle\":\"tourStepCanvasBookmarksTitle\",\n    \"tourStepCanvasBookmarksText\":\"tourStepCanvasBookmarksText\",\n    \"tourStepCanvasPreviewTitle\":\"tourStepCanvasPreviewTitle\",\n    \"tourStepCanvasPreviewText\":\"tourStepCanvasPreviewText\",\n    \"tourStepCanvasSaveTitle\":\"tourStepCanvasSaveTitle\",\n    \"tourStepCanvasSaveText\":\"tourStepCanvasSaveText\",\n    \"tourStepSummaryText\":\"tourStepSummaryText\",\n    \"fullScoreRequiredPause\":\"fullScoreRequiredPause\",\n    \"fullScoreRequiredRetry\":\"fullScoreRequiredRetry\",\n    \"fullScoreRequiredTimeFrame\":\"fullScoreRequiredTimeFrame\"\n  }\n};","c4ac2f6d9e58328be25516b4ee42d7af":"; H5PEditor.language[\"H5P.InteractiveVideo\"] = {\n  \"semantics\":[\n    {\n      \"label\":\"Editor Interactieve Video\",\n      \"fields\":[\n        {\n          \"label\":\"Video uploaden\/inbedden\",\n          \"fields\":[\n            {\n              \"label\":\"Voeg een video toe\",\n              \"description\":\"Selecteer de videobestanden die je wilt gebruiken in je interactieve video. Gebruik voor maximale ondersteuning in browsers ten minste een versie van de video in webm en mp4 formats.\"\n            },\n            {\n              \"label\":\"Opties voor beginscherm (niet ondersteund voor YouTube videos)\",\n              \"fields\":[\n                {\n                  \"label\":\"Titel\",\n                  \"default\":\"Interactieve Video\",\n                  \"description\":\"Gebruikt in samenvattingen, statistieken, enz.\"\n                },\n                {\n                  \"label\":\"Titel verbergen aan het begin van de video\"\n                },\n                {\n                  \"label\":\"Korte beschrijving (Optioneel)\",\n                  \"description\":\"Optioneel. Toon een korte beschrijving op het beginscherm van de video. Werkt niet voor YouTube video's.\"\n                },\n                {\n                  \"label\":\"Poster\",\n                  \"description\":\"Afbeelding getoond voordat de gebruiker de video start. Werkt niet voor YouTube video's.\"\n                },\n                {\n                  \"label\":\"Copyright informatie voor de video\",\n                  \"description\":\"Informatie met betrekking tot het copyright op de video en de in de video gebruikte elementen.\"\n                }\n              ]\n            },\n            {\n              \"label\":\"Text tracks (unsupported for YouTube videos)\",\n              \"fields\":[\n                {\n                  \"label\":\"Available text tracks\",\n                  \"entity\":\"Track\",\n                  \"field\":{\n                    \"label\":\"Track\",\n                    \"fields\":[\n                      {\n                        \"label\":\"Track label\",\n                        \"description\":\"Used if you offer multiple tracks and the user has to choose a track. For instance 'Spanish subtitles' could be the label of a Spanish subtitle track.\",\n                        \"default\":\"Ondertitels\"\n                      },\n                      {\n                        \"label\":\"Type of text track\",\n                        \"default\":\"ondertitels\",\n                        \"options\":[\n                          {\n                            \"label\":\"Ondertitels\"\n                          },\n                          {\n                            \"label\":\"Bijschriften\"\n                          },\n                          {\n                            \"label\":\"Beschrijvingen\"\n                          }\n                        ]\n                      },\n                      {\n                        \"label\":\"Brontaal, moet worden gedefinieerd voor ondertitels\",\n                        \"default\":\"en\",\n                        \"description\":\"Must be a valid BCP 47 language tag. If 'Subtitles' is the type of text track selected, the source language of the track must be defined.\"\n                      },\n                      {\n                        \"label\":\"Track source (WebVTT file)\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"label\":\"Interacties toevoegen\",\n          \"fields\":[\n            {\n              \"field\":{\n                \"fields\":[\n                  {\n                    \"label\":\"Toon duur\",\n                    \"fields\":[\n                      {\n                        \n                      },\n                      {\n                        \n                      }\n                    ]\n                  },\n                  {\n                    \"label\":\"Pauzeren\"\n                  },\n                  {\n                    \"label\":\"Tonen als\",\n                    \"description\":\"<b>Knop<\/b> is een samengevouwen interactie die de gebruiker moet aanklikken om te openen. <b>Poster<\/b> is een uitgevouwen interactie die direct getoond wordt bovenop de video.\",\n                    \"options\":[\n                      {\n                        \"label\":\"Knop\"\n                      },\n                      {\n                        \"label\":\"Poster\"\n                      }\n                    ],\n                    \"default\":\"button\"\n                  },\n                  {\n                    \"label\":\"Turn into button on small screens\"\n                  },\n                  {\n                    \"label\":\"Label\",\n                    \"description\":\"Label displayed next to interaction icon.\"\n                  },\n                  {\n                    \n                  },\n                  {\n                    \n                  },\n                  {\n                    \n                  },\n                  {\n                    \n                  },\n                  {\n                    \n                  },\n                  {\n                    \n                  },\n                  {\n                    \"label\":\"Aanpasbaar\",\n                    \"fields\":[\n                      {\n                        \"label\":\"Action on all correct\",\n                        \"fields\":[\n                          {\n                            \"label\":\"Seek to\",\n                            \"description\":\"Voer de tijdcode in als M:SS format\"\n                          },\n                          {\n                            \"label\":\"Allow the user to opt out and continue\"\n                          },\n                          {\n                            \"label\":\"Bericht\"\n                          },\n                          {\n                            \"label\":\"Label for seek button\"\n                          }\n                        ]\n                      },\n                      {\n                        \"label\":\"Action on wrong\",\n                        \"fields\":[\n                          {\n                            \"label\":\"Seek to\",\n                            \"description\":\"Voer de tijdcode in als M:SS format\"\n                          },\n                          {\n                            \"label\":\"Allow the user to opt out and continue\"\n                          },\n                          {\n                            \"label\":\"Bericht\"\n                          },\n                          {\n                            \"label\":\"Label for seek button\"\n                          }\n                        ]\n                      },\n                      {\n                        \"label\":\"Require full score for task before proceeding\",\n                        \"description\":\"For best functionality this option should be used in conjunction with the \\\"Prevent skipping forward in a video\\\" option of Interactive Video.\"\n                      }\n                    ]\n                  },\n                  {\n                    \"label\":\"Ga naar na klikken\",\n                    \"fields\":[\n                      {\n                        \"label\":\"Achtergrondkleur\",\n                        \"default\":\"rgb(255, 255, 255)\",\n                        \"spectrum\":{\n                          \n                        }\n                      },\n                      {\n                        \"label\":\"Box shadow\",\n                        \"description\":\"De doeltijd waar de gebruiker naartoe gaat als hij op de hotspot klikt. Voer de tijdcode in in M:SS format.\"\n                      }\n                    ]\n                  },\n                  {\n                    \"label\":\"Go to on click\",\n                    \"fields\":[\n                      {\n                        \"label\":\"Type\",\n                        \"options\":[\n                          {\n                            \"label\":\"Timecode\"\n                          },\n                          {\n                            \"label\":\"Andere pagina (URL)\"\n                          }\n                        ]\n                      },\n                      {\n                        \"label\":\"Go To\",\n                        \"description\":\"The target time the user will be taken to upon pressing the hotspot. Enter timecode in the format M:SS.\"\n                      },\n                      {\n                        \"label\":\"URL\",\n                        \"fields\":[\n                          {\n                            \"label\":\"Protocol\",\n                            \"options\":[\n                              {\n                                \"label\":\"http:\/\/\"\n                              },\n                              {\n                                \"label\":\"https:\/\/\"\n                              },\n                              {\n                                \"label\":\"(root relative)\"\n                              },\n                              {\n                                \"label\":\"andere\"\n                              }\n                            ],\n                            \"default\":\"http:\/\/\"\n                          },\n                          {\n                            \"label\":\"URL\"\n                          }\n                        ]\n                      },\n                      {\n                        \"label\":\"Visualiseren\",\n                        \"description\":\"Show that interaction can be clicked by adding a border and an icon\"\n                      }\n                    ]\n                  }\n                ]\n              }\n            },\n            {\n              \"field\":{\n                \"fields\":[\n                  {\n                    \n                  },\n                  {\n                    \n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"label\":\"Samenvatting van de taak\",\n          \"fields\":[\n            {\n              \"default\":{\n                \"params\":{\n                  \n                }\n              }\n            },\n            {\n              \"label\":\"Tonen op\",\n              \"description\":\"Aantal seconden voordat de video eindigt.\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"label\":\"Gedragsinstellingen\",\n      \"fields\":[\n        {\n          \"label\":\"Begin video op\",\n          \"description\":\"Voer de tijdcode in als M:SS format\"\n        },\n        {\n          \"label\":\"Auto-play video\",\n          \"description\":\"Start playing the video automatically\"\n        },\n        {\n          \"label\":\"Loop the video\",\n          \"description\":\"Check if video should run in a loop\"\n        },\n        {\n          \"label\":\"Override \\\"Show Solution\\\" button\",\n          \"description\":\"Deze optie bepaalt of de \\\"Opnieuw proberen\\\" knop voor alle vragen wordt getoond, uitgeschakeld of voor iedere vraag afzonderlijk wordt geconfigureerd.\",\n          \"options\":[\n            {\n              \"label\":\"Ingeschakeld\"\n            },\n            {\n              \"label\":\"Uitgeschakeld\"\n            }\n          ]\n        },\n        {\n          \"label\":\"Override \\\"Retry\\\" button\",\n          \"description\":\"Deze functie is niet beschikbaar op iPad wanneer een YouTube video als bron wordt gebruikt\",\n          \"options\":[\n            {\n              \"label\":\"Ingeschakeld\"\n            },\n            {\n              \"label\":\"Uitgeschakeld\"\n            }\n          ]\n        },\n        {\n          \"label\":\"Toon knop om 10 seconden terug te spoelen\",\n          \"description\":\"Deze functie is niet beschikbaar op iPad wanneer een YouTube video als bron wordt gebruikt\"\n        },\n        {\n          \"label\":\"Toon knop om 10 seconden terug te spoelen\"\n        },\n        {\n          \"label\":\"Voorkom vooruitbladeren in een video\",\n          \"description\":\"Enabling this options will disable user video navigation through default controls.\"\n        },\n        {\n          \"label\":\"Deactivate sound\",\n          \"description\":\"Enabling this option will deactivate the video's sound and prevent it from being switched on.\"\n        }\n      ]\n    },\n    {\n      \"label\":\"Localiseer\",\n      \"fields\":[\n        {\n          \"label\":\"Titel van de activiteit\",\n          \"default\":\"Interactie\"\n        },\n        {\n          \"label\":\"Afspelen titel\",\n          \"default\":\"Play\"\n        },\n        {\n          \"label\":\"Pauzeren titel\",\n          \"default\":\"Pauze\"\n        },\n        {\n          \"label\":\"Geluid uitschakelen\",\n          \"default\":\"Geluid uitschakelen\"\n        },\n        {\n          \"label\":\"Geluid inschakelen\",\n          \"default\":\"Geluid inschakelen\"\n        },\n        {\n          \"label\":\"Videokwaliteit\",\n          \"default\":\"Videokwaliteit\"\n        },\n        {\n          \"label\":\"Video captions title\",\n          \"default\":\"Bijschriften\"\n        },\n        {\n          \"label\":\"Close button text\",\n          \"default\":\"Sluiten\"\n        },\n        {\n          \"label\":\"Volledig scherm\",\n          \"default\":\"Volledig scherm\"\n        },\n        {\n          \"label\":\"Volledig scherm verlaten\",\n          \"default\":\"Volledig scherm verlaten\"\n        },\n        {\n          \"label\":\"Samenvatting\",\n          \"default\":\"Samenvatting\"\n        },\n        {\n          \"label\":\"Bladwijzers\",\n          \"default\":\"Bladwijzers\"\n        },\n        {\n          \"label\":\"Standaardlabel voor zoekknop\",\n          \"default\":\"Hervatten\"\n        },\n        {\n          \"label\":\"Standaardknop om door te gaan met afspelen van video\",\n          \"default\":\"Doorgaan met afspelen\"\n        },\n        {\n          \"label\":\"Afspeelsnelheid instellen\",\n          \"default\":\"Afspeelsnelheid\"\n        },\n        {\n          \"label\":\"10 seconden terug\",\n          \"default\":\"10 seconden terug\"\n        },\n        {\n          \"label\":\"Tekst navigatie uitgeschakeld\",\n          \"default\":\"Navigatie is uitgeschakeld\"\n        },\n        {\n          \"label\":\"Tekst geluid uitgeschakeld\",\n          \"default\":\"Geluid is uitgeschakeld\"\n        },\n        {\n          \"label\":\"Melding dat de gebruiker een correct antwoord moet geven op de vraag om verder te gaan\",\n          \"default\":\"Je moet een correct antwoord geven op alle vragen om verder te kunnen gaan.\"\n        },\n        {\n          \"label\":\"Terugknop\",\n          \"default\":\"Terug\"\n        },\n        {\n          \"label\":\"Passed time hours\",\n          \"default\":\"Uren\"\n        },\n        {\n          \"label\":\"Passed time minutes\",\n          \"default\":\"Minuten\"\n        },\n        {\n          \"label\":\"Passed time seconds\",\n          \"default\":\"Seconden\"\n        },\n        {\n          \"label\":\"Label for current time\",\n          \"default\":\"Current time:\"\n        },\n        {\n          \"label\":\"Label for total time\",\n          \"default\":\"Totale tijd:\"\n        },\n        {\n          \"label\":\"Text for explaining navigation hotkey\",\n          \"default\":\"Use key k for starting and stopping video at any time\"\n        },\n        {\n          \"label\":\"Text explaining that a single interaction with a name has come into view\",\n          \"default\":\"Interaction appeared:\"\n        },\n        {\n          \"label\":\"Text for explaining that multiple interactions have come into view\",\n          \"default\":\"Multiple interactions appeared.\"\n        },\n        {\n          \"label\":\"Video is paused announcement\",\n          \"default\":\"Video is gepauzeerd\"\n        },\n        {\n          \"label\": \"Content label\",\n          \"default\": \"Content\"\n        }\n      ]\n    }\n  ]\n};","1d3ffba2865327bdc9ee93910a8e7a6c":"; H5PEditor.language[\"H5P.CoursePresentation\"] = {\n  \"semantics\": [\n    {\n      \"fields\": [\n        {\n          \"field\": {\n            \"fields\": [\n              {\n                \"field\": {\n                  \"fields\": [\n                    {},\n                    {},\n                    {},\n                    {},\n                    {},\n                    {\n                      \"label\": \"Opmerkingen\",\n                      \"description\": \"De opmerkingen worden getoond wanneer de gebruiker de voorgestelde antwoorden voor alle slides toont.\"\n                    },\n                    {\n                      \"label\": \"Altijd opmerkingen tonen\"\n                    },\n                    {\n                      \"label\": \"Ondoorzichtigheid achtergrond\"\n                    },\n                    {\n                      \"label\": \"Tonen als knop\"\n                    },\n                    {\n                      \"label\": \"Button size\",\n                      \"options\": [\n                        {\n                          \"label\": \"Small\"\n                        },\n                        {\n                          \"label\": \"Big\"\n                        }\n                      ]\n                    },\n                    {\n                      \"label\": \"Titel\"\n                    },\n                    {\n                      \"label\": \"Go to to\",\n                      \"options\": [\n                        {\n                          \"label\": \"Specific slide number\"\n                        },\n                        {\n                          \"label\": \"Volgende slide\"\n                        },\n                        {\n                          \"label\": \"Vorige slide\"\n                        }\n                      ]\n                    },\n                    {\n                      \"label\": \"Ga naar slide\",\n                      \"description\": \"Only applicable when 'Specific slide number' is selected\"\n                    },\n                    {\n                      \"label\": \"Onzichtbaar\",\n                      \"description\": \"Standaard cursor, geen titel en geen tab index. Let op: gebruikers met een beperking of gebruikers die alleen een toetsenbord gebruiken, zullen problemen ervaren met dit element.\"\n                    },\n                    {\n                      \"label\": \"Metadata\",\n                      \"fields\": [\n                        {\n                          \"label\": \"Titel\"\n                        },\n                        {\n                          \"label\": \"Auteur\/Leverancier\"\n                        },\n                        {\n                          \"label\": \"Licentie\"\n                        }\n                      ]\n                    }\n                  ]\n                }\n              },\n              {},\n              {\n                \"fields\": [\n                  {\n                    \"label\": \"Afbeelding\",\n                    \"description\": \"Achtergrondafbeelding moet een ratio van 2:1 breedte:hoogte hebben om te voorkomen dat deze wordt uitgerekt. Afbeeldingen met hoge resolutie worden beter getoond op grotere schermen.\"\n                  },\n                  {\n                    \"label\": \"Kies een kleur\",\n                    \"default\": \"\"\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        {},\n        {\n          \"label\": \"Lijst met sleutelwoorden\"\n        },\n        {\n          \"label\": \"Altijd tonen\"\n        },\n        {\n          \"label\": \"Automatisch verbergen\"\n        },\n        {\n          \"label\": \"Ondoorzichtigheid\"\n        },\n        {\n          \"fields\": [\n            {\n              \"label\": \"Afbeelding\",\n              \"description\": \"Achtergrondafbeelding moet een ratio van 2:1 breedte:hoogte hebben om te voorkomen dat deze wordt uitgerekt. Afbeeldingen met hoge resolutie worden beter getoond op grotere schermen.\"\n            },\n            {\n              \"label\": \"Kies een kleur\",\n              \"default\": \"\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"label\": \"Localiseren\",\n      \"fields\": [\n        {\n          \"label\": \"Vertaling voor \\\"Slide\\\"\",\n          \"default\": \"Slide\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Jouw score\\\"\",\n          \"default\": \"Jouw score\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Maximale score\\\"\",\n          \"default\": \"Max score\"\n        },\n        {\n          \"label\": \"Melding voor een GOEDE score\",\n          \"default\": \"Gefeliciteerd! Je hebt @percent correct!\",\n          \"description\": \"@percent wordt vervangen door de werkelijke score van de gebruiker, in procenten\"\n        },\n        {\n          \"label\": \"Melding voor een REDELIJKE score\",\n          \"default\": \" Goed gedaan! Je hebt @percent correct!\",\n          \"description\": \"@percent wordt vervangen door de werkelijke score van de gebruiker, in procenten\"\n        },\n        {\n          \"label\": \"Melding voor een SLECHTE score\",\n          \"default\": \"Je hebt @percent correct.\",\n          \"description\": \"@percent wordt vervangen door de werkelijke score van de gebruiker, in procenten\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Totaal\\\"\",\n          \"default\": \"Totaal\"\n        },\n        {\n          \"label\": \"Tekst voor \\\"Toon oplossing\\\"-knop\",\n          \"default\": \"Toon oplossing\"\n        },\n        {\n          \"label\": \"Tekst voor de knop Opnieuw\",\n          \"default\": \"Opnieuw proberen\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Titel\\\"\",\n          \"default\": \"Titel\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Auteur\/Leverancier\\\"\",\n          \"default\": \"Auteur\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Licentie\\\"\",\n          \"default\": \"Licentie\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Licentie\\\"\",\n          \"default\": \"Licentie\"\n        },\n        {\n          \"label\": \"Vertaling voor \\\"Exporteer tekst\\\"\",\n          \"default\": \"Exporteer tekst\"\n        },\n        {\n          \"label\": \"Tekst voor Gebruiksrechten-knop\",\n          \"default\": \"Gebruiksrechten\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Verberg sleutelwoordenlijst\\\"-knop\",\n          \"default\": \"Verberg sleutelwoordenlijst\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Toon sleutelwoordenlijst\\\"-knop\",\n          \"default\": \"Toon sleutelwoordenlijst\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volledig scherm\\\"-knop\",\n          \"default\": \"Volledig scherm\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volledig scherm afsluiten\\\"-knop\",\n          \"default\": \"Volledig scherm afsluiten\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Vorige slide\\\"-knop\",\n          \"default\": \"Vorige slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Volgende slide\\\"-knop\",\n          \"default\": \"Volgende slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Huidige slide\\\"-knop\",\n          \"default\": \"Huidige slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Laatste slide\\\"-knop\",\n          \"default\": \"Laatste slide\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Oplossingsmodus afsluiten\\\"-knop\",\n          \"default\": \"Oplossingsmodus afsluiten\"\n        },\n        {\n          \"label\": \"Tekst oplossingsmodus\",\n          \"default\": \"Oplossingsmodus\"\n        },\n        {\n          \"label\": \"Tekst wanneer er meerdere taken op een pagina zijn\",\n          \"default\": \"Meerdere taken\"\n        },\n        {\n          \"label\": \"Scoretekst\",\n          \"default\": \"Je hebt gescoord:\"\n        },\n        {\n          \"label\": \"Deel op Facebook tekst\",\n          \"default\": \"Deel op Facebook\"\n        },\n        {\n          \"label\": \"Deel op Twitter tekst\",\n          \"default\": \"Deel op Twitter\"\n        },\n        {\n          \"label\": \"Share to Google text\",\n          \"default\": \"Share on Google+\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Samenvatting\\\" slide\",\n          \"default\": \"Samenvatting\"\n        },\n        {\n          \"label\": \"Titel voor opmerkingenicoon\",\n          \"default\": \"Toon opmerkingen\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Afdrukken\\\"-knop\",\n          \"default\": \"Afdrukken\"\n        },\n        {\n          \"label\": \"Afdrukken dialoog ingress\",\n          \"default\": \"Hoe wil je deze presentatie afdrukken?\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Druk alle slides af\\\"-knop\",\n          \"default\": \"Druk alle slides af\"\n        },\n        {\n          \"label\": \"Titel voor \\\"Druk huidige slide af\\\"-knop\",\n          \"default\": \"Druk huidige slide af\"\n        },\n        {\n          \"label\": \"Label for slides without a title\",\n          \"default\": \"No title\"\n        },\n        {\n          \"label\": \"Explanation of slide navigation for assistive technologies\",\n          \"default\": \"Use left and right arrow to change slide in that direction whenever canvas is selected\"\n        },\n        {\n          \"label\": \"Canvas label for assistive technologies\",\n          \"default\": \"Presentation canvas. Use left and right arrow to move between slides.\"\n        },\n        {\n          \"label\": \"Label for uncompleted interactions\",\n          \"default\": \"@slideName contains not completed interaction\"\n        },\n        {\n          \"label\": \"Label for completed interactions\",\n          \"default\": \"@slideName contains completed interaction\"\n        },\n        {\n          \"label\": \"Label for slide counter. Variables are @index, @total\",\n          \"default\": \"Slide @index of @total\"\n        },\n        {\n          \"label\": \"Label for slides that only contains correct answers\",\n          \"default\": \"@slideName only has correct answers\"\n        },\n        {\n          \"label\": \"Label for slides that has incorrect answers\",\n          \"default\": \"@slideName has incorrect answers\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Met deze opties kun je de gedragsinstellingen overschrijven.\",\n      \"fields\": [\n        {\n          \"label\": \"Activeer Active Surface Mode\",\n          \"description\": \"Verwijdert navigatieregelaars voor de eindgebruiker. Gebruik 'Ga naar Slide' om te navigeren.\"\n        },\n        {\n          \"label\": \"Verberg samenvatting\",\n          \"description\": \"Verbergt de samenvattingsslide.\"\n        },\n        {\n          \"label\": \"\\\"Toon oplossing\\\" knop instellen\",\n          \"description\": \"Deze optie bepaalt of de \\\"Toon oplossing\\\" knop voor alle vragen wordt getoond, uitgeschakeld of voor iedere vraag afzonderlijk wordt geconfigureerd.\",\n          \"options\": [\n            {\n              \"label\": \"Ingeschakeld\"\n            },\n            {\n              \"label\": \"Uitgeschakeld\"\n            }\n          ]\n        },\n        {\n          \"label\": \"\\\"Opnieuw proberen\\\" knop instellen\",\n          \"description\": \"Deze optie bepaalt of de \\\"Opnieuw proberen\\\" knop voor alle vragen wordt getoond, uitgeschakeld of voor iedere vraag afzonderlijk wordt geconfigureerd.\",\n          \"options\": [\n            {\n              \"label\": \"Ingeschakeld\"\n            },\n            {\n              \"label\": \"Uitgeschakeld\"\n            }\n          ]\n        },\n        {\n          \"label\": \"Printknop inschakelen\",\n          \"description\": \"Schakelt printknop in\"\n        },\n        {\n          \"label\": \"Social Settings\",\n          \"description\": \"These options will let you override social behaviour settings. Empty values will be filled in automatically if a link is provided, otherwise all values will be generated.\",\n          \"fields\": [\n            {\n              \"label\": \"Display Facebook share icon\"\n            },\n            {\n              \"label\": \"Facebook share settings\",\n              \"fields\": [\n                {\n                  \"label\": \"Share to Facebook link\",\n                  \"default\": \"@currentpageurl\"\n                },\n                {\n                  \"label\": \"Share to Facebook quote\",\n                  \"default\": \"I scored @percentage on a task at @currentpageurl.\"\n                }\n              ]\n            },\n            {\n              \"label\": \"Display Twitter share icon\"\n            },\n            {\n              \"label\": \"Twitter share settings\",\n              \"fields\": [\n                {\n                  \"label\": \"Share to Twitter statement\",\n                  \"default\": \"I scored @percentage on a task at @currentpageurl.\"\n                },\n                {\n                  \"label\": \"Share to Twitter link\",\n                  \"default\": \"@currentpageurl\"\n                },\n                {\n                  \"label\": \"Share to Twitter hashtags\",\n                  \"default\": \"h5p, course\"\n                }\n              ]\n            },\n            {\n              \"label\": \"Display Google+ share icon\"\n            },\n            {\n              \"label\": \"Share to Google link\",\n              \"default\": \"@currentpageurl\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n};","a154ca5cc1f7bc3ed6f962ff13207bf4":"; H5PEditor.language[\"H5P.TwitterUserFeed\"] = {\n  \"semantics\": [\n    {\n      \"englishLabel\": \"Username on Twitter\",\n      \"label\": \"Gebruikersnaam op Twitter\",\n      \"englishDescription\": \"The username we'll be fetching tweets from\",\n      \"description\": \"De gebruikersnaam waarvan we tweets zullen ophalen\"\n    },\n    {\n      \"englishLabel\": \"Show replies\",\n      \"label\": \"Toon antwoorden\"\n    },\n    {\n      \"englishLabel\": \"Number of tweets\",\n      \"label\": \"Aantal tweets\"\n    }\n  ]\n}\n;","db96d3f0115c662c4eb2f56fff3bcb94":"; H5PEditor.language[\"H5P.Dialogcards\"] = {\n  \"semantics\": [\n    {\n      \"label\": \"Titel\"\n    },\n    {\n      \"label\": \"Beschrijving taak\",\n      \"default\": \"\"\n    },\n    {\n      \"widgets\": [\n        {\n          \"label\": \"Default\"\n        }\n      ],\n      \"label\": \"Dialogen\",\n      \"entity\": \"dialog\",\n      \"field\": {\n        \"label\": \"Vraag\",\n        \"fields\": [\n          {\n            \"label\": \"Tekst\",\n            \"description\": \"Hint voor het eerste deel van het dialoog\"\n          },\n          {\n            \"label\": \"Antwoord\",\n            \"description\": \"Hint voor het tweede deel van het dialoog\"\n          },\n          {\n            \"label\": \"Afbeelding\",\n            \"description\": \"Optionele afbeelding voor de kaart. (De kaart mag alleen een afbeelding gebruiken, alleen een tekst of allebei)\"\n          },\n          {\n            \"label\": \"Alternative text for the image\"\n          },\n          {\n            \"label\": \"Audio files\"\n          },\n          {\n            \"label\": \"Tips\",\n            \"fields\": [\n              {\n                \"label\": \"Tip for text\",\n                \"description\": \"Tip for the first part of the dialogue\"\n              },\n              {\n                \"label\": \"Tip for answer\",\n                \"description\": \"Tip for the second part of the dialogue\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"label\": \"Gedragsinstellingen\",\n      \"description\": \"Met deze opties kun je instellen hoe de taak zich gedraagt.\",\n      \"fields\": [\n        {\n          \"label\": \"\\\"Opnieuw proberen\\\" knop inschakelen\"\n        },\n        {\n          \"label\": \"Achteruit navigeren uitschakelen\",\n          \"description\": \"Deze optie zorgt ervoor dat je alleen maar vooruit kunt bladeren met Dialoogkaarten\"\n        },\n        {\n          \"label\": \"De tekst passend maken in de kaart\",\n          \"description\": \"Door dit uit te vinken zullen de afmetingen van de kaart zich aanpassen aan de grootte van de tekst\"\n        },\n        {\n          \"label\": \"Kaarten in willekeurige volgorde\",\n          \"description\": \"Schakel in om de kaarten in willekeurige volgorde te tonen.\"\n        }\n      ]\n    },\n    {\n      \"label\": \"Tekst knop Omdraaien\",\n      \"default\": \"Omdraaien\"\n    },\n    {\n      \"label\": \"Tekst voor de knop Volgende\",\n      \"default\": \"Volgende\"\n    },\n    {\n      \"label\": \"Tekst voor de knop Vorige\",\n      \"default\": \"Vorige\"\n    },\n    {\n      \"label\": \"Tekst voor de knop Opnieuw\",\n      \"default\": \"Opnieuw\"\n    },\n    {\n      \"label\": \"Tekst bij voortgang\",\n      \"description\": \"Beschikbare variabelen zijn @card en @total.\",\n      \"default\": \"Kaart @card van @total\"\n    },\n    {\n      \"label\": \"Label for card text\",\n      \"description\": \"Used for accessibility by assistive technologies\",\n      \"default\": \"Card front\"\n    },\n    {\n      \"label\": \"Label for card back\",\n      \"description\": \"Used for accessibility by assistive technologies\",\n      \"default\": \"Card back\"\n    },\n    {\n      \"label\": \"Label for the show tip button\",\n      \"default\": \"Show tip\"\n    },\n    {\n      \"label\": \"Audio not supported message\",\n      \"default\": \"Your browser does not support this audio\"\n    }\n  ]\n};","a99c8dc861447994f11ab4db4fc28c3a":"; H5PEditor.language[\"H5PEditor.CoursePresentation\"] = {\n  \"libraryStrings\":{\n    \"confirmDeleteSlide\":\"confirmDeleteSlide\",\n    \"sortSlide\":\"sortSlide\",\n    \"backgroundSlide\":\"backgroundSlide\",\n    \"removeSlide\":\"removeSlide\",\n    \"cloneSlide\":\"cloneSlide\",\n    \"newSlide\":\"newSlide\",\n    \"insertElement\":\"insertElement\",\n    \"newKeyword\":\"newKeyword\",\n    \"deleteKeyword\":\"deleteKeyword\",\n    \"removeKeywords\":\"removeKeywords\",\n    \"disableKeywords\":\"disableKeywords\",\n    \"removeElement\":\"removeElement\",\n    \"confirmRemoveElement\":\"confirmRemoveElement\",\n    \"cancel\":\"cancel\",\n    \"done\":\"done\",\n    \"remove\":\"remove\",\n    \"keywordsTip\":\"keywordsTip\",\n    \"popupTitle\":\"popupTitle\",\n    \"loading\":\"loading\",\n    \"slidesMenu\":\"slidesMenu\",\n    \"element\":\"element\",\n    \"resetToDefault\":\"resetToDefault\",\n    \"resetToTemplate\":\"resetToTemplate\",\n    \"slideBackground\":\"slideBackground\",\n    \"setImageBackground\":\"setImageBackground\",\n    \"setColorFillBackground\":\"setColorFillBackground\",\n    \"activeSurfaceWarning\":\"activeSurfaceWarning\",\n    \"template\":\"template\",\n    \"templateDescription\":\"templateDescription\",\n    \"currentSlide\":\"currentSlide\",\n    \"currentSlideDescription\":\"currentSlideDescription\",\n    \"showSlideTitles\":\"showSlideTitles\",\n    \"slides\":\"slides\",\n    \"showTitles\":\"showTitles\",\n    \"alwaysShow\":\"alwaysShow\",\n    \"autoHide\":\"autoHide\",\n    \"opacity\":\"opacity\",\n    \"ok\":\"ok\",\n    \"edit\":\"edit\",\n    \"goToSlide\": \"Go to slide\"\n  }\n}\n;"},"css":{"https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/h5p-font-awesome.min.css?ver=4.5.4":"\/*!\n *  Font Awesome 4.5.0 by @davegandy - http:\/\/fontawesome.io - @fontawesome\n *  License - http:\/\/fontawesome.io\/license (Font: SIL OFL 1.1, CSS: MIT License)\n *\/@font-face{font-family:'H5PFontAwesome4';src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/fontawesome-webfont.eot?v=4.5.0);src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/fontawesome-webfont.eot?#iefix&v=4.5.0) format('embedded-opentype'),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/fontawesome-webfont.woff2?v=4.5.0) format('woff2'),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/fontawesome-webfont.woff?v=4.5.0) format('woff'),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/fontawesome-webfont.ttf?v=4.5.0) format('truetype'),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/FontAwesome-4.5\/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px\/1 H5PFontAwesome4;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-gear:before,.fa-cog:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-gears:before,.fa-cogs:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook-f:before,.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-feed:before,.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-save:before,.fa-floppy-o:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-unsorted:before,.fa-sort:before{content:\"\\f0dc\"}.fa-sort-down:before,.fa-sort-desc:before{content:\"\\f0dd\"}.fa-sort-up:before,.fa-sort-asc:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-legal:before,.fa-gavel:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-flash:before,.fa-bolt:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-paste:before,.fa-clipboard:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\\f150\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\\f151\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\\f152\"}.fa-euro:before,.fa-eur:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-rupee:before,.fa-inr:before{content:\"\\f156\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\\f157\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\\f158\"}.fa-won:before,.fa-krw:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before,.fa-gratipay:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-turkish-lira:before,.fa-try:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\"\\f19c\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\"\\f1c5\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\"\\f1c6\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before{content:\"\\f1d0\"}.fa-ge:before,.fa-empire:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-send:before,.fa-paper-plane:before{content:\"\\f1d8\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}.fa-buysellads:before{content:\"\\f20d\"}.fa-connectdevelop:before{content:\"\\f20e\"}.fa-dashcube:before{content:\"\\f210\"}.fa-forumbee:before{content:\"\\f211\"}.fa-leanpub:before{content:\"\\f212\"}.fa-sellsy:before{content:\"\\f213\"}.fa-shirtsinbulk:before{content:\"\\f214\"}.fa-simplybuilt:before{content:\"\\f215\"}.fa-skyatlas:before{content:\"\\f216\"}.fa-cart-plus:before{content:\"\\f217\"}.fa-cart-arrow-down:before{content:\"\\f218\"}.fa-diamond:before{content:\"\\f219\"}.fa-ship:before{content:\"\\f21a\"}.fa-user-secret:before{content:\"\\f21b\"}.fa-motorcycle:before{content:\"\\f21c\"}.fa-street-view:before{content:\"\\f21d\"}.fa-heartbeat:before{content:\"\\f21e\"}.fa-venus:before{content:\"\\f221\"}.fa-mars:before{content:\"\\f222\"}.fa-mercury:before{content:\"\\f223\"}.fa-intersex:before,.fa-transgender:before{content:\"\\f224\"}.fa-transgender-alt:before{content:\"\\f225\"}.fa-venus-double:before{content:\"\\f226\"}.fa-mars-double:before{content:\"\\f227\"}.fa-venus-mars:before{content:\"\\f228\"}.fa-mars-stroke:before{content:\"\\f229\"}.fa-mars-stroke-v:before{content:\"\\f22a\"}.fa-mars-stroke-h:before{content:\"\\f22b\"}.fa-neuter:before{content:\"\\f22c\"}.fa-genderless:before{content:\"\\f22d\"}.fa-facebook-official:before{content:\"\\f230\"}.fa-pinterest-p:before{content:\"\\f231\"}.fa-whatsapp:before{content:\"\\f232\"}.fa-server:before{content:\"\\f233\"}.fa-user-plus:before{content:\"\\f234\"}.fa-user-times:before{content:\"\\f235\"}.fa-hotel:before,.fa-bed:before{content:\"\\f236\"}.fa-viacoin:before{content:\"\\f237\"}.fa-train:before{content:\"\\f238\"}.fa-subway:before{content:\"\\f239\"}.fa-medium:before{content:\"\\f23a\"}.fa-yc:before,.fa-y-combinator:before{content:\"\\f23b\"}.fa-optin-monster:before{content:\"\\f23c\"}.fa-opencart:before{content:\"\\f23d\"}.fa-expeditedssl:before{content:\"\\f23e\"}.fa-battery-4:before,.fa-battery-full:before{content:\"\\f240\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\"\\f241\"}.fa-battery-2:before,.fa-battery-half:before{content:\"\\f242\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\"\\f243\"}.fa-battery-0:before,.fa-battery-empty:before{content:\"\\f244\"}.fa-mouse-pointer:before{content:\"\\f245\"}.fa-i-cursor:before{content:\"\\f246\"}.fa-object-group:before{content:\"\\f247\"}.fa-object-ungroup:before{content:\"\\f248\"}.fa-sticky-note:before{content:\"\\f249\"}.fa-sticky-note-o:before{content:\"\\f24a\"}.fa-cc-jcb:before{content:\"\\f24b\"}.fa-cc-diners-club:before{content:\"\\f24c\"}.fa-clone:before{content:\"\\f24d\"}.fa-balance-scale:before{content:\"\\f24e\"}.fa-hourglass-o:before{content:\"\\f250\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\"\\f251\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\"\\f252\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\"\\f253\"}.fa-hourglass:before{content:\"\\f254\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\"\\f255\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\"\\f256\"}.fa-hand-scissors-o:before{content:\"\\f257\"}.fa-hand-lizard-o:before{content:\"\\f258\"}.fa-hand-spock-o:before{content:\"\\f259\"}.fa-hand-pointer-o:before{content:\"\\f25a\"}.fa-hand-peace-o:before{content:\"\\f25b\"}.fa-trademark:before{content:\"\\f25c\"}.fa-registered:before{content:\"\\f25d\"}.fa-creative-commons:before{content:\"\\f25e\"}.fa-gg:before{content:\"\\f260\"}.fa-gg-circle:before{content:\"\\f261\"}.fa-tripadvisor:before{content:\"\\f262\"}.fa-odnoklassniki:before{content:\"\\f263\"}.fa-odnoklassniki-square:before{content:\"\\f264\"}.fa-get-pocket:before{content:\"\\f265\"}.fa-wikipedia-w:before{content:\"\\f266\"}.fa-safari:before{content:\"\\f267\"}.fa-chrome:before{content:\"\\f268\"}.fa-firefox:before{content:\"\\f269\"}.fa-opera:before{content:\"\\f26a\"}.fa-internet-explorer:before{content:\"\\f26b\"}.fa-tv:before,.fa-television:before{content:\"\\f26c\"}.fa-contao:before{content:\"\\f26d\"}.fa-500px:before{content:\"\\f26e\"}.fa-amazon:before{content:\"\\f270\"}.fa-calendar-plus-o:before{content:\"\\f271\"}.fa-calendar-minus-o:before{content:\"\\f272\"}.fa-calendar-times-o:before{content:\"\\f273\"}.fa-calendar-check-o:before{content:\"\\f274\"}.fa-industry:before{content:\"\\f275\"}.fa-map-pin:before{content:\"\\f276\"}.fa-map-signs:before{content:\"\\f277\"}.fa-map-o:before{content:\"\\f278\"}.fa-map:before{content:\"\\f279\"}.fa-commenting:before{content:\"\\f27a\"}.fa-commenting-o:before{content:\"\\f27b\"}.fa-houzz:before{content:\"\\f27c\"}.fa-vimeo:before{content:\"\\f27d\"}.fa-black-tie:before{content:\"\\f27e\"}.fa-fonticons:before{content:\"\\f280\"}.fa-reddit-alien:before{content:\"\\f281\"}.fa-edge:before{content:\"\\f282\"}.fa-credit-card-alt:before{content:\"\\f283\"}.fa-codiepie:before{content:\"\\f284\"}.fa-modx:before{content:\"\\f285\"}.fa-fort-awesome:before{content:\"\\f286\"}.fa-usb:before{content:\"\\f287\"}.fa-product-hunt:before{content:\"\\f288\"}.fa-mixcloud:before{content:\"\\f289\"}.fa-scribd:before{content:\"\\f28a\"}.fa-pause-circle:before{content:\"\\f28b\"}.fa-pause-circle-o:before{content:\"\\f28c\"}.fa-stop-circle:before{content:\"\\f28d\"}.fa-stop-circle-o:before{content:\"\\f28e\"}.fa-shopping-bag:before{content:\"\\f290\"}.fa-shopping-basket:before{content:\"\\f291\"}.fa-hashtag:before{content:\"\\f292\"}.fa-bluetooth:before{content:\"\\f293\"}.fa-bluetooth-b:before{content:\"\\f294\"}.fa-percent:before{content:\"\\f295\"}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNResize-1.2\/H5P.DragNResize.css?ver=1.2.5":".h5p-dragnbar-element.focused > .h5p-dragnresize-handle {\n  position: absolute;\n  top: -4px;\n  left: -4px;\n  width: 7px;\n  height: 7px;\n  cursor: nwse-resize;\n  border: 1px solid #0099ff;\n  background-color: #fff;\n  z-index: 1;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.ne {\n  left: auto;\n  right: -4px;\n  cursor: nesw-resize;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.sw {\n  top: auto;\n  bottom: -4px;\n  cursor: nesw-resize;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.se {\n  top: auto;\n  left: auto;\n  bottom: -4px;\n  right: -4px;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.n {\n  left: calc(50% - 3px);\n  cursor: ns-resize;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.w {\n  top: calc(50% - 3px);\n  cursor: ew-resize;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.e {\n  top: calc(50% - 3px);\n  left: auto;\n  right: -4px;\n  cursor: ew-resize;\n}\n\n.h5p-dragnbar-element.focused > .h5p-dragnresize-handle.s {\n  top: auto;\n  left: auto;\n  bottom: -4px;\n  right: calc(50% - 3px);\n  cursor: ns-resize;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.FontIcons-1.0\/styles\/h5p-font-icons.css?ver=1.0.2":"@font-face {\n  font-family: 'H5PFontIcons';\n  src:  url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.FontIcons-1.0\/fonts\/h5p.eot?w3m2qr);\n  src:  url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.FontIcons-1.0\/fonts\/h5p.eot?w3m2qr#iefix) format('embedded-opentype'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.FontIcons-1.0\/fonts\/h5p.ttf?w3m2qr) format('truetype'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.FontIcons-1.0\/fonts\/h5p.woff?w3m2qr) format('woff'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.FontIcons-1.0\/fonts\/h5p.svg?w3m2qr#H5PFontIcons) format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/styles\/drag-n-bar.css?ver=1.4.6":".h5p-moving {\n  cursor: move;\n  opacity: 0.6;\n}\n\n.h5peditor .h5p-dragnbar-element.focused,\n.h5peditor .h5p-dragnbar-element:hover {\n  outline: 1px solid #0099ff;\n}\n\n\/* Display outline on label for h5p nil *\/\n.h5p-dragnbar-element.h5p-nil-interaction.focused,\n.h5p-dragnbar-element.h5p-nil-interaction:hover {\n  outline: none;\n}\n\n.h5peditor .h5p-dragnbar-element.h5p-nil-interaction.focused > .h5p-interaction-label,\n.h5peditor .h5p-dragnbar-element.h5p-nil-interaction:hover > .h5p-interaction-label {\n  outline: 1px solid #0099ff;\n}\n\n.h5peditor .hardware-accelerated {\n  -webkit-transform: translateZ(0);\n  -ms-transform: translateZ(0);\n  transform: translateZ(0);\n}\n\n.h5peditor .h5peditor-dragnbar .h5p-dragnbar-li .h5p-dragnbar-tooltip {\n  visibility: hidden;\n  position: absolute;\n  padding: 0 0.5em;\n  top: 100%;\n  left: 0;\n  z-index: 2;\n  border-radius: 4px;\n  background-color: rgba(0, 0, 0, 0.9);\n  color: #fff;\n  font-family: \"Open Sans\", sans-serif;\n  font-size: 0.6em;\n  line-height: 2em;\n  content: attr(data-label);\n  white-space: pre;\n}\n\n.h5peditor .h5peditor-dragnbar .h5p-dragnbar-li:hover > .h5p-dragnbar-tooltip {\n  visibility: visible;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/styles\/dialog.css?ver=1.4.6":".h5p-dialog-title:before {\n  content: \" \";\n  font-family: 'H5PFontAwesome4';\n  color: #313131;\n  margin-right: 0.5em;\n  margin-left: 0.1em;\n  vertical-align: middle;\n}\n\n.h5p-dialog.h5p-big {\n  padding: 0;\n}\n\n.h5p-dialog-title {\n  color: #313131;\n  float: left;\n}\n\n\/* Remove h5p-nil library border *\/\n.h5peditor-interactions .h5p-dialog-inner .field.library.h5p-nil-library {\n  display: none;\n}\n\n\/* interaction semantics wrapper *\/\n.h5p-dialog-inner > div > .field:first-child {\n  margin-top: 0;\n}\n.h5p-dialog-inner .h5peditor-interaction-label.hide,\n.h5p-dialog-inner > div > .field.library > select,\n.h5p-dialog-inner > div > .field.library > label {\n  display: none;\n}\n.h5p-dialog-inner input[type=\"checkbox\"] {\n  vertical-align: middle;\n}\n.h5p-dialog-inner div.ckeditor > p {\n  margin: 0.5em;\n}\n.h5p-dialog-inner div.ckeditor > p:first-child {\n  margin-top: 0;\n}\n.h5p-dialog-inner div.ckeditor > p:last-child {\n  margin-bottom: 0;\n}\n\n.h5p-dialog-wrapper {\n  color: #313131;\n  display: none;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 51;\n  background: rgba(44, 44, 44, 0.5);\n  -webkit-transition: background-color 0.2s;\n  -moz-transition: background-color 0.2s;\n  transition: background-color 0.2s;\n  filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#66000000,endColorstr=#66000000);\n}\n.h5p-dialog-wrapper.h5p-hidden {\n  background: rgba(0,0,0,0);\n}\n.h5p-dialog-wrapper.h5p-hidden .h5p-dialog {\n  -webkit-transform: translateY(100%);\n  -moz-transform: translateY(100%);\n  -ms-transform: translateY(100%);\n  -o-transform: translateY(100%);\n  transform: translateY(100%);\n}\n.h5p-dialog {\n  position: absolute;\n  width: 24.5em;\n  max-height: 100%;\n  margin: 1.25em;\n  background: #fff;\n  overflow: hidden;\n  box-shadow: 0 0 2.5em 0 #191919;\n  -webkit-transition: -webkit-transform 0.2s;\n  -moz-transition: -moz-transform 0.2s;\n  transition: transform 0.2s;\n}\n.h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] {\n  overflow: hidden;\n  padding: 0;\n}\n.h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-dialog-inner {\n  overflow: visible;\n  width: 100%;\n}\n.h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-sc-sound-control {\n  right: 1.2em;\n}\n.h5p-dialog.h5p-big {\n  width: auto;\n  height: auto;\n  max-height: none;\n  left: 1.25em;\n  right: 1.25em;\n  top: 1.25em;\n  bottom: 1.25em;\n  margin: 0;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n}\n.h5p-dialog-inner {\n  width: 22.9em;\n  height: 100%;\n  overflow: auto;\n}\n.h5p-big > .h5p-dialog-inner {\n  width: 96%;\n  height: auto;\n}\n.h5p-dialog-inner::-webkit-scrollbar {\n  width: 0.5em;\n  background: #fff;\n}\n.h5p-dialog-inner::-webkit-scrollbar-thumb {\n  background: #ddd;\n}\n.h5p-dialog-inner::-webkit-scrollbar-thumb:hover {\n  background: #aaa;\n}\n.h5p-dialog-inner::-webkit-scrollbar-thumb:active,\n.h5p-dialog-inner::-webkit-scrollbar-thumb:focus {\n  background: #888;\n}\n\n.h5p-interactive-video .h5p-dialog-hide {\n  color: #191919;\n  font-size: 1.3em;\n  padding: 0.3em;\n  line-height: 0.75em;\n  position: absolute;\n  right: 0.1em;\n  top: 0.1em;\n  height: 1em;\n  z-index: 52;\n  text-shadow: 0 0 0.5em #ffffff;\n  font-family: 'H5PFontAwesome4';\n  text-decoration: none;\n  -webkit-transition: -webkit-transform 0.2s;\n  -moz-transition: -moz-transform 0.2s;\n  transition: transform 0.2s;\n}\n.h5p-interactive-video .h5p-dialog-hide:hover {\n  text-decoration: none;\n  -webkit-transform: scale(1.1,1.1);\n  -moz-transform: scale(1.1,1.1);\n  -ms-transform: scale(1.1,1.1);\n  -o-transform: scale(1.1,1.1);\n  transform: scale(1.1,1.1);\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/styles\/context-menu.css?ver=1.4.6":"\/* Custom H5P font to use for icons. *\/\n@font-face {\n  font-family: 'H5PDragNBar';\n  src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/fonts\/H5PDragNBar.eot?5yxjqx);\n  src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/fonts\/H5PDragNBar.eot?#iefix5yxjqx) format('embedded-opentype'),\n    url('data:application\/font-woff;base64,d09GRgABAAAAAAS0AAsAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxICMmNtYXAAAAFoAAAAVAAAAFQaTsyXZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAAAHwAAAB8uhYcYGhlYWQAAAJAAAAANgAAADYGieuHaGhlYQAAAngAAAAkAAAAJAcAA8ZobXR4AAACnAAAABQAAAAUCgAAwmxvY2EAAAKwAAAADAAAAAwAKABSbWF4cAAAArwAAAAgAAAAIAAIABJuYW1lAAAC3AAAAbYAAAG2EB9\/n3Bvc3QAAASUAAAAIAAAACAAAwAAAAMDAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5ggDwP\/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOYI\/\/3\/\/wAAAAAAIOYI\/\/3\/\/wAB\/+MZ\/AADAAEAAAAAAAAAAAAAAAEAAf\/\/AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAgDCAIIDPgL+AAgADwAAATUhETMVIREjEyE1IREzEQKW\/ixnAhWoZv5uASxmApdn\/iyoAhX+LWYBLP5uAAAAAAEAAAABAAAnj2iRXw889QALBAAAAAAA0hbTxgAAAADSFtPGAAAAAAM+Av4AAAAIAAIAAAAAAAAAAQAAA8D\/wAAABAAAAAAAAz4AAQAAAAAAAAAAAAAAAAAAAAUEAAAAAAAAAAAAAAACAAAABAAAwgAAAAAACgAUAB4APgABAAAABQAQAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEACwAAAAEAAAAAAAIABwCEAAEAAAAAAAMACwBCAAEAAAAAAAQACwCZAAEAAAAAAAUACwAhAAEAAAAAAAYACwBjAAEAAAAAAAoAGgC6AAMAAQQJAAEAFgALAAMAAQQJAAIADgCLAAMAAQQJAAMAFgBNAAMAAQQJAAQAFgCkAAMAAQQJAAUAFgAsAAMAAQQJAAYAFgBuAAMAAQQJAAoANADUSDVQRHJhZ05CYXIASAA1AFAARAByAGEAZwBOAEIAYQByVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwSDVQRHJhZ05CYXIASAA1AFAARAByAGEAZwBOAEIAYQBySDVQRHJhZ05CYXIASAA1AFAARAByAGEAZwBOAEIAYQByUmVndWxhcgBSAGUAZwB1AGwAYQBySDVQRHJhZ05CYXIASAA1AFAARAByAGEAZwBOAEIAYQByRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==') format('woff'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/fonts\/H5PDragNBar.ttf?5yxjqx) format('truetype'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragNBar-1.4\/fonts\/H5PDragNBar.svg?5yxjqx#H5PDragNBar) format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n.h5p-dragnbar-context-menu {\n  display: block;\n  background-color: #c4e3f7;\n  height: 36px;\n  margin-top: -51px;\n  position: absolute;\n  border: 1px solid #0099ff;\n  line-height: 36px;\n  -webkit-filter: drop-shadow(0px 0px 0.25em rgba(44,44,44,0.75));\n  filter: drop-shadow(0px 0px 0.25em rgba(44, 44, 44, 0.5));\n  z-index: 100;\n  font-size: 16px;\n}\n\n.h5p-dragnbar-context-menu.left-aligned:after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-style: solid;\n  border-width: 8px 7px 0 0;\n  border-color: #c4e3f7 transparent transparent transparent;\n  bottom: -7px;\n  right: 0;\n  left: initial;\n  z-index: 1;\n  transform: scaleX(-1);\n}\n\n.h5p-dragnbar-context-menu.left-aligned:before {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-style: solid;\n  border-width: 10px 10px 0 0;\n  border-color: #0099ff transparent transparent transparent;\n  bottom: -10px;\n  left: initial;\n  right: -1px;\n  transform: scaleX(-1);\n}\n\n.h5p-dragnbar-context-menu.left-aligned .h5p-context-menu-buttons {\n  float: left;\n}\n\n.h5p-dragnbar-context-menu:before {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-style: solid;\n  border-width: 9px 9px 0 0;\n  border-color: #0099ff transparent transparent transparent;\n  bottom: -9px;\n  left: -1px;\n}\n\n.h5p-dragnbar-context-menu:after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-style: solid;\n  border-width: 8px 7px 0 0;\n  border-color: #c4e3f7 transparent transparent transparent;\n  bottom: -7px;\n  left: 0;\n  z-index: 1;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button,\n.h5p-dragnbar-context-menu .h5p-context-menu-buttons,\n.h5p-dragnbar-context-menu .h5p-transform-panel,\n.h5p-dragnbar-context-menu .h5p-dragnbar-dimensions,\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates {\n  display: inline-block;\n  position: relative;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates {\n  padding: 0 0.75em;\n  background-color: #fff;\n  color: #0061a2;\n  border-right: 1px solid #0099ff;\n  border-left: 1px solid #0099ff;\n  line-height: 36px;\n}\n\n.h5p-dragnbar-context-menu.left-aligned .h5p-dragnbar-coordinates {\n  border-left: none;\n  border-right: none;\n}\n\n.h5p-dragnbar-context-menu.left-aligned .h5p-dragnbar-coordinates:last-child {\n  border-right: 1px solid #0099ff;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates:last-child {\n  border-right: none;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button {\n  width: 32px;\n  text-align: center;\n  position: relative;\n  cursor: pointer;\n\tline-height: 36px;\n\tvertical-align: middle;\n\toutline: none;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates .h5p-dragnbar-x-container,\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates .h5p-dragnbar-y-container {\n  display: inline-block;\n  position: relative;\n}\n\n\/* Button stylings *\/\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates .h5p-dragnbar-x-container:hover:before,\n.h5p-dragnbar-context-menu .h5p-dragnbar-coordinates .h5p-dragnbar-y-container:hover:before,\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button:hover:before,\n.h5p-dragnbar-context-menu .h5p-dragnbar-input:hover:before {\n  background-color: #000;\n  color: #fff;\n  opacity: 0.75;\n  content: attr(aria-label);\n  position: absolute;\n  bottom: 42px;\n  padding: 0 0.5em;\n  transform: translateX(-50%);\n  left: 50%;\n  font-size: 14px;\n  line-height: 2;\n  border-radius: 4px;\n  white-space: nowrap;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button:after {\n  font-family: \"H5PFontAwesome4\";\n  content: '\\f059';\n  color: #0061a2;\n  padding: 3px 5px;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button:hover:after {\n  border: 1px solid #61bfff;\n  border-radius: 2px;\n  color: #003c65;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button.transform:after {\n  content: '\\f0b2';\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button.edit:after {\n  content: '\\f040';\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button.remove:after {\n  content: '\\f1f8';\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button.bringtofront:after {\n  font-family: \"H5PDragNBar\";\n  content: \"\\e608\";\n  padding: 3px;\n  font-size: 1.05em;\n  vertical-align: bottom;\n}\n\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button.sendtoback:after {\n  font-family: \"H5PFontIcons\";\n  content: \"\\e90f\";\n  padding: 3px;\n  font-size: 1.05em;\n  vertical-align: bottom;\n}\n\n.ui-widget .h5p-dragnbar-coordinates > div > input,\n.h5p-dragnbar-coordinates input {\n  font-size: 13px;\n  background: none repeat scroll 0 0 transparent;\n  border: medium none;\n  width: 2em;\n  text-align: left;\n  color: #0061a2;\n  vertical-align: bottom;\n  margin-bottom: 3px;\n}\n\n.h5p-dragnbar-coordinates input.h5p-dragnbar-x {\n  text-align: right;\n}\n\n.h5p-dragnbar-coordinates .h5p-dragnbar-coordinates-separater {\n  margin: 0 0.25em;\n  vertical-align: bottom;\n  line-height: 24px;\n  color: #555;\n}\n\n.h5p-dragnbar-coordinates input:focus {\n  outline: none;\n}\n\n.left-aligned .h5p-dragnbar-dimensions {\n\tborder-left: 1px solid #0099ff;\n\tborder-right: 1px solid #0099ff;\n}\n.h5p-dragnbar-input {\n  display: inline-block;\n  position: relative;\n}\n.h5p-dragnbar-input > input {\n\twidth: 3.25em;\n\theight: 36px;\n\tcolor: #0061a2;\n  padding: 1em 0.5em 0;\n\tborder: 0;\n\toutline: none;\n  box-sizing: border-box;\n  vertical-align: top;\n  font-size: 13px;\n}\n.h5p-dragnbar-input > input:hover,\n.h5p-dragnbar-input > input:focus {\n\tcolor: #044c7c;\n}\n.ui-widget .h5p-dragnbar-input > input {\n  font-size: 13px;\n  font-family: inherit;\n}\n.h5p-dragnbar-width > input {\n\ttext-align: right;\n\tpadding-right: 0.25em;\n}\n.h5p-dragnbar-height > input {\n\tpadding-left: 0.25em;\n}\n.h5p-dragnbar-dimensions-separator {\n  font-size: 14px;\n  height: 29px;\n  padding: 0.5em 0 0;\n\tbackground-color: #fff;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tcolor: #555;\n}\n\n.h5p-dragnbar-context-menu .h5p-transform-panel.hide,\n.h5p-dragnbar-context-menu .h5p-context-menu-buttons.hide,\n.h5p-dragnbar-context-menu .h5p-dragnbar-context-menu-button.transform.hide {\n  display: none;\n}\n\n.h5p-dragnbar-context-menu.left-aligned .h5p-transform-panel {\n  float: left;\n}\n\n.h5p-dragnbar-context-menu .h5p-transform-button-wrapper {\n  margin-left: 4px;\n  display: inline-block;\n}\n\n.h5p-dragnbar-context-menu.left-aligned .h5p-transform-button-wrapper {\n  margin-left: 0;\n  margin-right: 4px;\n}\n\n.h5p-dragnbar-context-menu .h5p-transform-button-wrapper.active {\n  margin-right: 4px;\n  margin-left: 4px;\n}\n\n.h5p-dragnbar-context-menu .h5p-transform-button-wrapper .transform {\n  margin: 0;\n}\n\n.h5p-dragnbar-context-menu .h5p-context-menu-buttons {\n  margin-right: 4px;\n}\n\n.h5p-dragnbar-context-menu.left-aligned .h5p-context-menu-buttons {\n  margin-right: 0;\n  margin-left: 4px;\n}\n\n.h5p-dragnbar-context-menu .h5p-transform-button-wrapper.active .transform:after {\n  border: 1px solid #80c2ee;\n  background: #b2d7ee;\n  box-shadow: inset 0 1px 5px 0 rgba(2,94,156,0.65);\n}\n.h5p-dragnbar-context-menu .h5p-dragnbar-label {\n  position: absolute;\n  left: 0;\n  font-size: 10px;\n  color: #555;\n  width: 100%;\n  z-index: 1;\n  text-align: center;\n  padding: 1px 0 0;\n  line-height: 18px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Image-1.0\/image.css?ver=1.0.31":".h5p-image > img {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.h5p-image > .h5p-placeholder {\n  background: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Image-1.0\/placeholder.svg);\n  background-size: cover;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.AdvancedText-1.1\/text.css?ver=1.1.5":".h5p-advanced-text ul,\n.h5p-advanced-text ol {\n  padding: 0;\n  margin: 1em 0;\n}\n.h5p-advanced-text ul li,\n.h5p-advanced-text ol li {\n  margin: 0 0 1em 1.5em;\n  padding: 0;\n}\n\n.h5p-advanced-text ul li:last-child,\n.h5p-advanced-text ol li:last-child {\n  margin-bottom: 0;\n}\n.h5p-advanced-text ul li {\n  list-style-type: circle;\n}\n.h5p-advanced-text ol li {\n  list-style-type: decimal;\n}\n.h5p-advanced-text.h5p-frame {\n  margin: 1em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.UrlField-1.2\/link-widget.css?ver=1.2.1":".h5peditor .h5p-link-widget .h5p-link-fields {\n  display: flex;\n}\n\n.h5peditor .h5p-link-url,\n.h5peditor .h5p-link-protocol-selector {\n  display: inline-block;\n  margin: 0 1em 0 0;\n}\n\n.h5peditor .h5p-link-url {\n  flex: 2;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Table-1.1\/styles\/table.css?ver=1.1.5":".h5p-table.h5p-frame {\n  padding: 1em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Video-1.3\/styles\/video.css?ver=1.3.10":".h5p-video > video {\n  background: #000;\n}\n.h5p-video-flash {\n  color: #fff;\n}\n.h5p-video-loading {\n  display: none;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: #000 url('data:image\/gif;base64,R0lGODlhIAAgAPUAAAAAAP\/\/\/1RUVHp6ep6enrKyssDAwLa2tqioqI6OjnBwcF5eXpiYmMrKyszMzMbGxry8vIqKilhYWFBQUJSUlM7Ozk5OTtTU1KKiompqatjY2Nzc3HZ2dmZmZoCAgKysrISEhODg4N7e3uLi4mJiYujo6EREROzs7EpKSkBAQDAwMCwsLCYmJjY2Njo6OhwcHBISEhgYGA4ODggICAICAiIiIvr6+v\/\/\/\/T09AAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAHAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAIAAgAAAG\/0CAcEicDBCOS8lBbDqfgAUidDqVSlaoliggbEbX8Amy3S4MoXQ6fC1DM5eNeh0+uJ0Lx0YuWj8IEQoKd0UQGhsaIooGGYRQFBcakocRjlALFReRGhcDllAMFZmalZ9OAg0VDqofpk8Dqw0ODo2uTQSzDQ12tk0FD8APCb1NBsYGDxzERMcGEB3LQ80QtdEHEAfZg9EACNnZHtwACd8FBOIKBwXqCAvcAgXxCAjD3BEF8xgE28sS8wj6CLi7Q2PLAAz6GDBIQMLNjIJaLDBIuBCEAhRQYMh4WEYCgY8JIoDwoGCBhRQqVrBg8SIGjBkcAUDEQ2GhyAEcMnSQYMFEC0QVLDXCpEFUiwAQIUEMGJCBhEkTLoC2hPFyhhsLGW4K6rBAAIoUP1m6hOEIK04FGRY8jaryBdlPJgQscLpgggmULMoEAQAh+QQABwABACwAAAAAIAAgAAAG\/0CAcEicDDCPSqnUeCBAxKiUuEBoQqGltnQSTb9CAUMjEo2woZHWpgBPFxDNZoPGqpc3iTvaeWjkG2V2dyUbe1QPFxd\/ciIGDBEKChEEB4dCEwcVFYqLBxmXYAkOm6QVEaFgCw+kDQ4NHKlgFA21rlCyUwIPvLwIuV8cBsMGDx3AUwzEBr\/IUggHENKozlEH19dt1UQF2AfH20MF3QcF4OEACN0FCNroBAUfCAgD6EIR8ggYCfYAGfoICBBYYE+APgwCPfQDgZAAgwTntkkQyIBCggh60HFg8DACiAEZt1kAcTHCgAEKFqT4MoPGJQERYp5UkGGBBRcqWLyIAWNGy0JQEmSi7LBgggmcOmHI+BnKAgeUCogaRbqzJ9NLKEhIIioARYoWK2rwXNrSZSgTC7haOJpTrNIZzkygQMF2RdI9QQAAIfkEAAcAAgAsAAAAACAAIAAABv9AgHBInHAwj0ZI9HggBhOidDpcYC4b0SY0GpW+pxFiQaUKKJWLRpPlhrjf0ulEKBMXh7R6LRK933EnNyR2Qh0GFYkXexttJV5fNgiFAAsGDhUOmIsQFCAKChEEF5GUEwVJmpoHGWUKGgOUEQ8GBk0PIJS6CxC1vgq6ugm+tbnBhQIHEMoGdceFCgfS0h3PhQnTB87WZQQFBQcFHtx2CN8FCK3kVAgfCO9k61PvCBgYhPJSGPUYBOr5Qxj0I8AAGMAhIAgQZGDsIIAMCxNEEOAQwAQKCSR+qghAgcQIHgZIqDhB44ABCkxUDBVSQYYOKg9aOMlBQYcFEkyokInS5oJECSZcqKgRA8aMGTRoWLOQIQOJBRaCqmDxAoYMpORMLHgaVShVq1jJpbAgoevUqleVynNhQioLokaRqpWnYirctHPLBAEAIfkEAAcAAwAsAAAAACAAIAAABv9AgHBInCgIBsNmkyQMJsSodLggNC5YjWYZGoU0iMV0Kkg8Kg5HdisKuUelEkEwHko+jXS+ctFuRG1ucSUPYmMdBw8GDw15an1LbV6DJSIKUxIHSUmMDgcJIAoKIAwNI3BxODcPUhMIBhCbBggdYwoGgycEUyAHvrEHHnVDCSc3DpgFvsuXw0MeCGMRB8q+A87YAAIF3NwU2dgZH9wIYeDOIOXl3+fDDBgYCE7twwT29rX0Y\/cMDBL6+\/oxSPAPoJQECBNEMGSQCAiEEUDkazhEgUIQA5pRFLJAoYeMJjYKsQACI4cMDDdmGMBBQQYSIUVaaPlywYQWIgEsUNBhgQRHCyZUiDRBgoRNFClasIix0YRPoC5UsHgBQ8YMGjQAmpgAVSpVq1kNujBhIurUqlcpqnBh9mvajSxWnAWLNWeMGDBm6K2LLQgAIfkEAAcABAAsAAAAACAAIAAABv9AgHBInCgYB8jlAjEQOBOidDqUMAwNR2V70XhFF8SCShVEDIbHo5GtdL0bkWhDEJCrmCY63V5+RSEhIw9jZCQIB0l7aw4NfnGAISUlGhlUEoiJBwZNBQkeGRkgDA8agYGTGoVDEwQHBZoHGB1kGRAiIyOTJQ92QwMFsMIDd0MJIruTBFUICB\/PCJbFv7qTNjYSQh4YGM0IHNNSCSUnNwas3NwEEeFTDhpSGQTz86vtQtlSAwwEDAzs96ZFYECBQQJpAe9ESMAwgr2EUxJEiAACRBSIZCSCGDDgIsYpFTlC+UiFA0cFCnyRJNKBg4IMHfKtrIKyAwkJLmYOMQHz5gRVEzqrkFggAIUJFUEBmFggwYIJFypqJEUxAUUKqCxiBHVhFOqKGjFgzNDZ4qkKFi9gyJhBg8ZMFS3Opl3rVieLu2FnsE0K4MXcvXzD0q3LF4BewAGDAAAh+QQABwAFACwAAAAAIAAgAAAG\/0CAcEicKBKHg6ORZCgmxKh0KElADNiHo8K9XCqYxXQ6ARWSV2yj4XB4NZoLQTCmEg7nQ9rwYLsvcBsiBmJjCwgFiUkHWX1tbxoiIiEXGVMSBAgfikkIEQMZGR4JBoCCkyMXhUMTFAgYCJoFDB1jGQeSISEjJQZQQwOvsbEcdUMRG7ohJSUEdgTQBBi1xsAbI7vMhQPR0ArVUQm8zCUIABYJFAkMDB7gUhDkzBIkCfb2Eu9RGeQnJxEcEkSIAGKAPikPSti4YYPAABAgPIAgcTAKgg0E8gGIOKAjnYp1Og7goAAFyDokFYQycXKMAgUdOixg2VJKTBILJNCsSYTeAlYBFnbyFIJCAlATKVgMHeJCQtAULlQsHWICaVQWL6YCUGHiao0XMLSqULECKwwYM6ayUIE1BtoZNGgsZWFWBly5U1+4nQFXq5CzfPH6BRB4MBHBhpcGAQAh+QQABwAGACwAAAAAIAAgAAAG\/0CAcEgEZBKIgsFQKFAUk6J0Kkl8DljI0vBwOB6ExXQ6GSSb2MO2W2lXKILxUEJBID6FtHr5aHgrFxcQYmMLDHZ2eGl8fV6BGhoOGVMCDAQEGIgIBCADHRkDCQeOkBsbF4RDFiCWl5gJqUUZBxcapqYGUUMKCQmWlgpyQxG1IiHHBEMTvcywwkQcGyIiIyMahAoR2todz0URxiHVCAAoIOceIMHeRQfHIyUjEgsD9fUW7LIlxyUlER0KOChQMClfkQf9+hUAmKFhHINECCQs0aCDRRILTEAk4mGiCBIYJUhwsXFXwhMlRE6wYKFFSSEKTpZYicJEChUvp5iw6cLFikWcUnq6UKGCBdAiKloUZVEjxtEhLIrWeBEDxlOoLF7AgCFjxlUAMah2nTGDxtetZGmoNXs1LduvANLCJaJ2rt27ePPKCQIAIfkEAAcABwAsAAAAACAAIAAABv9AgHBIBHRABMzhgEEkFJOidCoANT+F7PJg6DIW06llkGwiCtsDpGtoPBKC8HACYhCSiDx6ue42Kg4HYGESEQkJdndme2wPfxUVBh1iEYaHDHYJAwokHRwgBQaOjxcPg0Mon5WWIKdFHR8OshcXGhBRQyQDHgMDIBGTckIgf7UbGgxDJgoKvb1xwkMKFcbHgwvM2RLRRREaGscbGAApHeYdGa7cQgcbIiEiGxIoC\/X1KetFGSLvIyEgFgQImCDAQj4pEEIoFIHAgkMTKFwcLMJAYYgRBkxodOFCxUQiHkooLLEhBccWKlh8lFZixIgSJVCqWMHixUohCmDqTMmixotJGDcBhNQpgkXNGDBgBCWgs8SDFy+SwpgR9AOOGzZOfEA6dcYMGkEBTGCgIQGArjTShi3iVe1atl\/fTokrVwrYunjz6t3Lt+\/bIAAh+QQABwAIACwAAAAAIAAgAAAG\/0CAcEgEdDwMAqJAIEQyk6J0KhhQCBiEdlk4eCmS6dSiSFCuTe2n64UYIBGBeGgZJO6JpBKx9h7cBg8FC3MTAyAgEXcUSVkfH34GkoEGHVMoCgOHiYoRChkkHQogCAeTDw0OBoRFopkDHiADYVMdCIEPDhUVB1FDExkZCsMcrHMAHgYNFboVFEMuCyShohbHRAoPuxcXFawmEuELC9bXRBEV3NwEACooFvAC5eZEHxca+BoSLSb9\/S30imTIt2GDBxUtXCh0EVCKAQ0iCiJQQZHiioZFGGwIEdEAi48fa2AkMiBEiBEhLrxYGeNFjJFDFJwcMUIEjJs4YQqRSbOmjFQZM2TIgKETWQmaJTQAXTqjKIESUEs8oEGValOdDqKWKEBjCI2rIxWcgHriBAgiVHVqKDF2LK2iQ0DguFEWAdwpCW7gMHa3SIK+gAMLHky4sOGAQQAAIfkEAAcACQAsAAAAACAAIAAABv9AgHBIBCw4kQQBQ2F4MsWoFGBRJBNNAgHBLXwSkmnURBqAIleGlosoHAoFkEAsNGU4AzMogdViEB8fbwcQCGFTJh0KiwMeZ3xqf4EHlBAQBx1SKQskGRkKeB4DGR0LCxkDGIKVBgYHh0QWEhKcnxkTUyQElq2tBbhDKRYWAgKmwHQDB70PDQlDKikmJiiyJnRECgYPzQ4PC0IqLS4u0y7YRR7cDhUODAA1Kyrz5OhRCOzsDQIvNSz\/KljYK5KBXYUKFwbEWNhP4MAiBxBeuEAAhsWFMR4WYVBBg8cDM2bIsAhDI5EBGjakrBCypQyTQxRsELGhJo2bNELCFKJAhM9dmkNyztgJYECIoyIuEKFBFACDECNGhDDQtMiDo1ERVI1ZAmpUEFuFPCgRtYQIWE0TnCjB9oTWrSBKrGVbAtxWAjfmniAQVsiAvCcuzOkLAO+ITIT9KkjMuLFjmEEAACH5BAAHAAoALAAAAAAgACAAAAb\/QIBwSARMOgNPIgECDTrFqBRgWmQUgwEosmQQviDJNOqyLDpXThLU\/WIQCM9kLGyhBJIFKa3leglvHwUEYlMqJiYWFgJ6aR5sCV5wCAUFCCRSLC0uLoiLCwsSEhMCewmAcAcFBx+FRCsqsS4piC5TCwkIHwe8BxhzQy8sw7AtKnRCHJW9BhFDMDEv0sMsyEMZvBAG2wtCMN\/fMTHWRAMH29sUQjIzMzLf5EUE6A8GAu347fFEHdsPDw4GzKBBkOC+Ih8AOqhAwKAQGgeJJGjgoOIBiBGlDKi48EHGKRkqVLhA8qMUBSQvaLhgMsoAlRo0OGhZhEHMDRoM0CRiYIPPVQ0IdgrJIKLoBhEehAI4EEJE0w2uWiYIQZVq0J0DRjgNMUJDN5oJSpQYwXUEAZoCNIhdW6KBgJ0XcLANAUWojRNiNShQutRG2698N2B4y1dI1MJjggAAIfkEAAcACwAsAAAAACAAIAAABv9AgHBIBJgkHQVnwFQsitAooHVcdDIKxcATSXgHAimURUVZJFbstpugEBiDiVhYU7VcJjM6uQR1GQQECBQSYi8sKyoqeCYCEiRZA34JgIIIBE9QMDEvNYiLJqGhKEgDlIEIqQiFRTCunCyKKlISIKgIHwUEckMzMzIymy8vc0IKGKkFBQcgvb6+wTDFQx24B8sFrDTbNM\/TRArLB+MJQjRD3d9FDOMHEBBhRNvqRB3jEAYGA\/TFCPn5DPjNifDPwAeBYjg8MPBgIUIpGRo+cNDgYZQMDRo4qFDRYpEBDkJWeOCxSAKRFQ6UJHLgwoUKFwisFJJBg4YLN\/fNPKBhg81UC6xKRhAhoqcGmSsHbCAqwmcmjwlEhGAqAqlFBQZKhNi69UE8hAgclBjLdYQGEh4PnBhbYsTYCxlKMrDBduyDpx5trF2L4WtJvSE+4F2ZwYNfKEEAACH5BAAHAAwALAAAAAAgACAAAAb\/QIBwSAS0TBPJIsPsSIrQKOC1crlMFmVGwRl4QAqBNBqrrVRXlGDRUSi8kURCYRkPYbEXa9W6ZklbAyBxCRQRYlIzMzJ4emhYWm+DchQMDAtSNDSLeCwqKn1+CwqTCQwEqE9RmzONL1ICA6aoBAgUE5mcdkIZp7UICAO5MrtDJBgYwMCqRZvFRArAHx8FEc\/PCdMF24jXYyTUBwUHCt67BAfpBwnmdiDpEBAI7WMK8BAH9FIdBv39+lEy+PsHsAiHBwMLFknwoOGDDwqJFGjgoCKBiLwcVNDoQBjGAhorVGjQrWCECyhFMsA44IIGDSkxKUywoebLCxQUChQRIoRNQwMln7lJQKBCiZ49a1YgQe9BiadHQ4wY4fNCBn0lTkCVOjWEAZn0IGiFWmLEBgJBzZ1YyzYEArAADZy4UOHDAFxjggAAIfkEAAcADQAsAAAAACAAIAAABv9AgHBIBLxYKlcKZRFMLMWoVAiDHVdJk0WyyCgW0Gl0RobFjtltV8EZdMJiAG0+k1lZK5cJNVl02AMgAxNxQzRlMTUrLSkmAn4KAx4gEREShXKHVYlIehJ\/kiAJCRECmIczUyYdoaMUEXBSc5gLlKMMBAOYuwu3BL+Xu4UdFL8ECB7CmCC\/CAgYpspiCxgYzggK0nEU1x8R2mIDHx8FBQTgUwrkBwUf6FIdBQfsB+9RHfP59kUK+fP7RCIYgDAQAcAhCAwoNEDhIIAODxYa4OAQwYOIEaPtA+GgY4MGDQFyaNCxgoMHCwBGqHChgksHCfZlOKChZssKEDQWQkAgggJNBREYPBCxoaaGCxdQKntQomnTECFEiNBQVMODDNJuOB0BteuGohBSKltgY2uIEWiJamCgc5cGHCecPh2hAYFYbRI+uCxxosIDBIPiBAEAIfkEAAcADgAsAAAAACAAIAAABv9AgHBIBNBmM1isxlK1XMWotHhUvpouk8WSmnqHVdhVlZ1IFhLTV0qrxsZlSSfTQa2JbaSytnKlUBMLHQqEAndDSDJWTX9nGQocAwMTh18uAguPkhEDFpVfFpADIBEJCp9fE6OkCQmGqFMLrAkUHLBeHK0UDAyUt1ESCbwEBBm\/UhHExCDHUQrKGBTNRR0I1ggE00Qk19baQ9UIBR8f30IKHwUFB+XmIAfrB9nmBAf2BwnmHRAH\/Aen3zAYMACB36tpIAYqzKdNgYEHCg0s0BbhgUWIDyKsEXABYJQMBxxUcOCgwYMDB6fYwHGiAQFTCiIwMKDhwoWRIyWuUXCihM9DEiNGhBi6QUPNCkgNdLhz44RToEGFhiha8+aBiWs6OH0KVaiIDUVvMkj5ZcGHElyDTv16AQNWVKoQlAwxwiKCSV+CAAAh+QQABwAPACwAAAAAIAAgAAAG\/0CAcEgk0mYzGOxVKzqfT9pR+WKprtCs8yhbWl2mlEurlSZjVRXYMkmRo8dzbaVKmSaLBer9nHVjXyYoAgsdHSZ8WixrEoUKGXuJWS6EHRkKAySSWiYkl5gDE5tZFgocAx4gCqNZHaggEQkWrE8WA7AJFJq0ThwRsQkcvE4ZCbkJIMNFJAkMzgzKRAsMBNUE0UML1hjX2AAdCBjh3dgDCOcI0N4MHx\/nEd4kBfPzq9gEBwX5BQLlB\/\/\/4D25lUgBBAgAC0h4AuJEiQRvPBiYeBBCMmI2cJQo8SADlA4FHkyk+KFfkQg2bGxcaYCBqgwgEhxw0OCByIkHFjyRsGFliU8QQEUI1aDhQoUKDWiKPNAhy4IGDkuMGBE0BNGiRyvQLKBTiwAMK6eO2CBiA1GjRx8kMPlmwYcNIahumHv2wgMCXTdNMGczxAaRBDiIyhIEACH5BAAHABAALAAAAAAgACAAAAb\/QIBwSCwOabSZcclkImcwWKxJXT6lr1p1C3hCY7WVasV1JqGwF0vlcrXKzJlMWlu7TCgXnJm2p1AWE3tNLG0mFhILgoNLKngTiR0mjEsuApEKC5RLAgsdCqAom0UmGaADAxKjRR0cqAMKq0QLAx4gIAOyQxK3Eb66QhK+CcTAABLEycYkCRTOCcYKDATUEcYJ1NQeRhaMCwgYGAQYGUUXD4wJCOvrAkMVNycl0HADHwj3CNtCISfy8rm4ZDhQoGABDKqEYCghr0SJEfSoDDhAkeCBfUImXGg4IsQIA+WWdEAAoSJFDIuGdAjhMITLEBsMUACRIQOIBAceGDBgsoAmVSMKRDgc0VHEBg0aLjhY+kDnTggQCpBosuBBx44wjyatwHTnTgQJmwggICKE0Q1HL1TgWqFBUwMJ3HH5pgEm0gtquTowwCAsnAkDMOzEW5KBgpRLggAAIfkEAAcAEQAsAAAAACAAIAAABv9AgHBILBqPyGSSpmw2aTOntAiVwaZSGhQWi2GX2pk1Vnt9j+EZDPZisc5INbu2UqngxzlL5Urd8UVtfC4mJoBGfCkmFhMuh0QrihYCEoaPQ4sCCx0Sl5gSmx0dnkImJB0ZChmkACapChwcrCiwA7asErYeu0MeBxGAJCAeIBG2Gic2JQ2AAxHPCQoRJycl1gpwEgnb2yQS1uAGcCAMDBQUCRYAH9XgCV8KBPLyA0IL4CEjG\/VSHRjz8joJIWAthMENwJpwQMAQAQYE\/IQIcFBihMEQIg6sOtKBQYECDREwmFCExIURFkNs0HDhQAIPGTI4+3Cg5oECHxAQEFgkwwVPjCI2rLzgwEGDBw8MGLD5ESSJJAsMBF3JsuhRpQYg1CxwYGcTAQQ0iL1woYJRpFi3giApZQGGCmQryHWQVCmEBDyxTOBAoGbRmxQUsEUSBAAh+QQABwASACwAAAAAIAAgAAAG\/0CAcEgsGo\/IpHLJbDqf0CiNNosyp1UrckqdwbRHrBcWAxdnaBjsxTYTZepXjcVyE2Nylqq1sgtjLCt7Li1+QoMuJimGACqJJigojCqQFgISBg8PBgZmLgKXEgslJyclJRlgLgusHR0ip6cRYCiuGbcOsSUEYBIKvwoZBaanD2AZHAMDHB0RpiEhqFYTyh7KCxIjJSMjIRBWHCDi4hYACNzdIrNPHQkR7wkKQgsb3NAbHE4LFBQJ\/gkThhCAdu\/COiUKCChk4E\/eEAEPNkjcoOHCgQ5ISCRAgEEhAQYRyhEhcUGihooOHBSIMMDVABAEEMjkuFDCkQwOTl64UMFBA0hNnA4ILfDhw0wCC5IsgLCzQs+fnAwIHWoUAQWbSgQwcOrUwSZOEIYWKIBgQMAmCwg8SPnVQNihCbBCmaCAQYEDnMgmyHAWSRAAIfkEAAcAEwAsAAAAACAAIAAABv9AgHBILBqPyKRyyWw6n9CodEpV0qrLK\/ZIo822w2t39gUDut4ZDAAyDLDkmQxGL5xsp8t7OofFYi8OJYMlBFR+gCwsIoQle1IxNYorKo0lClQ1lCoqLoQjJRxULC0upiaMIyElIFQqKSkmsg8lqiEMVC4WKBa9CCG2BlQTEgISEhYgwCEiIhlSJgvSJCQoEhsizBsHUiQZHRnfJgAIGxrnGhFQEgrt7QtCCxob5hoVok0SHgP8HAooQxjMO1fBQaslHSKA8MDQAwkiAgxouHDBgcUPHZBIAJEgQYSPEQYAJEKiwYUKFRo0ePAAAYgBHTooGECBAAEGDDp6FHAkwwNNlA5WGhh64EABBEgR2CRAwaOEJAsOOEj5YCiEokaTYlgKgqcSAQkeCDVwFetRBBiUDrDgZAGDoQbMFijwAW1XKRMUJKhbVGmEDBOUBAEAIfkEAAcAFAAsAAAAACAAIAAABv9AgHBILBqPyKRyyWw6n9CodEqFUqrJRQkHwhoRp5PtNPAKJaVTaf0xA0DqdUnhpdEK8lKDagfYZw8lIyMlBFQzdjQzMxolISElHoeLizIig490UzIwnZ0hmCKaUjAxpi8vGqAiIpJTMTWoLCwGGyIhGwxULCu9vQgbwRoQVCotxy0qHsIaFxlSKiYuKdQqEhrYGhUFUiYWJijhKgAEF80VDl1PJgsSAhMTJkILFRfoDg+jSxYZJAv\/ElwMoVChQoMGDwy4UiJBgYIMGTp0mEBEwAEH6BIaQNABiQAOHgYMcKiggzwiCww4QGig5QEMI\/9lUAAiQQQQIQdwUIDiSAdQAxoNQDhwoAACBBgIEGCQwOZNEAMoIllQQCNRokaRKmXaNMIAC0sEJHCJtcAHrUqbJlAAtomEBFcLmEWalEACDgKkTMiQQKlRBgxAdGiLJAgAIfkEAAcAFQAsAAAAACAAIAAABv9AgHBILBqPyKRyyWw6n0yFBtpcbHBTanLiKJVsWa2R4PXeNuLiouwdKdJERGk08ibgQ8mmFAqVIHhDICEjfSVvgQAIhH0GiUIGIiEiIgyPABoblCIDjzQboKAZcDQ0AKUamamIWjMzpTQzFakaFx5prrkzELUaFRRpMMLDBBfGDgdpLzExMMwDFxUVDg4dWi8sLC8vNS8CDdIODQhaKior2doADA7TDwa3Ty0uLi3mK0ILDw7vBhCsS1xYMGEiRQoX+IQk6GfAwIFOS1BIkGDBAgoULogIKNAPwoEDBEggsUAiA4kFEwVYaKHmQEOPHz8wGJBhwQISHQYM4KAgQ4dYkxIyGungEuaBDwgwECDAIEEEEDp5ZjBpIokEBB8LaEWQlCmFCE897FTQoaoSASC0bu3KNIFbEFAXmGUiIcEHpFyXNnUbIYMFLRMygGDAAAEBpxwW\/E0SBAAh+QQABwAWACwAAAAAIAAgAAAG\/0CAcEgsGo9I4iLJZAowuKa0uHicTqXpNLPBnnATLXOxKZnNUfFx8jCPzgb1kfAOhcwJuZE8GtlDA3pGGCF+hXmCRBIbIiEiIgeJRR4iGo8iGZJECBudGnGaQwYangyhQw4aqheBpwAXsBcVma6yFQ4VCq4AD7cODq2nBxXEDYh6NEQ0BL8NDx+JNNIA0gMODQbZHXoz3dI0MwIGD9kGGHowMN3dQhTk2QfBUzEx6ekyQgvZEAf9tFIsWNR4Qa\/ekAgG+vUroKuJihYqVgisEYOIgA8KDxRAkGDJERcmTLhwoSIiiz0FNGpEgIFAggwkBEyQIGHBAgEWQo5UcdIIiVcPBQp8QICAAAMKCUB4GKAgQ4cFEiygMJFCRRIJBDayJGA0QQQQA5jChDrBhFUmE0AQLdo16dKmThegcKFFAggMLRkk2AtWrIQUeix0GPB1b9gOAkwwCQIAIfkEAAcAFwAsAAAAACAAIAAABv9AgHBInAw8xKRymVx8Sqcbc8oUEErYU4nKHS4e2LCN0KVmLthR+HQoMxeX0SgUCjcQbuXEEJr3SwYZeUsMIiIhhyIJg0sLGhuGIhsDjEsEjxuQEZVKEhcajxptnEkDn6AagqREGBeuFxCrSQcVFQ4Oi7JDD7a3lLpCDbYNDarADQ4NDw8KwEIGy9C\/wAUG1gabzgzXBnjOAwYQEAcHHc4C4+QHDJU0SwnqBQXNeTM07kkSBQfyHwjmZWTMsOfu3hAQ\/AogQECAHpUYMAQSxCdkAoEC\/hgSACGBCQsWNSDCGDhDyYKFCwkwoJCAwwIBJkykcJGihQoWL0SOXEKCAAZVDCoZRADhgUOGDhIsoHBhE2ROGFMEUABKgCWIAQMUdFiQ1IQLFTdDcrEwQGWCBEOzHn2JwquLFTXcCBhwNsFVox1ILJiwdEUlCwsUDOCQdasFE1yCAAA7AAAAAAAAAAAA') no-repeat center center;\n}\n.h5p-video-loading.h5p-show {\n  display: block;\n}\n.h5p-video-error {\n  position: absolute;\n  text-align: center;\n  top: 50%;\n  left: 50%;\n  color: #fff;\n  padding: 1em;\n  background: rgba(0,0,0,0.9);\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Audio-1.2\/styles\/audio.css?ver=1.2.12":".h5p-audio-inner {\n  height: 100%;\n  width: 100%;\n}\n\n.h5p-course-presentation .h5p-element.h5p-audio-wrapper {\n  overflow: visible !important;\n}\n\n.h5p-audio-inner .h5p-audio-minimal-button {\n  font-family: 'H5PFontAwesome4';\n\n  display: block;\n  padding: 0.3em;\n\n  font-size: 0.8em;\n  border: 0.1em solid #fff;\n  border-radius: 50%;\n\n  cursor: pointer;\n  color: #fff;\n  text-decoration: none;\n\n  background: rgb(100,152,254); \/* Old browsers *\/\n  background: -moz-linear-gradient(top,  rgba(100,152,254,1) 0%, rgba(4,104,206,1) 100%); \/* FF3.6+ *\/\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(100,152,254,1)), color-stop(100%,rgba(4,104,206,1))); \/* Chrome,Safari4+ *\/\n  background: -webkit-linear-gradient(top,  rgba(100,152,254,1) 0%,rgba(4,104,206,1) 100%); \/* Chrome10+,Safari5.1+ *\/\n  background: -o-linear-gradient(top,  rgba(100,152,254,1) 0%,rgba(4,104,206,1) 100%); \/* Opera 11.10+ *\/\n  background: -ms-linear-gradient(top,  rgba(100,152,254,1) 0%,rgba(4,104,206,1) 100%); \/* IE10+ *\/\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6498fe', endColorstr='#0468ce',GradientType=0 ); \/* IE6-9 *\/\n}\n\n.h5p-audio-inner .h5p-audio-minimal-button:hover {\n  cursor: pointer;\n}\n\n.h5p-audio-inner .h5p-audio-minimal-play:before {\n  content: \"\\f028\";\n}\n\n.h5p-audio-inner .h5p-audio-minimal-pause:before {\n  content: \"\\f04c\";\n}\n\n.editor .h5p-audio-transparent {\n  position: relative;\n  box-sizing: border-box;\n  padding: -2px;\n  border: 2px dashed #0468ce;\n  border: 2px dashed rgba(4,104,206,0.5);\n  height: 100%;\n}\n\n.editor .h5p-audio-transparent:before {\n  color: #0468ce;\n  opacity: 0.25;\n  content: \"\\f028\";\n  font-family: 'H5PFontAwesome4';\n  font-size: 1.0em;\n  text-decoration: none;\n  padding-left: 0.25em;\n}\n\n.h5p-audio-inner.h5p-audio-transparent .h5p-audio-minimal-button {\n  display: block;\n  cursor: pointer;\n  font-family: 'H5PFontAwesome4';\n  text-decoration: none;\n  font-size: 0.8em;\n  border: 0;\n  background: transparent;\n  border-radius: 0;\n}\n\n.h5p-audio-inner.h5p-audio-transparent .h5p-audio-minimal-button:hover {\n  background: #0580e2;\n  opacity: 0.2;\n}\n\n.h5p-audio-inner.h5p-audio-transparent .h5p-audio-minimal-button:active {\n  background: #0580e2;\n  opacity: 0.4;\n}\n\n.h5p-audio-inner.h5p-audio-transparent .h5p-audio-minimal-play:before,\n.h5p-audio-inner.h5p-audio-transparent .h5p-audio-minimal-pause:before {\n  content: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/Tether-1.0\/styles\/tether.min.css?ver=1.0.2":".tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/Drop-1.0\/css\/drop-theme-arrows-bounce.min.css?ver=1.0.2":".drop-element,.drop-element *,.drop-element :after,.drop-element :before,.drop-element:after,.drop-element:before{box-sizing:border-box}.drop-element{position:absolute;display:none}.drop-element.drop-open{display:block}.drop-element.drop-theme-arrows-bounce .drop-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:#444;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2));filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2))}.drop-element.drop-theme-arrows-bounce .drop-content:before{content:\"\";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:12px;border-style:solid}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-center .drop-content:before{top:100%;left:50%;margin-left:-12px;border-top-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-center .drop-content{margin-top:12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-center .drop-content:before{bottom:100%;left:50%;margin-left:-12px;border-bottom-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-right.drop-element-attached-middle .drop-content:before{left:100%;top:50%;margin-top:-12px;border-left-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-left.drop-element-attached-middle .drop-content:before{right:100%;top:50%;margin-top:-12px;border-right-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-bottom .drop-content:before{bottom:100%;left:12px;border-bottom-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-bottom .drop-content:before{bottom:100%;right:12px;border-bottom-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-top .drop-content:before{top:100%;left:12px;border-top-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-top .drop-content:before{top:100%;right:12px;border-top-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-left .drop-content:before{top:12px;left:100%;border-left-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-right .drop-content:before{top:12px;right:100%;border-right-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-left .drop-content:before{bottom:12px;left:100%;border-left-color:#fff}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-right .drop-content:before{bottom:12px;right:100%;border-right-color:#fff}.drop-element.drop-theme-arrows-bounce{max-width:100%;max-height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:opacity .1s;transition:opacity .1s;opacity:0}.drop-element.drop-theme-arrows-bounce .drop-content{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.265,1.55);transition:transform .3s cubic-bezier(0,0,.265,1.55);-webkit-transform:scale(0) translateZ(0);transform:scale(0) translateZ(0)}.drop-element.drop-theme-arrows-bounce.drop-open{display:none}.drop-element.drop-theme-arrows-bounce.drop-open-transitionend{display:block}.drop-element.drop-theme-arrows-bounce.drop-after-open{-webkit-transition:none;transition:none;opacity:1}.drop-element.drop-theme-arrows-bounce.drop-after-open .drop-content{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-center .drop-content{margin-bottom:12px;-webkit-transform-origin:50%,calc(100% + 12px);-ms-transform-origin:50%,calc(100% + 12px);transform-origin:50%,calc(100% + 12px)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-center .drop-content{-webkit-transform-origin:50%,-12px;-ms-transform-origin:50%,-12px;transform-origin:50%,-12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-right.drop-element-attached-middle .drop-content{margin-right:12px;-webkit-transform-origin:calc(100% + 12px),50%;-ms-transform-origin:calc(100% + 12px),50%;transform-origin:calc(100% + 12px),50%}.drop-element.drop-theme-arrows-bounce.drop-element-attached-left.drop-element-attached-middle .drop-content{margin-left:12px;-webkit-transform-origin:-12px,50%;-ms-transform-origin:-12px,50%;transform-origin:-12px,50%}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-bottom .drop-content{margin-top:12px;-webkit-transform-origin:0,-12px;-ms-transform-origin:0,-12px;transform-origin:0,-12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-bottom .drop-content{margin-top:12px;-webkit-transform-origin:100%,-12px;-ms-transform-origin:100%,-12px;transform-origin:100%,-12px}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-top .drop-content{margin-bottom:12px;-webkit-transform-origin:0,calc(100% + 12px);-ms-transform-origin:0,calc(100% + 12px);transform-origin:0,calc(100% + 12px)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-top .drop-content{margin-bottom:12px;-webkit-transform-origin:100%,calc(100% + 12px);-ms-transform-origin:100%,calc(100% + 12px);transform-origin:100%,calc(100% + 12px)}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-right.drop-target-attached-left .drop-content{margin-right:12px;-webkit-transform-origin:calc(100% + 12px),0;-ms-transform-origin:calc(100% + 12px),0;transform-origin:calc(100% + 12px),0}.drop-element.drop-theme-arrows-bounce.drop-element-attached-top.drop-element-attached-left.drop-target-attached-right .drop-content{margin-left:12px;-webkit-transform-origin:-12px,0;-ms-transform-origin:-12px,0;transform-origin:-12px,0}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-right.drop-target-attached-left .drop-content{margin-right:12px;-webkit-transform-origin:calc(100% + 12px),100%;-ms-transform-origin:calc(100% + 12px),100%;transform-origin:calc(100% + 12px),100%}.drop-element.drop-theme-arrows-bounce.drop-element-attached-bottom.drop-element-attached-left.drop-target-attached-right .drop-content{margin-left:12px;-webkit-transform-origin:-12px,100%;-ms-transform-origin:-12px,100%;transform-origin:-12px,100%}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-help-dialog.css?ver=1.3.5":"\/* Main Container *\/\n.joubel-help-text-dialog-box {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  color: #555;\n  z-index: 2;\n}\n\n\/* Background for help dialog *\/\n.joubel-help-text-dialog-background {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  background: #555555;\n  opacity: 0.75;\n}\n\n\/* ------------------------------------ Main content container ------------------------ *\/\n.joubel-help-text-dialog-container {\n  display: block;\n  position: absolute;\n  top: 3.5%;\n  left: 20%;\n  width: 60%;\n  background: #fff;\n  opacity: 1;\n  max-height: 93%;\n  overflow: auto;\n}\n\n\/* Header *\/\n.joubel-help-text-header {\n  font-size: 1.1em;\n  border-bottom: 1px solid #E0E0E0;\n  padding: 0.75em 3em 0.75em 1.5em;\n}\n\n\/* Body *\/\n.joubel-help-text-body {\n  padding: 0.5em 1.5em;\n  margin: 1em 0 2em;\n}\n\n\/* Close help dialog container *\/\n.joubel-help-text-remove {\n  position: absolute;\n  right: 1.5em;\n  top: 0.8em;\n  cursor: pointer;\n}\n\n.joubel-help-text-remove:hover {\n  color: #333;\n}\n\n.joubel-help-text-remove:before {\n  font-family: 'H5PFontAwesome4';\n  content: '\\f00d';\n  font-size: 1.3em;\n  right: 0em;\n  top: 0em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-message-dialog.css?ver=1.3.5":"@CHARSET \"UTF-8\";\n\n.joubel-message-dialog {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  width: 100%;\n  padding: .3em;\n  z-index: 11;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  border-top: 1px solid #ffcd0d;\n  background-color: #fcffcc;\n  text-align: center;\n  font-size: 0.8em;\n}\n.joubel-message-dialog:before {\n  font-family: 'H5PFontAwesome4';\n  content: '\\f05a';\n  padding-right: .5em;\n  font-size: 1.3em;\n  position: relative;\n  top: 0.1em;\n}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-progress-circle.css?ver=1.3.5":".joubel-progress-circle-wrapper{\n  display: inline-block;\n  padding: 0em 1em;\n}\n.joubel-progress-circle-percentage{\n  position: relative;\n  font-size: 1em;\n}\n\n.joubel-progress-circle-circle{\n  -webkit-transform: rotate(0deg);\n  -ms-transform: rotate(0deg);\n  transform: rotate(0deg);\n\n  display: -webkit-box;      \/* OLD - iOS 6-, Safari 3.1-6 *\/\n  display: -ms-flexbox;      \/* TWEENER - IE 10 *\/\n  display: -webkit-flex;     \/* NEW - Chrome *\/\n  display: flex;             \/* NEW, Spec - Opera 12.1, Firefox 20+ *\/\n\n  -webkit-align-items: center;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n\n  -webkit-justify-content: center;\n  -webkit-box-pack: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n\n  position: relative;\n\n  top: 0.151em;\n  left: 0.151em;\n  text-align: center;\n  width: 2.7em;\n  height: 2.7em;\n\n  -webkit-border-radius: 100%; \/* Safari 3-4, iOS 1-3.2, Android 1.6- *\/\n  -moz-border-radius: 100%; \/* Firefox 1-3.6 *\/\n  border-radius: 100%; \/* Opera 10.5, IE 9, Safari 5, Chrome, Firefox 4, iOS 4, Android 2.1+ *\/\n\n  background-color: #fff;\n}\n\n.joubel-progress-circle-active-border{\n  position: relative;\n  text-align: center;\n  width: 3em;\n  height: 3em;\n\n  -webkit-border-radius: 100%; \/* Safari 3-4, iOS 1-3.2, Android 1.6- *\/\n  -moz-border-radius: 100%; \/* Firefox 1-3.6 *\/\n  border-radius: 100%; \/* Opera 10.5, IE 9, Safari 5, Chrome, Firefox 4, iOS 4, Android 2.1+ *\/\n\n  background-color: #1a73d9;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-simple-rounded-button.css?ver=1.3.5":".joubel-simple-rounded-button {\n  cursor: pointer;\n  display: inline-block;\n  margin: 0.25em 0;\n  padding: 0.3em 1.2em;\n  border-radius: 2em;\n  background-color: #1a73d9;\n  color: #FFFFFF;\n}\n\n.joubel-simple-rounded-button:hover,\n.joubel-simple-rounded-button:focus {\n  background-color: #1356a3;\n}\n\n.joubel-simple-rounded-button:active {\n  position: relative;\n  background-color: #104888;\n\n  -webkit-box-shadow: inset 0 4px 0px #0e407a;\n  -moz-box-shadow: inset 0 4px 0px #0e407a;\n  box-shadow: inset 0 4px 0px #0e407a;\n}\n\n.joubel-simple-rounded-button:active .joubel-simple-rounded-button-text {\n  position: relative;\n  top: 2px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-speech-bubble.css?ver=1.3.5":"@CHARSET \"UTF-8\";\n\n.joubel-speech-bubble {\n  position: absolute;\n  color: #333;\n  z-index: 301;\n  margin-top: 0.45em;\n  min-width: 1em;\n  opacity: 0;\n  transition: opacity 0.5s ease;\n}\n.joubel-speech-bubble p {\n  margin: 0.75em 0;\n}\n.joubel-speech-bubble p:first-child {\n  margin-top: 0.25em;\n}\n.joubel-speech-bubble p:last-child {\n  margin-bottom: 0.25em;\n}\n.joubel-speech-bubble.show {\n  opacity: 1;\n}\n.joubel-speech-bubble-inner {\n  background: #fbfbfb;\n  box-shadow: 0 0 0.5em #2c2c2c;\n  border-radius: 0.5em;\n  padding: 0.2em 0.5em;\n  text-align: left;\n  position: relative;\n  word-wrap: break-word; \/* Long words have to break *\/\n  z-index: 1;\n}\n.joubel-speech-bubble-inner-tail,\n.joubel-speech-bubble-tail {\n  position: absolute;\n  \/* Setting these in pixels is intentional. We use it when calculating placement of bubble *\/\n  width: 12px;\n  height: 12px;\n  background: #fbfbfb;\n  -webkit-transform: rotate(45deg);\n  -moz-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  -o-transform: rotate(45deg);\n  transform: rotate(45deg);\n  z-index: -1;\n}\n.joubel-speech-bubble-tail {\n  box-shadow: 0 0 0.5em #2c2c2c;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-tip.css?ver=1.3.5":".joubel-tip-container {\n  display: inline-block;\n  font-weight: normal;\n  color: #777;\n  cursor: pointer;\n}\n.joubel-tip-container:hover {\n  color: #333;\n}\n.joubel-tip-container:focus {\n  outline: 0;\n  box-shadow: 0px 0px 5px 2px rgba(140,185,240,1);\n  outline: rgba(140,185,240,1) solid 1px;\n}\n.joubel-tip-container.be-quiet:focus {\n  outline: none;\n}\n.joubel-tip-container.be-quiet {\n  pointer-events: none;\n}\n.joubel-tip-icon {\n  text-align: center;\n  font-size: 1.5em;\n  line-height: 1.5em;\n  width: 1.5em;\n  height: 1.5em;\n  pointer-events: none;\n}\n.joubel-tip-icon:before {\n  font-family: Joubel;\n  content: \"\\e888\";\n\n  \/* Better Font Rendering *\/\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.joubel-tip-icon.help-icon:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f059\";\n}\n\n.joubel-tip-container * {\n  pointer-events: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-slider.css?ver=1.3.5":".h5p-joubel-ui-slider {\n  -webkit-transition: -webkit-transform 0.3s ease-in-out;\n  -moz-transition: -moz-transform 0.3s ease-in-out;\n  -ms-transition: -ms-transform 0.3s ease-in-out;\n  transition: transform 0.3s ease-in-out;\n\n  \/* Avoid flickering *\/\n  -webkit-transform: translateX(0);\n  -moz-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n\n  height: 100%;\n}\n.h5p-joubel-ui-slide {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n\n  top: 0;\n  left: 0;\n\n  display: none;\n}\n.h5p-joubel-ui-slide.current {\n  display: block;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-score-bar.css?ver=1.3.5":".h5p-joubelui-score-bar {\n  display: inline-flex;\n  display: -webkit-inline-flexbox;\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  width: 19.917em;\n  max-width: 100%;\n  background: #fff;\n  border-radius: 1.5em;\n  padding: 0.625em;\n  border: 1px solid rgba(0, 0, 0, 0.08);\n  box-sizing: border-box;\n  position: relative;\n}\n.h5p-joubelui-score-bar-visuals {\n  flex: 1;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  position: relative;\n  overflow: visible;\n}\n.h5p-joubelui-score-bar-progress-wrapper {\n  position: relative;\n  margin-right: 1.7em;\n  height: 0.917em;\n  border-top-left-radius: 1.5em;\n  border-bottom-left-radius: 1.5em;\n  background: #ddd;\n}\n.h5p-joubelui-score-bar-progress {\n  overflow: hidden;\n  white-space: nowrap;\n  color: transparent;\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: 100%;\n  width: 0;\n  border-top-left-radius: .5em;\n  border-bottom-left-radius: .5em;\n  background: #48b57e; \/* For browsers not supporting linear-gradient *\/\n  background: linear-gradient(to right, #52ca8d, #48b57e);\n  -webkit-transition: width 0.4s ease-in-out;\n  -moz-transition: width 0.4s ease-in-out;\n  -o-transition: width 0.4s ease-in-out;\n  transition: width 0.4s ease-in-out;\n  -webkit-backface-visibility: hidden;\n}\n\/* The star *\/\n.h5p-joubelui-score-bar-star {\n  height: 1.8em;\n  width: 2.1em;\n  position: absolute;\n  right: 0;\n  top: -0.4em;\n  overflow: visible;\n}\n.h5p-joubelui-score-bar-full-score.h5p-joubelui-score-bar-animation-active .h5p-joubelui-score-bar-star {\n  -webkit-animation: pound 0.8s 1;\n          animation: pound 0.8s 1;\n}\n@keyframes pound {\n  from {\n    transform: scale(0);\n  }\n  20% {\n    transform: scale(1.4);\n  }\n  60% {\n    transform: scale(0.8);\n  }\n  80% {\n    transform: scale(1.2);\n  }\n  to {\n    transform: scale(1);\n  }\n}\n@-webkit-keyframes pound {\n  from {\n    -webkit-transform: scale(0);\n  }\n  20% {\n    -webkit-transform: scale(1.4);\n  }\n  60% {\n    -webkit-transform: scale(0.8);\n  }\n  80% {\n    -webkit-transform: scale(1.2);\n  }\n  to {\n    -webkit-transform: scale(1);\n  }\n}\n\/* Styling the star *\/\n.h5p-joubelui-score-bar-star svg {\n  overflow: visible;\n}\n.h5p-joubelui-score-bar-star-shadow {\n  fill: #fff;\n}\n.h5p-joubelui-score-bar-star-border {\n  fill: none;\n  stroke: #ddd;\n  stroke-miterlimit: 10;\n  stroke-width: 3px;\n}\n.h5p-joubelui-score-bar-star-fill {\n  fill: #ddd;\n}\n.h5p-joubelui-score-bar-full-score .h5p-joubelui-score-bar-star-border {\n  stroke: #ab741a;\n  stroke-width: 6;\n}\n.h5p-joubelui-score-bar-star-fill-full-score {\n  visibility: hidden;\n  fill: #ffc80b;\n}\n.h5p-joubelui-score-bar-full-score .h5p-joubelui-score-bar-star-fill {\n  \/* This  will be a fallback for browsers not supporting the filter,\n     i.e. Safari *\/\n  fill: #ffc80b;\n}\n.h5p-joubelui-score-bar-full-score .h5p-joubelui-score-bar-star-fill-full-score {\n  visibility: visible;\n}\n\n\/* The numeric part on the end (score \/ maxScore) *\/\n.h5p-joubelui-score-numeric {\n  margin: 0em 0.4em;\n  font-size: 1.333em;\n  line-height: 0.7;\n  font-weight: bold;\n}\n.h5p-score-bar-has-help .h5p-joubelui-score-numeric {\n  \/* Need more space when icon is displayed *\/\n  margin-right: 0.625em;\n}\n.h5p-joubelui-score-number {\n  color: #333;\n}\n.h5p-joubelui-score-number-separator {\n  color: #999;\n  padding: 0 0.1em;\n}\n.h5p-joubelui-score-bar .joubel-tip-container {\n  position: absolute;\n  top: 0.1em;\n  right: 0.3em;\n  font-size: 1em;\n  line-height: 1;\n  color: #1a73d9;\n  margin-right: 0.2em;\n}\n.h5p-joubelui-score-bar .joubel-tip-container > .help-icon {\n  font-size: 1em;\n  line-height: 1;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-progressbar.css?ver=1.3.5":".h5p-joubelui-progressbar {\n  width: 100%;\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: .25em;\n  background: #fff;\n  -webkit-box-shadow: 0px -1px 3px 0px rgba(1,72,118,0.75);\n  -moz-box-shadow: 0px -1px 3px 0px rgba(1,72,118,0.75);\n  box-shadow: 0px -1px 3px 0px rgba(1,72,118,0.75);\n}\n\n.h5p-joubelui-progressbar-slide-status-text {\n  font-size: 0;\n  width: 0;\n  height: 0;\n}\n\n.h5p-joubelui-progressbar-background {\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: 100%;\n  width: 0;\n  background-color: #014876;\n  -webkit-transition: width .3s ease-in-out;\n  -moz-transition: width .3s ease-in-out;\n  -o-transition: width .3s ease-in-out;\n  transition: width .3s ease-in-out;\n}\n.h5p-joubelui-drop {\n  z-index: 1;\n}\n.drop-element.h5p-joubelui-drop .drop-content {\n  padding: .2em .8em;\n  font-weight: bold;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-ui.css?ver=1.3.5":"@CHARSET \"UTF-8\";\n\n\/* Styling of button *\/\n.h5peditor .ui-dialog .h5p-joubelui-button,\n.h5peditor .h5p-joubelui-button,\n.h5p-joubelui-button {\n  font-size: 1em;\n  line-height: 1.2;\n  margin: 0 0.5em 1em;\n  padding: 0.5em 1.25em;\n  border-radius: 2em;\n\n  background: #1a73d9;\n  color: #ffffff;\n\n  cursor: pointer;\n  border: none;\n  box-shadow: none;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0);\n\n  display: inline-block;\n  text-align: center;\n  text-shadow: none;\n  text-decoration: none;\n  vertical-align: baseline;\n}\n.h5p-joubelui-button:first-child {\n  margin: 0 0.5em 1em 0;\n}\n\n.h5p-joubelui-button:last-child {\n  margin: 0 0 1em 0.5em;\n}\n\n.h5p-joubelui-button:first-child:last-child {\n  margin: 0 0 1em;\n}\n\n\/* Truncated buttons *\/\n.h5p-joubelui-button.truncated {\n  width: 2.235em;\n  height: 2.235em;\n  border-radius: 50%;\n  padding: 0;\n  text-align: center;\n}\n\n.h5p-joubelui-button.truncated:before {\n  padding: 0;\n}\n\n.h5p-joubelui-button:hover,\n.h5p-joubelui-button:focus {\n  background: #1356a3;\n  color: #fff;\n  text-decoration: none;\n  -webkit-transition: initial;\n  -moz-transition: initial;\n  -o-transition: initial;\n  transition: initial;\n}\n.h5p-joubelui-button:active {\n  position: relative;\n  background: #104888;\n\n  -webkit-box-shadow: inset 0 4px 0 #0e407a;\n  -moz-box-shadow: inset 0 4px 0 #0e407a;\n  box-shadow: inset 0 4px 0 #0e407a;\n}\n.h5p-joubelui-button:active .h5p-joubelui-button-text {\n  position: relative;\n  top: 2px;\n}\n\n.h5p-joubelui-button:before {\n  font-family: 'H5PFontAwesome4';\n  padding-right: 0.5em;\n}\n\n.h5p-question-try-again:before {\n  content: \"\\F01E\";\n}\n\n.h5p-question-show-solution:before {\n  content: \"\\F06E\";\n}\n\n.h5p-question-check-answer:before {\n  content: \"\\F058\";\n}\n\n\/* Remove outline for all elements having tabIndex=\"-1\"*\/\n.h5p-content [tabIndex=\"-1\"] {\n  outline: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.JoubelUI-1.3\/css\/joubel-icon.css?ver=1.3.5":"[class^=\"joubel-icon-\"], [class*=\" joubel-icon-\"] {\n  \/* use !important to prevent issues with browser extensions that change fonts *\/\n  font-family: 'H5PFontIcons' !important;\n  speak: none;\n  font-size: 1.5em; \n  line-height: 1.5em;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  word-wrap: normal;\n  cursor: pointer;\n\n  \/* Better Font Rendering =========== *\/\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n\/* Comment icon *\/\n.joubel-icon-comment-normal .h5p-icon-shadow:before {\n  content: \"\\e90a\";\n  color: rgb(221, 221, 221);\n}\n.joubel-icon-comment-normal .h5p-icon-speech-bubble:before {\n  content: \"\\e908\";\n  margin-left: -1em;\n  color: rgb(206, 114, 193);\n}\n.joubel-icon-comment-normal .h5p-icon-question:before {\n  content: \"\\e906\";\n  margin-left: -1em;\n  color: rgb(255, 255, 255);\n}\n.joubel-icon-comment-normal:hover .h5p-icon-speech-bubble:before {\n  color: rgb(188, 92, 163);\n}\n.joubel-icon-comment-normal:active .h5p-icon-speech-bubble:before {\n  color: rgb(206, 114, 193);\n  position: relative;\n  top: 0.05em;\n  left: 0.05em;\n}\n.joubel-icon-comment-normal:active .h5p-icon-question:before {\n  position: relative;\n  top: 0.05em;\n  left: 0.05em;\n}\n\n\/* Tip icon *\/\n.joubel-icon-tip-normal .h5p-icon-shadow:before {\n  content: \"\\e90a\";\n  color: rgb(221, 221, 221);\n}\n.joubel-icon-tip-normal .h5p-icon-speech-bubble:before {\n  content: \"\\e908\";\n  margin-left: -1em;\n  color: rgb(53, 128, 195);\n}\n.joubel-icon-tip-normal .h5p-icon-info:before {\n  content: \"\\e905\";\n  margin-left: -1em;\n  color: rgb(255, 255, 255);\n}\n.joubel-icon-tip-normal:hover .h5p-icon-speech-bubble:before {\n  color: rgb(72, 155, 213);\n}\n.joubel-icon-tip-normal:active .h5p-icon-speech-bubble:before {\n  color: rgb(72, 155, 213);\n  position: relative;\n  top: 0.05em;\n  left: 0.05em;\n}\n.joubel-icon-tip-normal:active .h5p-icon-info:before {\n  position: relative;\n  top: 0.05em;\n  left: 0.05em;\n}\n\n\/* Edit icon *\/\n.joubel-icon-edit .h5p-icon-circle:before {\n  content: \"\\e90d\";\n  color: #1d74c8;\n  font-size: 1.5em;\n}\n.joubel-icon-edit .h5p-icon-pencil:before {\n  content: \"\\e90c\";\n  color: #1d74c8;\n  font-size: 0.8em;\n  text-align: center;\n  position: absolute;\n  margin-left: -1.42em;\n}\n.joubel-icon-edit:hover .h5p-icon-circle:before {\n  content: \"\\e90e\";\n  color: #1d74c8;\n}\n.joubel-icon-edit:hover .h5p-icon-pencil:before {\n  color: #ffffff;\n}\n\n\/* Approve icon *\/\n.joubel-icon-approve .h5p-icon-circle:before {\n  content: \"\\e90d\";\n  color: #3ea35f;\n  font-size: 1.5em;\n}\n.joubel-icon-approve .h5p-icon-check:before {\n  content: \"\\e601\";\n  color: #3ea35f;\n  font-size: 0.8em;\n  text-align: center;\n  position: absolute;\n  margin-left: -1.42em;\n}\n.joubel-icon-approve:hover .h5p-icon-circle:before {\n  content: \"\\e90e\";\n}\n.joubel-icon-approve:hover .h5p-icon-check:before {\n  color: #ffffff;\n}\n\n\/* Cancel icon *\/\n.joubel-icon-cancel .h5p-icon-circle:before {\n  content: \"\\e90d\";\n  color: #de3354;\n  font-size: 1.5em;\n}\n.joubel-icon-cancel .h5p-icon-cross:before {\n  content: \"\\e600\";\n  color: #de3354;\n  font-size: 0.8em;\n  text-align: center;\n  position: absolute;\n  margin-left: -1.42em;\n}\n.joubel-icon-cancel:hover .h5p-icon-circle:before {\n  content: \"\\e90e\";\n}\n.joubel-icon-cancel:hover .h5p-icon-cross:before {\n  color: #ffffff;\n}\n\n\/* Custom override CSS *\/\n.joubel-icon-tip-normal.help-icon:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f059\";\n}\n\n\/* Hide icon layers if using font awesome *\/\n.joubel-icon-tip-normal.help-icon > span {\n  display: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/styles\/question.css?ver=1.3.4":".h5p-question {\n  background: rgba(255, 255, 255, 0.9);\n  position: relative;\n}\n.h5p-question-video {\n  line-height: 0;\n}\n.h5p-question-video > video {\n  width: 100%;\n}\n.h5p-question-image {\n  text-align: left;\n  margin: 0 0 1em;\n  line-height: 0.8125em;\n}\n.h5p-question-image img {\n  display: block;\n  width: 100%;\n  height: auto;\n  border: 0;\n  outline: none;\n}\n\n.h5p-question-image-wrap {\n  display: inline-block;\n  position: relative;\n  margin-bottom: 1em;\n  -webkit-transform: translate(1em, 1em);\n  transform: translate(1em, 1em);\n  max-width: calc(100% - 2em);\n}\n\n.h5p-question-image.animatable .h5p-question-image-wrap.h5p-question-image-scalable {\n  -webkit-transition: -webkit-transform 0.3s 0.3s, margin 0.3s 0.3s, width 0.3s 0s;\n  transition: transform 0.3s 0.3s, margin 0.3s 0.3s, width 0.3s 0s;\n}\n\n.h5p-question-image.animatable.h5p-question-image-fill-width .h5p-question-image-wrap {\n  -webkit-transition: -webkit-transform 0.3s 0s, margin 0.3s 0s, width 0.3s 0.3s;\n  transition: transform 0.3s 0s, margin 0.3s 0s, width 0.3s 0.3s;\n}\n\n.h5p-question-image-overlay {\n  display: none;\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.h5p-question-image-overlay.show {\n  display: block;\n}\n\n.h5p-question-image-fill-width .h5p-question-image-wrap,\n.h5p-no-frame > .h5p-question .h5p-question-image-wrap,\n.h5p-transparent > div > .h5p-question .h5p-question-image-wrap {\n  -webkit-transform: translate(0, 0);\n  transform: translate(0, 0);\n  margin: 0;\n  max-width: 100%;\n}\n\n.h5p-question-image-scalable {\n  cursor: pointer;\n  width: 35%;\n}\n\n.h5p-question-image.h5p-question-image-fill-width .h5p-question-image-scalable{\n  width: 100%;\n}\n\n.h5p-question-image-scalable:before {\n  position: absolute;\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f067\";\n  right: 0.7em;\n  top: 0.7em;\n  color: #fff;\n  font-size: 10px;\n  -webkit-border-radius: 50%;\n  -moz-border-radius: 50%;\n  border-radius: 50%;\n  background: rgba(0, 0, 0, 0.5);\n  width: 1.8em;\n  height: 1.8em;\n  line-height: 1.8em;\n  text-align: center;\n}\n\n.h5p-question-image-fill-width .h5p-question-image-scalable:before {\n  content: \"\\f068\";\n}\n\n.h5p-question-introduction {\n  margin: 1em;\n}\n\n.h5p-question-introduction {\n  font-size: 1.125em;\n  line-height: 1.125em;\n}\n\n.h5p-question-introduction > p {\n  font-size: inherit;\n  line-height: inherit;\n  margin: 0;\n}\n\n.h5p-question-content {\n  margin: 1em;\n}\n\n.h5p-question-content.h5p-has-question-popup {\n  position: relative;\n}\n\n.h5p-question-feedback {\n  font-weight: bold;\n  color: #1a73d9;\n  margin: 0 1em;\n  max-height: 0;\n  opacity: 0;\n  transition: max-height 0.15s ease, margin 0.15s ease, opacity 0.15s cubic-bezier(0,1,0,1);\n}\n\n.h5p-question-feedback.h5p-question-visible {\n  opacity: 40%;\n  margin: 1em;\n  opacity: 1;\n  transition: max-height 0.15s ease, margin 0.15s ease, opacity 0.15s ease-in;\n}\n.h5p-question-feedback-content {\n  font-size: 1em;\n  display: none;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n\n.h5p-question-feedback-content.has-content {\n  display: block;\n  margin-bottom: 0.8em;\n}\n\n.h5p-question-feedback-content-text {\n  display: inline-block;\n}\n\n.h5p-question-buttons {\n  margin: 0 1em;\n  max-height: 0;\n  opacity: 0;\n  transition: max-height 0.15s ease, margin 0.15s ease, opacity 0.15s cubic-bezier(0,1,0,1);\n}\n.h5p-question-buttons.h5p-question-visible {\n  max-height: none;\n  opacity: 1;\n  transition: max-height 0.15s ease, margin 0.15s ease, opacity 0.15s ease-in;\n}\n\n.h5p-question-feedback.h5p-question-popup .h5p-question-buttons {\n  height: 3.14286em;\n  max-height: 3.14286em;\n  transition: none;\n}\n\n\/* Remove margins when no frame or transparent *\/\n.h5p-no-frame > .h5p-question > *,\n.h5p-transparent > div > .h5p-question > * {\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.h5p-no-frame > .h5p-question > *:first-child,\n.h5p-transparent > div > .h5p-question > *:first-child {\n  margin-top: 0;\n}\n\n.h5p-no-frame > .h5p-question > *:last-child,\n.h5p-transparent > div > .h5p-question > *:last-child {\n  margin-bottom: 0;\n}\n\n\/* CP specific styles *\/\n.h5p-course-presentation .h5p-question-introduction {\n  font-size: 1.125em;\n  line-height: 1.125em;\n}\n\n.h5p-course-presentation .h5p-question-introduction > p {\n  font-size: 1em;\n  line-height: 1em;\n  margin: 0;\n}\n.h5p-question .h5p-hidden-read {\n  width: 1px;\n  height: 1px;\n  top: -1px;\n  position: absolute;\n  text-indent: 1px;\n  overflow: hidden;\n}\n\n.h5p-question-popups {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n}\n\n.h5p-question-popups.hidden {\n  display: none;\n}\n\n.h5p-question-feedback.h5p-question-popup {\n  position: absolute;\n  display: none;\n  width: 22em;\n  max-width: 100%;\n  margin: 0;\n  z-index: 3;\n  background-color: white;\n  box-shadow: 0px 0px 7px 0px rgba(0, 0, 0, 0.59);\n  border-radius: 1em;\n  padding: 1.5em;\n  transition: none;\n}\n\n.h5p-question-feedback.h5p-question-popup.h5p-question-visible {\n  display: block;\n  box-sizing: border-box;\n  max-height: 100%;\n}\n\n.h5p-question-feedback.h5p-question-popup .h5p-question-feedback-content {\n  display: block;\n  top: 0;\n}\n\n.h5p-question-feedback.h5p-question-popup.h5p-question-feedback-correct .h5p-question-feedback-content {\n  margin-right: 1.5em;\n}\n\n.h5p-question-feedback.h5p-question-popup .h5p-question-retry-button {\n  margin: 1em 0 0 0;\n}\n\n.h5p-question-feedback.h5p-question-popup .h5p-question-buttons {\n  margin: 0;\n}\n\n.h5p-question-feedback.h5p-question-popup .h5p-question-feedback-close {\n  position: absolute;\n  right: 0;\n  top: 0;\n  margin: 1em;\n  cursor: pointer;\n}\n\n.h5p-question-feedback.h5p-question-popup .h5p-question-feedback-close:before {\n  font-family: 'h5pFontIcons';\n  font-size: 2.5em;\n  line-height: 0.9em;\n  content: '\\e600';\n  color: #707070;\n}\n\n.h5p-question-feedback-tail {\n  position: absolute;\n  width: 1em;\n  height: 1em;\n  z-index: 3;\n  background-color: white;\n  box-shadow: -2px -2px 0px 0px rgba(0, 0, 0, 0.18);\n  transform: rotate(225deg);\n}\n\n.h5p-question-plus-one,\n.h5p-question-minus-one {\n  position: absolute;\n  width: 1.923076923em;\n  height: calc(1.923076923em * 0.638297872);\n  background-size: 100% 100%;\n  right: -1.615384615em;\n  top: -0.846153846em;\n  z-index: 1;\n  opacity: 1;\n  transition: opacity 150ms linear, transform 150ms linear;\n}\n.h5p-question-plus-one {\n  background-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/images\/plus-one.svg);\n}\n.h5p-question-minus-one {\n  background-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/images\/minus-one.svg);\n}\n.h5p-question-hidden-one {\n  opacity: 0;\n  transform: translateY(100%);\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Question-1.3\/styles\/explainer.css?ver=1.3.4":".h5p-question-explanation {\n  \/* Needed this to make it display in IE 11 *\/\n  position: relative;\n}\n\n.h5p-question-explanation-container {\n  margin: 0;\n  padding: 1em;\n  background: #FAFAFA;\n}\n\n.h5p-question-explanation-title {\n  font-size: 1.125em;\n  margin-bottom: 0.5em;\n}\n\n.h5p-question-explanation-list {\n  background: #FFFFFF;\n  border: 1px solid #e0e0e0;\n  overflow: auto;\n  overflow-x: hidden;\n\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n.h5p-question-explanation-item {\n  padding: 0.5em;\n  margin: 0;\n  line-height: 1.2;\n  display: flex;\n}\n\n.h5p-question-explanation-item:not(:last-child) {\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.h5p-question-explanation-status {\n  display: flex;\n  flex-shrink: 0;\n  width: 8em;\n  flex-wrap: wrap;\n}\n\n.h5p-question-explanation-correct,\n.h5p-question-explanation-wrong {\n  display: inline-flex;\n  font-weight: bold;\n  margin-left: 0.5em;\n  font-size: 0.9em;\n\n  word-break: break-all;\n  \/* Non standard for WebKit *\/\n  word-break: break-word;\n}\n\n.h5p-question-explanation-correct {\n  color: #265c42;\n}\n\n.h5p-question-explanation-wrong {\n  color: #b61c1e;\n  text-decoration: line-through;\n}\n\n.h5p-question-explanation-text {\n  display: inline-flex;\n  padding-left: 1em;\n  margin-left: 0.5em;\n  border-left: 1px solid #ddd;\n}\n\n.h5p-question-explanation-list::-webkit-scrollbar {\n  width: 0.4em;\n}\n\n.h5p-question-explanation-list::-webkit-scrollbar-thumb {\n  background-color: #e0e0e0;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.TableList-1.0\/h5p-editor-table-list.css?ver=1.0.2":".h5p-editor-table-list {\n  width: 100%;\n  table-layout: fixed;\n  border-spacing: 0 5px;\n  empty-cells: show;\n}\n.h5p-editor-table-list thead th,\n.h5p-editor-table-list tbody td {\n  text-align: left;\n  padding: 10px 5px;\n}\n.h5p-editor-table-list thead th:first-child,\n.h5p-editor-table-list tbody td:first-child {\n  padding-left: 10px;\n}\n.h5p-editor-table-list thead th:last-child,\n.h5p-editor-table-list tbody td:last-child {\n  padding-right: 10px;\n}\n.h5p-editor-table-list thead th.h5peditor-type-number {\n  width: 75px;\n}\n.h5p-editor-table-list thead th.h5peditor-remove-header {\n  width: 32px;\n}\n.h5p-editor-table-list tbody td {\n  background: #f5f5f5;\n  border-top: 1px solid #d0d0d1;\n  border-bottom: 1px solid #d0d0d1;\n  vertical-align: top;\n}\n.h5p-editor-table-list tbody td:first-child {\n  border-left: 1px solid #d0d0d1;\n  border-radius: .25em 0 0 .25em;\n}\n.h5p-editor-table-list tbody td:last-child {\n  border-right: 1px solid #d0d0d1;\n  border-radius: 0 .25em .25em 0;\n}\n.h5p-editor-table-list tfoot .h5peditor-button {\n  margin-top: 0;\n}\n.h5p-editor-table-list td.h5peditor-remove-button {\n  position: relative;\n}\n.h5p-editor-table-list td.h5peditor-remove-button .h5peditor-button {\n  cursor: pointer;\n  width: 32px;\n  display: inline-block;\n  height: 38px;\n  font-size: 1.75em;\n}\n.h5p-editor-table-list td.h5peditor-remove-button .h5peditor-button:after {\n  font-family: \"H5P\";\n  content: \"\\e890\";\n  opacity: 0.7;\n  display: inline-block;\n  line-height: 38px;\n}\n.h5p-editor-table-list td.h5peditor-remove-button .h5peditor-button:hover:after {\n  opacity: 1;\n}\n.h5p-editor-table-list td.h5peditor-remove-button .h5peditor-button[aria-label]:before {\n  top: 85%;\n  right: 10%;\n}\n.h5p-editor-table-list td.h5peditor-remove-button .h5peditor-button[aria-disabled=\"true\"] {\n  cursor: default;\n}\n.h5p-editor-table-list td.h5peditor-remove-button .h5peditor-button[aria-disabled=\"true\"]:after {\n  opacity: 0.3;\n}\n.h5p-editor-table-list tbody .h5p-errors > p {\n  white-space: nowrap;\n  margin: 6px 0 0 6px;\n  font-size: 14px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.RangeList-1.0\/h5p-editor-range-list.css?ver=1.0.2":".h5p-editor-range-list thead th.h5peditor-type-number {\n  white-space: nowrap;\n  width: 65px;\n}\n.h5p-editor-range-list thead th.h5peditor-dash {\n  width: 6px;\n}\n.h5p-editor-range-list tbody td.h5peditor-dash {\n  line-height: 37px;\n}\n.h5p-editor-range-list .h5peditor-input-text {\n  line-height: 38px;\n  height: 38px;\n  text-align: center;\n}\n.h5p-editor-range-list .number input {\n  text-align: center;\n  width: 65px;\n}\n.h5p-editor-range-list thead th.h5peditor-remove-header {\n  position: relative;\n}\n.h5peditor-range-distribute {\n  white-space: nowrap;\n  font-weight: normal;\n  font-size: 14px;\n  padding: 0 20px;\n  margin-left: 1em;\n  height: 42px;\n  line-height: 42px;\n\n  color: #2579c6;\n  font-weight: bold;\n  background: #fff;\n  border: 2px solid #2579c6;\n}\n.h5peditor-button-textual.h5peditor-range-distribute:hover {\n  color: #1f67a8;\n  border-color: #1f67a8;\n  background: #fff;\n}\n.h5peditor-range-distribute[aria-disabled=\"true\"],\n.h5peditor-button-textual.h5peditor-range-distribute[aria-disabled=\"true\"]:hover {\n  cursor: default;\n  color: #8fb3d3;\n  border-color: #8fb3d3;\n  background: #fff;\n}\n.h5p-editor-table-list tbody .h5p-error-range-overlap td {\n  border-color: #da0001;\n}\n.h5p-editor-range-list-message-area {\n  display: none;\n  background: #f4ecec;\n  border-left: 2px solid #ad5b52;\n  padding: 1em;\n  margin-bottom: 0.5em;\n}\n.h5p-editor-range-list-message-area.problem-found {\n  display: block;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Blanks-1.8\/css\/blanks.css?ver=1.8.5":".h5p-blanks {\n  position: relative;\n}\n.h5p-blanks .h5p-input-wrapper {\n  display: inline-block;\n  position: relative;\n}\n.h5p-blanks .h5p-text-input {\n  font-family: H5PDroidSans, sans-serif;\n  font-size: 1em;\n  border-radius: 0.25em;\n  border: 1px solid #a0a0a0;\n  padding: 0.1875em 1em 0.1875em 0.5em;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n  width: 6em;\n}\n.h5p-blanks .h5p-text-input:focus {\n  outline: none;\n  box-shadow: 0 0 0.5em 0 #7fb8ff;\n  border-color: #7fb8ff;\n}\n.h5p-blanks .h5p-text-input.h5p-not-filled-out {\n  background: #fff0f0;\n}\n.h5p-blanks .h5p-separate-lines .h5p-input-wrapper {\n  display: block;\n}\n.h5p-blanks .h5p-separate-lines .h5p-text-input {\n  width: 100%;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n}\n\n\/* Correctly answered input *\/\n.h5p-blanks .h5p-correct .h5p-text-input {\n  background: #9dd8bb;\n  border: 1px solid #9dd8bb;\n  color: #255c41;\n}\n.h5p-blanks .h5p-correct-answer {\n  color: #255c41;\n  font-weight: bold;\n}\n.h5p-blanks .h5p-correct:after {\n  position: absolute;\n  right: 0.5em;\n  top: 0;\n  text-decoration: none;\n  content: \"\\f00c\";\n  font-family: 'H5PFontAwesome4';\n  color: #255c41;\n}\n\n\/* Wrongly answered input *\/\n.h5p-blanks .h5p-wrong .h5p-text-input {\n  background-color: #f7d0d0;\n  border: 1px solid #f7d0d0;\n  color: #b71c1c;\n  text-decoration: line-through;\n}\n.h5p-blanks .h5p-wrong:after {\n  position: absolute;\n  right: 0.5em;\n  top: 0;\n  font-family: 'H5PFontAwesome4';\n  text-decoration: none;\n  content: \"\\f00d\";\n  color: #b71c1c;\n}\n\n\/* Actual text paragraphs *\/\n.h5p-blanks .h5p-question-content p {\n  line-height: 1.75em;\n  margin: 0 0 1em;\n}\n\n\/* Header and footer blocks (title + evaluation, buttons) *\/\n.h5p-blanks .joubel-tip-container {\n  position: absolute;\n  right: 0.4em;\n  font-size: 1em;\n}\n.h5p-blanks .joubel-tip-container .joubel-icon-tip-normal {\n  line-height: 1em;\n}\n.h5p-blanks .has-tip .h5p-text-input {\n  padding-right: 2.25em;\n}\n.h5p-blanks .has-tip.h5p-correct:after,\n.h5p-blanks .has-tip.h5p-wrong:after {\n  right: 2.25em;\n}\n.h5p-blanks .has-tip.h5p-correct .h5p-text-input,\n.h5p-blanks .has-tip.h5p-wrong .h5p-text-input {\n  padding-right: 3.5em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.VerticalTabs-1.3\/styles\/css\/vertical-tabs.css?ver=1.3.5":"\/* line 3, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-wrapper:after {\n  visibility: hidden;\n  display: block;\n  font-size: 0;\n  content: ' ';\n  clear: both;\n  height: 0;\n}\n\n\/* line 12, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs {\n  float: left;\n  width: 212px;\n  position: relative;\n  padding: 0;\n}\n\n\/* line 18, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-forms {\n  border: 1px solid #d0d0d1;\n  margin-left: 217px;\n}\n\n\/* line 22, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-form {\n  position: relative;\n  display: none;\n  margin: 0;\n  border: none;\n  padding: 0;\n}\n\n\/* line 29, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-form.h5p-current {\n  display: block;\n}\n\n\/* line 32, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-form > .field {\n  margin: 0;\n}\n\n\/* line 35, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li,\n.h5p-vtabs .h5p-placeholder {\n  position: relative;\n  padding: 0;\n  margin: 0 0 3px 0;\n}\n\n\/* line 42, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-a {\n  border: 1px solid #d0d0d1;\n  background-color: #f5f5f5;\n  height: 38px;\n  font-size: 14px;\n  font-weight: 600;\n  line-height: 38px;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  padding: 0 30px;\n  margin: 0 12px 0 0;\n  cursor: pointer;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  outline: none;\n}\n\n\/* line 61, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current .h5p-vtab-a {\n  background: #747275;\n  border: 1px solid #636164;\n  border-right: 0;\n  color: white;\n}\n\/* line 68, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current:after, .h5p-vtabs .h5p-vtab-li.h5p-current:before {\n  position: absolute;\n  left: 200px;\n  content: \" \";\n  width: 0;\n  height: 0;\n}\n\/* line 77, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current:before {\n  top: 0;\n  border-top: 20px solid transparent;\n  border-bottom: 20px solid transparent;\n  border-left: 13px solid #636164;\n}\n\/* line 84, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current:after {\n  top: 1px;\n  border-top: 19px solid transparent;\n  border-bottom: 19px solid transparent;\n  border-left: 12px solid #747275;\n}\n\/* line 92, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-up,\n.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-down {\n  background: #636164;\n}\n\/* line 96, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-up[aria-disabled=\"false\"]:hover,\n.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-down[aria-disabled=\"false\"]:hover {\n  background: #49484a;\n}\n\/* line 100, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-up:after,\n.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-down:after {\n  color: white;\n}\n\n\/* line 107, ..\/scss\/vertical-tabs.scss *\/\n.h5p-placeholder > .h5p-vtab-a {\n  background: #e8f2fa;\n  border: dashed 2px #2782d1;\n  height: 36px;\n}\n\n\/* line 113, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs > button {\n  float: right;\n  margin: 8px 14px 8px 8px;\n}\n\n\/* line 118, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-moving {\n  position: absolute;\n  z-index: 1;\n}\n\/* line 122, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtabs .h5p-moving > .h5p-vtab-a {\n  cursor: grabbing;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n}\n\n\/* line 129, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper {\n  position: absolute;\n  top: 1px;\n  left: 1px;\n}\n\/* line 134, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-up,\n.vtab-order-wrapper > .order-down {\n  width: 19px;\n  height: 19px;\n  background: #d0d0d1;\n  font-size: 14px;\n  line-height: 19px;\n  cursor: pointer;\n  text-align: center;\n}\n\/* line 144, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-up[aria-disabled=\"false\"]:hover,\n.vtab-order-wrapper > .order-down[aria-disabled=\"false\"]:hover {\n  background-color: #b6b6b8;\n}\n\/* line 148, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-up:before,\n.vtab-order-wrapper > .order-down:before {\n  right: auto;\n  left: -5px;\n}\n\/* line 153, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-up[aria-disabled=\"true\"],\n.vtab-order-wrapper > .order-down[aria-disabled=\"true\"] {\n  cursor: default;\n}\n\/* line 156, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-up[aria-disabled=\"true\"]:after,\n.vtab-order-wrapper > .order-down[aria-disabled=\"true\"]:after {\n  opacity: 0.25;\n}\n\/* line 162, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-up:after {\n  font-family: \"H5P\";\n  content: \"\\e58e\";\n}\n\/* line 167, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-down {\n  top: auto;\n  bottom: 1px;\n}\n\/* line 171, ..\/scss\/vertical-tabs.scss *\/\n.vtab-order-wrapper > .order-down:after {\n  font-family: \"H5P\";\n  content: \"\\e58f\";\n}\n\n\/* line 178, ..\/scss\/vertical-tabs.scss *\/\n.vtab-remove-wrapper {\n  position: absolute;\n  top: 1px;\n  right: 12px;\n}\n\/* line 183, ..\/scss\/vertical-tabs.scss *\/\n.vtab-remove-wrapper > .remove {\n  cursor: pointer;\n  width: 1.25em;\n  height: 38px;\n  font-size: 1.75em;\n  text-align: center;\n}\n\/* line 190, ..\/scss\/vertical-tabs.scss *\/\n.vtab-remove-wrapper > .remove:after {\n  font-family: \"H5P\";\n  content: \"\\e890\";\n  color: #454347;\n  opacity: 0.7;\n  display: inline-block;\n  line-height: 38px;\n}\n\/* line 198, ..\/scss\/vertical-tabs.scss *\/\n.vtab-remove-wrapper > .remove:after:hover {\n  opacity: 1;\n}\n\n\/* line 205, ..\/scss\/vertical-tabs.scss *\/\n.h5p-current > .vtab-remove-wrapper > .remove:after {\n  color: #fff;\n}\n\n\/* line 209, ..\/scss\/vertical-tabs.scss *\/\n.h5peditor-button.add-entity {\n  width: 200px;\n  height: 40px;\n  background: #2579C6 linear-gradient(#3080c9 50%, transparent 50%, transparent);\n  border: 1px solid #1f67a8;\n  color: white;\n  font-weight: 600;\n  font-size: 14px;\n  box-sizing: border-box;\n  text-align: center;\n  cursor: pointer;\n  text-transform: uppercase;\n  line-height: 28px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  padding: 0 5px;\n  border-radius: 3px;\n  margin-top: 5px;\n}\n\/* line 230, ..\/scss\/vertical-tabs.scss *\/\n.h5peditor-button.add-entity:hover {\n  background: #1f67a8 linear-gradient(#2a6fac 50%, transparent 50%, transparent);\n}\n\/* line 234, ..\/scss\/vertical-tabs.scss *\/\n.h5peditor-button.add-entity:before {\n  font-family: \"H5P\";\n  content: \"\\e902\";\n  margin-right: -4px;\n  font-weight: 400;\n  font-size: 24px;\n  transform: translate(-30%,15%);\n  display: inline-block;\n}\n\n\/* line 243, ..\/scss\/vertical-tabs.scss *\/\n.h5p-vtab-form > .library,\n.h5p-vtab-form > .list,\n.h5p-vtab-form > .group > .content {\n  padding: 10px;\n  border: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.ShowWhen-1.0\/h5p-show-when.css?ver=1.0.4":".h5p-editor-widget-show-when.hidden {\n  display: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SingleChoiceSet-1.9\/styles\/single-choice-set.css?ver=1.9.7":".h5p-container.h5p-single-choice-set {\n  overflow: hidden;\n}\n.h5p-container .h5p-sc-set ul {\n  margin: 1em;\n  padding: 0;\n}\n.h5p-sc-set-wrapper.initialized {\n  overflow: hidden;\n  -ms-scroll-limit: 0 0 0 0; \/* IE11 bugfix for where this element can be out of line, when focusing on elements. *\/\n  height: 100%;\n}\n\n.h5p-sc-set-wrapper.next-button-mode {\n  margin-bottom: 2.5em;\n}\n\n.h5p-sc-set {\n  height: 100%;\n  padding: 0.5em;\n  position: relative;\n  box-sizing: border-box;\n}\n\n.h5p-single-choice-set .h5p-joubelui-progressbar {\n  height: 5px; \/* Setting height in px is intentional. We don't want it to ever get bigger *\/\n  background-color: rgb(102, 102, 102);\n  box-shadow: none;\n  z-index: 1;\n}\n\n.h5p-single-choice-set .h5p-joubelui-progressbar-background {\n  box-shadow: 0 0 0.25em 0 #fff;\n  background-color: #0097fd;\n}\n\n.h5p-sc-set.h5p-sc-animate {\n  transition: -webkit-transform 0.25s ease-in-out;\n  transition: transform 0.25s ease-in-out;\n}\n.h5p-sc {\n  box-sizing: border-box;\n  width: 100%;\n  height: auto;\n  position: absolute;\n  left: 0;\n  top: 0;\n  padding-bottom: .5em;\n}\n.initialized .h5p-sc-slide {\n  display: none;\n}\n.initialized .h5p-sc-slide.h5p-sc-current-slide {\n  display: block;\n}\n\n.h5p-ssc-next-button {\n  display: none;\n  position: absolute;\n  right: 0.5em;\n  bottom: 0;\n  width: 2.1875em;\n  padding: 0.5em 0;\n  transition: transform 0.2s;\n  font-family: H5PFontAwesome4;\n  text-align: center;\n}\n.h5p-ssc-next-button:before {\n  content: \"\\f054\";\n  position: relative;\n  left: 2px;\n  padding: 0;\n}\n.h5p-ssc-next-button:active {\n  \/* Overriding JoubelUI, which sets it to relative positioning *\/\n  position: absolute;\n}\n.navigatable .h5p-ssc-next-button {\n  display: inline-block;\n}\n.h5p-ssc-next-button[aria-disabled=\"true\"] {\n  transform: scale(0.01);\n  visibility: hidden;\n}\n\nul.h5p-sc-alternatives {\n  margin: 0;\n  padding: 0;\n}\nul.h5p-sc-alternatives li.h5p-sc-alternative {\n  position: relative;\n  cursor: pointer;\n  box-sizing: border-box;\n  list-style: none;\n  margin: .5em 0;\n  padding: .4em 1.2em;\n  background: #ddd;\n  overflow: hidden;\n  -webkit-border-radius: 0.25em;\n  -moz-border-radius: 0.25em;\n  border-radius: 0.25em;\n  box-shadow: 0 0.1em 0 rgba(0,0,0, 0.3);\n\n  transition: -webkit-transform 0.5s ease-in-out, width 0.5s ease-in-out;\n  transition: transform 0.5s ease-in-out, width 0.5s ease-in-out;\n}\n\nul.h5p-sc-alternatives li.h5p-sc-alternative:hover,\nul.h5p-sc-alternatives li.h5p-sc-alternative:focus {\n  background: #edd6e9;\n}\n\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative:hover,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative:active,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative:focus,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong:hover,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong:active,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong:focus {\n  background: #ddd;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-correct,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-correct:hover,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-correct:active,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-correct:focus {\n  background: #9dd8bb;\n  color: #255c41;\n}\n\nul.h5p-sc-alternatives li.h5p-sc-alternative.h5p-sc-is-correct.h5p-sc-selected.h5p-sc-reveal-correct .h5p-sc-progressbar {\n  background: #9dd8bb;\n  color: #255c41;\n}\n\nul.h5p-sc-alternatives li.h5p-sc-alternative.h5p-sc-reveal-wrong {\n  -webkit-transform: scale(.95);\n  transform: scale(.95);\n}\n\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong.h5p-sc-selected,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong.h5p-sc-selected:hover,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong.h5p-sc-selected:active,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-reveal-wrong.h5p-sc-selected:focus,\nul.h5p-sc-alternatives.h5p-sc-selected li.h5p-sc-alternative.h5p-sc-is-wrong.h5p-sc-selected.h5p-sc-reveal-wrong .h5p-sc-progressbar {\n  background: #f7d0d0;\n  color: #b71c1c;\n}\n\nli.h5p-sc-alternative .h5p-sc-progressbar {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 0%;\n  background: #cee0f4;\n  -webkit-border-radius: 0.25em;\n  -moz-border-radius: 0.25em;\n  border-radius: 0.25em;\n}\n.h5p-sc-drummed .h5p-sc-progressbar {\n  background: transparent;\n  transition: background 1s;\n}\n\/* Using animation instead of transition on width made this much\n   smoother on iPad *\/\nli.h5p-sc-alternative.h5p-sc-selected .h5p-sc-progressbar {\n  -webkit-animation: progress 0.6s;\n  -moz-animation: progress 0.6s;\n  -o-animation: progress 0.6s;\n  animation: progress 0.6s;\n\n  -webkit-animation-fill-mode: forwards;\n  -moz-animation-fill-mode: forwards;\n  -o-animation-fill-mode: forwards;\n  animation-fill-mode: forwards;\n}\n@-webkit-keyframes progress {\n    from { } to { width: 100% }\n}\n@-moz-keyframes progress {\n    from { } to { width: 100% }\n}\n@-ms-keyframes progress {\n    from { } to { width: 100% }\n}\n@keyframes progress {\n    from { } to { width: 100% }\n}\nli.h5p-sc-alternative .h5p-sc-label {\n  position: relative;\n}\nli.h5p-sc-alternative .h5p-sc-label p {\n  margin: 0.75em 0;\n}\nli.h5p-sc-alternative .h5p-sc-label p:first-child {\n   margin-top: 0;\n}\nli.h5p-sc-alternative .h5p-sc-label p:last-child {\n   margin-bottom: 0;\n}\nli.h5p-sc-alternative .h5p-sc-status {\n  font-family: H5PFontAwesome4;\n  font-size: 1.5em;\n  width: 1.5em;\n  height: 1.5em;\n  line-height: 1.5;\n  position: absolute;\n  top: 0;\n  right: 0;\n  text-align: center;\n}\n.h5p-sc-alternative.h5p-sc-is-correct.h5p-sc-drummed .h5p-sc-status:after{\n  content: \"\\f00c\";\n  color: #255c41;\n}\n.h5p-sc-alternative.h5p-sc-is-wrong.h5p-sc-drummed .h5p-sc-status:after{\n  content: \"\\f00d\";\n  color: #b71c1c;\n}\n\n.h5p-sc-selected li.h5p-sc-alternative {\n  cursor: auto;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.h5p-sc-set-results {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  top: 0;\n  text-align: center;\n  box-sizing: border-box;\n}\n.h5p-sc-set-results > .h5p-sc-feedback {\n  display: block;\n  font-size: 1.8em;\n  margin-bottom: 1.3em;\n}\n\n.h5p-sc-sound-control {\n  width: 1.3em;\n  height: 1.5em;\n  position: absolute;\n  text-align: left;\n  color: #757575;\n  cursor: pointer;\n  top: 1.25em;\n  right: 0.75em;\n}\n\n.h5p-sc-sound-control:hover {\n  color: #444;\n}\n.h5p-sc-sound-control:after {\n  font-family: H5PFontAwesome4;\n  font-size: 1.25em;\n  content: '\\f028';\n}\n[aria-pressed='true'].h5p-sc-sound-control:after {\n  content: '\\f026';\n}\n.h5p-sc-solution-view {\n  position: absolute;\n  left: 100%;\n  top: 0;\n  width: 100%;\n  height: 100%;\n\n  outline: none;\n  display:none;\n  visibility: hidden;\n  background: #fff;\n  box-sizing: border-box;\n\n  transition: left .3s ease-in-out, visibility .3s ease-in-out;\n}\n.h5p-sc-solution-view.visible {\n  left: 0;\n  visibility: visible;\n  display: block;\n}\n.h5p-sc-solution-view-header {\n  position: relative;\n  text-align: center;\n  height: 3.25em;\n  background: #fff;\n  border-bottom: 1px solid #ddd;\n  box-shadow: 0 0 0.2em rgba(0,0,0,0.2);\n  z-index: 1;\n}\n.h5p-sc-solution-view-title {\n  display: inline-block;\n  font-size: 1.2em;\n  text-align: center;\n  line-height: 2.75em;\n  outline: none;\n}\n.h5p-single-choice-set .h5p-sc-solution-view .h5p-sc-close-solution-view {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  left: 0;\n  background: none;\n  color: #1a73d9;\n}\n\n.h5p-single-choice-set .h5p-sc-solution-view .h5p-sc-close-solution-view:active {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  color: #104888;\n}\n\n.h5p-single-choice-set .h5p-sc-solution-view .h5p-sc-close-solution-view:focus,\n.h5p-single-choice-set .h5p-sc-solution-view .h5p-sc-close-solution-view:hover {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  color: #1356a3;\n}\n.h5p-single-choice-set .h5p-sc-solution-view .h5p-sc-close-solution-view:before {\n  font-family: H5PFontAwesome4;\n  content: '\\f060';\n  padding-right: 0.5em;\n}\n.h5p-sc-solution-choices {\n  font-size: 1.1em;\n  margin: 0 auto;\n  -webkit-border-radius: 0.2em;\n  -moz-border-radius: 0.2em;\n  border-radius: 0.2em;\n  padding: 0.5em;\n  overflow: auto;\n  box-sizing: border-box;\n  position: absolute;\n  bottom: 0;\n  top: 2.95em;\n  width: 100%;\n}\n.h5p-sc-solution-question {\n  font-weight: bold;\n  margin-bottom: 0.25em;\n  padding-left: 0.5em;\n}\n.h5p-sc-solution-question p {\n  margin: 1em 0;\n}\n.h5p-sc-solution-question p:first-child {\n  margin-top: 0;\n}\n.h5p-sc-solution-answer {\n  margin-bottom: 0.5em;\n  padding-bottom: 0.5em;\n  padding-left: 1.75em;\n  border-bottom: 1px solid #ccc;\n  position: relative;\n}\n.h5p-sc-solution-answer p {\n  margin: 0.75em 0;\n}\n.h5p-sc-solution-answer p:first-child {\n  margin-top: 0;\n}\n.h5p-sc-solution-answer p:last-child {\n  margin-bottom: 0;\n}\n.h5p-sc-solution-answer:last-child {\n  border-bottom: none;\n  margin-bottom: 0;\n}\n.h5p-sc-solution-answer:before {\n  font-size: 0.8em;\n  font-family: H5PFontAwesome4;\n  content: \"\\f00c\";\n  color: #255c41;\n  position: absolute;\n  left: 0.75em;\n}\n\n\/* Remove Question margin *\/\n.h5p-single-choice-set .h5p-question-content {\n  margin: 0;\n  height: 100%;\n}\n\n.h5p-single-choice-set .h5p-question-feedback-container {\n  max-height: initial;\n  margin: 0 0 1em;\n}\n\n.h5p-single-choice-set .h5p-sc-result-container {\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  position: absolute;\n  width: 100%;\n}\n\n.h5p-single-choice-set .h5p-sc-feedback-container {\n  outline: none;\n}\n\n\/* Introduction *\/\n.h5p-sc-question {\n  margin: 0.888888889em;\n  padding-right: 1.777777778em;\n  font-size: 1.125em;\n}\n\n.h5p-single-choice-set .h5p-sc-question p {\n  font-size: 1em;\n  margin: 0.75em 0;\n}\n.h5p-single-choice-set .h5p-sc-question p:first-child {\n  margin-top: 0;\n}\n.h5p-single-choice-set .h5p-sc-question p:last-child {\n  margin-bottom: 0;\n}\n\n\/* Scrollbar style *\/\n.h5p-single-choice-set .h5p-sc-solution-choices::-webkit-scrollbar {\n  width: 0.5em;\n  background: #fff;\n}\n\n.h5p-single-choice-set .h5p-sc-solution-choices::-webkit-scrollbar-thumb {\n  background: #ddd;\n}\n\n.h5p-single-choice-set .h5p-sc-solution-choices::-webkit-scrollbar-thumb:hover {\n  background: #aaa;\n}\n\n.h5p-single-choice-set .h5p-sc-solution-choices::-webkit-scrollbar-thumb:active,\n.h5p-single-choice-set .h5p-sc-solution-choices::-webkit-scrollbar-thumb:focus {\n  background: #888;\n}\n\n\/* IV sepcific styles *\/\n.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] {\n  width: 24.5em;\n  overflow: hidden;\n  padding: 0;\n}\n\n.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-sc-sound-control {\n  top: -2.075em;\n  right: 2em;\n}\n.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-sc-sound-control:after {\n  font-size: 1.075em;\n}\n\n.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-sc-question {\n  margin-right: 0;\n}\n\n.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-sc-solution-view {\n  top: 0;\n  height: 100%;\n}\n\n.h5p-interactive-video.mobile .h5p-dialog[data-lib=\"H5P.SingleChoiceSet\"] .h5p-dialog-interaction.h5p-single-choice-set {\n  height: 100%;\n}\n\n\/* Standalone specific styles *\/\n.h5p-standalone.h5p-single-choice-set .h5p-joubelui-button {\n  line-height: 1em;\n}\n\n.h5p-no-frame .h5p-standalone.h5p-single-choice-set .h5p-sc-alternatives,\n.h5p-no-frame .h5p-standalone.h5p-single-choice-set .h5p-sc-question {\n  margin: 1em 0;\n}\n\n.h5p-no-frame .h5p-standalone.h5p-single-choice-set .h5p-sc-question {\n  margin-top: 0;\n}\n\n.h5p-no-frame .h5p-standalone.h5p-single-choice-set .h5p-sc-sound-control {\n  top: 0;\n}\n\n\/* Transparent specific styles *\/\n.h5p-transparent > div > .h5p-single-choice-set .h5p-sc-alternatives,\n.h5p-transparent > div > .h5p-single-choice-set .h5p-sc-question {\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.h5p-transparent > div > .h5p-single-choice-set .h5p-sc-question {\n  margin-top: 0;\n}\n\n.h5p-transparent > div > .h5p-single-choice-set .h5p-sc-sound-control {\n  top: 0;\n  right: 0;\n}\n\n\/* CP popup specific style *\/\n.h5p-course-presentation .h5p-popup-overlay.h5p-singlechoiceset .h5p-sc-sound-control {\n  top: 0.6em;\n  right: 3em;\n  color: #000;\n}\n\n.h5p-course-presentation .h5p-popup-overlay.h5p-singlechoiceset .h5p-sc-sound-control:after {\n  font-size: 1.8em;\n}\n\n.h5p-course-presentation .h5p-popup-overlay.h5p-singlechoiceset .h5p-sc-sound-control:hover {\n  color: #555;\n}\n\n.h5p-course-presentation .h5p-popup-overlay.h5p-singlechoiceset .h5p-popup-container {\n  min-height: initial;\n  max-height: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/css\/multichoice.css?ver=1.10.4":"\/* IcoMoon font licensed under the GNU General Public License: http:\/\/www.gnu.org\/licenses\/gpl.html *\/\n@font-face {\n  font-family: 'icomoon-multichoice';\n  src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/fonts\/icomoon.eot);\n  src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/fonts\/icomoon.eot?#iefix) format('embedded-opentype'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/fonts\/icomoon.woff) format('woff'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/fonts\/icomoon.ttf) format('truetype'),\n    url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MultiChoice-1.10\/fonts\/icomoon.svg#icomoon) format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n.h5p-multichoice .h5p-answers {\n  list-style: none;\n  padding: 0;\n  overflow: visible;\n  margin: 1em 0;\n}\n\n.h5p-multichoice .h5p-answer {\n  list-style: none;\n  margin: 0.5em 0;\n  padding: 0;\n  background: none;\n  position: relative;\n  cursor: pointer;\n}\n\n.h5p-multichoice .h5p-answer.h5p-has-tip .h5p-alternative-container,\n.h5p-multichoice .h5p-answer.h5p-should-not .h5p-alternative-container {\n  padding-right: 2em;\n}\n\n.h5p-multichoice .h5p-answer.h5p-wrong .h5p-alternative-container,\n.h5p-multichoice .h5p-answer.h5p-correct .h5p-alternative-container {\n  padding-right: 3em;\n}\n\n.h5p-multichoice .h5p-alternative-container {\n  position: relative;\n  text-align: left;\n  display: block;\n  padding: 0.25em 0.75em 0.25em 2.1em;\n  border-radius: 0.3em;\n  border: 0.1em solid #ddd;\n  font-weight: normal;\n  background: #ddd;\n  -webkit-box-shadow: 0 0.1em 0 rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 0 0.1em 0 rgba(0, 0, 0, 0.3);\n  box-shadow: 0 0.1em 0 rgba(0, 0, 0, 0.3);\n  line-height: 1.5em;\n  text-indent: -2em;\n}\n.h5p-multichoice .h5p-answer .h5p-alternative-container:before {\n  font-family: icomoon-multichoice;\n  border: medium none;\n  display: block;\n  height: 1em;\n  width: 1em;\n  position: absolute;\n  left: 2.5em;\n  top: 0.25em;\n  margin: auto;\n  text-decoration: none;\n  color: #494949;\n}\n.h5p-multichoice .h5p-answer[role=\"radio\"] .h5p-alternative-container:before {\n  content: \"\\e600\";\n}\n.h5p-multichoice .h5p-answer[role=\"radio\"][aria-checked=\"true\"] .h5p-alternative-container:before {\n  content: \"\\e603\";\n}\n.h5p-multichoice .h5p-answer[role=\"checkbox\"] .h5p-alternative-container:before {\n  content: \"\\e602\";\n}\n.h5p-multichoice .h5p-answer[role=\"checkbox\"][aria-checked=\"true\"] .h5p-alternative-container:before {\n  content: \"\\e601\";\n}\n.h5p-multichoice .h5p-answers .h5p-answer[aria-disabled=\"true\"] .h5p-alternative-container:before,\n.h5p-multichoice .h5p-answers .h5p-answer.h5p-correct .h5p-alternative-container:before,\n.h5p-multichoice .h5p-answers .h5p-answer.h5p-wrong .h5p-alternative-container:before {\n  content: '';\n}\n\n.h5p-multichoice .h5p-answer[aria-disabled=\"true\"] {\n  cursor: default;\n}\n.h5p-multichoice .h5p-answer:hover .h5p-alternative-container,\n.h5p-multichoice .h5p-answer:focus .h5p-alternative-container {\n  border: 0.1em solid #edd6e9;\n  background: #edd6e9;\n}\n.h5p-multichoice .h5p-answer[aria-disabled=\"true\"]:hover .h5p-alternative-container,\n.h5p-multichoice .h5p-answer[aria-disabled=\"true\"]:focus .h5p-alternative-container {\n  border: 0.1em solid #ddd;\n  background: #ddd;\n}\n\n.h5p-multichoice .h5p-answer[aria-checked=\"true\"] .h5p-alternative-container,\n.h5p-multichoice .h5p-answer[aria-checked=\"true\"]:hover .h5p-alternative-container {\n  border: 0.1em solid #cee0f4;\n  color: #1a4473;\n  background: #cee0f4;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.h5p-multichoice .h5p-answer[aria-checked=\"true\"]:focus .h5p-alternative-container {\n  border: 0.1em solid #e6eef8;\n  background: #e6eef8;\n}\n.h5p-multichoice .h5p-answer[aria-checked=\"true\"][aria-disabled=\"true\"]:focus .h5p-alternative-container {\n  border: 0.1em solid #cee0f4;\n  background: #cee0f4;\n}\n.h5p-multichoice .h5p-answer.h5p-correct .h5p-alternative-container,\n.h5p-multichoice .h5p-answer.h5p-correct:hover .h5p-alternative-container {\n  background: #b6e4ce;\n  border-color: #b6e4ce;\n  color: #255c41;\n}\n.h5p-multichoice .h5p-answer.h5p-wrong .h5p-alternative-container,\n.h5p-multichoice .h5p-answer.h5p-wrong:hover .h5p-alternative-container {\n  background: #fbd7d8;\n  border-color: #fbd7d8;\n  color: #b71c1c;\n}\n\n.h5p-multichoice .h5p-answer:last-child {\n  margin-bottom: 0;\n}\n\n.h5p-multichoice h2 {\n  font-size: 1.5em;\n  font-weight: normal;\n}\n\n.h5p-multichoice .h5p-answer-icon {\n  font-family: 'H5PFontAwesome4';\n  width: 1em;\n  height: 1em;\n  text-decoration: none;\n  position: absolute;\n  line-height: 1em;\n  top: 0.54em;\n  left: 0.75em;\n  letter-spacing: 1em;\n  overflow: hidden;\n}\n.h5p-multichoice .h5p-correct .h5p-answer-icon:before {\n  content: \"\\f00c\";\n  color: #255c41;\n}\n.h5p-multichoice .h5p-wrong .h5p-answer-icon:before {\n  content: \"\\f00d\";\n  color: #b71c1c;\n  padding: 0 0.125em;\n}\n.h5p-multichoice .h5p-should .h5p-answer-icon,\n.h5p-multichoice .h5p-should-not .h5p-answer-icon {\n  right: 2.125em;\n}\n\n.h5p-multichoice .h5p-solution-icon {\n  font-family: icomoon-multichoice;\n  position: absolute;\n  right: 0.75em;\n  line-height: 1em;\n  top: 0.585em;\n  width: 1em;\n  height: 1em;\n  overflow: hidden;\n}\n.h5p-multichoice .h5p-should[role=\"radio\"] .h5p-solution-icon:before {\n  content: \"\\e603\";\n}\n.h5p-multichoice .h5p-should-not[role=\"radio\"] .h5p-solution-icon:before {\n  content: \"\\e600\";\n}\n.h5p-multichoice .h5p-should[role=\"checkbox\"] .h5p-solution-icon:before {\n  content: \"\\e601\";\n}\n.h5p-multichoice .h5p-should-not[role=\"checkbox\"] .h5p-solution-icon:before {\n  content: \"\\e602\";\n}\n\n.h5p-multichoice .feedback-text {\n  height: 2em;\n  top: 0;\n  margin: 0;\n  padding: 0;\n  font-weight: bold;\n  font-size: 1.25em;\n  line-height: 2em;\n  color: #599413;\n}\n\n.h5p-multichoice .feedback-text.h5p-failed {\n  color: #b71c1c;\n}\n.h5p-multichoice .feedback-text.h5p-almost {\n  color: #666;\n}\n.h5p-multichoice .feedback-text.h5p-passed {\n  color: #255c41;\n}\n\n.h5p-alternative-inner {\n  margin: 0 0.75em 0 2em;\n}\n.h5p-alternative-inner div,\n.h5p-alternative-inner p {\n  display: inline;\n}\n\n.h5p-clearfix {\n  clear: both;\n}\n\n.h5p-multichoice .h5p-radio-or-checkbox {\n  border: medium none;\n  display: block;\n  height: 1em;\n  margin: auto;\n  width: 1em;\n  text-decoration: none;\n  font-family: icomoon-multichoice;\n  color: #494949;\n  pointer-events: none;\n}\n\n.h5p-multichoice .h5p-selected .h5p-radio-or-checkbox {\n  color: #235e7c;\n}\n\n.h5p-question p:last-child {\n  margin-bottom: 0;\n}\n\n.h5p-question p:first-child {\n  margin-top: 0;\n}\n\n.h5p-multichoice .h5p-feedback-button {\n  position: absolute;\n  cursor: pointer;\n  right: 2.125em;\n  top: 0.4375em;\n  line-height: 1em;\n  background: #fff;\n}\n.h5p-multichoice .h5p-selected.h5p-should.h5p-correct .h5p-feedback-button,\n.h5p-multichoice .h5p-selected.h5p-should-not.h5p-correct .h5p-feedback-button,\n.h5p-multichoice .h5p-selected.h5p-should.h5p-wrong .h5p-feedback-button,\n.h5p-multichoice .h5p-selected.h5p-should-not.h5p-wrong .h5p-feedback-button {\n  right: 3.5em;\n}\n\n.h5p-multichoice .h5p-feedback-button:focus {\n  outline: none;\n}\n.h5p-multichoice .h5p-feedback-button:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f075\";\n  color: #fbfbfb;\n  text-shadow: 0 0 0.25em #2c2c2c;\n}\n.h5p-multichoice .h5p-feedback-button:hover:before {\n  color: #e1e1e1;\n}\n\n\/* Feedback dialog*\/\n.h5p-multichoice .h5p-feedback-dialog {\n  position: relative;\n  width: calc(100% - 0.5em);\n  left: 0.25em;\n}\n.h5p-multichoice .h5p-answer .h5p-feedback-inner {\n  background: #fbfbfb;\n  border-bottom: 1px solid #ddd;\n  border-left: 1px solid #ddd;\n  border-right: 1px solid #ddd;\n  padding: 0.5em 1.25em;\n  text-align: left;\n  position: relative;\n}\n\n.h5p-multichoice .h5p-answer.h5p-selected .h5p-feedback-inner {\n  border-bottom: 1px solid #cee0f4;\n  border-left: 1px solid #cee0f4;\n  border-right: 1px solid #cee0f4;\n}\n\n.h5p-multichoice .h5p-feedback-inner:before {\n  content: \"\";\n  position: absolute;\n  left: 0.625em;\n  top: -0.3em;\n  width: 0.5em;\n  height: 0.5em;\n  background: #fbfbfb;\n  -webkit-transform: rotate(45deg);\n  -moz-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  -o-transform: rotate(45deg);\n  transform: rotate(45deg);\n  box-shadow: inset 1px 1px 0px 0px #dcdcdc;\n}\n\n.h5p-multichoice .h5p-feedback-dialog.h5p-has-tip .h5p-feedback-inner:before {\n  left: auto;\n  right: 0.85em;\n}\n\n.h5p-multichoice .h5p-feedback-text {\n  position: relative;\n  z-index: 3;\n  overflow: auto;\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.h5p-multichoice .h5p-feedback-text::-webkit-scrollbar {\n  width: 0.4em;\n}\n.h5p-multichoice .h5p-feedback-text::-webkit-scrollbar-thumb {\n  border-radius: 0.2em;\n  background: #aaa;\n}\n\n\/* Tip icon*\/\n.h5p-multichoice .multichoice-tip {\n  position: absolute;\n  right: 0.246153846em;\n  top: -0.123076923em;\n  vertical-align: middle;\n  text-align: center;\n  font-size: 1.25em;\n  line-height: 1.5;\n  width: 2.15em;\n  height: 100%;\n  color: #777;\n  cursor: pointer;\n  font-weight: normal;\n}\n.h5p-multichoice .multichoice-tip:focus {\n  outline: 0;\n  box-shadow: 0px 0px 1px 3px rgba(140,185,240,1);\n}\n\n.h5p-multichoice .multichoice-tip .joubel-icon-tip-normal {\n  line-height: initial;\n  float: right;\n}\n\n.h5p-multichoice .multichoice-tip:hover {\n  color: #333;\n}\n\n.h5p-multichoice .h5p-selected.h5p-should-not.h5p-correct .multichoice-tip,\n.h5p-multichoice .h5p-selected.h5p-should.h5p-correct .multichoice-tip,\n.h5p-multichoice .h5p-selected.h5p-should.h5p-wrong .multichoice-tip,\n.h5p-multichoice .h5p-selected.h5p-should-not.h5p-wrong .multichoice-tip {\n  right: 3.125em;\n}\n\n\/* Remove tip icon on check *\/\n.h5p-multichoice [aria-disabled=\"true\"] .h5p-multichoice-tipwrap {\n  display: none;\n}\n\n.h5p-multichoice-tipwrap {\n  display: inline;\n}\n\n.h5p-multichoice .h5p-question-plus-one,\n.h5p-multichoice .h5p-question-minus-one {\n  display: inline-block;\n  top: auto;\n  right: auto;\n  padding-top: 2px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.RadioGroup-1.1\/radio-group.css?ver=1.1.1":".h5p-editor-radio-group-container {\n  margin-bottom: 1em;\n}\n.h5p-editor-radio-group-button {\n  padding: .5em 0 0 0;\n  margin-left: .3em;\n}\n.h5p-editor-radio-group-container.horizontal .h5p-editor-radio-group-button {\n  display: inline-block;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TrueFalse-1.2\/styles\/h5p-true-false.css?ver=1.2.4":".h5p-true-false-answers {\n  margin: 1em 0 1em;\n}\n.h5p-true-false-answer {\n  position: relative;\n  display: inline-block;\n  box-sizing: border-box;\n  cursor: pointer;\n  border-radius: 4px;\n  border: 2px solid #ddd;\n  margin: 0 1em 1em 0;\n  padding: .5em 3.5em .5em .3em;\n  box-shadow: 0 1px 0 0 #ccc;\n  outline: none;\n  background: #fff;\n}\n.aria-label {\n  width: 0;\n  height: 0;\n  overflow: hidden;\n  display: block;\n  position: absolute;\n}\n.h5p-true-false-answer:hover {\n  border-color: #8cb9f0;\n}\n.h5p-true-false-answer:focus {\n  box-shadow: 0px 0px 5px 2px rgba(140,185,240,1);\n}\n.h5p-true-false-answer:before {\n  margin: 0 .5em;\n  font-family: 'H5PFontIcons';\n  font-size: 0.8em;\n  content: '\\e60b';\n}\n.h5p-true-false-answer[aria-checked=true] {\n  background: #d3ebfb;\n  border-color: #6b9fde;\n  color: #000;\n}\n.h5p-true-false-answer[aria-checked=true]::before {\n  content: '\\e60d';\n}\n.h5p-true-false-answer:after {\n  font-family: 'H5PFontAwesome4';\n  font-weight: normal;\n  content: ' ';\n  width: 2.5em;\n  position: absolute;\n  right: 0;\n  top: 0;\n  height: 100%;\n  text-align: center;\n  line-height: 2.5em;\n}\n.h5p-true-false-answer:active {\n  border-color: #8cb9f0;\n  transform: scale(0.95);\n}\n.h5p-true-false-answer.correct {\n  background: #fff;\n  border-color: #47b47d;\n  box-shadow: none;\n}\n.h5p-true-false-answer.correct:after {\n  background: #47b47d;\n  content: '\\f00c';\n  color: #fff;\n}\n.h5p-true-false-answer.wrong {\n  background: #fff;\n  border-color: #dd2e2e;\n  box-shadow: none;\n}\n.h5p-true-false-answer.wrong:after {\n  background: #dd2e2e;\n  content: '\\f00d';\n  color: #fff;\n}\n.h5p-true-false-answer[aria-disabled=true] {\n  box-shadow: none;\n  pointer-events: none;\n}\n\/* When  *\/\n.h5p-transparent > div > .h5p-question.h5p-true-false > * {\n  margin-left: 3px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/h5p-jquery-ui.css?ver=1.10.19":"\/*! jQuery UI - v1.10.1 - 2013-02-15\n* http:\/\/jqueryui.com\n* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css\n* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT *\/\n\n\/* Layout helpers\n----------------------------------*\/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-clearfix {\n\tmin-height: 0; \/* support: IE7 *\/\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0);\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n\/* Interaction Cues\n----------------------------------*\/\n.ui-state-disabled {\n\tcursor: default !important;\n}\n\n\n\/* Icons\n----------------------------------*\/\n\n\/* states and images *\/\n.ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n\n\/* Misc visuals\n----------------------------------*\/\n\n\/* Overlays *\/\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin-top: 2px;\n\tpadding: .5em .5em .5em .7em;\n\tmin-height: 0; \/* support: IE7 *\/\n}\n.ui-accordion .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n.ui-accordion .ui-accordion-noicons {\n\tpadding-left: .7em;\n}\n.ui-accordion .ui-accordion-icons .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n.ui-accordion .ui-accordion-header .ui-accordion-header-icon {\n\tposition: absolute;\n\tleft: .5em;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-button {\n\tdisplay: inline-block;\n\tposition: relative;\n\tpadding: 0;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\toverflow: visible; \/* removes extra width in IE *\/\n}\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\/* to make room for the icon, a width needs to be set here *\/\n.ui-button-icon-only {\n\twidth: 2.2em;\n}\n\/* button elements seem to need a little more width *\/\nbutton.ui-button-icon-only {\n\twidth: 2.4em;\n}\n.ui-button-icons-only {\n\twidth: 3.4em;\n}\nbutton.ui-button-icons-only {\n\twidth: 3.7em;\n}\n\n\/* button text element *\/\n.ui-button .ui-button-text {\n\tdisplay: block;\n\tline-height: normal;\n}\n.ui-button-text-only .ui-button-text {\n\tpadding: .4em 1em;\n}\n.ui-button-icon-only .ui-button-text,\n.ui-button-icons-only .ui-button-text {\n\tpadding: .4em;\n\ttext-indent: -9999999px;\n}\n.ui-button-text-icon-primary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 1em .4em 2.1em;\n}\n.ui-button-text-icon-secondary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 2.1em .4em 1em;\n}\n.ui-button-text-icons .ui-button-text {\n\tpadding-left: 2.1em;\n\tpadding-right: 2.1em;\n}\n\/* no icon support for input elements, provide padding by default *\/\ninput.ui-button {\n\tpadding: .4em 1em;\n}\n\n\/* button icon element(s) *\/\n.ui-button-icon-only .ui-icon,\n.ui-button-text-icon-primary .ui-icon,\n.ui-button-text-icon-secondary .ui-icon,\n.ui-button-text-icons .ui-icon,\n.ui-button-icons-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-button-icon-only .ui-icon {\n\tleft: 50%;\n\tmargin-left: -8px;\n}\n.ui-button-text-icon-primary .ui-button-icon-primary,\n.ui-button-text-icons .ui-button-icon-primary,\n.ui-button-icons-only .ui-button-icon-primary {\n\tleft: .5em;\n}\n.ui-button-text-icon-secondary .ui-button-icon-secondary,\n.ui-button-text-icons .ui-button-icon-secondary,\n.ui-button-icons-only .ui-button-icon-secondary {\n\tright: .5em;\n}\n\n\/* button sets *\/\n.ui-buttonset {\n\tmargin-right: 7px;\n}\n.ui-buttonset .ui-button {\n\tmargin-left: 0;\n\tmargin-right: -.3em;\n}\n\n\/* workarounds *\/\n\/* reset extra padding in Firefox, see h5bp.com\/l *\/\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month-year {\n\twidth: 100%;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 49%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n\/* with multiple calendars *\/\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n\/* RTL support *\/\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 21px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -5px;\n\tbackground-position: 16px 16px;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 2px;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: none;\n}\n.ui-menu .ui-menu {\n\tmargin-top: -3px;\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px -2px 5px -2px;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-menu-item a {\n\ttext-decoration: none;\n\tdisplay: block;\n\tpadding: 2px .4em;\n\tline-height: 1.5;\n\tmin-height: 0; \/* support: IE7 *\/\n\tfont-weight: normal;\n}\n.ui-menu .ui-menu-item a.ui-state-focus,\n.ui-menu .ui-menu-item a.ui-state-active {\n\tfont-weight: normal;\n\tmargin: -1px;\n}\n\n.ui-menu .ui-state-disabled {\n\tfont-weight: normal;\n\tmargin: .4em 0 .2em;\n\tline-height: 1.5;\n}\n.ui-menu .ui-state-disabled a {\n\tcursor: default;\n}\n\n\/* icon support *\/\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item a {\n\tposition: relative;\n\tpadding-left: 2em;\n}\n\n\/* left-aligned *\/\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: .2em;\n\tleft: .2em;\n}\n\n\/* right-aligned *\/\n.ui-menu .ui-menu-icon {\n\tposition: static;\n\tfloat: right;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/animated-overlay.gif);\n\theight: 100%;\n\tfilter: alpha(opacity=25);\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n\/* For IE8 - See #6727 *\/\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 22px;\n}\n.ui-spinner-button {\n\twidth: 16px;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n\/* more specificity required here to overide default borders *\/\n.ui-spinner a.ui-spinner-button {\n\tborder-top: none;\n\tborder-bottom: none;\n\tborder-right: none;\n}\n\/* vertical centre icon *\/\n.ui-spinner .ui-icon {\n\tposition: absolute;\n\tmargin-top: -8px;\n\ttop: 50%;\n\tleft: 0;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n\n\/* TR overrides *\/\n.ui-spinner .ui-icon-triangle-1-s {\n\t\/* need to fix icons sprite *\/\n\tbackground-position: -65px -16px;\n}\n.ui-tabs {\n\tposition: relative;\/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") *\/\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav li a {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active a,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled a,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading a {\n\tcursor: text;\n}\n.ui-tabs .ui-tabs-nav li a, \/* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... *\/\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n\t-webkit-box-shadow: 0 0 5px #aaa;\n\tbox-shadow: 0 0 5px #aaa;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n\n\/* Component containers\n----------------------------------*\/\n.ui-widget {\n\tfont-family: Verdana,Arial,sans-serif\/*{ffDefault}*\/;\n\tfont-size: 1.1em\/*{fsDefault}*\/;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Verdana,Arial,sans-serif\/*{ffDefault}*\/;\n\tfont-size: 1em;\n}\n.ui-widget-content {\n\tborder: 1px solid #aaaaaa\/*{borderColorContent}*\/;\n\tbackground: #ffffff\/*{bgColorContent}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_flat_75_ffffff_40x100.png)\/*{bgImgUrlContent}*\/ 50%\/*{bgContentXPos}*\/ 50%\/*{bgContentYPos}*\/ repeat-x\/*{bgContentRepeat}*\/;\n\tcolor: #222222\/*{fcContent}*\/;\n}\n.ui-widget-content a {\n\tcolor: #222222\/*{fcContent}*\/;\n}\n.ui-widget-header {\n\tborder: 1px solid #aaaaaa\/*{borderColorHeader}*\/;\n\tbackground: #cccccc\/*{bgColorHeader}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_highlight-soft_75_cccccc_1x100.png)\/*{bgImgUrlHeader}*\/ 50%\/*{bgHeaderXPos}*\/ 50%\/*{bgHeaderYPos}*\/ repeat-x\/*{bgHeaderRepeat}*\/;\n\tcolor: #222222\/*{fcHeader}*\/;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #222222\/*{fcHeader}*\/;\n}\n\n\/* Interaction states\n----------------------------------*\/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default {\n\tborder: 1px solid #d3d3d3\/*{borderColorDefault}*\/;\n\tbackground: #e6e6e6\/*{bgColorDefault}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_glass_75_e6e6e6_1x400.png)\/*{bgImgUrlDefault}*\/ 50%\/*{bgDefaultXPos}*\/ 50%\/*{bgDefaultYPos}*\/ repeat-x\/*{bgDefaultRepeat}*\/;\n\tfont-weight: normal\/*{fwDefault}*\/;\n\tcolor: #555555\/*{fcDefault}*\/;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited {\n\tcolor: #555555\/*{fcDefault}*\/;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus {\n\tborder: 1px solid #999999\/*{borderColorHover}*\/;\n\tbackground: #dadada\/*{bgColorHover}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_glass_75_dadada_1x400.png)\/*{bgImgUrlHover}*\/ 50%\/*{bgHoverXPos}*\/ 50%\/*{bgHoverYPos}*\/ repeat-x\/*{bgHoverRepeat}*\/;\n\tfont-weight: normal\/*{fwDefault}*\/;\n\tcolor: #212121\/*{fcHover}*\/;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited {\n\tcolor: #212121\/*{fcHover}*\/;\n\ttext-decoration: none;\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active {\n\tborder: 1px solid #aaaaaa\/*{borderColorActive}*\/;\n\tbackground: #ffffff\/*{bgColorActive}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_glass_65_ffffff_1x400.png)\/*{bgImgUrlActive}*\/ 50%\/*{bgActiveXPos}*\/ 50%\/*{bgActiveYPos}*\/ repeat-x\/*{bgActiveRepeat}*\/;\n\tfont-weight: normal\/*{fwDefault}*\/;\n\tcolor: #212121\/*{fcActive}*\/;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #212121\/*{fcActive}*\/;\n\ttext-decoration: none;\n}\n\n\/* Interaction Cues\n----------------------------------*\/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #fcefa1\/*{borderColorHighlight}*\/;\n\tbackground: #fbf9ee\/*{bgColorHighlight}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_glass_55_fbf9ee_1x400.png)\/*{bgImgUrlHighlight}*\/ 50%\/*{bgHighlightXPos}*\/ 50%\/*{bgHighlightYPos}*\/ repeat-x\/*{bgHighlightRepeat}*\/;\n\tcolor: #363636\/*{fcHighlight}*\/;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #363636\/*{fcHighlight}*\/;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #cd0a0a\/*{borderColorError}*\/;\n\tbackground: #fef1ec\/*{bgColorError}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_glass_95_fef1ec_1x400.png)\/*{bgImgUrlError}*\/ 50%\/*{bgErrorXPos}*\/ 50%\/*{bgErrorYPos}*\/ repeat-x\/*{bgErrorRepeat}*\/;\n\tcolor: #cd0a0a\/*{fcError}*\/;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #cd0a0a\/*{fcError}*\/;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #cd0a0a\/*{fcError}*\/;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70);\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35);\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); \/* For IE8 - See #6059 *\/\n}\n\n\/* Icons\n----------------------------------*\/\n\n\/* states and images *\/\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n\tbackground-position: 16px 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_222222_256x240.png)\/*{iconsContent}*\/;\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_222222_256x240.png)\/*{iconsHeader}*\/;\n}\n.ui-state-default .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_888888_256x240.png)\/*{iconsDefault}*\/;\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_454545_256x240.png)\/*{iconsHover}*\/;\n}\n.ui-state-active .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_454545_256x240.png)\/*{iconsActive}*\/;\n}\n.ui-state-highlight .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_2e83ff_256x240.png)\/*{iconsHighlight}*\/;\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-icons_cd0a0a_256x240.png)\/*{iconsError}*\/;\n}\n\n\/* positioning *\/\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n\/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead *\/\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n\/* Misc visuals\n----------------------------------*\/\n\n\/* Corner radius *\/\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 4px\/*{cornerRadius}*\/;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 4px\/*{cornerRadius}*\/;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 4px\/*{cornerRadius}*\/;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 4px\/*{cornerRadius}*\/;\n}\n\n\/* Overlays *\/\n.ui-widget-overlay {\n\tbackground: #aaaaaa\/*{bgColorOverlay}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_flat_0_aaaaaa_40x100.png)\/*{bgImgUrlOverlay}*\/ 50%\/*{bgOverlayXPos}*\/ 50%\/*{bgOverlayYPos}*\/ repeat-x\/*{bgOverlayRepeat}*\/;\n\topacity: .3\/*{opacityOverlay}*\/;\n\tfilter: Alpha(Opacity=30)\/*{opacityFilterOverlay}*\/;\n}\n.ui-widget-shadow {\n\tmargin: -8px\/*{offsetTopShadow}*\/ 0 0 -8px\/*{offsetLeftShadow}*\/;\n\tpadding: 8px\/*{thicknessShadow}*\/;\n\tbackground: #aaaaaa\/*{bgColorShadow}*\/ url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/jQuery.ui-1.10\/images\/ui-bg_flat_0_aaaaaa_40x100.png)\/*{bgImgUrlShadow}*\/ 50%\/*{bgShadowXPos}*\/ 50%\/*{bgShadowYPos}*\/ repeat-x\/*{bgShadowRepeat}*\/;\n\topacity: .3\/*{opacityShadow}*\/;\n\tfilter: Alpha(Opacity=30)\/*{opacityFilterShadow}*\/;\n\tborder-radius: 8px\/*{cornerRadiusShadow}*\/;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.Wizard-1.2\/Styles\/Wizard.css?ver=1.2.2":".field.wizard > .h5peditor-label-wrapper {\n  display: none;\n}\n.field.wizard > .h5peditor-tabs {\n  display: table;\n  table-layout: fixed;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n}\nol.h5peditor-tabs {\n  counter-reset: li;\n}\nol.h5peditor-tabs > li.h5peditor-tab-li {\n  list-style-type: none;\n  position: relative;\n}\n.field.wizard .h5peditor-tab-li {\n  padding: 0;\n  position: relative;\n  display: table-cell;\n  line-height: initial;\n}\n.field.wizard .h5peditor-tab-a {\n  display: block;\n  position: relative;\n  background: #e3e3e3;\n  margin-right: 1px;\n  padding: 11px 15px;\n  color: #737373;\n}\n.field.wizard .h5peditor-tab-a span {\n  display: block;\n  padding-left: 45px;\n  line-height: 1.5em;\n}\n.field.wizard .h5peditor-tab-a .field-step {\n  font-size: 0.6em;\n  font-style: italic;\n  color: #757575;\n}\n\n\/* Make the step field white on guided tour *\/\n.field.wizard .h5peditor-tab-a.shepherd-enabled .field-step {\n  color: white;\n}\n\n.field.wizard .h5peditor-tab-a:before {\n  font-family: 'H5PFontIcons';\n  position: absolute;\n  content: \"?\";\n  font-size: 2em;\n}\n.field.wizard .h5peditor-tab-a:hover {\n  background: #eaeaea;\n  text-decoration: none;\n}\n.field.wizard .h5peditor-tab-a:focus {\n  box-shadow: none;\n}\n.field.wizard .h5peditor-tab-a:hover:before,\n.field.wizard .h5peditor-tab-a:hover:after {\n  border-top-color: #ddd;\n  border-bottom-color: #ddd;\n}\n.field.wizard .h5peditor-tab-a:hover:after {\n  border-top-color: transparent;\n  border-bottom-color: transparent;\n  border-left-color: #ddd;\n}\n.field.wizard .h5peditor-tab-a .field-name {\n  font-weight: 600;\n  font-size: 0.9em;\n  width: 100%;\n}\n.field.wizard .h5peditor-tab-li:first-child > .h5peditor-tab-a:before,\n.field.wizard .h5peditor-tab-li:last-child > .h5peditor-tab-a:after {\n  border: 0;\n}\n.field.wizard .h5peditor-tab-li:last-child > .h5peditor-tab-a {\n  margin-right: 0;\n}\n.field.wizard .h5peditor-tab-a.h5peditor-active {\n  background: #ffffff;\n  cursor: default;\n  color: #444\n}\n.field.wizard .h5peditor-tab-a.h5peditor-active:before {\n  border-top-color: #e8e8e8;\n  border-bottom-color: #e8e8e8;\n  color: #3aa2ec;\n}\n.field.wizard .h5peditor-tab-a.h5peditor-active:after {\n  border-left-color: #e8e8e8;\n}\n.field.wizard .h5peditor-tab-a.h5peditor-active:hover:after {\n  border-top-color: transparent;\n  border-bottom-color: transparent;\n}\n.field.wizard > .h5peditor-panes > .group {\n  background-color: transparent;\n  box-shadow: none;\n  border: 0px;\n  display: block;\n}\n.field.wizard > .h5peditor-panes > .group > .title {\n  display: none;\n}\n.field.wizard > .h5peditor-panes > .group > .content {\n  display: block;\n}\n.field.wizard > .h5peditor-panes > .field {\n  margin: 0;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons {\n  display: table;\n  width: 100%;\n  background-color: #e3e3e3;\n  margin-bottom: 20px;\n  font-size: 17px;\n  line-height: initial;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons:after {\n  clear: both;\n  content: \"\";\n  display: block;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons span {\n  display: block;\n  vertical-align: middle;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons div div span:first-child {\n  font-style: italic;\n  color: #757575;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons .nav-button-icon {\n  display: table-cell;\n  padding: 0.5em 0.75em;\n  vertical-align: middle;\n  font-size: 0.8em;\n  font-weight: bold;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons .nav-button-icon:before {\n  font-family: 'H5PFontAwesome4';\n}\n.field.wizard .h5peditor-wizard-navigation-buttons .nav-button-prev .nav-button-icon:before {\n  content: \"\\f104\";\n}\n.field.wizard .h5peditor-wizard-navigation-buttons .nav-button-next .nav-button-icon:before {\n  content: \"\\f105\";\n}\n.field.wizard .h5peditor-wizard-navigation-buttons > div {\n  background: #fdfdfd;\n  background: linear-gradient(#fdfdfd, #f3f3f3);\n  border: 1px solid #d0d0d1;\n  border-radius: 5px;\n  margin: 0.5em;\n  cursor: pointer;\n  -webkit-user-select: none; \/* Safari *\/\n  -moz-user-select: none; \/* Firefox *\/\n  -ms-user-select: none; \/* Internet Explorer\/Edge *\/\n  user-select: none;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons > div:hover {\n  background: linear-gradient(to bottom, #fff 0, #d0d0d1 100%);\n  border-color: #999;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons > div div {\n  padding: 0.45em 0.7em;\n  display: table-cell;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons > div div span:first-child {\n  font-size: 0.625em;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons > div div .nav-button-label {\n  font-size: 0.75em;\n}\n.field.wizard .h5peditor-wizard-navigation-buttons .nav-button-label:before {\n  font-family: 'H5PFontIcons';\n  content: \"?\";\n  font-size: 1.3em;\n  color: #737373;\n  padding-right: 0.1em;\n  top: 0.075em;\n  left: -0.1em;\n  position: relative;\n}\n.field.wizard .nav-button-prev {\n  float: left;\n}\n.field.wizard .nav-button-next {\n  float: right;\n}\n.field.wizard .nav-button-prev > div {\n  border-left: 1px solid #d0d0d1;\n}\n.field.wizard .nav-button-next > div {\n  border-right: 1px solid #d0d0d1;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.DragQuestion-1.9\/H5PEditor.DragQuestion.css?ver=1.9.2":".h5peditor-dragquestion-wrapper {\n  position: relative;\n}\n\n.dragQuestion {\n  position: relative;\n}\n\n.dragQuestion .h5peditor-dragnbar {\n  font-size: 1em;\n  background: #f5f5f5;\n  border: 1px solid #ccc;\n  border-bottom: none;\n}\n\n.dragQuestion .h5p-dragnbar-ul {\n  float: none;\n  padding: 0;\n  margin: 0;\n  list-style: none;\n}\n\n.dragQuestion .h5p-dragnbar-ul:after {\n  visibility: hidden;\n  display: block;\n  content: \"\";\n  clear: both;\n}\n\n.dragQuestion .h5p-dragnbar-li {\n  float: left;\n  margin: 0;\n  padding: 0;\n  background: none;\n  border: none;\n  position: relative;\n}\n\n.h5p-dragquestion-editor .h5peditor-dragnbar .h5p-dragnbar-li .h5p-dragnbar-tooltip {\n  font-size: 0.9em;\n}\n\n.dragQuestion .h5p-dragnbar-li:hover {\n  background: none;\n}\n\n.dragQuestion .h5p-dragnbar-li:before {\n  top: 44px;\n  font-size: 0.88em;\n}\n\n.dragQuestion .h5p-dragnbar-a {\n  width: 1em;\n  line-height: 1.5em;\n  text-align: center;\n  background: linear-gradient(to bottom,#fff 0,#f2f2f2 100%);\n  border: 1px solid #ccc;\n  border-radius: 0.25em;\n  margin: 0.25em;\n  display: block;\n  padding: 0.25em 0.75em;\n  color: #333;\n}\n\n.dragQuestion .h5p-dragnbar-a:hover {\n  text-decoration: none;\n  border-color: #999;\n}\n\n.dragQuestion .h5p-dragnbar-a:link, .dragQuestion .h5p-dragnbar-a:visited  {\n  color: #555;\n}\n.dragQuestion .h5p-dragnbar-a:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"?\";\n}\n.dragQuestion .h5p-dragnbar-a:hover {\n  text-decoration: none;\n}\n.dragQuestion .h5p-dragnbar-advancedtext-button:before {\n  font-size: 1.125em;\n  font-weight: bold;\n  content: \"T\";\n}\n.dragQuestion .h5p-dragnbar-image-button:before {\n  content: \"\\f03e\";\n}\n.dragQuestion .h5p-dragnbar-dropzone-button:before {\n  content: \"\\f140\";\n}\n\n.h5peditor-dragquestion {\n  padding: 0.5em 1em;\n}\n.h5peditor-dragquestion.h5p-ready {\n  padding: 0;\n  background-size: 100% 100%;\n  background-color: #FFFFFF;\n  position: relative;\n  border: 1px solid #ccc;\n  border-radius: 0;\n  overflow: hidden;\n}\n\n.h5peditor-dragquestion .h5p-dragnbar-element.focused {\n  outline-offset: -2px;\n}\n\n.h5peditor-dragquestion .h5p-dragnbar-element:not(.focused):focus {\n  outline: none;\n}\n\n.h5p-dq-element {\n  position: absolute;\n  line-height: 1.25em;\n  z-index: 1;\n  background: #fff;\n  cursor: pointer;\n}\n\n.h5p-dq-text {\n  padding: 0.25em 0.5em;\n}\n.h5p-dq-element.h5p-draggable {\n  border-radius: 0.5em;\n  border: 0.1em solid #c6c6c6;\n  cursor: pointer;\n  position: absolute;\n  text-align: center;\n  background: #ddd;\n  box-shadow: 0 0 0.3em rgba(0,0,0,0.2);\n  z-index: 3;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  padding: 0.3em 0.3em;\n  line-height: 1.25em;\n\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n.h5p-dq-element.h5p-draggable .h5p-dq-element-inner {\n  padding: 0;\n  overflow: hidden;\n}\n.h5p-dq-element.h5p-draggable:hover {\n  border: 0.1em solid rgb(212,190,216);\n  color: #663366;\n  background: #edd6e9;\n}\n\n.h5p-dq-element-inner.h5p-image {\n  width: 100%;\n  height: 100%;\n}\n.h5p-draggable > ul {\n  text-align: left;\n  margin: 0.5em 0.5em 0.5em 2.25em;\n  padding: 0;\n}\n\n.h5p-draggable > ul > li {\n  background: transparent;\n  list-style: disc outside none;\n  padding: 0;\n  margin: 0;\n}\n\n.h5p-dq-element p {\n  margin: 0;\n  padding: 0;\n}\n.h5p-dq-element span {\n  line-height: 1em;\n}\n.h5p-dq-dz {\n  cursor: pointer;\n  position: absolute;\n  border: 2px solid rgba(255,255,255,0.7);\n  border-radius: 0.5em;\n  z-index: 2;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  background: rgb(245, 245, 245);\n}\n.h5p-dq-dz:before {\n  content: \" \";\n  display: block;\n  position: absolute;\n  border: 2px dashed rgba(0, 0, 0, 0.7);\n  width: 100%;\n  height: 100%;\n  top: -2px;\n  left: -2px;\n}\n\n.h5p-dq-dz.h5p-has-label {\n  border-radius: 0 0 0.5em 0.5em;\n}\n.h5p-dq-dz .joubel-tip-container {\n  position: absolute;\n  right: 0.5em;\n  bottom: 0;\n  font-size: 0.8em;\n}\n\n.h5peditor-dragquestion .h5p-moving {\n  opacity: 0.75;\n}\n\n.h5p-dq-label {\n  position: absolute;\n  bottom: 100%;\n  font-size: 0.75em;\n}\n\n.h5peditor-fluid-dialog {\n  display: none;\n  background: #fff;\n  border: 1px solid #ccc;\n  -webkit-box-shadow: 0 0 4px #a7a7a7;\n  -moz-box-shadow: 0 0 4px #a7a7a7;\n  box-shadow: 0 0 4px #a7a7a7;\n}\n.h5peditor-fd-inner {\n  padding: 0.5em;\n}\n.h5peditor-fd-buttons {\n  overflow: hidden;\n  border-top: 1px solid #ccc;\n  background: #f5f5f5;\n}\na.h5peditor-fd-button {\n  font-size: 0.75em;\n  float: right;\n  padding: 0.625em 2em;\n  margin: 0.5em;\n  border-radius: 0.25em;\n  border: 1px solid #ccc;\n  color: #fff;\n  background: #3673B5;\n  background: -webkit-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -moz-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -ms-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -o-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  border-color: #20588F;\n}\na.h5peditor-fd-button:hover {\n  background: #3275bc;\n  background: -webkit-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -moz-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -ms-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -o-linear-gradient(top,#3275bc 0,#285585 100%);\n}\na.h5peditor-fd-button.h5peditor-remove {\n  background: none;\n  border: none;\n  color: #a00;\n  padding-right: 0;\n}\na.h5peditor-fd-button.h5peditor-remove:hover {\n  color: #e40000;\n}\n.h5p-dq-dz-label {\n  background: none repeat scroll 0 0 #ddd;\n  margin-bottom: 0.1em;\n  line-height: 1.25em;\n  padding-left: 0.5em;\n  position: absolute;\n  bottom: 100%;\n  left: -0.1em;\n  right: -0.1em;\n  white-space: nowrap;\n  border-radius: 0.5em 0.5em 0 0;\n}\n\n.h5peditor-dynamiccheckboxes-select, .h5peditor-dynamiccheckboxes-select > li {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  background: transparent;\n}\n.h5peditor-dynamiccheckboxes-select > li {\n  margin: 0.1em 1em;\n}\n.h5peditor-dynamiccheckboxes-select > li > .h5p-editor-label {\n  font-weight: normal;\n}\n.h5peditor-dynamiccheckboxes-select > li > .h5p-editor-label > input,\n.h5peditor-dynamiccheckboxes-select .h5p-label-text {\n  vertical-align: middle;\n  display: inline-block;\n}\n.field.dynamicCheckboxes .h5p-selectall {\n  font-size: 0.75em;\n}\n\n.h5p-dragquestion-editor .h5peditor-panes > .field.dragQuestion {\n  background-color: #fff;\n  padding: 20px;\n}\n\n.h5p-dragquestion-editor .h5peditor-form {\n  border-radius: 0;\n  padding: 0;\n  background: #fff;\n}\n\n.h5p-dragquestion-editor .field.wizard > .h5peditor-panes > .group > .content {\n  border: 0;\n}\n\n.h5p-dragquestion-editor .field.wizard .h5peditor-tab-settings:before {\n  content: '\\e916';\n}\n.h5p-dragquestion-editor .field.wizard .h5peditor-tab-task:before {\n  content: '\\e991';\n}\n\n.h5p-dragquestion-editor .common {\n  margin: 20px;\n  background-color: #FAFBFC;\n}\n\n.h5p-dragquestion-editor .tree > .field-name-backgroundOpacity,\n.h5p-dragquestion-editor .tree > .field-name-behaviour,\n.h5p-dragquestion-editor .tree > .field-name-overallFeedback {\n  margin: 20px;\n}\n\n.field-name-backgroundOpacity .h5peditor-text {\n  width: 75px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragQuestion-1.11\/css\/dragquestion.css?ver=1.11.4":".h5p-dragquestion {\n  display: block;\n  background: #fff;\n}\n\nhtml.h5p-iframe .h5p-container.h5p-dragquestion.h5p-semi-fullscreen,\nhtml.h5p-iframe .h5p-container.h5p-dragquestion.h5p-fullscreen {\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n\nhtml.h5p-iframe .h5p-container.h5p-dragquestion.h5p-semi-fullscreen {\n  overflow-x: auto;\n}\n\n.h5p-question-content.h5p-dragquestion-has-no-background {\n  border-bottom: 1px solid #eee;\n}\n.h5p-dragquestion > .h5p-question-content > .h5p-inner {\n  position: relative;\n  background-repeat: no-repeat;\n  background-position: center top;\n  background-size: 100% 100%;\n  margin: 0 auto;\n  overflow: hidden;\n}\n\n.h5p-dragquestion > .h5p-question-content {\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.h5p-dragquestion .h5p-static {\n  background: #fff;\n  position: absolute;\n  z-index: 1;\n}\n\n.h5p-dragquestion .h5p-static.h5p-advanced-text {\n  padding: 0.25em 0.5em;\n  border-radius: 0.25em;\n}\n\n.h5p-dragquestion .h5p-static > h2 {\n  font-size: 1.5em;\n  line-height: 1.25em;\n  margin: 0;\n}\n.h5p-dragquestion .h5p-static > p {\n  margin: 0;\n  padding: 0;\n  font-size: 1em;\n  line-height: 1.25em;\n}\n\n.h5p-dragquestion .h5p-draggable {\n  border-radius: 0.25em;\n  border: 0.1em solid #c6c6c6;\n  cursor: pointer;\n  position: absolute;\n  text-align: center;\n  padding: 0.3em 0.3em;\n  line-height: 1.25em;\n\n  -webkit-box-shadow: 0 0 0.2em rgba(0,0,0,0.2);\n  -moz-box-shadow: 0 0 0.2em rgba(0,0,0,0.2);\n  box-shadow: 0 0 0.2em rgba(0,0,0,0.2);\n\n  background: rgb(221,221,221);\n\n  z-index: 3;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n.h5p-dragquestion .h5p-draggable:not(.ui-state-disabled).h5p-draggable-hover {\n   border: 0.1em solid rgb(212, 190, 216);\n   background: #edd6e9;\n }\n.h5p-dragquestion .h5p-draggable.h5p-dropped {\n  color: #1a4473;\n  border: 0.1em solid #a9c3d0;\n  background: #cee0f4;\n}\n.h5p-dragquestion .h5p-draggable > img {\n  pointer-events: none;\n}\n.h5p-dragquestion .h5p-draggable > ul {\n  text-align: left;\n  margin: 0.5em 0.5em 0.5em 2.25em;\n  padding: 0;\n}\n.h5p-dragquestion .h5p-draggable > ul > li {\n  background: transparent;\n  list-style: disc outside none;\n  padding: 0;\n  margin: 0;\n}\n.h5p-dragquestion .h5p-draggable.ui-draggable-dragging {\n  opacity: 0.5;\n  box-shadow: 0 0 0.3em rgba(0,0,0,0.2);\n}\n.h5p-dragquestion .h5p-draggable.ui-state-disabled {\n  opacity: 1;\n  cursor: default;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.h5p-dragquestion .h5p-draggable p {\n  margin: 0;\n  padding: 0;\n}\n.h5p-dragquestion .h5p-draggable span {\n  line-height: 1em;\n}\n\n.h5p-dragquestion .h5p-dropped.h5p-correct, .h5p-dragquestion .h5p-dropzone.h5p-correct-answer {\n  color: #255c41;\n  border: 0.1em solid #9dd8bb;\n  box-shadow: none;\n  background: #9dd8bb;\n}\n\n.h5p-dragquestion .h5p-dropped.h5p-wrong {\n  border: 0.1em solid #f7d0d0;\n  color: #b71c1c;\n  background: #f7d0d0;\n}\n.h5p-dragquestion .h5p-dropped.h5p-wrong, .h5p-dragquestion .h5p-dropped.h5p-correct {\n  text-align: left;\n}\n\n.h5p-dragquestion .h5p-draggable.h5p-correct:after,\n.h5p-dragquestion .h5p-draggable.h5p-wrong:after {\n  font-family: 'H5PFontAwesome4';\n  font-size: 0.75em;\n  font-weight: normal;\n  position: absolute;\n  right: 0.1em;\n  bottom: 0;\n  background: inherit;\n  -webkit-border-radius: 0.25em;\n  -moz-border-radius: 0.25em;\n  border-radius: 0.25em;\n  line-height: 1;\n  padding: 0.15em 0 0 0.2em;\n}\n\n.h5p-dragquestion .h5p-draggable.h5p-correct.h5p-advanced-text:after, .h5p-dragquestion .h5p-draggable.h5p-wrong.h5p-advanced-text:after {\n  background: none;\n}\n.h5p-dragquestion .h5p-dropped.h5p-correct:after {\n  content: \"\\f00c\";\n}\n\n.h5p-dragquestion .h5p-dropped.h5p-wrong:after {\n  content: \"\\f00d\";\n}\n\n.h5p-dragquestion .h5p-dropzone {\n  z-index: 2;\n  position: absolute;\n}\n\n.h5p-dragquestion .h5p-dropzone > .h5p-inner {\n  height: 100%;\n  position: relative;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  background: rgb(245, 245, 245);\n}\n\n.h5p-dragquestion .h5p-dropzone.h5p-has-label > .h5p-inner {\n  border-radius: 0 0em 0.25em 0.25em;\n}\n\n.h5p-dragquestion .h5p-dq-highlight-dz .h5p-dropzone > .h5p-inner.h5p-active,\n.h5p-dragquestion .h5p-dq-highlight-dz-always .h5p-dropzone > .h5p-inner {\n  padding: 0;\n  border: 2px dashed #666;\n}\n\n.h5p-dragquestion .h5p-dropzone > .h5p-inner.h5p-over {\n  background: #edd6e9;\n}\n\n.h5p-dragquestion .h5p-label {\n  line-height: 1.25em;\n  padding-left: 0.5em;\n  right: 0;\n  left: 0;\n  bottom: 100%;\n  white-space: nowrap;\n  border-radius: 0.25em 0.25em 0 0;\n  position: absolute;\n\n  background: #ddd;\n}\n\n.h5p-dragquestion .h5p-dropzone-answer {\n  position: absolute;\n  top: 100%;\n  margin-top: 0.125em;\n  right: 0;\n  padding: 0.25em 0.625em;\n  font-size: 0.625em;\n  line-height: 100%;\n\n  border-radius: 0.25em;\n}\n\n.h5p-dragquestion .h5p-dropzone .joubel-tip-container {\n  position: absolute;\n  right: 0.5em;\n  bottom: 0;\n  font-size: 0.8em;\n}\n\n\/* Make sure dragquestion has margins in fullscreen *\/\n.h5p-dragquestion.h5p-fullscreen > .h5p-question-buttons,\n.h5p-dragquestion.h5p-fullscreen > .h5p-question-feedback,\n.h5p-dragquestion.h5p-fullscreen > .h5p-question-introduction {\n  margin-left: 1em;\n  margin-right: 1em;\n}\n\n\/* Full screen button styling *\/\n.h5p-dragquestion .h5p-my-fullscreen-button-enter,\n.h5p-dragquestion .h5p-my-fullscreen-button-exit {\n  cursor: pointer;\n  font-size: 1.5em;\n  color: #1a73d9;\n  position: absolute;\n  right: 10px;\n  top: 10px;\n  z-index: 1;\n}\n\n.h5p-dragquestion .h5p-my-fullscreen-button-enter {\n  line-height: 1.5em;\n  width: 1.5em;\n  height: 1.5em;\n  text-indent: 0.4em;\n}\n\n.h5p-dragquestion .h5p-my-fullscreen-button-exit {\n  line-height: 2em;\n  width: 2.2em;\n  height: 2.2em;\n  text-indent: 0.25em;\n}\n\n.h5p-dragquestion .h5p-my-fullscreen-button-enter:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f065\";\n}\n\n.h5p-dragquestion .h5p-my-fullscreen-button-exit:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f066\";\n  font-size: 2em;\n}\n.h5p-dragquestion .h5p-dq-no-dz {\n  position: absolute;\n}\n\n.h5p-dragquestion .h5p-dragquestion-introduction {\n  outline: none;\n}\n\n.h5p-dragquestion .h5p-question-plus-one,\n.h5p-dragquestion .h5p-question-minus-one {\n  width: 1.25em;\n  height: calc(1.25em * 0.638297872);\n  top: -0.15em;\n  right: -0.15em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.SummaryTextualEditor-1.1\/styles\/H5PEditor.SummaryTextualEditor.css?ver=1.1.1":".h5p-summary-editor textarea {\n  padding: 20px;\n  font-family: \"Open Sans\", sans-serif;\n  line-height: 25px;\n}\n\n.h5p-summary-editor .h5p-help-text {\n  white-space: pre-wrap;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Summary-1.8\/css\/summary.css?ver=1.8.4":".h5p-summary .summary-content .summary-container > ul {\n  margin: 0;\n  padding: 0;\n  display: block;\n}\n\n.h5p-summary .summary-container {\n  margin: 1em 0;\n  background-color: #fff;\n}\n\n.h5p-summary .summary-container.has-results {\n  border: 1px solid #ddd;\n  border-radius: 0.25em;\n}\n\n.h5p-summary .summary-options {\n  height: auto;\n  padding: 0;\n  margin: 1em 0;\n}\n.h5p-summary .summary-options ul.h5p-panel {\n  display: none;\n  padding: 0;\n  margin: 0;\n}\n\n.h5p-summary .summary-options ul.h5p-panel.panel-disabled {\n  pointer-events: none;\n}\n\n.h5p-summary .summary-evaluation {\n  overflow: hidden; \/* Contain floated counters within the evaluation div *\/\n  margin: 1em 0;\n}\n\n.h5p-summary .summary-evaluation-content {\n  display: block;\n  position: relative;\n  font-size: 1.125em;\n  float: left;\n  padding: 0.1em 2em 0.1em 0;\n}\n\n.h5p-summary .summary-evaluation-content > p {\n  margin: 0;\n}\n\n.h5p-summary .summary-container li,\n.h5p-summary .summary-options li {\n  list-style: none;\n  background-color: #ddd;\n  -moz-border-radius: 0.3em;\n  -webkit-border-radius: 0.3em;\n  border-radius: 0.3em;\n  border: 0.1em solid #ddd;\n  color: #000;\n  font-size: 1em;\n  padding: 0.375em 0.875em;\n  text-decoration: none;\n  margin: 0;\n  margin-bottom: 0.3125em;\n  -webkit-box-shadow: 0 0.1em 0 rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 0.1em 0 rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0.1em 0 rgba(0, 0, 0, 0.2);\n}\n\n.h5p-summary .summary-content li > p {\n  margin: 0.4em 0 0 0;\n  padding: 0;\n}\n.h5p-summary .summary-content li > p:first-child {\n  margin: 0;\n}\n.h5p-summary .summary-container li:not(:last-child) {\n  border-bottom: 1px solid #ddd;\n  border-radius: 0;\n}\n.h5p-summary .summary-container li {\n  display: none;\n  z-index: 5;\n  margin: 0;\n  border: 0;\n  background: none;\n  filter: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n\n  -webkit-transition: background-color 1000ms linear;\n  -moz-transition: background-color 1000ms linear;\n  -o-transition: background-color 1000ms linear;\n  -ms-transition: background-color 1000ms linear;\n  transition: background-color 1000ms linear;\n}\n.h5p-summary .summary-container li:before {\n  text-decoration: none;\n  content: \"\\f00c\";\n  font-family: 'H5PFontAwesome4';\n  color: #255c41;\n  float: right;\n}\n.h5p-summary .h5p-panel:not(.panel-disabled) .summary-claim-unclicked:hover,\n.h5p-summary .h5p-panel:not(.panel-disabled) .summary-claim-unclicked:focus {\n  cursor: pointer;\n  filter: none;\n  border: 0.1em solid #edd6e9;\n\n  background: #edd6e9;\n}\n\n.h5p-summary li.summary-failed > p,\n.h5p-summary li.summary-failed {\n  color: #b71c1c;\n  border: 0.1em solid #f7d0d0;\n  background: #f7d0d0;\n  text-decoration: line-through;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n\n.h5p-summary li.summary-failed:before {\n  text-decoration: none;\n  content: \"\\f00d\";\n  font-family: 'H5PFontAwesome4';\n  color: #b71c1c;\n  float: right;\n  line-height: 1.25;\n}\n\n.h5p-summary .summary-options div {\n  font-size: 1em;\n  padding:0;\n  background-repeat: no-repeat;\n  background-position: top right;\n}\n\n.h5p-summary .summary-score {\n  display: none;\n  float: right;\n  background: #f7d0d0;\n  -moz-border-radius: 0.3em;\n  -webkit-border-radius: 0.3em;\n  border-radius: 0.3em;\n  padding: 0.1em 0.3em;\n  font-weight: normal;\n}\n\n.h5p-summary .summary-score:before {\n  text-decoration: none;\n  content: \"\\f00d\";\n  font-family: 'H5PFontAwesome4';\n  color: #b71c1c;\n  float: left;\n  margin-right: 0.3em;\n  top: 0.1em;\n}\n\n.h5p-summary .summary-progress {\n  width: 0;\n  height: 0;\n  overflow: hidden;\n  left: 0;\n  position: absolute;\n}\n\n.h5p-summary .summary-progress-numeric {\n  float: right;\n  background: #9dd8bb;\n  -moz-border-radius: 0.3em;\n  -webkit-border-radius: 0.3em;\n  border-radius: 0.3em;\n  padding: 0.1em 0.3em;\n  font-weight: normal;\n  margin-left: 0.3em;\n}\n\n.h5p-summary .summary-progress-numeric:before {\n  text-decoration: none;\n  content: \"\\f00c\";\n  font-family: 'H5PFontAwesome4';\n  color: #255c41;\n  float: left;\n  margin-right: 0.3em;\n}\n\n.h5p-summary .summary-options h2 {\n  font-size: 1.2em;\n  font-weight: bold;\n  padding-bottom: 0.5em;\n  margin: 0;\n}\n\n.h5p-summary .summary-evaluation .joubel-tip-container {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n.h5p-summary .summary-evaluation .joubel-tip-icon {\n  line-height: 1;\n  font-size: 1.3em;\n}\n\n.h5p-summary .summary-feedback {\n  display: inline-block;\n  float: right;\n}\n\n.summary-evaluation-content .joubel-icon-tip-normal {\n  line-height: 0.75em;\n}\n\n.h5p-summary .h5p-hidden-read {\n  width: 1px;\n  height: 1px;\n  top: -1px;\n  position: absolute;\n  text-indent: 1px;\n  overflow: hidden;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.ExportableTextArea-1.2\/css\/eta.css?ver=1.2.8":".h5p-eta.h5p-element {\n  overflow: visible;\n}\n\n.h5p-eta {\n  display: flex;\n  flex-flow: column;\n  height: 100%;\n  position: absolute;\n  width: 100%;\n}\n\n.h5p-eta .h5p-eta-input {\n  width: 100%;\n  resize: none !important;\n  font-size: 100%;\n  padding: 0.25em;\n  border: 1px solid #a0a0a0;\n  line-height: 1.25em;\n  box-sizing: border-box;\n  outline: none;\n  flex: auto;\n}\n.h5p-eta .h5p-eta-input:focus {\n  border-color: #53a0ff;\n}\n.h5p-eta-label {\n  overflow: hidden;\n  padding: 0.375em 0.5em;\n  flex: none;\n}\n.h5p-eta-label p:last-child {\n  margin-bottom: 0;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Text-1.1\/styles\/text.css?ver=1.1.6":".h5p-text ul,\n.h5p-text li {\n    padding-left: 0;\n}\n.h5p-text ul li {\n  list-style-type: circle;\n  margin-left: 1.5em;\n  padding-left: 0;\n}\n.h5p-text ol li {\n  list-style-type: decimal;\n  margin-left: 1.5em;\n  padding-left: 0;\n}\n.h5p-text.h5p-frame {\n  margin: 1em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.Duration-1.1\/styles\/duration.css?ver=1.1.2":".field.duration input {\n  width: 75px;\n}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.Timecode-1.2\/timecode.css?ver=1.2.1":".field.timecode input {\n  width: 4.6875em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.SelectToggleFields-1.1\/select-toggle-fields.css?ver=1.1.0":".h5peditor-select-toggle-field-hide {\n  display: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.ColorSelector-1.2\/styles\/spectrum.css?ver=1.2.3":"\/***\nSpectrum Colorpicker v1.8.0\nhttps:\/\/github.com\/bgrins\/spectrum\nAuthor: Brian Grinstead\nLicense: MIT\n***\/\n\n.sp-container {\n  position:absolute;\n  top:0;\n  left:0;\n  display:inline-block;\n  *display: inline;\n  *zoom: 1;\n  \/* https:\/\/github.com\/bgrins\/spectrum\/issues\/40 *\/\n  z-index: 9999994;\n  overflow: hidden;\n}\n.sp-container.sp-flat {\n  position: relative;\n}\n\n\/* Fix for * { box-sizing: border-box; } *\/\n.sp-container,\n.sp-container * {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n\/* http:\/\/ansciath.tumblr.com\/post\/7347495869\/css-aspect-ratio *\/\n.sp-top {\n  position:relative;\n  width: 100%;\n  display:inline-block;\n}\n.sp-top-inner {\n  position:absolute;\n  top:0;\n  left:0;\n  bottom:0;\n  right:0;\n}\n.sp-color {\n  position: absolute;\n  top:0;\n  left:0;\n  bottom:0;\n  right:20%;\n}\n.sp-hue {\n  position: absolute;\n  top:0;\n  right:0;\n  bottom:0;\n  left:84%;\n  height: 100%;\n}\n\n.sp-clear-enabled .sp-hue {\n  top:33px;\n  height: 77.5%;\n}\n\n.sp-fill {\n  padding-top: 80%;\n}\n.sp-sat, .sp-val {\n  position: absolute;\n  top:0;\n  left:0;\n  right:0;\n  bottom:0;\n}\n\n.sp-alpha-enabled .sp-top {\n  margin-bottom: 18px;\n}\n.sp-alpha-enabled .sp-alpha {\n  display: block;\n}\n.sp-alpha-handle {\n  position:absolute;\n  top:-4px;\n  bottom: -4px;\n  width: 6px;\n  left: 50%;\n  cursor: pointer;\n  border: 1px solid black;\n  background: white;\n  opacity: .8;\n}\n.sp-alpha {\n  display: none;\n  position: absolute;\n  bottom: -14px;\n  right: 0;\n  left: 0;\n  height: 8px;\n}\n.sp-alpha-inner {\n  border: solid 1px #333;\n}\n\n.sp-clear {\n  display: none;\n}\n\n.sp-clear.sp-clear-display {\n  background-position: center;\n}\n\n.sp-clear-enabled .sp-clear {\n  display: block;\n  position:absolute;\n  top:0px;\n  right:0;\n  bottom:0;\n  left:84%;\n  height: 28px;\n}\n\n\/* Don't allow text selection *\/\n.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button  {\n  -webkit-user-select:none;\n  -moz-user-select: -moz-none;\n  -o-user-select:none;\n  user-select: none;\n}\n\n.sp-container.sp-input-disabled .sp-input-container {\n  display: none;\n}\n.sp-container.sp-buttons-disabled .sp-button-container {\n  display: none;\n}\n.sp-container.sp-palette-buttons-disabled .sp-palette-button-container {\n  display: none;\n}\n.sp-palette-only .sp-picker-container {\n  display: none;\n}\n.sp-palette-disabled .sp-palette-container {\n  display: none;\n}\n\n.sp-initial-disabled .sp-initial {\n  display: none;\n}\n\n\n\/* Gradients for hue, saturation and value instead of images.  Not pretty... but it works *\/\n.sp-sat {\n  background-image: -webkit-gradient(linear,  0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));\n  background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));\n  background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));\n  background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));\n  background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));\n  background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)\";\n  filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');\n}\n.sp-val {\n  background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));\n  background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));\n  background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));\n  background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));\n  background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));\n  background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)\";\n  filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');\n}\n\n.sp-hue {\n  background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n  background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n  background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n  background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));\n  background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n  background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n}\n\n\/* IE filters do not support multiple color stops.\n   Generate 6 divs, line them up, and do two color gradients for each.\n   Yes, really.\n *\/\n.sp-1 {\n  height:17%;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');\n}\n.sp-2 {\n  height:16%;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');\n}\n.sp-3 {\n  height:17%;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');\n}\n.sp-4 {\n  height:17%;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');\n}\n.sp-5 {\n  height:16%;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');\n}\n.sp-6 {\n  height:17%;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');\n}\n\n.sp-hidden {\n  display: none !important;\n}\n\n\/* Clearfix hack *\/\n.sp-cf:before, .sp-cf:after { content: \"\"; display: table; }\n.sp-cf:after { clear: both; }\n.sp-cf { *zoom: 1; }\n\n\/* Mobile devices, make hue slider bigger so it is easier to slide *\/\n@media (max-device-width: 480px) {\n  .sp-color { right: 40%; }\n  .sp-hue { left: 63%; }\n  .sp-fill { padding-top: 60%; }\n}\n.sp-dragger {\n  border-radius: 5px;\n  height: 5px;\n  width: 5px;\n  border: 1px solid #fff;\n  background: #000;\n  cursor: pointer;\n  position:absolute;\n  top:0;\n  left: 0;\n}\n.sp-slider {\n  position: absolute;\n  top:0;\n  cursor:pointer;\n  height: 3px;\n  left: -1px;\n  right: -1px;\n  border: 1px solid #000;\n  background: white;\n  opacity: .8;\n}\n\n\/*\nTheme authors:\nHere are the basic themeable display options (colors, fonts, global widths).\nSee http:\/\/bgrins.github.io\/spectrum\/themes\/ for instructions.\n*\/\n\n.sp-container {\n  border-radius: 0;\n  background-color: #ECECEC;\n  border: solid 1px #f0c49B;\n  padding: 0;\n}\n.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear {\n  font: normal 12px \"Lucida Grande\", \"Lucida Sans Unicode\", \"Lucida Sans\", Geneva, Verdana, sans-serif;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -ms-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.sp-top {\n  margin-bottom: 3px;\n}\n.sp-color, .sp-hue, .sp-clear {\n  border: solid 1px #666;\n}\n\n\/* Input *\/\n.sp-input-container {\n  float:right;\n  width: 100px;\n  margin-bottom: 4px;\n}\n.sp-initial-disabled  .sp-input-container {\n  width: 100%;\n}\n.sp-input {\n  font-size: 12px !important;\n  border: 1px inset;\n  padding: 4px 5px;\n  margin: 0;\n  width: 100%;\n  background:transparent;\n  border-radius: 3px;\n  color: #222;\n}\n.sp-input:focus  {\n  border: 1px solid orange;\n}\n.sp-input.sp-validation-error {\n  border: 1px solid red;\n  background: #fdd;\n}\n.sp-picker-container , .sp-palette-container {\n  float:left;\n  position: relative;\n  padding: 10px;\n  padding-bottom: 300px;\n  margin-bottom: -290px;\n}\n.sp-picker-container {\n  width: 172px;\n  border-left: solid 1px #fff;\n}\n\n\/* Palettes *\/\n.sp-palette-container {\n  border-right: solid 1px #ccc;\n}\n\n.sp-palette-only .sp-palette-container {\n  border: 0;\n}\n\n.sp-palette .sp-thumb-el {\n  display: block;\n  position:relative;\n  float:left;\n  width: 24px;\n  height: 15px;\n  margin: 3px;\n  cursor: pointer;\n  border:solid 2px transparent;\n}\n.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {\n  border-color: orange;\n}\n.sp-thumb-el {\n  position:relative;\n}\n\n\/* Initial *\/\n.sp-initial {\n  float: left;\n  border: solid 1px #333;\n}\n.sp-initial span {\n  width: 30px;\n  height: 25px;\n  border:none;\n  display:block;\n  float:left;\n  margin:0;\n}\n\n.sp-initial .sp-clear-display {\n  background-position: center;\n}\n\n\/* Buttons *\/\n.sp-palette-button-container,\n.sp-button-container {\n  float: right;\n}\n\n\/* Replacer (the little preview div that shows up instead of the <input>) *\/\n.sp-replacer {\n  margin:0;\n  overflow:hidden;\n  cursor:pointer;\n  padding: 4px;\n  display:inline-block;\n  *zoom: 1;\n  *display: inline;\n  border: solid 1px #91765d;\n  background: #eee;\n  color: #333;\n  vertical-align: middle;\n}\n.sp-replacer:hover, .sp-replacer.sp-active {\n  border-color: #F0C49B;\n  color: #111;\n}\n.sp-replacer.sp-disabled {\n  cursor:default;\n  border-color: silver;\n  color: silver;\n}\n.sp-dd {\n  padding: 2px 0;\n  height: 16px;\n  line-height: 16px;\n  float:left;\n  font-size:10px;\n}\n.sp-preview {\n  position:relative;\n  width:25px;\n  height: 20px;\n  border: solid 1px #222;\n  margin-right: 5px;\n  float:left;\n  z-index: 0;\n}\n\n.sp-palette {\n  *width: 220px;\n  max-width: 220px;\n}\n.sp-palette .sp-thumb-el {\n  width:16px;\n  height: 16px;\n  margin:2px 1px;\n  border: solid 1px #d0d0d0;\n}\n\n.sp-container {\n  padding-bottom:0;\n}\n\n\n\/* Buttons: http:\/\/hellohappy.org\/css3-buttons\/ *\/\n.sp-container button {\n  background-color: #eeeeee;\n  background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);\n  background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);\n  background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);\n  background-image: -o-linear-gradient(top, #eeeeee, #cccccc);\n  background-image: linear-gradient(to bottom, #eeeeee, #cccccc);\n  border: 1px solid #ccc;\n  border-bottom: 1px solid #bbb;\n  border-radius: 3px;\n  color: #333;\n  font-size: 14px;\n  line-height: 1;\n  padding: 5px 4px;\n  text-align: center;\n  text-shadow: 0 1px 0 #eee;\n  vertical-align: middle;\n}\n.sp-container button:hover {\n  background-color: #dddddd;\n  background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);\n  background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);\n  background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);\n  background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);\n  background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);\n  border: 1px solid #bbb;\n  border-bottom: 1px solid #999;\n  cursor: pointer;\n  text-shadow: 0 1px 0 #ddd;\n}\n.sp-container button:active {\n  border: 1px solid #aaa;\n  border-bottom: 1px solid #888;\n  -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;\n  -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;\n  -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;\n  -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;\n  box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;\n}\n.sp-cancel {\n  font-size: 11px;\n  color: #d93f3f !important;\n  margin:0;\n  padding:2px;\n  margin-right: 5px;\n  vertical-align: middle;\n  text-decoration:none;\n\n}\n.sp-cancel:hover {\n  color: #d93f3f !important;\n  text-decoration: underline;\n}\n\n\n.sp-palette span:hover, .sp-palette span.sp-thumb-active {\n  border-color: #000;\n}\n\n.sp-preview, .sp-alpha, .sp-thumb-el {\n  position:relative;\n  background-image: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);\n}\n.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner {\n  display:block;\n  position:absolute;\n  top:0;left:0;bottom:0;right:0;\n}\n\n.sp-palette .sp-thumb-inner {\n  background-position: 50% 50%;\n  background-repeat: no-repeat;\n}\n\n.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner {\n  background-image: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi\/0DsT64h8UD8HmpIPCWG\/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);\n}\n\n.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner {\n  background-image: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m\/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);\n}\n\n.sp-clear-display {\n  background-repeat:no-repeat;\n  background-position: center;\n  background-image: url(data:image\/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq\/Hx8fLy8vT09PX19ff39\/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M\/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==);\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.ColorSelector-1.2\/styles\/color-selector.css?ver=1.2.3":".sp-container {\n  background: #f5f5f5;\n  border-color: #d0d0d1;\n  box-shadow: 0 0 8px #ccc;\n}\n.sp-replacer:hover,\n.sp-replacer.sp-active {\n  border-color: #9e9e9e;\n}\n.sp-container button,\n.sp-container button:hover {\n  background: #747275;\n  text-shadow: initial;\n  color: #fff;\n  padding: 5px 8px;\n  text-transform: capitalize;\n}\n.sp-cancel {\n  padding: 2px 6px;\n  font-size: 12px;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.MarkTheWords-1.7\/styles\/mark-the-words.css?ver=1.7.4":"\/* The main containers for the module, specific to this module. *\/\n.h5p-mark-the-words {\n  position: relative;\n  background: rgba(255, 255, 255, 0.9);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#e6FFFFFF,endColorstr=#e6FFFFFF);\n  overflow: hidden;\n}\n\n.h5p-mark-the-words-descriptions {\n  display: none;\n}\n\n\/* Actual text paragraphs *\/\n.h5p-mark-the-words .h5p-word-inner p {\n  font-size: 1em;\n  font-weight: normal;\n  padding: 0;\n  margin: 0 0 1em;\n  line-height: inherit;\n}\n\n.h5p-mark-the-words button.h5p-button:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f06e\";\n  padding-right: 0.5em;\n}\n\/* Selectable words container *\/\n.h5p-mark-the-words .h5p-word-selectable-words {\n  line-height: 1.75em;\n  outline: none;\n}\n\/* Selectable words*\/\n.h5p-mark-the-words [role=\"option\"] {\n  white-space: nowrap;\n  padding: 0.15em;\n  border-radius: 0.25em;\n  cursor: pointer;\n  position: relative;\n}\n\n.h5p-mark-the-words .h5p-word-selectable-words:not(.h5p-disable-hover) [role=\"option\"]:hover {\n  box-shadow: inset 0px 0px 0px 2px #cee0f4;\n}\n\n\/* Colors and styling for word selections *\/\n.h5p-mark-the-words [aria-selected=\"true\"] {\n  background: #cee0f4;\n}\n\/* Missed word*\/\n.h5p-mark-the-words [aria-describedby=\"h5p-description-missed\"] {\n  border: 0.1em #77b395 dotted;\n  background-color: #E4F4EC;\n}\n\n\/* Correctly answered marking *\/\n.h5p-mark-the-words [aria-describedby=\"h5p-description-correct\"] {\n  background: #9dd8bb;\n  color: #255c41;\n  display: inline-block;\n  line-height: 1;\n}\n\/* Wrongly answered marking *\/\n.h5p-mark-the-words [aria-describedby=\"h5p-description-incorrect\"] {\n  background-color: #f7d0d0;\n  color: #b71c1c;\n  text-decoration: line-through;\n  display: inline-block;\n  line-height: 1;\n}\n\/* Feedback icons *\/\n.h5p-mark-the-words [aria-describedby=\"h5p-description-correct\"]:after {\n  position: relative;\n  right: 0.1em;\n  text-decoration: none;\n  content: \"\\f00c\";\n  font-family: 'H5PFontAwesome4';\n  color: #255c41;\n  padding-left: 0.75em;\n}\n.h5p-mark-the-words [aria-describedby=\"h5p-description-incorrect\"]:after {\n  position: relative;\n  right: 0.1em;\n  display: inline-block;\n  font-family: 'H5PFontAwesome4';\n  text-decoration: none;\n  content: \"\\f00d\";\n  color: #b71c1c;\n  padding-left: 0.75em;\n}\n\/* SPECIFIC CSS CLASSES FOR MARK THE WORDS MODULE: *\/\n\/* Start state for button: *\/\n.h5p-mark-the-words button.h5p-button.h5p-check-button:before {\n  content: \"\\f058\";\n}\n.h5p-mark-the-words button.h5p-button.h5p-retry-button:before {\n  content: \"\\f021\";\n}\n.h5p-mark-the-words button.h5p-button.h5p-check-button {\n  display: inline-block;\n}\nbutton.h5p-retry-button.h5p-retry-button {\n  display: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.DragText-1.6\/dist\/h5p-drag-text.css?ver=1.6.9":".h5p-drag-text{position:relative;background:hsla(0,0%,100%,.9);overflow:hidden}.h5p-drag-text .hidden{display:none}.h5p-drag-text .h5p-drag-inner p{font-size:1em;font-weight:400;padding:0;margin:0 0 1em}.h5p-drag-text button.h5p-drag-button:before{font-family:H5PFontAwesome4;padding-right:.5em}.h5p-drag-text .h5p-drag-check-button:before{content:\"\\F058\"}.h5p-drag-text .h5p-drag-retry-button:before{content:\"\\F021\"}.h5p-drag-text .h5p-drag-show-solution-button:before{content:\"\\F06E\"}.h5p-drag-text .h5p-drag-check-button{display:inline-block}.h5p-drag-text .h5p-drag-retry-button,.h5p-drag-text .h5p-drag-show-solution-button{display:none}.h5p-drag-text .joubel-tip-container{top:-1.1em;right:-.6em;position:absolute;z-index:4;font-size:.9em}.h5p-drag-text .h5p-drag-correct-feedback:before{position:absolute;right:.5em;font-family:H5PFontAwesome4;content:\"\\F00C\";color:#255c41}.h5p-drag-text .h5p-drag-wrong-feedback:before{position:absolute;right:.5em;font-family:H5PFontAwesome4;content:\"\\F00D\";color:#b71c1c}.h5p-drag-text .h5p-drag-dropzone-container{position:relative;display:inline;padding-right:.1em}.h5p-drag-text [aria-dropeffect]{position:relative;top:-.1em;width:10em;height:1.25em;background-color:#cee0f4;border-radius:.25em;display:inline-block;vertical-align:middle;text-align:center;padding:.1em 1.65em .1em 0}.h5p-drag-text [aria-dropeffect].h5p-drag-correct-feedback{background:#9dd8bb}.h5p-drag-text [aria-dropeffect].h5p-drag-wrong-feedback{background:#f7d0d0}.h5p-drag-text [aria-dropeffect]:before{line-height:1.25}.h5p-drag-text .h5p-drag-draggables-container{position:relative;padding-top:.5em;display:inline-block}.h5p-drag-text .h5p-drag-draggables-container.hide{display:none}.h5p-drag-text [aria-grabbed]{line-height:1.25;cursor:pointer;border-radius:.25em;padding:.1em .6em;margin:.3em;vertical-align:top;text-align:center;display:inline-block;border:.1em solid #c6c6c6;overflow:hidden;background:#ddd;box-shadow:0 0 .3em rgba(0,0,0,.2);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.h5p-drag-text [aria-grabbed=true],.h5p-drag-text [aria-grabbed].h5p-drag-dropped:not(.ui-state-disabled):hover,.h5p-drag-text [aria-grabbed]:not(.ui-state-disabled):hover{border:.1em solid #d4bed8;color:#636;background:#edd6e9}.h5p-drag-text [aria-grabbed].h5p-drag-dropped{width:100%;margin:-.1em 0 0;padding:.1em .825em;white-space:nowrap;color:#1a4473;border:.1em solid #a9c3d0;background:#cee0f4}.h5p-drag-text [aria-grabbed=true]{opacity:.5;box-shadow:0 0 .8em rgba(0,0,0,.5)}.h5p-drag-text [aria-grabbed].ui-state-disabled{opacity:1}.h5p-drag-text .h5p-drag-dropped.h5p-drag-draggable-correct{padding:0;color:#255c41;border:none;box-shadow:none;line-height:1.5;background:none}.h5p-drag-text .h5p-drag-dropped.h5p-drag-draggable-wrong{padding:0;border:none;color:#b71c1c;box-shadow:none;line-height:1.5;background:none}.h5p-drag-text .h5p-drag-show-solution-container{position:relative;color:#255c41;font-weight:700;display:inline;padding-left:.5em}.h5p-drag-text .h5p-drag-droppable-words{line-height:1.75}.h5p-drag-text [aria-grabbed=true]{z-index:2}.h5p-drag-text .h5p-drag-task{width:100%;position:relative;display:inline-block}.h5p-drag-text .h5p-drag-wide-screen{float:right;padding-top:0}.h5p-drag-text .h5p-drag-draggable-wide-screen{display:block}.h5p-drag-text [aria-dropeffect].ui-droppable.ui-droppable-disabled.ui-state-disabled{opacity:1}.h5p-drag-text [aria-grabbed].h5p-drag-dropped.truncate{text-overflow:ellipsis}.h5p-drag-text .correct-answer{width:1px;height:1px;overflow:hidden;display:inline-block;color:transparent}.h5p-drag-text .h5p-question-introduction{outline:none}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/Shepherd-1.0\/styles\/shepherd-theme-arrows.css?ver=1.0.3":".shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before {\r\n  box-sizing: border-box; }\r\n\r\n.shepherd-element {\r\n  position: absolute;\r\n  display: none; }\r\n  .shepherd-element.shepherd-open {\r\n    display: block; }\r\n\r\n.shepherd-element.shepherd-theme-arrows {\r\n  max-width: 100%;\r\n  max-height: 100%; }\r\n  .shepherd-element.shepherd-theme-arrows .shepherd-content {\r\n    border-radius: 5px;\r\n    position: relative;\r\n    font-family: inherit;\r\n    background: #fff;\r\n    color: #444;\r\n    padding: 1em;\r\n    font-size: 1.1em;\r\n    line-height: 1.5em;\r\n    -webkit-transform: translateZ(0);\r\n            transform: translateZ(0);\r\n    -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));\r\n            filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); }\r\n    .shepherd-element.shepherd-theme-arrows .shepherd-content:before {\r\n      content: \"\";\r\n      display: block;\r\n      position: absolute;\r\n      width: 0;\r\n      height: 0;\r\n      border-color: transparent;\r\n      border-width: 16px;\r\n      border-style: solid;\r\n      pointer-events: none; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content {\r\n    margin-bottom: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before {\r\n      top: 100%;\r\n      left: 50%;\r\n      margin-left: -16px;\r\n      border-top-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content {\r\n    margin-top: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before {\r\n      bottom: 100%;\r\n      left: 50%;\r\n      margin-left: -16px;\r\n      border-bottom-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content {\r\n    margin-right: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before {\r\n      left: 100%;\r\n      top: 50%;\r\n      margin-top: -16px;\r\n      border-left-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content {\r\n    margin-left: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before {\r\n      right: 100%;\r\n      top: 50%;\r\n      margin-top: -16px;\r\n      border-right-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content {\r\n    margin-top: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before {\r\n      bottom: 100%;\r\n      left: 16px;\r\n      border-bottom-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content {\r\n    margin-top: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before {\r\n      bottom: 100%;\r\n      right: 16px;\r\n      border-bottom-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content {\r\n    margin-bottom: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before {\r\n      top: 100%;\r\n      left: 16px;\r\n      border-top-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content {\r\n    margin-bottom: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before {\r\n      top: 100%;\r\n      right: 16px;\r\n      border-top-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content {\r\n    margin-right: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before {\r\n      top: 16px;\r\n      left: 100%;\r\n      border-left-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content {\r\n    margin-left: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before {\r\n      top: 16px;\r\n      right: 100%;\r\n      border-right-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content {\r\n    margin-right: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before {\r\n      bottom: 16px;\r\n      left: 100%;\r\n      border-left-color: #fff; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content {\r\n    margin-left: 16px; }\r\n    .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before {\r\n      bottom: 16px;\r\n      right: 100%;\r\n      border-right-color: #fff; }\r\n\r\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before {\r\n  border-bottom-color: #eee; }\r\n\r\n.shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header {\r\n  background: #eee;\r\n  padding: 1em; }\r\n  .shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header a.shepherd-cancel-link {\r\n    padding: 0;\r\n    margin-bottom: 0; }\r\n\r\n.shepherd-element.shepherd-theme-arrows.shepherd-has-cancel-link .shepherd-content header h3 {\r\n  float: left; }\r\n\r\n.shepherd-element.shepherd-theme-arrows .shepherd-content {\r\n  padding: 0; }\r\n  .shepherd-element.shepherd-theme-arrows .shepherd-content * {\r\n    font-size: inherit; }\r\n  .shepherd-element.shepherd-theme-arrows .shepherd-content header {\r\n    *zoom: 1;\r\n    border-radius: 5px 5px 0 0; }\r\n    .shepherd-element.shepherd-theme-arrows .shepherd-content header:after {\r\n      content: \"\";\r\n      display: table;\r\n      clear: both; }\r\n    .shepherd-element.shepherd-theme-arrows .shepherd-content header h3 {\r\n      margin: 0;\r\n      line-height: 1;\r\n      font-weight: normal; }\r\n    .shepherd-element.shepherd-theme-arrows .shepherd-content header a.shepherd-cancel-link {\r\n      float: right;\r\n      text-decoration: none;\r\n      font-size: 1.25em;\r\n      line-height: .8em;\r\n      font-weight: normal;\r\n      color: rgba(0, 0, 0, 0.5);\r\n      opacity: 0.8;\r\n      position: relative;\r\n      top: .1em;\r\n      padding: .8em;\r\n      margin-bottom: -.8em; }\r\n      .shepherd-element.shepherd-theme-arrows .shepherd-content header a.shepherd-cancel-link:hover {\r\n        opacity: 1; }\r\n  .shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text {\r\n    padding: 1em; }\r\n    .shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text p {\r\n      margin: 0 0 0.5em 0;\r\n      line-height: 1.3em; }\r\n      .shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text p:last-child {\r\n        margin-bottom: 0; }\r\n  .shepherd-element.shepherd-theme-arrows .shepherd-content footer {\r\n    padding: 0 1em 1em; }\r\n    .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons {\r\n      text-align: right;\r\n      list-style: none;\r\n      padding: 0;\r\n      margin: 0; }\r\n      .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li {\r\n        display: inline;\r\n        padding: 0;\r\n        margin: 0; }\r\n        .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li .shepherd-button {\r\n          display: inline-block;\r\n          vertical-align: middle;\r\n          *vertical-align: auto;\r\n          *zoom: 1;\r\n          *display: inline;\r\n          border-radius: 3px;\r\n          cursor: pointer;\r\n          border: 0;\r\n          margin: 0 0.5em 0 0;\r\n          font-family: inherit;\r\n          text-transform: uppercase;\r\n          letter-spacing: .1em;\r\n          font-size: .8em;\r\n          line-height: 1em;\r\n          padding: 0.75em 2em;\r\n          background: #186ac2;\r\n          color: #fff; }\r\n          .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary {\r\n            background: #f3f3f3;\r\n            color: #666; }\r\n        .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button {\r\n          margin-right: 0; }\r\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.GuidedTour-1.0\/styles\/h5p-guided-tour.css?ver=1.0.5":"\/* Overriding max-width *\/\n.h5p.shepherd-element.shepherd-theme-arrows {\n  max-width: 400px;\n  font-size: 15px;\n  z-index: 1;\n}\n\n\/* Override main button background color *\/\n.shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li .shepherd-button-primary {\n  background: #1a73d9;\n}\n\n.shepherd-element .shepherd-content footer .shepherd-buttons li .shepherd-button-primary:hover {\n  background: #155ba7 !important;\n}\n.shepherd-element .shepherd-content footer .shepherd-buttons li .shepherd-button-secondary:hover {\n  background: #eee !important;\n}\n\n\/* Override header *\/\n.h5p.shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header {\n  background: #eee;\n  color: #333;\n}\n\n\/* No arrow please *\/\n.shepherd-element.shepherd-theme-arrows.h5p-guided-tour-step-no-arrow .shepherd-content:before,\n.shepherd-element.shepherd-theme-arrows.h5p-guided-tour-step-no-arrow .shepherd-content:after {\n  display: none;\n}\n\n\/* More contrast, please *\/\n.h5p.shepherd-element.shepherd-theme-arrows .shepherd-content {\n  border: 1px solid #ccc;\n  -webkit-filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4));\n  filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4));\n}\n\n\/* A little less paddings *\/\n.h5p.shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text {\n  padding: .5em 1em;\n}\n\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before {\n  border-right-color: #ccc;\n}\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before {\n  border-bottom-color: #ccc;\n}\n.shepherd-element.shepherd-theme-arrows .shepherd-content:after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-width: 16px;\n  border-style: solid;\n  pointer-events: none;\n}\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:after {\n  right: 100%;\n  top: 50%;\n  margin-top: -16px;\n  border-right-color: #fff;\n  transform: translateX(1px);\n}\n.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:after {\n  bottom: 100%;\n  left: 50%;\n  margin-left: -16px;\n  border-bottom-color: #eee;\n  transform: translateY(1px);\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.GoToQuestion-1.3\/styles\/go-to-question.css?ver=1.3.3":".h5p-content div.h5p-gotoquestion,\n.h5peditor div.h5p-gotoquestion {\n  height: 100%;\n}\n.h5p-gotoquestion-wrapper {\n  height: 100%;\n  background: #f5f5f5;\n}\n.h5p-gotoquestion-wrapper.h5p-gotoquestion-continuestate {\n  background: #fff;\n}\n.h5p-gotoquestion-text {\n  background: #018d82;\n  color: #fff;\n  text-align: center;\n  padding: 0.5em;\n}\n.h5p-gotoquestion-choices,\n.h5p-gotoquestion-choice {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n.h5p-gotoquestion-choices {\n  overflow: hidden;\n  background: #f5f5f5;\n}\n.h5p-gotoquestion-choice {\n  margin: 0.25em;\n  text-align: center;\n}\n.h5p-gotoquestion-button {\n  background: #fff;\n  border-radius: 0.5em;\n  border: 0.125em transparent solid;\n  border-bottom-color: #d9d9d9;\n  padding: 0.5em;\n  cursor: pointer;\n  outline: none;\n  overflow: hidden;\n  position: relative;\n  transition: top 0.25s ease-in-out;\n}\n.h5p-gotoquestion-button:after {\n  position: absolute;\n  content: \" \";\n  width: 100%;\n  height: 100%;\n  box-sizing: border-box;\n  border: 0.125em transparent solid;\n  left: 0;\n  bottom: 0;\n}\n.h5p-gotoquestion-button[aria-disabled=false]:hover,\n.h5p-gotoquestion-button[aria-disabled=false]:focus {\n  color: #018d82;\n}\n.h5p-gotoquestion-button[aria-disabled=false]:hover:after,\n.h5p-gotoquestion-button[aria-disabled=false]:focus:after {\n  border-bottom-color: #018d82;\n}\n.h5p-gotoquestion-button[aria-disabled=false]:active,\n.h5p-gotoquestion-chosen,\n.h5p-gotoquestion-chosen:hover,\n.h5p-gotoquestion-chosen:focus {\n  background: #018d82;\n  color: #fff;\n  border-bottom-color: transparent;\n}\n.h5p-gotoquestion-button[aria-disabled=true] {\n  cursor: default;\n}\n.h5p-gotoquestion-chosen {\n  position: absolute;\n  width: 100%;\n  left: 0;\n  box-sizing: border-box;\n  border-radius: 0;\n  border: 0;\n}\n.h5p-gotoquestion-chosentext {\n  background: #018d82;\n  color: #fff;\n  text-align: center;\n  padding: 0 0 0.5em;\n}\n.h5p-gotoquestion-continuemsg {\n  color: #007adf;\n  text-align: center;\n  padding: 0.5em;\n}\n.h5p-gotoquestion .h5p-gotoquestion-continue {\n  margin: 0 auto 0.5em;\n  display: block;\n}\n.h5p-gotoquestion-continue:before {\n  content: \"\\f04b\";\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.IVHotspot-1.2\/styles\/iv-hotspot.css?ver=1.2.4":".h5p-ivhotspot {\n  overflow: hidden;\n  cursor: pointer;\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n}\n.h5p-ivhotspot > a {\n  position: absolute;\n  left: 0;\n  top: 0;\n  z-index: 1;\n  display: table;\n  width: 100%;\n  height: 100%;\n}\n.h5p-ivhotspot > a {\n  text-decoration: none;\n}\n.h5p-ivhotspot > a > p {\n  display: table-cell;\n  text-align: center;\n  vertical-align: middle;\n}\n.h5p-ivhotspot > a:focus {\n  outline: 2px solid #179fff;\n  outline-offset: 8px;\n}\n\n.h5p-ivhotspot.circular,\n.h5p-ivhotspot.circular > a,\n.h5p-ivhotspot.circular .blinking-hotspot {\n  border-radius: 50%;\n}\n.h5p-ivhotspot.rounded-rectangle,\n.h5p-ivhotspot.rounded-rectangle > a,\n.h5p-ivhotspot.rounded-rectangle .blinking-hotspot {\n  border-radius: 1em;\n}\n.h5p-ivhotspot-invisible {\n  color: transparent;\n}\n.blinking-hotspot {\n  position: absolute;\n  left: -1px;\n  top: -1px;\n  width: 100%;\n  height: 100%;\n  border: solid 1px #ffffff;\n  -webkit-animation: pulsing 1.5s ease-out;\n          animation: pulsing 1.5s ease-out;\n  -webkit-animation-iteration-count: infinite;\n          animation-iteration-count: infinite;\n  opacity: 0.1;\n  -webkit-box-shadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.4);\n     -moz-box-shadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.4);\n          box-shadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.4);\n}\n@-webkit-keyframes pulsing {\n  0% {\n    -webkit-transform: scale(1, 1);\n    opacity: 0.1;\n  }\n  10%{\n    opacity: 0.7;\n  }\n  100% {\n    -webkit-transform: scale(1.03, 1.03);\n    opacity: 0.1;\n  }\n}\n@keyframes pulsing {\n  0% {\n    transform: scale(1, 1);\n    opacity: 0.1;\n  }\n  10%{\n    opacity: 0.7;\n  }\n  100% {\n    transform: scale(1.03, 1.03);\n    opacity: 0.1;\n  }\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.OpenEndedQuestion-1.0\/dist\/styles.css?ver=1.0.7":".h5p-open-ended-question-question{position:relative;background:#2880d0;font-size:1.2em;padding:.75em;color:#fff}.h5p-open-ended-question-content{position:relative;margin:0;padding:1em;background-color:#fff}.h5p-open-ended-question-question:before{width:.75em;height:.75em;content:\" \";position:absolute;bottom:-.4em;left:1em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.h5p-open-ended-question-input{padding:.5em;width:calc(100% - 1em);max-width:500px;box-sizing:border-box;font-family:inherit;font-size:inherit}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.SimpleMultiChoice-1.1\/dist\/styles.css?ver=1.1.4":".h5p-simple-multiple-choice-question{background:#2880d0;font-size:1.2em;padding:.75em;color:#fff}.h5p-simple-multiple-choice-question:before{width:.75em;height:.75em;content:\" \";position:absolute;bottom:-.4em;left:1em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.h5p-simple-multiple-choice-alternatives,.h5p-simple-multiple-choice-alternatives-error{list-style-type:none;margin:0;padding:1em;position:relative;background-color:#fff}.h5p-simple-multiple-choice-alternatives-error{color:darkred}.h5p-simple-multiple-choice-alternatives label{cursor:pointer;position:relative;display:block}.h5p-simple-multiple-choice-alternative-li{margin:.25em 0}.h5p-simple-multiple-choice-alternative-input{vertical-align:middle;margin:0 3px 2px 5px}.h5p-simple-multiple-choice-alternative-feedback{position:relative;font-size:1em;padding:.7em 2.2em;margin-top:.5em;margin-left:-.4em;margin-right:-.4em}.h5p-simple-multiple-choice-alternative-feedback:before{content:\"\";position:absolute;left:.9em;top:-.25em;width:.5em;height:.5em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.h5p-simple-multiple-choice-alternative-feedback.chosen{border:1px solid #85b9e6;background:#e3f2ff}.h5p-simple-multiple-choice-alternative-feedback.chosen:before{background:#e3f2ff;border-top:1px solid #85b9e6;border-left:1px solid #85b9e6}.h5p-simple-multiple-choice-alternative-feedback.not-chosen{border:1px solid #f2b8d4;background:#faebf2}.h5p-simple-multiple-choice-alternative-feedback.not-chosen:before{background:#faebf2;border-top:1px solid #f2b8d4;border-left:1px solid #f2b8d4}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Questionnaire-1.2\/dist\/styles.css?ver=1.2.4":".h5p-questionnaire-element .h5p-subcontent-question{position:relative;padding:1.5em 5em 1.5em 1em;word-wrap:break-word}.h5p-questionnaire-element.h5p-questionnaire-required .h5p-subcontent-question{padding:.5em 5em 1em 1em}.h5p-questionnaire-required-symbol{background:#2880d0;padding-bottom:.5em;color:hsla(0,0%,100%,.6);font-size:.75em}.h5p-questionnaire-element .h5p-subcontent-body{font-size:.9em}.h5p-questionnaire{font-family:Open Sans,Calibri,Candara,Arial,sans-serif;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.h5p-questionnaire-element.hide{display:none}.h5p-questionnaire-content{height:100%;width:100%;-webkit-flex:1;overflow:auto}.h5p-questionnaire-element{height:100%;width:100%}.h5p-invalid-questionnaire{color:red}.h5p-questionnaire .hide{display:none}.h5p-questionnaire-success{color:#fff;background:#2880d0;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;text-align:center;padding:5em 2em 4em;box-sizing:border-box}.h5p-questionnaire-success:focus{outline:none}.h5p-questionnaire-success-icon.image>img{width:auto!important;height:auto!important;max-width:500px;max-height:10em;margin:auto}.h5p-questionnaire-success-icon.standard-icon:before{font-family:H5PFontAwesome4;font-size:3em;content:\"\\F00C\"}.h5p-questionnaire-success-message{margin:1.5em 0 1em;font-size:1.485em;word-wrap:break-word}.h5p-questionnaire-success-center{margin:auto}.h5p-questionnaire-submit-screen{padding:5em 2em;text-align:center;color:#fff;background:#2880d0;height:100%;box-sizing:border-box}.h5p-questionnaire-submit-screen-title{font-size:1.485em}.h5p-questionnaire-submit-screen-subtitle{margin:.5em 0 2em;font-size:1em}.h5p-questionnaire-button.submit{background-color:#ff6b00;border-color:#ff6b00}.h5p-questionnaire-button.submit:after{font-family:H5PFontAwesome4;content:\"\\F058\";margin-left:.5em}.h5p-questionnaire-button.submit:hover{background-color:#ff7a1a}.h5p-questionnaire-button.submit:active{background-color:#e66507}.h5p-questionnaire-submit-screen .h5p-questionnaire-button:focus{outline-color:#0d263c}.h5p-questionnaire-submit-screen .h5p-questionnaire-button.previous{background:transparent;color:#fff;border-color:#fff;margin-right:.5em}.h5p-questionnaire-submit-screen .h5p-questionnaire-button.previous:hover{background-color:#3b8ace}.h5p-questionnaire-submit-screen .h5p-questionnaire-button.previous:active{background-color:#1879ce}.h5p-questionnaire-button,.h5peditor .h5p-questionnaire-button{padding:.6em 1em;color:#fff;background:#1f1f1f;border:1px solid #404040;cursor:pointer;text-transform:uppercase;font-weight:600;letter-spacing:2px;border-radius:.3em;font-size:.8em}.h5p-questionnaire-button:active{background-color:#1c1c1c}.h5p-questionnaire-button:hover{background-color:#363636}.h5p-questionnaire-button:focus{outline:1px solid #3b99fc}.h5p-questionnaire-button.disable{display:none}.h5p-questionnaire-button.previous:before{content:\"\\F137\"}.h5p-questionnaire-button.next:after{content:\"\\F138\"}.h5p-questionnaire-button.next:after,.h5p-questionnaire-button.previous:before{font-family:H5PFontAwesome4;margin-left:.5em}.h5p-questionnaire-button.previous:before{margin-left:0;margin-right:.5em}.h5p-questionnaire-choice-required{position:relative;background-color:#eb0000;color:#fff;padding:0 2em 0 1em}.h5p-questionnaire-choice-required.hide{display:none}.h5p-questionnaire-choice-required-message{font-size:.9em;display:inline-block}.h5p-questionnaire-choice-required-exit{display:inline-block;position:absolute;right:1em;top:.35em;border:none;background:none;cursor:pointer}.h5p-questionnaire-choice-required-exit:before{font-family:H5PFontAwesome4;content:\"\\F00D\";color:#fff;font-weight:800}.h5p-questionnaire-footer{background:#1f1f1f;padding:.7em 1.2em;display:inline-block;width:100%;box-sizing:border-box;border:1px solid #404040}.h5p-questionnaire-footer .h5p-questionnaire-button.next{float:right}.h5p-questionnaire-footer .h5p-questionnaire-button.previous{float:left}.h5p-questionnaire-progress-bar{background:#153552;height:.3em}.h5p-questionnaire-progress-bar-current{background:#ff6b00;height:100%;transition:width .25s ease-in-out}.h5p-questionnaire-progress-bar-widget{position:absolute;right:1em;top:calc(50% - .1em);-webkit-transform:translateY(-50%);transform:translateY(-50%);width:3.5em;height:3em;line-height:3em;background-color:#fff;text-align:center;border-radius:.2em}.h5p-questionnaire-progress-bar-widget:before{position:absolute;width:60%;height:0;content:\" \";bottom:-.55em;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border:1px solid rgba(0,0,0,.1)}.h5p-questionnaire-progress-bar-widget-current,.h5p-questionnaire-progress-bar-widget-max,.h5p-questionnaire-progress-bar-widget-separator{display:inline-block;color:#8c8c8c;font-weight:600}.h5p-questionnaire-progress-bar-widget-separator{font-size:.85em;margin:0 .15em .2em .1em;vertical-align:middle}.h5p-questionnaire-progress-bar-widget-current{color:#ff6b00}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/styles\/image-radio-button-group.css?ver=1.17.4":".h5p-image-radio-button {\n  display: inline-block;\n  position: relative;\n  box-sizing: border-box;\n  margin-right: .5em;\n  padding: .5em;\n  background-color: #fff;\n  border: 1px solid #eee;\n  height: 4.9em;\n}\n.h5p-image-radio-button:hover {\n  border-color: #aaa;\n}\n.h5p-image-radio-button label {\n  display: inline-block;\n  cursor: pointer;\n}\n.h5p-image-radio-button label span {\n  position: relative;\n  top: -1.8em;\n  font-size: 14px;\n  line-height: 1;\n}\n.h5p-image-radio-button input {\n  position: relative;\n  top: -1.7em;\n  cursor: pointer;\n}\n.h5p-image-radio-button .image-container {\n  display: inline-block;\n  cursor: pointer;\n  margin: 0 .5em;\n}\n.h5p-image-radio-button .h5p-option-description {\n  display: block;\n  font-size: 10px;\n  color: #888;\n  max-width: 160px;\n  line-height: 1.1;\n  margin-top: 1em;\n  border-top: 1px solid #eee;\n  padding-top: .8em;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/styles\/interactive-video-editor.css?ver=1.17.4":"\/* H5P specific icons generated by IcoMoon. *\/\n@font-face {\n  font-family: 'H5PInteractiveVideoEditor';\n  src: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/fonts\/h5p.eot?1);\n  src: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/fonts\/h5p.eot#iefix1) format('embedded-opentype'),\n  url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/fonts\/h5p.woff?1) format('woff'),\n  url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/fonts\/h5p.ttf?1) format('truetype'),\n  url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/fonts\/h5p.svg?1#icomoon) format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n.h5p-interactivevideo-editor .h5p-interactive-video {\n  overflow: visible;\n}\n\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-overlay.h5p-visible {\n  overflow: visible;\n}\n\n.h5p-interactive-video-dragnbar {\n  font-size: 1em;\n  padding: 0;\n  background: #f5f5f5;\n  float: left;\n  width: 100%;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-ul {\n  margin: 0 0 0 0.25em;\n  list-style: none;\n  padding: 0;\n  float: left;\n  height: 100%;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-li {\n  position: relative;\n  float: left;\n  margin: 0;\n  padding: 0;\n  margin-right: 0.25em;\n  background: none;\n  border-left: none;\n  border-right: none;\n}\n\n.h5p-interactive-video-dragnbar .h5p-dragnbar-li:hover {\n  background: none;\n}\n\n.h5p-interactive-video-dragnbar .h5p-dragnbar-li:before {\n  top: 100%;\n  font-size: 0.585em;\n}\n\n.h5p-interactive-video-dragnbar .h5p-dragnbar-a {\n  width: 1em;\n  height: 1.1em;\n  line-height: inherit;\n  text-align: center;\n  border: 1px solid #ccc;\n  border-radius: 0.25em;\n  margin: 0.25em 0 0.25em 0;\n  display: block;\n  padding: 0.2em 0.5em;\n  color: #333;\n  background: #f2f2f2;\n  background: -webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -moz-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -ms-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -o-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  font-family: 'H5PFontAwesome4';\n}\n.h5p-dialog-title:before {\n  content: \" \";\n  font-family: 'H5PFontAwesome4';\n  color: #313131;\n  margin-right: 0.5em;\n  vertical-align: bottom;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-a,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-a:visited,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-a:link {\n  color: #333;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-a:hover {\n  text-decoration: none;\n  border-color: #999;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-a:before {\n  font-size: 1em;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-nil-button:before,\n.h5p-nil-interaction-icon:before {\n  content: \"\\f146\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-text-button:before,\n.h5p-text-interaction-icon:before {\n  content: \"T\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-table-button:before,\n.h5p-table-interaction-icon:before {\n  content: \"\\f0ce\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-link-button:before,\n.h5p-link-interaction-icon:before {\n  content: \"\\f0c1\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-image-button:before,\n.h5p-image-interaction-icon:before {\n  content: \"\\f03e\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-gotoquestion-button:before,\n.h5p-gotoquestion-interaction-icon:before {\n  content: \"\\f277\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-truefalse-button:before,\n.h5p-truefalse-interaction-icon:before {\n  font-family: 'H5PFontIcons';\n  content: \"\\e902\";\n  line-height: 1em;\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-ivhotspot-button:before,\n.h5p-ivhotspot-interaction-icon:before {\n  content: \"\\e900\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-questionnaire-button:before,\n.h5p-questionnaire-interaction-icon:before {\n  content: \"\\e901\";\n}\n\n\/* H5P specific fonts: *\/\n.h5p-interactive-video-dragnbar .h5p-dragnbar-dragquestion-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-multichoice-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-blanks-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-summary-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-markthewords-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-dragtext-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-singlechoiceset-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-questionnaire-button:before,\n.h5p-interactive-video-dragnbar .h5p-dragnbar-ivhotspot-button:before {\n  font-family: 'H5PInteractiveVideoEditor';\n  font-size: 1.2em;\n  vertical-align: top;\n}\n.h5p-singlechoiceset-interaction-icon:before,\n.h5p-dragtext-interaction-icon:before,\n.h5p-markthewords-interaction-icon:before,\n.h5p-dragquestion-interaction-icon:before,\n.h5p-blanks-interaction-icon:before,\n.h5p-multichoice-interaction-icon:before,\n.h5p-summary-interaction-icon:before,\n.h5p-ivhotspot-interaction-icon:before,\n.h5p-questionnaire-interaction-icon:before {\n  font-family: 'H5PInteractiveVideoEditor';\n}\n\n.h5p-interactive-video-dragnbar .h5p-dragnbar-summary-button:before,\n.h5p-summary-interaction-icon:before {\n  content: \"\\e992\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-multichoice-button:before,\n.h5p-multichoice-interaction-icon:before {\n  content: \"\\e603\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-blanks-button:before,\n.h5p-blanks-interaction-icon:before {\n  content: \"\\e994\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-dragquestion-button:before,\n.h5p-dragquestion-interaction-icon:before {\n  content: \"\\e991\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-markthewords-button:before,\n.h5p-markthewords-interaction-icon:before {\n  content: \"\\e601\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-dragtext-button:before,\n.h5p-dragtext-interaction-icon:before {\n  content: \"\\e600\";\n}\n.h5p-interactive-video-dragnbar .h5p-dragnbar-singlechoiceset-button:before,\n.h5p-singlechoiceset-interaction-icon:before {\n  content: \"\\e993\";\n}\n\n.h5p-interactivevideo-editor .h5p-dialog-buttons {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.5em;\n  box-sizing: border-box;\n}\n\n.h5p-interactivevideo-editor .h5p-dialog-title {\n  color: #313131;\n  float: left;\n  margin-top: 0.25em;\n}\n\n.h5p-interactivevideo-editor .h5p-button {\n  display: block;\n  margin: 0 0 0 0.625em;\n  box-shadow: none;\n  padding: 0.25em 2em;\n  float: right;\n  background: #f2f2f2;\n  background: -webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -moz-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -ms-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -o-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  border: 1px solid #ccc;\n  border-radius: 0.25em;\n  font-size: 0.625em;\n  color: #333;\n  cursor: pointer;\n}\n\n.h5p-interactivevideo-editor .h5p-button:hover {\n  text-decoration: none;\n  text-decoration: none;\n  border-color: #999;\n}\n\n.h5p-interactivevideo-editor .h5p-button.h5p-done {\n  color: #fff;\n  background: #3673B5;\n  background: -webkit-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -moz-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -ms-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -o-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  border-color: #20588F;\n}\n.h5p-interactivevideo-editor .h5p-button.h5p-done:hover {\n  background: #3275bc;\n  background: -webkit-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -moz-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -ms-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -o-linear-gradient(top,#3275bc 0,#285585 100%);\n}\n\n.h5p-interactivevideo-editor .h5p-button.h5p-remove {\n  background: none;\n  border: none;\n  color: #a00;\n}\n\n.h5p-interactivevideo-editor .h5p-button.h5p-remove:hover {\n  background: none;\n  border: none;\n  color: #e40000;\n}\n.h5p-interactivevideo-editor .h5p-interactive-video a:focus {\n  box-shadow: none;\n}\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-interaction-label:hover {\n  cursor: pointer;\n}\n.h5p-interactivevideo-editor .field-name-interactiveVideo {\n  margin-bottom: 0;\n}\n\/* Wizard does hide the label by default - must override here *\/\n.h5p-interactivevideo-editor .field-name-interactiveVideo > .h5peditor-label-wrapper {\n  display: block;\n}\n.h5p-interactivevideo-editor .field-name-interactiveVideo > .h5peditor-label-wrapper > .h5peditor-label  {\n  display: block;\n  position: relative;\n  background: #e9e9e9;\n  font-size: 1.5em;\n  font-weight: normal;\n  line-height: 1.5em;\n  padding: 0.5em 0.75em;\n  color: #444;\n  margin: 0 0 1px 0;\n}\n.h5p-interactivevideo-editor .field-name-interactiveVideo > .h5peditor-label-wrapper > .h5peditor-label:before {\n  font-family: 'H5PFontAwesome4';\n  margin: 0 0.5em 0 0;\n  content: \"\\f01d\";\n}\n.h5p-interactivevideo-editor .field-name-interactiveVideo > .h5peditor-label-wrapper > .h5peditor-label:after {\n  content: \"\";\n}\n.h5p-interactivevideo-editor .h5peditor-form {\n  border-radius: 0;\n  padding: 0;\n  background: #fff;\n}\n.h5p-interactivevideo-editor .group.field-name-override {\n  margin: 0 20px;\n}\n.h5p-interactivevideo-editor .tree > .field.group:last-child .content {\n  background-color: #FAFBFC;\n}\n.h5p-interactivevideo-editor .tree > .field.group:last-child .content .content{\n  background-color: #FFF;\n}\n.h5p-interactivevideo-editor .tree > .field.group:last-child .content .content .content{\n  background-color: #FAFBFC;\n}\n.h5p-interactivevideo-editor .common {\n  margin: 20px;\n  background-color: #FAFBFC;\n}\n.h5p-interactivevideo-editor .common .fields {\n  background-color: #FAFBFC;\n}\n.h5p-interactivevideo-editor .common .fields .content {\n  background-color: #FFF;\n}\n.h5p-interactivevideo-editor .common .fields .content .content {\n  background-color: #FAFBFC\n}\n.h5p-interactivevideo-editor .h5peditor-panes > .field {\n  border: 0;\n}\n.h5p-interactivevideo-editor .field.interactiveVideo {\n  margin: 0;\n  padding: 0;\n}\n.h5p-interactivevideo-editor textarea, .h5p-interactivevideo-editor input[type=\"text\"]:not(.h5p-dragnbar-x):not(.h5p-dragnbar-y), .h5p-interactivevideo-editor .ckeditor {\n  border: 1px solid #dbdbdb;\n  border-radius: 0;\n  background: #fff;\n}\n.h5p-interactivevideo-editor textarea:focus, .h5p-interactivevideo-editor input[type=\"text\"]:not(.h5p-dragnbar-x):not(.h5p-dragnbar-y):focus {\n  background: #fff;\n  border-color: #dbdbdb;\n  box-shadow: 0 0 0.25em #dbdbdb inset;\n}\n.h5p-interactivevideo-editor table.h5p-table, .h5p-interactivevideo-editor .h5p-table td, .h5p-interactivevideo-editor .h5p-table th {\n  border: 1px dashed #999;\n}\n\n.h5p-interactivevideo-editor .library .wizard {\n  border: 1px solid #dedede;\n  margin: 1em 1em 1em 0;\n}\n.h5p-interactivevideo-editor .library div.field.wizard .h5peditor-tabs {\n  border-top: 0;\n  line-height: 100%;\n}\n.h5p-interactivevideo-editor .h5p-add-bookmark {\n  padding: 0 12px 8px;\n  color: #fefefe;\n  font-style: italic;\n  cursor: pointer;\n}\n.h5p-interactivevideo-editor .h5p-add-bookmark:hover {\n  color: #dbd7d1;\n}\n.h5p-interactivevideo-editor .h5p-add-bookmark:before {\n  font-family: H5PFontAwesome4;\n  content: \"\\f055\";\n  margin-right: 8px;\n  font-style: normal;\n}\n.h5p-interactivevideo-editor .h5p-bookmark .h5p-bookmark-label {\n  padding-right: 30px;\n}\n.h5p-interactivevideo-editor .h5p-remove-bookmark:before {\n  font-family: H5PFontAwesome4;\n  content: \"\\f057\";\n  color: #fefefe;\n  position: absolute;\n  top: 0;\n  right: 8px;\n}\n.h5p-interactivevideo-editor .h5p-remove-bookmark:hover:before {\n  color: #dbd7d1;\n}\n.h5p-interactivevideo-editor .h5p-bookmark.h5p-force-show .h5p-bookmark-label {\n  visibility: visible;\n  opacity: 1;\n}\n\n.h5p-interactivevideo-editor .h5p-bookmark input[type=\"text\"].h5p-bookmark-input:focus,\n.h5p-interactivevideo-editor .h5p-bookmark input[type=\"text\"].h5p-bookmark-input {\n  background: transparent;\n  border: 0;\n  color: #fefefe;\n  outline: none;\n  font-size: 1em;\n  box-shadow: none;\n  margin: 0;\n}\n.h5p-interactivevideo-editor .h5p-bookmark input[type=\"text\"].h5p-bookmark-input::-ms-clear {\n  display: none;\n}\n.h5p-interactivevideo-editor .h5p-bookmark-text:before {\n  font-family: H5PFontAwesome4;\n  content: \"\\f02e\";\n  margin-right: 8px;\n}\n.h5p-interactivevideo-editor .h5p-iv-message-popup {\n  position: absolute;\n  bottom: 36px;\n  left: 0;\n  right: 0;\n  width: 100%;\n  padding: .3em;\n  z-index: 11;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  border-top: 1px solid #ffcd0d;\n  background-color: #fcffcc;\n  text-align: center;\n  font-size: .6em;\n}\n.h5p-interactivevideo-editor .h5p-iv-message-popup:before {\n  font-family: \"H5PFontAwesome4\";\n  content: '\\f05a';\n  padding-right: .3em;\n  font-size: 1.1em;\n}\n\n\/* Label for interaction buttons *\/\n.h5p-interactivevideo-editor .h5peditor-interactions .h5p-interaction-button-title {\n  display: none;\n  background-color: #000;\n  color: #fff;\n  opacity: 0.75;\n  position: absolute;\n  padding: 0 0.5em;\n  font-size: 0.6em;\n  line-height: 2;\n  border-radius: 0.35em;\n  font-family: 'Open Sans', sans-serif;\n  white-space: nowrap;\n  z-index: 2;\n}\n\n.h5p-interactivevideo-editor .h5peditor-interactions .h5p-interaction-button-title.show {\n  display: block;\n}\n\n\/* Remove h5p-nil library border *\/\n.h5p-interactivevideo-editor .h5peditor-interactions .h5p-dialog-inner .field.library.h5p-nil-library {\n  display: none;\n}\n\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-interaction[role=\"button\"] {\n  outline: 0;\n}\n\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-interaction.h5p-poster {\n  overflow: visible;\n  overflow-y: visible;\n}\n\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-interaction.h5p-poster .h5p-interaction-inner {\n  overflow: hidden;\n}\n\n\/* Make sure box-shadow and drop-shadow is not cut off by poster boundaries *\/\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-interaction.h5p-poster.h5p-image-interaction.h5p-transparent-interaction .h5p-interaction-inner {\n  overflow: visible;\n}\n\n\/* interaction semantics wrapper *\/\n.h5p-interactivevideo-editor .h5p-dialog-inner .h5p-dialog-inner-semantics {\n  padding: 0.5em;\n  box-sizing: border-box;\n}\n\n.h5p-interactivevideo-editor .h5p-dialog-inner .h5peditor-interaction-duration {\n  float: left;\n}\n\n.h5p-interactivevideo-editor .h5p-dragnbar-element.h5p-moving .h5p-interaction-button {\n  cursor: move;\n}\n\n.h5p-interactivevideo-editor .h5p-dialog-inner .field {\n  clear: both;\n}\n\n.h5p-interactivevideo-editor .h5p-dialog-inner .h5peditor-interaction-pause {\n  margin-left: 1em;\n  margin-top: 2.5em;\n  float: left;\n  clear: none;\n}\n\n.h5p-interactivevideo-editor .field.hide {\n  display: none;\n}\n\n.h5p-interactivevideo-editor .h5peditor-iv-focus-handler {\n  display: none;\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n}\n\n.h5p-interactivevideo-editor .h5peditor-iv-focus-handler.show {\n  display: block;\n}\n\n.h5p-interactivevideo-editor .h5p-image-radio-button.button .image-container {\n  background: #fff url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA8CAYAAAAXDvbIAAAACXBIWXMAAAsTAAALEwEAmpwYAAA8BWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMDYtMjJUMDk6NTU6NDkrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA2LTIyVDA5OjU1OjQ5KzAyOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0wNi0yMlQwOTo1NTo0OSswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6MDdhNWExMmEtMTBiMy1hZDQ5LWIyZGYtMjQ3YzQwY2FlNmE4PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6MTQ3Y2M2MTAtMThiNC0xMWU1LTlhODktY2VmOGMyNjhkNmE3PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6ZDkzMDk3ZGYtMGIxNy1iZTQ0LWJjYzktODJmNzBjMTVkNzI5PC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmQ5MzA5N2RmLTBiMTctYmU0NC1iY2M5LTgyZjcwYzE1ZDcyOTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0wNi0yMlQwOTo1NTo0OSswMjowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2E1YTEyYS0xMGIzLWFkNDktYjJkZi0yNDdjNDBjYWU2YTg8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMDYtMjJUMDk6NTU6NDkrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICAgICA8cmRmOkJhZz4KICAgICAgICAgICAgICAgPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NDU1Mzc2NGQtZjMwZC0xMWU0LTg3NDYtYjE0ZDI0YWJlMWQ2PC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM0NDQ1MWRjLTAwNmItMTFlNS1hNTM5LWI0Zjc2MzM3YzAxOTwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPnhtcC5kaWQ6YjIwZDYwOTgtYjY1Ny1jZjQ4LTg2NDMtMmE2MDk4YWJhZDIwPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+eG1wLmRpZDpiYTkwODY0Ni1lOTg0LWRlNDQtYmJhZS0wNDczY2YzYmNmOTM8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT54bXAuZGlkOmY3NDkwNjc1LTVkMzgtZTA0OC1iZDlhLTkxYTljYzlhOWJkODwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgIDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+ODU8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI\/Pqbfbr8AAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAABxZJREFUeNrsnGtPE1sbhq\/pCVpboS2tHFMUCogBCsYAiQbjgXiGokb97m944\/8xfiMcIxGDYAxgE0VrQESRgyDUFNoKPQjSdt4P76YviBtFoLsb5k76ZWZlzawrs551P8+aqfD169cPoigagSiStiuZIAgehSiKJlEUUyUeOwdWBkQkDjuqiExisAuPqoRAgipBlaBKkqBKUCWokrYrRbwuJIoiTqeT4eFhJicnAcjNzaW4uBibzYYgCHsGquDz+eb\/yv13FeiTJ0\/o6ur66flz585x9uzZPQFWEARPXKa\/0+n8W6AAXV1dOJ1OKaZuRcPDwzvSRoK6RqsxdLttJKiSpdpd5ebm7kgbCeoaFRcX\/7JNZWXltq4RiUQIBAIsLi7Gft++fdu7PtVms+HxeDa1VPn5+QBEo1H8fj\/BYBCVSoVOpyMpKWnT\/gOBAA6Hg76+vnUgc3JyqKmp4dixY3G1a3Hxqb9r\/peWlujv78fpdBIIBFAqlRw+fJhTp06RlZW1oU+v18vIyAhDQ0OMj48DYDKZ0Gg0zM\/PEwwGUavV1NXVYbPZ4uZT4wb1V1peXqatrY2BgYEN5wwGA3a7HavVGjs2PT1Ne3s7U1NTsWPHjx\/n9OnT6PV6xsbGePz4MTMzM2i1Wm7fvh2bDfsG6suXL2lsbEQmk1FRUYHFYsHv9\/P8+XP8fj9Go5Fbt25hNpsZHBykp6cHr9eLSqXCarWSnZ1NdXU1ycnJsT7n5ua4f\/8+brebzMxM7t69i0aj2XWoChJEq+a\/uLiYuro6lEplLC62tLTg8Xhobm5Gq9UyMTFBOBxGoVBgt9spKipCrVZv6NNkMnHhwgUaGxuZnZ3F4XBw5syZ\/eNTFxYWEAQBq9UaAwpgtVqpr69Hr9fjcrkYHR0lEolQUFDApUuXKC8v\/ynQVRUVFVFaWgpAb28vPp9v\/0BNSkpCFEXm5+c3nLNarVy7dg2tVgvA5cuXuXPnDlVVVb8e4F\/hJDU1lVAohMPh2D9QCwoKABgYGODNmzeIorju\/NGjR7l48SLV1dWxp1Mm+73bz8nJiS1yIyMj+P3+\/QG1tLSUjIwMQqEQbW1tDA0NbWhTUVHB+fPn1y1Gv7l4UFZWRlJSEm63m1evXu0PqAaDgStXrnDw4EGCwSCtra28e\/duAxyNRoNcLt9y\/3l5eRQVFSGKIgMDA7jd7v1RUMnLy+PGjRvodDoCgQBNTU0bwG7D6lBTU4NarcbtdtPZ2UkwGNyVccjv3bv3H0CTKGCNRiNpaWmMjY0RCASYnJwkPT0do3H7Vlqn06HVapmZmWF6ehqfz0dmZuaOeldBEL4lZOlv1atqNBoWFhZoaWlhYmJiR\/ouKytDp9MBMDg4uC4j25PTf61KSkqw2+0olUo8Hg9NTU18+vRpW32Gw2Ha29v58uULAOXl5THXsS+gBgIBPn78SDgcjqWcra2tzM3N\/XFp8OHDh7x48YJwOMzJkyex2+0x7\/uvK\/1tVaFQiObm5ljqajQaSU9Px2q1xqbuVhSNRuno6MDhcCCKIhUVFdTW1qJSqXbl\/hMOajQa5enTp7x9+xa5XE5lZSXV1dWYTKY\/fkI7Ozvp7+9HFEUKCwt3FWhCQvV4PLx\/\/x6Aqqoqrl69+sd9RSIRuru76e3tRRRF8vPzqa+vJzU1dVfHkHBQl5eXWVpaAn69xbKaykajUWQy2brqviiKPHv2jO7ubkRR5MiRIzQ0NKDX63d9DAkHValUxjKmqakpzGbzuljrcrnw+XwEg0EWFxcBWFlZQaFQkJaWRklJCTqdjr6+Prq6uhBFkZycHBoaGjAYDHEZQ8JB1ev1ZGVl4fV66enpwWAwIIoiHz58YGZmBpfLtWkmNDo6Snp6Or29vUQiETIyMmhoaCAtLS1uY0iYyv9aTUxM8ODBAwKBACkpKbHNwFVptVrUajUajYYDBw7E9rcmJyeJRP7\/sc2hQ4e4efMm2dnZ8QOaSNspP8ZKp9PJo0ePYsVrk8mExWIhNzeXrKwskpOTkcvlKBSK2KI0PDxMR0cHS0tLmM1mrl+\/jsViieu9J9R2yo\/FD5vNhl6vZ2FhAaVSidlsJiUlZd2uwI86ceIEkUiE169fU1tbG3egCT39\/82K26uU+00SVAnq1hc8r9f7j0CV71WogiDEzfCvkVwhCMIc\/\/vWX\/refwceUkEQPIrPnz+L4XA4AogSk+1HHIVCISpWVlbSI5HIQSCWc6\/NSiRtOY4nrfsTBY1GQ0lJCZmZmRKdP1dEIQjCulgql8vJyMjAaDTicrl++hqOpE0Xx+jfWiqVSoXFYqGwsPCPtjAkn7qJ1Gq1BHWL2rSg4vV6mZ2dZXl5WSK1XaiBQIDp6WlCoZBEaLtQv3\/\/zvj4eFxejN3TUEVRjMXV5eVlaapv36fK9nTu\/w9J\/t8BAHhD+KxwLA5vAAAAAElFTkSuQmCC) no-repeat center center;\n  height: 60px;\n  width: 85px;\n}\n.h5p-interactivevideo-editor .h5p-image-radio-button.poster .image-container {\n  background: #fff url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA8CAYAAAAXDvbIAAAACXBIWXMAAAsTAAALEwEAmpwYAAA8BWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMDYtMjJUMDk6NTU6MzkrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA2LTIyVDA5OjU1OjM5KzAyOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0wNi0yMlQwOTo1NTozOSswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6MDVlMDc2ZDItMTc1Ny1lYzQwLWI3MTMtMWUyZjcwYTY3MmRkPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6ZmUxMDA4MzQtMThiMy0xMWU1LTlhODktY2VmOGMyNjhkNmE3PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6MzEyZGI5NGItMDNkMC03YjRjLTlhNTAtMmIzMGFkMjMxOWU0PC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjMxMmRiOTRiLTAzZDAtN2I0Yy05YTUwLTJiMzBhZDIzMTllNDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0wNi0yMlQwOTo1NTozOSswMjowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowNWUwNzZkMi0xNzU3LWVjNDAtYjcxMy0xZTJmNzBhNjcyZGQ8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMDYtMjJUMDk6NTU6MzkrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICAgICA8cmRmOkJhZz4KICAgICAgICAgICAgICAgPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NDU1Mzc2NGQtZjMwZC0xMWU0LTg3NDYtYjE0ZDI0YWJlMWQ2PC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM0NDQ1MWRjLTAwNmItMTFlNS1hNTM5LWI0Zjc2MzM3YzAxOTwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPnhtcC5kaWQ6YjIwZDYwOTgtYjY1Ny1jZjQ4LTg2NDMtMmE2MDk4YWJhZDIwPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+eG1wLmRpZDpiYTkwODY0Ni1lOTg0LWRlNDQtYmJhZS0wNDczY2YzYmNmOTM8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT54bXAuZGlkOmY3NDkwNjc1LTVkMzgtZTA0OC1iZDlhLTkxYTljYzlhOWJkODwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgIDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+ODU8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI\/Pjz7hGoAAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAABBNJREFUeNrsm89LMl0Ux78zzpiZwzNhOFiCuDEsjNy0aiESBNGifUSQgdOi1q1aRn9Ai0hq1x9Rq0gJapUpCC2EsHKRpPmr1LF5F+\/79D6+9uOpGV\/y6Xx3nus9HD\/ee8+5d+4w+Xy+pqoqB0AFSasYhmEUTlVVTlVVBgBDTHQRxxID\/UVQCSpBJagkgkpQCSqJoH7J6l9L59XV1T8WzMbGBo1Umv4ElURQCSpBJf0fJdVrcjqd8Pv9sNlsuL+\/x\/HxMRKJhC6+PR4P\/H4\/WFb7eIjH4zg6Ovr6UN1uN0KhECwWy7PN5\/Nhb28P0WhUs3+v14vR0VFdYuV5vi1QdZ\/+U1NTTUABgGVZTE9Po7e3V7P\/er2uW6x6+mrrSLXZbC\/aLRYLRFFELpfT5D8SiaBSqYDjOKjq559VsiyLZDLZGVDz+TysVmuL\/eHhAcViscVuNpvB8zzu7+9\/y382m8X+\/v73yv4HBwdQFKXFfnh4iGw222QzmUxYXFzEysrKqyOcsj+As7MzbG9vIxAIQJIkFAoFRKNRRCKRpu8JgoCFhQUMDQ0BAGRZRjgcRiaTeXd5GR4e1iXWy8tLpFKpziipYrEYEokEenp68Pj4iFqt1tQuiiKCwSDcbvezbWBgAEtLSwiHw0in06\/6Hh8fx+TkpC5xxuNxbG5udk7x32g0UCgUWoBarVaEQqEmoD8lSRJkWYbL5XqzDNLtx7NsZ0z\/nzIajZiYmMDp6enzWipJEoLBIJxO56v9+vr6IMsydnZ2cHFx0dJ+fn4OURTx9PSkKT6DwYBYLNY5UHmex9zcHMbGxjAyMoKtrS2YTCbIsgy73f5uf1EUMT8\/j\/X1dZTL5aa2ZDLZtlLoy0IVBAGzs7Pw+XwAAJfLheXlZfA8D0mSftuP2WyG0Whsgfots38wGITH42myORyOT63JLxX3XV1dcDgc4Hn+uV0QBBgMhufPDMOgUqmgWq2CZVnUajWk0+m27aDaDvWtJKOHAoEAZmZmPtxvd3cXJycnnVn8a00gvyaSl\/Tjx49P+fvveURHjdRisQhVVTXtyxmGQalUevEPur6+Rrlc\/lA5pCgKbm9vOxfq2tpaWwOORCItu7M\/fu9PIqgElaASVBJB\/eJicrnc0z\/vUZH0AMowKo1Umv4ElaCSCCpB\/W7iGIZR8PdpFb3vr0tFxSjc1dWVqigKAdVHKsdxKlev1\/lGo8EA\/562NxoNwvNZqqrKN62pZrMZXq8X\/f39REfjmtpkMBgMsNvtsFqtyGQyLZfKSO8uqq9nf6PRCKfTicHBQQiCQLT0LKm6u7sJ6ken\/1uNd3d3uLm5QbVaJVJaoZZKJaTTaVQqFSKkFWqtVkMqldJ8L\/\/bQ\/310kO1WqWprr1Opb1\/O\/TXACjzX+BRnHH2AAAAAElFTkSuQmCC) no-repeat center center;\n  height: 60px;\n  width: 85px;\n}\n.h5p-interactivevideo-editor .h5p-dialog-inner > div > .field.library {\n  border: 0;\n  padding: 0;\n  margin: 0;\n}\n.h5p-interactivevideo-editor .h5p-interaction.h5p-poster > div {\n  z-index: 1;\n}\n.h5p-interactivevideo-editor .h5p-ivhotspot > a {\n  box-sizing: border-box;\n  border: 2px solid rgba(255,255,255,0.7);\n}\n.h5p-interactivevideo-editor .h5p-ivhotspot > a:before {\n  content: \" \";\n  display: block;\n  position: absolute;\n  border: 2px dashed rgba(0, 0, 0, 0.7);\n  width: 100%;\n  height: 100%;\n  top: -2px;\n  left: -2px;\n}\n.h5p-interactivevideo-editor .h5p-ivhotspot.circular > a:before {\n  border-radius: 50%;\n}\n.h5p-interactivevideo-editor .field.wizard > .h5peditor-panes > .group > .content {\n  border: 0;\n}\n\/* Avoid double padding between start screen options and behavioural settings *\/\n.h5p-interactivevideo-editor .group.field-video > .content {\n  padding-bottom: 0;\n}\n.h5peditor-interactions:not(.h5p-interactive-video) {\n  margin: 1.6em;\n  padding: 1em;\n  color: white;\n  background-color: black;\n  text-align: center;\n}\n\n.h5peditor-interactions .h5p-no-video-icon {\n  width: 8em;\n  height: 8em;\n  margin: 0 auto;\n  background-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/images\/no-video-source.svg);\n  background-repeat: no-repeat;\n}\n\n.h5peditor-interactions .h5p-no-video-title {\n  font-size: 1.7em;\n}\n\n.h5peditor-interactions .h5p-no-video-button {\n  margin: 1em 0 1.5em 0;\n  padding: 0.8em 1.8em;\n  font-weight: 100;\n  font-size: 1em;\n  line-height: 1em;\n}\n\n.h5peditor-interactions .h5p-no-video-button:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f060\";\n}\n\n.h5peditor-interactions.h5p-interactive-video {\n  font-weight: inherit;\n  padding: 0;\n  margin-bottom: 10px;\n  color: inherit;\n}\n\n\/* Make sure there are not a double padding before the summary tabs fields *\/\n.h5p-interactivevideo-editor .field-name-summary > .content {\n  padding-top: 0;\n}\n\n\/* Tour button placed in Wizard's header *\/\n.h5p-interactivevideo-editor .h5peditor-guided-tour {\n  position: absolute;\n  right: .5em;\n  color: #666;\n  background: transparent;\n  border-radius: 4px;\n  font-size: 0.7em;\n  cursor: pointer;\n  padding: 0 1em;\n}\n.h5p-interactivevideo-editor .h5peditor-guided-tour:before {\n  font-family: 'H5PFontAwesome4';\n  content: '\\f14e';\n  margin-right: .5em;\n}\n.h5p-interactivevideo-editor .h5peditor-guided-tour:hover,\n.h5p-interactivevideo-editor .h5peditor-guided-tour:focus {\n  color: #333;\n  background: #ddd;\n}\n.h5p-interactivevideo-editor .h5peditor-guided-tour:active {\n  color: #555;\n  background: #ccc;\n}\n.h5p-poster.h5p-ivhotspot-interaction {\n  overflow: visible;\n}\n.h5p-interactivevideo-editor .field.wizard .h5peditor-tab-video:before {\n  content: '\\e911';\n}\n.h5p-interactivevideo-editor .field.wizard .h5peditor-tab-assets:before {\n  content: '\\e917';\n}\n.h5p-interactivevideo-editor .field.wizard .h5peditor-tab-summary:before {\n  content: '\\e912';\n}\n.h5p-interactivevideo-editor .field.wizard .field.interactiveVideo {\n  margin-top: 5px;\n}\n\n.h5p-interactivevideo-editor .h5p-interactive-video .h5p-video-wrapper.h5p-youtube {\n  overflow: hidden !important;\n}\n\n\/* Remove option for full enable full screen in Drag Question *\/\n.h5p-interactivevideo-editor .h5p-dragquestion-editor .field-name-enableFullScreen {\n  display: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.InteractiveVideo-1.17\/styles\/require-completion.css?ver=1.17.4":".h5p-interactive-video .h5peditor-interaction-pause.h5p-has-disabled-msg {\n  margin-top: 1em;\n}\n\n.h5p-interactive-video .h5peditor-interaction-pause.h5p-has-disabled-msg .h5p-errors {\n  margin: 0;\n}\n\n.h5p-interactive-video .h5peditor-pause-disabled-msg {\n  margin-left: 1.4em;\n}\n\n.h5p-interactive-video .h5peditor-pause-disabled-msg.h5p-hide {\n  display: none;\n}\n\n.h5p-interactive-video .h5peditor-enable-retry-disabled-msg.h5p-hide {\n  display: none;\n}\n\n.h5p-interactive-video .h5peditor-conflicting-time-msg {\n  color: red;\n  clear: both;\n}\n\n.h5p-interactive-video .h5peditor-conflicting-time-msg.h5p-hide {\n  display: none;\n}\n\n.h5p-interactive-video .field.group.h5p-hide {\n  display: none;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/h5p-interactive-video.css?ver=1.17.5":"@font-face{font-family:H5PInteractiveVideo;src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/H5PInteractiveVideo.eot);src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/H5PInteractiveVideo.eot?#iefix) format(\"embedded-opentype\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/H5PInteractiveVideo.woff) format(\"woff\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/H5PInteractiveVideo.ttf) format(\"truetype\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/H5PInteractiveVideo.svg#H5PInteractiveVideo) format(\"svg\");font-weight:400;font-style:normal}@font-face{font-family:H5Picons;src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/h5p.eot);src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/h5p.eot?#iefixv34b5s) format(\"embedded-opentype\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/h5p.ttf) format(\"truetype\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/h5p.woff) format(\"woff\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.InteractiveVideo-1.17\/dist\/fonts\/h5p.svg#h5p) format(\"svg\");font-weight:400;font-style:normal}.h5p-interactive-video{position:relative;background:#000!important;overflow:hidden;line-height:1.25em;font-size:16px}.h5p-interactive-video>div{z-index:1}.h5p-interactive-video .h5p-video-wrapper.h5p-disable-opt-out{z-index:auto}.h5p-interactive-video .h5p-video-wrapper.h5p-disable-opt-out .h5p-interaction{z-index:1}.h5p-interactive-video .h5p-question{color:#000}.h5p-interactive-video .h5p-content-controls{visibility:hidden;position:absolute;top:0}.h5p-interactive-video .h5p-video-wrapper{position:relative;overflow:hidden}.h5p-interactive-video .h5p-video{display:block;width:100%;height:auto;color:#fff;clear:both}.h5p-interactive-video object{display:block}.h5p-interactive-video .h5p-overlay{color:#2c2c2c}.h5p-interactive-video .h5p-overlay.h5p-visible{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.h5p-interactive-video .h5p-ie-transparent-background{background-image:url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA\/wD\/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUODw0yPG414gAAAA1JREFUCNdj+P\/\/PwMACPwC\/lyfz9oAAAAASUVORK5CYII=);filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA\/wD\/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUODw0yPG414gAAAA1JREFUCNdj+P\/\/PwMACPwC\/lyfz9oAAAAASUVORK5CYII=\",sizingMethod=\"scale\")}.h5p-interactive-video .h5p-interaction{position:absolute;width:1.75em;height:1.75em;z-index:2;outline:none}.h5p-interactive-video .h5p-interaction .h5p-image:focus,.h5p-interactive-video .h5p-interaction.h5p-link-interaction a:focus{outline:2px solid #179fff}.h5p-interactive-video .h5p-interaction .h5p-image:focus{outline-offset:8px}.h5p-interactive-video .h5p-interaction .h5p-touch-area{width:2.5em;height:2.5em;position:absolute;top:50%;left:50%;transform:translate3d(-50%,-50%,0);cursor:pointer}.h5p-interactive-video .h5p-interaction-label{-webkit-transition:-webkit-transform .2s;-moz-transition:-moz-transform .2s;transition:transform .2s;position:absolute;top:0;left:.875em;height:100%;line-height:1.75em;padding:0 .875em 0 1.375em;background:rgba(0,0,0,.8);border-top-right-radius:1em;border-bottom-right-radius:1em;color:#fff;z-index:1;width:auto;white-space:nowrap;cursor:pointer;vertical-align:text-bottom;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#cc000000,endColorstr=#cc000000)}.h5p-interactive-video .h5p-interaction-label .h5p-interaction-label-text{display:block;color:#fff;font-size:.7em;margin:0}.h5p-interactive-video .h5p-interaction-label .h5p-interaction-label-text>p{font-size:1em;margin:0;line-height:inherit}.h5p-interactive-video .h5p-interaction-label.h5p-left-label{left:auto;right:.875em;padding:0 1.375em 0 .875em;border-top-left-radius:1em;border-bottom-left-radius:1em;border-top-right-radius:0;border-bottom-right-radius:0}.h5p-interactive-video .h5p-interaction-label.h5p-interaction-label-standalone{left:0;padding:.2em .5em;line-height:1.5;height:auto;min-width:1.5em;border-radius:0;cursor:auto}.h5p-interactive-video .h5p-interaction-label.h5p-interaction-label-standalone:focus{outline:1px solid #09f;outline-offset:0}.h5p-interactive-video .h5p-interaction-button{cursor:pointer;position:relative;z-index:2;display:block;width:1.75em;height:1.75em;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:50%;line-height:1.75em;color:#fff;-webkit-box-shadow:0 .15em .25em 0 rgba(0,0,0,.5);-moz-box-shadow:0 .15em .25em 0 rgba(0,0,0,.5);box-shadow:0 .15em .25em 0 rgba(0,0,0,.5);text-align:center;border-color:transparent;-webkit-transition:-webkit-transform .2s,background .3s,box-shadow .3s,border-color .3s;-moz-transition:-moz-transform .2s,background .3s,box-shadow .3s,border-color .3s;-ms-transition:background .3s,box-shadow .3s,border-color .3s;-o-transition:background .3s,box-shadow .3s,border-color .3s;transition:transform .2s,background .3s,box-shadow .3s,border-color .3s}.h5p-interactive-video .h5p-interaction:hover .h5p-interaction-button{-webkit-box-shadow:0 .3em .25em 0 rgba(0,0,0,.5);-moz-box-shadow:0 .3em .25em 0 rgba(0,0,0,.5);box-shadow:0 .3em .25em 0 rgba(0,0,0,.5)}.h5p-interactive-video .h5p-hidden>.h5p-interaction-button{-webkit-transform:rotate(90deg) scale(0);-moz-transform:rotate(90deg) scale(0);-ms-transform:rotate(90deg) scale(0);-o-transform:rotate(90deg) scale(0);transform:rotate(90deg) scale(0)}.h5p-interactive-video .h5p-hidden>.h5p-interaction-label{-webkit-transform:scale(0) translateX(-100%);-moz-transform:scale(0) translateX(-100%);-ms-transform:scale(0) translateX(-100%);transform:scale(0) translateX(-100%)}.h5p-interactive-video div>.h5p-interaction-button{background-color:#981d99}.h5p-interactive-video div:hover>.h5p-interaction-button{background-color:#661366}.h5p-interactive-video div:focus>.h5p-interaction-button{top:-.167em;left:-.167em;border:.167em solid #e489f3}.h5p-interactive-video div:active>.h5p-interaction-button{background-color:#4c0e4c;box-shadow:0 .15em .25em 0 rgba(0,0,0,.5)}.h5p-interactive-video div>.h5p-interaction-button:before{font-family:H5Picons;content:\"\\E609\"}.h5p-interactive-video .h5p-image-interaction>.h5p-interaction-button,.h5p-interactive-video .h5p-link-interaction>.h5p-interaction-button,.h5p-interactive-video .h5p-table-interaction>.h5p-interaction-button,.h5p-interactive-video .h5p-text-interaction>.h5p-interaction-button{background-color:#1d5cff}.h5p-interactive-video .h5p-image-interaction:hover>.h5p-interaction-button,.h5p-interactive-video .h5p-link-interaction:hover>.h5p-interaction-button,.h5p-interactive-video .h5p-table-interaction:hover>.h5p-interaction-button,.h5p-interactive-video .h5p-text-interaction:hover>.h5p-interaction-button{background-color:#003fdf}.h5p-interactive-video .h5p-image-interaction:focus>.h5p-interaction-button,.h5p-interactive-video .h5p-link-interaction:focus>.h5p-interaction-button,.h5p-interactive-video .h5p-table-interaction:focus>.h5p-interaction-button,.h5p-interactive-video .h5p-text-interaction:focus>.h5p-interaction-button{border-color:#70b0ff}.h5p-interactive-video .h5p-image-interaction:active>.h5p-interaction-button,.h5p-interactive-video .h5p-link-interaction:active>.h5p-interaction-button,.h5p-interactive-video .h5p-table-interaction:active>.h5p-interaction-button,.h5p-interactive-video .h5p-text-interaction:active>.h5p-interaction-button{background-color:#163c9b;box-shadow:0 .15em .25em 0 rgba(0,0,0,.5)}.h5p-interactive-video .h5p-image-interaction>.h5p-interaction-button:before,.h5p-interactive-video .h5p-link-interaction>.h5p-interaction-button:before,.h5p-interactive-video .h5p-table-interaction>.h5p-interaction-button:before,.h5p-interactive-video .h5p-text-interaction>.h5p-interaction-button:before{font-family:H5PFontAwesome4;content:\"\\F055\"}.h5p-interactive-video .h5p-goto-timecode>.h5p-interaction-button{background-color:#018d82}.h5p-interactive-video .h5p-goto-timecode:hover>.h5p-interaction-button{background-color:#007b71}.h5p-interactive-video .h5p-goto-timecode:focus>.h5p-interaction-button{border-color:#53d5c9}.h5p-interactive-video .h5p-goto-timecode:active>.h5p-interaction-button{background-color:#055e57}.h5p-interactive-video .h5p-dialog-interaction{font-size:.875em}.h5p-interactive-video .h5p-dialog-interaction.h5p-blanks .h5p-blanks-footer{min-height:5em}.h5p-interactive-video .h5p-link-interaction .h5p-link a{color:#fff;text-decoration:none}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-link-interaction{background-color:rgba(0,0,0,.5);box-shadow:0 0 10px 0 hsla(0,0%,100%,.2);border-radius:1em;height:auto;width:auto;cursor:pointer}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-link-interaction:focus,.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-link-interaction:hover{background-color:rgba(0,0,0,.7);box-shadow:0 0 15px 0 hsla(0,0%,100%,.2)}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-link-interaction:active{background-color:rgba(0,0,0,.8);box-shadow:0 0 5px 0 hsla(0,0%,100%,.2)}.h5p-interactive-video .h5p-interaction .h5p-interaction-inner.h5p-link:after{font-family:H5PFontAwesome4;content:\"\\F08E\";color:#fff;margin-left:.7em;font-size:.75em}.h5p-interactive-video .h5p-interaction .h5p-interaction-inner.h5p-link.h5p-ivhotspot:after{content:none}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-link-interaction .h5p-interaction-inner.h5p-link{margin:0 .8em;width:auto;height:auto}.h5p-interactive-video .h5p-interaction.h5p-poster{z-index:1;background:#fff;box-shadow:0 0 .625em 0 rgba(0,0,0,.25);box-sizing:border-box}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-transparent-interaction.h5p-image-interaction:not(.goto-clickable-visualize):not(.h5p-box-shadow-disabled) .h5p-image img{filter:drop-shadow(0 0 .325em rgba(0,0,0,.25))}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-transparent-interaction.h5p-image-interaction:not(.goto-clickable-visualize){box-shadow:none;overflow:visible}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-box-shadow-disabled{box-shadow:none}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-transparent-interaction.h5p-box-shadow-disabled .h5p-image img{filter:none}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-ivhotspot-interaction{box-shadow:none;background:none;overflow:visible}.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-ivhotspot-interaction .h5p-interaction-outer,.h5p-interactive-video .h5p-interaction.h5p-poster.h5p-transparent-interaction.h5p-image-interaction .h5p-interaction-outer{overflow:visible}.h5p-interactive-video .h5p-interaction.h5p-poster .h5p-interaction-outer{position:relative;top:0;left:0;height:100%;width:100%;overflow-y:auto}.h5p-interactive-video .h5p-interaction-inner,.h5p-interactive-video .h5p-interaction-inner.h5p-image{display:block;width:100%;height:auto;font-size:.875em;box-sizing:border-box;-moz-box-sizing:border-box}.h5p-interactive-video .h5p-interaction-inner.h5p-ivhotspot{height:100%}.h5p-interactive-video .h5p-interaction-inner.h5p-text{width:auto}.h5p-interactive-video .h5p-table:focus,.h5p-interactive-video .h5p-text:focus{outline:0}.h5p-interactive-video .h5p-interaction-inner.h5p-image,.h5p-interactive-video .h5p-interaction-inner.h5p-questionnaire-wrapper,.h5p-interactive-video .h5p-interaction-inner.h5p-single-choice-set{height:100%}.h5p-interactive-video .h5p-dialog .h5p-image img{margin:0 auto;position:relative;top:0}.h5p-interactive-video .h5p-interaction-overlay{position:absolute;left:0;top:0;width:100%;height:100%}.h5p-interactive-video .h5p-controls{font-size:16px;height:36px;background:#2c2c2c;display:flex;line-height:1.5em}.h5p-interactive-video .h5p-control{display:inline-block;height:36px;color:#fefefe;outline:0;width:36px;margin-right:6px;text-decoration:none;cursor:pointer;transition:box-shadow .1s ease-out .3s}.h5p-interactive-video .h5p-control:hover{text-decoration:none}.h5p-interactive-video .h5p-control:focus{outline:2px solid #179fff;outline-offset:-4px}.h5p-interactive-video .h5p-controls-left .h5p-control:first-child{margin:0 4px 0 8px}.h5p-interactive-video .h5p-controls-right .h5p-control:first-child{margin-right:6px}.h5p-interactive-video .h5p-control.h5p-time,.h5p-interactive-video [aria-disabled=true].h5p-control,.h5p-interactive-video [aria-disabled=true].h5p-control.h5p-slider,.h5p-interactive-video [aria-disabled=true].h5p-control.h5p-slider .ui-slider-handle{cursor:default}.h5p-interactive-video .h5p-control:before{position:absolute;font-family:H5PFontAwesome4;speak:none;font-style:normal;font-weight:400;font-variant:normal;font-size:22px;text-transform:none;line-height:37px;width:36px;color:#fbfbfb;text-align:center;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5p-interactive-video .h5p-minimal-overlay .h5p-minimal-button{display:inline-block;padding-top:4em;margin:0 1em;position:relative;vertical-align:bottom;outline:none;cursor:pointer;-webkit-transition:visibility 0s linear .1s}.h5p-interactive-video .h5p-minimal-overlay .h5p-minimal-button.h5p-hide{visibility:hidden;-webkit-transition-delay:0s}.h5p-interactive-video .h5p-minimal-overlay .h5p-minimal-button:before{font-size:4em;line-height:1em;position:absolute;font-family:H5PFontAwesome4;top:0;left:50%;transform:translateX(-50%)}.h5p-interactive-video .h5p-control:active:before,.h5p-interactive-video .h5p-control[aria-expanded=true]:before,.h5p-interactive-video .h5p-minimal-overlay .h5p-minimal-button:active{color:#bababa}.h5p-interactive-video .h5p-control:hover:before,.h5p-interactive-video .h5p-minimal-overlay .h5p-minimal-button:hover{color:#dbd7d1}.h5p-interactive-video .h5p-minimal-overlay .h5p-minimal-button:focus{outline:2px solid #179fff;outline-offset:5px}.h5p-interactive-video .h5p-minimal-overlay [aria-disabled=true].h5p-minimal-button,.h5p-interactive-video [aria-disabled=true].h5p-control:before{color:#606060}.h5p-interactive-video .h5p-minimal-overlay [aria-disabled=true].h5p-minimal-button{color:#747474}.h5p-interactive-video .h5p-play:before{content:\"\\F04C\"}.h5p-interactive-video .h5p-pause:before{content:\"\\F04B\"}.h5p-interactive-video .h5p-rewind10:before{content:\"\\F1DA\"}.h5p-interactive-video .h5p-control.h5p-bookmarks:before,.h5p-interactive-video .h5p-minimal-overlay .h5p-bookmarks:before{content:\"\\F02E\"}.h5p-interactive-video .h5p-control.h5p-quality:before,.h5p-interactive-video .h5p-minimal-overlay .h5p-quality:before{content:\"\\F013\"}.h5p-interactive-video .h5p-control.h5p-captions:before,.h5p-interactive-video .h5p-minimal-overlay .h5p-captions:before{content:\"\\F20A\"}.h5p-interactive-video .h5p-control.h5p-playbackRate:before,.h5p-interactive-video .h5p-minimal-overlay .h5p-playbackRate:before{content:\"\\F0E4\"}.h5p-interactive-video .h5p-fullscreen:before{content:\"\\F065\"}.h5p-interactive-video .h5p-exit:before{content:\"\\F066\"}.h5p-interactive-video .h5p-mute:before{content:\"\\F028\"}.h5p-interactive-video .h5p-muted:before{content:\"\\F026\"}.h5p-interactive-video .h5p-more:before{content:\"\\F142\"}.h5p-interactive-video.h5p-minimal .h5p-control.h5p-bookmarks,.h5p-interactive-video.h5p-minimal .h5p-control.h5p-captions,.h5p-interactive-video.h5p-minimal .h5p-control.h5p-playbackRate,.h5p-interactive-video.h5p-minimal .h5p-control.h5p-quality,.h5p-interactive-video.h5p-minimal .h5p-time,.h5p-interactive-video .h5p-more,.h5p-interactive-video .h5p-simple-time{display:none}.h5p-interactive-video.h5p-minimal .h5p-more,.h5p-interactive-video.h5p-minimal .h5p-simple-time{display:inline-block}.h5p-interactive-video .h5p-minimal-overlay{position:absolute;z-index:10;width:100%;height:100%;left:0;bottom:36px;border-bottom:1px solid #8e8e8e;text-align:center;color:#fefefe;background:rgba(0,0,0,.6);opacity:0;visibility:hidden;transition:visibility 0s linear .1s,opacity .1s linear}.h5p-interactive-video.h5p-minimal .h5p-minimal-overlay.h5p-show{opacity:1;visibility:visible;transition-delay:0s}.h5p-interactive-video .h5p-minimal-wrap{top:50%;position:absolute;width:100%;transform:translateY(-50%)}.h5p-interactive-video .h5p-chooser{font-size:17px;position:absolute;z-index:10;max-width:300px;line-height:21px;background:#2c2c2c;background:rgba(44,44,44,.8);color:#fbfbfb;opacity:0;visibility:hidden;bottom:72px;-webkit-transition:visibility 0s linear .1s,opacity .1s linear,bottom .1s linear;-moz-transition:visibility 0s linear .1s,opacity .1s linear,bottom .1s linear;transition:visibility 0s linear .1s,opacity .1s linear,bottom .1s linear;overflow-x:hidden;overflow-y:auto}.h5p-interactive-video.h5p-fullscreen .h5p-chooser,.h5p-interactive-video.h5p-semi-fullscreen .h5p-chooser{background:rgba(0,0,0,.6)}.h5p-interactive-video:not(.h5p-minimal) .h5p-chooser.h5p-bookmarks{z-index:1;width:200px;left:-34px;bottom:36px;overflow-y:hidden;opacity:0;transform:scaleX(.2) translateY(36px);-webkit-transition:transform .3s,opacity .3s,max-height .3s,left .3s;-moz-transition:transform .3s,opacity .3s,max-height .3s,left .3s;transition:transform .3s,opacity .3s,max-height .3s,left .3s}.h5p-interactive-video:not(.h5p-minimal) .h5p-chooser.h5p-bookmarks.h5p-rewind-displacement{left:8px}.h5p-interactive-video:not(.h5p-minimal) .h5p-chooser.h5p-bookmarks:not(.h5p-show){pointer-events:none}.h5p-interactive-video:not(.h5p-minimal) .h5p-chooser.h5p-bookmarks.h5p-show.h5p-transitioning{overflow:hidden}.h5p-interactive-video .h5p-chooser.h5p-bookmarks.h5p-transitioning{visibility:visible}.h5p-interactive-video .h5p-chooser.h5p-captions,.h5p-interactive-video .h5p-chooser.h5p-playbackRate,.h5p-interactive-video .h5p-chooser.h5p-quality{right:12px}.h5p-interactive-video .h5p-chooser.h5p-show{bottom:36px;opacity:1;visibility:visible;-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s}.h5p-interactive-video:not(.h5p-minimal) .h5p-chooser.h5p-bookmarks.h5p-show{width:200px;left:-10px;overflow-y:auto;opacity:1;transform:scaleX(1) translate(10px)}.h5p-interactive-video .h5p-chooser.h5p-bookmarks.h5p-show *{visibility:visible}.h5p-interactive-video .h5p-chooser>h3{margin:0 0 8px;padding:8px 24px 8px 12px;font-size:19px;font-weight:400;border-bottom:1px solid #fbfbfb;color:#fbfbfb}.h5p-interactive-video .h5p-chooser>[role=menu]{list-style:none;padding:0 2px 8px;margin:0}.h5p-interactive-video .h5p-chooser>[role=menu]>[role^=menuitem]{padding-left:32px;margin:2px 0;color:#fbfbfb}.h5p-interactive-video .h5p-chooser>[role=menu]>[role^=menuitem]:hover{cursor:pointer;color:#dbd7d1}.h5p-interactive-video .h5p-chooser>[role=menu]>[role^=menuitem]:focus{outline:2px solid #179fff}.h5p-interactive-video .h5p-chooser>[role=menu]>[role^=menuitem]:before{left:12px;position:absolute;font-family:H5PFontAwesome4;content:\"\\F10C\";-moz-box-sizing:border-box;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5p-interactive-video .h5p-chooser>[role=menu]>li[aria-checked=true]:before{content:\"\\F058\"}.h5p-interactive-video .h5p-chooser.h5p-bookmarks>[role=menu]>li:before{content:\"\\F02E\"}.h5p-interactive-video .h5p-chooser-close-button{cursor:pointer;position:absolute;top:.1em;right:.1em;width:1em;height:1em;text-align:center;line-height:1}.h5p-interactive-video.h5p-minimal .h5p-chooser-close-button{top:.3em;right:.3em;font-size:130%}.h5p-interactive-video .h5p-chooser-close-button:after{font-family:H5PFontAwesome4;content:\"\\F00D\"}.h5p-interactive-video .h5p-chooser-close-button:hover{color:#dbd7d1}.h5p-interactive-video .h5p-chooser-close-button:focus{outline:2px solid #179fff}.h5p-interactive-video.h5p-minimal .h5p-chooser{z-index:11;background-color:transparent;width:100%;height:100%;left:0;max-width:none}.h5p-interactive-video.h5p-minimal .h5p-chooser>h3{border-bottom-color:#8e8e8e}.h5p-interactive-video .h5p-simple-time,.h5p-interactive-video .h5p-time{width:auto;height:auto;font-size:.875em;color:gray;padding:0 8px;line-height:36px}.h5p-interactive-video .h5p-time{float:left}.h5p-interactive-video .h5p-simple-time{float:right}.h5p-interactive-video .h5p-simple-time .h5p-current,.h5p-interactive-video .h5p-time .h5p-current{color:#fff;display:inline}.h5p-interactive-video .h5p-slider{width:auto;padding:14px 8px 12px;margin:0;height:10px;cursor:default;flex:1}.h5p-interactive-video .h5p-slider .ui-slider{background:#0b0d0c;border:0;height:8px;cursor:pointer;border-radius:0;-ms-touch-action:manipulation;touch-action:manipulation}.h5p-interactive-video [aria-disabled=true].h5p-slider .ui-slider{background:#000}.h5p-interactive-video .h5p-slider .ui-slider-range{color:#e2e2e2;height:9px;border-radius:0}.h5p-interactive-video [aria-disabled=true].h5p-slider .ui-slider-range{background:#7a7a7a}.h5p-interactive-video [aria-disabled=true].h5p-slider .ui-slider.ui-state-disabled{opacity:1;filter:none}.h5p-interactive-video .h5p-slider .ui-slider-handle{cursor:pointer;top:-4px;width:16px;height:16px;margin-left:-8px;text-shadow:0 0 2px #666;outline:none;text-decoration:none;border:0;background:#fbfbfb}.h5p-interactive-video .h5p-slider .ui-slider-handle:focus{outline:2px solid #179fff;outline-offset:4px}.h5p-interactive-video [aria-disabled=true].h5p-slider .ui-slider-handle{background:none}.h5p-interactive-video :not([aria-disabled=true]).h5p-slider .ui-slider-handle:before{font-family:H5PInteractiveVideo;content:\"\\E001\";font-size:26px;line-height:1;position:absolute;margin:-5px 0 0 -5px;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;color:#fbfbfb;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5p-interactive-video :not([aria-disabled=true]).h5p-slider .ui-slider-handle:hover:before{color:#dbd7d1}.h5p-interactive-video .h5p-buffered{position:absolute;top:0;left:0;height:8px;width:0;background:#4d4d4d}.h5p-interactive-video .h5p-bookmarks-container,.h5p-interactive-video .h5p-interactions-container{position:relative}.h5p-interactive-video .h5p-seekbar-interaction{position:absolute;top:-10px;width:7px;height:7px;border-radius:50%;transform:translateX(-50%);cursor:pointer;border:.083em solid #e36ee3;box-sizing:border-box}.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction{border-color:#9e4d9e;cursor:default}.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction:hover{border-color:#e98be9}.h5p-interactive-video .h5p-seekbar-interaction.h5p-goto-timecode,.h5p-interactive-video .h5p-seekbar-interaction.h5p-gotoquestion-interaction,.h5p-interactive-video .h5p-seekbar-interaction.h5p-image-interaction,.h5p-interactive-video .h5p-seekbar-interaction.h5p-ivhotspot-interaction,.h5p-interactive-video .h5p-seekbar-interaction.h5p-link-interaction,.h5p-interactive-video .h5p-seekbar-interaction.h5p-table-interaction,.h5p-interactive-video .h5p-seekbar-interaction.h5p-text-interaction{border:none;background-color:#7ca1ff}.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-goto-timecode,.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-gotoquestion-interaction,.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-image-interaction,.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-ivhotspot-interaction,.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-link-interaction,.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-table-interaction,.h5p-interactive-video [aria-disabled=true].h5p-seekbar-interaction.h5p-text-interaction{background-color:#5770b2}.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-goto-timecode:hover,.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-gotoquestion-interaction:hover,.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-image-interaction:hover,.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-ivhotspot-interaction:hover,.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-link-interaction:hover,.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-table-interaction:hover,.h5p-interactive-video :not([aria-disabled=true]).h5p-seekbar-interaction.h5p-text-interaction:hover{background-color:#96b4ff}.h5p-interactive-video .h5p-seekbar-interaction:focus{outline:2px solid #179fff;outline-offset:2px}.h5p-interactive-video .h5p-bookmark{position:absolute;top:-13px;width:1px;height:36px;background:#a2a2a2;color:#fefefe;-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s}.h5p-interactive-video .h5p-bookmark.h5p-show{background:#aeaeae}.h5p-interactive-video .h5p-bookmark-label,.h5p-interactive-video .h5p-prevent-skipping-message{position:absolute;bottom:46px;left:-16px;padding:0 10px;background:#2c2c2c;background:rgba(44,44,44,.8);opacity:0;visibility:hidden;max-width:300px;-webkit-transition:visibility 0s .2s,opacity .2s;-moz-transition:visibility 0s .2s,opacity .2s;transition:visibility 0s .2s,opacity .2s;z-index:1}.h5p-interactive-video .h5p-prevent-skipping-message{bottom:25px;transform:translateX(-1.1em)}.h5p-interactive-video .h5p-prevent-skipping-message-text{max-width:17.5em;line-height:30px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.h5p-interactive-video.h5p-minimal .h5p-prevent-skipping-message-text{max-width:9.5em}.h5p-interactive-video.h5p-fullscreen .h5p-bookmark-label,.h5p-interactive-video.h5p-fullscreen .h5p-prevent-skipping-message,.h5p-interactive-video.h5p-semi-fullscreen .h5p-bookmark-label,.h5p-interactive-video.h5p-semi-fullscreen .h5p-prevent-skipping-message{background:rgba(0,0,0,.6)}.h5p-interactive-video .h5p-prevent-skipping-message.h5p-show,.h5p-interactive-video .h5p-show .h5p-bookmark-label{opacity:1;visibility:visible;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;transition:opacity .2s}.h5p-interactive-video .h5p-bookmark-label:after,.h5p-interactive-video .h5p-prevent-skipping-message:after{content:\"\";position:absolute;left:8px;border:9px solid transparent;border-top-width:10px;border-top-color:#2c2c2c;border-top-color:rgba(44,44,44,.8);border-bottom:0;top:100%}.h5p-interactive-video.h5p-fullscreen .h5p-bookmark-label:after,.h5p-interactive-video.h5p-fullscreen .h5p-prevent-skipping-message:after,.h5p-interactive-video.h5p-semi-fullscreen .h5p-bookmark-label:after,.h5p-interactive-video.h5p-semi-fullscreen .h5p-prevent-skipping-message:after{border-top-color:rgba(0,0,0,.6)}.h5p-interactive-video .h5p-bookmark-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:30px}.h5p-interactive-video .h5p-bookmark-text:before{font-family:H5PFontAwesome4;content:\"\\F02E\";margin-right:8px}.h5p-interactive-video .h5p-dialog-wrapper,.h5p-interactive-video .h5p-warning-mask{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:51;background:rgba(44,44,44,.5);-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#66000000,endColorstr=#66000000)}.h5p-interactive-video .h5p-warning-mask{background:rgba(4,4,4,.77);z-index:53;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;transform-style:preserve-3d}.h5p-interactive-video .h5p-warning-mask .h5p-warning-mask-wrapper{position:relative;top:50%;transform:perspective(1px) translateY(-50%)}.h5p-interactive-video .h5p-warning-mask-wrapper .h5p-warning-mask-content{max-width:17em;margin-left:auto;margin-right:auto;text-align:center;color:#fff;font-size:1.6em;line-height:1.2em}.h5p-interactive-video .h5p-warning-mask-wrapper .h5p-joubelui-button{margin-top:1.3em;display:block;margin-left:auto;margin-right:auto}.h5p-button-back:before{content:\"\\F060\"}.h5p-interactive-video .h5p-dialog-wrapper.h5p-hidden{background:transparent}.h5p-interactive-video .h5p-dialog-wrapper.h5p-hidden .h5p-dialog{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}.h5p-interactive-video .h5p-dialog{position:absolute;width:auto;min-width:6.25em;min-height:4.6875em;margin:1.25em;background:#fff;overflow:hidden;box-shadow:0 0 .625em 0 rgba(0,0,0,.25);-webkit-transition:-webkit-transform .2s;-moz-transition:-moz-transform .2s;transition:transform .2s}.h5p-interactive-video .h5p-dialog:not(.h5p-big){max-width:calc(100% - 2.5em)}.h5p-interactive-video .h5p-dialog.h5p-medium{min-width:20em;top:0}.h5p-interactive-video .h5p-dialog-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:calc(100% - 1em)}.h5p-interactive-video .h5p-dialog-titlebar{overflow:hidden;position:absolute;width:100%;top:0;padding:.5em 1em .5em .5em;box-sizing:border-box;border-bottom:1px solid #eee;font-size:.875em;color:#757575}.h5p-interactive-video .h5p-dialog.h5p-big{width:auto;height:auto;max-height:none;left:1.25em;right:1.25em;top:1.25em;bottom:1.25em;margin:0;box-sizing:border-box;-moz-box-sizing:border-box}.h5p-interactive-video .h5p-dialog-close{position:absolute;top:.25em;right:.5em;cursor:pointer;padding:.25em .5em}.h5p-interactive-video .h5p-dialog-close:focus{outline:2px solid #179fff}.h5p-interactive-video .h5p-dialog-close:before{font-family:H5PFontAwesome4;content:\"\\F057\";color:#757575}.h5p-interactive-video .h5p-dialog-close:focus:before,.h5p-interactive-video .h5p-dialog-close:hover:before{color:#555}.h5p-interactive-video .h5p-dialog-close:active:before{color:#454545}.h5p-interactive-video .h5p-dialog-inner{height:100%;overflow:hidden;overflow-y:auto}.h5p-interactive-video .h5p-big>.h5p-dialog-inner{width:100%;height:auto}.h5p-interactive-video .h5p-dialog-inner::-webkit-scrollbar,.h5p-interactive-video .h5p-poster.h5p-interaction .h5p-interaction-outer::-webkit-scrollbar{width:.5em;background:#fff}.h5p-interactive-video .h5p-dialog-inner::-webkit-scrollbar-thumb,.h5p-interactive-video .h5p-poster.h5p-interaction .h5p-interaction-outer::-webkit-scrollbar-thumb{background:#ddd}.h5p-interactive-video .h5p-dialog-inner::-webkit-scrollbar-thumb:hover,.h5p-interactive-video .h5p-poster.h5p-interaction .h5p-interaction-outer::-webkit-scrollbar-thumb:hover{background:#aaa}.h5p-interactive-video .h5p-dialog-inner::-webkit-scrollbar-thumb:active,.h5p-interactive-video .h5p-dialog-inner::-webkit-scrollbar-thumb:focus,.h5p-interactive-video .h5p-poster.h5p-interaction .h5p-interaction-outer::-webkit-scrollbar-thumb:active,.h5p-interactive-video .h5p-poster.h5p-interaction .h5p-interaction-outer::-webkit-scrollbar-thumb:focus{background:#888}.h5p-interactive-video .h5p-dialog-hide{color:#191919;font-size:1.3em;padding:.3em;line-height:.75em;position:absolute;right:.1em;top:.1em;height:1em;z-index:52;text-shadow:0 0 .5em #fff;font-family:H5PFontAwesome4;text-decoration:none;-webkit-transition:-webkit-transform .2s;-moz-transition:-moz-transform .2s;transition:transform .2s}.h5p-interactive-video .h5p-dialog-hide:hover{text-decoration:none;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}.h5p-interactive-video .h5p-question .h5p-joubelui-button{float:left}.h5p-interactive-video .h5p-question .h5p-joubelui-button:first-child{margin:0 .5em 1em 0}.h5p-interactive-video .h5p-question .h5p-joubelui-button:last-child{margin:0 0 1em .5em}.h5p-interactive-video .h5p-question .h5p-joubelui-button:first-child:last-child{margin:0 0 1em}.h5p-interactive-video .h5p-dialog-interaction.h5p-image{display:block;height:auto}.h5p-interactive-video .h5p-text p:first-child{margin-top:0}.h5p-interactive-video .h5p-text p:last-child{margin-bottom:0}.h5p-interactive-video .h5p-table{font-size:.875em;border-collapse:collapse}.h5p-interactive-video .h5p-table th{border-bottom:2px solid #191919}.h5p-interactive-video .h5p-table td{border-bottom:1px solid #595959}.h5p-interactive-video .h5p-table tr:last-child td{border-bottom:0}.h5p-interactive-video .h5p-nil-interaction>.h5p-interaction-button{display:none}.h5p-interactive-video .h5p-nil-interaction>.h5p-interaction-label{top:0;left:0;padding:.2em .5em;line-height:1.5;height:auto;min-width:1.5em;cursor:default;border-radius:0}.h5p-interactive-video .h5p-dragquestion .h5p-button{right:auto;left:1.225em}.h5p-interactive-video .h5p-splash{width:40%;margin:auto;text-align:center;background:#000;background:rgba(0,0,0,.75);color:#fff;cursor:pointer;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash-outer{display:table-cell;vertical-align:middle}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash-play-icon{font-size:5em;padding:.5em 0;line-height:1em}.h5p-interactive-video .h5p-splash-wrapper.no-description .h5p-splash-play-icon,.h5p-interactive-video .h5p-splash-wrapper.no-description.no-title .h5p-splash-play-icon{padding:.5em 0;font-size:4em}.h5p-interactive-video .h5p-splash-wrapper.no-title .h5p-splash-play-icon{padding:.75em 0}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash-play-icon:before{font-family:H5PFontAwesome4;content:\"\\F04B\";display:block}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash .h5p-splash-title{font-family:Open Sans,sans-serif;font-size:1.5em;line-height:1.25em;padding:0 .5em 1.25em;margin-top:-1em}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash .h5p-splash-description{font-family:Open Sans,sans-serif;border-top:1px solid hsla(0,0%,100%,.2);font-size:.75em;line-height:1.25;padding:1.25em}.h5p-interactive-video .h5p-splash>p{margin:.5em 0 1em;color:#fff}.h5p-interactive-video .h5p-splash-wrapper{position:absolute;display:table;padding:1em 0;top:50%;width:100%;height:100%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.h5p-interactive-video .h5p-splash:focus,.h5p-interactive-video .h5p-splash:hover{background:rgba(0,0,0,.85)}.h5p-interactive-video .h5p-splash:focus{outline:1px solid #87cefa}.h5p-interactive-video .h5p-splash-wrapper.no-description .h5p-splash .h5p-splash-description,.h5p-interactive-video .h5p-splash-wrapper.no-description.mobile .h5p-splash .h5p-splash-description{display:none}.h5p-interactive-video .h5p-splash-wrapper.no-description .h5p-splash{padding:1.5em 0}.h5p-interactive-video .h5p-splash-wrapper.no-description.no-title .h5p-splash{width:25%;padding:1em 0}.h5p-interactive-video .h5p-splash-wrapper.no-title .h5p-splash .h5p-splash-title,.h5p-interactive-video .h5p-splash-wrapper.no-title.mobile .h5p-splash .h5p-splash-title{display:none}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash .h5p-splash-title.minimum-font-size{font-size:20px}.h5p-interactive-video .h5p-splash-wrapper .h5p-splash .h5p-splash-description.minimum-font-size{font-size:12px}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash,.h5p-interactive-video .h5p-splash-wrapper.mobile.no-description .h5p-splash,.h5p-interactive-video .h5p-splash-wrapper.mobile.no-description.no-title .h5p-splash{width:100%;height:100%;margin:0;display:flex;top:0;left:0;position:absolute;flex-flow:column}.h5p-interactive-video .h5p-splash-wrapper.mobile{display:block;top:0;-webkit-transform:none;transform:none;width:100%;height:100%}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash-outer{display:block;vertical-align:auto}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash-main{flex:auto;position:relative}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash-main-outer{position:absolute;height:100%;width:100%}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash-main-inner{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash .h5p-splash-title{padding:.5em 2.5em}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash .h5p-splash-description{padding:1em 1.5em}.h5p-interactive-video .h5p-splash-wrapper.mobile .h5p-splash-footer{flex:none}.h5p-interactive-video .h5p-video.h5p-youtube .h5p-splash-wrapper{display:none}.h5p-interactive-video .h5p-video.h5p-youtube .h5p-splash-wrapper .h5p-splash,.h5p-interactive-video .h5p-video.h5p-youtube .h5p-splash-wrapper:hover .h5p-splash{background:#000}.h5p-interactive-video .h5p-question .h5p-question-iv-adaptivity-correct,.h5p-interactive-video .h5p-question .h5p-question-iv-adaptivity-wrong{float:right}.h5p-interactive-video .h5p-question .h5p-question-iv-adaptivity-correct:before,.h5p-interactive-video .h5p-question .h5p-question-iv-adaptivity-wrong:before{content:\"\\F051\"}.h5p-interactive-video .h5p-question .h5p-question-iv-continue{float:right}.h5p-interactive-video .h5p-question-iv-continue:before{content:\"\\F04B\"}.h5p-interactive-video.mobile .h5p-dialog,.h5p-interactive-video.mobile .h5p-dialog.h5p-big{width:100%;height:100%;left:0;top:0}.h5p-no-frame .h5p-interactive-video.mobile .h5p-dialog,.h5p-no-frame .h5p-interactive-video.mobile .h5p-dialog.h5p-big{border:1px solid #eee}.h5p-interactive-video.mobile .h5p-dialog.h5p-big>.h5p-dialog-inner,.h5p-interactive-video.mobile .h5p-dialog>.h5p-dialog-inner{height:inherit;width:100%}.h5p-interactive-video .h5p-dialog.h5p-big[data-lib=\"H5P.Image\"] .h5p-dialog-inner{position:relative}.h5p-interactive-video .h5p-dialog.h5p-big[data-lib=\"H5P.Image\"] .h5p-image{position:absolute;left:50%;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%)}.h5p-interaction.h5p-poster.h5p-questionnaire-interaction .h5p-interaction-outer{overflow-y:hidden}.h5p-interactive-video .h5p-dialog.h5p-big[data-lib=\"H5P.Questionnaire\"] .h5p-questionnaire-wrapper{height:100%;width:100%}.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.Questionnaire\"] .h5p-dialog-titlebar{background-color:#2269a9;border-bottom:1px solid #2269a9}.h5p-interactive-video .h5p-dialog[data-lib=\"H5P.Questionnaire\"] .h5p-dialog-close:before{color:#fff}.h5p-interactive-video .h5p-confirmation-dialog-background{z-index:101}.h5p-interactive-video .goto-clickable{cursor:pointer}.h5p-interactive-video .goto-clickable.h5p-text{cursor:pointer;display:block;margin:0;padding:1em;min-height:100%;text-decoration:none;color:#313131}.h5p-interactive-video .h5p-interaction.h5p-poster.goto-clickable-visualize .h5p-interaction-outer{position:static}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner,.h5p-interactive-video .h5p-poster.goto-clickable-visualize{border:2px solid #1d5cff;transition:border .3s,box-shadow .3s}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode{border-color:#018d82}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner{box-sizing:border-box;min-height:calc(2.5em - 1px);height:auto}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:hover{border-color:#003fdf}.h5p-interactive-video .h5p-poster.goto-clickable-visualize{box-shadow:2px 2px 2px rgba(0,0,0,.2)}.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-box-shadow-disabled{box-shadow:none}.h5p-interactive-video .h5p-poster.goto-clickable-visualize:hover{border-color:#003fdf;box-shadow:4px 4px 8px rgba(0,0,0,.4)}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner:hover,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode:hover{border-color:#00796f}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner,.h5p-interactive-video .h5p-poster.goto-clickable-visualize .h5p-dialog-inner{position:relative}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:before,.h5p-interactive-video .h5p-poster.goto-clickable-visualize .goto-clickable:before{width:0;height:0;position:absolute;top:0;left:0;border-top:1.5em solid #1d5cff;border-right:1.5em solid transparent;opacity:.8;content:\"\";z-index:1;cursor:pointer;pointer-events:none;transition:border-top-color .3s}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner:before,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode .goto-clickable:before{border-top-color:#08a497}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:hover:before,.h5p-interactive-video .h5p-poster.goto-clickable-visualize .goto-clickable:hover:before{border-top-color:#003fdf}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner:hover:before,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode .goto-clickable:hover:before{border-top-color:#027e74}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:focus:before,.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner:focus:before,.h5p-interactive-video .h5p-poster.goto-clickable-visualize .goto-clickable:focus:before,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode .goto-clickable:focus:before{border-top-color:transparent}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:before{top:auto}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:after,.h5p-interactive-video .h5p-poster.goto-clickable-visualize .goto-clickable:after{position:absolute;width:1em;height:1em;top:.25em;left:.25em;font-family:H5PFontAwesome4;font-size:.7em;content:\"\\F08E\";color:#fff;line-height:1;text-align:center;vertical-align:baseline;z-index:1;cursor:pointer;pointer-events:none;transition:color .3s}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner:after,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode .goto-clickable:after{content:\"\\F064\";transform:rotate(24deg) translateX(-2px)}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize .h5p-dialog-inner:focus:after,.h5p-interactive-video .h5p-poster.goto-clickable-visualize .goto-clickable:focus:after{color:#1d5cff}.h5p-interactive-video .h5p-dialog.goto-clickable-visualize.h5p-goto-timecode .h5p-dialog-inner:focus:after,.h5p-interactive-video .h5p-poster.goto-clickable-visualize.h5p-goto-timecode .goto-clickable:focus:after{color:#018d82}.h5p-interactive-video .h5p-dialog.h5p-big.goto-clickable-visualize[data-lib=\"H5P.Image\"] .h5p-dialog-inner:after{top:.25em}.h5p-interactive-video .h5p-dialog.h5p-big[data-lib=\"H5P.Image\"] .h5p-image.goto-clickable{width:100%}.h5p-interactive-video .h5p-interaction-continue-button{cursor:pointer;text-transform:uppercase;color:#fff;background-color:#252525;border-radius:.5em;padding:.6em 2em;font-weight:600;font-size:.85em;width:auto;display:block;align-self:center;letter-spacing:3px;margin:1em auto}.h5p-interactive-video .h5p-interaction-continue-button:after{font-family:H5PFontAwesome4;content:\"\\F144\";margin-left:1.2em}.h5p-interactive-video .hidden{display:none}.h5p-interactive-video .hidden-but-read{left:-10000px;top:auto}.h5p-interactive-video .hidden-but-read,.h5p-iv-hotkey-instructions{position:absolute;width:1px;height:1px;overflow:hidden}.h5p-iv-interactions-announcer{position:absolute;top:0;width:1px;height:1px;overflow:hidden}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/h5p-course-presentation.css?ver=1.17.7":"@font-face{font-family:H5PDroidSans;src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/DroidSans.ttf) format(\"truetype\");font-weight:400}@font-face{font-family:H5PDroidSans;src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/DroidSans-Bold.ttf) format(\"truetype\");font-weight:700}@font-face{font-family:H5PCoursePresentation;src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/H5P.eot);src:url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/H5P.eot#iefix) format(\"embedded-opentype\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/H5P.ttf) format(\"truetype\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/H5P.woff) format(\"woff\"),url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/H5P.svg#H5P) format(\"svg\");font-weight:400;font-style:normal}.h5p-container.h5p-course-presentation{margin-bottom:0}.h5p-course-presentation h1,.h5p-course-presentation h2,.h5p-course-presentation h3,.h5p-course-presentation h4,.h5p-course-presentation h5,.h5p-course-presentation h6,.h5p-course-presentation p{line-height:150%;padding:.5em}.h5p-course-presentation{font-family:H5PDroidSans,sans-serif;color:#323232;line-height:1.25}.h5p-course-presentation h2{font-size:1.667em}.h5p-course-presentation h2,.h5p-course-presentation h3{font-weight:700;line-height:1.5em;padding:0;margin:0 0 .5em}.h5p-course-presentation h3{font-size:1.333em}.h5p-course-presentation p{font-size:1em;font-weight:400;line-height:1.25em;padding:0;margin:0 0 1em}.h5p-course-presentation p:last-child{margin-bottom:0}.h5p-course-presentation a:focus{box-shadow:none}.h5p-course-presentation ol.list-unstyled,.h5p-course-presentation ul.list-unstyled{list-style:none;padding-left:0;margin-top:0;margin-bottom:0}.h5p-course-presentation .h5p-wrapper{margin:0 auto;position:relative;width:640px;height:440px;text-align:center;font-size:16px;box-sizing:border-box;-moz-box-sizing:border-box}.h5p-course-presentation .h5p-wrapper:focus{outline:none}.h5p-course-presentation .h5p-box-wrapper{width:100%;height:90%;overflow:hidden;background:#666;box-shadow:0 0 .5em 0 hsla(0,0%,41%,.4)}.h5p-course-presentation.h5p-fullscreen video .controlBar>.fullscreenButton,.h5p-course-presentation.h5p-fullscreen video::-webkit-media-controls-fullscreen-button{display:none}.h5p-course-presentation .h5p-presentation-wrapper{z-index:1;text-align:left;width:100%;height:100%;position:relative;overflow:hidden;background:#e8e6e7;background-image:-webkit-linear-gradient(top,#f0f0f0,#e8e6e7);background-image:-moz-linear-gradient(top,#f0f0f0,#e8e6e7);background-image:linear-gradient(180deg,#f0f0f0,#e8e6e7);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#f0f0f0\",endColorstr=\"#e8e6e7\",GradientType=0)}.h5p-course-presentation .h5p-slide{width:100%;height:100%;position:absolute;top:0;left:0;z-index:1;display:none;-webkit-transform:translateX(100%) translate3d(100%,0,0);-moz-transform:translateX(100%) translate3d(100%,0,0);-ms-transform:translateX(100%) translate3d(100%,0,0);transform:translateX(100%) translate3d(100%,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.h5p-course-presentation .h5p-slide.h5p-animate{display:block;-webkit-transition:-webkit-transform .25s ease-in-out;-moz-transition:-moz-transform .25s ease-in-out;-ms-transition:-ms-transform .25s ease-in-out;transition:transform .25s ease-in-out}.h5p-course-presentation .h5p-slide.h5p-touch-move{display:block}.h5p-course-presentation .h5p-current{display:block;-webkit-transform:translateX(0) translateZ(0);-moz-transform:translateX(0) translateZ(0);-ms-transform:translateX(0) translateZ(0);transform:translateX(0) translateZ(0);z-index:2}.h5p-course-presentation .h5p-previous{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.h5p-course-presentation .h5p-action-foo{position:absolute;left:.5em}.h5p-course-presentation .h5p-action-bar{position:absolute;right:.5em}.h5p-course-presentation .h5p-action-bar a,.h5p-course-presentation .h5p-action-foo a{text-decoration:none}.h5p-course-presentation .h5p-copyinfo-header{font-size:1.2em;color:#555;font-weight:700;margin-bottom:.4em}.h5p-course-presentation .h5p-cp-show-solutions:before{font-family:H5PFontAwesome4;content:\"\\F06E\";margin-right:.5em}.h5p-course-presentation .h5p-cp-show-solutions{display:inline-block}.h5p-course-presentation .h5p-slide-button{display:inline-block;padding:0;margin:0 .2em}.h5p-course-presentation .h5p-slide-button a{color:#323232;padding:.3em}.h5p-course-presentation .h5p-slide-button.h5p-current a{color:#fff;background:#0097fd;background-image:-webkit-linear-gradient(top,#0097fd,#096bcb);background-image:-moz-linear-gradient(top,#0097fd,#096bcb);background-image:linear-gradient(180deg,#0097fd,#096bcb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#0097fd\",endColorstr=\"#096bcb\",GradientType=0)}.h5p-course-presentation .h5p-slide-button a:hover{color:#525252}.h5p-course-presentation .h5p-slide-button.h5p-current a:hover{color:#fff}.h5p-course-presentation .h5p-has-solutions a,.h5p-course-presentation .h5p-has-solutions a:hover{text-decoration:underline}.h5p-course-presentation .h5p-element{position:absolute;overflow:hidden;overflow-y:auto;font-size:.75em;z-index:1}.h5p-course-presentation .h5p-element.h5p-element-button-wrapper{border:0;background-color:transparent!important;width:1.5em!important;height:1.5em!important;overflow:visible!important;z-index:2}.h5p-course-presentation .h5p-element.h5p-element-button-wrapper.h5p-element-button-big{width:2.334em!important;height:2.334em!important;line-height:2.334em!important}.h5p-course-presentation .h5p-element.h5p-blanks,.h5p-course-presentation .h5p-element.h5p-twitter-user-feed{overflow:auto}.h5p-course-presentation .h5p-element.h5p-summary{overflow-x:visible}.h5p-course-presentation .h5p-popup-overlay,.h5p-course-presentation .h5p-popup-overlay.h5p-video{background-color:hsla(0,0%,100%,.8);height:100%;position:absolute;width:100%;z-index:200;margin:-10px 0 0 -10px;padding:10px}.h5p-course-presentation .h5p-popup-overlay{background-color:rgba(44,44,44,.5)}.h5p-course-presentation .h5p-popup-overlay,.h5p-course-presentation .h5p-popup-overlay.h5p-animate{-moz-transition:background-color .2s;-webkit-transition:background-color .2s;-o-transition:background-color .2s;transition:background-color .2s}.h5p-course-presentation .h5p-popup-overlay.h5p-animate{background-color:transparent}.h5p-course-presentation .h5p-popup-container{background-color:#fff;border:none;box-shadow:0 0 .625em 0 rgba(0,0,0,.25);left:5%;position:absolute;top:10%;width:90%;min-height:65%;max-height:80%;transition:top .2s;overflow:hidden;font-size:.75em;display:flex;flex-direction:column}.h5p-course-presentation .h5p-popup-container.h5p-animate{top:100%}.h5p-course-presentation .h5p-popup-overlay .h5p-popup-container .h5p-popup-wrapper{box-sizing:border-box;max-height:22em;overflow:hidden;text-align:left;overflow-y:auto}.h5p-course-presentation .h5p-popup-overlay .h5p-popup-container .h5p-popup-wrapper::-webkit-scrollbar{width:.6em;background:#fff}.h5p-course-presentation .h5p-popup-overlay .h5p-popup-container .h5p-popup-wrapper::-webkit-scrollbar-thumb{background:#ddd}.h5p-course-presentation .h5p-popup-overlay.h5p-advancedtext{font-size:1em;margin-right:1.5em;padding:.5em}.h5p-course-presentation .h5p-popup-overlay.h5p-advanced-text .h5p-popup-container{padding:2em 0}.h5p-course-presentation .h5p-popup-overlay.h5p-advancedtext .h5p-popup-container .h5p-popup-wrapper,.h5p-course-presentation .h5p-popup-overlay.h5p-popup-comment-field .h5p-popup-container .h5p-popup-wrapper{padding:.5em;overflow:auto;text-align:left}.h5p-popup-overlay.h5p-interactivevideo .h5p-popup-container,.h5p-popup-overlay.h5p-video .h5p-popup-container{top:5%;left:17.5%;width:65%;max-height:95%}.h5p-popup-overlay.h5p-dialogcards .h5p-popup-container{height:80%;overflow:hidden}.h5p-popup-overlay.h5p-singlechoiceset .h5p-popup-container{overflow:hidden}.h5p-popup-overlay.h5p-singlechoiceset .h5p-sc-sound-control{right:1.2em}.h5p-button-element.h5p-sc-set-wrapper{overflow:hidden}.h5p-course-presentation .h5p-popup-container tfoot{font-weight:700}.h5p-course-presentation .h5p-popup-container table{border-collapse:collapse}.h5p-course-presentation .h5p-element-solution{display:block;position:absolute;right:.5em;bottom:.1em;text-decoration:none}.h5p-course-presentation .h5p-element-button-wrapper .h5p-element-solution{right:-1.2em;top:-1.3em;z-index:2}.h5p-course-presentation .h5p-element-button{position:absolute;z-index:2;display:block;width:1.5em;height:1.5em;background:#00f;color:#fff;font-size:1em;border-radius:50%;line-height:1.5em;box-shadow:0 .15em .25em 0 rgba(0,0,0,.5);text-align:center;text-decoration:none;border:0;background:#1d5cff;transition:background .3s,box-shadow .3s;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.h5p-course-presentation .h5p-element-button:hover{box-shadow:0 .3em .25em 0 rgba(0,0,0,.5);background:#003fdf}.h5p-course-presentation .h5p-element-button:focus{outline:2px solid #79abfd}.h5p-course-presentation .h5p-element-button:before{text-decoration:none;font-family:H5PFontAwesome4;content:\"\\F119\";font-size:.875em}.h5p-course-presentation .h5p-element-button.h5p-element-button-big{width:2.334em;height:2.334em;line-height:2.334em}.h5p-course-presentation .h5p-blanks-button,.h5p-course-presentation .h5p-dialogcards-button,.h5p-course-presentation .h5p-dragquestion-button,.h5p-course-presentation .h5p-dragtext-button,.h5p-course-presentation .h5p-exportabletextarea-button,.h5p-course-presentation .h5p-interactivevideo-button,.h5p-course-presentation .h5p-markthewords-button,.h5p-course-presentation .h5p-multichoice-button,.h5p-course-presentation .h5p-singlechoiceset-button,.h5p-course-presentation .h5p-summary-button,.h5p-course-presentation .h5p-truefalse-button{background:#981d99}.h5p-course-presentation .h5p-blanks-button:hover,.h5p-course-presentation .h5p-dialogcards-button:hover,.h5p-course-presentation .h5p-dragquestion-button:hover,.h5p-course-presentation .h5p-dragtext-button:hover,.h5p-course-presentation .h5p-exportabletextarea-button:hover,.h5p-course-presentation .h5p-interactivevideo-button:hover,.h5p-course-presentation .h5p-markthewords-button:hover,.h5p-course-presentation .h5p-multichoice-button:hover,.h5p-course-presentation .h5p-singlechoiceset-button:hover,.h5p-course-presentation .h5p-summary-button:hover,.h5p-course-presentation .h5p-truefalse-button:hover{background:#661366}.h5p-course-presentation .h5p-blanks-button:before,.h5p-course-presentation .h5p-dialogcards-button:before,.h5p-course-presentation .h5p-dragquestion-button:before,.h5p-course-presentation .h5p-dragtext-button:before,.h5p-course-presentation .h5p-exportabletextarea-button:before,.h5p-course-presentation .h5p-markthewords-button:before,.h5p-course-presentation .h5p-multichoice-button:before,.h5p-course-presentation .h5p-singlechoiceset-button:before,.h5p-course-presentation .h5p-summary-button:before{font-family:H5PCoursePresentation}.h5p-course-presentation .h5p-advancedtext-button:before{content:\"\\F05A\"}.h5p-course-presentation .h5p-exportabletextarea-button:before{content:\"\\E995\"}.h5p-course-presentation .h5p-table-button:before{content:\"\\F0CE\"}.h5p-course-presentation .h5p-link-button:before{content:\"\\F0C1\"}.h5p-course-presentation .h5p-image-button:before{content:\"\\F03E\"}.h5p-course-presentation .h5p-video-button:before{content:\"\\F008\"}.h5p-course-presentation .h5p-audio-button:before{content:\"\\F028\"}.h5p-course-presentation .h5p-blanks-button:before{content:\"\\E994\"}.h5p-course-presentation .h5p-multichoice-button:before{content:\"\\E603\"}.h5p-course-presentation .h5p-truefalse-button:before{font-family:H5PFontIcons;font-size:1.2em;content:\"\\E902\"}.h5p-course-presentation .h5p-dragquestion-button:before{content:\"\\E991\"}.h5p-course-presentation .h5p-summary-button:before{content:\"\\E992\"}.h5p-course-presentation .h5p-interactivevideo-button:before{content:\"\\F03D\"}.h5p-course-presentation .h5p-singlechoiceset-button:before{content:\"\\E993\"}.h5p-course-presentation .h5p-dragtext-button:before{content:\"\\E600\"}.h5p-course-presentation .h5p-dialogcards-button:before{content:\"\\E900\";vertical-align:middle}.h5p-course-presentation .h5p-markthewords-button:before{content:\"\\E601\"}.h5p-course-presentation .h5p-chart-button:before{content:\"\\F200\"}.h5p-course-presentation .h5p-no-solution{color:#888}.h5p-course-presentation .h5p-cp-dialog-titlebar{padding:1.78em 1em .5em .5em;border-bottom:1px solid #eee;font-size:.875em;color:#757575}.h5p-course-presentation .h5p-close-popup{position:absolute;top:.25em;right:.5em;cursor:pointer;padding:.4em .5em;font-size:1.33em}.h5p-course-presentation .h5p-close-popup:before{font-family:H5PFontAwesome4;content:\"\\F057\";color:#757575;vertical-align:middle}.h5p-course-presentation .h5p-close-popup:hover:before{color:#555}.h5p-course-presentation .h5p-element-inner.h5p-audio,.h5p-course-presentation .h5p-element-inner.h5p-video{background-color:#000;width:100%}.h5p-course-presentation .h5p-button-element.h5p-audio-wrapper .h5p-audio{min-height:30px}.h5p-course-presentation .h5p-button-element{margin:0 auto}.h5p-course-presentation .h5p-popup-container dl{text-align:left;border-top:1px solid #efefef}.h5p-course-presentation .h5p-popup-container dl:first-child{border:none}.h5p-course-presentation .h5p-popup-container dt{float:left;padding-right:.2em}.h5p-course-presentation .h5p-element .h5p-element-outer{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;overflow-y:auto}.h5p-course-presentation .h5p-element .h5p-element-outer.h5p-advancedtext-outer-element,.h5p-course-presentation .h5p-element .h5p-element-outer.h5p-audio-outer-element{overflow-y:hidden}.h5p-course-presentation .h5p-element .h5p-element-inner:not(.h5p-link):not(.h5p-advanced-text){position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.h5p-course-presentation .h5p-element .h5p-element-inner:not(.h5p-interactive-video){overflow:hidden;overflow-y:auto;background:transparent}.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-audio-wrapper,.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-chart,.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-ct,.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-video{overflow-y:hidden}.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-advanced-text{outline:none;padding:.375em .5em}.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-ct>.ct,.h5p-course-presentation .h5p-element .h5p-element-inner.h5p-link{padding:.375em .5em}.h5p-course-presentation .h5p-element.h5p-transparent .h5p-element-inner.h5p-advanced-text,.h5p-course-presentation .h5p-element.h5p-transparent .h5p-element-inner.h5p-ct>.ct,.h5p-course-presentation .h5p-element.h5p-transparent .h5p-element-inner.h5p-link{padding:0}.h5p-course-presentation .h5p-advanced-text p span{line-height:1.25em}.h5p-course-presentation .dragndrop .h5p-text{font-size:1em}.h5p-course-presentation .h5p-table{border-collapse:collapse}.h5p-course-presentation .h5p-table th{border-bottom:.167em solid #494949}.h5p-course-presentation .h5p-table td{border-bottom:.083em solid #494949}.h5p-course-presentation .h5p-table tr:last-child td{border-bottom:0}.h5p-course-presentation .cke_editable .h5p-table,.h5p-course-presentation .cke_editable .h5p-table td,.h5p-course-presentation .cke_editable .h5p-table th{border:.083em dashed #999}.h5p-course-presentation .h5p-ct>.ct{font-size:100%;line-height:165%}.h5p-course-presentation .ct>:last-child{margin:0}.h5p-course-presentation .h5p-copyinfo{margin:0 0 1em;padding-top:1em;font-size:.75em;line-height:1.25em}.h5p-course-presentation .h5p-copyinfo>dt{float:left;margin:0 .75em 0 0}.h5p-course-presentation .h5p-copyinfo>dt:after{content:\":\"}.h5p-course-presentation .h5p-copyinfo>dd{margin:0}.h5p-course-presentation .h5p-content-controls{visibility:hidden;position:absolute;top:0}.h5p-course-presentation .h5p-presentation-wrapper .h5p-touch-popup{display:block;position:absolute;z-index:2;padding:.5em;border-radius:.5em;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;background:#000;color:#fff}.h5p-course-presentation .h5p-toggle-full-screen{position:absolute;bottom:0;right:0;width:1em;height:1em;z-index:10;cursor:pointer;background:#aaafb3;color:#fff;outline:none;padding:.125em;line-height:1em;opacity:.6}.h5p-course-presentation .h5p-toggle-full-screen:before{font-family:H5PFontAwesome4;content:\"\\F065\"}.h5p-course-presentation.h5p-fullscreen .h5p-toggle-full-screen:before,.h5p-course-presentation.h5p-semi-fullscreen .h5p-toggle-full-screen:before{content:\"\\F066\"}.h5p-course-presentation .h5p-toggle-full-screen:focus,.h5p-course-presentation .h5p-toggle-full-screen:hover{opacity:.8}.h5p-course-presentation .h5p-toggle-full-screen:active{opacity:1}.h5p-course-presentation .h5p-chart .h5p-popup-container{height:80%}.h5p-course-presentation .h5p-chart .h5p-popup-wrapper{padding:1em;height:100%}.h5p-course-presentation .h5p-chart .h5p-button-element.h5p-chart,.h5p-course-presentation .h5p-chart .h5p-chart-chart{height:100%}.h5p-course-presentation .h5p-confirmation-dialog-popup{font-size:.85em}.h5p-course-presentation .h5p-dragquestion-editor .field-name-enableFullScreen{display:none}.h5p-course-presentation .hidden-but-read{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.h5p-course-presentation .h5p-keywords-wrapper{position:absolute;z-index:3;top:0;right:84.375%;width:31.25%;height:100%;background:#fbfbfb;background:hsla(0,0%,98%,.9);box-shadow:0 0 .15em 0 #d1d1d1;overflow:auto;visibility:hidden;opacity:0;-webkit-transition:visibility 0s linear .1s,opacity .1s linear,right .1s linear;-moz-transition:visibility 0s linear .1s,opacity .1s linear,right .1s linear;transition:visibility 0s linear .1s,opacity .1s linear,right .1s linear}.h5p-course-presentation .h5p-keywords-wrapper.h5p-open{opacity:1;right:68.75%;visibility:visible;-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s}.h5p-course-presentation .h5p-keywords-wrapper [role=menuitem]{line-height:125%}.h5p-course-presentation .h5p-keywords-wrapper [role=menuitem]>span{color:#424242;font-weight:400;display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:80%}.h5p-course-presentation .h5p-keywords-wrapper [role=menuitem]>span:focus+.joubel-icon-edit{visibility:visible}.h5p-course-presentation .h5p-keywords-wrapper [role=menuitem].h5p-editing .joubel-icon-edit{visibility:hidden}.h5p-course-presentation .h5p-keywords-wrapper [role=menuitem] .h5p-keyword-subtitle{font-size:.6em;color:#757575;letter-spacing:.2em;text-transform:uppercase}.h5p-course-presentation .h5p-sub-keyword{margin-left:1.25em;margin-top:.5em;line-height:105%;padding:0;font-size:.875em}.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]{overflow:auto;overflow-x:hidden;overflow-y:auto;height:100%}.h5p-course-presentation .h5p-element .h5p-element-outer .h5p-element-inner::-webkit-scrollbar,.h5p-course-presentation .h5p-element .h5p-element-outer::-webkit-scrollbar,.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]::-webkit-scrollbar{width:.4em}.h5p-course-presentation .h5p-element .h5p-element-outer .h5p-element-inner::-webkit-scrollbar-thumb,.h5p-course-presentation .h5p-element .h5p-element-outer::-webkit-scrollbar-thumb,.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]::-webkit-scrollbar-thumb{border-radius:.2em;background:#0097fd;box-shadow:inset 0 0 .3em rgba(0,0,0,.5)}.h5p-course-presentation .h5p-element .h5p-element-outer .h5p-element-inner::-webkit-scrollbar-thumb:hover,.h5p-course-presentation .h5p-element .h5p-element-outer::-webkit-scrollbar-thumb:hover,.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]::-webkit-scrollbar-thumb:hover{background:#22a1f9}.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]>[role=menuitem]{padding:.65em .65em .65em 1em;margin:0;border-bottom:1px solid rgba(0,0,0,.11);font-size:.65em;cursor:pointer}.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]>[role=menuitem].h5p-current{background-color:rgba(0,0,0,.04)}.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]>[role=menuitem]:hover span{color:#1d74c8}.h5p-course-presentation .h5p-keywords-wrapper>[role=menu]>[role=menuitem]:focus{outline:2px solid #79abfd;background-color:rgba(121,171,253,.2);outline-offset:-2px}.h5p-course-presentation .h5p-summary-slide{background:#fff;text-align:center;color:#333}.h5p-course-presentation .h5p-score-message,.h5p-course-presentation .h5p-summary-slide.h5p-summary-only-export{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.h5p-course-presentation .h5p-score-message{padding:1.5em 0;font-size:.8em}.h5p-course-presentation .h5p-score-message-percentage{display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.h5p-course-presentation .h5p-summary-task-title{width:60%;text-align:left;font-size:.7em}.h5p-course-presentation .h5p-summary-task-title .h5p-slide-link{color:#333;cursor:pointer;text-decoration:none}.h5p-course-presentation .h5p-summary-task-title .h5p-slide-link:visited{color:#333}.h5p-course-presentation .h5p-summary-score-bar{position:relative;overflow:hidden}.h5p-course-presentation .h5p-td.h5p-summary-score-bar{border-top-width:2px}.h5p-course-presentation .h5p-summary-score-meter{height:.4em;background:#e0e0e0}.h5p-course-presentation .h5p-summary-score-meter>span{display:block;height:100%;background-color:#096bcb}.h5p-course-presentation .h5p-summary-footer{font-size:.75em}.h5p-course-presentation .h5p-summary-table-holder{height:61%;margin:0 1em}.h5p-course-presentation .h5p-summary-table-pages{overflow:auto;max-height:85%}.h5p-course-presentation .h5p-score-table,.h5p-course-presentation .h5p-summary-total-table{width:100%;border-collapse:collapse;border-spacing:0}.h5p-course-presentation .h5p-td,.h5p-course-presentation .h5p-th{padding-right:.3em}.h5p-course-presentation .h5p-th{border-bottom:1px solid #ddd}.h5p-course-presentation .h5p-td{border-top:1px solid #ddd}.h5p-course-presentation .h5p-score-table tr:first-child .h5p-td{border-top:0}.h5p-course-presentation .h5p-summary-total-table .h5p-td.h5p-summary-task-title{border-top:2px solid #ddd}.h5p-course-presentation .h5p-td p{display:inline;color:-webkit-link;text-decoration:underline}.h5p-course-presentation .h5p-summary-facebook-message,.h5p-course-presentation .h5p-summary-google-message,.h5p-course-presentation .h5p-summary-twitter-message{cursor:pointer;font-size:.7em;padding:0 .5em;color:#999}.h5p-course-presentation .h5p-summary-facebook-message:hover,.h5p-course-presentation .h5p-summary-google-message:hover,.h5p-course-presentation .h5p-summary-twitter-message:hover{color:#096bcb}.h5p-course-presentation .h5p-summary-facebook-message>span,.h5p-course-presentation .h5p-summary-google-message>span,.h5p-course-presentation .h5p-summary-twitter-message>span{text-decoration:none}.h5p-course-presentation .h5p-summary-twitter-message:before{font-family:H5PFontAwesome4;content:\"\\F099\";padding-right:.5em}.h5p-course-presentation .h5p-summary-facebook-message:before{font-family:H5PFontAwesome4;content:\"\\F09A\";padding-right:.5em}.h5p-course-presentation .h5p-summary-google-message:before{font-family:H5PFontAwesome4;content:\"\\F0D5\";padding-right:.5em}.h5p-course-presentation .h5p-summary-slide .h5p-eta-export:before{font-family:H5PFontAwesome4;content:\"\\F0F6\";margin-right:.5em}.h5p-course-presentation .h5p-summary-slide .h5p-show-solutions:before{font-family:H5PFontAwesome4;content:\"\\F06E\";margin-right:.5em}.h5p-course-presentation .h5p-summary-slide .h5p-cp-retry-button:before{font-family:H5PFontAwesome4;content:\"\\F021\";margin-right:.5em}.h5p-course-presentation .h5p-footer{display:flex;font-size:.75em;width:100%;height:6.5%;line-height:1.88em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.h5p-course-presentation .h5p-footer .h5p-footer-button{display:inline-block;background:transparent;border:0;color:#555;cursor:pointer;height:1.4em;width:1.4em;line-height:1.4em;margin:.2em .4em;text-align:center;-webkit-transition:color .2s ease-in-out;-moz-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.h5p-course-presentation .h5p-footer .h5p-footer-left-adjusted{flex:2;text-align:left}.h5p-course-presentation .h5p-footer .h5p-footer-right-adjusted{flex:2;text-align:right}.h5p-course-presentation .h5p-footer .h5p-footer-center-adjusted{flex:1;text-align:center}.h5p-course-presentation .h5p-footer .h5p-footer-previous-slide:before{font-family:H5PFontAwesome4;content:\"\\F0D9\"}.h5p-course-presentation .h5p-footer .h5p-footer-next-slide:after{font-family:H5PFontAwesome4;content:\"\\F0DA\"}.h5p-course-presentation .h5p-footer .h5p-footer-slide-count,.h5p-course-presentation .h5p-footer .h5p-footer-slide-count-current,.h5p-course-presentation .h5p-footer .h5p-footer-slide-count-delimiter,.h5p-course-presentation .h5p-footer .h5p-footer-slide-count-max{display:inline-block}.h5p-course-presentation .h5p-footer .h5p-footer-slide-count-delimiter{padding:0 .5em}.h5p-course-presentation .h5p-footer.h5p-footer-solution-mode{background-color:#2b2c30;color:#fbfbfb}.h5p-course-presentation .h5p-footer.h5p-footer-solution-mode .h5p-footer-exit-solution-mode{display:inline-block;cursor:pointer}.h5p-course-presentation .h5p-footer .h5p-footer-exit-solution-mode,.h5p-course-presentation .h5p-footer.h5p-footer-solution-mode.summary-slide .h5p-footer-exit-solution-mode{display:none}.h5p-course-presentation .h5p-footer .h5p-footer-exit-solution-mode-text{display:inline-block;padding:0 .25em}.h5p-course-presentation .h5p-footer.h5p-footer-solution-mode .h5p-footer-button{color:#fbfbfb}.h5p-course-presentation .h5p-footer-toggle-keywords .h5p-icon-menu:before{font-family:H5PFontIcons;font-size:1.3em;content:\"\\E90B\";padding:0 0 0 .25em;-webkit-font-smoothing:antialiased}.h5p-course-presentation .h5p-footer .h5p-footer-toggle-keywords{display:inline-block;width:auto;padding-right:.4em}.h5p-course-presentation .h5p-footer .h5p-footer-toggle-keywords .current-slide-title{vertical-align:top;font-size:.9em;overflow:hidden;text-overflow:ellipsis}.h5p-course-presentation .h5p-footer .h5p-footer-toggle-keywords .current-slide-title:before{font-family:h5p;font-size:.6em;content:\"\\E565\";vertical-align:top;left:3em;display:inline-block;margin-right:1em;-ms-transform:rotate(270deg);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.h5p-course-presentation .h5p-footer [aria-expanded=true].h5p-footer-toggle-keywords .current-slide-title:before{-ms-transform:rotate(90deg);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.h5p-course-presentation .h5p-footer .h5p-footer-print:before,.h5p-course-presentation .h5p-footer .h5p-footer-toggle-full-screen:before{font-family:H5PFontAwesome4;content:\"\\F065\";font-size:1.2em}.h5p-course-presentation .h5p-footer .h5p-footer-print:before{content:\"\\F02F\"}.h5p-course-presentation .h5p-footer .h5p-footer-toggle-full-screen:before{content:\"\\F065\"}@media screen and (max-device-width:400px){.h5p-course-presentation .h5p-footer .h5p-footer-print{display:none}}.h5p-course-presentation.h5p-fullscreen .h5p-footer .h5p-footer-print,.h5p-course-presentation.h5p-semi-fullscreen .h5p-footer .h5p-footer-print{display:none}.h5p-course-presentation.h5p-fullscreen .h5p-footer .h5p-footer-toggle-full-screen:before,.h5p-course-presentation.h5p-semi-fullscreen .h5p-footer .h5p-footer-toggle-full-screen:before{content:\"\\F066\"}.h5p-course-presentation .h5p-footer.footer-full-screen button.h5p-footer-button{font-size:1em}.h5p-course-presentation .h5p-cp-navigation{width:100%;height:3.5%}.h5p-course-presentation .h5p-progressbar{width:100%;height:100%;overflow:visible;background:#999;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;box-shadow:0 0 .5em 0 hsla(0,0%,41%,.4)}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part.progressbar-part-summary-slide{-webkit-flex:0;flex:0;min-width:2.2em}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part.progressbar-part-summary-slide a{padding-top:0}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part.progressbar-part-summary-slide a:after{content:\"\";display:block;height:.8em;width:1.7em;background:transparent url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.CoursePresentation-1.17\/dist\/fonts\/summary-icon.svg) no-repeat 50%;background-size:3.4em 1.6em;margin-left:auto;margin-right:auto}.h5p-course-presentation .h5p-progressbar li{flex:1;position:relative}.h5p-course-presentation .h5p-progressbar li:not(:last-child){border-right:1px solid hsla(0,0%,100%,.3)}.h5p-course-presentation .h5p-progressbar a{position:relative;z-index:3;display:block;width:100%;height:100%;padding-top:.1em}.h5p-course-presentation .h5p-progressbar a:focus{outline:2px solid #79abfd;outline-offset:1px}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part-show{background:#0097fd;background-image:-webkit-linear-gradient(top,#0097fd,#096bcb);background-image:-moz-linear-gradient(top,#0097fd,#096bcb);background-image:linear-gradient(180deg,#0097fd,#096bcb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#0097fd\",endColorstr=\"#096bcb\",GradientType=0);-webkit-transition:width .25s ease-in-out;-moz-transition:width .25s ease-in-out;-ms-transition:width .25s ease-in-out;transition:width .25s ease-in-out}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part .h5p-progressbar-part-has-task:after{position:absolute;bottom:105%;left:50%;transform:translateX(-50%);z-index:2;padding:.1em .3em;line-height:1em;border:.1em solid;cursor:auto;font-family:H5PFontAwesome4;font-size:.6em}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part .h5p-progressbar-part-has-task.h5p-is-correct:after{content:\"\\F00C\";color:#6aa81b;background-color:#d1e2ce}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part .h5p-progressbar-part-has-task.h5p-is-wrong:after{content:\"\\F00D\";color:#c33f62;background-color:#e6ced1}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part .h5p-progressbar-part-has-task{display:block;width:.45em;height:.45em;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;border:2px solid #d3d3d3;cursor:pointer;background:transparent;margin-right:auto;margin-left:auto}.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part .h5p-progressbar-part-has-task.h5p-answered,.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part.h5p-progressbar-part-show .h5p-progressbar-part-has-task.h5p-answered{background:#d3d3d3}.h5p-course-presentation .h5p-progressbar-popup{display:none;position:absolute;bottom:100%;left:50%;transform:translateX(-50%);z-index:3;font-size:.75em;line-height:1.5em;padding:0 .3em;white-space:nowrap;background:#000;color:#fff;pointer-events:none}.h5p-course-presentation .h5p-progressbar-part:hover .h5p-progressbar-popup{display:block}.h5p-course-presentation .h5p-footer .h5p-footer-button:hover{color:#000}.h5p-course-presentation .h5p-footer .h5p-footer-button:focus{outline:2px solid #79abfd;background-color:rgba(121,171,253,.2)}.h5p-course-presentation .h5p-footer [aria-disabled=true].h5p-footer-button:after,.h5p-course-presentation .h5p-footer [aria-disabled=true].h5p-footer-button:before{color:#999}.h5p-course-presentation .h5p-footer.h5p-footer-solution-mode .h5p-footer-button{color:#dbd7d1}.h5p-slide.has-background{background-size:100% 100%}@media print{@page{size:portrait}.h5p-content .h5p-actions,.h5p-course-presentation .h5p-footer,.h5p-course-presentation .h5p-keywords-wrapper,.h5p-course-presentation .h5p-progressbar{display:none}.h5p-content{border:none}.h5p-content,.h5p-course-presentation,.h5p-course-presentation .h5p-box-wrapper,.h5p-course-presentation .h5p-presentation-wrapper{background:transparent}.h5p-course-presentation .h5p-slides-wrapper{height:100%;background:transparent}.h5p-course-presentation .h5p-slides-wrapper .h5p-slide{display:none}.h5p-course-presentation .h5p-slides-wrapper .h5p-slide.doprint{display:block;position:relative;-webkit-transform:none;transform:none;border:1px solid #ddd;page-break-after:always}.h5p-course-presentation .h5p-slide .h5p-element{overflow:visible}.h5p-course-presentation .h5p-slides-wrapper .h5p-slide:last-child{page-break-after:auto}.h5p-course-presentation .h5p-element-button-wrapper{display:none}.h5p-course-presentation .h5p-dragquestion>.h5p-inner{width:100%;height:100%}.h5p-course-presentation .h5p-summary-score-meter:before{content:attr(title);font-size:.6em;text-shadow:-1px -1px 0 #fff,1px -1px 0 #fff,-1px 1px 0 #fff,1px 1px 0 #fff;position:absolute;top:0}.h5p-course-presentation .h5p-summary-table-pages{overflow:visible}.h5p-course-presentation .h5p-summary-twitter-message{display:none}.h5p-course-presentation .summary-container li{background:#fff;transition:none}.h5p-course-presentation .h5p-element.h5p-video{background-color:#fff;text-align:center;min-height:10em}.h5p-course-presentation .h5p-element.h5p-video:before{font-family:H5PFontAwesome4;font-size:4em;color:#666;content:\"\\F03D\";display:inline-block;position:relative;top:1.5em}.h5p-course-presentation .h5p-element.h5p-video *{width:0}}.h5p-print-dialog{text-align:center}.h5p-print-dialog .h5p-inner{display:inline-block;text-align:left;height:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.h5p-print-dialog .h5p-joubelui-button{display:block;margin:1em 0 0}.h5p-print-dialog .h5p-joubelui-button:before{font-family:H5PFontAwesome4;margin-right:.5em}.h5p-print-dialog .h5p-cp-print-all-slides:before{content:\"\\F0C5\"}.h5p-print-dialog .h5p-cp-print-current-slide:before{content:\"\\F016\"}.h5p-course-presentation .h5p-go-to-slide{z-index:2}.h5p-course-presentation .h5p-press-to-go{display:block;width:100%;height:100%}.h5p-course-presentation .h5p-press-to-go:not(.h5p-visible){cursor:default}.h5p-course-presentation .h5p-press-to-go.h5p-visible:hover{background-color:rgba(5,128,226,.2)}.h5p-course-presentation .h5p-press-to-go.h5p-visible:active{background-color:rgba(5,128,226,.4)}.h5p-course-presentation .h5p-press-to-go.h5p-visible:focus{outline:2px solid #79abfd;outline-offset:-2px;box-shadow:inset 0 0 0 2px #79abfd}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.TwitterUserFeed-1.0\/twitter-user-feed.css?ver=1.0.11":"iframe[id^='twitter-widget-']{ width:100% !important;}","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Dialogcards-1.6\/css\/dialogcards.css?ver=1.6.4":".h5p-dialogcards .h5p-dialogcards-title p:first-child,\n.h5p-dialogcards .h5p-dialogcards-card-text-area p:first-child {\n  margin-top: 0;\n}\n.h5p-dialogcards .h5p-dialogcards-title  p:last-child,\n.h5p-dialogcards .h5p-dialogcards-card-text-area p:last-child {\n  margin-bottom: 0;\n}\n\n.h5p-dialogcards .h5p-dialogcards-title p,\n.h5p-dialogcards .h5p-dialogcards-card-text-area p {\n  font-size: inherit;\n  line-height: inherit;\n  margin: inherit;\n}\n\n.h5p-dialogcards-card-text-area {\n  outline: 0;\n}\n\n.h5p-dialogcards {\n  overflow: hidden;\n  position: relative;\n}\n\n.h5p-no-frame .h5p-dialogcards .h5p-dialogcards-title,\n.h5p-transparent .h5p-dialogcards .h5p-dialogcards-title {\n  padding: 0 0 0.375em 0;\n}\n\n.h5p-dialogcards .h5p-dialogcards-title {\n  padding: 1em 1em 0.375em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-title-inner {\n  font-size: 1.125em;\n}\n\n.h5p-no-frame .h5p-dialogcards .h5p-dialogcards-description,\n.h5p-transparent .h5p-dialogcards .h5p-dialogcards-description {\n  margin: 0 0 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-description {\n  margin: 0 1em 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-description > p {\n  margin: 0;\n}\n\n.h5p-dialogcards .h5p-dialogcards-footer {\n  margin: auto;\n  overflow: hidden;\n  line-height: 2.35em;\n  padding: 1em;\n  max-width: 32em;\n  position: relative;\n}\n\n.h5p-dialogcards .h5p-dialogcards-cardwrap {\n  position: absolute;\n  left: 100%;\n  width: 100%;\n  padding: 0 0.5em;\n  box-sizing: border-box;\n  visibility: hidden;\n  height: inherit;\n\n  -webkit-transition: visibility 0s 0.3s, left 300ms;\n  transition: visibility 0s 0.3s, left 300ms;\n}\n.h5p-dialogcards .h5p-dialogcards-cardwrap.h5p-dialogcards-current {\n  visibility: visible;\n  left: 0;\n\n  -webkit-transition: left 300ms;\n  transition: left 300ms;\n}\n.h5p-dialogcards .h5p-dialogcards-cardwrap.h5p-dialogcards-previous {\n  left: -100%;\n}\n\n.h5p-dialogcards .h5p-dialogcards-cardholder {\n  margin: auto;\n  text-align: center;\n  max-width: 32em;\n  height: 100%;\n  -webkit-transition: -webkit-transform 0.2s ease-in-out;\n  transition: transform 0.2s ease-in-out;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-content {\n  background: #FFF;\n  box-shadow: 0 2px 15px rgba(0,0,0,0.30);\n  padding: 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-footer {\n  height: 2.25em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-image-wrapper {\n  position: relative;\n}\n\n.h5p-dialogcards .h5p-dialogcards-image-wrapper > .h5p-dialogcards-image {\n  text-align: center;\n  max-height: 100%;\n  max-width: 100%;\n  vertical-align: bottom;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n}\n\n.h5p-dialogcards .h5p-audio-inner.hide {\n  display: none;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-text-wrapper {\n  position: relative;\n  overflow: hidden;\n  min-height: 12em;\n  text-align: center;\n}\n\n.h5p-dialogcards.h5p-text-scaling .h5p-dialogcards-card-text-wrapper {\n  height: 12em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-audio-wrapper {\n  display: block;\n  margin: 0 auto;\n  vertical-align: baseline;\n  font-size: 1.5em;\n  margin-bottom: 0.5em;\n  width: 1.5em;\n  height: 1.5em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-audio-wrapper.h5p-audio-not-supported {\n  width: 100%;\n  height: 100%;\n  color: red;\n  font-size: 1em;\n  text-align: center;\n}\n\n.h5p-dialogcards .h5p-dialogcards-audio-wrapper.h5p-audio-not-supported .h5p-audio-not-supported-icon {\n  width: 1.5em;\n  height: 1.5em;\n  padding: 0.25em;\n  margin: 0 auto 1em auto;\n  border: 2px red solid;\n  border-radius: 50%;\n}\n\n.h5p-dialogcards .h5p-dialogcards-audio-wrapper.h5p-audio-not-supported .h5p-audio-not-supported-icon span {\n  width: 100%;\n  height: 100%;\n  display: block;\n  background-image: url(https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5P.Dialogcards-1.6\/images\/no-audio.svg);\n}\n\n.h5p-dialogcards .h5p-dialogcards-audio-wrapper.hide {\n  display: none;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-text-inner {\n  position: relative;\n  height: calc(100% - 2.25em);\n  padding: 1em 1.5em;\n}\n\n.h5p-dialogcards.h5p-text-scaling .h5p-dialogcards-card-text-inner {\n  box-sizing: border-box;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-text-inner-content {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  width: 100%;\n  padding: 0 1em;\n  box-sizing: border-box;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-text {\n  display: inline-block;\n  margin: 0.5em 0;\n  height: 4.5em;\n  line-height: 1.5;\n}\n\n.h5p-dialogcards .h5p-dialogcards-card-text.hide {\n  display: none;\n}\n\n.h5p-dialogcards .h5p-dialogcards-collapse {\n  -webkit-transform: scale(0,1);\n  -ms-transform: scale(0,1);\n  transform: scale(0,1);\n}\n\n.h5p-dialogcards .h5p-dialogcards-endcomment {\n  font-size: 1em;\n  color: #666;\n  text-align: center;\n  margin: 0em 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-middle {\n  display: table-cell;\n}\n.h5p-dialogcards .h5p-dialogcards-left {\n  text-align: left;\n}\n\n.h5p-dialogcards .h5p-dialogcards-progress {\n  color: #999;\n  text-align: center;\n}\n\n.h5p-dialogcards .h5p-joubelui-button.h5p-dialogcards-turn {\n  margin: 0;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.h5p-dialogcards .h5p-dialogcards-turn:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f021\";\n}\n\n.h5p-dialogcards .h5p-joubelui-button.h5p-dialogcards-footer-button {\n  position: absolute;\n  display: inline-block;\n  margin: 0;\n}\n\n.h5p-dialogcards .h5p-dialogcards-prev {\n  left: 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-prev:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f053\";\n  margin-right: 0.2em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-next {\n  right: 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-retry {\n  right: 1em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-retry:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f01e\";\n}\n\n.h5p-dialogcards .h5p-dialogcards-next:after {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f054\";\n  margin-left: 0.2em;\n}\n\n.h5p-dialogcards .joubel-tip-container {\n  position: absolute;\n  right: 0.5em;\n  top: 0.1em;\n  font-size: 1.2em;\n}\n\n.h5p-dialogcards .h5p-dialogcards-cardwrap-set {\n  margin: auto;\n  text-align: center;\n  max-width: 32em;\n}\n\n.h5p-dialogcards .h5p-joubelui-button.h5p-dialogcards-disabled {\n  display: none;\n}\n\n\/* Audio button styling *\/\n\/*TODO: Make Audio use JoubelUI button *\/\n.h5p-dialogcards .h5p-audio-minimal-button {\n  border: none;\n  background: #1a73d9;\n  font-weight: normal;\n  padding: 0;\n  font-size: 1em;\n  width: 1.5em;\n  height: 1.5em;\n  line-height: 1.5em;\n}\n\n.h5p-dialogcards .h5p-audio-minimal-button:before {\n  font-size: 0.8em;\n  vertical-align: bottom;\n}\n\n.h5p-dialogcards .h5p-audio-minimal-button.h5p-audio-minimal-pause:before {\n  font-size: 0.6em;\n}\n\n.h5p-dialogcards .h5p-audio-minimal-button:focus,\n.h5p-dialogcards .h5p-audio-minimal-button:hover {\n  background: #1356a3;\n}\n\n.h5p-course-presentation .h5p-element .h5p-dialogcards-outer-element .h5p-element-inner.h5p-dialogcards.h5p-text-scaling {\n  overflow-y: hidden;\n}\n\n\/* Accessibility announcers, hidden from view *\/\n.h5p-dialogcards-card-side-announcer,\n.h5p-dialogcards-at-progress {\n  position: absolute;\n  height: 0;\n  width: 0;\n  overflow: hidden;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.RadioSelector-1.2\/radio-selector.css?ver=1.2.1":".h5p-radio-selector-values > .field {\n  display: none;\n  margin: 1em 0;\n}\n\n.h5p-radio-selector-values > .field.show {\n  display: block;\n}\n\n.h5p-radio-selector-label {\n  display: block;\n  margin: 0.5em 0;\n}\n\n.h5p-radio-selector-label {\n  cursor: pointer;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/styles\/cp-editor.css?ver=1.17.4":".libwrap.h5p-coursepresentation-editor {\n  margin-top: 55px;\n}\n\n.h5peditor-form .field.coursepresentation {\n  position: relative;\n}\n\n.h5p-course-presentation {\n  margin-top: 4%;\n}\n\n.h5p-course-presentation .h5p-wrapper {\n  height: 440px;\n}\n\n.h5p-course-presentation .h5p-footer {\n  line-height: 3.1em;\n}\n\n.h5p-course-presentation .h5p-slidecontrols {\n  position: absolute;\n  right: 0.25em;\n  border-radius: 0.5em;\n  bottom: -0.7em;\n  font-size: 1.3em;\n  border-top: 0;\n  text-shadow: 0 0 1em #fff;\n}\n\n.h5p-course-presentation .h5p-keywordcontrols {\n  border-top: 0;\n  text-shadow: 0 0 1em #fff;\n  float: left;\n  border-radius: 0.5em;\n  margin: 0.15em;\n  border: 1px solid #d9d9d9;\n  width: auto;\n}\n\n.h5p-course-presentation .h5p-dragnbar-li:before {\n  top: 100%;\n  font-size: 0.585em;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button {\n  display: block;\n  float: left;\n  position: relative;\n  color: #292929;\n  line-height: 0.8;\n  height: 0.9em;\n  border-radius: 0.1em;\n  border: solid 0.042em #ffffff;\n  padding: 0.25em 0.2em;\n  margin: 0.25em 0.12em;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button:hover {\n  box-shadow: 0 0 0.208em 0.042em #dcdcdc;\n  border: solid 0.042em #d8d8d8;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button:hover:after {\n  content: attr(aria-label);\n  font-size: 0.45em;\n  background-color: rgba(0, 0, 0, 0.9);\n  color: #fff;\n  z-index: 2;\n  position: absolute;\n  padding: 0 0.5em;\n  transform: translateX(-50%);\n  left: 50%;\n  line-height: 2;\n  border-radius: 4px;\n  white-space: nowrap;\n  bottom: 100%;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button:before {\n  font-family: 'H5PFontIcons';\n  color: #494949;\n\n  \/* Better Font Rendering =========== *\/\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.h5p-course-presentation .h5p-keywordcontrols-button {\n  width: auto;\n  line-height: 1.5em;\n  padding: 0.25em 0.5em;\n  height: 1.5em;\n\n  background: rgb(240,240,240); \/* Old browsers *\/\n  background: -moz-linear-gradient(top,  rgba(240,240,240,1) 1%, rgba(204,204,204,1) 100%); \/* FF3.6+ *\/\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(240,240,240,1)), color-stop(100%,rgba(204,204,204,1))); \/* Chrome,Safari4+ *\/\n  background: -webkit-linear-gradient(top,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* Chrome10+,Safari5.1+ *\/\n  background: -o-linear-gradient(top,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* Opera 11.10+ *\/\n  background: -ms-linear-gradient(top,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* IE10+ *\/\n  background: linear-gradient(to bottom,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* W3C *\/\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f0f0f0', endColorstr='#cccccc',GradientType=0 ); \/* IE6-9 *\/\n}\n\n.h5p-course-presentation .h5p-keywordcontrols-button:hover {\n  text-decoration: none;\n  background-color: #d0dfd0;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-background.active,\n.h5p-course-presentation .h5p-keywordcontrols-button:hover {\n  background: rgb(204,204,204); \/* Old browsers *\/\n  background: -moz-linear-gradient(top,  rgba(204,204,204,1) 12%, rgba(240,240,240,1) 100%); \/* FF3.6+ *\/\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(12%,rgba(204,204,204,1)), color-stop(100%,rgba(240,240,240,1))); \/* Chrome,Safari4+ *\/\n  background: -webkit-linear-gradient(top,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* Chrome10+,Safari5.1+ *\/\n  background: -o-linear-gradient(top,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* Opera 11.10+ *\/\n  background: -ms-linear-gradient(top,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* IE10+ *\/\n  background: linear-gradient(to bottom,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* W3C *\/\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#f0f0f0',GradientType=0 ); \/* IE6-9 *\/\n}\n\n.h5p-course-presentation .h5p-keywordcontrols-button:after {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f057\";\n  margin-left: 0.4em;\n  color: #c33f62;\n}\n\n.h5p-course-presentation .h5p-keywordcontrols-button:first-child {\n  border-top-left-radius: 0.5em;\n  border-bottom-left-radius: 0.5em;\n  border-left: none;\n}\n\n.h5p-course-presentation .h5p-keywordcontrols-button:first-child {\n  border-top-right-radius: 0.5em;\n  border-bottom-right-radius: 0.5em;\n  border-right: none;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-background {\n  position: relative;\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-clone:before {\n  content: \"\\e919\";\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-background:before {\n  content: \"\\e91a\";\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-sort-left:before {\n  content: \"\\e987\";\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-sort-right:before {\n  content: \"\\e988\";\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-delete:before {\n  content: \"\\e989\";\n}\n\n.h5p-course-presentation .h5p-slidecontrols-button.h5p-slidecontrols-button-add:before {\n  content: \"\\e990\";\n}\n\n.h5p-course-presentation .h5p-keywordcontrols-button:hover {\n  background-color: #edd1de;\n}\n.h5p-course-presentation .h5p-keywords-wrapper [role=\"menuitem\"] {\n  position: relative;\n}\n.h5p-course-presentation .h5p-keywords-wrapper [role=\"menuitem\"].h5p-editing {\n  box-shadow: inset 0px 0px 50px -18px rgba(0,0,0,0.3);\n}\n.h5p-course-presentation .h5p-placeholder {\n  list-style: none;\n}\n.h5p-course-presentation .h5p-keywords-wrapper textarea {\n  resize: none;\n  background: none;\n  overflow: hidden;\n  padding: 0.75em;\n  margin: -0.75em;\n  padding-right: 4.5em;\n  height: inherit;\n  font-size: inherit;\n  box-shadow: none;\n  border: none;\n  font-family: H5PDroidSans, sans-serif;\n  word-break: break-all;\n}\n.h5p-course-presentation .h5p-keywords-wrapper .h5p-current span {\n  cursor: pointer;\n}\n.h5p-course-presentation .h5p-keywords-wrapper .h5p-current span:hover {\n  color: #000;\n}\n.h5p-course-presentation .joubel-icon-edit,\n.h5p-course-presentation .joubel-icon-cancel {\n  position: absolute;\n  font-size: 1.75em;\n  line-height: inherit;\n  top: 0.8em;\n}\n.h5p-course-presentation .joubel-icon-edit,\n.h5p-course-presentation .joubel-icon-cancel {\n  right: 0.7em;\n}\n.h5p-course-presentation .joubel-icon-edit:focus .h5p-icon-circle:before,\n.h5p-course-presentation .joubel-icon-cancel:focus .h5p-icon-circle:before {\n  outline: -webkit-focus-ring-color auto 5px;\n}\n.h5p-course-presentation .h5p-moving {\n  position: absolute;\n  cursor: move;\n}\n.h5p-course-presentation .slideination {\n  height: 9.09%;\n}\n.editor.h5p-course-presentation .h5p-press-to-go {\n  position: relative;\n  box-sizing: border-box;\n  border: 2px solid rgba(255,255,255,0.7);\n}\n.editor.h5p-course-presentation .h5p-press-to-go:before {\n  content: \" \";\n  display: block;\n  position: absolute;\n  border: 2px dashed rgba(0, 0, 0, 0.7);\n  width: 100%;\n  height: 100%;\n  top: -2px;\n  left: -2px;\n}\n\n.h5p-course-presentation .h5p-element {\n  border: 1px solid transparent;\n}\n\n.h5p-course-presentation .h5p-element:focus,\n.h5p-course-presentation .h5p-element.focused {\n  outline: 0;\n}\n\n.h5p-course-presentation .h5p-element:focus .h5p-element-outer,\n.h5p-course-presentation .h5p-element.focused .h5p-element-outer {\n  outline: 1px solid #0099ff;\n}\n.h5p-course-presentation .h5p-element > div {\n  z-index: 1;\n}\n\n.h5p-course-presentation .h5p-element-remove {\n  position: absolute;\n  width: 1em;\n  height: 1em;\n  top: 0.25em;\n  right: 0.25em;\n  cursor: pointer;\n  padding: 0.05em;\n  background: #fff no-repeat url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABmJLR0QA\/wD\/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QQJDCwQx2DOtQAAARBJREFUKM91kE9Kw2AUxH+TGzQLqWbtBRqybEr3Wih4B\/\/coRvBEwh6CUEo3YemS0kv4LqgIvEI4+L7klaob\/V4b968mdF6MLoFTg1Pk7b54EjVaT403Al\/JoYhsBBe1mmeHQFnwFKwAJ0lsp+BN1BhqNYHR7GvgCJgeJRt6jTPjCuh87i4MCBY2S4kvQPTsm12sh1eD\/IM8RrZNmBA40DgedludwD9QTganSC9AOM42oCvynb71WGSPw4lAjMEnijsENJLCgb\/kcS8bJu9pDrNM9sVCqYVTQMroBDsTa8HoyGwjMz9ovtqu5K69HyZADf7nN2DAUKvaZRVYF0n4G\/gwXjWRXdYk59mZzPDvge3v046iYmbcYsaAAAAAElFTkSuQmCC);\n  background-size: 0.75em 0.75em;\n  background-position:  0.2em 0.2em;\n  opacity: 0.5;\n  filter: alpha(opacity = 50);\n}\n.h5p-course-presentation .h5p-element-remove:hover {\n  opacity: 0.9;\n  filter: alpha(opacity = 90);\n}\n.h5p-course-presentation .h5p-element-overlay {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.h5p-coursepresentation-editor .h5p-course-presentation .h5p-element {\n  overflow: visible;\n}\n\n.h5p-course-presentation .h5p-dialog-no-close .ui-dialog-titlebar-close {\n  display: none;\n}\n\n.h5p-course-presentation .ui-widget-header {\n  background: none;\n  border: none;\n}\n\n.h5p-course-presentation .ui-dialog-buttonpane {\n  border: none;\n  margin-top: 0;\n  padding: 0.25em 0.5em;\n}\n.h5p-course-presentation .ui-dialog {\n  border-radius: 0;\n  padding: 0;\n}\n.h5p-course-presentation .ui-dialog-titlebar {\n  padding: 0.5em 0.75em;\n  border-bottom: 1px solid #eee;\n  border-radius: 0;\n}\n.h5p-course-presentation .ui-dialog-content {\n  padding: 0.75em 0.75em 0;\n}\n.h5p-course-presentation .ui-dialog-content > .field.library {\n  padding: 0;\n  border: 0;\n  margin: 0;\n}\n\n.h5p-course-presentation .ui-resizable-se {\n  bottom: -5px;\n  right: -5px;\n}\n\n.h5p-course-presentation .h5p-keywords-tip {\n  width: 12.3em;\n  position: absolute;\n  top: 0;\n  padding: 1em;\n  color: #979797;\n  font-size: 0.875em;\n}\n.h5p-add-keyword:before {\n  font-family: 'H5PFontAwesome4';\n  content: \"\\f055\";\n  margin-right: 0.5em;\n}\n.h5p-add-keyword {\n  cursor: pointer;\n}\n.h5p-course-presentation .h5p-multichoice > .h5p-show-solution, .h5p-course-presentation .h5p-element .h5p-hidden-solution-btn {\n  display: block;\n}\n.h5p-course-presentation .ui-widget,\n.h5p-course-presentation .ui-widget input,\n.h5p-course-presentation .ui-widget select,\n.h5p-course-presentation .ui-widget textarea,\n.h5p-course-presentation .ui-widget button {\n  font-size: 1em;\n  font-family: 'Open Sans', sans-serif;\n}\n.h5peditor .ui-dialog .ui-dialog-content {\n  position: static;\n}\n.h5peditor .ui-dialog .ui-button {\n  font-size: 0.75em;\n  padding: 0.2em 1.2em;\n  box-shadow: none;\n  border: 1px solid #ccc;\n  border-radius: 0.25em;\n  color: #333;\n  cursor: pointer;\n  background: #f2f2f2;\n  background: -webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -moz-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -ms-linear-gradient(top,#fff 0,#f2f2f2 100%);\n  background: -o-linear-gradient(top,#fff 0,#f2f2f2 100%);\n}\n.h5peditor .ui-dialog .ui-button.h5p-done {\n  color: #fff;\n  background: #3673B5;\n  background: -webkit-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -moz-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -ms-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  background: -o-linear-gradient(top,#5A94D3 0,#3673B5 100%);\n  border-color: #20588F;\n}\n.h5peditor .ui-dialog .ui-button.h5p-done:hover {\n  background: #3275bc;\n  background: -webkit-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -moz-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -ms-linear-gradient(top,#3275bc 0,#285585 100%);\n  background: -o-linear-gradient(top,#3275bc 0,#285585 100%);\n}\n.h5peditor .ui-dialog .ui-button.h5p-remove {\n  background: none;\n  border: none;\n  color: #a00;\n  padding: 0;\n  border-radius: 0;\n}\n.h5peditor .ui-dialog .ui-button.h5p-remove:hover {\n  background: none;\n  border: none;\n  color: #e40000;\n}\n.h5peditor .ui-dialog .ui-button:hover {\n  background: #ededed;\n}\n.h5peditor .ui-dialog .ui-button:focus {\n  box-shadow: 0 0 0.25em 0.125em #53a0ff;\n  outline: none;\n}\n.h5peditor .h5p-active-surface {\n  margin-bottom: 6%;\n}\n.h5peditor .h5p-active-surface .h5p-box-wrapper {\n  height: 100%;\n}\n.h5peditor .h5p-active-surface .h5p-slidecontrols {\n  bottom: -1.9em;\n}\n.h5peditor .field.disabled,\n.h5peditor .field.disabled .h5peditor-field-description {\n  color: #9b9b9b;\n}\n\n.h5p-coursepresentation-editor .h5p-element.h5p-element-button-wrapper.focused {\n  outline: 1px solid #0099ff;\n  outline-offset: -1px;\n}\n\n.h5p-coursepresentation-editor .h5p-element.h5p-element-button-wrapper .h5p-element-button {\n  transition: none;\n}\n\n.h5p-coursepresentation-editor .h5p-element.h5p-element-button-wrapper .h5p-element-button:hover {\n  -webkit-transform: none;\n  transform: none;\n}\n\n.h5p-coursepresentation-editor .h5p-course-presentation a.h5p-element-button:focus {\n  -webkit-box-shadow: 0.15em 0.25em 0.25em 0 #191919;\n  -moz-box-shadow: 0.15em 0.25em 0.25em 0 #191919;\n  box-shadow: 0.15em 0.25em 0.25em 0 #191919;\n}\n\n.h5p-coursepresentation-editor .h5p-course-presentation .h5p-element.h5p-element-button-wrapper:focus,\n.h5p-coursepresentation-editor .h5p-course-presentation .h5p-element.h5p-element-button-wrapper.focused {\n  border: 0;\n}\n\n.field-name-presentation > .h5peditor-label-wrapper {\n  display: none;\n}\n\n.h5p-coursepresentation-editor .h5p-progressbar {\n  background-color: #fff;\n}\n\n.h5p-coursepresentation-editor .h5p-progressbar-part {\n  position: relative;\n  margin: 0 1px;\n}\n.editor.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part,\n.editor.h5p-course-presentation .h5p-progressbar .h5p-progressbar-part-show {\n  transition: transform 0.3s linear;\n}\n\n.h5p-coursepresentation-editor .h5p-progressbar-part:first-child {\n  margin-left: 0;\n}\n\n.h5p-coursepresentation-editor .h5p-progressbar-part:last-child {\n  margin-right: 0;\n}\n\n.h5p-coursepresentation-editor .h5p-progressbar-part-selected {\n  z-index: 1;\n}\n\n.h5p-coursepresentation-editor .h5p-progressbar-part:not(.h5p-progressbar-part-selected) {\n  background: #999;\n}\n\n.h5p-coursepresentation-editor .h5p-hidden2 {\n  display: none;\n}\n\n.h5p-coursepresentation-editor .field-name-displayAsButton {\n  float: left;\n  margin-top: 0;\n}\n\n.h5p-coursepresentation-editor .field-name-buttonSize {\n  float: left;\n  margin-top: -0.7em;\n  margin-left: 3em;\n}\n\n.h5p-coursepresentation-editor .field-name-buttonSize label {\n  display: inline-block;\n  margin-right: 0.5em;\n}\n\n.h5p-coursepresentation-editor .h5p-hidden {\n  visibility: hidden;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/styles\/slide-selector.css?ver=1.17.4":".h5p-background-selector {\n  height: 100%;\n}\n\n.h5p-background-selector-content-wrapper {\n  overflow: hidden;\n  overflow-y: auto;\n  height: calc(100% - 4.35em);\n}\n\n.h5p-settings-wrapper {\n  position: absolute;\n  top: 0;\n  right: 0;\n  height: 100%;\n  width: 14em;\n  z-index: 3;\n  background: #FFF;\n  font-size: 1rem;\n  border: 1px solid #ccc;\n  box-shadow: 0 0 0.15em 0 #d1d1d1;\n\n  -webkit-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n  opacity: 1;\n  visibility: visible;\n\n  -webkit-transition: visibility 0s linear 0s, transform 0.2s, opacity 0.2s ease-in;\n  transition: visibility 0s linear 0s, transform 0.2s, opacity 0.2s ease-in;\n}\n\n.h5p-settings-wrapper.hidden {\n  visibility: hidden;\n  opacity: 0;\n\n  -webkit-transform: translateX(100%);\n  -ms-transform: translateX(100%);\n  transform: translateX(100%);\n\n  -webkit-transition: visibility 0s linear 0.2s, transform 0.2s, opacity 0.2s ease-in;\n  transition: visibility 0s linear 0.2s, transform 0.2s, opacity 0.2s ease-in;\n}\n\n.h5p-slide-selector-option {\n  position: relative;\n  display: inline-block;\n  cursor: pointer;\n  text-align: center;\n  box-sizing: border-box;\n  border-bottom: 1px solid #eee;\n  color: #323232;\n  font-size: 0.875em;\n  padding: 0.5em;\n}\n\n.h5p-course-presentation a.h5p-slide-selector-option:focus {\n  outline: rgb(94, 158, 214) auto 5px;\n}\n\n.h5p-slide-selector-option:hover,\n.h5p-slide-selector-option.active {\n  color: #3973b0;\n}\n\n.h5p-slide-selector-option:hover:after,\n.h5p-slide-selector-option.active:after {\n  content: \"\";\n  position: absolute;\n  width: 60%;\n  height: 100%;\n  border-bottom: solid #3973b0 1px;\n  top: 0;\n  left: 50%;\n  -webkit-transform: translateX(-50%);\n  -ms-transform: translateX(-50%);\n  transform: translateX(-50%);\n}\n\n.h5p-slide-selector-content {\n  display: none;\n  font-size: 0.875em;\n}\n\n.h5p-slide-selector-content.show {\n  display: block;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/styles\/bg-selector.css?ver=1.17.4":"\n.h5p-bg-selector {\n  display: none;\n  padding: 0.5em;\n}\n\n.h5p-bg-selector.show {\n  display: block;\n}\n\n.h5p-bg-selector .field.select select {\n  max-width: 100%;\n}\n\n.h5peditor button.h5p-background-selector-reset {\n  display: none;\n  font-size: 1em;\n  padding: 0.5em 1.6em;\n}\n\n.h5peditor button.h5p-background-selector-reset.show {\n  display: block;\n}\n\n.h5p-background-selector-title {\n  color: #323232;\n  background-color: #f4f4f4;\n  font-size: 1em;\n  padding: 0.5em 0.75em;\n  border-bottom: 1px solid #ccc;\n}\n\n.h5p-background-selector-close {\n  float: right;\n  color: #757575;\n  cursor: pointer;\n}\n\n.h5p-background-selector-close:hover {\n  color: #555;\n}\n\n.h5p-background-selector-close:after {\n  content: \"\\f057\";\n  font-family: 'H5PFontAwesome4';\n}\n\n.h5p-radio-selector-values .field.h5p-color-selector {\n  margin: 1.5em 0 -0.5em;\n}\n\n.h5p-radio-selector-values .sp-container {\n  border: 0;\n  background-color: transparent;\n  margin-left: -0.5em;\n}\n\n.h5p-radio-selector-values .thumbnail > img {\n  max-height: 100px;\n  height: auto;\n  max-width: 10em;\n}\n\n.h5p-bg-selector-description {\n  padding: 0.25em 0 0.5em;\n  font-size: 10px;\n  color: #555555;\n}\n\n.h5p-radio-selector-values > .field {\n  position: inherit;\n}\n.h5p-radio-selector-values > .field > .h5p-editor-dialog {\n  top: 0;\n  margin: 0;\n  right: 0;\n  overflow-y: auto;\n  height: 100%;\n}\n","https:\/\/opleiden.syntra-ab.be\/moodle\/pluginfile.php\/1\/mod_hvp\/libraries\/H5PEditor.CoursePresentation-1.17\/styles\/toolbar.css?ver=1.17.4":".h5p-dragnbar {\n  height: 7%;\n  background: transparent;\n  position: absolute;\n  top: -7%;\n  left: 0;\n  width: 100%;\n  padding: 0 0.5em;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n}\n\n.h5p-dragnbar .h5p-dragnbar-ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  height: 100%;\n}\n\n.h5p-dragnbar-ul {\n  float: right;\n}\n\n.h5p-dragnbar-li {\n  float: left;\n  margin: 0;\n  padding: 0;\n  border-right: 1px solid #ccc;\n  border-left: 1px solid #eee;\n  height: 100%;\n\n  background: rgb(240,240,240); \/* Old browsers *\/\n  background: -moz-linear-gradient(top,  rgba(240,240,240,1) 1%, rgba(204,204,204,1) 100%); \/* FF3.6+ *\/\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(240,240,240,1)), color-stop(100%,rgba(204,204,204,1))); \/* Chrome,Safari4+ *\/\n  background: -webkit-linear-gradient(top,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* Chrome10+,Safari5.1+ *\/\n  background: -o-linear-gradient(top,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* Opera 11.10+ *\/\n  background: -ms-linear-gradient(top,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* IE10+ *\/\n  background: linear-gradient(to bottom,  rgba(240,240,240,1) 1%,rgba(204,204,204,1) 100%); \/* W3C *\/\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f0f0f0', endColorstr='#cccccc',GradientType=0 ); \/* IE6-9 *\/\n}\n\n.h5p-coursepresentation-editor .h5p-dragnbar-li {\n  position: relative;\n}\n\n.h5p-dragnbar-li:hover {\n  background: rgb(204,204,204); \/* Old browsers *\/\n  background: -moz-linear-gradient(top,  rgba(204,204,204,1) 12%, rgba(240,240,240,1) 100%); \/* FF3.6+ *\/\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(12%,rgba(204,204,204,1)), color-stop(100%,rgba(240,240,240,1))); \/* Chrome,Safari4+ *\/\n  background: -webkit-linear-gradient(top,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* Chrome10+,Safari5.1+ *\/\n  background: -o-linear-gradient(top,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* Opera 11.10+ *\/\n  background: -ms-linear-gradient(top,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* IE10+ *\/\n  background: linear-gradient(to bottom,  rgba(204,204,204,1) 12%,rgba(240,240,240,1) 100%); \/* W3C *\/\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#f0f0f0',GradientType=0 ); \/* IE6-9 *\/\n}\n\n.h5p-dragnbar-li:first-child {\n  border-left: 0;\n  border-top-left-radius: 0.5em;\n}\n\n.h5p-dragnbar-li:last-child {\n  border-right: 0;\n  border-top-right-radius: 0.5em;\n}\n\n.h5p-dragnbar-li:last-child {\n  border-right: 0;\n  border-top-right-radius: 0.5em;\n}\n\n.h5p-dragnbar-a {\n  line-height: 1em;\n  display: block;\n  width: 1.4em;\n  padding: 0.3em;\n  color: #000;\n}\n\n.h5p-dragnbar-a:hover {\n  text-decoration: none;\n}\n.h5p-dragnbar-left {\n  float: left;\n}\n.h5p-dragnbar-left > .h5p-dragnbar-li:first-child {\n  border-left: 0;\n  border-right: 1px solid #ccc;\n  border-top-left-radius: 0.5em;\n}\n.h5p-dragnbar-left > .h5p-dragnbar-li:last-child {\n  border-left: 1px solid #eee;\n  border-top-right-radius: 0.5em;\n}\n\n.h5p-dragnbar-a {\n  font-family: H5PCoursePresentation;\n  color: #494949;\n}\n.h5p-dragnbar-a:before {\n  font-size: 1.2em;\n}\n.h5p-dragnbar-advancedtext-button:before {\n  content: \"\\e997\";\n  font-size: 1.6em;\n}\n\/* FontAwesome4 icons *\/\n.h5p-dragnbar-table-button:before,\n.h5p-dragnbar-link-button:before,\n.h5p-dragnbar-image-button:before,\n.h5p-dragnbar-audio-button:before,\n.h5p-dragnbar-video-button:before,\n.h5p-dragnbar-more-button:before,\n.h5p-dragnbar-appearin-button:before,\n.h5p-dragnbar-twitteruserfeed-button:before,\n.h5p-dragnbar-interactivevideo-button:before,\n.h5p-dragnbar-chart-button:before {\n  font-family: 'H5PFontAwesome4';\n  color: #494949;\n  font-size: 1.1em;\n  vertical-align: top;\n}\n.h5p-dragnbar-table-button:before {\n  content: \"\\f0ce\";\n}\n.h5p-dragnbar-link-button:before {\n  content: \"\\f0c1\";\n}\n.h5p-dragnbar-image-button:before {\n  content: \"\\f03e\";\n}\n.h5p-dragnbar-audio-button:before {\n  content: \"\\f028\";\n}\n.h5p-dragnbar-video-button:before {\n  content: \"\\f008\";\n}\n.h5p-dragnbar-twitteruserfeed-button:before {\n  content: \"\\f099\";\n}\n.h5p-dragnbar-appearin-button:before {\n  content: \"\\f086\";\n}\n.h5p-dragnbar-more-button:before {\n  content: \"\\f067\";\n  font-size: 1em;\n}\n.h5p-dragnbar-interactivevideo-button:before {\n  content: \"\\f03d\";\n  vertical-align: middle;\n}\n.h5p-dragnbar-chart-button:before {\n  content: \"\\f200\";\n}\n\/* H5P specific icons *\/\n.h5p-dragnbar-dragquestion-button:before {\n  content: \"\\e991\";\n}\n.h5p-dragnbar-blanks-button:before {\n  content: \"\\e994\";\n}\n.h5p-dragnbar-multichoice-button:before {\n  content: \"\\e603\";\n}\n.h5p-dragnbar-truefalse-button:before {\n  font-family: 'H5PFontIcons';\n  content: \"\\e902\";\n}\n.h5p-dragnbar-summary-button:before {\n  content: \"\\e992\";\n}\n.h5p-dragnbar-continuoustext-button:before {\n  content: \"\\e996\";\n}\n.h5p-dragnbar-exportabletextarea-button:before {\n  content: \"\\e995\";\n  font-size: 1.3em;\n  vertical-align: middle;\n}\n.h5p-dragnbar-markthewords-button:before {\n  content: \"\\e601\";\n  font-size: 1.4em;\n}\n.h5p-dragnbar-dragtext-button:before {\n  content: \"\\e600\";\n  font-size: 1.4em;\n}\n.h5p-dragnbar-gotoslide-button:before {\n  content: \"\\e602\";\n}\n.h5p-dragnbar-singlechoiceset-button:before {\n  content: \"\\e993\";\n}\n.h5p-dragnbar-dialogcards-button:before {\n  content: \"\\e900\";\n}\n\n.h5p-dragnbar-li-ul {\n  padding: 0;\n  list-style: none;\n  position: absolute;\n  top: 1.7em;\n  right: 0;\n  z-index: 2;\n  display: none;\n  \/* Remove the whitespace between more button and dropdown menu *\/\n  margin-top: -0.06em;\n}\n\n.h5p-dragnbar-li-ul .h5p-dragnbar-li {\n  float: none;\n  height: 2em;\n  box-sizing: border-box;\n  border-left: 0;\n  \/* Borders around the drop down buttons *\/\n  border-left: 1px solid #f7f0f9;\n  border-bottom: 1px solid #f7f0f9;\n  border-right: 1px solid #f7f0f9;\n  \/* Remove the whitespace between buttons in the dropdown menu *\/\n  margin-top: -0.04em;\n  padding: 0.2em 0 0 0;\n}\n\/* Remove top-left rounding of corner for drop down buttons *\/\n.h5p-dragnbar-li-ul .h5p-dragnbar-li:first-child {\n  border-top-left-radius: 0em;\n}\n\n\/* Change the rounding of the last drop down button to be rounded downwards *\/\n.h5p-dragnbar-li-ul .h5p-dragnbar-li:last-child {\n  border-top-right-radius: 0em;\n  border-bottom-left-radius: 0.5em;\n  border-bottom-right-radius: 0.5em;\n}\n.h5p-dragnbar-li-ul .h5p-dragnbar-a {\n  height: 1em;\n}\n\n\/* Rules for vertical menu buttons when they are in the horizontal menu *\/\nul:not(.h5p-dragnbar-li-ul) > .h5p-dragnbar-li > a.h5p-dragnbar-interactivevideo-button:before {\n  vertical-align: bottom;\n}\n\nul:not(.h5p-dragnbar-li-ul) > .h5p-dragnbar-li > a.h5p-dragnbar-table-button:before,\nul:not(.h5p-dragnbar-li-ul) > .h5p-dragnbar-li > a.h5p-dragnbar-exportabletextarea-button:before,\nul:not(.h5p-dragnbar-li-ul) > .h5p-dragnbar-li > a.h5p-dragnbar-markthewords-button:before {\n  vertical-align: super;\n}\n\nul:not(.h5p-dragnbar-li-ul) > .h5p-dragnbar-li > a.h5p-dragnbar-dialogcards-button:before {\n  font-size: 1.0em;\n  vertical-align: baseline;\n}\n.h5p-dragnbar-keywords {\n  width: auto;\n  border-radius: 0.2em 0.2em 0 0;\n  cursor: pointer;\n  z-index: 3;\n  position: relative;\n  outline: none;\n  padding: 0.15em 0.5em;\n}\n.h5p-dragnbar-keywords.h5p-open {\n  background-color: white;\n  box-shadow: 0 0px 5px 2px rgba(105, 105, 105, 0.4);\n}\n.h5p-dragnbar-keywords span {\n  font-size: 0.6em;\n  font-weight: bold;\n  vertical-align: middle;\n  color: #4a4a4a;\n}\n.h5p-dragnbar-keywords:before {\n  font-family: 'H5PFontIcons';\n  content: '\\e90b';\n  margin-right: 0.25em;\n  -webkit-font-smoothing: antialiased;\n  top: 0.1em;\n  position: relative;\n}\n.h5p-dragnbar-keywords:after {\n  font-family: 'h5p';\n  content: '\\e565';\n  margin-left: 0.5em;\n  vertical-align: middle;\n  font-size: 0.6em;\n}\n.h5p-dragnbar-keywords.h5p-open:after {\n  display: inline-block;\n  -ms-transform: rotate(180deg);\n  -webkit-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.h5p-keywords-dropdown {\n  position: absolute;\n  z-index: 2;\n  top: 1.4em;\n  width: 100%;\n  max-width: 6.5em;\n  background: #fff;\n  box-shadow: 0 0px 5px 2px rgba(105, 105, 105, 0.4);\n  padding: 0.25em 0.5em 0.5em;\n  visibility: hidden;\n  overflow: auto;\n  overflow-x: hidden;\n  overflow-y: auto;\n  text-align: left;\n  border-radius: 0 0.2em 0.2em 0.2em;\n}\n.h5p-keywords-dropdown.h5p-open {\n  visibility: visible;\n}\n.h5p-keywords-dropdown > label {\n  display: block;\n  white-space: nowrap;\n  font-size: 0.6em;\n  padding: 0.5em 0.6em;\n  color: #4a4a4a;\n}\n.h5p-keywords-dropdown .h5p-keywords-hide.h5p-disabled {\n  opacity: 0.6;\n}\n.h5p-keywords-dropdown input[type=\"text\"],\n.h5p-keywords-dropdown input[type=\"checkbox\"] {\n  vertical-align: middle;\n}\n.h5p-keywords-dropdown input[type=\"checkbox\"] {\n  margin-right: 0.8em;\n}\n.h5p-keywords-dropdown input[type=\"text\"] {\n  width: 2em;\n  font-weight: bold;\n  color: #4a4a4a;\n  padding: 0.5em;\n  font-size: 0.9em;\n  border-radius: 0.5em;\n  border-style: solid;\n  border-width: 1px;\n}\n.h5p-keywords-dropdown .h5peditor-button {\n  width: 100%;\n  color: #181818;\n  background: #d5d5d5;\n  text-align: center;\n}\n.h5p-dragnbar-ul .h5p-slides-menu {\n  overflow: hidden;\n  padding: 3px 3px 0px 3px;\n  margin-top: -0.4em;\n}\n"}}