');\n if (labels.length > 0) {\n node.append(\n $('')\n .text(labels[rowId])\n .attr('scope', 'row')\n );\n }\n for (var serieId = 0; serieId < series.length; serieId++) {\n value = series[serieId].getValues()[rowId];\n seriesLabels = series[serieId].getLabels();\n if (seriesLabels !== null) {\n value = series[serieId].getLabels()[rowId];\n }\n node.append($(' ').text(value));\n }\n tbl.append(node);\n }\n\n return tbl;\n };\n\n /** @override */\n Output.prototype.update = function() {\n this._build();\n };\n\n return Output;\n\n});\n"],"file":"chart_output_htmltable.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/chart_output_htmltable.js"],"names":["define","$","Base","Output","prototype","constructor","apply","arguments","_build","Object","create","_node","empty","append","_makeTable","tbl","c","_chart","node","value","labels","getLabels","hasLabel","length","series","getSeries","seriesLabels","rowCount","getCount","addClass","getTitle","text","forEach","serie","getLabel","attr","rowId","serieId","getValues","update"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Chart output for HTML table.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_htmltable\n */\ndefine([\n 'jquery',\n 'core/chart_output_base',\n], function($, Base) {\n\n /**\n * Render a chart as an HTML table.\n *\n * @class\n * @extends {module:core/chart_output_base}\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Attach the table to the document.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._node.empty();\n this._node.append(this._makeTable());\n };\n\n /**\n * Builds the table node.\n *\n * @protected\n * @return {Jquery}\n */\n Output.prototype._makeTable = function() {\n var tbl = $(''),\n c = this._chart,\n node,\n value,\n labels = c.getLabels(),\n hasLabel = labels.length > 0,\n series = c.getSeries(),\n seriesLabels,\n rowCount = series[0].getCount();\n\n // Identify the table.\n tbl.addClass('chart-output-htmltable generaltable');\n\n // Set the caption.\n if (c.getTitle() !== null) {\n tbl.append($('').text(c.getTitle()));\n }\n\n // Write the column headers.\n node = $(' ');\n if (hasLabel) {\n node.append($(''));\n }\n series.forEach(function(serie) {\n node.append(\n $(' ')\n .text(serie.getLabel())\n .attr('scope', 'col')\n );\n });\n tbl.append(node);\n\n // Write rows.\n for (var rowId = 0; rowId < rowCount; rowId++) {\n node = $(' ');\n if (labels.length > 0) {\n node.append(\n $('')\n .text(labels[rowId])\n .attr('scope', 'row')\n );\n }\n for (var serieId = 0; serieId < series.length; serieId++) {\n value = series[serieId].getValues()[rowId];\n seriesLabels = series[serieId].getLabels();\n if (seriesLabels !== null) {\n value = series[serieId].getLabels()[rowId];\n }\n node.append($(' ').text(value));\n }\n tbl.append(node);\n }\n\n return tbl;\n };\n\n /** @override */\n Output.prototype.update = function() {\n this._build();\n };\n\n return Output;\n\n});\n"],"file":"chart_output_htmltable.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/chart_pie.min.js.map b/lib/amd/build/chart_pie.min.js.map
index 5af7778395b..6216ff5293c 100644
--- a/lib/amd/build/chart_pie.min.js.map
+++ b/lib/amd/build/chart_pie.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/chart_pie.js"],"names":["define","Base","Pie","prototype","constructor","apply","arguments","Object","create","TYPE","_doughnut","Klass","data","chart","setDoughnut","doughnut","addSeries","series","getColor","colors","configColorSet","getConfigColorSet","COLORSET","i","getCount","push","length","setColors","getDoughnut","_validateSeries","_series","Error"],"mappings":"AAsBAA,OAAM,kBAAC,CAAC,iBAAD,CAAD,CAAsB,SAASC,CAAT,CAAe,CASvC,QAASC,CAAAA,CAAT,EAAe,CACXD,CAAI,CAACE,SAAL,CAAeC,WAAf,CAA2BC,KAA3B,CAAiC,IAAjC,CAAuCC,SAAvC,CACH,CACDJ,CAAG,CAACC,SAAJ,CAAgBI,MAAM,CAACC,MAAP,CAAcP,CAAI,CAACE,SAAnB,CAAhB,CAGAD,CAAG,CAACC,SAAJ,CAAcM,IAAd,CAAqB,KAArB,CAQAP,CAAG,CAACC,SAAJ,CAAcO,SAAd,CAA0B,IAA1B,CAGAR,CAAG,CAACC,SAAJ,CAAcK,MAAd,CAAuB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CACzC,GAAIC,CAAAA,CAAK,CAAGZ,CAAI,CAACE,SAAL,CAAeK,MAAf,CAAsBH,KAAtB,CAA4B,IAA5B,CAAkCC,SAAlC,CAAZ,CACAO,CAAK,CAACC,WAAN,CAAkBF,CAAI,CAACG,QAAvB,EACA,MAAOF,CAAAA,CACV,CAJD,CAWAX,CAAG,CAACC,SAAJ,CAAca,SAAd,CAA0B,SAASC,CAAT,CAAiB,CACvC,GAA0B,IAAtB,GAAAA,CAAM,CAACC,QAAP,EAAJ,CAAgC,CAG5B,OAFIC,CAAAA,CAAM,CAAG,EAEb,CADIC,CAAc,CAAG,KAAKC,iBAAL,IAA4BpB,CAAI,CAACE,SAAL,CAAemB,QAChE,CAASC,CAAC,CAAG,CAAb,CAAgBA,CAAC,CAAGN,CAAM,CAACO,QAAP,EAApB,CAAuCD,CAAC,EAAxC,CAA4C,CACxCJ,CAAM,CAACM,IAAP,CAAYL,CAAc,CAACG,CAAC,CAAGH,CAAc,CAACM,MAApB,CAA1B,CACH,CACDT,CAAM,CAACU,SAAP,CAAiBR,CAAjB,CACH,CACD,MAAOlB,CAAAA,CAAI,CAACE,SAAL,CAAea,SAAf,CAAyBX,KAAzB,CAA+B,IAA/B,CAAqCC,SAArC,CACV,CAVD,CAkBAJ,CAAG,CAACC,SAAJ,CAAcyB,WAAd,CAA4B,UAAW,CACnC,MAAO,MAAKlB,SACf,CAFD,CAUAR,CAAG,CAACC,SAAJ,CAAcW,WAAd,CAA4B,SAASC,CAAT,CAAmB,CAC3C,KAAKL,SAAL,GAAyBK,CAC5B,CAFD,CAYAb,CAAG,CAACC,SAAJ,CAAc0B,eAAd,CAAgC,UAAW,CACvC,GAA2B,CAAvB,OAAKC,OAAL,CAAaJ,MAAjB,CAA8B,CAC1B,KAAM,IAAIK,CAAAA,KAAJ,CAAU,oCAAV,CACT,CACD,MAAO9B,CAAAA,CAAI,CAACE,SAAL,CAAe0B,eAAf,CAA+BxB,KAA/B,CAAqC,IAArC,CAA2CC,SAA3C,CACV,CALD,CAOA,MAAOJ,CAAAA,CAEV,CAtFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Chart pie.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_pie\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Pie chart.\n *\n * @class\n * @alias module:core/chart_pie\n * @extends {module:core/chart_base}\n */\n function Pie() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Pie.prototype = Object.create(Base.prototype);\n\n /** @override */\n Pie.prototype.TYPE = 'pie';\n\n /**\n * Whether the chart should be displayed as doughnut or not.\n *\n * @type {Bool}\n * @protected\n */\n Pie.prototype._doughnut = null;\n\n /** @override */\n Pie.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setDoughnut(data.doughnut);\n return chart;\n };\n\n /**\n * Overridden to add appropriate colors to the series.\n *\n * @override\n */\n Pie.prototype.addSeries = function(series) {\n if (series.getColor() === null) {\n var colors = [];\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n for (var i = 0; i < series.getCount(); i++) {\n colors.push(configColorSet[i % configColorSet.length]);\n }\n series.setColors(colors);\n }\n return Base.prototype.addSeries.apply(this, arguments);\n };\n\n /**\n * Get whether the chart should be displayed as doughnut or not.\n *\n * @method getDoughnut\n * @returns {Bool}\n */\n Pie.prototype.getDoughnut = function() {\n return this._doughnut;\n };\n\n /**\n * Set whether the chart should be displayed as doughnut or not.\n *\n * @method setDoughnut\n * @param {Bool} doughnut True for doughnut type, false for pie.\n */\n Pie.prototype.setDoughnut = function(doughnut) {\n this._doughnut = Boolean(doughnut);\n };\n\n /**\n * Validate a series.\n *\n * Overrides parent implementation to validate that there is only\n * one series per chart instance.\n *\n * @override\n */\n Pie.prototype._validateSeries = function() {\n if (this._series.length >= 1) {\n throw new Error('Pie charts only support one serie.');\n }\n return Base.prototype._validateSeries.apply(this, arguments);\n };\n\n return Pie;\n\n});\n"],"file":"chart_pie.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/chart_pie.js"],"names":["define","Base","Pie","prototype","constructor","apply","arguments","Object","create","TYPE","_doughnut","Klass","data","chart","setDoughnut","doughnut","addSeries","series","getColor","colors","configColorSet","getConfigColorSet","COLORSET","i","getCount","push","length","setColors","getDoughnut","_validateSeries","_series","Error"],"mappings":"AAsBAA,OAAM,kBAAC,CAAC,iBAAD,CAAD,CAAsB,SAASC,CAAT,CAAe,CAQvC,QAASC,CAAAA,CAAT,EAAe,CACXD,CAAI,CAACE,SAAL,CAAeC,WAAf,CAA2BC,KAA3B,CAAiC,IAAjC,CAAuCC,SAAvC,CACH,CACDJ,CAAG,CAACC,SAAJ,CAAgBI,MAAM,CAACC,MAAP,CAAcP,CAAI,CAACE,SAAnB,CAAhB,CAGAD,CAAG,CAACC,SAAJ,CAAcM,IAAd,CAAqB,KAArB,CAQAP,CAAG,CAACC,SAAJ,CAAcO,SAAd,CAA0B,IAA1B,CAGAR,CAAG,CAACC,SAAJ,CAAcK,MAAd,CAAuB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CACzC,GAAIC,CAAAA,CAAK,CAAGZ,CAAI,CAACE,SAAL,CAAeK,MAAf,CAAsBH,KAAtB,CAA4B,IAA5B,CAAkCC,SAAlC,CAAZ,CACAO,CAAK,CAACC,WAAN,CAAkBF,CAAI,CAACG,QAAvB,EACA,MAAOF,CAAAA,CACV,CAJD,CAWAX,CAAG,CAACC,SAAJ,CAAca,SAAd,CAA0B,SAASC,CAAT,CAAiB,CACvC,GAA0B,IAAtB,GAAAA,CAAM,CAACC,QAAP,EAAJ,CAAgC,CAG5B,OAFIC,CAAAA,CAAM,CAAG,EAEb,CADIC,CAAc,CAAG,KAAKC,iBAAL,IAA4BpB,CAAI,CAACE,SAAL,CAAemB,QAChE,CAASC,CAAC,CAAG,CAAb,CAAgBA,CAAC,CAAGN,CAAM,CAACO,QAAP,EAApB,CAAuCD,CAAC,EAAxC,CAA4C,CACxCJ,CAAM,CAACM,IAAP,CAAYL,CAAc,CAACG,CAAC,CAAGH,CAAc,CAACM,MAApB,CAA1B,CACH,CACDT,CAAM,CAACU,SAAP,CAAiBR,CAAjB,CACH,CACD,MAAOlB,CAAAA,CAAI,CAACE,SAAL,CAAea,SAAf,CAAyBX,KAAzB,CAA+B,IAA/B,CAAqCC,SAArC,CACV,CAVD,CAkBAJ,CAAG,CAACC,SAAJ,CAAcyB,WAAd,CAA4B,UAAW,CACnC,MAAO,MAAKlB,SACf,CAFD,CAUAR,CAAG,CAACC,SAAJ,CAAcW,WAAd,CAA4B,SAASC,CAAT,CAAmB,CAC3C,KAAKL,SAAL,GAAyBK,CAC5B,CAFD,CAYAb,CAAG,CAACC,SAAJ,CAAc0B,eAAd,CAAgC,UAAW,CACvC,GAA2B,CAAvB,OAAKC,OAAL,CAAaJ,MAAjB,CAA8B,CAC1B,KAAM,IAAIK,CAAAA,KAAJ,CAAU,oCAAV,CACT,CACD,MAAO9B,CAAAA,CAAI,CAACE,SAAL,CAAe0B,eAAf,CAA+BxB,KAA/B,CAAqC,IAArC,CAA2CC,SAA3C,CACV,CALD,CAOA,MAAOJ,CAAAA,CAEV,CArFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Chart pie.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_pie\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Pie chart.\n *\n * @class\n * @extends {module:core/chart_base}\n */\n function Pie() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Pie.prototype = Object.create(Base.prototype);\n\n /** @override */\n Pie.prototype.TYPE = 'pie';\n\n /**\n * Whether the chart should be displayed as doughnut or not.\n *\n * @type {Bool}\n * @protected\n */\n Pie.prototype._doughnut = null;\n\n /** @override */\n Pie.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setDoughnut(data.doughnut);\n return chart;\n };\n\n /**\n * Overridden to add appropriate colors to the series.\n *\n * @override\n */\n Pie.prototype.addSeries = function(series) {\n if (series.getColor() === null) {\n var colors = [];\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n for (var i = 0; i < series.getCount(); i++) {\n colors.push(configColorSet[i % configColorSet.length]);\n }\n series.setColors(colors);\n }\n return Base.prototype.addSeries.apply(this, arguments);\n };\n\n /**\n * Get whether the chart should be displayed as doughnut or not.\n *\n * @method getDoughnut\n * @returns {Bool}\n */\n Pie.prototype.getDoughnut = function() {\n return this._doughnut;\n };\n\n /**\n * Set whether the chart should be displayed as doughnut or not.\n *\n * @method setDoughnut\n * @param {Bool} doughnut True for doughnut type, false for pie.\n */\n Pie.prototype.setDoughnut = function(doughnut) {\n this._doughnut = Boolean(doughnut);\n };\n\n /**\n * Validate a series.\n *\n * Overrides parent implementation to validate that there is only\n * one series per chart instance.\n *\n * @override\n */\n Pie.prototype._validateSeries = function() {\n if (this._series.length >= 1) {\n throw new Error('Pie charts only support one serie.');\n }\n return Base.prototype._validateSeries.apply(this, arguments);\n };\n\n return Pie;\n\n});\n"],"file":"chart_pie.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/chart_series.min.js.map b/lib/amd/build/chart_series.min.js.map
index f69999c6537..6356e5468fd 100644
--- a/lib/amd/build/chart_series.min.js.map
+++ b/lib/amd/build/chart_series.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/chart_series.js"],"names":["define","Series","label","values","Error","length","_colors","_label","_values","prototype","TYPE_DEFAULT","TYPE_LINE","_fill","_labels","_smooth","_type","_xaxis","_yaxis","create","obj","s","setType","type","setXAxis","axes","x","setYAxis","y","setLabels","labels","colors","setColors","setColor","setFill","fill","setSmooth","smooth","getColor","getColors","getCount","getFill","getLabel","getLabels","getSmooth","getType","getValues","getXAxis","getYAxis","hasColoredValues","color","_validateLabels","index"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Chart series.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_series\n */\ndefine([], function() {\n\n /**\n * Chart data series.\n *\n * @class\n * @alias module:core/chart_series\n * @param {String} label The series label.\n * @param {Number[]} values The values.\n */\n function Series(label, values) {\n if (typeof label !== 'string') {\n throw new Error('Invalid label for series.');\n\n } else if (typeof values !== 'object') {\n throw new Error('Values for a series must be an array.');\n\n } else if (values.length < 1) {\n throw new Error('Invalid values received for series.');\n }\n\n this._colors = [];\n this._label = label;\n this._values = values;\n }\n\n /**\n * The default type of series.\n *\n * @type {Null}\n * @const\n */\n Series.prototype.TYPE_DEFAULT = null;\n\n /**\n * Type of series 'line'.\n *\n * @type {String}\n * @const\n */\n Series.prototype.TYPE_LINE = 'line';\n\n /**\n * The colors of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._colors = null;\n\n /**\n * The fill mode of the series.\n *\n * @type {Object}\n * @protected\n */\n Series.prototype._fill = false;\n\n /**\n * The label of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._label = null;\n\n /**\n * The labels for the values of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._labels = null;\n\n /**\n * Whether the line of the serie should be smooth or not.\n *\n * @type {Bool}\n * @protected\n */\n Series.prototype._smooth = false;\n\n /**\n * The type of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._type = Series.prototype.TYPE_DEFAULT;\n\n /**\n * The values in the series.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._values = null;\n\n /**\n * The index of the X axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._xaxis = null;\n\n /**\n * The index of the Y axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._yaxis = null;\n\n /**\n * Create a new instance of a series from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the series.\n * @return {module:core/chart_series}\n */\n Series.prototype.create = function(obj) {\n var s = new Series(obj.label, obj.values);\n s.setType(obj.type);\n s.setXAxis(obj.axes.x);\n s.setYAxis(obj.axes.y);\n s.setLabels(obj.labels);\n\n // Colors are exported as an array with 1, or n values.\n if (obj.colors && obj.colors.length > 1) {\n s.setColors(obj.colors);\n } else {\n s.setColor(obj.colors[0]);\n }\n\n s.setFill(obj.fill);\n s.setSmooth(obj.smooth);\n return s;\n };\n\n /**\n * Get the color.\n *\n * @return {String}\n */\n Series.prototype.getColor = function() {\n return this._colors[0] || null;\n };\n\n /**\n * Get the colors for each value in the series.\n *\n * @return {String[]}\n */\n Series.prototype.getColors = function() {\n return this._colors;\n };\n\n /**\n * Get the number of values in the series.\n *\n * @return {Number}\n */\n Series.prototype.getCount = function() {\n return this._values.length;\n };\n\n /**\n * Get the fill mode of the series.\n *\n * @return {Object}\n */\n Series.prototype.getFill = function() {\n return this._fill;\n };\n\n /**\n * Get the series label.\n *\n * @return {String}\n */\n Series.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get labels for the values of the series.\n *\n * @return {String[]}\n */\n Series.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether the line of the serie should be smooth or not.\n *\n * @returns {Bool}\n */\n Series.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Get the series type.\n *\n * @return {String}\n */\n Series.prototype.getType = function() {\n return this._type;\n };\n\n /**\n * Get the series values.\n *\n * @return {Number[]}\n */\n Series.prototype.getValues = function() {\n return this._values;\n };\n\n /**\n * Get the index of the X axis.\n *\n * @return {Number}\n */\n Series.prototype.getXAxis = function() {\n return this._xaxis;\n };\n\n /**\n * Get the index of the Y axis.\n *\n * @return {Number}\n */\n Series.prototype.getYAxis = function() {\n return this._yaxis;\n };\n\n /**\n * Whether there is a color per value.\n *\n * @return {Bool}\n */\n Series.prototype.hasColoredValues = function() {\n return this._colors.length == this.getCount();\n };\n\n /**\n * Set the series color.\n *\n * @param {String} color A CSS-compatible color.\n */\n Series.prototype.setColor = function(color) {\n this._colors = [color];\n };\n\n /**\n * Set a color for each value in the series.\n *\n * @param {String[]} colors CSS-compatible colors.\n */\n Series.prototype.setColors = function(colors) {\n if (colors && colors.length != this.getCount()) {\n throw new Error('When setting multiple colors there must be one per value.');\n }\n this._colors = colors || [];\n };\n\n /**\n * Set the fill mode for the series.\n *\n * @param {Object} fill\n */\n Series.prototype.setFill = function(fill) {\n this._fill = typeof fill === 'undefined' ? null : fill;\n };\n\n /**\n * Set the labels for the values of the series.\n *\n * @param {String[]} labels the labels of the series values.\n */\n Series.prototype.setLabels = function(labels) {\n this._validateLabels(labels);\n labels = typeof labels === 'undefined' ? null : labels;\n this._labels = labels;\n };\n\n /**\n * Set Whether the line of the serie should be smooth or not.\n *\n * Only applicable for line chart or a line series, if null it assumes the chart default (not smooth).\n *\n * @param {Bool} smooth True if the lines should be smooth, false for tensioned lines.\n */\n Series.prototype.setSmooth = function(smooth) {\n smooth = typeof smooth === 'undefined' ? null : smooth;\n this._smooth = smooth;\n };\n\n /**\n * Set the type of the series.\n *\n * @param {String} type A type constant value.\n */\n Series.prototype.setType = function(type) {\n if (type != this.TYPE_DEFAULT && type != this.TYPE_LINE) {\n throw new Error('Invalid serie type.');\n }\n this._type = type || null;\n };\n\n /**\n * Set the index of the X axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setXAxis = function(index) {\n this._xaxis = index || null;\n };\n\n\n /**\n * Set the index of the Y axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setYAxis = function(index) {\n this._yaxis = index || null;\n };\n\n /**\n * Validate series labels.\n *\n * @protected\n * @param {String[]} labels The labels of the serie.\n */\n Series.prototype._validateLabels = function(labels) {\n if (labels && labels.length > 0 && labels.length != this.getCount()) {\n throw new Error('Series labels must match series values.');\n }\n };\n\n return Series;\n\n});\n"],"file":"chart_series.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/chart_series.js"],"names":["define","Series","label","values","Error","length","_colors","_label","_values","prototype","TYPE_DEFAULT","TYPE_LINE","_fill","_labels","_smooth","_type","_xaxis","_yaxis","create","obj","s","setType","type","setXAxis","axes","x","setYAxis","y","setLabels","labels","colors","setColors","setColor","setFill","fill","setSmooth","smooth","getColor","getColors","getCount","getFill","getLabel","getLabels","getSmooth","getType","getValues","getXAxis","getYAxis","hasColoredValues","color","_validateLabels","index"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Chart series.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_series\n */\ndefine([], function() {\n\n /**\n * Chart data series.\n *\n * @class\n * @param {String} label The series label.\n * @param {Number[]} values The values.\n */\n function Series(label, values) {\n if (typeof label !== 'string') {\n throw new Error('Invalid label for series.');\n\n } else if (typeof values !== 'object') {\n throw new Error('Values for a series must be an array.');\n\n } else if (values.length < 1) {\n throw new Error('Invalid values received for series.');\n }\n\n this._colors = [];\n this._label = label;\n this._values = values;\n }\n\n /**\n * The default type of series.\n *\n * @type {Null}\n * @const\n */\n Series.prototype.TYPE_DEFAULT = null;\n\n /**\n * Type of series 'line'.\n *\n * @type {String}\n * @const\n */\n Series.prototype.TYPE_LINE = 'line';\n\n /**\n * The colors of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._colors = null;\n\n /**\n * The fill mode of the series.\n *\n * @type {Object}\n * @protected\n */\n Series.prototype._fill = false;\n\n /**\n * The label of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._label = null;\n\n /**\n * The labels for the values of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._labels = null;\n\n /**\n * Whether the line of the serie should be smooth or not.\n *\n * @type {Bool}\n * @protected\n */\n Series.prototype._smooth = false;\n\n /**\n * The type of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._type = Series.prototype.TYPE_DEFAULT;\n\n /**\n * The values in the series.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._values = null;\n\n /**\n * The index of the X axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._xaxis = null;\n\n /**\n * The index of the Y axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._yaxis = null;\n\n /**\n * Create a new instance of a series from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the series.\n * @return {module:core/chart_series}\n */\n Series.prototype.create = function(obj) {\n var s = new Series(obj.label, obj.values);\n s.setType(obj.type);\n s.setXAxis(obj.axes.x);\n s.setYAxis(obj.axes.y);\n s.setLabels(obj.labels);\n\n // Colors are exported as an array with 1, or n values.\n if (obj.colors && obj.colors.length > 1) {\n s.setColors(obj.colors);\n } else {\n s.setColor(obj.colors[0]);\n }\n\n s.setFill(obj.fill);\n s.setSmooth(obj.smooth);\n return s;\n };\n\n /**\n * Get the color.\n *\n * @return {String}\n */\n Series.prototype.getColor = function() {\n return this._colors[0] || null;\n };\n\n /**\n * Get the colors for each value in the series.\n *\n * @return {String[]}\n */\n Series.prototype.getColors = function() {\n return this._colors;\n };\n\n /**\n * Get the number of values in the series.\n *\n * @return {Number}\n */\n Series.prototype.getCount = function() {\n return this._values.length;\n };\n\n /**\n * Get the fill mode of the series.\n *\n * @return {Object}\n */\n Series.prototype.getFill = function() {\n return this._fill;\n };\n\n /**\n * Get the series label.\n *\n * @return {String}\n */\n Series.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get labels for the values of the series.\n *\n * @return {String[]}\n */\n Series.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether the line of the serie should be smooth or not.\n *\n * @returns {Bool}\n */\n Series.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Get the series type.\n *\n * @return {String}\n */\n Series.prototype.getType = function() {\n return this._type;\n };\n\n /**\n * Get the series values.\n *\n * @return {Number[]}\n */\n Series.prototype.getValues = function() {\n return this._values;\n };\n\n /**\n * Get the index of the X axis.\n *\n * @return {Number}\n */\n Series.prototype.getXAxis = function() {\n return this._xaxis;\n };\n\n /**\n * Get the index of the Y axis.\n *\n * @return {Number}\n */\n Series.prototype.getYAxis = function() {\n return this._yaxis;\n };\n\n /**\n * Whether there is a color per value.\n *\n * @return {Bool}\n */\n Series.prototype.hasColoredValues = function() {\n return this._colors.length == this.getCount();\n };\n\n /**\n * Set the series color.\n *\n * @param {String} color A CSS-compatible color.\n */\n Series.prototype.setColor = function(color) {\n this._colors = [color];\n };\n\n /**\n * Set a color for each value in the series.\n *\n * @param {String[]} colors CSS-compatible colors.\n */\n Series.prototype.setColors = function(colors) {\n if (colors && colors.length != this.getCount()) {\n throw new Error('When setting multiple colors there must be one per value.');\n }\n this._colors = colors || [];\n };\n\n /**\n * Set the fill mode for the series.\n *\n * @param {Object} fill\n */\n Series.prototype.setFill = function(fill) {\n this._fill = typeof fill === 'undefined' ? null : fill;\n };\n\n /**\n * Set the labels for the values of the series.\n *\n * @param {String[]} labels the labels of the series values.\n */\n Series.prototype.setLabels = function(labels) {\n this._validateLabels(labels);\n labels = typeof labels === 'undefined' ? null : labels;\n this._labels = labels;\n };\n\n /**\n * Set Whether the line of the serie should be smooth or not.\n *\n * Only applicable for line chart or a line series, if null it assumes the chart default (not smooth).\n *\n * @param {Bool} smooth True if the lines should be smooth, false for tensioned lines.\n */\n Series.prototype.setSmooth = function(smooth) {\n smooth = typeof smooth === 'undefined' ? null : smooth;\n this._smooth = smooth;\n };\n\n /**\n * Set the type of the series.\n *\n * @param {String} type A type constant value.\n */\n Series.prototype.setType = function(type) {\n if (type != this.TYPE_DEFAULT && type != this.TYPE_LINE) {\n throw new Error('Invalid serie type.');\n }\n this._type = type || null;\n };\n\n /**\n * Set the index of the X axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setXAxis = function(index) {\n this._xaxis = index || null;\n };\n\n\n /**\n * Set the index of the Y axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setYAxis = function(index) {\n this._yaxis = index || null;\n };\n\n /**\n * Validate series labels.\n *\n * @protected\n * @param {String[]} labels The labels of the serie.\n */\n Series.prototype._validateLabels = function(labels) {\n if (labels && labels.length > 0 && labels.length != this.getCount()) {\n throw new Error('Series labels must match series values.');\n }\n };\n\n return Series;\n\n});\n"],"file":"chart_series.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/config.min.js.map b/lib/amd/build/config.min.js.map
index f7a82a75239..ffdbad9211d 100644
--- a/lib/amd/build/config.min.js.map
+++ b/lib/amd/build/config.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/config.js"],"names":["define","M","cfg"],"mappings":"AAwBAA,OAAM,eAAC,UAAW,CAGd,MAAwCC,CAAAA,CAAC,CAACC,GAC7C,CAJK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Expose the M.cfg global variable.\n *\n * @module core/config\n * @class config\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(function() {\n\n // This module exposes only the raw data from M.cfg;\n return /** @alias module:core/config */ M.cfg;\n});\n"],"file":"config.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/config.js"],"names":["define","M","cfg"],"mappings":"AAuBAA,OAAM,eAAC,UAAW,CAEd,MAAOC,CAAAA,CAAC,CAACC,GACZ,CAHK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Expose the M.cfg global variable.\n *\n * @module core/config\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(function() {\n // This module exposes only the raw data from M.cfg;\n return M.cfg;\n});\n"],"file":"config.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/custom_interaction_events.min.js.map b/lib/amd/build/custom_interaction_events.min.js.map
index 6113e0086ad..60d8611973c 100644
--- a/lib/amd/build/custom_interaction_events.min.js.map
+++ b/lib/amd/build/custom_interaction_events.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/custom_interaction_events.js"],"names":["define","$","keyCodes","events","activate","keyboardActivate","escape","down","up","home","end","next","previous","asterix","scrollLock","scrollTop","scrollBottom","ctrlPageUp","ctrlPageDown","enter","accessibleChange","triggeredEvents","shouldAddEvent","eventType","include","length","indexOf","isModifierPressed","e","shiftKey","metaKey","altKey","ctrlKey","triggerEvent","eventName","eventTypeKey","hasOwnProperty","type","timeStamp","target","trigger","originalEvent","addKeyboardEvent","element","event","keyCode","off","on","addActivateListener","space","addKeyboardActivateListener","addEscapeListener","addDownListener","arrowDown","addUpListener","arrowUp","addHomeListener","addEndListener","addNextListener","attr","arrowLeft","arrowRight","addPreviousListener","addAsterixListener","addScrollTopListener","addScrollBottomListener","innerHeight","scrollHeight","addScrollLockListener","height","delta","detail","wheelDelta","stopPropagation","preventDefault","returnValue","addCtrlPageUpListener","pageUp","addCtrlPageDownListener","pageDown","addEnterListener","addAccessibleChangeListener","onMac","navigator","userAgent","touchEnabled","window","msMaxTouchPoints","setInitialValue","dataset","initValue","value","resetToInitialValue","checkAndTriggerAccessibleChange","nativeElement","get","addEventListener","which","ignoreChange","getHandlers","handlers","each","handler"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * This module provides a wrapper to encapsulate a lot of the common combinations of\n * user interaction we use in Moodle.\n *\n * @module core/custom_interaction_events\n * @class custom_interaction_events\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/key_codes'], function($, keyCodes) {\n // The list of events provided by this module. Namespaced to avoid clashes.\n var events = {\n activate: 'cie:activate',\n keyboardActivate: 'cie:keyboardactivate',\n escape: 'cie:escape',\n down: 'cie:down',\n up: 'cie:up',\n home: 'cie:home',\n end: 'cie:end',\n next: 'cie:next',\n previous: 'cie:previous',\n asterix: 'cie:asterix',\n scrollLock: 'cie:scrollLock',\n scrollTop: 'cie:scrollTop',\n scrollBottom: 'cie:scrollBottom',\n ctrlPageUp: 'cie:ctrlPageUp',\n ctrlPageDown: 'cie:ctrlPageDown',\n enter: 'cie:enter',\n accessibleChange: 'cie:accessibleChange',\n };\n // Static cache of jQuery events that have been handled. This should\n // only be populated by JavaScript generated events (which will keep it\n // fairly small).\n var triggeredEvents = {};\n\n /**\n * Check if the caller has asked for the given event type to be\n * registered.\n *\n * @method shouldAddEvent\n * @private\n * @param {string} eventType name of the event (see events above)\n * @param {array} include the list of events to be added\n * @return {bool} true if the event should be added, false otherwise.\n */\n var shouldAddEvent = function(eventType, include) {\n include = include || [];\n\n if (include.length && include.indexOf(eventType) !== -1) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Check if any of the modifier keys have been pressed on the event.\n *\n * @method isModifierPressed\n * @private\n * @param {event} e jQuery event\n * @return {bool} true if shift, meta (command on Mac), alt or ctrl are pressed\n */\n var isModifierPressed = function(e) {\n return (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n };\n\n /**\n * Trigger the custom event for the given jQuery event.\n *\n * This function will only fire the custom event if one hasn't already been\n * fired for the jQuery event.\n *\n * This is to prevent multiple custom event handlers triggering multiple\n * custom events for a single jQuery event as it bubbles up the stack.\n *\n * @param {string} eventName The name of the custom event\n * @param {event} e The jQuery event\n * @return {void}\n */\n var triggerEvent = function(eventName, e) {\n var eventTypeKey = \"\";\n\n if (!e.hasOwnProperty('originalEvent')) {\n // This is a jQuery event generated from JavaScript not a browser event so\n // we need to build the cache key for the event.\n eventTypeKey = \"\" + eventName + e.type + e.timeStamp;\n\n if (!triggeredEvents.hasOwnProperty(eventTypeKey)) {\n // If we haven't seen this jQuery event before then fire a custom\n // event for it and remember the event for later.\n triggeredEvents[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n }\n return;\n }\n\n eventTypeKey = \"triggeredCustom_\" + eventName;\n if (!e.originalEvent.hasOwnProperty(eventTypeKey)) {\n // If this is a jQuery event generated by the browser then set a\n // property on the original event to track that we've seen it before.\n // The property is set on the original event because it's the only part\n // of the jQuery event that is maintained through multiple event handlers.\n e.originalEvent[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n return;\n }\n };\n\n /**\n * Register a keyboard event that ignores modifier keys.\n *\n * @method addKeyboardEvent\n * @private\n * @param {object} element A jQuery object of the element to bind events to\n * @param {string} event The custom interaction event name\n * @param {int} keyCode The key code.\n */\n var addKeyboardEvent = function(element, event, keyCode) {\n element.off('keydown.' + event).on('keydown.' + event, function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCode) {\n triggerEvent(event, e);\n }\n }\n });\n };\n\n /**\n * Trigger the activate event on the given element if it is clicked or the enter\n * or space key are pressed without a modifier key.\n *\n * @method addActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addActivateListener = function(element) {\n element.off('click.cie.activate').on('click.cie.activate', function(e) {\n triggerEvent(events.activate, e);\n });\n element.off('keydown.cie.activate').on('keydown.cie.activate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.activate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the keyboard activate event on the given element if the enter\n * or space key are pressed without a modifier key.\n *\n * @method addKeyboardActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addKeyboardActivateListener = function(element) {\n element.off('keydown.cie.keyboardactivate').on('keydown.cie.keyboardactivate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.keyboardActivate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the escape event on the given element if the escape key is pressed\n * without a modifier key.\n *\n * @method addEscapeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEscapeListener = function(element) {\n addKeyboardEvent(element, events.escape, keyCodes.escape);\n };\n\n /**\n * Trigger the down event on the given element if the down arrow key is pressed\n * without a modifier key.\n *\n * @method addDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addDownListener = function(element) {\n addKeyboardEvent(element, events.down, keyCodes.arrowDown);\n };\n\n /**\n * Trigger the up event on the given element if the up arrow key is pressed\n * without a modifier key.\n *\n * @method addUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addUpListener = function(element) {\n addKeyboardEvent(element, events.up, keyCodes.arrowUp);\n };\n\n /**\n * Trigger the home event on the given element if the home key is pressed\n * without a modifier key.\n *\n * @method addHomeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addHomeListener = function(element) {\n addKeyboardEvent(element, events.home, keyCodes.home);\n };\n\n /**\n * Trigger the end event on the given element if the end key is pressed\n * without a modifier key.\n *\n * @method addEndListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEndListener = function(element) {\n addKeyboardEvent(element, events.end, keyCodes.end);\n };\n\n /**\n * Trigger the next event on the given element if the right arrow key is pressed\n * without a modifier key in LTR mode or left arrow key in RTL mode.\n *\n * @method addNextListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addNextListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowLeft : keyCodes.arrowRight;\n\n addKeyboardEvent(element, events.next, keyCode);\n };\n\n /**\n * Trigger the previous event on the given element if the left arrow key is pressed\n * without a modifier key in LTR mode or right arrow key in RTL mode.\n *\n * @method addPreviousListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addPreviousListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowRight : keyCodes.arrowLeft;\n\n addKeyboardEvent(element, events.previous, keyCode);\n };\n\n /**\n * Trigger the asterix event on the given element if the asterix key is pressed\n * without a modifier key.\n *\n * @method addAsterixListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAsterixListener = function(element) {\n addKeyboardEvent(element, events.asterix, keyCodes.asterix);\n };\n\n\n /**\n * Trigger the scrollTop event on the given element if the user scrolls to\n * the top of the given element.\n *\n * @method addScrollTopListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollTopListener = function(element) {\n element.off('scroll.cie.scrollTop').on('scroll.cie.scrollTop', function(e) {\n var scrollTop = element.scrollTop();\n if (scrollTop === 0) {\n triggerEvent(events.scrollTop, e);\n }\n });\n };\n\n /**\n * Trigger the scrollBottom event on the given element if the user scrolls to\n * the bottom of the given element.\n *\n * @method addScrollBottomListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollBottomListener = function(element) {\n element.off('scroll.cie.scrollBottom').on('scroll.cie.scrollBottom', function(e) {\n var scrollTop = element.scrollTop();\n var innerHeight = element.innerHeight();\n var scrollHeight = element[0].scrollHeight;\n\n if (scrollTop + innerHeight >= scrollHeight) {\n triggerEvent(events.scrollBottom, e);\n }\n });\n };\n\n /**\n * Trigger the scrollLock event on the given element if the user scrolls to\n * the bottom or top of the given element.\n *\n * @method addScrollLockListener\n * @private\n * @param {jQuery} element jQuery object to add event listeners to\n */\n var addScrollLockListener = function(element) {\n // Lock mousewheel scrolling within the element to stop the annoying window scroll.\n element.off('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock')\n .on('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock', function(e) {\n var scrollTop = element.scrollTop();\n var scrollHeight = element[0].scrollHeight;\n var height = element.height();\n var delta = (e.type == 'DOMMouseScroll' ?\n e.originalEvent.detail * -40 :\n e.originalEvent.wheelDelta);\n var up = delta > 0;\n\n if (!up && -delta > scrollHeight - height - scrollTop) {\n // Scrolling down past the bottom.\n element.scrollTop(scrollHeight);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n } else if (up && delta > scrollTop) {\n // Scrolling up past the top.\n element.scrollTop(0);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n }\n\n return true;\n });\n };\n\n /**\n * Trigger the ctrlPageUp event on the given element if the user presses the\n * control and page up key.\n *\n * @method addCtrlPageUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageUpListener = function(element) {\n element.off('keydown.cie.ctrlpageup').on('keydown.cie.ctrlpageup', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageUp) {\n triggerEvent(events.ctrlPageUp, e);\n }\n }\n });\n };\n\n /**\n * Trigger the ctrlPageDown event on the given element if the user presses the\n * control and page down key.\n *\n * @method addCtrlPageDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageDownListener = function(element) {\n element.off('keydown.cie.ctrlpagedown').on('keydown.cie.ctrlpagedown', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageDown) {\n triggerEvent(events.ctrlPageDown, e);\n }\n }\n });\n };\n\n /**\n * Trigger the enter event on the given element if the enter key is pressed\n * without a modifier key.\n *\n * @method addEnterListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEnterListener = function(element) {\n addKeyboardEvent(element, events.enter, keyCodes.enter);\n };\n\n /**\n * Trigger the AccessibleChange event on the given element if the value of the element is changed.\n *\n * @method addAccessibleChangeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAccessibleChangeListener = function(element) {\n var onMac = navigator.userAgent.indexOf('Macintosh') !== -1;\n var touchEnabled = ('ontouchstart' in window) || (('msMaxTouchPoints' in navigator) && (navigator.msMaxTouchPoints > 0));\n if (onMac || touchEnabled) {\n // On Mac devices, and touch-enabled devices, the change event seems to be handled correctly and\n // consistently at this time.\n element.on('change', function(e) {\n triggerEvent(events.accessibleChange, e);\n });\n } else {\n // Some browsers have non-normalised behaviour for handling the selection of values in a element.\n // When using Chrome on Linux (and possibly others), a 'change' event is fired when pressing the Escape key.\n // When using Firefox on Linux (and possibly others), a 'change' event is fired when navigating through the\n // list with a keyboard.\n //\n // To normalise these behaviours:\n // - the initial value is stored in a data attribute when focusing the element\n // - the current value is checked against the stored initial value when and the accessibleChange event fired when:\n // --- blurring the element\n // --- the 'Enter' key is pressed\n // --- the element is clicked\n // --- the 'change' event is fired, except where it is from a keyboard interaction\n //\n // To facilitate the change event keyboard interaction check, the 'keyDown' handler sets a flag to ignore\n // the change event handler which is unset on the 'keyUp' event.\n //\n // Unfortunately we cannot control this entirely as some browsers (Chrome) trigger a change event when\n // pressign the Escape key, and this is considered to be the correct behaviour.\n // Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=839717\n //\n // Our longer-term solution to this should be to switch away from using boxes as a single-select,\n // and make use of a dropdown of action links like the Bootstrap Dropdown menu.\n var setInitialValue = function(target) {\n target.dataset.initValue = target.value;\n };\n var resetToInitialValue = function(target) {\n if ('initValue' in target.dataset) {\n target.value = target.dataset.initValue;\n }\n };\n var checkAndTriggerAccessibleChange = function(e) {\n if (!('initValue' in e.target.dataset)) {\n // Some browsers trigger click before focus, therefore it is possible that initValue is undefined.\n // In this case it's likely that it's being focused for the first time and we should therefore not submit.\n return;\n }\n\n if (e.target.value !== e.target.dataset.initValue) {\n // Update the initValue when the event is triggered.\n // This means that if the click handler fires before the focus handler on a subsequent interaction\n // with the element, the currently dispalyed value will be the best guess current value.\n e.target.dataset.initValue = e.target.value;\n triggerEvent(events.accessibleChange, e);\n }\n };\n var nativeElement = element.get()[0];\n // The `focus` and `blur` events do not support bubbling. Use Event Capture instead.\n nativeElement.addEventListener('focus', function(e) {\n setInitialValue(e.target);\n }, true);\n nativeElement.addEventListener('blur', function(e) {\n checkAndTriggerAccessibleChange(e);\n }, true);\n element.on('keydown', function(e) {\n if ((e.which === keyCodes.enter)) {\n checkAndTriggerAccessibleChange(e);\n } else if (e.which === keyCodes.escape) {\n resetToInitialValue(e.target);\n e.target.dataset.ignoreChange = true;\n } else {\n // Firefox triggers a change event when using the keyboard to scroll through the selection.\n // Set a data- attribute that the change listener can use to ignore the change event where it was\n // generated from a keyboard change such as typing to complete a value, or using arrow keys.\n e.target.dataset.ignoreChange = true;\n\n }\n });\n element.on('change', function(e) {\n if (e.target.dataset.ignoreChange) {\n // This change event was triggered from a keyboard change which is not yet complete.\n // Do not trigger the accessibleChange event until the selection is completed using the [return]\n // key.\n return;\n }\n\n checkAndTriggerAccessibleChange(e);\n });\n element.on('keyup', function(e) {\n // The key has been lifted. Stop ignoring the change event.\n delete e.target.dataset.ignoreChange;\n });\n element.on('click', function(e) {\n checkAndTriggerAccessibleChange(e);\n });\n }\n };\n\n /**\n * Get the list of events and their handlers.\n *\n * @method getHandlers\n * @private\n * @return {object} object key of event names and value of handler functions\n */\n var getHandlers = function() {\n var handlers = {};\n\n handlers[events.activate] = addActivateListener;\n handlers[events.keyboardActivate] = addKeyboardActivateListener;\n handlers[events.escape] = addEscapeListener;\n handlers[events.down] = addDownListener;\n handlers[events.up] = addUpListener;\n handlers[events.home] = addHomeListener;\n handlers[events.end] = addEndListener;\n handlers[events.next] = addNextListener;\n handlers[events.previous] = addPreviousListener;\n handlers[events.asterix] = addAsterixListener;\n handlers[events.scrollLock] = addScrollLockListener;\n handlers[events.scrollTop] = addScrollTopListener;\n handlers[events.scrollBottom] = addScrollBottomListener;\n handlers[events.ctrlPageUp] = addCtrlPageUpListener;\n handlers[events.ctrlPageDown] = addCtrlPageDownListener;\n handlers[events.enter] = addEnterListener;\n handlers[events.accessibleChange] = addAccessibleChangeListener;\n\n return handlers;\n };\n\n /**\n * Add all of the listeners on the given element for the requested events.\n *\n * @method define\n * @public\n * @param {object} element the DOM element to register event listeners on\n * @param {array} include the array of events to be triggered\n */\n var define = function(element, include) {\n element = $(element);\n include = include || [];\n\n if (!element.length || !include.length) {\n return;\n }\n\n $.each(getHandlers(), function(eventType, handler) {\n if (shouldAddEvent(eventType, include)) {\n handler(element);\n }\n });\n };\n\n return /** @module core/custom_interaction_events */ {\n define: define,\n events: events,\n };\n});\n"],"file":"custom_interaction_events.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/custom_interaction_events.js"],"names":["define","$","keyCodes","events","activate","keyboardActivate","escape","down","up","home","end","next","previous","asterix","scrollLock","scrollTop","scrollBottom","ctrlPageUp","ctrlPageDown","enter","accessibleChange","triggeredEvents","shouldAddEvent","eventType","include","length","indexOf","isModifierPressed","e","shiftKey","metaKey","altKey","ctrlKey","triggerEvent","eventName","eventTypeKey","hasOwnProperty","type","timeStamp","target","trigger","originalEvent","addKeyboardEvent","element","event","keyCode","off","on","addActivateListener","space","addKeyboardActivateListener","addEscapeListener","addDownListener","arrowDown","addUpListener","arrowUp","addHomeListener","addEndListener","addNextListener","attr","arrowLeft","arrowRight","addPreviousListener","addAsterixListener","addScrollTopListener","addScrollBottomListener","innerHeight","scrollHeight","addScrollLockListener","height","delta","detail","wheelDelta","stopPropagation","preventDefault","returnValue","addCtrlPageUpListener","pageUp","addCtrlPageDownListener","pageDown","addEnterListener","addAccessibleChangeListener","onMac","navigator","userAgent","touchEnabled","window","msMaxTouchPoints","setInitialValue","dataset","initValue","value","resetToInitialValue","checkAndTriggerAccessibleChange","nativeElement","get","addEventListener","which","ignoreChange","getHandlers","handlers","each","handler"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * This module provides a wrapper to encapsulate a lot of the common combinations of\n * user interaction we use in Moodle.\n *\n * @module core/custom_interaction_events\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/key_codes'], function($, keyCodes) {\n // The list of events provided by this module. Namespaced to avoid clashes.\n var events = {\n activate: 'cie:activate',\n keyboardActivate: 'cie:keyboardactivate',\n escape: 'cie:escape',\n down: 'cie:down',\n up: 'cie:up',\n home: 'cie:home',\n end: 'cie:end',\n next: 'cie:next',\n previous: 'cie:previous',\n asterix: 'cie:asterix',\n scrollLock: 'cie:scrollLock',\n scrollTop: 'cie:scrollTop',\n scrollBottom: 'cie:scrollBottom',\n ctrlPageUp: 'cie:ctrlPageUp',\n ctrlPageDown: 'cie:ctrlPageDown',\n enter: 'cie:enter',\n accessibleChange: 'cie:accessibleChange',\n };\n // Static cache of jQuery events that have been handled. This should\n // only be populated by JavaScript generated events (which will keep it\n // fairly small).\n var triggeredEvents = {};\n\n /**\n * Check if the caller has asked for the given event type to be\n * registered.\n *\n * @method shouldAddEvent\n * @private\n * @param {string} eventType name of the event (see events above)\n * @param {array} include the list of events to be added\n * @return {bool} true if the event should be added, false otherwise.\n */\n var shouldAddEvent = function(eventType, include) {\n include = include || [];\n\n if (include.length && include.indexOf(eventType) !== -1) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Check if any of the modifier keys have been pressed on the event.\n *\n * @method isModifierPressed\n * @private\n * @param {event} e jQuery event\n * @return {bool} true if shift, meta (command on Mac), alt or ctrl are pressed\n */\n var isModifierPressed = function(e) {\n return (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n };\n\n /**\n * Trigger the custom event for the given jQuery event.\n *\n * This function will only fire the custom event if one hasn't already been\n * fired for the jQuery event.\n *\n * This is to prevent multiple custom event handlers triggering multiple\n * custom events for a single jQuery event as it bubbles up the stack.\n *\n * @param {string} eventName The name of the custom event\n * @param {event} e The jQuery event\n * @return {void}\n */\n var triggerEvent = function(eventName, e) {\n var eventTypeKey = \"\";\n\n if (!e.hasOwnProperty('originalEvent')) {\n // This is a jQuery event generated from JavaScript not a browser event so\n // we need to build the cache key for the event.\n eventTypeKey = \"\" + eventName + e.type + e.timeStamp;\n\n if (!triggeredEvents.hasOwnProperty(eventTypeKey)) {\n // If we haven't seen this jQuery event before then fire a custom\n // event for it and remember the event for later.\n triggeredEvents[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n }\n return;\n }\n\n eventTypeKey = \"triggeredCustom_\" + eventName;\n if (!e.originalEvent.hasOwnProperty(eventTypeKey)) {\n // If this is a jQuery event generated by the browser then set a\n // property on the original event to track that we've seen it before.\n // The property is set on the original event because it's the only part\n // of the jQuery event that is maintained through multiple event handlers.\n e.originalEvent[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n return;\n }\n };\n\n /**\n * Register a keyboard event that ignores modifier keys.\n *\n * @method addKeyboardEvent\n * @private\n * @param {object} element A jQuery object of the element to bind events to\n * @param {string} event The custom interaction event name\n * @param {int} keyCode The key code.\n */\n var addKeyboardEvent = function(element, event, keyCode) {\n element.off('keydown.' + event).on('keydown.' + event, function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCode) {\n triggerEvent(event, e);\n }\n }\n });\n };\n\n /**\n * Trigger the activate event on the given element if it is clicked or the enter\n * or space key are pressed without a modifier key.\n *\n * @method addActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addActivateListener = function(element) {\n element.off('click.cie.activate').on('click.cie.activate', function(e) {\n triggerEvent(events.activate, e);\n });\n element.off('keydown.cie.activate').on('keydown.cie.activate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.activate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the keyboard activate event on the given element if the enter\n * or space key are pressed without a modifier key.\n *\n * @method addKeyboardActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addKeyboardActivateListener = function(element) {\n element.off('keydown.cie.keyboardactivate').on('keydown.cie.keyboardactivate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.keyboardActivate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the escape event on the given element if the escape key is pressed\n * without a modifier key.\n *\n * @method addEscapeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEscapeListener = function(element) {\n addKeyboardEvent(element, events.escape, keyCodes.escape);\n };\n\n /**\n * Trigger the down event on the given element if the down arrow key is pressed\n * without a modifier key.\n *\n * @method addDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addDownListener = function(element) {\n addKeyboardEvent(element, events.down, keyCodes.arrowDown);\n };\n\n /**\n * Trigger the up event on the given element if the up arrow key is pressed\n * without a modifier key.\n *\n * @method addUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addUpListener = function(element) {\n addKeyboardEvent(element, events.up, keyCodes.arrowUp);\n };\n\n /**\n * Trigger the home event on the given element if the home key is pressed\n * without a modifier key.\n *\n * @method addHomeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addHomeListener = function(element) {\n addKeyboardEvent(element, events.home, keyCodes.home);\n };\n\n /**\n * Trigger the end event on the given element if the end key is pressed\n * without a modifier key.\n *\n * @method addEndListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEndListener = function(element) {\n addKeyboardEvent(element, events.end, keyCodes.end);\n };\n\n /**\n * Trigger the next event on the given element if the right arrow key is pressed\n * without a modifier key in LTR mode or left arrow key in RTL mode.\n *\n * @method addNextListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addNextListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowLeft : keyCodes.arrowRight;\n\n addKeyboardEvent(element, events.next, keyCode);\n };\n\n /**\n * Trigger the previous event on the given element if the left arrow key is pressed\n * without a modifier key in LTR mode or right arrow key in RTL mode.\n *\n * @method addPreviousListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addPreviousListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowRight : keyCodes.arrowLeft;\n\n addKeyboardEvent(element, events.previous, keyCode);\n };\n\n /**\n * Trigger the asterix event on the given element if the asterix key is pressed\n * without a modifier key.\n *\n * @method addAsterixListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAsterixListener = function(element) {\n addKeyboardEvent(element, events.asterix, keyCodes.asterix);\n };\n\n\n /**\n * Trigger the scrollTop event on the given element if the user scrolls to\n * the top of the given element.\n *\n * @method addScrollTopListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollTopListener = function(element) {\n element.off('scroll.cie.scrollTop').on('scroll.cie.scrollTop', function(e) {\n var scrollTop = element.scrollTop();\n if (scrollTop === 0) {\n triggerEvent(events.scrollTop, e);\n }\n });\n };\n\n /**\n * Trigger the scrollBottom event on the given element if the user scrolls to\n * the bottom of the given element.\n *\n * @method addScrollBottomListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollBottomListener = function(element) {\n element.off('scroll.cie.scrollBottom').on('scroll.cie.scrollBottom', function(e) {\n var scrollTop = element.scrollTop();\n var innerHeight = element.innerHeight();\n var scrollHeight = element[0].scrollHeight;\n\n if (scrollTop + innerHeight >= scrollHeight) {\n triggerEvent(events.scrollBottom, e);\n }\n });\n };\n\n /**\n * Trigger the scrollLock event on the given element if the user scrolls to\n * the bottom or top of the given element.\n *\n * @method addScrollLockListener\n * @private\n * @param {jQuery} element jQuery object to add event listeners to\n */\n var addScrollLockListener = function(element) {\n // Lock mousewheel scrolling within the element to stop the annoying window scroll.\n element.off('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock')\n .on('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock', function(e) {\n var scrollTop = element.scrollTop();\n var scrollHeight = element[0].scrollHeight;\n var height = element.height();\n var delta = (e.type == 'DOMMouseScroll' ?\n e.originalEvent.detail * -40 :\n e.originalEvent.wheelDelta);\n var up = delta > 0;\n\n if (!up && -delta > scrollHeight - height - scrollTop) {\n // Scrolling down past the bottom.\n element.scrollTop(scrollHeight);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n } else if (up && delta > scrollTop) {\n // Scrolling up past the top.\n element.scrollTop(0);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n }\n\n return true;\n });\n };\n\n /**\n * Trigger the ctrlPageUp event on the given element if the user presses the\n * control and page up key.\n *\n * @method addCtrlPageUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageUpListener = function(element) {\n element.off('keydown.cie.ctrlpageup').on('keydown.cie.ctrlpageup', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageUp) {\n triggerEvent(events.ctrlPageUp, e);\n }\n }\n });\n };\n\n /**\n * Trigger the ctrlPageDown event on the given element if the user presses the\n * control and page down key.\n *\n * @method addCtrlPageDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageDownListener = function(element) {\n element.off('keydown.cie.ctrlpagedown').on('keydown.cie.ctrlpagedown', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageDown) {\n triggerEvent(events.ctrlPageDown, e);\n }\n }\n });\n };\n\n /**\n * Trigger the enter event on the given element if the enter key is pressed\n * without a modifier key.\n *\n * @method addEnterListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEnterListener = function(element) {\n addKeyboardEvent(element, events.enter, keyCodes.enter);\n };\n\n /**\n * Trigger the AccessibleChange event on the given element if the value of the element is changed.\n *\n * @method addAccessibleChangeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAccessibleChangeListener = function(element) {\n var onMac = navigator.userAgent.indexOf('Macintosh') !== -1;\n var touchEnabled = ('ontouchstart' in window) || (('msMaxTouchPoints' in navigator) && (navigator.msMaxTouchPoints > 0));\n if (onMac || touchEnabled) {\n // On Mac devices, and touch-enabled devices, the change event seems to be handled correctly and\n // consistently at this time.\n element.on('change', function(e) {\n triggerEvent(events.accessibleChange, e);\n });\n } else {\n // Some browsers have non-normalised behaviour for handling the selection of values in a element.\n // When using Chrome on Linux (and possibly others), a 'change' event is fired when pressing the Escape key.\n // When using Firefox on Linux (and possibly others), a 'change' event is fired when navigating through the\n // list with a keyboard.\n //\n // To normalise these behaviours:\n // - the initial value is stored in a data attribute when focusing the element\n // - the current value is checked against the stored initial value when and the accessibleChange event fired when:\n // --- blurring the element\n // --- the 'Enter' key is pressed\n // --- the element is clicked\n // --- the 'change' event is fired, except where it is from a keyboard interaction\n //\n // To facilitate the change event keyboard interaction check, the 'keyDown' handler sets a flag to ignore\n // the change event handler which is unset on the 'keyUp' event.\n //\n // Unfortunately we cannot control this entirely as some browsers (Chrome) trigger a change event when\n // pressign the Escape key, and this is considered to be the correct behaviour.\n // Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=839717\n //\n // Our longer-term solution to this should be to switch away from using boxes as a single-select,\n // and make use of a dropdown of action links like the Bootstrap Dropdown menu.\n var setInitialValue = function(target) {\n target.dataset.initValue = target.value;\n };\n var resetToInitialValue = function(target) {\n if ('initValue' in target.dataset) {\n target.value = target.dataset.initValue;\n }\n };\n var checkAndTriggerAccessibleChange = function(e) {\n if (!('initValue' in e.target.dataset)) {\n // Some browsers trigger click before focus, therefore it is possible that initValue is undefined.\n // In this case it's likely that it's being focused for the first time and we should therefore not submit.\n return;\n }\n\n if (e.target.value !== e.target.dataset.initValue) {\n // Update the initValue when the event is triggered.\n // This means that if the click handler fires before the focus handler on a subsequent interaction\n // with the element, the currently dispalyed value will be the best guess current value.\n e.target.dataset.initValue = e.target.value;\n triggerEvent(events.accessibleChange, e);\n }\n };\n var nativeElement = element.get()[0];\n // The `focus` and `blur` events do not support bubbling. Use Event Capture instead.\n nativeElement.addEventListener('focus', function(e) {\n setInitialValue(e.target);\n }, true);\n nativeElement.addEventListener('blur', function(e) {\n checkAndTriggerAccessibleChange(e);\n }, true);\n element.on('keydown', function(e) {\n if ((e.which === keyCodes.enter)) {\n checkAndTriggerAccessibleChange(e);\n } else if (e.which === keyCodes.escape) {\n resetToInitialValue(e.target);\n e.target.dataset.ignoreChange = true;\n } else {\n // Firefox triggers a change event when using the keyboard to scroll through the selection.\n // Set a data- attribute that the change listener can use to ignore the change event where it was\n // generated from a keyboard change such as typing to complete a value, or using arrow keys.\n e.target.dataset.ignoreChange = true;\n\n }\n });\n element.on('change', function(e) {\n if (e.target.dataset.ignoreChange) {\n // This change event was triggered from a keyboard change which is not yet complete.\n // Do not trigger the accessibleChange event until the selection is completed using the [return]\n // key.\n return;\n }\n\n checkAndTriggerAccessibleChange(e);\n });\n element.on('keyup', function(e) {\n // The key has been lifted. Stop ignoring the change event.\n delete e.target.dataset.ignoreChange;\n });\n element.on('click', function(e) {\n checkAndTriggerAccessibleChange(e);\n });\n }\n };\n\n /**\n * Get the list of events and their handlers.\n *\n * @method getHandlers\n * @private\n * @return {object} object key of event names and value of handler functions\n */\n var getHandlers = function() {\n var handlers = {};\n\n handlers[events.activate] = addActivateListener;\n handlers[events.keyboardActivate] = addKeyboardActivateListener;\n handlers[events.escape] = addEscapeListener;\n handlers[events.down] = addDownListener;\n handlers[events.up] = addUpListener;\n handlers[events.home] = addHomeListener;\n handlers[events.end] = addEndListener;\n handlers[events.next] = addNextListener;\n handlers[events.previous] = addPreviousListener;\n handlers[events.asterix] = addAsterixListener;\n handlers[events.scrollLock] = addScrollLockListener;\n handlers[events.scrollTop] = addScrollTopListener;\n handlers[events.scrollBottom] = addScrollBottomListener;\n handlers[events.ctrlPageUp] = addCtrlPageUpListener;\n handlers[events.ctrlPageDown] = addCtrlPageDownListener;\n handlers[events.enter] = addEnterListener;\n handlers[events.accessibleChange] = addAccessibleChangeListener;\n\n return handlers;\n };\n\n /**\n * Add all of the listeners on the given element for the requested events.\n *\n * @method define\n * @public\n * @param {object} element the DOM element to register event listeners on\n * @param {array} include the array of events to be triggered\n */\n var define = function(element, include) {\n element = $(element);\n include = include || [];\n\n if (!element.length || !include.length) {\n return;\n }\n\n $.each(getHandlers(), function(eventType, handler) {\n if (shouldAddEvent(eventType, include)) {\n handler(element);\n }\n });\n };\n\n return {\n define: define,\n events: events,\n };\n});\n"],"file":"custom_interaction_events.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/dragdrop.min.js.map b/lib/amd/build/dragdrop.min.js.map
index 31ecb4a9f94..d93eb51e89f 100644
--- a/lib/amd/build/dragdrop.min.js.map
+++ b/lib/amd/build/dragdrop.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/dragdrop.js"],"names":["define","$","autoScroll","dragdrop","eventCaptureOptions","passive","capture","dragProxy","onMove","onDrop","initialPosition","initialX","initialY","touching","prepare","event","preventDefault","start","type","changedTouches","length","which","details","getEventXY","xy","x","y","offset","addEventSpecial","mouseMove","mouseUp","touchEnd","touchMove","identifier","Error","scroll","handler","window","addEventListener","ex","pageX","pageY","e","i","handleMove","current","topOffset","top","parseInt","css","leftOffset","left","maxY","document","height","outerHeight","maxX","width","outerWidth","initial","position","Math","max","min","handleEnd","removeEventListener","stop","currentPosition"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/*\n * JavaScript to handle drag operations, including automatic scrolling.\n *\n * Note: this module is defined statically. It is a singleton. You\n * can only have one use of it active at any time. However, you\n * can only drag one thing at a time, this is not a problem in practice.\n *\n * @module core/dragdrop\n * @class dragdrop\n * @copyright 2016 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.6\n */\ndefine(['jquery', 'core/autoscroll'], function($, autoScroll) {\n /**\n * @alias module:core/dragdrop\n */\n var dragdrop = {\n /**\n * A boolean or options argument depending on whether browser supports passive events.\n * @private\n */\n eventCaptureOptions: {passive: false, capture: true},\n\n /**\n * Drag proxy if any.\n * @private\n */\n dragProxy: null,\n\n /**\n * Function called on move.\n * @private\n */\n onMove: null,\n\n /**\n * Function called on drop.\n * @private\n */\n onDrop: null,\n\n /**\n * Initial position of proxy at drag start.\n */\n initialPosition: null,\n\n /**\n * Initial page X of cursor at drag start.\n */\n initialX: null,\n\n /**\n * Initial page Y of cursor at drag start.\n */\n initialY: null,\n\n /**\n * If touch event is in progress, this will be the id, otherwise null\n */\n touching: null,\n\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: function(event) {\n event.preventDefault();\n var start;\n if (event.type === 'touchstart') {\n // For touch, start if there's at least one touch and we are not currently doing\n // a touch event.\n start = (dragdrop.touching === null) && event.changedTouches.length > 0;\n } else {\n // For mousedown, start if it's the left button.\n start = event.which === 1;\n }\n if (start) {\n var details = dragdrop.getEventXY(event);\n details.start = true;\n return details;\n } else {\n return {start: false};\n }\n },\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: function(event, dragProxy, onMove, onDrop) {\n var xy = dragdrop.getEventXY(event);\n dragdrop.initialX = xy.x;\n dragdrop.initialY = xy.y;\n dragdrop.initialPosition = dragProxy.offset();\n dragdrop.dragProxy = dragProxy;\n dragdrop.onMove = onMove;\n dragdrop.onDrop = onDrop;\n\n switch (event.type) {\n case 'mousedown':\n // Cannot use jQuery 'on' because events need to not be passive.\n dragdrop.addEventSpecial('mousemove', dragdrop.mouseMove);\n dragdrop.addEventSpecial('mouseup', dragdrop.mouseUp);\n break;\n case 'touchstart':\n dragdrop.addEventSpecial('touchend', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchcancel', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchmove', dragdrop.touchMove);\n dragdrop.touching = event.changedTouches[0].identifier;\n break;\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n autoScroll.start(dragdrop.scroll);\n },\n\n /**\n * Adds an event listener with special event capture options (capture, not passive). If the\n * browser does not support passive events, it will fall back to the boolean for capture.\n *\n * @private\n * @param {Object} event Event type string\n * @param {Object} handler Handler function\n */\n addEventSpecial: function(event, handler) {\n try {\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n } catch (ex) {\n dragdrop.eventCaptureOptions = true;\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n }\n },\n\n /**\n * Gets X/Y co-ordinates of an event, which can be either touchstart or mousedown.\n *\n * @private\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} X/Y co-ordinates\n */\n getEventXY: function(event) {\n switch (event.type) {\n case 'touchstart':\n return {x: event.changedTouches[0].pageX,\n y: event.changedTouches[0].pageY};\n case 'mousedown':\n return {x: event.pageX, y: event.pageY};\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleMove(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n dragdrop.handleMove(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for move event (mouse or touch).\n *\n * @private\n * @param {number} pageX X co-ordinate\n * @param {number} pageY Y co-ordinate\n */\n handleMove: function(pageX, pageY) {\n // Move the drag proxy, not letting you move it out of screen or window bounds.\n var current = dragdrop.dragProxy.offset();\n var topOffset = current.top - parseInt(dragdrop.dragProxy.css('top'));\n var leftOffset = current.left - parseInt(dragdrop.dragProxy.css('left'));\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight() - topOffset;\n var maxX = $(document).width() - dragdrop.dragProxy.outerWidth() - leftOffset;\n var minY = -topOffset;\n var minX = -leftOffset;\n var initial = dragdrop.initialPosition;\n var position = {\n top: Math.max(minY, Math.min(maxY, initial.top + (pageY - dragdrop.initialY) - topOffset)),\n left: Math.max(minX, Math.min(maxX, initial.left + (pageX - dragdrop.initialX) - leftOffset))\n };\n dragdrop.dragProxy.css(position);\n\n // Trigger move handler.\n dragdrop.onMove(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Event handler for touch end.\n *\n * @private\n * @param {Object} e Event\n */\n touchEnd: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleEnd(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse up.\n *\n * @private\n * @param {Object} e Event\n */\n mouseUp: function(e) {\n dragdrop.handleEnd(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for end drag (mouse or touch).\n *\n * @private\n * @param {number} pageX X\n * @param {number} pageY Y\n */\n handleEnd: function(pageX, pageY) {\n if (dragdrop.touching !== null) {\n window.removeEventListener('touchend', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchcancel', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchmove', dragdrop.touchMove, dragdrop.eventCaptureOptions);\n dragdrop.touching = null;\n } else {\n window.removeEventListener('mousemove', dragdrop.mouseMove, dragdrop.eventCaptureOptions);\n window.removeEventListener('mouseup', dragdrop.mouseUp, dragdrop.eventCaptureOptions);\n }\n autoScroll.stop();\n dragdrop.onDrop(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Called when the page scrolls.\n *\n * @private\n * @param {number} offset Amount of scroll\n */\n scroll: function(offset) {\n // Move the proxy to match.\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight();\n var currentPosition = dragdrop.dragProxy.offset();\n currentPosition.top = Math.min(maxY, currentPosition.top + offset);\n dragdrop.dragProxy.css(currentPosition);\n }\n };\n\n return {\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: dragdrop.prepare,\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: dragdrop.start\n };\n});\n"],"file":"dragdrop.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/dragdrop.js"],"names":["define","$","autoScroll","dragdrop","eventCaptureOptions","passive","capture","dragProxy","onMove","onDrop","initialPosition","initialX","initialY","touching","prepare","event","preventDefault","start","type","changedTouches","length","which","details","getEventXY","xy","x","y","offset","addEventSpecial","mouseMove","mouseUp","touchEnd","touchMove","identifier","Error","scroll","handler","window","addEventListener","ex","pageX","pageY","e","i","handleMove","current","topOffset","top","parseInt","css","leftOffset","left","maxY","document","height","outerHeight","maxX","width","outerWidth","initial","position","Math","max","min","handleEnd","removeEventListener","stop","currentPosition"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/*\n * JavaScript to handle drag operations, including automatic scrolling.\n *\n * Note: this module is defined statically. It is a singleton. You\n * can only have one use of it active at any time. However, you\n * can only drag one thing at a time, this is not a problem in practice.\n *\n * @module core/dragdrop\n * @copyright 2016 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.6\n */\ndefine(['jquery', 'core/autoscroll'], function($, autoScroll) {\n var dragdrop = {\n /**\n * A boolean or options argument depending on whether browser supports passive events.\n * @private\n */\n eventCaptureOptions: {passive: false, capture: true},\n\n /**\n * Drag proxy if any.\n * @private\n */\n dragProxy: null,\n\n /**\n * Function called on move.\n * @private\n */\n onMove: null,\n\n /**\n * Function called on drop.\n * @private\n */\n onDrop: null,\n\n /**\n * Initial position of proxy at drag start.\n */\n initialPosition: null,\n\n /**\n * Initial page X of cursor at drag start.\n */\n initialX: null,\n\n /**\n * Initial page Y of cursor at drag start.\n */\n initialY: null,\n\n /**\n * If touch event is in progress, this will be the id, otherwise null\n */\n touching: null,\n\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: function(event) {\n event.preventDefault();\n var start;\n if (event.type === 'touchstart') {\n // For touch, start if there's at least one touch and we are not currently doing\n // a touch event.\n start = (dragdrop.touching === null) && event.changedTouches.length > 0;\n } else {\n // For mousedown, start if it's the left button.\n start = event.which === 1;\n }\n if (start) {\n var details = dragdrop.getEventXY(event);\n details.start = true;\n return details;\n } else {\n return {start: false};\n }\n },\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: function(event, dragProxy, onMove, onDrop) {\n var xy = dragdrop.getEventXY(event);\n dragdrop.initialX = xy.x;\n dragdrop.initialY = xy.y;\n dragdrop.initialPosition = dragProxy.offset();\n dragdrop.dragProxy = dragProxy;\n dragdrop.onMove = onMove;\n dragdrop.onDrop = onDrop;\n\n switch (event.type) {\n case 'mousedown':\n // Cannot use jQuery 'on' because events need to not be passive.\n dragdrop.addEventSpecial('mousemove', dragdrop.mouseMove);\n dragdrop.addEventSpecial('mouseup', dragdrop.mouseUp);\n break;\n case 'touchstart':\n dragdrop.addEventSpecial('touchend', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchcancel', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchmove', dragdrop.touchMove);\n dragdrop.touching = event.changedTouches[0].identifier;\n break;\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n autoScroll.start(dragdrop.scroll);\n },\n\n /**\n * Adds an event listener with special event capture options (capture, not passive). If the\n * browser does not support passive events, it will fall back to the boolean for capture.\n *\n * @private\n * @param {Object} event Event type string\n * @param {Object} handler Handler function\n */\n addEventSpecial: function(event, handler) {\n try {\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n } catch (ex) {\n dragdrop.eventCaptureOptions = true;\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n }\n },\n\n /**\n * Gets X/Y co-ordinates of an event, which can be either touchstart or mousedown.\n *\n * @private\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} X/Y co-ordinates\n */\n getEventXY: function(event) {\n switch (event.type) {\n case 'touchstart':\n return {x: event.changedTouches[0].pageX,\n y: event.changedTouches[0].pageY};\n case 'mousedown':\n return {x: event.pageX, y: event.pageY};\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleMove(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n dragdrop.handleMove(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for move event (mouse or touch).\n *\n * @private\n * @param {number} pageX X co-ordinate\n * @param {number} pageY Y co-ordinate\n */\n handleMove: function(pageX, pageY) {\n // Move the drag proxy, not letting you move it out of screen or window bounds.\n var current = dragdrop.dragProxy.offset();\n var topOffset = current.top - parseInt(dragdrop.dragProxy.css('top'));\n var leftOffset = current.left - parseInt(dragdrop.dragProxy.css('left'));\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight() - topOffset;\n var maxX = $(document).width() - dragdrop.dragProxy.outerWidth() - leftOffset;\n var minY = -topOffset;\n var minX = -leftOffset;\n var initial = dragdrop.initialPosition;\n var position = {\n top: Math.max(minY, Math.min(maxY, initial.top + (pageY - dragdrop.initialY) - topOffset)),\n left: Math.max(minX, Math.min(maxX, initial.left + (pageX - dragdrop.initialX) - leftOffset))\n };\n dragdrop.dragProxy.css(position);\n\n // Trigger move handler.\n dragdrop.onMove(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Event handler for touch end.\n *\n * @private\n * @param {Object} e Event\n */\n touchEnd: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleEnd(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse up.\n *\n * @private\n * @param {Object} e Event\n */\n mouseUp: function(e) {\n dragdrop.handleEnd(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for end drag (mouse or touch).\n *\n * @private\n * @param {number} pageX X\n * @param {number} pageY Y\n */\n handleEnd: function(pageX, pageY) {\n if (dragdrop.touching !== null) {\n window.removeEventListener('touchend', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchcancel', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchmove', dragdrop.touchMove, dragdrop.eventCaptureOptions);\n dragdrop.touching = null;\n } else {\n window.removeEventListener('mousemove', dragdrop.mouseMove, dragdrop.eventCaptureOptions);\n window.removeEventListener('mouseup', dragdrop.mouseUp, dragdrop.eventCaptureOptions);\n }\n autoScroll.stop();\n dragdrop.onDrop(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Called when the page scrolls.\n *\n * @private\n * @param {number} offset Amount of scroll\n */\n scroll: function(offset) {\n // Move the proxy to match.\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight();\n var currentPosition = dragdrop.dragProxy.offset();\n currentPosition.top = Math.min(maxY, currentPosition.top + offset);\n dragdrop.dragProxy.css(currentPosition);\n }\n };\n\n return {\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: dragdrop.prepare,\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: dragdrop.start\n };\n});\n"],"file":"dragdrop.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/emoji/auto_complete.min.js.map b/lib/amd/build/emoji/auto_complete.min.js.map
index f61d05b6c0c..431bc2f6fc3 100644
--- a/lib/amd/build/emoji/auto_complete.min.js.map
+++ b/lib/amd/build/emoji/auto_complete.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/emoji/auto_complete.js"],"names":["RECENT_EMOJIS_STORAGE_KEY","SELECTORS","EMOJI_BUTTON","ACTIVE_EMOJI_BUTTON","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","addRecentEmoji","unified","shortName","newEmoji","shortnames","recentEmojis","newRecentEmojis","filter","emoji","slice","set","stringify","getEmojiTextFromShortName","EmojiData","byShortName","charCodes","split","map","code","String","fromCodePoint","apply","render","root","shortNames","renderContext","emojis","index","active","emojitext","displayshortname","shortname","html","innerHTML","searchEmojis","searchTerm","limit","data","toLowerCase","Object","keys","includes","getWordFromPosition","text","position","startMatches","match","endMatches","startText","endText","length","isCompleteShortName","test","isPartialShortName","getShortNameFromText","replace","getActiveEmojiSuggestion","querySelector","selectPreviousEmojiSuggestion","activeEmojiSuggestion","previousSuggestion","previousElementSibling","classList","remove","add","scrollIntoView","behaviour","inline","selectNextEmojiSuggestion","nextSuggestion","nextElementSibling","selectEmojiElement","element","selectCallback","getAttribute","trim","textArea","hasSuggestionCallback","hasSuggestions","previousSearchText","addEventListener","value","cursorPos","selectionStart","searchText","emojiText","suggestions","e","isModifierPressed","shiftKey","metaKey","altKey","ctrlKey","which","KeyCodes","escape","arrowLeft","preventDefault","arrowRight","enter","stopPropagation","target","matches"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Emoji auto complete.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as EmojiData from 'core/emoji/data';\nimport {render as renderTemplate} from 'core/templates';\nimport {debounce} from 'core/utils';\nimport LocalStorage from 'core/localstorage';\nimport KeyCodes from 'core/key_codes';\n\nconst INPUT_DEBOUNCE_TIMER = 200;\nconst SUGGESTION_LIMIT = 50;\nconst MAX_RECENT_COUNT = 27;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\n\nconst SELECTORS = {\n EMOJI_BUTTON: '[data-region=\"emoji-button\"]',\n ACTIVE_EMOJI_BUTTON: '[data-region=\"emoji-button\"].active',\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Add an emoji data to the set of recent emojis. The new set of recent emojis are\n * saved in local storage.\n *\n * @param {String} unified The char chodes for the emoji\n * @param {String} shortName The emoji short name\n */\nconst addRecentEmoji = (unified, shortName) => {\n const newEmoji = {\n unified,\n shortnames: [shortName]\n };\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(newRecentEmojis));\n};\n\n/**\n * Get the actual emoji string from the short name.\n *\n * @param {String} shortName Emoji short name\n * @return {String|null}\n */\nconst getEmojiTextFromShortName = (shortName) => {\n const unified = EmojiData.byShortName[shortName];\n\n if (unified) {\n const charCodes = unified.split('-').map(code => `0x${code}`);\n return String.fromCodePoint.apply(null, charCodes);\n } else {\n return null;\n }\n};\n\n/**\n * Render the auto complete list for the given short names.\n *\n * @param {Element} root The root container for the emoji auto complete\n * @param {Array} shortNames The list of short names for emoji suggestions to show\n */\nconst render = async (root, shortNames) => {\n const renderContext = {\n emojis: shortNames.map((shortName, index) => {\n return {\n active: index === 0,\n emojitext: getEmojiTextFromShortName(shortName),\n displayshortname: `:${shortName}:`,\n shortname: shortName,\n unified: EmojiData.byShortName[shortName]\n };\n })\n };\n const html = await renderTemplate('core/emoji/auto_complete', renderContext);\n root.innerHTML = html;\n};\n\n/**\n * Get the list of emoji short names that include the given search term. If\n * the search term is an empty string then the list of recently used emojis\n * will be returned.\n *\n * @param {String} searchTerm Text to match on\n * @param {Number} limit Maximum number of results to return\n * @return {Array}\n */\nconst searchEmojis = (searchTerm, limit) => {\n if (searchTerm === '') {\n return getRecentEmojis().map(data => data.shortnames[0]).slice(0, limit);\n } else {\n searchTerm = searchTerm.toLowerCase();\n return Object.keys(EmojiData.byShortName)\n .filter(shortName => shortName.includes(searchTerm))\n .slice(0, limit);\n }\n};\n\n/**\n * Get the current word at the given position (index) within the text.\n *\n * @param {String} text The text to process\n * @param {Number} position The position (index) within the text to match the word\n * @return {String}\n */\nconst getWordFromPosition = (text, position) => {\n const startMatches = text.slice(0, position).match(/(\\S*)$/);\n const endMatches = text.slice(position).match(/^(\\S*)/);\n let startText = '';\n let endText = '';\n\n if (startMatches) {\n startText = startMatches[startMatches.length - 1];\n }\n\n if (endMatches) {\n endText = endMatches[endMatches.length - 1];\n }\n\n return `${startText}${endText}`;\n};\n\n/**\n * Check if the given text is a full short name, i.e. has leading and trialing colon\n * characters.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isCompleteShortName = text => /^:[^:\\s]+:$/.test(text);\n\n/**\n * Check if the given text is a partial short name, i.e. has a leading colon but no\n * trailing colon.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isPartialShortName = text => /^:[^:\\s]*$/.test(text);\n\n/**\n * Remove the colon characters from the given text.\n *\n * @param {String} text The text to process\n * @return {String}\n */\nconst getShortNameFromText = text => text.replace(/:/g, '');\n\n/**\n * Get the currently active emoji button element in the list of suggestions.\n *\n * @param {Element} root The emoji auto complete container element\n * @return {Element|null}\n */\nconst getActiveEmojiSuggestion = (root) => {\n return root.querySelector(SELECTORS.ACTIVE_EMOJI_BUTTON);\n};\n\n/**\n * Make the previous sibling of the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectPreviousEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const previousSuggestion = activeEmojiSuggestion.previousElementSibling;\n\n if (previousSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n previousSuggestion.classList.add('active');\n previousSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Make the next sibling to the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectNextEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const nextSuggestion = activeEmojiSuggestion.nextElementSibling;\n\n if (nextSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n nextSuggestion.classList.add('active');\n nextSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Trigger the select callback for the given emoji button element.\n *\n * @param {Element} element The emoji button element\n * @param {Function} selectCallback The callback for when the user selects an emoji\n */\nconst selectEmojiElement = (element, selectCallback) => {\n const shortName = element.getAttribute('data-short-name');\n const unified = element.getAttribute('data-unified');\n addRecentEmoji(unified, shortName);\n selectCallback(element.innerHTML.trim());\n};\n\n/**\n * Initialise the emoji auto complete.\n *\n * @param {Element} root The root container element for the auto complete\n * @param {Element} textArea The text area element to monitor for auto complete\n * @param {Function} hasSuggestionCallback Callback for when there are auto-complete suggestions\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, textArea, hasSuggestionCallback, selectCallback) => {\n let hasSuggestions = false;\n let previousSearchText = '';\n\n // Debounce the listener so that each keypress delays the execution of the handler. The\n // handler should only run 200 milliseconds after the last keypress.\n textArea.addEventListener('keyup', debounce(() => {\n // This is a \"keyup\" listener so that it only executes after the text area value\n // has been updated.\n const text = textArea.value;\n const cursorPos = textArea.selectionStart;\n const searchText = getWordFromPosition(text, cursorPos);\n\n if (searchText === previousSearchText) {\n // Nothing has changed so no need to take any action.\n return;\n } else {\n previousSearchText = searchText;\n }\n\n if (isCompleteShortName(searchText)) {\n // If the user has entered a full short name (with leading and trialing colons)\n // then see if we can find a match for it and auto complete it.\n const shortName = getShortNameFromText(searchText);\n const emojiText = getEmojiTextFromShortName(shortName);\n hasSuggestions = false;\n if (emojiText) {\n addRecentEmoji(EmojiData.byShortName[shortName], shortName);\n selectCallback(emojiText);\n }\n } else if (isPartialShortName(searchText)) {\n // If the user has entered a partial short name (leading colon but no trailing) then\n // search on the text to see if we can find some suggestions for them.\n const suggestions = searchEmojis(getShortNameFromText(searchText), SUGGESTION_LIMIT);\n\n if (suggestions.length) {\n render(root, suggestions);\n hasSuggestions = true;\n } else {\n hasSuggestions = false;\n }\n } else {\n hasSuggestions = false;\n }\n\n hasSuggestionCallback(hasSuggestions);\n }, INPUT_DEBOUNCE_TIMER));\n\n textArea.addEventListener('keydown', (e) => {\n if (hasSuggestions) {\n const isModifierPressed = (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n if (!isModifierPressed) {\n switch (e.which) {\n case KeyCodes.escape:\n // Escape key closes the auto complete.\n hasSuggestions = false;\n hasSuggestionCallback(false);\n break;\n case KeyCodes.arrowLeft:\n // Arrow keys navigate through the list of suggetions.\n selectPreviousEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.arrowRight:\n // Arrow keys navigate through the list of suggetions.\n selectNextEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.enter:\n // Enter key selects the current suggestion.\n selectEmojiElement(getActiveEmojiSuggestion(root), selectCallback);\n e.preventDefault();\n e.stopPropagation();\n break;\n }\n }\n }\n });\n\n root.addEventListener('click', (e) => {\n const target = e.target;\n if (target.matches(SELECTORS.EMOJI_BUTTON)) {\n selectEmojiElement(target, selectCallback);\n }\n });\n};"],"file":"auto_complete.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../src/emoji/auto_complete.js"],"names":["RECENT_EMOJIS_STORAGE_KEY","SELECTORS","EMOJI_BUTTON","ACTIVE_EMOJI_BUTTON","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","addRecentEmoji","unified","shortName","newEmoji","shortnames","recentEmojis","newRecentEmojis","filter","emoji","slice","set","stringify","getEmojiTextFromShortName","EmojiData","byShortName","charCodes","split","map","code","String","fromCodePoint","apply","render","root","shortNames","renderContext","emojis","index","active","emojitext","displayshortname","shortname","html","innerHTML","searchEmojis","searchTerm","limit","data","toLowerCase","Object","keys","includes","getWordFromPosition","text","position","startMatches","match","endMatches","startText","endText","length","isCompleteShortName","test","isPartialShortName","getShortNameFromText","replace","getActiveEmojiSuggestion","querySelector","selectPreviousEmojiSuggestion","activeEmojiSuggestion","previousSuggestion","previousElementSibling","classList","remove","add","scrollIntoView","behaviour","inline","selectNextEmojiSuggestion","nextSuggestion","nextElementSibling","selectEmojiElement","element","selectCallback","getAttribute","trim","textArea","hasSuggestionCallback","hasSuggestions","previousSearchText","addEventListener","value","cursorPos","selectionStart","searchText","emojiText","suggestions","e","isModifierPressed","shiftKey","metaKey","altKey","ctrlKey","which","KeyCodes","escape","arrowLeft","preventDefault","arrowRight","enter","stopPropagation","target","matches"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Emoji auto complete.\n *\n * @module core/emoji/auto_complete\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as EmojiData from 'core/emoji/data';\nimport {render as renderTemplate} from 'core/templates';\nimport {debounce} from 'core/utils';\nimport LocalStorage from 'core/localstorage';\nimport KeyCodes from 'core/key_codes';\n\nconst INPUT_DEBOUNCE_TIMER = 200;\nconst SUGGESTION_LIMIT = 50;\nconst MAX_RECENT_COUNT = 27;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\n\nconst SELECTORS = {\n EMOJI_BUTTON: '[data-region=\"emoji-button\"]',\n ACTIVE_EMOJI_BUTTON: '[data-region=\"emoji-button\"].active',\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Add an emoji data to the set of recent emojis. The new set of recent emojis are\n * saved in local storage.\n *\n * @param {String} unified The char chodes for the emoji\n * @param {String} shortName The emoji short name\n */\nconst addRecentEmoji = (unified, shortName) => {\n const newEmoji = {\n unified,\n shortnames: [shortName]\n };\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(newRecentEmojis));\n};\n\n/**\n * Get the actual emoji string from the short name.\n *\n * @param {String} shortName Emoji short name\n * @return {String|null}\n */\nconst getEmojiTextFromShortName = (shortName) => {\n const unified = EmojiData.byShortName[shortName];\n\n if (unified) {\n const charCodes = unified.split('-').map(code => `0x${code}`);\n return String.fromCodePoint.apply(null, charCodes);\n } else {\n return null;\n }\n};\n\n/**\n * Render the auto complete list for the given short names.\n *\n * @param {Element} root The root container for the emoji auto complete\n * @param {Array} shortNames The list of short names for emoji suggestions to show\n */\nconst render = async(root, shortNames) => {\n const renderContext = {\n emojis: shortNames.map((shortName, index) => {\n return {\n active: index === 0,\n emojitext: getEmojiTextFromShortName(shortName),\n displayshortname: `:${shortName}:`,\n shortname: shortName,\n unified: EmojiData.byShortName[shortName]\n };\n })\n };\n const html = await renderTemplate('core/emoji/auto_complete', renderContext);\n root.innerHTML = html;\n};\n\n/**\n * Get the list of emoji short names that include the given search term. If\n * the search term is an empty string then the list of recently used emojis\n * will be returned.\n *\n * @param {String} searchTerm Text to match on\n * @param {Number} limit Maximum number of results to return\n * @return {Array}\n */\nconst searchEmojis = (searchTerm, limit) => {\n if (searchTerm === '') {\n return getRecentEmojis().map(data => data.shortnames[0]).slice(0, limit);\n } else {\n searchTerm = searchTerm.toLowerCase();\n return Object.keys(EmojiData.byShortName)\n .filter(shortName => shortName.includes(searchTerm))\n .slice(0, limit);\n }\n};\n\n/**\n * Get the current word at the given position (index) within the text.\n *\n * @param {String} text The text to process\n * @param {Number} position The position (index) within the text to match the word\n * @return {String}\n */\nconst getWordFromPosition = (text, position) => {\n const startMatches = text.slice(0, position).match(/(\\S*)$/);\n const endMatches = text.slice(position).match(/^(\\S*)/);\n let startText = '';\n let endText = '';\n\n if (startMatches) {\n startText = startMatches[startMatches.length - 1];\n }\n\n if (endMatches) {\n endText = endMatches[endMatches.length - 1];\n }\n\n return `${startText}${endText}`;\n};\n\n/**\n * Check if the given text is a full short name, i.e. has leading and trialing colon\n * characters.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isCompleteShortName = text => /^:[^:\\s]+:$/.test(text);\n\n/**\n * Check if the given text is a partial short name, i.e. has a leading colon but no\n * trailing colon.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isPartialShortName = text => /^:[^:\\s]*$/.test(text);\n\n/**\n * Remove the colon characters from the given text.\n *\n * @param {String} text The text to process\n * @return {String}\n */\nconst getShortNameFromText = text => text.replace(/:/g, '');\n\n/**\n * Get the currently active emoji button element in the list of suggestions.\n *\n * @param {Element} root The emoji auto complete container element\n * @return {Element|null}\n */\nconst getActiveEmojiSuggestion = (root) => {\n return root.querySelector(SELECTORS.ACTIVE_EMOJI_BUTTON);\n};\n\n/**\n * Make the previous sibling of the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectPreviousEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const previousSuggestion = activeEmojiSuggestion.previousElementSibling;\n\n if (previousSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n previousSuggestion.classList.add('active');\n previousSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Make the next sibling to the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectNextEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const nextSuggestion = activeEmojiSuggestion.nextElementSibling;\n\n if (nextSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n nextSuggestion.classList.add('active');\n nextSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Trigger the select callback for the given emoji button element.\n *\n * @param {Element} element The emoji button element\n * @param {Function} selectCallback The callback for when the user selects an emoji\n */\nconst selectEmojiElement = (element, selectCallback) => {\n const shortName = element.getAttribute('data-short-name');\n const unified = element.getAttribute('data-unified');\n addRecentEmoji(unified, shortName);\n selectCallback(element.innerHTML.trim());\n};\n\n/**\n * Initialise the emoji auto complete.\n *\n * @method\n * @param {Element} root The root container element for the auto complete\n * @param {Element} textArea The text area element to monitor for auto complete\n * @param {Function} hasSuggestionCallback Callback for when there are auto-complete suggestions\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, textArea, hasSuggestionCallback, selectCallback) => {\n let hasSuggestions = false;\n let previousSearchText = '';\n\n // Debounce the listener so that each keypress delays the execution of the handler. The\n // handler should only run 200 milliseconds after the last keypress.\n textArea.addEventListener('keyup', debounce(() => {\n // This is a \"keyup\" listener so that it only executes after the text area value\n // has been updated.\n const text = textArea.value;\n const cursorPos = textArea.selectionStart;\n const searchText = getWordFromPosition(text, cursorPos);\n\n if (searchText === previousSearchText) {\n // Nothing has changed so no need to take any action.\n return;\n } else {\n previousSearchText = searchText;\n }\n\n if (isCompleteShortName(searchText)) {\n // If the user has entered a full short name (with leading and trialing colons)\n // then see if we can find a match for it and auto complete it.\n const shortName = getShortNameFromText(searchText);\n const emojiText = getEmojiTextFromShortName(shortName);\n hasSuggestions = false;\n if (emojiText) {\n addRecentEmoji(EmojiData.byShortName[shortName], shortName);\n selectCallback(emojiText);\n }\n } else if (isPartialShortName(searchText)) {\n // If the user has entered a partial short name (leading colon but no trailing) then\n // search on the text to see if we can find some suggestions for them.\n const suggestions = searchEmojis(getShortNameFromText(searchText), SUGGESTION_LIMIT);\n\n if (suggestions.length) {\n render(root, suggestions);\n hasSuggestions = true;\n } else {\n hasSuggestions = false;\n }\n } else {\n hasSuggestions = false;\n }\n\n hasSuggestionCallback(hasSuggestions);\n }, INPUT_DEBOUNCE_TIMER));\n\n textArea.addEventListener('keydown', (e) => {\n if (hasSuggestions) {\n const isModifierPressed = (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n if (!isModifierPressed) {\n switch (e.which) {\n case KeyCodes.escape:\n // Escape key closes the auto complete.\n hasSuggestions = false;\n hasSuggestionCallback(false);\n break;\n case KeyCodes.arrowLeft:\n // Arrow keys navigate through the list of suggetions.\n selectPreviousEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.arrowRight:\n // Arrow keys navigate through the list of suggetions.\n selectNextEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.enter:\n // Enter key selects the current suggestion.\n selectEmojiElement(getActiveEmojiSuggestion(root), selectCallback);\n e.preventDefault();\n e.stopPropagation();\n break;\n }\n }\n }\n });\n\n root.addEventListener('click', (e) => {\n const target = e.target;\n if (target.matches(SELECTORS.EMOJI_BUTTON)) {\n selectEmojiElement(target, selectCallback);\n }\n });\n};\n"],"file":"auto_complete.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/emoji/data.min.js.map b/lib/amd/build/emoji/data.min.js.map
index a6a2840af49..580f079308c 100644
--- a/lib/amd/build/emoji/data.min.js.map
+++ b/lib/amd/build/emoji/data.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/emoji/data.js"],"names":[],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Emoji data based on the data available from https://github.com/iamcal/emoji-data.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport const byCategory = [\n {\n \"name\": \"Smileys & Emotion\",\n \"emojis\": [\n {\n \"unified\": \"1F600\",\n \"shortnames\": [\n \"grinning\"\n ]\n },\n {\n \"unified\": \"1F603\",\n \"shortnames\": [\n \"smiley\"\n ]\n },\n {\n \"unified\": \"1F604\",\n \"shortnames\": [\n \"smile\"\n ]\n },\n {\n \"unified\": \"1F601\",\n \"shortnames\": [\n \"grin\"\n ]\n },\n {\n \"unified\": \"1F606\",\n \"shortnames\": [\n \"laughing\"\n ]\n },\n {\n \"unified\": \"1F605\",\n \"shortnames\": [\n \"sweat_smile\"\n ]\n },\n {\n \"unified\": \"1F923\",\n \"shortnames\": [\n \"rolling_on_the_floor_laughing\"\n ]\n },\n {\n \"unified\": \"1F602\",\n \"shortnames\": [\n \"joy\"\n ]\n },\n {\n \"unified\": \"1F642\",\n \"shortnames\": [\n \"slightly_smiling_face\"\n ]\n },\n {\n \"unified\": \"1F643\",\n \"shortnames\": [\n \"upside_down_face\"\n ]\n },\n {\n \"unified\": \"1F609\",\n \"shortnames\": [\n \"wink\"\n ]\n },\n {\n \"unified\": \"1F60A\",\n \"shortnames\": [\n \"blush\"\n ]\n },\n {\n \"unified\": \"1F607\",\n \"shortnames\": [\n \"innocent\"\n ]\n },\n {\n \"unified\": \"1F970\",\n \"shortnames\": [\n \"smiling_face_with_3_hearts\"\n ]\n },\n {\n \"unified\": \"1F60D\",\n \"shortnames\": [\n \"heart_eyes\"\n ]\n },\n {\n \"unified\": \"1F929\",\n \"shortnames\": [\n \"star-struck\"\n ]\n },\n {\n \"unified\": \"1F618\",\n \"shortnames\": [\n \"kissing_heart\"\n ]\n },\n {\n \"unified\": \"1F617\",\n \"shortnames\": [\n \"kissing\"\n ]\n },\n {\n \"unified\": \"263A-FE0F\",\n \"shortnames\": [\n \"relaxed\"\n ]\n },\n {\n \"unified\": \"1F61A\",\n \"shortnames\": [\n \"kissing_closed_eyes\"\n ]\n },\n {\n \"unified\": \"1F619\",\n \"shortnames\": [\n \"kissing_smiling_eyes\"\n ]\n },\n {\n \"unified\": \"1F972\",\n \"shortnames\": [\n \"smiling_face_with_tear\"\n ]\n },\n {\n \"unified\": \"1F60B\",\n \"shortnames\": [\n \"yum\"\n ]\n },\n {\n \"unified\": \"1F61B\",\n \"shortnames\": [\n \"stuck_out_tongue\"\n ]\n },\n {\n \"unified\": \"1F61C\",\n \"shortnames\": [\n \"stuck_out_tongue_winking_eye\"\n ]\n },\n {\n \"unified\": \"1F92A\",\n \"shortnames\": [\n \"zany_face\"\n ]\n },\n {\n \"unified\": \"1F61D\",\n \"shortnames\": [\n \"stuck_out_tongue_closed_eyes\"\n ]\n },\n {\n \"unified\": \"1F911\",\n \"shortnames\": [\n \"money_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F917\",\n \"shortnames\": [\n \"hugging_face\"\n ]\n },\n {\n \"unified\": \"1F92D\",\n \"shortnames\": [\n \"face_with_hand_over_mouth\"\n ]\n },\n {\n \"unified\": \"1F92B\",\n \"shortnames\": [\n \"shushing_face\"\n ]\n },\n {\n \"unified\": \"1F914\",\n \"shortnames\": [\n \"thinking_face\"\n ]\n },\n {\n \"unified\": \"1F910\",\n \"shortnames\": [\n \"zipper_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F928\",\n \"shortnames\": [\n \"face_with_raised_eyebrow\"\n ]\n },\n {\n \"unified\": \"1F610\",\n \"shortnames\": [\n \"neutral_face\"\n ]\n },\n {\n \"unified\": \"1F611\",\n \"shortnames\": [\n \"expressionless\"\n ]\n },\n {\n \"unified\": \"1F636\",\n \"shortnames\": [\n \"no_mouth\"\n ]\n },\n {\n \"unified\": \"1F60F\",\n \"shortnames\": [\n \"smirk\"\n ]\n },\n {\n \"unified\": \"1F612\",\n \"shortnames\": [\n \"unamused\"\n ]\n },\n {\n \"unified\": \"1F644\",\n \"shortnames\": [\n \"face_with_rolling_eyes\"\n ]\n },\n {\n \"unified\": \"1F62C\",\n \"shortnames\": [\n \"grimacing\"\n ]\n },\n {\n \"unified\": \"1F925\",\n \"shortnames\": [\n \"lying_face\"\n ]\n },\n {\n \"unified\": \"1F60C\",\n \"shortnames\": [\n \"relieved\"\n ]\n },\n {\n \"unified\": \"1F614\",\n \"shortnames\": [\n \"pensive\"\n ]\n },\n {\n \"unified\": \"1F62A\",\n \"shortnames\": [\n \"sleepy\"\n ]\n },\n {\n \"unified\": \"1F924\",\n \"shortnames\": [\n \"drooling_face\"\n ]\n },\n {\n \"unified\": \"1F634\",\n \"shortnames\": [\n \"sleeping\"\n ]\n },\n {\n \"unified\": \"1F637\",\n \"shortnames\": [\n \"mask\"\n ]\n },\n {\n \"unified\": \"1F912\",\n \"shortnames\": [\n \"face_with_thermometer\"\n ]\n },\n {\n \"unified\": \"1F915\",\n \"shortnames\": [\n \"face_with_head_bandage\"\n ]\n },\n {\n \"unified\": \"1F922\",\n \"shortnames\": [\n \"nauseated_face\"\n ]\n },\n {\n \"unified\": \"1F92E\",\n \"shortnames\": [\n \"face_vomiting\"\n ]\n },\n {\n \"unified\": \"1F927\",\n \"shortnames\": [\n \"sneezing_face\"\n ]\n },\n {\n \"unified\": \"1F975\",\n \"shortnames\": [\n \"hot_face\"\n ]\n },\n {\n \"unified\": \"1F976\",\n \"shortnames\": [\n \"cold_face\"\n ]\n },\n {\n \"unified\": \"1F974\",\n \"shortnames\": [\n \"woozy_face\"\n ]\n },\n {\n \"unified\": \"1F635\",\n \"shortnames\": [\n \"dizzy_face\"\n ]\n },\n {\n \"unified\": \"1F92F\",\n \"shortnames\": [\n \"exploding_head\"\n ]\n },\n {\n \"unified\": \"1F920\",\n \"shortnames\": [\n \"face_with_cowboy_hat\"\n ]\n },\n {\n \"unified\": \"1F973\",\n \"shortnames\": [\n \"partying_face\"\n ]\n },\n {\n \"unified\": \"1F978\",\n \"shortnames\": [\n \"disguised_face\"\n ]\n },\n {\n \"unified\": \"1F60E\",\n \"shortnames\": [\n \"sunglasses\"\n ]\n },\n {\n \"unified\": \"1F913\",\n \"shortnames\": [\n \"nerd_face\"\n ]\n },\n {\n \"unified\": \"1F9D0\",\n \"shortnames\": [\n \"face_with_monocle\"\n ]\n },\n {\n \"unified\": \"1F615\",\n \"shortnames\": [\n \"confused\"\n ]\n },\n {\n \"unified\": \"1F61F\",\n \"shortnames\": [\n \"worried\"\n ]\n },\n {\n \"unified\": \"1F641\",\n \"shortnames\": [\n \"slightly_frowning_face\"\n ]\n },\n {\n \"unified\": \"2639-FE0F\",\n \"shortnames\": [\n \"white_frowning_face\"\n ]\n },\n {\n \"unified\": \"1F62E\",\n \"shortnames\": [\n \"open_mouth\"\n ]\n },\n {\n \"unified\": \"1F62F\",\n \"shortnames\": [\n \"hushed\"\n ]\n },\n {\n \"unified\": \"1F632\",\n \"shortnames\": [\n \"astonished\"\n ]\n },\n {\n \"unified\": \"1F633\",\n \"shortnames\": [\n \"flushed\"\n ]\n },\n {\n \"unified\": \"1F97A\",\n \"shortnames\": [\n \"pleading_face\"\n ]\n },\n {\n \"unified\": \"1F626\",\n \"shortnames\": [\n \"frowning\"\n ]\n },\n {\n \"unified\": \"1F627\",\n \"shortnames\": [\n \"anguished\"\n ]\n },\n {\n \"unified\": \"1F628\",\n \"shortnames\": [\n \"fearful\"\n ]\n },\n {\n \"unified\": \"1F630\",\n \"shortnames\": [\n \"cold_sweat\"\n ]\n },\n {\n \"unified\": \"1F625\",\n \"shortnames\": [\n \"disappointed_relieved\"\n ]\n },\n {\n \"unified\": \"1F622\",\n \"shortnames\": [\n \"cry\"\n ]\n },\n {\n \"unified\": \"1F62D\",\n \"shortnames\": [\n \"sob\"\n ]\n },\n {\n \"unified\": \"1F631\",\n \"shortnames\": [\n \"scream\"\n ]\n },\n {\n \"unified\": \"1F616\",\n \"shortnames\": [\n \"confounded\"\n ]\n },\n {\n \"unified\": \"1F623\",\n \"shortnames\": [\n \"persevere\"\n ]\n },\n {\n \"unified\": \"1F61E\",\n \"shortnames\": [\n \"disappointed\"\n ]\n },\n {\n \"unified\": \"1F613\",\n \"shortnames\": [\n \"sweat\"\n ]\n },\n {\n \"unified\": \"1F629\",\n \"shortnames\": [\n \"weary\"\n ]\n },\n {\n \"unified\": \"1F62B\",\n \"shortnames\": [\n \"tired_face\"\n ]\n },\n {\n \"unified\": \"1F971\",\n \"shortnames\": [\n \"yawning_face\"\n ]\n },\n {\n \"unified\": \"1F624\",\n \"shortnames\": [\n \"triumph\"\n ]\n },\n {\n \"unified\": \"1F621\",\n \"shortnames\": [\n \"rage\"\n ]\n },\n {\n \"unified\": \"1F620\",\n \"shortnames\": [\n \"angry\"\n ]\n },\n {\n \"unified\": \"1F92C\",\n \"shortnames\": [\n \"face_with_symbols_on_mouth\"\n ]\n },\n {\n \"unified\": \"1F608\",\n \"shortnames\": [\n \"smiling_imp\"\n ]\n },\n {\n \"unified\": \"1F47F\",\n \"shortnames\": [\n \"imp\"\n ]\n },\n {\n \"unified\": \"1F480\",\n \"shortnames\": [\n \"skull\"\n ]\n },\n {\n \"unified\": \"2620-FE0F\",\n \"shortnames\": [\n \"skull_and_crossbones\"\n ]\n },\n {\n \"unified\": \"1F4A9\",\n \"shortnames\": [\n \"hankey\"\n ]\n },\n {\n \"unified\": \"1F921\",\n \"shortnames\": [\n \"clown_face\"\n ]\n },\n {\n \"unified\": \"1F479\",\n \"shortnames\": [\n \"japanese_ogre\"\n ]\n },\n {\n \"unified\": \"1F47A\",\n \"shortnames\": [\n \"japanese_goblin\"\n ]\n },\n {\n \"unified\": \"1F47B\",\n \"shortnames\": [\n \"ghost\"\n ]\n },\n {\n \"unified\": \"1F47D\",\n \"shortnames\": [\n \"alien\"\n ]\n },\n {\n \"unified\": \"1F47E\",\n \"shortnames\": [\n \"space_invader\"\n ]\n },\n {\n \"unified\": \"1F916\",\n \"shortnames\": [\n \"robot_face\"\n ]\n },\n {\n \"unified\": \"1F63A\",\n \"shortnames\": [\n \"smiley_cat\"\n ]\n },\n {\n \"unified\": \"1F638\",\n \"shortnames\": [\n \"smile_cat\"\n ]\n },\n {\n \"unified\": \"1F639\",\n \"shortnames\": [\n \"joy_cat\"\n ]\n },\n {\n \"unified\": \"1F63B\",\n \"shortnames\": [\n \"heart_eyes_cat\"\n ]\n },\n {\n \"unified\": \"1F63C\",\n \"shortnames\": [\n \"smirk_cat\"\n ]\n },\n {\n \"unified\": \"1F63D\",\n \"shortnames\": [\n \"kissing_cat\"\n ]\n },\n {\n \"unified\": \"1F640\",\n \"shortnames\": [\n \"scream_cat\"\n ]\n },\n {\n \"unified\": \"1F63F\",\n \"shortnames\": [\n \"crying_cat_face\"\n ]\n },\n {\n \"unified\": \"1F63E\",\n \"shortnames\": [\n \"pouting_cat\"\n ]\n },\n {\n \"unified\": \"1F648\",\n \"shortnames\": [\n \"see_no_evil\"\n ]\n },\n {\n \"unified\": \"1F649\",\n \"shortnames\": [\n \"hear_no_evil\"\n ]\n },\n {\n \"unified\": \"1F64A\",\n \"shortnames\": [\n \"speak_no_evil\"\n ]\n },\n {\n \"unified\": \"1F48B\",\n \"shortnames\": [\n \"kiss\"\n ]\n },\n {\n \"unified\": \"1F48C\",\n \"shortnames\": [\n \"love_letter\"\n ]\n },\n {\n \"unified\": \"1F498\",\n \"shortnames\": [\n \"cupid\"\n ]\n },\n {\n \"unified\": \"1F49D\",\n \"shortnames\": [\n \"gift_heart\"\n ]\n },\n {\n \"unified\": \"1F496\",\n \"shortnames\": [\n \"sparkling_heart\"\n ]\n },\n {\n \"unified\": \"1F497\",\n \"shortnames\": [\n \"heartpulse\"\n ]\n },\n {\n \"unified\": \"1F493\",\n \"shortnames\": [\n \"heartbeat\"\n ]\n },\n {\n \"unified\": \"1F49E\",\n \"shortnames\": [\n \"revolving_hearts\"\n ]\n },\n {\n \"unified\": \"1F495\",\n \"shortnames\": [\n \"two_hearts\"\n ]\n },\n {\n \"unified\": \"1F49F\",\n \"shortnames\": [\n \"heart_decoration\"\n ]\n },\n {\n \"unified\": \"2763-FE0F\",\n \"shortnames\": [\n \"heavy_heart_exclamation_mark_ornament\"\n ]\n },\n {\n \"unified\": \"1F494\",\n \"shortnames\": [\n \"broken_heart\"\n ]\n },\n {\n \"unified\": \"2764-FE0F\",\n \"shortnames\": [\n \"heart\"\n ]\n },\n {\n \"unified\": \"1F9E1\",\n \"shortnames\": [\n \"orange_heart\"\n ]\n },\n {\n \"unified\": \"1F49B\",\n \"shortnames\": [\n \"yellow_heart\"\n ]\n },\n {\n \"unified\": \"1F49A\",\n \"shortnames\": [\n \"green_heart\"\n ]\n },\n {\n \"unified\": \"1F499\",\n \"shortnames\": [\n \"blue_heart\"\n ]\n },\n {\n \"unified\": \"1F49C\",\n \"shortnames\": [\n \"purple_heart\"\n ]\n },\n {\n \"unified\": \"1F90E\",\n \"shortnames\": [\n \"brown_heart\"\n ]\n },\n {\n \"unified\": \"1F5A4\",\n \"shortnames\": [\n \"black_heart\"\n ]\n },\n {\n \"unified\": \"1F90D\",\n \"shortnames\": [\n \"white_heart\"\n ]\n },\n {\n \"unified\": \"1F4AF\",\n \"shortnames\": [\n \"100\"\n ]\n },\n {\n \"unified\": \"1F4A2\",\n \"shortnames\": [\n \"anger\"\n ]\n },\n {\n \"unified\": \"1F4A5\",\n \"shortnames\": [\n \"boom\"\n ]\n },\n {\n \"unified\": \"1F4AB\",\n \"shortnames\": [\n \"dizzy\"\n ]\n },\n {\n \"unified\": \"1F4A6\",\n \"shortnames\": [\n \"sweat_drops\"\n ]\n },\n {\n \"unified\": \"1F4A8\",\n \"shortnames\": [\n \"dash\"\n ]\n },\n {\n \"unified\": \"1F573-FE0F\",\n \"shortnames\": [\n \"hole\"\n ]\n },\n {\n \"unified\": \"1F4A3\",\n \"shortnames\": [\n \"bomb\"\n ]\n },\n {\n \"unified\": \"1F4AC\",\n \"shortnames\": [\n \"speech_balloon\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"shortnames\": [\n \"eye-in-speech-bubble\"\n ]\n },\n {\n \"unified\": \"1F5E8-FE0F\",\n \"shortnames\": [\n \"left_speech_bubble\"\n ]\n },\n {\n \"unified\": \"1F5EF-FE0F\",\n \"shortnames\": [\n \"right_anger_bubble\"\n ]\n },\n {\n \"unified\": \"1F4AD\",\n \"shortnames\": [\n \"thought_balloon\"\n ]\n },\n {\n \"unified\": \"1F4A4\",\n \"shortnames\": [\n \"zzz\"\n ]\n }\n ]\n },\n {\n \"name\": \"People & Body\",\n \"emojis\": [\n {\n \"unified\": \"1F44B\",\n \"shortnames\": [\n \"wave\"\n ]\n },\n {\n \"unified\": \"1F91A\",\n \"shortnames\": [\n \"raised_back_of_hand\"\n ]\n },\n {\n \"unified\": \"1F590-FE0F\",\n \"shortnames\": [\n \"raised_hand_with_fingers_splayed\"\n ]\n },\n {\n \"unified\": \"270B\",\n \"shortnames\": [\n \"hand\"\n ]\n },\n {\n \"unified\": \"1F596\",\n \"shortnames\": [\n \"spock-hand\"\n ]\n },\n {\n \"unified\": \"1F44C\",\n \"shortnames\": [\n \"ok_hand\"\n ]\n },\n {\n \"unified\": \"1F90C\",\n \"shortnames\": [\n \"pinched_fingers\"\n ]\n },\n {\n \"unified\": \"1F90F\",\n \"shortnames\": [\n \"pinching_hand\"\n ]\n },\n {\n \"unified\": \"270C-FE0F\",\n \"shortnames\": [\n \"v\"\n ]\n },\n {\n \"unified\": \"1F91E\",\n \"shortnames\": [\n \"crossed_fingers\"\n ]\n },\n {\n \"unified\": \"1F91F\",\n \"shortnames\": [\n \"i_love_you_hand_sign\"\n ]\n },\n {\n \"unified\": \"1F918\",\n \"shortnames\": [\n \"the_horns\"\n ]\n },\n {\n \"unified\": \"1F919\",\n \"shortnames\": [\n \"call_me_hand\"\n ]\n },\n {\n \"unified\": \"1F448\",\n \"shortnames\": [\n \"point_left\"\n ]\n },\n {\n \"unified\": \"1F449\",\n \"shortnames\": [\n \"point_right\"\n ]\n },\n {\n \"unified\": \"1F446\",\n \"shortnames\": [\n \"point_up_2\"\n ]\n },\n {\n \"unified\": \"1F595\",\n \"shortnames\": [\n \"middle_finger\"\n ]\n },\n {\n \"unified\": \"1F447\",\n \"shortnames\": [\n \"point_down\"\n ]\n },\n {\n \"unified\": \"261D-FE0F\",\n \"shortnames\": [\n \"point_up\"\n ]\n },\n {\n \"unified\": \"1F44D\",\n \"shortnames\": [\n \"+1\"\n ]\n },\n {\n \"unified\": \"1F44E\",\n \"shortnames\": [\n \"-1\"\n ]\n },\n {\n \"unified\": \"270A\",\n \"shortnames\": [\n \"fist\"\n ]\n },\n {\n \"unified\": \"1F44A\",\n \"shortnames\": [\n \"facepunch\"\n ]\n },\n {\n \"unified\": \"1F91B\",\n \"shortnames\": [\n \"left-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F91C\",\n \"shortnames\": [\n \"right-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F44F\",\n \"shortnames\": [\n \"clap\"\n ]\n },\n {\n \"unified\": \"1F64C\",\n \"shortnames\": [\n \"raised_hands\"\n ]\n },\n {\n \"unified\": \"1F450\",\n \"shortnames\": [\n \"open_hands\"\n ]\n },\n {\n \"unified\": \"1F932\",\n \"shortnames\": [\n \"palms_up_together\"\n ]\n },\n {\n \"unified\": \"1F91D\",\n \"shortnames\": [\n \"handshake\"\n ]\n },\n {\n \"unified\": \"1F64F\",\n \"shortnames\": [\n \"pray\"\n ]\n },\n {\n \"unified\": \"270D-FE0F\",\n \"shortnames\": [\n \"writing_hand\"\n ]\n },\n {\n \"unified\": \"1F485\",\n \"shortnames\": [\n \"nail_care\"\n ]\n },\n {\n \"unified\": \"1F933\",\n \"shortnames\": [\n \"selfie\"\n ]\n },\n {\n \"unified\": \"1F4AA\",\n \"shortnames\": [\n \"muscle\"\n ]\n },\n {\n \"unified\": \"1F9BE\",\n \"shortnames\": [\n \"mechanical_arm\"\n ]\n },\n {\n \"unified\": \"1F9BF\",\n \"shortnames\": [\n \"mechanical_leg\"\n ]\n },\n {\n \"unified\": \"1F9B5\",\n \"shortnames\": [\n \"leg\"\n ]\n },\n {\n \"unified\": \"1F9B6\",\n \"shortnames\": [\n \"foot\"\n ]\n },\n {\n \"unified\": \"1F442\",\n \"shortnames\": [\n \"ear\"\n ]\n },\n {\n \"unified\": \"1F9BB\",\n \"shortnames\": [\n \"ear_with_hearing_aid\"\n ]\n },\n {\n \"unified\": \"1F443\",\n \"shortnames\": [\n \"nose\"\n ]\n },\n {\n \"unified\": \"1F9E0\",\n \"shortnames\": [\n \"brain\"\n ]\n },\n {\n \"unified\": \"1FAC0\",\n \"shortnames\": [\n \"anatomical_heart\"\n ]\n },\n {\n \"unified\": \"1FAC1\",\n \"shortnames\": [\n \"lungs\"\n ]\n },\n {\n \"unified\": \"1F9B7\",\n \"shortnames\": [\n \"tooth\"\n ]\n },\n {\n \"unified\": \"1F9B4\",\n \"shortnames\": [\n \"bone\"\n ]\n },\n {\n \"unified\": \"1F440\",\n \"shortnames\": [\n \"eyes\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F\",\n \"shortnames\": [\n \"eye\"\n ]\n },\n {\n \"unified\": \"1F445\",\n \"shortnames\": [\n \"tongue\"\n ]\n },\n {\n \"unified\": \"1F444\",\n \"shortnames\": [\n \"lips\"\n ]\n },\n {\n \"unified\": \"1F476\",\n \"shortnames\": [\n \"baby\"\n ]\n },\n {\n \"unified\": \"1F9D2\",\n \"shortnames\": [\n \"child\"\n ]\n },\n {\n \"unified\": \"1F466\",\n \"shortnames\": [\n \"boy\"\n ]\n },\n {\n \"unified\": \"1F467\",\n \"shortnames\": [\n \"girl\"\n ]\n },\n {\n \"unified\": \"1F9D1\",\n \"shortnames\": [\n \"adult\"\n ]\n },\n {\n \"unified\": \"1F468\",\n \"shortnames\": [\n \"man\"\n ]\n },\n {\n \"unified\": \"1F9D4\",\n \"shortnames\": [\n \"bearded_person\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B0\",\n \"shortnames\": [\n \"red_haired_man\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B1\",\n \"shortnames\": [\n \"curly_haired_man\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B3\",\n \"shortnames\": [\n \"white_haired_man\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B2\",\n \"shortnames\": [\n \"bald_man\"\n ]\n },\n {\n \"unified\": \"1F469\",\n \"shortnames\": [\n \"woman\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B0\",\n \"shortnames\": [\n \"red_haired_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B0\",\n \"shortnames\": [\n \"red_haired_person\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B1\",\n \"shortnames\": [\n \"curly_haired_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B1\",\n \"shortnames\": [\n \"curly_haired_person\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B3\",\n \"shortnames\": [\n \"white_haired_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B3\",\n \"shortnames\": [\n \"white_haired_person\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B2\",\n \"shortnames\": [\n \"bald_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B2\",\n \"shortnames\": [\n \"bald_person\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2640-FE0F\",\n \"shortnames\": [\n \"blond-haired-woman\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2642-FE0F\",\n \"shortnames\": [\n \"blond-haired-man\",\n \"person_with_blond_hair\"\n ]\n },\n {\n \"unified\": \"1F9D3\",\n \"shortnames\": [\n \"older_adult\"\n ]\n },\n {\n \"unified\": \"1F474\",\n \"shortnames\": [\n \"older_man\"\n ]\n },\n {\n \"unified\": \"1F475\",\n \"shortnames\": [\n \"older_woman\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-frowning\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-frowning\",\n \"person_frowning\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-pouting\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-pouting\",\n \"person_with_pouting_face\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-no\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-no\",\n \"no_good\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-ok\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-ok\",\n \"ok_woman\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-tipping-hand\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-tipping-hand\",\n \"information_desk_person\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-raising-hand\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-raising-hand\",\n \"raising_hand\"\n ]\n },\n {\n \"unified\": \"1F9CF\",\n \"shortnames\": [\n \"deaf_person\"\n ]\n },\n {\n \"unified\": \"1F9CF-200D-2642-FE0F\",\n \"shortnames\": [\n \"deaf_man\"\n ]\n },\n {\n \"unified\": \"1F9CF-200D-2640-FE0F\",\n \"shortnames\": [\n \"deaf_woman\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bowing\",\n \"bow\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bowing\"\n ]\n },\n {\n \"unified\": \"1F926\",\n \"shortnames\": [\n \"face_palm\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-facepalming\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-facepalming\"\n ]\n },\n {\n \"unified\": \"1F937\",\n \"shortnames\": [\n \"shrug\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-shrugging\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-shrugging\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-2695-FE0F\",\n \"shortnames\": [\n \"health_worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2695-FE0F\",\n \"shortnames\": [\n \"male-doctor\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2695-FE0F\",\n \"shortnames\": [\n \"female-doctor\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F393\",\n \"shortnames\": [\n \"student\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F393\",\n \"shortnames\": [\n \"male-student\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F393\",\n \"shortnames\": [\n \"female-student\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3EB\",\n \"shortnames\": [\n \"teacher\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3EB\",\n \"shortnames\": [\n \"male-teacher\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3EB\",\n \"shortnames\": [\n \"female-teacher\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-2696-FE0F\",\n \"shortnames\": [\n \"judge\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2696-FE0F\",\n \"shortnames\": [\n \"male-judge\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2696-FE0F\",\n \"shortnames\": [\n \"female-judge\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F33E\",\n \"shortnames\": [\n \"farmer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F33E\",\n \"shortnames\": [\n \"male-farmer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F33E\",\n \"shortnames\": [\n \"female-farmer\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F373\",\n \"shortnames\": [\n \"cook\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F373\",\n \"shortnames\": [\n \"male-cook\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F373\",\n \"shortnames\": [\n \"female-cook\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F527\",\n \"shortnames\": [\n \"mechanic\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F527\",\n \"shortnames\": [\n \"male-mechanic\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F527\",\n \"shortnames\": [\n \"female-mechanic\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3ED\",\n \"shortnames\": [\n \"factory_worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3ED\",\n \"shortnames\": [\n \"male-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3ED\",\n \"shortnames\": [\n \"female-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F4BC\",\n \"shortnames\": [\n \"office_worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BC\",\n \"shortnames\": [\n \"male-office-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BC\",\n \"shortnames\": [\n \"female-office-worker\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F52C\",\n \"shortnames\": [\n \"scientist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F52C\",\n \"shortnames\": [\n \"male-scientist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F52C\",\n \"shortnames\": [\n \"female-scientist\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F4BB\",\n \"shortnames\": [\n \"technologist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BB\",\n \"shortnames\": [\n \"male-technologist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BB\",\n \"shortnames\": [\n \"female-technologist\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3A4\",\n \"shortnames\": [\n \"singer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A4\",\n \"shortnames\": [\n \"male-singer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A4\",\n \"shortnames\": [\n \"female-singer\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3A8\",\n \"shortnames\": [\n \"artist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A8\",\n \"shortnames\": [\n \"male-artist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A8\",\n \"shortnames\": [\n \"female-artist\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-2708-FE0F\",\n \"shortnames\": [\n \"pilot\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2708-FE0F\",\n \"shortnames\": [\n \"male-pilot\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2708-FE0F\",\n \"shortnames\": [\n \"female-pilot\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F680\",\n \"shortnames\": [\n \"astronaut\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F680\",\n \"shortnames\": [\n \"male-astronaut\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F680\",\n \"shortnames\": [\n \"female-astronaut\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F692\",\n \"shortnames\": [\n \"firefighter\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F692\",\n \"shortnames\": [\n \"male-firefighter\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F692\",\n \"shortnames\": [\n \"female-firefighter\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-police-officer\",\n \"cop\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-police-officer\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-detective\",\n \"sleuth_or_spy\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-detective\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-guard\",\n \"guardsman\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-guard\"\n ]\n },\n {\n \"unified\": \"1F977\",\n \"shortnames\": [\n \"ninja\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-construction-worker\",\n \"construction_worker\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-construction-worker\"\n ]\n },\n {\n \"unified\": \"1F934\",\n \"shortnames\": [\n \"prince\"\n ]\n },\n {\n \"unified\": \"1F478\",\n \"shortnames\": [\n \"princess\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wearing-turban\",\n \"man_with_turban\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wearing-turban\"\n ]\n },\n {\n \"unified\": \"1F472\",\n \"shortnames\": [\n \"man_with_gua_pi_mao\"\n ]\n },\n {\n \"unified\": \"1F9D5\",\n \"shortnames\": [\n \"person_with_headscarf\"\n ]\n },\n {\n \"unified\": \"1F935-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_tuxedo\"\n ]\n },\n {\n \"unified\": \"1F935-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_tuxedo\"\n ]\n },\n {\n \"unified\": \"1F470\",\n \"shortnames\": [\n \"bride_with_veil\"\n ]\n },\n {\n \"unified\": \"1F470-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_with_veil\"\n ]\n },\n {\n \"unified\": \"1F470-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_with_veil\"\n ]\n },\n {\n \"unified\": \"1F930\",\n \"shortnames\": [\n \"pregnant_woman\"\n ]\n },\n {\n \"unified\": \"1F931\",\n \"shortnames\": [\n \"breast-feeding\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F37C\",\n \"shortnames\": [\n \"woman_feeding_baby\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F37C\",\n \"shortnames\": [\n \"man_feeding_baby\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F37C\",\n \"shortnames\": [\n \"person_feeding_baby\"\n ]\n },\n {\n \"unified\": \"1F47C\",\n \"shortnames\": [\n \"angel\"\n ]\n },\n {\n \"unified\": \"1F385\",\n \"shortnames\": [\n \"santa\"\n ]\n },\n {\n \"unified\": \"1F936\",\n \"shortnames\": [\n \"mrs_claus\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F384\",\n \"shortnames\": [\n \"mx_claus\"\n ]\n },\n {\n \"unified\": \"1F9B8\",\n \"shortnames\": [\n \"superhero\"\n ]\n },\n {\n \"unified\": \"1F9B8-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_superhero\"\n ]\n },\n {\n \"unified\": \"1F9B8-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_superhero\"\n ]\n },\n {\n \"unified\": \"1F9B9\",\n \"shortnames\": [\n \"supervillain\"\n ]\n },\n {\n \"unified\": \"1F9B9-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_supervillain\"\n ]\n },\n {\n \"unified\": \"1F9B9-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_supervillain\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_mage\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_mage\",\n \"mage\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_fairy\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_fairy\",\n \"fairy\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_vampire\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_vampire\",\n \"vampire\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2642-FE0F\",\n \"shortnames\": [\n \"merman\",\n \"merperson\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2640-FE0F\",\n \"shortnames\": [\n \"mermaid\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_elf\",\n \"elf\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_elf\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_genie\",\n \"genie\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_genie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_zombie\",\n \"zombie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_zombie\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-massage\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-massage\",\n \"massage\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-haircut\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-haircut\",\n \"haircut\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-walking\",\n \"walking\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-walking\"\n ]\n },\n {\n \"unified\": \"1F9CD\",\n \"shortnames\": [\n \"standing_person\"\n ]\n },\n {\n \"unified\": \"1F9CD-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_standing\"\n ]\n },\n {\n \"unified\": \"1F9CD-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_standing\"\n ]\n },\n {\n \"unified\": \"1F9CE\",\n \"shortnames\": [\n \"kneeling_person\"\n ]\n },\n {\n \"unified\": \"1F9CE-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_kneeling\"\n ]\n },\n {\n \"unified\": \"1F9CE-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_kneeling\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9AF\",\n \"shortnames\": [\n \"person_with_probing_cane\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9AF\",\n \"shortnames\": [\n \"man_with_probing_cane\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9AF\",\n \"shortnames\": [\n \"woman_with_probing_cane\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9BC\",\n \"shortnames\": [\n \"person_in_motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9BC\",\n \"shortnames\": [\n \"man_in_motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9BC\",\n \"shortnames\": [\n \"woman_in_motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9BD\",\n \"shortnames\": [\n \"person_in_manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9BD\",\n \"shortnames\": [\n \"man_in_manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9BD\",\n \"shortnames\": [\n \"woman_in_manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-running\",\n \"runner\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-running\"\n ]\n },\n {\n \"unified\": \"1F483\",\n \"shortnames\": [\n \"dancer\"\n ]\n },\n {\n \"unified\": \"1F57A\",\n \"shortnames\": [\n \"man_dancing\"\n ]\n },\n {\n \"unified\": \"1F574-FE0F\",\n \"shortnames\": [\n \"man_in_business_suit_levitating\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-with-bunny-ears-partying\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-with-bunny-ears-partying\",\n \"dancers\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_steamy_room\",\n \"person_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_climbing\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_climbing\",\n \"person_climbing\"\n ]\n },\n {\n \"unified\": \"1F93A\",\n \"shortnames\": [\n \"fencer\"\n ]\n },\n {\n \"unified\": \"1F3C7\",\n \"shortnames\": [\n \"horse_racing\"\n ]\n },\n {\n \"unified\": \"26F7-FE0F\",\n \"shortnames\": [\n \"skier\"\n ]\n },\n {\n \"unified\": \"1F3C2\",\n \"shortnames\": [\n \"snowboarder\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-golfing\",\n \"golfer\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-golfing\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-surfing\",\n \"surfer\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-surfing\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-rowing-boat\",\n \"rowboat\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-rowing-boat\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-swimming\",\n \"swimmer\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-swimming\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bouncing-ball\",\n \"person_with_ball\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bouncing-ball\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-lifting-weights\",\n \"weight_lifter\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-lifting-weights\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-biking\",\n \"bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-biking\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-mountain-biking\",\n \"mountain_bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-mountain-biking\"\n ]\n },\n {\n \"unified\": \"1F938\",\n \"shortnames\": [\n \"person_doing_cartwheel\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F93C\",\n \"shortnames\": [\n \"wrestlers\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93D\",\n \"shortnames\": [\n \"water_polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93E\",\n \"shortnames\": [\n \"handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F939\",\n \"shortnames\": [\n \"juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-juggling\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_lotus_position\",\n \"person_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F6C0\",\n \"shortnames\": [\n \"bath\"\n ]\n },\n {\n \"unified\": \"1F6CC\",\n \"shortnames\": [\n \"sleeping_accommodation\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F91D-200D-1F9D1\",\n \"shortnames\": [\n \"people_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F46D\",\n \"shortnames\": [\n \"two_women_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F46B\",\n \"shortnames\": [\n \"couple\"\n ]\n },\n {\n \"unified\": \"1F46C\",\n \"shortnames\": [\n \"two_men_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"woman-kiss-man\",\n \"couplekiss\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"man-kiss-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"shortnames\": [\n \"woman-kiss-woman\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"woman-heart-man\",\n \"couple_with_heart\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"man-heart-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"shortnames\": [\n \"woman-heart-woman\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy\",\n \"family\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466\",\n \"shortnames\": [\n \"man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467\",\n \"shortnames\": [\n \"man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F5E3-FE0F\",\n \"shortnames\": [\n \"speaking_head_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F464\",\n \"shortnames\": [\n \"bust_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F465\",\n \"shortnames\": [\n \"busts_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1FAC2\",\n \"shortnames\": [\n \"people_hugging\"\n ]\n },\n {\n \"unified\": \"1F463\",\n \"shortnames\": [\n \"footprints\"\n ]\n },\n {\n \"unified\": \"1F935\",\n \"shortnames\": [\n \"man_in_tuxedo\"\n ]\n }\n ]\n },\n {\n \"name\": \"Animals & Nature\",\n \"emojis\": [\n {\n \"unified\": \"1F435\",\n \"shortnames\": [\n \"monkey_face\"\n ]\n },\n {\n \"unified\": \"1F412\",\n \"shortnames\": [\n \"monkey\"\n ]\n },\n {\n \"unified\": \"1F98D\",\n \"shortnames\": [\n \"gorilla\"\n ]\n },\n {\n \"unified\": \"1F9A7\",\n \"shortnames\": [\n \"orangutan\"\n ]\n },\n {\n \"unified\": \"1F436\",\n \"shortnames\": [\n \"dog\"\n ]\n },\n {\n \"unified\": \"1F415\",\n \"shortnames\": [\n \"dog2\"\n ]\n },\n {\n \"unified\": \"1F9AE\",\n \"shortnames\": [\n \"guide_dog\"\n ]\n },\n {\n \"unified\": \"1F415-200D-1F9BA\",\n \"shortnames\": [\n \"service_dog\"\n ]\n },\n {\n \"unified\": \"1F429\",\n \"shortnames\": [\n \"poodle\"\n ]\n },\n {\n \"unified\": \"1F43A\",\n \"shortnames\": [\n \"wolf\"\n ]\n },\n {\n \"unified\": \"1F98A\",\n \"shortnames\": [\n \"fox_face\"\n ]\n },\n {\n \"unified\": \"1F99D\",\n \"shortnames\": [\n \"raccoon\"\n ]\n },\n {\n \"unified\": \"1F431\",\n \"shortnames\": [\n \"cat\"\n ]\n },\n {\n \"unified\": \"1F408\",\n \"shortnames\": [\n \"cat2\"\n ]\n },\n {\n \"unified\": \"1F408-200D-2B1B\",\n \"shortnames\": [\n \"black_cat\"\n ]\n },\n {\n \"unified\": \"1F981\",\n \"shortnames\": [\n \"lion_face\"\n ]\n },\n {\n \"unified\": \"1F42F\",\n \"shortnames\": [\n \"tiger\"\n ]\n },\n {\n \"unified\": \"1F405\",\n \"shortnames\": [\n \"tiger2\"\n ]\n },\n {\n \"unified\": \"1F406\",\n \"shortnames\": [\n \"leopard\"\n ]\n },\n {\n \"unified\": \"1F434\",\n \"shortnames\": [\n \"horse\"\n ]\n },\n {\n \"unified\": \"1F40E\",\n \"shortnames\": [\n \"racehorse\"\n ]\n },\n {\n \"unified\": \"1F984\",\n \"shortnames\": [\n \"unicorn_face\"\n ]\n },\n {\n \"unified\": \"1F993\",\n \"shortnames\": [\n \"zebra_face\"\n ]\n },\n {\n \"unified\": \"1F98C\",\n \"shortnames\": [\n \"deer\"\n ]\n },\n {\n \"unified\": \"1F9AC\",\n \"shortnames\": [\n \"bison\"\n ]\n },\n {\n \"unified\": \"1F42E\",\n \"shortnames\": [\n \"cow\"\n ]\n },\n {\n \"unified\": \"1F402\",\n \"shortnames\": [\n \"ox\"\n ]\n },\n {\n \"unified\": \"1F403\",\n \"shortnames\": [\n \"water_buffalo\"\n ]\n },\n {\n \"unified\": \"1F404\",\n \"shortnames\": [\n \"cow2\"\n ]\n },\n {\n \"unified\": \"1F437\",\n \"shortnames\": [\n \"pig\"\n ]\n },\n {\n \"unified\": \"1F416\",\n \"shortnames\": [\n \"pig2\"\n ]\n },\n {\n \"unified\": \"1F417\",\n \"shortnames\": [\n \"boar\"\n ]\n },\n {\n \"unified\": \"1F43D\",\n \"shortnames\": [\n \"pig_nose\"\n ]\n },\n {\n \"unified\": \"1F40F\",\n \"shortnames\": [\n \"ram\"\n ]\n },\n {\n \"unified\": \"1F411\",\n \"shortnames\": [\n \"sheep\"\n ]\n },\n {\n \"unified\": \"1F410\",\n \"shortnames\": [\n \"goat\"\n ]\n },\n {\n \"unified\": \"1F42A\",\n \"shortnames\": [\n \"dromedary_camel\"\n ]\n },\n {\n \"unified\": \"1F42B\",\n \"shortnames\": [\n \"camel\"\n ]\n },\n {\n \"unified\": \"1F999\",\n \"shortnames\": [\n \"llama\"\n ]\n },\n {\n \"unified\": \"1F992\",\n \"shortnames\": [\n \"giraffe_face\"\n ]\n },\n {\n \"unified\": \"1F418\",\n \"shortnames\": [\n \"elephant\"\n ]\n },\n {\n \"unified\": \"1F9A3\",\n \"shortnames\": [\n \"mammoth\"\n ]\n },\n {\n \"unified\": \"1F98F\",\n \"shortnames\": [\n \"rhinoceros\"\n ]\n },\n {\n \"unified\": \"1F99B\",\n \"shortnames\": [\n \"hippopotamus\"\n ]\n },\n {\n \"unified\": \"1F42D\",\n \"shortnames\": [\n \"mouse\"\n ]\n },\n {\n \"unified\": \"1F401\",\n \"shortnames\": [\n \"mouse2\"\n ]\n },\n {\n \"unified\": \"1F400\",\n \"shortnames\": [\n \"rat\"\n ]\n },\n {\n \"unified\": \"1F439\",\n \"shortnames\": [\n \"hamster\"\n ]\n },\n {\n \"unified\": \"1F430\",\n \"shortnames\": [\n \"rabbit\"\n ]\n },\n {\n \"unified\": \"1F407\",\n \"shortnames\": [\n \"rabbit2\"\n ]\n },\n {\n \"unified\": \"1F43F-FE0F\",\n \"shortnames\": [\n \"chipmunk\"\n ]\n },\n {\n \"unified\": \"1F9AB\",\n \"shortnames\": [\n \"beaver\"\n ]\n },\n {\n \"unified\": \"1F994\",\n \"shortnames\": [\n \"hedgehog\"\n ]\n },\n {\n \"unified\": \"1F987\",\n \"shortnames\": [\n \"bat\"\n ]\n },\n {\n \"unified\": \"1F43B\",\n \"shortnames\": [\n \"bear\"\n ]\n },\n {\n \"unified\": \"1F43B-200D-2744-FE0F\",\n \"shortnames\": [\n \"polar_bear\"\n ]\n },\n {\n \"unified\": \"1F428\",\n \"shortnames\": [\n \"koala\"\n ]\n },\n {\n \"unified\": \"1F43C\",\n \"shortnames\": [\n \"panda_face\"\n ]\n },\n {\n \"unified\": \"1F9A5\",\n \"shortnames\": [\n \"sloth\"\n ]\n },\n {\n \"unified\": \"1F9A6\",\n \"shortnames\": [\n \"otter\"\n ]\n },\n {\n \"unified\": \"1F9A8\",\n \"shortnames\": [\n \"skunk\"\n ]\n },\n {\n \"unified\": \"1F998\",\n \"shortnames\": [\n \"kangaroo\"\n ]\n },\n {\n \"unified\": \"1F9A1\",\n \"shortnames\": [\n \"badger\"\n ]\n },\n {\n \"unified\": \"1F43E\",\n \"shortnames\": [\n \"feet\"\n ]\n },\n {\n \"unified\": \"1F983\",\n \"shortnames\": [\n \"turkey\"\n ]\n },\n {\n \"unified\": \"1F414\",\n \"shortnames\": [\n \"chicken\"\n ]\n },\n {\n \"unified\": \"1F413\",\n \"shortnames\": [\n \"rooster\"\n ]\n },\n {\n \"unified\": \"1F423\",\n \"shortnames\": [\n \"hatching_chick\"\n ]\n },\n {\n \"unified\": \"1F424\",\n \"shortnames\": [\n \"baby_chick\"\n ]\n },\n {\n \"unified\": \"1F425\",\n \"shortnames\": [\n \"hatched_chick\"\n ]\n },\n {\n \"unified\": \"1F426\",\n \"shortnames\": [\n \"bird\"\n ]\n },\n {\n \"unified\": \"1F427\",\n \"shortnames\": [\n \"penguin\"\n ]\n },\n {\n \"unified\": \"1F54A-FE0F\",\n \"shortnames\": [\n \"dove_of_peace\"\n ]\n },\n {\n \"unified\": \"1F985\",\n \"shortnames\": [\n \"eagle\"\n ]\n },\n {\n \"unified\": \"1F986\",\n \"shortnames\": [\n \"duck\"\n ]\n },\n {\n \"unified\": \"1F9A2\",\n \"shortnames\": [\n \"swan\"\n ]\n },\n {\n \"unified\": \"1F989\",\n \"shortnames\": [\n \"owl\"\n ]\n },\n {\n \"unified\": \"1F9A4\",\n \"shortnames\": [\n \"dodo\"\n ]\n },\n {\n \"unified\": \"1FAB6\",\n \"shortnames\": [\n \"feather\"\n ]\n },\n {\n \"unified\": \"1F9A9\",\n \"shortnames\": [\n \"flamingo\"\n ]\n },\n {\n \"unified\": \"1F99A\",\n \"shortnames\": [\n \"peacock\"\n ]\n },\n {\n \"unified\": \"1F99C\",\n \"shortnames\": [\n \"parrot\"\n ]\n },\n {\n \"unified\": \"1F438\",\n \"shortnames\": [\n \"frog\"\n ]\n },\n {\n \"unified\": \"1F40A\",\n \"shortnames\": [\n \"crocodile\"\n ]\n },\n {\n \"unified\": \"1F422\",\n \"shortnames\": [\n \"turtle\"\n ]\n },\n {\n \"unified\": \"1F98E\",\n \"shortnames\": [\n \"lizard\"\n ]\n },\n {\n \"unified\": \"1F40D\",\n \"shortnames\": [\n \"snake\"\n ]\n },\n {\n \"unified\": \"1F432\",\n \"shortnames\": [\n \"dragon_face\"\n ]\n },\n {\n \"unified\": \"1F409\",\n \"shortnames\": [\n \"dragon\"\n ]\n },\n {\n \"unified\": \"1F995\",\n \"shortnames\": [\n \"sauropod\"\n ]\n },\n {\n \"unified\": \"1F996\",\n \"shortnames\": [\n \"t-rex\"\n ]\n },\n {\n \"unified\": \"1F433\",\n \"shortnames\": [\n \"whale\"\n ]\n },\n {\n \"unified\": \"1F40B\",\n \"shortnames\": [\n \"whale2\"\n ]\n },\n {\n \"unified\": \"1F42C\",\n \"shortnames\": [\n \"dolphin\"\n ]\n },\n {\n \"unified\": \"1F9AD\",\n \"shortnames\": [\n \"seal\"\n ]\n },\n {\n \"unified\": \"1F41F\",\n \"shortnames\": [\n \"fish\"\n ]\n },\n {\n \"unified\": \"1F420\",\n \"shortnames\": [\n \"tropical_fish\"\n ]\n },\n {\n \"unified\": \"1F421\",\n \"shortnames\": [\n \"blowfish\"\n ]\n },\n {\n \"unified\": \"1F988\",\n \"shortnames\": [\n \"shark\"\n ]\n },\n {\n \"unified\": \"1F419\",\n \"shortnames\": [\n \"octopus\"\n ]\n },\n {\n \"unified\": \"1F41A\",\n \"shortnames\": [\n \"shell\"\n ]\n },\n {\n \"unified\": \"1F40C\",\n \"shortnames\": [\n \"snail\"\n ]\n },\n {\n \"unified\": \"1F98B\",\n \"shortnames\": [\n \"butterfly\"\n ]\n },\n {\n \"unified\": \"1F41B\",\n \"shortnames\": [\n \"bug\"\n ]\n },\n {\n \"unified\": \"1F41C\",\n \"shortnames\": [\n \"ant\"\n ]\n },\n {\n \"unified\": \"1F41D\",\n \"shortnames\": [\n \"bee\"\n ]\n },\n {\n \"unified\": \"1FAB2\",\n \"shortnames\": [\n \"beetle\"\n ]\n },\n {\n \"unified\": \"1F997\",\n \"shortnames\": [\n \"cricket\"\n ]\n },\n {\n \"unified\": \"1FAB3\",\n \"shortnames\": [\n \"cockroach\"\n ]\n },\n {\n \"unified\": \"1F577-FE0F\",\n \"shortnames\": [\n \"spider\"\n ]\n },\n {\n \"unified\": \"1F578-FE0F\",\n \"shortnames\": [\n \"spider_web\"\n ]\n },\n {\n \"unified\": \"1F982\",\n \"shortnames\": [\n \"scorpion\"\n ]\n },\n {\n \"unified\": \"1F99F\",\n \"shortnames\": [\n \"mosquito\"\n ]\n },\n {\n \"unified\": \"1FAB0\",\n \"shortnames\": [\n \"fly\"\n ]\n },\n {\n \"unified\": \"1FAB1\",\n \"shortnames\": [\n \"worm\"\n ]\n },\n {\n \"unified\": \"1F9A0\",\n \"shortnames\": [\n \"microbe\"\n ]\n },\n {\n \"unified\": \"1F490\",\n \"shortnames\": [\n \"bouquet\"\n ]\n },\n {\n \"unified\": \"1F338\",\n \"shortnames\": [\n \"cherry_blossom\"\n ]\n },\n {\n \"unified\": \"1F4AE\",\n \"shortnames\": [\n \"white_flower\"\n ]\n },\n {\n \"unified\": \"1F3F5-FE0F\",\n \"shortnames\": [\n \"rosette\"\n ]\n },\n {\n \"unified\": \"1F339\",\n \"shortnames\": [\n \"rose\"\n ]\n },\n {\n \"unified\": \"1F940\",\n \"shortnames\": [\n \"wilted_flower\"\n ]\n },\n {\n \"unified\": \"1F33A\",\n \"shortnames\": [\n \"hibiscus\"\n ]\n },\n {\n \"unified\": \"1F33B\",\n \"shortnames\": [\n \"sunflower\"\n ]\n },\n {\n \"unified\": \"1F33C\",\n \"shortnames\": [\n \"blossom\"\n ]\n },\n {\n \"unified\": \"1F337\",\n \"shortnames\": [\n \"tulip\"\n ]\n },\n {\n \"unified\": \"1F331\",\n \"shortnames\": [\n \"seedling\"\n ]\n },\n {\n \"unified\": \"1FAB4\",\n \"shortnames\": [\n \"potted_plant\"\n ]\n },\n {\n \"unified\": \"1F332\",\n \"shortnames\": [\n \"evergreen_tree\"\n ]\n },\n {\n \"unified\": \"1F333\",\n \"shortnames\": [\n \"deciduous_tree\"\n ]\n },\n {\n \"unified\": \"1F334\",\n \"shortnames\": [\n \"palm_tree\"\n ]\n },\n {\n \"unified\": \"1F335\",\n \"shortnames\": [\n \"cactus\"\n ]\n },\n {\n \"unified\": \"1F33E\",\n \"shortnames\": [\n \"ear_of_rice\"\n ]\n },\n {\n \"unified\": \"1F33F\",\n \"shortnames\": [\n \"herb\"\n ]\n },\n {\n \"unified\": \"2618-FE0F\",\n \"shortnames\": [\n \"shamrock\"\n ]\n },\n {\n \"unified\": \"1F340\",\n \"shortnames\": [\n \"four_leaf_clover\"\n ]\n },\n {\n \"unified\": \"1F341\",\n \"shortnames\": [\n \"maple_leaf\"\n ]\n },\n {\n \"unified\": \"1F342\",\n \"shortnames\": [\n \"fallen_leaf\"\n ]\n },\n {\n \"unified\": \"1F343\",\n \"shortnames\": [\n \"leaves\"\n ]\n },\n {\n \"unified\": \"1F41E\",\n \"shortnames\": [\n \"beetle\"\n ]\n }\n ]\n },\n {\n \"name\": \"Food & Drink\",\n \"emojis\": [\n {\n \"unified\": \"1F347\",\n \"shortnames\": [\n \"grapes\"\n ]\n },\n {\n \"unified\": \"1F348\",\n \"shortnames\": [\n \"melon\"\n ]\n },\n {\n \"unified\": \"1F349\",\n \"shortnames\": [\n \"watermelon\"\n ]\n },\n {\n \"unified\": \"1F34A\",\n \"shortnames\": [\n \"tangerine\"\n ]\n },\n {\n \"unified\": \"1F34B\",\n \"shortnames\": [\n \"lemon\"\n ]\n },\n {\n \"unified\": \"1F34C\",\n \"shortnames\": [\n \"banana\"\n ]\n },\n {\n \"unified\": \"1F34D\",\n \"shortnames\": [\n \"pineapple\"\n ]\n },\n {\n \"unified\": \"1F96D\",\n \"shortnames\": [\n \"mango\"\n ]\n },\n {\n \"unified\": \"1F34E\",\n \"shortnames\": [\n \"apple\"\n ]\n },\n {\n \"unified\": \"1F34F\",\n \"shortnames\": [\n \"green_apple\"\n ]\n },\n {\n \"unified\": \"1F350\",\n \"shortnames\": [\n \"pear\"\n ]\n },\n {\n \"unified\": \"1F351\",\n \"shortnames\": [\n \"peach\"\n ]\n },\n {\n \"unified\": \"1F352\",\n \"shortnames\": [\n \"cherries\"\n ]\n },\n {\n \"unified\": \"1F353\",\n \"shortnames\": [\n \"strawberry\"\n ]\n },\n {\n \"unified\": \"1FAD0\",\n \"shortnames\": [\n \"blueberries\"\n ]\n },\n {\n \"unified\": \"1F95D\",\n \"shortnames\": [\n \"kiwifruit\"\n ]\n },\n {\n \"unified\": \"1F345\",\n \"shortnames\": [\n \"tomato\"\n ]\n },\n {\n \"unified\": \"1FAD2\",\n \"shortnames\": [\n \"olive\"\n ]\n },\n {\n \"unified\": \"1F965\",\n \"shortnames\": [\n \"coconut\"\n ]\n },\n {\n \"unified\": \"1F951\",\n \"shortnames\": [\n \"avocado\"\n ]\n },\n {\n \"unified\": \"1F346\",\n \"shortnames\": [\n \"eggplant\"\n ]\n },\n {\n \"unified\": \"1F954\",\n \"shortnames\": [\n \"potato\"\n ]\n },\n {\n \"unified\": \"1F955\",\n \"shortnames\": [\n \"carrot\"\n ]\n },\n {\n \"unified\": \"1F33D\",\n \"shortnames\": [\n \"corn\"\n ]\n },\n {\n \"unified\": \"1F336-FE0F\",\n \"shortnames\": [\n \"hot_pepper\"\n ]\n },\n {\n \"unified\": \"1FAD1\",\n \"shortnames\": [\n \"bell_pepper\"\n ]\n },\n {\n \"unified\": \"1F952\",\n \"shortnames\": [\n \"cucumber\"\n ]\n },\n {\n \"unified\": \"1F96C\",\n \"shortnames\": [\n \"leafy_green\"\n ]\n },\n {\n \"unified\": \"1F966\",\n \"shortnames\": [\n \"broccoli\"\n ]\n },\n {\n \"unified\": \"1F9C4\",\n \"shortnames\": [\n \"garlic\"\n ]\n },\n {\n \"unified\": \"1F9C5\",\n \"shortnames\": [\n \"onion\"\n ]\n },\n {\n \"unified\": \"1F344\",\n \"shortnames\": [\n \"mushroom\"\n ]\n },\n {\n \"unified\": \"1F95C\",\n \"shortnames\": [\n \"peanuts\"\n ]\n },\n {\n \"unified\": \"1F330\",\n \"shortnames\": [\n \"chestnut\"\n ]\n },\n {\n \"unified\": \"1F35E\",\n \"shortnames\": [\n \"bread\"\n ]\n },\n {\n \"unified\": \"1F950\",\n \"shortnames\": [\n \"croissant\"\n ]\n },\n {\n \"unified\": \"1F956\",\n \"shortnames\": [\n \"baguette_bread\"\n ]\n },\n {\n \"unified\": \"1FAD3\",\n \"shortnames\": [\n \"flatbread\"\n ]\n },\n {\n \"unified\": \"1F968\",\n \"shortnames\": [\n \"pretzel\"\n ]\n },\n {\n \"unified\": \"1F96F\",\n \"shortnames\": [\n \"bagel\"\n ]\n },\n {\n \"unified\": \"1F95E\",\n \"shortnames\": [\n \"pancakes\"\n ]\n },\n {\n \"unified\": \"1F9C7\",\n \"shortnames\": [\n \"waffle\"\n ]\n },\n {\n \"unified\": \"1F9C0\",\n \"shortnames\": [\n \"cheese_wedge\"\n ]\n },\n {\n \"unified\": \"1F356\",\n \"shortnames\": [\n \"meat_on_bone\"\n ]\n },\n {\n \"unified\": \"1F357\",\n \"shortnames\": [\n \"poultry_leg\"\n ]\n },\n {\n \"unified\": \"1F969\",\n \"shortnames\": [\n \"cut_of_meat\"\n ]\n },\n {\n \"unified\": \"1F953\",\n \"shortnames\": [\n \"bacon\"\n ]\n },\n {\n \"unified\": \"1F354\",\n \"shortnames\": [\n \"hamburger\"\n ]\n },\n {\n \"unified\": \"1F35F\",\n \"shortnames\": [\n \"fries\"\n ]\n },\n {\n \"unified\": \"1F355\",\n \"shortnames\": [\n \"pizza\"\n ]\n },\n {\n \"unified\": \"1F32D\",\n \"shortnames\": [\n \"hotdog\"\n ]\n },\n {\n \"unified\": \"1F96A\",\n \"shortnames\": [\n \"sandwich\"\n ]\n },\n {\n \"unified\": \"1F32E\",\n \"shortnames\": [\n \"taco\"\n ]\n },\n {\n \"unified\": \"1F32F\",\n \"shortnames\": [\n \"burrito\"\n ]\n },\n {\n \"unified\": \"1FAD4\",\n \"shortnames\": [\n \"tamale\"\n ]\n },\n {\n \"unified\": \"1F959\",\n \"shortnames\": [\n \"stuffed_flatbread\"\n ]\n },\n {\n \"unified\": \"1F9C6\",\n \"shortnames\": [\n \"falafel\"\n ]\n },\n {\n \"unified\": \"1F95A\",\n \"shortnames\": [\n \"egg\"\n ]\n },\n {\n \"unified\": \"1F373\",\n \"shortnames\": [\n \"fried_egg\"\n ]\n },\n {\n \"unified\": \"1F958\",\n \"shortnames\": [\n \"shallow_pan_of_food\"\n ]\n },\n {\n \"unified\": \"1F372\",\n \"shortnames\": [\n \"stew\"\n ]\n },\n {\n \"unified\": \"1FAD5\",\n \"shortnames\": [\n \"fondue\"\n ]\n },\n {\n \"unified\": \"1F963\",\n \"shortnames\": [\n \"bowl_with_spoon\"\n ]\n },\n {\n \"unified\": \"1F957\",\n \"shortnames\": [\n \"green_salad\"\n ]\n },\n {\n \"unified\": \"1F37F\",\n \"shortnames\": [\n \"popcorn\"\n ]\n },\n {\n \"unified\": \"1F9C8\",\n \"shortnames\": [\n \"butter\"\n ]\n },\n {\n \"unified\": \"1F9C2\",\n \"shortnames\": [\n \"salt\"\n ]\n },\n {\n \"unified\": \"1F96B\",\n \"shortnames\": [\n \"canned_food\"\n ]\n },\n {\n \"unified\": \"1F371\",\n \"shortnames\": [\n \"bento\"\n ]\n },\n {\n \"unified\": \"1F358\",\n \"shortnames\": [\n \"rice_cracker\"\n ]\n },\n {\n \"unified\": \"1F359\",\n \"shortnames\": [\n \"rice_ball\"\n ]\n },\n {\n \"unified\": \"1F35A\",\n \"shortnames\": [\n \"rice\"\n ]\n },\n {\n \"unified\": \"1F35B\",\n \"shortnames\": [\n \"curry\"\n ]\n },\n {\n \"unified\": \"1F35C\",\n \"shortnames\": [\n \"ramen\"\n ]\n },\n {\n \"unified\": \"1F35D\",\n \"shortnames\": [\n \"spaghetti\"\n ]\n },\n {\n \"unified\": \"1F360\",\n \"shortnames\": [\n \"sweet_potato\"\n ]\n },\n {\n \"unified\": \"1F362\",\n \"shortnames\": [\n \"oden\"\n ]\n },\n {\n \"unified\": \"1F363\",\n \"shortnames\": [\n \"sushi\"\n ]\n },\n {\n \"unified\": \"1F364\",\n \"shortnames\": [\n \"fried_shrimp\"\n ]\n },\n {\n \"unified\": \"1F365\",\n \"shortnames\": [\n \"fish_cake\"\n ]\n },\n {\n \"unified\": \"1F96E\",\n \"shortnames\": [\n \"moon_cake\"\n ]\n },\n {\n \"unified\": \"1F361\",\n \"shortnames\": [\n \"dango\"\n ]\n },\n {\n \"unified\": \"1F95F\",\n \"shortnames\": [\n \"dumpling\"\n ]\n },\n {\n \"unified\": \"1F960\",\n \"shortnames\": [\n \"fortune_cookie\"\n ]\n },\n {\n \"unified\": \"1F961\",\n \"shortnames\": [\n \"takeout_box\"\n ]\n },\n {\n \"unified\": \"1F980\",\n \"shortnames\": [\n \"crab\"\n ]\n },\n {\n \"unified\": \"1F99E\",\n \"shortnames\": [\n \"lobster\"\n ]\n },\n {\n \"unified\": \"1F990\",\n \"shortnames\": [\n \"shrimp\"\n ]\n },\n {\n \"unified\": \"1F991\",\n \"shortnames\": [\n \"squid\"\n ]\n },\n {\n \"unified\": \"1F9AA\",\n \"shortnames\": [\n \"oyster\"\n ]\n },\n {\n \"unified\": \"1F366\",\n \"shortnames\": [\n \"icecream\"\n ]\n },\n {\n \"unified\": \"1F367\",\n \"shortnames\": [\n \"shaved_ice\"\n ]\n },\n {\n \"unified\": \"1F368\",\n \"shortnames\": [\n \"ice_cream\"\n ]\n },\n {\n \"unified\": \"1F369\",\n \"shortnames\": [\n \"doughnut\"\n ]\n },\n {\n \"unified\": \"1F36A\",\n \"shortnames\": [\n \"cookie\"\n ]\n },\n {\n \"unified\": \"1F382\",\n \"shortnames\": [\n \"birthday\"\n ]\n },\n {\n \"unified\": \"1F370\",\n \"shortnames\": [\n \"cake\"\n ]\n },\n {\n \"unified\": \"1F9C1\",\n \"shortnames\": [\n \"cupcake\"\n ]\n },\n {\n \"unified\": \"1F967\",\n \"shortnames\": [\n \"pie\"\n ]\n },\n {\n \"unified\": \"1F36B\",\n \"shortnames\": [\n \"chocolate_bar\"\n ]\n },\n {\n \"unified\": \"1F36C\",\n \"shortnames\": [\n \"candy\"\n ]\n },\n {\n \"unified\": \"1F36D\",\n \"shortnames\": [\n \"lollipop\"\n ]\n },\n {\n \"unified\": \"1F36E\",\n \"shortnames\": [\n \"custard\"\n ]\n },\n {\n \"unified\": \"1F36F\",\n \"shortnames\": [\n \"honey_pot\"\n ]\n },\n {\n \"unified\": \"1F37C\",\n \"shortnames\": [\n \"baby_bottle\"\n ]\n },\n {\n \"unified\": \"1F95B\",\n \"shortnames\": [\n \"glass_of_milk\"\n ]\n },\n {\n \"unified\": \"2615\",\n \"shortnames\": [\n \"coffee\"\n ]\n },\n {\n \"unified\": \"1FAD6\",\n \"shortnames\": [\n \"teapot\"\n ]\n },\n {\n \"unified\": \"1F375\",\n \"shortnames\": [\n \"tea\"\n ]\n },\n {\n \"unified\": \"1F376\",\n \"shortnames\": [\n \"sake\"\n ]\n },\n {\n \"unified\": \"1F37E\",\n \"shortnames\": [\n \"champagne\"\n ]\n },\n {\n \"unified\": \"1F377\",\n \"shortnames\": [\n \"wine_glass\"\n ]\n },\n {\n \"unified\": \"1F378\",\n \"shortnames\": [\n \"cocktail\"\n ]\n },\n {\n \"unified\": \"1F379\",\n \"shortnames\": [\n \"tropical_drink\"\n ]\n },\n {\n \"unified\": \"1F37A\",\n \"shortnames\": [\n \"beer\"\n ]\n },\n {\n \"unified\": \"1F37B\",\n \"shortnames\": [\n \"beers\"\n ]\n },\n {\n \"unified\": \"1F942\",\n \"shortnames\": [\n \"clinking_glasses\"\n ]\n },\n {\n \"unified\": \"1F943\",\n \"shortnames\": [\n \"tumbler_glass\"\n ]\n },\n {\n \"unified\": \"1F964\",\n \"shortnames\": [\n \"cup_with_straw\"\n ]\n },\n {\n \"unified\": \"1F9CB\",\n \"shortnames\": [\n \"bubble_tea\"\n ]\n },\n {\n \"unified\": \"1F9C3\",\n \"shortnames\": [\n \"beverage_box\"\n ]\n },\n {\n \"unified\": \"1F9C9\",\n \"shortnames\": [\n \"mate_drink\"\n ]\n },\n {\n \"unified\": \"1F9CA\",\n \"shortnames\": [\n \"ice_cube\"\n ]\n },\n {\n \"unified\": \"1F962\",\n \"shortnames\": [\n \"chopsticks\"\n ]\n },\n {\n \"unified\": \"1F37D-FE0F\",\n \"shortnames\": [\n \"knife_fork_plate\"\n ]\n },\n {\n \"unified\": \"1F374\",\n \"shortnames\": [\n \"fork_and_knife\"\n ]\n },\n {\n \"unified\": \"1F944\",\n \"shortnames\": [\n \"spoon\"\n ]\n },\n {\n \"unified\": \"1F52A\",\n \"shortnames\": [\n \"hocho\"\n ]\n },\n {\n \"unified\": \"1F3FA\",\n \"shortnames\": [\n \"amphora\"\n ]\n }\n ]\n },\n {\n \"name\": \"Travel & Places\",\n \"emojis\": [\n {\n \"unified\": \"1F30D\",\n \"shortnames\": [\n \"earth_africa\"\n ]\n },\n {\n \"unified\": \"1F30E\",\n \"shortnames\": [\n \"earth_americas\"\n ]\n },\n {\n \"unified\": \"1F30F\",\n \"shortnames\": [\n \"earth_asia\"\n ]\n },\n {\n \"unified\": \"1F310\",\n \"shortnames\": [\n \"globe_with_meridians\"\n ]\n },\n {\n \"unified\": \"1F5FA-FE0F\",\n \"shortnames\": [\n \"world_map\"\n ]\n },\n {\n \"unified\": \"1F5FE\",\n \"shortnames\": [\n \"japan\"\n ]\n },\n {\n \"unified\": \"1F9ED\",\n \"shortnames\": [\n \"compass\"\n ]\n },\n {\n \"unified\": \"1F3D4-FE0F\",\n \"shortnames\": [\n \"snow_capped_mountain\"\n ]\n },\n {\n \"unified\": \"26F0-FE0F\",\n \"shortnames\": [\n \"mountain\"\n ]\n },\n {\n \"unified\": \"1F30B\",\n \"shortnames\": [\n \"volcano\"\n ]\n },\n {\n \"unified\": \"1F5FB\",\n \"shortnames\": [\n \"mount_fuji\"\n ]\n },\n {\n \"unified\": \"1F3D5-FE0F\",\n \"shortnames\": [\n \"camping\"\n ]\n },\n {\n \"unified\": \"1F3D6-FE0F\",\n \"shortnames\": [\n \"beach_with_umbrella\"\n ]\n },\n {\n \"unified\": \"1F3DC-FE0F\",\n \"shortnames\": [\n \"desert\"\n ]\n },\n {\n \"unified\": \"1F3DD-FE0F\",\n \"shortnames\": [\n \"desert_island\"\n ]\n },\n {\n \"unified\": \"1F3DE-FE0F\",\n \"shortnames\": [\n \"national_park\"\n ]\n },\n {\n \"unified\": \"1F3DF-FE0F\",\n \"shortnames\": [\n \"stadium\"\n ]\n },\n {\n \"unified\": \"1F3DB-FE0F\",\n \"shortnames\": [\n \"classical_building\"\n ]\n },\n {\n \"unified\": \"1F3D7-FE0F\",\n \"shortnames\": [\n \"building_construction\"\n ]\n },\n {\n \"unified\": \"1F9F1\",\n \"shortnames\": [\n \"bricks\"\n ]\n },\n {\n \"unified\": \"1FAA8\",\n \"shortnames\": [\n \"rock\"\n ]\n },\n {\n \"unified\": \"1FAB5\",\n \"shortnames\": [\n \"wood\"\n ]\n },\n {\n \"unified\": \"1F6D6\",\n \"shortnames\": [\n \"hut\"\n ]\n },\n {\n \"unified\": \"1F3D8-FE0F\",\n \"shortnames\": [\n \"house_buildings\"\n ]\n },\n {\n \"unified\": \"1F3DA-FE0F\",\n \"shortnames\": [\n \"derelict_house_building\"\n ]\n },\n {\n \"unified\": \"1F3E0\",\n \"shortnames\": [\n \"house\"\n ]\n },\n {\n \"unified\": \"1F3E1\",\n \"shortnames\": [\n \"house_with_garden\"\n ]\n },\n {\n \"unified\": \"1F3E2\",\n \"shortnames\": [\n \"office\"\n ]\n },\n {\n \"unified\": \"1F3E3\",\n \"shortnames\": [\n \"post_office\"\n ]\n },\n {\n \"unified\": \"1F3E4\",\n \"shortnames\": [\n \"european_post_office\"\n ]\n },\n {\n \"unified\": \"1F3E5\",\n \"shortnames\": [\n \"hospital\"\n ]\n },\n {\n \"unified\": \"1F3E6\",\n \"shortnames\": [\n \"bank\"\n ]\n },\n {\n \"unified\": \"1F3E8\",\n \"shortnames\": [\n \"hotel\"\n ]\n },\n {\n \"unified\": \"1F3E9\",\n \"shortnames\": [\n \"love_hotel\"\n ]\n },\n {\n \"unified\": \"1F3EA\",\n \"shortnames\": [\n \"convenience_store\"\n ]\n },\n {\n \"unified\": \"1F3EB\",\n \"shortnames\": [\n \"school\"\n ]\n },\n {\n \"unified\": \"1F3EC\",\n \"shortnames\": [\n \"department_store\"\n ]\n },\n {\n \"unified\": \"1F3ED\",\n \"shortnames\": [\n \"factory\"\n ]\n },\n {\n \"unified\": \"1F3EF\",\n \"shortnames\": [\n \"japanese_castle\"\n ]\n },\n {\n \"unified\": \"1F3F0\",\n \"shortnames\": [\n \"european_castle\"\n ]\n },\n {\n \"unified\": \"1F492\",\n \"shortnames\": [\n \"wedding\"\n ]\n },\n {\n \"unified\": \"1F5FC\",\n \"shortnames\": [\n \"tokyo_tower\"\n ]\n },\n {\n \"unified\": \"1F5FD\",\n \"shortnames\": [\n \"statue_of_liberty\"\n ]\n },\n {\n \"unified\": \"26EA\",\n \"shortnames\": [\n \"church\"\n ]\n },\n {\n \"unified\": \"1F54C\",\n \"shortnames\": [\n \"mosque\"\n ]\n },\n {\n \"unified\": \"1F6D5\",\n \"shortnames\": [\n \"hindu_temple\"\n ]\n },\n {\n \"unified\": \"1F54D\",\n \"shortnames\": [\n \"synagogue\"\n ]\n },\n {\n \"unified\": \"26E9-FE0F\",\n \"shortnames\": [\n \"shinto_shrine\"\n ]\n },\n {\n \"unified\": \"1F54B\",\n \"shortnames\": [\n \"kaaba\"\n ]\n },\n {\n \"unified\": \"26F2\",\n \"shortnames\": [\n \"fountain\"\n ]\n },\n {\n \"unified\": \"26FA\",\n \"shortnames\": [\n \"tent\"\n ]\n },\n {\n \"unified\": \"1F301\",\n \"shortnames\": [\n \"foggy\"\n ]\n },\n {\n \"unified\": \"1F303\",\n \"shortnames\": [\n \"night_with_stars\"\n ]\n },\n {\n \"unified\": \"1F3D9-FE0F\",\n \"shortnames\": [\n \"cityscape\"\n ]\n },\n {\n \"unified\": \"1F304\",\n \"shortnames\": [\n \"sunrise_over_mountains\"\n ]\n },\n {\n \"unified\": \"1F305\",\n \"shortnames\": [\n \"sunrise\"\n ]\n },\n {\n \"unified\": \"1F306\",\n \"shortnames\": [\n \"city_sunset\"\n ]\n },\n {\n \"unified\": \"1F307\",\n \"shortnames\": [\n \"city_sunrise\"\n ]\n },\n {\n \"unified\": \"1F309\",\n \"shortnames\": [\n \"bridge_at_night\"\n ]\n },\n {\n \"unified\": \"2668-FE0F\",\n \"shortnames\": [\n \"hotsprings\"\n ]\n },\n {\n \"unified\": \"1F3A0\",\n \"shortnames\": [\n \"carousel_horse\"\n ]\n },\n {\n \"unified\": \"1F3A1\",\n \"shortnames\": [\n \"ferris_wheel\"\n ]\n },\n {\n \"unified\": \"1F3A2\",\n \"shortnames\": [\n \"roller_coaster\"\n ]\n },\n {\n \"unified\": \"1F488\",\n \"shortnames\": [\n \"barber\"\n ]\n },\n {\n \"unified\": \"1F3AA\",\n \"shortnames\": [\n \"circus_tent\"\n ]\n },\n {\n \"unified\": \"1F682\",\n \"shortnames\": [\n \"steam_locomotive\"\n ]\n },\n {\n \"unified\": \"1F683\",\n \"shortnames\": [\n \"railway_car\"\n ]\n },\n {\n \"unified\": \"1F684\",\n \"shortnames\": [\n \"bullettrain_side\"\n ]\n },\n {\n \"unified\": \"1F685\",\n \"shortnames\": [\n \"bullettrain_front\"\n ]\n },\n {\n \"unified\": \"1F686\",\n \"shortnames\": [\n \"train2\"\n ]\n },\n {\n \"unified\": \"1F687\",\n \"shortnames\": [\n \"metro\"\n ]\n },\n {\n \"unified\": \"1F688\",\n \"shortnames\": [\n \"light_rail\"\n ]\n },\n {\n \"unified\": \"1F689\",\n \"shortnames\": [\n \"station\"\n ]\n },\n {\n \"unified\": \"1F68A\",\n \"shortnames\": [\n \"tram\"\n ]\n },\n {\n \"unified\": \"1F69D\",\n \"shortnames\": [\n \"monorail\"\n ]\n },\n {\n \"unified\": \"1F69E\",\n \"shortnames\": [\n \"mountain_railway\"\n ]\n },\n {\n \"unified\": \"1F68B\",\n \"shortnames\": [\n \"train\"\n ]\n },\n {\n \"unified\": \"1F68C\",\n \"shortnames\": [\n \"bus\"\n ]\n },\n {\n \"unified\": \"1F68D\",\n \"shortnames\": [\n \"oncoming_bus\"\n ]\n },\n {\n \"unified\": \"1F68E\",\n \"shortnames\": [\n \"trolleybus\"\n ]\n },\n {\n \"unified\": \"1F690\",\n \"shortnames\": [\n \"minibus\"\n ]\n },\n {\n \"unified\": \"1F691\",\n \"shortnames\": [\n \"ambulance\"\n ]\n },\n {\n \"unified\": \"1F692\",\n \"shortnames\": [\n \"fire_engine\"\n ]\n },\n {\n \"unified\": \"1F693\",\n \"shortnames\": [\n \"police_car\"\n ]\n },\n {\n \"unified\": \"1F694\",\n \"shortnames\": [\n \"oncoming_police_car\"\n ]\n },\n {\n \"unified\": \"1F695\",\n \"shortnames\": [\n \"taxi\"\n ]\n },\n {\n \"unified\": \"1F696\",\n \"shortnames\": [\n \"oncoming_taxi\"\n ]\n },\n {\n \"unified\": \"1F697\",\n \"shortnames\": [\n \"car\"\n ]\n },\n {\n \"unified\": \"1F698\",\n \"shortnames\": [\n \"oncoming_automobile\"\n ]\n },\n {\n \"unified\": \"1F699\",\n \"shortnames\": [\n \"blue_car\"\n ]\n },\n {\n \"unified\": \"1F6FB\",\n \"shortnames\": [\n \"pickup_truck\"\n ]\n },\n {\n \"unified\": \"1F69A\",\n \"shortnames\": [\n \"truck\"\n ]\n },\n {\n \"unified\": \"1F69B\",\n \"shortnames\": [\n \"articulated_lorry\"\n ]\n },\n {\n \"unified\": \"1F69C\",\n \"shortnames\": [\n \"tractor\"\n ]\n },\n {\n \"unified\": \"1F3CE-FE0F\",\n \"shortnames\": [\n \"racing_car\"\n ]\n },\n {\n \"unified\": \"1F3CD-FE0F\",\n \"shortnames\": [\n \"racing_motorcycle\"\n ]\n },\n {\n \"unified\": \"1F6F5\",\n \"shortnames\": [\n \"motor_scooter\"\n ]\n },\n {\n \"unified\": \"1F9BD\",\n \"shortnames\": [\n \"manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F9BC\",\n \"shortnames\": [\n \"motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F6FA\",\n \"shortnames\": [\n \"auto_rickshaw\"\n ]\n },\n {\n \"unified\": \"1F6B2\",\n \"shortnames\": [\n \"bike\"\n ]\n },\n {\n \"unified\": \"1F6F4\",\n \"shortnames\": [\n \"scooter\"\n ]\n },\n {\n \"unified\": \"1F6F9\",\n \"shortnames\": [\n \"skateboard\"\n ]\n },\n {\n \"unified\": \"1F6FC\",\n \"shortnames\": [\n \"roller_skate\"\n ]\n },\n {\n \"unified\": \"1F68F\",\n \"shortnames\": [\n \"busstop\"\n ]\n },\n {\n \"unified\": \"1F6E3-FE0F\",\n \"shortnames\": [\n \"motorway\"\n ]\n },\n {\n \"unified\": \"1F6E4-FE0F\",\n \"shortnames\": [\n \"railway_track\"\n ]\n },\n {\n \"unified\": \"1F6E2-FE0F\",\n \"shortnames\": [\n \"oil_drum\"\n ]\n },\n {\n \"unified\": \"26FD\",\n \"shortnames\": [\n \"fuelpump\"\n ]\n },\n {\n \"unified\": \"1F6A8\",\n \"shortnames\": [\n \"rotating_light\"\n ]\n },\n {\n \"unified\": \"1F6A5\",\n \"shortnames\": [\n \"traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6A6\",\n \"shortnames\": [\n \"vertical_traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6D1\",\n \"shortnames\": [\n \"octagonal_sign\"\n ]\n },\n {\n \"unified\": \"1F6A7\",\n \"shortnames\": [\n \"construction\"\n ]\n },\n {\n \"unified\": \"2693\",\n \"shortnames\": [\n \"anchor\"\n ]\n },\n {\n \"unified\": \"26F5\",\n \"shortnames\": [\n \"boat\"\n ]\n },\n {\n \"unified\": \"1F6F6\",\n \"shortnames\": [\n \"canoe\"\n ]\n },\n {\n \"unified\": \"1F6A4\",\n \"shortnames\": [\n \"speedboat\"\n ]\n },\n {\n \"unified\": \"1F6F3-FE0F\",\n \"shortnames\": [\n \"passenger_ship\"\n ]\n },\n {\n \"unified\": \"26F4-FE0F\",\n \"shortnames\": [\n \"ferry\"\n ]\n },\n {\n \"unified\": \"1F6E5-FE0F\",\n \"shortnames\": [\n \"motor_boat\"\n ]\n },\n {\n \"unified\": \"1F6A2\",\n \"shortnames\": [\n \"ship\"\n ]\n },\n {\n \"unified\": \"2708-FE0F\",\n \"shortnames\": [\n \"airplane\"\n ]\n },\n {\n \"unified\": \"1F6E9-FE0F\",\n \"shortnames\": [\n \"small_airplane\"\n ]\n },\n {\n \"unified\": \"1F6EB\",\n \"shortnames\": [\n \"airplane_departure\"\n ]\n },\n {\n \"unified\": \"1F6EC\",\n \"shortnames\": [\n \"airplane_arriving\"\n ]\n },\n {\n \"unified\": \"1FA82\",\n \"shortnames\": [\n \"parachute\"\n ]\n },\n {\n \"unified\": \"1F4BA\",\n \"shortnames\": [\n \"seat\"\n ]\n },\n {\n \"unified\": \"1F681\",\n \"shortnames\": [\n \"helicopter\"\n ]\n },\n {\n \"unified\": \"1F69F\",\n \"shortnames\": [\n \"suspension_railway\"\n ]\n },\n {\n \"unified\": \"1F6A0\",\n \"shortnames\": [\n \"mountain_cableway\"\n ]\n },\n {\n \"unified\": \"1F6A1\",\n \"shortnames\": [\n \"aerial_tramway\"\n ]\n },\n {\n \"unified\": \"1F6F0-FE0F\",\n \"shortnames\": [\n \"satellite\"\n ]\n },\n {\n \"unified\": \"1F680\",\n \"shortnames\": [\n \"rocket\"\n ]\n },\n {\n \"unified\": \"1F6F8\",\n \"shortnames\": [\n \"flying_saucer\"\n ]\n },\n {\n \"unified\": \"1F6CE-FE0F\",\n \"shortnames\": [\n \"bellhop_bell\"\n ]\n },\n {\n \"unified\": \"1F9F3\",\n \"shortnames\": [\n \"luggage\"\n ]\n },\n {\n \"unified\": \"231B\",\n \"shortnames\": [\n \"hourglass\"\n ]\n },\n {\n \"unified\": \"23F3\",\n \"shortnames\": [\n \"hourglass_flowing_sand\"\n ]\n },\n {\n \"unified\": \"231A\",\n \"shortnames\": [\n \"watch\"\n ]\n },\n {\n \"unified\": \"23F0\",\n \"shortnames\": [\n \"alarm_clock\"\n ]\n },\n {\n \"unified\": \"23F1-FE0F\",\n \"shortnames\": [\n \"stopwatch\"\n ]\n },\n {\n \"unified\": \"23F2-FE0F\",\n \"shortnames\": [\n \"timer_clock\"\n ]\n },\n {\n \"unified\": \"1F570-FE0F\",\n \"shortnames\": [\n \"mantelpiece_clock\"\n ]\n },\n {\n \"unified\": \"1F55B\",\n \"shortnames\": [\n \"clock12\"\n ]\n },\n {\n \"unified\": \"1F567\",\n \"shortnames\": [\n \"clock1230\"\n ]\n },\n {\n \"unified\": \"1F550\",\n \"shortnames\": [\n \"clock1\"\n ]\n },\n {\n \"unified\": \"1F55C\",\n \"shortnames\": [\n \"clock130\"\n ]\n },\n {\n \"unified\": \"1F551\",\n \"shortnames\": [\n \"clock2\"\n ]\n },\n {\n \"unified\": \"1F55D\",\n \"shortnames\": [\n \"clock230\"\n ]\n },\n {\n \"unified\": \"1F552\",\n \"shortnames\": [\n \"clock3\"\n ]\n },\n {\n \"unified\": \"1F55E\",\n \"shortnames\": [\n \"clock330\"\n ]\n },\n {\n \"unified\": \"1F553\",\n \"shortnames\": [\n \"clock4\"\n ]\n },\n {\n \"unified\": \"1F55F\",\n \"shortnames\": [\n \"clock430\"\n ]\n },\n {\n \"unified\": \"1F554\",\n \"shortnames\": [\n \"clock5\"\n ]\n },\n {\n \"unified\": \"1F560\",\n \"shortnames\": [\n \"clock530\"\n ]\n },\n {\n \"unified\": \"1F555\",\n \"shortnames\": [\n \"clock6\"\n ]\n },\n {\n \"unified\": \"1F561\",\n \"shortnames\": [\n \"clock630\"\n ]\n },\n {\n \"unified\": \"1F556\",\n \"shortnames\": [\n \"clock7\"\n ]\n },\n {\n \"unified\": \"1F562\",\n \"shortnames\": [\n \"clock730\"\n ]\n },\n {\n \"unified\": \"1F557\",\n \"shortnames\": [\n \"clock8\"\n ]\n },\n {\n \"unified\": \"1F563\",\n \"shortnames\": [\n \"clock830\"\n ]\n },\n {\n \"unified\": \"1F558\",\n \"shortnames\": [\n \"clock9\"\n ]\n },\n {\n \"unified\": \"1F564\",\n \"shortnames\": [\n \"clock930\"\n ]\n },\n {\n \"unified\": \"1F559\",\n \"shortnames\": [\n \"clock10\"\n ]\n },\n {\n \"unified\": \"1F565\",\n \"shortnames\": [\n \"clock1030\"\n ]\n },\n {\n \"unified\": \"1F55A\",\n \"shortnames\": [\n \"clock11\"\n ]\n },\n {\n \"unified\": \"1F566\",\n \"shortnames\": [\n \"clock1130\"\n ]\n },\n {\n \"unified\": \"1F311\",\n \"shortnames\": [\n \"new_moon\"\n ]\n },\n {\n \"unified\": \"1F312\",\n \"shortnames\": [\n \"waxing_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F313\",\n \"shortnames\": [\n \"first_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F314\",\n \"shortnames\": [\n \"moon\"\n ]\n },\n {\n \"unified\": \"1F315\",\n \"shortnames\": [\n \"full_moon\"\n ]\n },\n {\n \"unified\": \"1F316\",\n \"shortnames\": [\n \"waning_gibbous_moon\"\n ]\n },\n {\n \"unified\": \"1F317\",\n \"shortnames\": [\n \"last_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F318\",\n \"shortnames\": [\n \"waning_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F319\",\n \"shortnames\": [\n \"crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F31A\",\n \"shortnames\": [\n \"new_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31B\",\n \"shortnames\": [\n \"first_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31C\",\n \"shortnames\": [\n \"last_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F321-FE0F\",\n \"shortnames\": [\n \"thermometer\"\n ]\n },\n {\n \"unified\": \"2600-FE0F\",\n \"shortnames\": [\n \"sunny\"\n ]\n },\n {\n \"unified\": \"1F31D\",\n \"shortnames\": [\n \"full_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31E\",\n \"shortnames\": [\n \"sun_with_face\"\n ]\n },\n {\n \"unified\": \"1FA90\",\n \"shortnames\": [\n \"ringed_planet\"\n ]\n },\n {\n \"unified\": \"2B50\",\n \"shortnames\": [\n \"star\"\n ]\n },\n {\n \"unified\": \"1F31F\",\n \"shortnames\": [\n \"star2\"\n ]\n },\n {\n \"unified\": \"1F320\",\n \"shortnames\": [\n \"stars\"\n ]\n },\n {\n \"unified\": \"1F30C\",\n \"shortnames\": [\n \"milky_way\"\n ]\n },\n {\n \"unified\": \"2601-FE0F\",\n \"shortnames\": [\n \"cloud\"\n ]\n },\n {\n \"unified\": \"26C5\",\n \"shortnames\": [\n \"partly_sunny\"\n ]\n },\n {\n \"unified\": \"26C8-FE0F\",\n \"shortnames\": [\n \"thunder_cloud_and_rain\"\n ]\n },\n {\n \"unified\": \"1F324-FE0F\",\n \"shortnames\": [\n \"mostly_sunny\"\n ]\n },\n {\n \"unified\": \"1F325-FE0F\",\n \"shortnames\": [\n \"barely_sunny\"\n ]\n },\n {\n \"unified\": \"1F326-FE0F\",\n \"shortnames\": [\n \"partly_sunny_rain\"\n ]\n },\n {\n \"unified\": \"1F327-FE0F\",\n \"shortnames\": [\n \"rain_cloud\"\n ]\n },\n {\n \"unified\": \"1F328-FE0F\",\n \"shortnames\": [\n \"snow_cloud\"\n ]\n },\n {\n \"unified\": \"1F329-FE0F\",\n \"shortnames\": [\n \"lightning\"\n ]\n },\n {\n \"unified\": \"1F32A-FE0F\",\n \"shortnames\": [\n \"tornado\"\n ]\n },\n {\n \"unified\": \"1F32B-FE0F\",\n \"shortnames\": [\n \"fog\"\n ]\n },\n {\n \"unified\": \"1F32C-FE0F\",\n \"shortnames\": [\n \"wind_blowing_face\"\n ]\n },\n {\n \"unified\": \"1F300\",\n \"shortnames\": [\n \"cyclone\"\n ]\n },\n {\n \"unified\": \"1F308\",\n \"shortnames\": [\n \"rainbow\"\n ]\n },\n {\n \"unified\": \"1F302\",\n \"shortnames\": [\n \"closed_umbrella\"\n ]\n },\n {\n \"unified\": \"2602-FE0F\",\n \"shortnames\": [\n \"umbrella\"\n ]\n },\n {\n \"unified\": \"2614\",\n \"shortnames\": [\n \"umbrella_with_rain_drops\"\n ]\n },\n {\n \"unified\": \"26F1-FE0F\",\n \"shortnames\": [\n \"umbrella_on_ground\"\n ]\n },\n {\n \"unified\": \"26A1\",\n \"shortnames\": [\n \"zap\"\n ]\n },\n {\n \"unified\": \"2744-FE0F\",\n \"shortnames\": [\n \"snowflake\"\n ]\n },\n {\n \"unified\": \"2603-FE0F\",\n \"shortnames\": [\n \"snowman\"\n ]\n },\n {\n \"unified\": \"26C4\",\n \"shortnames\": [\n \"snowman_without_snow\"\n ]\n },\n {\n \"unified\": \"2604-FE0F\",\n \"shortnames\": [\n \"comet\"\n ]\n },\n {\n \"unified\": \"1F525\",\n \"shortnames\": [\n \"fire\"\n ]\n },\n {\n \"unified\": \"1F4A7\",\n \"shortnames\": [\n \"droplet\"\n ]\n },\n {\n \"unified\": \"1F30A\",\n \"shortnames\": [\n \"ocean\"\n ]\n }\n ]\n },\n {\n \"name\": \"Activities\",\n \"emojis\": [\n {\n \"unified\": \"1F383\",\n \"shortnames\": [\n \"jack_o_lantern\"\n ]\n },\n {\n \"unified\": \"1F384\",\n \"shortnames\": [\n \"christmas_tree\"\n ]\n },\n {\n \"unified\": \"1F386\",\n \"shortnames\": [\n \"fireworks\"\n ]\n },\n {\n \"unified\": \"1F387\",\n \"shortnames\": [\n \"sparkler\"\n ]\n },\n {\n \"unified\": \"1F9E8\",\n \"shortnames\": [\n \"firecracker\"\n ]\n },\n {\n \"unified\": \"2728\",\n \"shortnames\": [\n \"sparkles\"\n ]\n },\n {\n \"unified\": \"1F388\",\n \"shortnames\": [\n \"balloon\"\n ]\n },\n {\n \"unified\": \"1F389\",\n \"shortnames\": [\n \"tada\"\n ]\n },\n {\n \"unified\": \"1F38A\",\n \"shortnames\": [\n \"confetti_ball\"\n ]\n },\n {\n \"unified\": \"1F38B\",\n \"shortnames\": [\n \"tanabata_tree\"\n ]\n },\n {\n \"unified\": \"1F38D\",\n \"shortnames\": [\n \"bamboo\"\n ]\n },\n {\n \"unified\": \"1F38E\",\n \"shortnames\": [\n \"dolls\"\n ]\n },\n {\n \"unified\": \"1F38F\",\n \"shortnames\": [\n \"flags\"\n ]\n },\n {\n \"unified\": \"1F390\",\n \"shortnames\": [\n \"wind_chime\"\n ]\n },\n {\n \"unified\": \"1F391\",\n \"shortnames\": [\n \"rice_scene\"\n ]\n },\n {\n \"unified\": \"1F9E7\",\n \"shortnames\": [\n \"red_envelope\"\n ]\n },\n {\n \"unified\": \"1F380\",\n \"shortnames\": [\n \"ribbon\"\n ]\n },\n {\n \"unified\": \"1F381\",\n \"shortnames\": [\n \"gift\"\n ]\n },\n {\n \"unified\": \"1F397-FE0F\",\n \"shortnames\": [\n \"reminder_ribbon\"\n ]\n },\n {\n \"unified\": \"1F39F-FE0F\",\n \"shortnames\": [\n \"admission_tickets\"\n ]\n },\n {\n \"unified\": \"1F3AB\",\n \"shortnames\": [\n \"ticket\"\n ]\n },\n {\n \"unified\": \"1F396-FE0F\",\n \"shortnames\": [\n \"medal\"\n ]\n },\n {\n \"unified\": \"1F3C6\",\n \"shortnames\": [\n \"trophy\"\n ]\n },\n {\n \"unified\": \"1F3C5\",\n \"shortnames\": [\n \"sports_medal\"\n ]\n },\n {\n \"unified\": \"1F947\",\n \"shortnames\": [\n \"first_place_medal\"\n ]\n },\n {\n \"unified\": \"1F948\",\n \"shortnames\": [\n \"second_place_medal\"\n ]\n },\n {\n \"unified\": \"1F949\",\n \"shortnames\": [\n \"third_place_medal\"\n ]\n },\n {\n \"unified\": \"26BD\",\n \"shortnames\": [\n \"soccer\"\n ]\n },\n {\n \"unified\": \"26BE\",\n \"shortnames\": [\n \"baseball\"\n ]\n },\n {\n \"unified\": \"1F94E\",\n \"shortnames\": [\n \"softball\"\n ]\n },\n {\n \"unified\": \"1F3C0\",\n \"shortnames\": [\n \"basketball\"\n ]\n },\n {\n \"unified\": \"1F3D0\",\n \"shortnames\": [\n \"volleyball\"\n ]\n },\n {\n \"unified\": \"1F3C8\",\n \"shortnames\": [\n \"football\"\n ]\n },\n {\n \"unified\": \"1F3C9\",\n \"shortnames\": [\n \"rugby_football\"\n ]\n },\n {\n \"unified\": \"1F3BE\",\n \"shortnames\": [\n \"tennis\"\n ]\n },\n {\n \"unified\": \"1F94F\",\n \"shortnames\": [\n \"flying_disc\"\n ]\n },\n {\n \"unified\": \"1F3B3\",\n \"shortnames\": [\n \"bowling\"\n ]\n },\n {\n \"unified\": \"1F3CF\",\n \"shortnames\": [\n \"cricket_bat_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D1\",\n \"shortnames\": [\n \"field_hockey_stick_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D2\",\n \"shortnames\": [\n \"ice_hockey_stick_and_puck\"\n ]\n },\n {\n \"unified\": \"1F94D\",\n \"shortnames\": [\n \"lacrosse\"\n ]\n },\n {\n \"unified\": \"1F3D3\",\n \"shortnames\": [\n \"table_tennis_paddle_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3F8\",\n \"shortnames\": [\n \"badminton_racquet_and_shuttlecock\"\n ]\n },\n {\n \"unified\": \"1F94A\",\n \"shortnames\": [\n \"boxing_glove\"\n ]\n },\n {\n \"unified\": \"1F94B\",\n \"shortnames\": [\n \"martial_arts_uniform\"\n ]\n },\n {\n \"unified\": \"1F945\",\n \"shortnames\": [\n \"goal_net\"\n ]\n },\n {\n \"unified\": \"26F3\",\n \"shortnames\": [\n \"golf\"\n ]\n },\n {\n \"unified\": \"26F8-FE0F\",\n \"shortnames\": [\n \"ice_skate\"\n ]\n },\n {\n \"unified\": \"1F3A3\",\n \"shortnames\": [\n \"fishing_pole_and_fish\"\n ]\n },\n {\n \"unified\": \"1F93F\",\n \"shortnames\": [\n \"diving_mask\"\n ]\n },\n {\n \"unified\": \"1F3BD\",\n \"shortnames\": [\n \"running_shirt_with_sash\"\n ]\n },\n {\n \"unified\": \"1F3BF\",\n \"shortnames\": [\n \"ski\"\n ]\n },\n {\n \"unified\": \"1F6F7\",\n \"shortnames\": [\n \"sled\"\n ]\n },\n {\n \"unified\": \"1F94C\",\n \"shortnames\": [\n \"curling_stone\"\n ]\n },\n {\n \"unified\": \"1F3AF\",\n \"shortnames\": [\n \"dart\"\n ]\n },\n {\n \"unified\": \"1FA80\",\n \"shortnames\": [\n \"yo-yo\"\n ]\n },\n {\n \"unified\": \"1FA81\",\n \"shortnames\": [\n \"kite\"\n ]\n },\n {\n \"unified\": \"1F3B1\",\n \"shortnames\": [\n \"8ball\"\n ]\n },\n {\n \"unified\": \"1F52E\",\n \"shortnames\": [\n \"crystal_ball\"\n ]\n },\n {\n \"unified\": \"1FA84\",\n \"shortnames\": [\n \"magic_wand\"\n ]\n },\n {\n \"unified\": \"1F9FF\",\n \"shortnames\": [\n \"nazar_amulet\"\n ]\n },\n {\n \"unified\": \"1F3AE\",\n \"shortnames\": [\n \"video_game\"\n ]\n },\n {\n \"unified\": \"1F579-FE0F\",\n \"shortnames\": [\n \"joystick\"\n ]\n },\n {\n \"unified\": \"1F3B0\",\n \"shortnames\": [\n \"slot_machine\"\n ]\n },\n {\n \"unified\": \"1F3B2\",\n \"shortnames\": [\n \"game_die\"\n ]\n },\n {\n \"unified\": \"1F9E9\",\n \"shortnames\": [\n \"jigsaw\"\n ]\n },\n {\n \"unified\": \"1F9F8\",\n \"shortnames\": [\n \"teddy_bear\"\n ]\n },\n {\n \"unified\": \"1FA85\",\n \"shortnames\": [\n \"pinata\"\n ]\n },\n {\n \"unified\": \"1FA86\",\n \"shortnames\": [\n \"nesting_dolls\"\n ]\n },\n {\n \"unified\": \"2660-FE0F\",\n \"shortnames\": [\n \"spades\"\n ]\n },\n {\n \"unified\": \"2665-FE0F\",\n \"shortnames\": [\n \"hearts\"\n ]\n },\n {\n \"unified\": \"2666-FE0F\",\n \"shortnames\": [\n \"diamonds\"\n ]\n },\n {\n \"unified\": \"2663-FE0F\",\n \"shortnames\": [\n \"clubs\"\n ]\n },\n {\n \"unified\": \"265F-FE0F\",\n \"shortnames\": [\n \"chess_pawn\"\n ]\n },\n {\n \"unified\": \"1F0CF\",\n \"shortnames\": [\n \"black_joker\"\n ]\n },\n {\n \"unified\": \"1F004\",\n \"shortnames\": [\n \"mahjong\"\n ]\n },\n {\n \"unified\": \"1F3B4\",\n \"shortnames\": [\n \"flower_playing_cards\"\n ]\n },\n {\n \"unified\": \"1F3AD\",\n \"shortnames\": [\n \"performing_arts\"\n ]\n },\n {\n \"unified\": \"1F5BC-FE0F\",\n \"shortnames\": [\n \"frame_with_picture\"\n ]\n },\n {\n \"unified\": \"1F3A8\",\n \"shortnames\": [\n \"art\"\n ]\n },\n {\n \"unified\": \"1F9F5\",\n \"shortnames\": [\n \"thread\"\n ]\n },\n {\n \"unified\": \"1FAA1\",\n \"shortnames\": [\n \"sewing_needle\"\n ]\n },\n {\n \"unified\": \"1F9F6\",\n \"shortnames\": [\n \"yarn\"\n ]\n },\n {\n \"unified\": \"1FAA2\",\n \"shortnames\": [\n \"knot\"\n ]\n }\n ]\n },\n {\n \"name\": \"Objects\",\n \"emojis\": [\n {\n \"unified\": \"1F453\",\n \"shortnames\": [\n \"eyeglasses\"\n ]\n },\n {\n \"unified\": \"1F576-FE0F\",\n \"shortnames\": [\n \"dark_sunglasses\"\n ]\n },\n {\n \"unified\": \"1F97D\",\n \"shortnames\": [\n \"goggles\"\n ]\n },\n {\n \"unified\": \"1F97C\",\n \"shortnames\": [\n \"lab_coat\"\n ]\n },\n {\n \"unified\": \"1F9BA\",\n \"shortnames\": [\n \"safety_vest\"\n ]\n },\n {\n \"unified\": \"1F454\",\n \"shortnames\": [\n \"necktie\"\n ]\n },\n {\n \"unified\": \"1F455\",\n \"shortnames\": [\n \"shirt\"\n ]\n },\n {\n \"unified\": \"1F456\",\n \"shortnames\": [\n \"jeans\"\n ]\n },\n {\n \"unified\": \"1F9E3\",\n \"shortnames\": [\n \"scarf\"\n ]\n },\n {\n \"unified\": \"1F9E4\",\n \"shortnames\": [\n \"gloves\"\n ]\n },\n {\n \"unified\": \"1F9E5\",\n \"shortnames\": [\n \"coat\"\n ]\n },\n {\n \"unified\": \"1F9E6\",\n \"shortnames\": [\n \"socks\"\n ]\n },\n {\n \"unified\": \"1F457\",\n \"shortnames\": [\n \"dress\"\n ]\n },\n {\n \"unified\": \"1F458\",\n \"shortnames\": [\n \"kimono\"\n ]\n },\n {\n \"unified\": \"1F97B\",\n \"shortnames\": [\n \"sari\"\n ]\n },\n {\n \"unified\": \"1FA71\",\n \"shortnames\": [\n \"one-piece_swimsuit\"\n ]\n },\n {\n \"unified\": \"1FA72\",\n \"shortnames\": [\n \"briefs\"\n ]\n },\n {\n \"unified\": \"1FA73\",\n \"shortnames\": [\n \"shorts\"\n ]\n },\n {\n \"unified\": \"1F459\",\n \"shortnames\": [\n \"bikini\"\n ]\n },\n {\n \"unified\": \"1F45A\",\n \"shortnames\": [\n \"womans_clothes\"\n ]\n },\n {\n \"unified\": \"1F45B\",\n \"shortnames\": [\n \"purse\"\n ]\n },\n {\n \"unified\": \"1F45C\",\n \"shortnames\": [\n \"handbag\"\n ]\n },\n {\n \"unified\": \"1F45D\",\n \"shortnames\": [\n \"pouch\"\n ]\n },\n {\n \"unified\": \"1F6CD-FE0F\",\n \"shortnames\": [\n \"shopping_bags\"\n ]\n },\n {\n \"unified\": \"1F392\",\n \"shortnames\": [\n \"school_satchel\"\n ]\n },\n {\n \"unified\": \"1FA74\",\n \"shortnames\": [\n \"thong_sandal\"\n ]\n },\n {\n \"unified\": \"1F45E\",\n \"shortnames\": [\n \"mans_shoe\"\n ]\n },\n {\n \"unified\": \"1F45F\",\n \"shortnames\": [\n \"athletic_shoe\"\n ]\n },\n {\n \"unified\": \"1F97E\",\n \"shortnames\": [\n \"hiking_boot\"\n ]\n },\n {\n \"unified\": \"1F97F\",\n \"shortnames\": [\n \"womans_flat_shoe\"\n ]\n },\n {\n \"unified\": \"1F460\",\n \"shortnames\": [\n \"high_heel\"\n ]\n },\n {\n \"unified\": \"1F461\",\n \"shortnames\": [\n \"sandal\"\n ]\n },\n {\n \"unified\": \"1FA70\",\n \"shortnames\": [\n \"ballet_shoes\"\n ]\n },\n {\n \"unified\": \"1F462\",\n \"shortnames\": [\n \"boot\"\n ]\n },\n {\n \"unified\": \"1F451\",\n \"shortnames\": [\n \"crown\"\n ]\n },\n {\n \"unified\": \"1F452\",\n \"shortnames\": [\n \"womans_hat\"\n ]\n },\n {\n \"unified\": \"1F3A9\",\n \"shortnames\": [\n \"tophat\"\n ]\n },\n {\n \"unified\": \"1F393\",\n \"shortnames\": [\n \"mortar_board\"\n ]\n },\n {\n \"unified\": \"1F9E2\",\n \"shortnames\": [\n \"billed_cap\"\n ]\n },\n {\n \"unified\": \"1FA96\",\n \"shortnames\": [\n \"military_helmet\"\n ]\n },\n {\n \"unified\": \"26D1-FE0F\",\n \"shortnames\": [\n \"helmet_with_white_cross\"\n ]\n },\n {\n \"unified\": \"1F4FF\",\n \"shortnames\": [\n \"prayer_beads\"\n ]\n },\n {\n \"unified\": \"1F484\",\n \"shortnames\": [\n \"lipstick\"\n ]\n },\n {\n \"unified\": \"1F48D\",\n \"shortnames\": [\n \"ring\"\n ]\n },\n {\n \"unified\": \"1F48E\",\n \"shortnames\": [\n \"gem\"\n ]\n },\n {\n \"unified\": \"1F507\",\n \"shortnames\": [\n \"mute\"\n ]\n },\n {\n \"unified\": \"1F508\",\n \"shortnames\": [\n \"speaker\"\n ]\n },\n {\n \"unified\": \"1F509\",\n \"shortnames\": [\n \"sound\"\n ]\n },\n {\n \"unified\": \"1F50A\",\n \"shortnames\": [\n \"loud_sound\"\n ]\n },\n {\n \"unified\": \"1F4E2\",\n \"shortnames\": [\n \"loudspeaker\"\n ]\n },\n {\n \"unified\": \"1F4E3\",\n \"shortnames\": [\n \"mega\"\n ]\n },\n {\n \"unified\": \"1F4EF\",\n \"shortnames\": [\n \"postal_horn\"\n ]\n },\n {\n \"unified\": \"1F514\",\n \"shortnames\": [\n \"bell\"\n ]\n },\n {\n \"unified\": \"1F515\",\n \"shortnames\": [\n \"no_bell\"\n ]\n },\n {\n \"unified\": \"1F3BC\",\n \"shortnames\": [\n \"musical_score\"\n ]\n },\n {\n \"unified\": \"1F3B5\",\n \"shortnames\": [\n \"musical_note\"\n ]\n },\n {\n \"unified\": \"1F3B6\",\n \"shortnames\": [\n \"notes\"\n ]\n },\n {\n \"unified\": \"1F399-FE0F\",\n \"shortnames\": [\n \"studio_microphone\"\n ]\n },\n {\n \"unified\": \"1F39A-FE0F\",\n \"shortnames\": [\n \"level_slider\"\n ]\n },\n {\n \"unified\": \"1F39B-FE0F\",\n \"shortnames\": [\n \"control_knobs\"\n ]\n },\n {\n \"unified\": \"1F3A4\",\n \"shortnames\": [\n \"microphone\"\n ]\n },\n {\n \"unified\": \"1F3A7\",\n \"shortnames\": [\n \"headphones\"\n ]\n },\n {\n \"unified\": \"1F4FB\",\n \"shortnames\": [\n \"radio\"\n ]\n },\n {\n \"unified\": \"1F3B7\",\n \"shortnames\": [\n \"saxophone\"\n ]\n },\n {\n \"unified\": \"1FA97\",\n \"shortnames\": [\n \"accordion\"\n ]\n },\n {\n \"unified\": \"1F3B8\",\n \"shortnames\": [\n \"guitar\"\n ]\n },\n {\n \"unified\": \"1F3B9\",\n \"shortnames\": [\n \"musical_keyboard\"\n ]\n },\n {\n \"unified\": \"1F3BA\",\n \"shortnames\": [\n \"trumpet\"\n ]\n },\n {\n \"unified\": \"1F3BB\",\n \"shortnames\": [\n \"violin\"\n ]\n },\n {\n \"unified\": \"1FA95\",\n \"shortnames\": [\n \"banjo\"\n ]\n },\n {\n \"unified\": \"1F941\",\n \"shortnames\": [\n \"drum_with_drumsticks\"\n ]\n },\n {\n \"unified\": \"1FA98\",\n \"shortnames\": [\n \"long_drum\"\n ]\n },\n {\n \"unified\": \"1F4F1\",\n \"shortnames\": [\n \"iphone\"\n ]\n },\n {\n \"unified\": \"1F4F2\",\n \"shortnames\": [\n \"calling\"\n ]\n },\n {\n \"unified\": \"260E-FE0F\",\n \"shortnames\": [\n \"phone\"\n ]\n },\n {\n \"unified\": \"1F4DE\",\n \"shortnames\": [\n \"telephone_receiver\"\n ]\n },\n {\n \"unified\": \"1F4DF\",\n \"shortnames\": [\n \"pager\"\n ]\n },\n {\n \"unified\": \"1F4E0\",\n \"shortnames\": [\n \"fax\"\n ]\n },\n {\n \"unified\": \"1F50B\",\n \"shortnames\": [\n \"battery\"\n ]\n },\n {\n \"unified\": \"1F50C\",\n \"shortnames\": [\n \"electric_plug\"\n ]\n },\n {\n \"unified\": \"1F4BB\",\n \"shortnames\": [\n \"computer\"\n ]\n },\n {\n \"unified\": \"1F5A5-FE0F\",\n \"shortnames\": [\n \"desktop_computer\"\n ]\n },\n {\n \"unified\": \"1F5A8-FE0F\",\n \"shortnames\": [\n \"printer\"\n ]\n },\n {\n \"unified\": \"2328-FE0F\",\n \"shortnames\": [\n \"keyboard\"\n ]\n },\n {\n \"unified\": \"1F5B1-FE0F\",\n \"shortnames\": [\n \"three_button_mouse\"\n ]\n },\n {\n \"unified\": \"1F5B2-FE0F\",\n \"shortnames\": [\n \"trackball\"\n ]\n },\n {\n \"unified\": \"1F4BD\",\n \"shortnames\": [\n \"minidisc\"\n ]\n },\n {\n \"unified\": \"1F4BE\",\n \"shortnames\": [\n \"floppy_disk\"\n ]\n },\n {\n \"unified\": \"1F4BF\",\n \"shortnames\": [\n \"cd\"\n ]\n },\n {\n \"unified\": \"1F4C0\",\n \"shortnames\": [\n \"dvd\"\n ]\n },\n {\n \"unified\": \"1F9EE\",\n \"shortnames\": [\n \"abacus\"\n ]\n },\n {\n \"unified\": \"1F3A5\",\n \"shortnames\": [\n \"movie_camera\"\n ]\n },\n {\n \"unified\": \"1F39E-FE0F\",\n \"shortnames\": [\n \"film_frames\"\n ]\n },\n {\n \"unified\": \"1F4FD-FE0F\",\n \"shortnames\": [\n \"film_projector\"\n ]\n },\n {\n \"unified\": \"1F3AC\",\n \"shortnames\": [\n \"clapper\"\n ]\n },\n {\n \"unified\": \"1F4FA\",\n \"shortnames\": [\n \"tv\"\n ]\n },\n {\n \"unified\": \"1F4F7\",\n \"shortnames\": [\n \"camera\"\n ]\n },\n {\n \"unified\": \"1F4F8\",\n \"shortnames\": [\n \"camera_with_flash\"\n ]\n },\n {\n \"unified\": \"1F4F9\",\n \"shortnames\": [\n \"video_camera\"\n ]\n },\n {\n \"unified\": \"1F4FC\",\n \"shortnames\": [\n \"vhs\"\n ]\n },\n {\n \"unified\": \"1F50D\",\n \"shortnames\": [\n \"mag\"\n ]\n },\n {\n \"unified\": \"1F50E\",\n \"shortnames\": [\n \"mag_right\"\n ]\n },\n {\n \"unified\": \"1F56F-FE0F\",\n \"shortnames\": [\n \"candle\"\n ]\n },\n {\n \"unified\": \"1F4A1\",\n \"shortnames\": [\n \"bulb\"\n ]\n },\n {\n \"unified\": \"1F526\",\n \"shortnames\": [\n \"flashlight\"\n ]\n },\n {\n \"unified\": \"1F3EE\",\n \"shortnames\": [\n \"izakaya_lantern\"\n ]\n },\n {\n \"unified\": \"1FA94\",\n \"shortnames\": [\n \"diya_lamp\"\n ]\n },\n {\n \"unified\": \"1F4D4\",\n \"shortnames\": [\n \"notebook_with_decorative_cover\"\n ]\n },\n {\n \"unified\": \"1F4D5\",\n \"shortnames\": [\n \"closed_book\"\n ]\n },\n {\n \"unified\": \"1F4D6\",\n \"shortnames\": [\n \"book\"\n ]\n },\n {\n \"unified\": \"1F4D7\",\n \"shortnames\": [\n \"green_book\"\n ]\n },\n {\n \"unified\": \"1F4D8\",\n \"shortnames\": [\n \"blue_book\"\n ]\n },\n {\n \"unified\": \"1F4D9\",\n \"shortnames\": [\n \"orange_book\"\n ]\n },\n {\n \"unified\": \"1F4DA\",\n \"shortnames\": [\n \"books\"\n ]\n },\n {\n \"unified\": \"1F4D3\",\n \"shortnames\": [\n \"notebook\"\n ]\n },\n {\n \"unified\": \"1F4D2\",\n \"shortnames\": [\n \"ledger\"\n ]\n },\n {\n \"unified\": \"1F4C3\",\n \"shortnames\": [\n \"page_with_curl\"\n ]\n },\n {\n \"unified\": \"1F4DC\",\n \"shortnames\": [\n \"scroll\"\n ]\n },\n {\n \"unified\": \"1F4C4\",\n \"shortnames\": [\n \"page_facing_up\"\n ]\n },\n {\n \"unified\": \"1F4F0\",\n \"shortnames\": [\n \"newspaper\"\n ]\n },\n {\n \"unified\": \"1F5DE-FE0F\",\n \"shortnames\": [\n \"rolled_up_newspaper\"\n ]\n },\n {\n \"unified\": \"1F4D1\",\n \"shortnames\": [\n \"bookmark_tabs\"\n ]\n },\n {\n \"unified\": \"1F516\",\n \"shortnames\": [\n \"bookmark\"\n ]\n },\n {\n \"unified\": \"1F3F7-FE0F\",\n \"shortnames\": [\n \"label\"\n ]\n },\n {\n \"unified\": \"1F4B0\",\n \"shortnames\": [\n \"moneybag\"\n ]\n },\n {\n \"unified\": \"1FA99\",\n \"shortnames\": [\n \"coin\"\n ]\n },\n {\n \"unified\": \"1F4B4\",\n \"shortnames\": [\n \"yen\"\n ]\n },\n {\n \"unified\": \"1F4B5\",\n \"shortnames\": [\n \"dollar\"\n ]\n },\n {\n \"unified\": \"1F4B6\",\n \"shortnames\": [\n \"euro\"\n ]\n },\n {\n \"unified\": \"1F4B7\",\n \"shortnames\": [\n \"pound\"\n ]\n },\n {\n \"unified\": \"1F4B8\",\n \"shortnames\": [\n \"money_with_wings\"\n ]\n },\n {\n \"unified\": \"1F4B3\",\n \"shortnames\": [\n \"credit_card\"\n ]\n },\n {\n \"unified\": \"1F9FE\",\n \"shortnames\": [\n \"receipt\"\n ]\n },\n {\n \"unified\": \"1F4B9\",\n \"shortnames\": [\n \"chart\"\n ]\n },\n {\n \"unified\": \"2709-FE0F\",\n \"shortnames\": [\n \"email\"\n ]\n },\n {\n \"unified\": \"1F4E7\",\n \"shortnames\": [\n \"e-mail\"\n ]\n },\n {\n \"unified\": \"1F4E8\",\n \"shortnames\": [\n \"incoming_envelope\"\n ]\n },\n {\n \"unified\": \"1F4E9\",\n \"shortnames\": [\n \"envelope_with_arrow\"\n ]\n },\n {\n \"unified\": \"1F4E4\",\n \"shortnames\": [\n \"outbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E5\",\n \"shortnames\": [\n \"inbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E6\",\n \"shortnames\": [\n \"package\"\n ]\n },\n {\n \"unified\": \"1F4EB\",\n \"shortnames\": [\n \"mailbox\"\n ]\n },\n {\n \"unified\": \"1F4EA\",\n \"shortnames\": [\n \"mailbox_closed\"\n ]\n },\n {\n \"unified\": \"1F4EC\",\n \"shortnames\": [\n \"mailbox_with_mail\"\n ]\n },\n {\n \"unified\": \"1F4ED\",\n \"shortnames\": [\n \"mailbox_with_no_mail\"\n ]\n },\n {\n \"unified\": \"1F4EE\",\n \"shortnames\": [\n \"postbox\"\n ]\n },\n {\n \"unified\": \"1F5F3-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_ballot\"\n ]\n },\n {\n \"unified\": \"270F-FE0F\",\n \"shortnames\": [\n \"pencil2\"\n ]\n },\n {\n \"unified\": \"2712-FE0F\",\n \"shortnames\": [\n \"black_nib\"\n ]\n },\n {\n \"unified\": \"1F58B-FE0F\",\n \"shortnames\": [\n \"lower_left_fountain_pen\"\n ]\n },\n {\n \"unified\": \"1F58A-FE0F\",\n \"shortnames\": [\n \"lower_left_ballpoint_pen\"\n ]\n },\n {\n \"unified\": \"1F58C-FE0F\",\n \"shortnames\": [\n \"lower_left_paintbrush\"\n ]\n },\n {\n \"unified\": \"1F58D-FE0F\",\n \"shortnames\": [\n \"lower_left_crayon\"\n ]\n },\n {\n \"unified\": \"1F4DD\",\n \"shortnames\": [\n \"memo\"\n ]\n },\n {\n \"unified\": \"1F4BC\",\n \"shortnames\": [\n \"briefcase\"\n ]\n },\n {\n \"unified\": \"1F4C1\",\n \"shortnames\": [\n \"file_folder\"\n ]\n },\n {\n \"unified\": \"1F4C2\",\n \"shortnames\": [\n \"open_file_folder\"\n ]\n },\n {\n \"unified\": \"1F5C2-FE0F\",\n \"shortnames\": [\n \"card_index_dividers\"\n ]\n },\n {\n \"unified\": \"1F4C5\",\n \"shortnames\": [\n \"date\"\n ]\n },\n {\n \"unified\": \"1F4C6\",\n \"shortnames\": [\n \"calendar\"\n ]\n },\n {\n \"unified\": \"1F5D2-FE0F\",\n \"shortnames\": [\n \"spiral_note_pad\"\n ]\n },\n {\n \"unified\": \"1F5D3-FE0F\",\n \"shortnames\": [\n \"spiral_calendar_pad\"\n ]\n },\n {\n \"unified\": \"1F4C7\",\n \"shortnames\": [\n \"card_index\"\n ]\n },\n {\n \"unified\": \"1F4C8\",\n \"shortnames\": [\n \"chart_with_upwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4C9\",\n \"shortnames\": [\n \"chart_with_downwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4CA\",\n \"shortnames\": [\n \"bar_chart\"\n ]\n },\n {\n \"unified\": \"1F4CB\",\n \"shortnames\": [\n \"clipboard\"\n ]\n },\n {\n \"unified\": \"1F4CC\",\n \"shortnames\": [\n \"pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CD\",\n \"shortnames\": [\n \"round_pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CE\",\n \"shortnames\": [\n \"paperclip\"\n ]\n },\n {\n \"unified\": \"1F587-FE0F\",\n \"shortnames\": [\n \"linked_paperclips\"\n ]\n },\n {\n \"unified\": \"1F4CF\",\n \"shortnames\": [\n \"straight_ruler\"\n ]\n },\n {\n \"unified\": \"1F4D0\",\n \"shortnames\": [\n \"triangular_ruler\"\n ]\n },\n {\n \"unified\": \"2702-FE0F\",\n \"shortnames\": [\n \"scissors\"\n ]\n },\n {\n \"unified\": \"1F5C3-FE0F\",\n \"shortnames\": [\n \"card_file_box\"\n ]\n },\n {\n \"unified\": \"1F5C4-FE0F\",\n \"shortnames\": [\n \"file_cabinet\"\n ]\n },\n {\n \"unified\": \"1F5D1-FE0F\",\n \"shortnames\": [\n \"wastebasket\"\n ]\n },\n {\n \"unified\": \"1F512\",\n \"shortnames\": [\n \"lock\"\n ]\n },\n {\n \"unified\": \"1F513\",\n \"shortnames\": [\n \"unlock\"\n ]\n },\n {\n \"unified\": \"1F50F\",\n \"shortnames\": [\n \"lock_with_ink_pen\"\n ]\n },\n {\n \"unified\": \"1F510\",\n \"shortnames\": [\n \"closed_lock_with_key\"\n ]\n },\n {\n \"unified\": \"1F511\",\n \"shortnames\": [\n \"key\"\n ]\n },\n {\n \"unified\": \"1F5DD-FE0F\",\n \"shortnames\": [\n \"old_key\"\n ]\n },\n {\n \"unified\": \"1F528\",\n \"shortnames\": [\n \"hammer\"\n ]\n },\n {\n \"unified\": \"1FA93\",\n \"shortnames\": [\n \"axe\"\n ]\n },\n {\n \"unified\": \"26CF-FE0F\",\n \"shortnames\": [\n \"pick\"\n ]\n },\n {\n \"unified\": \"2692-FE0F\",\n \"shortnames\": [\n \"hammer_and_pick\"\n ]\n },\n {\n \"unified\": \"1F6E0-FE0F\",\n \"shortnames\": [\n \"hammer_and_wrench\"\n ]\n },\n {\n \"unified\": \"1F5E1-FE0F\",\n \"shortnames\": [\n \"dagger_knife\"\n ]\n },\n {\n \"unified\": \"2694-FE0F\",\n \"shortnames\": [\n \"crossed_swords\"\n ]\n },\n {\n \"unified\": \"1F52B\",\n \"shortnames\": [\n \"gun\"\n ]\n },\n {\n \"unified\": \"1FA83\",\n \"shortnames\": [\n \"boomerang\"\n ]\n },\n {\n \"unified\": \"1F3F9\",\n \"shortnames\": [\n \"bow_and_arrow\"\n ]\n },\n {\n \"unified\": \"1F6E1-FE0F\",\n \"shortnames\": [\n \"shield\"\n ]\n },\n {\n \"unified\": \"1FA9A\",\n \"shortnames\": [\n \"carpentry_saw\"\n ]\n },\n {\n \"unified\": \"1F527\",\n \"shortnames\": [\n \"wrench\"\n ]\n },\n {\n \"unified\": \"1FA9B\",\n \"shortnames\": [\n \"screwdriver\"\n ]\n },\n {\n \"unified\": \"1F529\",\n \"shortnames\": [\n \"nut_and_bolt\"\n ]\n },\n {\n \"unified\": \"2699-FE0F\",\n \"shortnames\": [\n \"gear\"\n ]\n },\n {\n \"unified\": \"1F5DC-FE0F\",\n \"shortnames\": [\n \"compression\"\n ]\n },\n {\n \"unified\": \"2696-FE0F\",\n \"shortnames\": [\n \"scales\"\n ]\n },\n {\n \"unified\": \"1F9AF\",\n \"shortnames\": [\n \"probing_cane\"\n ]\n },\n {\n \"unified\": \"1F517\",\n \"shortnames\": [\n \"link\"\n ]\n },\n {\n \"unified\": \"26D3-FE0F\",\n \"shortnames\": [\n \"chains\"\n ]\n },\n {\n \"unified\": \"1FA9D\",\n \"shortnames\": [\n \"hook\"\n ]\n },\n {\n \"unified\": \"1F9F0\",\n \"shortnames\": [\n \"toolbox\"\n ]\n },\n {\n \"unified\": \"1F9F2\",\n \"shortnames\": [\n \"magnet\"\n ]\n },\n {\n \"unified\": \"1FA9C\",\n \"shortnames\": [\n \"ladder\"\n ]\n },\n {\n \"unified\": \"2697-FE0F\",\n \"shortnames\": [\n \"alembic\"\n ]\n },\n {\n \"unified\": \"1F9EA\",\n \"shortnames\": [\n \"test_tube\"\n ]\n },\n {\n \"unified\": \"1F9EB\",\n \"shortnames\": [\n \"petri_dish\"\n ]\n },\n {\n \"unified\": \"1F9EC\",\n \"shortnames\": [\n \"dna\"\n ]\n },\n {\n \"unified\": \"1F52C\",\n \"shortnames\": [\n \"microscope\"\n ]\n },\n {\n \"unified\": \"1F52D\",\n \"shortnames\": [\n \"telescope\"\n ]\n },\n {\n \"unified\": \"1F4E1\",\n \"shortnames\": [\n \"satellite_antenna\"\n ]\n },\n {\n \"unified\": \"1F489\",\n \"shortnames\": [\n \"syringe\"\n ]\n },\n {\n \"unified\": \"1FA78\",\n \"shortnames\": [\n \"drop_of_blood\"\n ]\n },\n {\n \"unified\": \"1F48A\",\n \"shortnames\": [\n \"pill\"\n ]\n },\n {\n \"unified\": \"1FA79\",\n \"shortnames\": [\n \"adhesive_bandage\"\n ]\n },\n {\n \"unified\": \"1FA7A\",\n \"shortnames\": [\n \"stethoscope\"\n ]\n },\n {\n \"unified\": \"1F6AA\",\n \"shortnames\": [\n \"door\"\n ]\n },\n {\n \"unified\": \"1F6D7\",\n \"shortnames\": [\n \"elevator\"\n ]\n },\n {\n \"unified\": \"1FA9E\",\n \"shortnames\": [\n \"mirror\"\n ]\n },\n {\n \"unified\": \"1FA9F\",\n \"shortnames\": [\n \"window\"\n ]\n },\n {\n \"unified\": \"1F6CF-FE0F\",\n \"shortnames\": [\n \"bed\"\n ]\n },\n {\n \"unified\": \"1F6CB-FE0F\",\n \"shortnames\": [\n \"couch_and_lamp\"\n ]\n },\n {\n \"unified\": \"1FA91\",\n \"shortnames\": [\n \"chair\"\n ]\n },\n {\n \"unified\": \"1F6BD\",\n \"shortnames\": [\n \"toilet\"\n ]\n },\n {\n \"unified\": \"1FAA0\",\n \"shortnames\": [\n \"plunger\"\n ]\n },\n {\n \"unified\": \"1F6BF\",\n \"shortnames\": [\n \"shower\"\n ]\n },\n {\n \"unified\": \"1F6C1\",\n \"shortnames\": [\n \"bathtub\"\n ]\n },\n {\n \"unified\": \"1FAA4\",\n \"shortnames\": [\n \"mouse_trap\"\n ]\n },\n {\n \"unified\": \"1FA92\",\n \"shortnames\": [\n \"razor\"\n ]\n },\n {\n \"unified\": \"1F9F4\",\n \"shortnames\": [\n \"lotion_bottle\"\n ]\n },\n {\n \"unified\": \"1F9F7\",\n \"shortnames\": [\n \"safety_pin\"\n ]\n },\n {\n \"unified\": \"1F9F9\",\n \"shortnames\": [\n \"broom\"\n ]\n },\n {\n \"unified\": \"1F9FA\",\n \"shortnames\": [\n \"basket\"\n ]\n },\n {\n \"unified\": \"1F9FB\",\n \"shortnames\": [\n \"roll_of_paper\"\n ]\n },\n {\n \"unified\": \"1FAA3\",\n \"shortnames\": [\n \"bucket\"\n ]\n },\n {\n \"unified\": \"1F9FC\",\n \"shortnames\": [\n \"soap\"\n ]\n },\n {\n \"unified\": \"1FAA5\",\n \"shortnames\": [\n \"toothbrush\"\n ]\n },\n {\n \"unified\": \"1F9FD\",\n \"shortnames\": [\n \"sponge\"\n ]\n },\n {\n \"unified\": \"1F9EF\",\n \"shortnames\": [\n \"fire_extinguisher\"\n ]\n },\n {\n \"unified\": \"1F6D2\",\n \"shortnames\": [\n \"shopping_trolley\"\n ]\n },\n {\n \"unified\": \"1F6AC\",\n \"shortnames\": [\n \"smoking\"\n ]\n },\n {\n \"unified\": \"26B0-FE0F\",\n \"shortnames\": [\n \"coffin\"\n ]\n },\n {\n \"unified\": \"1FAA6\",\n \"shortnames\": [\n \"headstone\"\n ]\n },\n {\n \"unified\": \"26B1-FE0F\",\n \"shortnames\": [\n \"funeral_urn\"\n ]\n },\n {\n \"unified\": \"1F5FF\",\n \"shortnames\": [\n \"moyai\"\n ]\n },\n {\n \"unified\": \"1FAA7\",\n \"shortnames\": [\n \"placard\"\n ]\n }\n ]\n },\n {\n \"name\": \"Symbols\",\n \"emojis\": [\n {\n \"unified\": \"1F3E7\",\n \"shortnames\": [\n \"atm\"\n ]\n },\n {\n \"unified\": \"1F6AE\",\n \"shortnames\": [\n \"put_litter_in_its_place\"\n ]\n },\n {\n \"unified\": \"1F6B0\",\n \"shortnames\": [\n \"potable_water\"\n ]\n },\n {\n \"unified\": \"267F\",\n \"shortnames\": [\n \"wheelchair\"\n ]\n },\n {\n \"unified\": \"1F6B9\",\n \"shortnames\": [\n \"mens\"\n ]\n },\n {\n \"unified\": \"1F6BA\",\n \"shortnames\": [\n \"womens\"\n ]\n },\n {\n \"unified\": \"1F6BB\",\n \"shortnames\": [\n \"restroom\"\n ]\n },\n {\n \"unified\": \"1F6BC\",\n \"shortnames\": [\n \"baby_symbol\"\n ]\n },\n {\n \"unified\": \"1F6BE\",\n \"shortnames\": [\n \"wc\"\n ]\n },\n {\n \"unified\": \"1F6C2\",\n \"shortnames\": [\n \"passport_control\"\n ]\n },\n {\n \"unified\": \"1F6C3\",\n \"shortnames\": [\n \"customs\"\n ]\n },\n {\n \"unified\": \"1F6C4\",\n \"shortnames\": [\n \"baggage_claim\"\n ]\n },\n {\n \"unified\": \"1F6C5\",\n \"shortnames\": [\n \"left_luggage\"\n ]\n },\n {\n \"unified\": \"26A0-FE0F\",\n \"shortnames\": [\n \"warning\"\n ]\n },\n {\n \"unified\": \"1F6B8\",\n \"shortnames\": [\n \"children_crossing\"\n ]\n },\n {\n \"unified\": \"26D4\",\n \"shortnames\": [\n \"no_entry\"\n ]\n },\n {\n \"unified\": \"1F6AB\",\n \"shortnames\": [\n \"no_entry_sign\"\n ]\n },\n {\n \"unified\": \"1F6B3\",\n \"shortnames\": [\n \"no_bicycles\"\n ]\n },\n {\n \"unified\": \"1F6AD\",\n \"shortnames\": [\n \"no_smoking\"\n ]\n },\n {\n \"unified\": \"1F6AF\",\n \"shortnames\": [\n \"do_not_litter\"\n ]\n },\n {\n \"unified\": \"1F6B1\",\n \"shortnames\": [\n \"non-potable_water\"\n ]\n },\n {\n \"unified\": \"1F6B7\",\n \"shortnames\": [\n \"no_pedestrians\"\n ]\n },\n {\n \"unified\": \"1F4F5\",\n \"shortnames\": [\n \"no_mobile_phones\"\n ]\n },\n {\n \"unified\": \"1F51E\",\n \"shortnames\": [\n \"underage\"\n ]\n },\n {\n \"unified\": \"2622-FE0F\",\n \"shortnames\": [\n \"radioactive_sign\"\n ]\n },\n {\n \"unified\": \"2623-FE0F\",\n \"shortnames\": [\n \"biohazard_sign\"\n ]\n },\n {\n \"unified\": \"2B06-FE0F\",\n \"shortnames\": [\n \"arrow_up\"\n ]\n },\n {\n \"unified\": \"2197-FE0F\",\n \"shortnames\": [\n \"arrow_upper_right\"\n ]\n },\n {\n \"unified\": \"27A1-FE0F\",\n \"shortnames\": [\n \"arrow_right\"\n ]\n },\n {\n \"unified\": \"2198-FE0F\",\n \"shortnames\": [\n \"arrow_lower_right\"\n ]\n },\n {\n \"unified\": \"2B07-FE0F\",\n \"shortnames\": [\n \"arrow_down\"\n ]\n },\n {\n \"unified\": \"2199-FE0F\",\n \"shortnames\": [\n \"arrow_lower_left\"\n ]\n },\n {\n \"unified\": \"2B05-FE0F\",\n \"shortnames\": [\n \"arrow_left\"\n ]\n },\n {\n \"unified\": \"2196-FE0F\",\n \"shortnames\": [\n \"arrow_upper_left\"\n ]\n },\n {\n \"unified\": \"2195-FE0F\",\n \"shortnames\": [\n \"arrow_up_down\"\n ]\n },\n {\n \"unified\": \"2194-FE0F\",\n \"shortnames\": [\n \"left_right_arrow\"\n ]\n },\n {\n \"unified\": \"21A9-FE0F\",\n \"shortnames\": [\n \"leftwards_arrow_with_hook\"\n ]\n },\n {\n \"unified\": \"21AA-FE0F\",\n \"shortnames\": [\n \"arrow_right_hook\"\n ]\n },\n {\n \"unified\": \"2934-FE0F\",\n \"shortnames\": [\n \"arrow_heading_up\"\n ]\n },\n {\n \"unified\": \"2935-FE0F\",\n \"shortnames\": [\n \"arrow_heading_down\"\n ]\n },\n {\n \"unified\": \"1F503\",\n \"shortnames\": [\n \"arrows_clockwise\"\n ]\n },\n {\n \"unified\": \"1F504\",\n \"shortnames\": [\n \"arrows_counterclockwise\"\n ]\n },\n {\n \"unified\": \"1F519\",\n \"shortnames\": [\n \"back\"\n ]\n },\n {\n \"unified\": \"1F51A\",\n \"shortnames\": [\n \"end\"\n ]\n },\n {\n \"unified\": \"1F51B\",\n \"shortnames\": [\n \"on\"\n ]\n },\n {\n \"unified\": \"1F51C\",\n \"shortnames\": [\n \"soon\"\n ]\n },\n {\n \"unified\": \"1F51D\",\n \"shortnames\": [\n \"top\"\n ]\n },\n {\n \"unified\": \"1F6D0\",\n \"shortnames\": [\n \"place_of_worship\"\n ]\n },\n {\n \"unified\": \"269B-FE0F\",\n \"shortnames\": [\n \"atom_symbol\"\n ]\n },\n {\n \"unified\": \"1F549-FE0F\",\n \"shortnames\": [\n \"om_symbol\"\n ]\n },\n {\n \"unified\": \"2721-FE0F\",\n \"shortnames\": [\n \"star_of_david\"\n ]\n },\n {\n \"unified\": \"2638-FE0F\",\n \"shortnames\": [\n \"wheel_of_dharma\"\n ]\n },\n {\n \"unified\": \"262F-FE0F\",\n \"shortnames\": [\n \"yin_yang\"\n ]\n },\n {\n \"unified\": \"271D-FE0F\",\n \"shortnames\": [\n \"latin_cross\"\n ]\n },\n {\n \"unified\": \"2626-FE0F\",\n \"shortnames\": [\n \"orthodox_cross\"\n ]\n },\n {\n \"unified\": \"262A-FE0F\",\n \"shortnames\": [\n \"star_and_crescent\"\n ]\n },\n {\n \"unified\": \"262E-FE0F\",\n \"shortnames\": [\n \"peace_symbol\"\n ]\n },\n {\n \"unified\": \"1F54E\",\n \"shortnames\": [\n \"menorah_with_nine_branches\"\n ]\n },\n {\n \"unified\": \"1F52F\",\n \"shortnames\": [\n \"six_pointed_star\"\n ]\n },\n {\n \"unified\": \"2648\",\n \"shortnames\": [\n \"aries\"\n ]\n },\n {\n \"unified\": \"2649\",\n \"shortnames\": [\n \"taurus\"\n ]\n },\n {\n \"unified\": \"264A\",\n \"shortnames\": [\n \"gemini\"\n ]\n },\n {\n \"unified\": \"264B\",\n \"shortnames\": [\n \"cancer\"\n ]\n },\n {\n \"unified\": \"264C\",\n \"shortnames\": [\n \"leo\"\n ]\n },\n {\n \"unified\": \"264D\",\n \"shortnames\": [\n \"virgo\"\n ]\n },\n {\n \"unified\": \"264E\",\n \"shortnames\": [\n \"libra\"\n ]\n },\n {\n \"unified\": \"264F\",\n \"shortnames\": [\n \"scorpius\"\n ]\n },\n {\n \"unified\": \"2650\",\n \"shortnames\": [\n \"sagittarius\"\n ]\n },\n {\n \"unified\": \"2651\",\n \"shortnames\": [\n \"capricorn\"\n ]\n },\n {\n \"unified\": \"2652\",\n \"shortnames\": [\n \"aquarius\"\n ]\n },\n {\n \"unified\": \"2653\",\n \"shortnames\": [\n \"pisces\"\n ]\n },\n {\n \"unified\": \"26CE\",\n \"shortnames\": [\n \"ophiuchus\"\n ]\n },\n {\n \"unified\": \"1F500\",\n \"shortnames\": [\n \"twisted_rightwards_arrows\"\n ]\n },\n {\n \"unified\": \"1F501\",\n \"shortnames\": [\n \"repeat\"\n ]\n },\n {\n \"unified\": \"1F502\",\n \"shortnames\": [\n \"repeat_one\"\n ]\n },\n {\n \"unified\": \"25B6-FE0F\",\n \"shortnames\": [\n \"arrow_forward\"\n ]\n },\n {\n \"unified\": \"23E9\",\n \"shortnames\": [\n \"fast_forward\"\n ]\n },\n {\n \"unified\": \"23ED-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23EF-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_triangle_with_double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"25C0-FE0F\",\n \"shortnames\": [\n \"arrow_backward\"\n ]\n },\n {\n \"unified\": \"23EA\",\n \"shortnames\": [\n \"rewind\"\n ]\n },\n {\n \"unified\": \"23EE-FE0F\",\n \"shortnames\": [\n \"black_left_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"1F53C\",\n \"shortnames\": [\n \"arrow_up_small\"\n ]\n },\n {\n \"unified\": \"23EB\",\n \"shortnames\": [\n \"arrow_double_up\"\n ]\n },\n {\n \"unified\": \"1F53D\",\n \"shortnames\": [\n \"arrow_down_small\"\n ]\n },\n {\n \"unified\": \"23EC\",\n \"shortnames\": [\n \"arrow_double_down\"\n ]\n },\n {\n \"unified\": \"23F8-FE0F\",\n \"shortnames\": [\n \"double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23F9-FE0F\",\n \"shortnames\": [\n \"black_square_for_stop\"\n ]\n },\n {\n \"unified\": \"23FA-FE0F\",\n \"shortnames\": [\n \"black_circle_for_record\"\n ]\n },\n {\n \"unified\": \"23CF-FE0F\",\n \"shortnames\": [\n \"eject\"\n ]\n },\n {\n \"unified\": \"1F3A6\",\n \"shortnames\": [\n \"cinema\"\n ]\n },\n {\n \"unified\": \"1F505\",\n \"shortnames\": [\n \"low_brightness\"\n ]\n },\n {\n \"unified\": \"1F506\",\n \"shortnames\": [\n \"high_brightness\"\n ]\n },\n {\n \"unified\": \"1F4F6\",\n \"shortnames\": [\n \"signal_strength\"\n ]\n },\n {\n \"unified\": \"1F4F3\",\n \"shortnames\": [\n \"vibration_mode\"\n ]\n },\n {\n \"unified\": \"1F4F4\",\n \"shortnames\": [\n \"mobile_phone_off\"\n ]\n },\n {\n \"unified\": \"2640-FE0F\",\n \"shortnames\": [\n \"female_sign\"\n ]\n },\n {\n \"unified\": \"2642-FE0F\",\n \"shortnames\": [\n \"male_sign\"\n ]\n },\n {\n \"unified\": \"26A7-FE0F\",\n \"shortnames\": [\n \"transgender_symbol\"\n ]\n },\n {\n \"unified\": \"2716-FE0F\",\n \"shortnames\": [\n \"heavy_multiplication_x\"\n ]\n },\n {\n \"unified\": \"2795\",\n \"shortnames\": [\n \"heavy_plus_sign\"\n ]\n },\n {\n \"unified\": \"2796\",\n \"shortnames\": [\n \"heavy_minus_sign\"\n ]\n },\n {\n \"unified\": \"2797\",\n \"shortnames\": [\n \"heavy_division_sign\"\n ]\n },\n {\n \"unified\": \"267E-FE0F\",\n \"shortnames\": [\n \"infinity\"\n ]\n },\n {\n \"unified\": \"203C-FE0F\",\n \"shortnames\": [\n \"bangbang\"\n ]\n },\n {\n \"unified\": \"2049-FE0F\",\n \"shortnames\": [\n \"interrobang\"\n ]\n },\n {\n \"unified\": \"2753\",\n \"shortnames\": [\n \"question\"\n ]\n },\n {\n \"unified\": \"2754\",\n \"shortnames\": [\n \"grey_question\"\n ]\n },\n {\n \"unified\": \"2755\",\n \"shortnames\": [\n \"grey_exclamation\"\n ]\n },\n {\n \"unified\": \"2757\",\n \"shortnames\": [\n \"exclamation\"\n ]\n },\n {\n \"unified\": \"3030-FE0F\",\n \"shortnames\": [\n \"wavy_dash\"\n ]\n },\n {\n \"unified\": \"1F4B1\",\n \"shortnames\": [\n \"currency_exchange\"\n ]\n },\n {\n \"unified\": \"1F4B2\",\n \"shortnames\": [\n \"heavy_dollar_sign\"\n ]\n },\n {\n \"unified\": \"2695-FE0F\",\n \"shortnames\": [\n \"medical_symbol\"\n ]\n },\n {\n \"unified\": \"267B-FE0F\",\n \"shortnames\": [\n \"recycle\"\n ]\n },\n {\n \"unified\": \"269C-FE0F\",\n \"shortnames\": [\n \"fleur_de_lis\"\n ]\n },\n {\n \"unified\": \"1F531\",\n \"shortnames\": [\n \"trident\"\n ]\n },\n {\n \"unified\": \"1F4DB\",\n \"shortnames\": [\n \"name_badge\"\n ]\n },\n {\n \"unified\": \"1F530\",\n \"shortnames\": [\n \"beginner\"\n ]\n },\n {\n \"unified\": \"2B55\",\n \"shortnames\": [\n \"o\"\n ]\n },\n {\n \"unified\": \"2705\",\n \"shortnames\": [\n \"white_check_mark\"\n ]\n },\n {\n \"unified\": \"2611-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_check\"\n ]\n },\n {\n \"unified\": \"2714-FE0F\",\n \"shortnames\": [\n \"heavy_check_mark\"\n ]\n },\n {\n \"unified\": \"274C\",\n \"shortnames\": [\n \"x\"\n ]\n },\n {\n \"unified\": \"274E\",\n \"shortnames\": [\n \"negative_squared_cross_mark\"\n ]\n },\n {\n \"unified\": \"27B0\",\n \"shortnames\": [\n \"curly_loop\"\n ]\n },\n {\n \"unified\": \"27BF\",\n \"shortnames\": [\n \"loop\"\n ]\n },\n {\n \"unified\": \"303D-FE0F\",\n \"shortnames\": [\n \"part_alternation_mark\"\n ]\n },\n {\n \"unified\": \"2733-FE0F\",\n \"shortnames\": [\n \"eight_spoked_asterisk\"\n ]\n },\n {\n \"unified\": \"2734-FE0F\",\n \"shortnames\": [\n \"eight_pointed_black_star\"\n ]\n },\n {\n \"unified\": \"2747-FE0F\",\n \"shortnames\": [\n \"sparkle\"\n ]\n },\n {\n \"unified\": \"00A9-FE0F\",\n \"shortnames\": [\n \"copyright\"\n ]\n },\n {\n \"unified\": \"00AE-FE0F\",\n \"shortnames\": [\n \"registered\"\n ]\n },\n {\n \"unified\": \"2122-FE0F\",\n \"shortnames\": [\n \"tm\"\n ]\n },\n {\n \"unified\": \"0023-FE0F-20E3\",\n \"shortnames\": [\n \"hash\"\n ]\n },\n {\n \"unified\": \"002A-FE0F-20E3\",\n \"shortnames\": [\n \"keycap_star\"\n ]\n },\n {\n \"unified\": \"0030-FE0F-20E3\",\n \"shortnames\": [\n \"zero\"\n ]\n },\n {\n \"unified\": \"0031-FE0F-20E3\",\n \"shortnames\": [\n \"one\"\n ]\n },\n {\n \"unified\": \"0032-FE0F-20E3\",\n \"shortnames\": [\n \"two\"\n ]\n },\n {\n \"unified\": \"0033-FE0F-20E3\",\n \"shortnames\": [\n \"three\"\n ]\n },\n {\n \"unified\": \"0034-FE0F-20E3\",\n \"shortnames\": [\n \"four\"\n ]\n },\n {\n \"unified\": \"0035-FE0F-20E3\",\n \"shortnames\": [\n \"five\"\n ]\n },\n {\n \"unified\": \"0036-FE0F-20E3\",\n \"shortnames\": [\n \"six\"\n ]\n },\n {\n \"unified\": \"0037-FE0F-20E3\",\n \"shortnames\": [\n \"seven\"\n ]\n },\n {\n \"unified\": \"0038-FE0F-20E3\",\n \"shortnames\": [\n \"eight\"\n ]\n },\n {\n \"unified\": \"0039-FE0F-20E3\",\n \"shortnames\": [\n \"nine\"\n ]\n },\n {\n \"unified\": \"1F51F\",\n \"shortnames\": [\n \"keycap_ten\"\n ]\n },\n {\n \"unified\": \"1F520\",\n \"shortnames\": [\n \"capital_abcd\"\n ]\n },\n {\n \"unified\": \"1F521\",\n \"shortnames\": [\n \"abcd\"\n ]\n },\n {\n \"unified\": \"1F522\",\n \"shortnames\": [\n \"1234\"\n ]\n },\n {\n \"unified\": \"1F523\",\n \"shortnames\": [\n \"symbols\"\n ]\n },\n {\n \"unified\": \"1F524\",\n \"shortnames\": [\n \"abc\"\n ]\n },\n {\n \"unified\": \"1F170-FE0F\",\n \"shortnames\": [\n \"a\"\n ]\n },\n {\n \"unified\": \"1F18E\",\n \"shortnames\": [\n \"ab\"\n ]\n },\n {\n \"unified\": \"1F171-FE0F\",\n \"shortnames\": [\n \"b\"\n ]\n },\n {\n \"unified\": \"1F191\",\n \"shortnames\": [\n \"cl\"\n ]\n },\n {\n \"unified\": \"1F192\",\n \"shortnames\": [\n \"cool\"\n ]\n },\n {\n \"unified\": \"1F193\",\n \"shortnames\": [\n \"free\"\n ]\n },\n {\n \"unified\": \"2139-FE0F\",\n \"shortnames\": [\n \"information_source\"\n ]\n },\n {\n \"unified\": \"1F194\",\n \"shortnames\": [\n \"id\"\n ]\n },\n {\n \"unified\": \"24C2-FE0F\",\n \"shortnames\": [\n \"m\"\n ]\n },\n {\n \"unified\": \"1F195\",\n \"shortnames\": [\n \"new\"\n ]\n },\n {\n \"unified\": \"1F196\",\n \"shortnames\": [\n \"ng\"\n ]\n },\n {\n \"unified\": \"1F17E-FE0F\",\n \"shortnames\": [\n \"o2\"\n ]\n },\n {\n \"unified\": \"1F197\",\n \"shortnames\": [\n \"ok\"\n ]\n },\n {\n \"unified\": \"1F17F-FE0F\",\n \"shortnames\": [\n \"parking\"\n ]\n },\n {\n \"unified\": \"1F198\",\n \"shortnames\": [\n \"sos\"\n ]\n },\n {\n \"unified\": \"1F199\",\n \"shortnames\": [\n \"up\"\n ]\n },\n {\n \"unified\": \"1F19A\",\n \"shortnames\": [\n \"vs\"\n ]\n },\n {\n \"unified\": \"1F201\",\n \"shortnames\": [\n \"koko\"\n ]\n },\n {\n \"unified\": \"1F202-FE0F\",\n \"shortnames\": [\n \"sa\"\n ]\n },\n {\n \"unified\": \"1F237-FE0F\",\n \"shortnames\": [\n \"u6708\"\n ]\n },\n {\n \"unified\": \"1F236\",\n \"shortnames\": [\n \"u6709\"\n ]\n },\n {\n \"unified\": \"1F22F\",\n \"shortnames\": [\n \"u6307\"\n ]\n },\n {\n \"unified\": \"1F250\",\n \"shortnames\": [\n \"ideograph_advantage\"\n ]\n },\n {\n \"unified\": \"1F239\",\n \"shortnames\": [\n \"u5272\"\n ]\n },\n {\n \"unified\": \"1F21A\",\n \"shortnames\": [\n \"u7121\"\n ]\n },\n {\n \"unified\": \"1F232\",\n \"shortnames\": [\n \"u7981\"\n ]\n },\n {\n \"unified\": \"1F251\",\n \"shortnames\": [\n \"accept\"\n ]\n },\n {\n \"unified\": \"1F238\",\n \"shortnames\": [\n \"u7533\"\n ]\n },\n {\n \"unified\": \"1F234\",\n \"shortnames\": [\n \"u5408\"\n ]\n },\n {\n \"unified\": \"1F233\",\n \"shortnames\": [\n \"u7a7a\"\n ]\n },\n {\n \"unified\": \"3297-FE0F\",\n \"shortnames\": [\n \"congratulations\"\n ]\n },\n {\n \"unified\": \"3299-FE0F\",\n \"shortnames\": [\n \"secret\"\n ]\n },\n {\n \"unified\": \"1F23A\",\n \"shortnames\": [\n \"u55b6\"\n ]\n },\n {\n \"unified\": \"1F235\",\n \"shortnames\": [\n \"u6e80\"\n ]\n },\n {\n \"unified\": \"1F534\",\n \"shortnames\": [\n \"red_circle\"\n ]\n },\n {\n \"unified\": \"1F7E0\",\n \"shortnames\": [\n \"large_orange_circle\"\n ]\n },\n {\n \"unified\": \"1F7E1\",\n \"shortnames\": [\n \"large_yellow_circle\"\n ]\n },\n {\n \"unified\": \"1F7E2\",\n \"shortnames\": [\n \"large_green_circle\"\n ]\n },\n {\n \"unified\": \"1F535\",\n \"shortnames\": [\n \"large_blue_circle\"\n ]\n },\n {\n \"unified\": \"1F7E3\",\n \"shortnames\": [\n \"large_purple_circle\"\n ]\n },\n {\n \"unified\": \"1F7E4\",\n \"shortnames\": [\n \"large_brown_circle\"\n ]\n },\n {\n \"unified\": \"26AB\",\n \"shortnames\": [\n \"black_circle\"\n ]\n },\n {\n \"unified\": \"26AA\",\n \"shortnames\": [\n \"white_circle\"\n ]\n },\n {\n \"unified\": \"1F7E5\",\n \"shortnames\": [\n \"large_red_square\"\n ]\n },\n {\n \"unified\": \"1F7E7\",\n \"shortnames\": [\n \"large_orange_square\"\n ]\n },\n {\n \"unified\": \"1F7E8\",\n \"shortnames\": [\n \"large_yellow_square\"\n ]\n },\n {\n \"unified\": \"1F7E9\",\n \"shortnames\": [\n \"large_green_square\"\n ]\n },\n {\n \"unified\": \"1F7E6\",\n \"shortnames\": [\n \"large_blue_square\"\n ]\n },\n {\n \"unified\": \"1F7EA\",\n \"shortnames\": [\n \"large_purple_square\"\n ]\n },\n {\n \"unified\": \"1F7EB\",\n \"shortnames\": [\n \"large_brown_square\"\n ]\n },\n {\n \"unified\": \"2B1B\",\n \"shortnames\": [\n \"black_large_square\"\n ]\n },\n {\n \"unified\": \"2B1C\",\n \"shortnames\": [\n \"white_large_square\"\n ]\n },\n {\n \"unified\": \"25FC-FE0F\",\n \"shortnames\": [\n \"black_medium_square\"\n ]\n },\n {\n \"unified\": \"25FB-FE0F\",\n \"shortnames\": [\n \"white_medium_square\"\n ]\n },\n {\n \"unified\": \"25FE\",\n \"shortnames\": [\n \"black_medium_small_square\"\n ]\n },\n {\n \"unified\": \"25FD\",\n \"shortnames\": [\n \"white_medium_small_square\"\n ]\n },\n {\n \"unified\": \"25AA-FE0F\",\n \"shortnames\": [\n \"black_small_square\"\n ]\n },\n {\n \"unified\": \"25AB-FE0F\",\n \"shortnames\": [\n \"white_small_square\"\n ]\n },\n {\n \"unified\": \"1F536\",\n \"shortnames\": [\n \"large_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F537\",\n \"shortnames\": [\n \"large_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F538\",\n \"shortnames\": [\n \"small_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F539\",\n \"shortnames\": [\n \"small_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F53A\",\n \"shortnames\": [\n \"small_red_triangle\"\n ]\n },\n {\n \"unified\": \"1F53B\",\n \"shortnames\": [\n \"small_red_triangle_down\"\n ]\n },\n {\n \"unified\": \"1F4A0\",\n \"shortnames\": [\n \"diamond_shape_with_a_dot_inside\"\n ]\n },\n {\n \"unified\": \"1F518\",\n \"shortnames\": [\n \"radio_button\"\n ]\n },\n {\n \"unified\": \"1F533\",\n \"shortnames\": [\n \"white_square_button\"\n ]\n },\n {\n \"unified\": \"1F532\",\n \"shortnames\": [\n \"black_square_button\"\n ]\n }\n ]\n },\n {\n \"name\": \"Flags\",\n \"emojis\": [\n {\n \"unified\": \"1F3C1\",\n \"shortnames\": [\n \"checkered_flag\"\n ]\n },\n {\n \"unified\": \"1F6A9\",\n \"shortnames\": [\n \"triangular_flag_on_post\"\n ]\n },\n {\n \"unified\": \"1F38C\",\n \"shortnames\": [\n \"crossed_flags\"\n ]\n },\n {\n \"unified\": \"1F3F4\",\n \"shortnames\": [\n \"waving_black_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F\",\n \"shortnames\": [\n \"waving_white_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F-200D-1F308\",\n \"shortnames\": [\n \"rainbow-flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F-200D-26A7-FE0F\",\n \"shortnames\": [\n \"transgender_flag\"\n ]\n },\n {\n \"unified\": \"1F3F4-200D-2620-FE0F\",\n \"shortnames\": [\n \"pirate_flag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E8\",\n \"shortnames\": [\n \"flag-ac\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E9\",\n \"shortnames\": [\n \"flag-ad\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EA\",\n \"shortnames\": [\n \"flag-ae\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EB\",\n \"shortnames\": [\n \"flag-af\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EC\",\n \"shortnames\": [\n \"flag-ag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EE\",\n \"shortnames\": [\n \"flag-ai\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F1\",\n \"shortnames\": [\n \"flag-al\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F2\",\n \"shortnames\": [\n \"flag-am\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F4\",\n \"shortnames\": [\n \"flag-ao\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F6\",\n \"shortnames\": [\n \"flag-aq\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F7\",\n \"shortnames\": [\n \"flag-ar\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F8\",\n \"shortnames\": [\n \"flag-as\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F9\",\n \"shortnames\": [\n \"flag-at\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FA\",\n \"shortnames\": [\n \"flag-au\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FC\",\n \"shortnames\": [\n \"flag-aw\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FD\",\n \"shortnames\": [\n \"flag-ax\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FF\",\n \"shortnames\": [\n \"flag-az\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E6\",\n \"shortnames\": [\n \"flag-ba\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E7\",\n \"shortnames\": [\n \"flag-bb\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E9\",\n \"shortnames\": [\n \"flag-bd\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EA\",\n \"shortnames\": [\n \"flag-be\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EB\",\n \"shortnames\": [\n \"flag-bf\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EC\",\n \"shortnames\": [\n \"flag-bg\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1ED\",\n \"shortnames\": [\n \"flag-bh\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EE\",\n \"shortnames\": [\n \"flag-bi\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EF\",\n \"shortnames\": [\n \"flag-bj\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F1\",\n \"shortnames\": [\n \"flag-bl\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F2\",\n \"shortnames\": [\n \"flag-bm\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F3\",\n \"shortnames\": [\n \"flag-bn\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F4\",\n \"shortnames\": [\n \"flag-bo\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F6\",\n \"shortnames\": [\n \"flag-bq\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F7\",\n \"shortnames\": [\n \"flag-br\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F8\",\n \"shortnames\": [\n \"flag-bs\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F9\",\n \"shortnames\": [\n \"flag-bt\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FB\",\n \"shortnames\": [\n \"flag-bv\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FC\",\n \"shortnames\": [\n \"flag-bw\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FE\",\n \"shortnames\": [\n \"flag-by\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FF\",\n \"shortnames\": [\n \"flag-bz\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E6\",\n \"shortnames\": [\n \"flag-ca\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E8\",\n \"shortnames\": [\n \"flag-cc\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E9\",\n \"shortnames\": [\n \"flag-cd\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EB\",\n \"shortnames\": [\n \"flag-cf\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EC\",\n \"shortnames\": [\n \"flag-cg\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1ED\",\n \"shortnames\": [\n \"flag-ch\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EE\",\n \"shortnames\": [\n \"flag-ci\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F0\",\n \"shortnames\": [\n \"flag-ck\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F1\",\n \"shortnames\": [\n \"flag-cl\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F2\",\n \"shortnames\": [\n \"flag-cm\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F3\",\n \"shortnames\": [\n \"cn\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F4\",\n \"shortnames\": [\n \"flag-co\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F5\",\n \"shortnames\": [\n \"flag-cp\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F7\",\n \"shortnames\": [\n \"flag-cr\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FA\",\n \"shortnames\": [\n \"flag-cu\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FB\",\n \"shortnames\": [\n \"flag-cv\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FC\",\n \"shortnames\": [\n \"flag-cw\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FD\",\n \"shortnames\": [\n \"flag-cx\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FE\",\n \"shortnames\": [\n \"flag-cy\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FF\",\n \"shortnames\": [\n \"flag-cz\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EA\",\n \"shortnames\": [\n \"de\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EC\",\n \"shortnames\": [\n \"flag-dg\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EF\",\n \"shortnames\": [\n \"flag-dj\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F0\",\n \"shortnames\": [\n \"flag-dk\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F2\",\n \"shortnames\": [\n \"flag-dm\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F4\",\n \"shortnames\": [\n \"flag-do\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1FF\",\n \"shortnames\": [\n \"flag-dz\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E6\",\n \"shortnames\": [\n \"flag-ea\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E8\",\n \"shortnames\": [\n \"flag-ec\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EA\",\n \"shortnames\": [\n \"flag-ee\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EC\",\n \"shortnames\": [\n \"flag-eg\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1ED\",\n \"shortnames\": [\n \"flag-eh\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F7\",\n \"shortnames\": [\n \"flag-er\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F8\",\n \"shortnames\": [\n \"es\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F9\",\n \"shortnames\": [\n \"flag-et\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1FA\",\n \"shortnames\": [\n \"flag-eu\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EE\",\n \"shortnames\": [\n \"flag-fi\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EF\",\n \"shortnames\": [\n \"flag-fj\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F0\",\n \"shortnames\": [\n \"flag-fk\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F2\",\n \"shortnames\": [\n \"flag-fm\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F4\",\n \"shortnames\": [\n \"flag-fo\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F7\",\n \"shortnames\": [\n \"fr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E6\",\n \"shortnames\": [\n \"flag-ga\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E7\",\n \"shortnames\": [\n \"gb\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E9\",\n \"shortnames\": [\n \"flag-gd\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EA\",\n \"shortnames\": [\n \"flag-ge\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EB\",\n \"shortnames\": [\n \"flag-gf\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EC\",\n \"shortnames\": [\n \"flag-gg\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1ED\",\n \"shortnames\": [\n \"flag-gh\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EE\",\n \"shortnames\": [\n \"flag-gi\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F1\",\n \"shortnames\": [\n \"flag-gl\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F2\",\n \"shortnames\": [\n \"flag-gm\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F3\",\n \"shortnames\": [\n \"flag-gn\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F5\",\n \"shortnames\": [\n \"flag-gp\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F6\",\n \"shortnames\": [\n \"flag-gq\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F7\",\n \"shortnames\": [\n \"flag-gr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F8\",\n \"shortnames\": [\n \"flag-gs\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F9\",\n \"shortnames\": [\n \"flag-gt\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FA\",\n \"shortnames\": [\n \"flag-gu\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FC\",\n \"shortnames\": [\n \"flag-gw\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FE\",\n \"shortnames\": [\n \"flag-gy\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F0\",\n \"shortnames\": [\n \"flag-hk\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F2\",\n \"shortnames\": [\n \"flag-hm\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F3\",\n \"shortnames\": [\n \"flag-hn\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F7\",\n \"shortnames\": [\n \"flag-hr\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F9\",\n \"shortnames\": [\n \"flag-ht\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1FA\",\n \"shortnames\": [\n \"flag-hu\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E8\",\n \"shortnames\": [\n \"flag-ic\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E9\",\n \"shortnames\": [\n \"flag-id\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1EA\",\n \"shortnames\": [\n \"flag-ie\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F1\",\n \"shortnames\": [\n \"flag-il\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F2\",\n \"shortnames\": [\n \"flag-im\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F3\",\n \"shortnames\": [\n \"flag-in\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F4\",\n \"shortnames\": [\n \"flag-io\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F6\",\n \"shortnames\": [\n \"flag-iq\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F7\",\n \"shortnames\": [\n \"flag-ir\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F8\",\n \"shortnames\": [\n \"flag-is\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F9\",\n \"shortnames\": [\n \"it\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1EA\",\n \"shortnames\": [\n \"flag-je\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F2\",\n \"shortnames\": [\n \"flag-jm\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F4\",\n \"shortnames\": [\n \"flag-jo\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F5\",\n \"shortnames\": [\n \"jp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EA\",\n \"shortnames\": [\n \"flag-ke\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EC\",\n \"shortnames\": [\n \"flag-kg\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1ED\",\n \"shortnames\": [\n \"flag-kh\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EE\",\n \"shortnames\": [\n \"flag-ki\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F2\",\n \"shortnames\": [\n \"flag-km\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F3\",\n \"shortnames\": [\n \"flag-kn\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F5\",\n \"shortnames\": [\n \"flag-kp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F7\",\n \"shortnames\": [\n \"kr\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FC\",\n \"shortnames\": [\n \"flag-kw\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FE\",\n \"shortnames\": [\n \"flag-ky\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FF\",\n \"shortnames\": [\n \"flag-kz\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E6\",\n \"shortnames\": [\n \"flag-la\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E7\",\n \"shortnames\": [\n \"flag-lb\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E8\",\n \"shortnames\": [\n \"flag-lc\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1EE\",\n \"shortnames\": [\n \"flag-li\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F0\",\n \"shortnames\": [\n \"flag-lk\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F7\",\n \"shortnames\": [\n \"flag-lr\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F8\",\n \"shortnames\": [\n \"flag-ls\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F9\",\n \"shortnames\": [\n \"flag-lt\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FA\",\n \"shortnames\": [\n \"flag-lu\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FB\",\n \"shortnames\": [\n \"flag-lv\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FE\",\n \"shortnames\": [\n \"flag-ly\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E6\",\n \"shortnames\": [\n \"flag-ma\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E8\",\n \"shortnames\": [\n \"flag-mc\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E9\",\n \"shortnames\": [\n \"flag-md\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EA\",\n \"shortnames\": [\n \"flag-me\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EB\",\n \"shortnames\": [\n \"flag-mf\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EC\",\n \"shortnames\": [\n \"flag-mg\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1ED\",\n \"shortnames\": [\n \"flag-mh\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F0\",\n \"shortnames\": [\n \"flag-mk\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F1\",\n \"shortnames\": [\n \"flag-ml\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F2\",\n \"shortnames\": [\n \"flag-mm\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F3\",\n \"shortnames\": [\n \"flag-mn\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F4\",\n \"shortnames\": [\n \"flag-mo\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F5\",\n \"shortnames\": [\n \"flag-mp\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F6\",\n \"shortnames\": [\n \"flag-mq\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F7\",\n \"shortnames\": [\n \"flag-mr\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F8\",\n \"shortnames\": [\n \"flag-ms\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F9\",\n \"shortnames\": [\n \"flag-mt\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FA\",\n \"shortnames\": [\n \"flag-mu\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FB\",\n \"shortnames\": [\n \"flag-mv\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FC\",\n \"shortnames\": [\n \"flag-mw\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FD\",\n \"shortnames\": [\n \"flag-mx\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FE\",\n \"shortnames\": [\n \"flag-my\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FF\",\n \"shortnames\": [\n \"flag-mz\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E6\",\n \"shortnames\": [\n \"flag-na\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E8\",\n \"shortnames\": [\n \"flag-nc\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EA\",\n \"shortnames\": [\n \"flag-ne\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EB\",\n \"shortnames\": [\n \"flag-nf\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EC\",\n \"shortnames\": [\n \"flag-ng\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EE\",\n \"shortnames\": [\n \"flag-ni\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F1\",\n \"shortnames\": [\n \"flag-nl\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F4\",\n \"shortnames\": [\n \"flag-no\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F5\",\n \"shortnames\": [\n \"flag-np\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F7\",\n \"shortnames\": [\n \"flag-nr\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FA\",\n \"shortnames\": [\n \"flag-nu\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FF\",\n \"shortnames\": [\n \"flag-nz\"\n ]\n },\n {\n \"unified\": \"1F1F4-1F1F2\",\n \"shortnames\": [\n \"flag-om\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1E6\",\n \"shortnames\": [\n \"flag-pa\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EA\",\n \"shortnames\": [\n \"flag-pe\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EB\",\n \"shortnames\": [\n \"flag-pf\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EC\",\n \"shortnames\": [\n \"flag-pg\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1ED\",\n \"shortnames\": [\n \"flag-ph\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F0\",\n \"shortnames\": [\n \"flag-pk\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F1\",\n \"shortnames\": [\n \"flag-pl\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F2\",\n \"shortnames\": [\n \"flag-pm\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F3\",\n \"shortnames\": [\n \"flag-pn\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F7\",\n \"shortnames\": [\n \"flag-pr\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F8\",\n \"shortnames\": [\n \"flag-ps\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F9\",\n \"shortnames\": [\n \"flag-pt\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FC\",\n \"shortnames\": [\n \"flag-pw\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FE\",\n \"shortnames\": [\n \"flag-py\"\n ]\n },\n {\n \"unified\": \"1F1F6-1F1E6\",\n \"shortnames\": [\n \"flag-qa\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1EA\",\n \"shortnames\": [\n \"flag-re\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F4\",\n \"shortnames\": [\n \"flag-ro\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F8\",\n \"shortnames\": [\n \"flag-rs\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FA\",\n \"shortnames\": [\n \"ru\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FC\",\n \"shortnames\": [\n \"flag-rw\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E6\",\n \"shortnames\": [\n \"flag-sa\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E7\",\n \"shortnames\": [\n \"flag-sb\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E8\",\n \"shortnames\": [\n \"flag-sc\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E9\",\n \"shortnames\": [\n \"flag-sd\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EA\",\n \"shortnames\": [\n \"flag-se\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EC\",\n \"shortnames\": [\n \"flag-sg\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1ED\",\n \"shortnames\": [\n \"flag-sh\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EE\",\n \"shortnames\": [\n \"flag-si\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EF\",\n \"shortnames\": [\n \"flag-sj\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F0\",\n \"shortnames\": [\n \"flag-sk\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F1\",\n \"shortnames\": [\n \"flag-sl\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F2\",\n \"shortnames\": [\n \"flag-sm\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F3\",\n \"shortnames\": [\n \"flag-sn\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F4\",\n \"shortnames\": [\n \"flag-so\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F7\",\n \"shortnames\": [\n \"flag-sr\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F8\",\n \"shortnames\": [\n \"flag-ss\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F9\",\n \"shortnames\": [\n \"flag-st\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FB\",\n \"shortnames\": [\n \"flag-sv\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FD\",\n \"shortnames\": [\n \"flag-sx\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FE\",\n \"shortnames\": [\n \"flag-sy\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FF\",\n \"shortnames\": [\n \"flag-sz\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E6\",\n \"shortnames\": [\n \"flag-ta\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E8\",\n \"shortnames\": [\n \"flag-tc\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E9\",\n \"shortnames\": [\n \"flag-td\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EB\",\n \"shortnames\": [\n \"flag-tf\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EC\",\n \"shortnames\": [\n \"flag-tg\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1ED\",\n \"shortnames\": [\n \"flag-th\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EF\",\n \"shortnames\": [\n \"flag-tj\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F0\",\n \"shortnames\": [\n \"flag-tk\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F1\",\n \"shortnames\": [\n \"flag-tl\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F2\",\n \"shortnames\": [\n \"flag-tm\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F3\",\n \"shortnames\": [\n \"flag-tn\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F4\",\n \"shortnames\": [\n \"flag-to\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F7\",\n \"shortnames\": [\n \"flag-tr\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F9\",\n \"shortnames\": [\n \"flag-tt\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FB\",\n \"shortnames\": [\n \"flag-tv\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FC\",\n \"shortnames\": [\n \"flag-tw\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FF\",\n \"shortnames\": [\n \"flag-tz\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1E6\",\n \"shortnames\": [\n \"flag-ua\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1EC\",\n \"shortnames\": [\n \"flag-ug\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F2\",\n \"shortnames\": [\n \"flag-um\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F3\",\n \"shortnames\": [\n \"flag-un\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F8\",\n \"shortnames\": [\n \"us\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FE\",\n \"shortnames\": [\n \"flag-uy\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FF\",\n \"shortnames\": [\n \"flag-uz\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E6\",\n \"shortnames\": [\n \"flag-va\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E8\",\n \"shortnames\": [\n \"flag-vc\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EA\",\n \"shortnames\": [\n \"flag-ve\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EC\",\n \"shortnames\": [\n \"flag-vg\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EE\",\n \"shortnames\": [\n \"flag-vi\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1F3\",\n \"shortnames\": [\n \"flag-vn\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1FA\",\n \"shortnames\": [\n \"flag-vu\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1EB\",\n \"shortnames\": [\n \"flag-wf\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1F8\",\n \"shortnames\": [\n \"flag-ws\"\n ]\n },\n {\n \"unified\": \"1F1FD-1F1F0\",\n \"shortnames\": [\n \"flag-xk\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1EA\",\n \"shortnames\": [\n \"flag-ye\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1F9\",\n \"shortnames\": [\n \"flag-yt\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1E6\",\n \"shortnames\": [\n \"flag-za\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1F2\",\n \"shortnames\": [\n \"flag-zm\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1FC\",\n \"shortnames\": [\n \"flag-zw\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"shortnames\": [\n \"flag-england\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"shortnames\": [\n \"flag-scotland\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"shortnames\": [\n \"flag-wales\"\n ]\n }\n ]\n }\n];\n\nexport const byShortName = {\n \"hash\": \"0023-FE0F-20E3\",\n \"keycap_star\": \"002A-FE0F-20E3\",\n \"zero\": \"0030-FE0F-20E3\",\n \"one\": \"0031-FE0F-20E3\",\n \"two\": \"0032-FE0F-20E3\",\n \"three\": \"0033-FE0F-20E3\",\n \"four\": \"0034-FE0F-20E3\",\n \"five\": \"0035-FE0F-20E3\",\n \"six\": \"0036-FE0F-20E3\",\n \"seven\": \"0037-FE0F-20E3\",\n \"eight\": \"0038-FE0F-20E3\",\n \"nine\": \"0039-FE0F-20E3\",\n \"copyright\": \"00A9-FE0F\",\n \"registered\": \"00AE-FE0F\",\n \"mahjong\": \"1F004\",\n \"black_joker\": \"1F0CF\",\n \"a\": \"1F170-FE0F\",\n \"b\": \"1F171-FE0F\",\n \"o2\": \"1F17E-FE0F\",\n \"parking\": \"1F17F-FE0F\",\n \"ab\": \"1F18E\",\n \"cl\": \"1F191\",\n \"cool\": \"1F192\",\n \"free\": \"1F193\",\n \"id\": \"1F194\",\n \"new\": \"1F195\",\n \"ng\": \"1F196\",\n \"ok\": \"1F197\",\n \"sos\": \"1F198\",\n \"up\": \"1F199\",\n \"vs\": \"1F19A\",\n \"flag-ac\": \"1F1E6-1F1E8\",\n \"flag-ad\": \"1F1E6-1F1E9\",\n \"flag-ae\": \"1F1E6-1F1EA\",\n \"flag-af\": \"1F1E6-1F1EB\",\n \"flag-ag\": \"1F1E6-1F1EC\",\n \"flag-ai\": \"1F1E6-1F1EE\",\n \"flag-al\": \"1F1E6-1F1F1\",\n \"flag-am\": \"1F1E6-1F1F2\",\n \"flag-ao\": \"1F1E6-1F1F4\",\n \"flag-aq\": \"1F1E6-1F1F6\",\n \"flag-ar\": \"1F1E6-1F1F7\",\n \"flag-as\": \"1F1E6-1F1F8\",\n \"flag-at\": \"1F1E6-1F1F9\",\n \"flag-au\": \"1F1E6-1F1FA\",\n \"flag-aw\": \"1F1E6-1F1FC\",\n \"flag-ax\": \"1F1E6-1F1FD\",\n \"flag-az\": \"1F1E6-1F1FF\",\n \"flag-ba\": \"1F1E7-1F1E6\",\n \"flag-bb\": \"1F1E7-1F1E7\",\n \"flag-bd\": \"1F1E7-1F1E9\",\n \"flag-be\": \"1F1E7-1F1EA\",\n \"flag-bf\": \"1F1E7-1F1EB\",\n \"flag-bg\": \"1F1E7-1F1EC\",\n \"flag-bh\": \"1F1E7-1F1ED\",\n \"flag-bi\": \"1F1E7-1F1EE\",\n \"flag-bj\": \"1F1E7-1F1EF\",\n \"flag-bl\": \"1F1E7-1F1F1\",\n \"flag-bm\": \"1F1E7-1F1F2\",\n \"flag-bn\": \"1F1E7-1F1F3\",\n \"flag-bo\": \"1F1E7-1F1F4\",\n \"flag-bq\": \"1F1E7-1F1F6\",\n \"flag-br\": \"1F1E7-1F1F7\",\n \"flag-bs\": \"1F1E7-1F1F8\",\n \"flag-bt\": \"1F1E7-1F1F9\",\n \"flag-bv\": \"1F1E7-1F1FB\",\n \"flag-bw\": \"1F1E7-1F1FC\",\n \"flag-by\": \"1F1E7-1F1FE\",\n \"flag-bz\": \"1F1E7-1F1FF\",\n \"flag-ca\": \"1F1E8-1F1E6\",\n \"flag-cc\": \"1F1E8-1F1E8\",\n \"flag-cd\": \"1F1E8-1F1E9\",\n \"flag-cf\": \"1F1E8-1F1EB\",\n \"flag-cg\": \"1F1E8-1F1EC\",\n \"flag-ch\": \"1F1E8-1F1ED\",\n \"flag-ci\": \"1F1E8-1F1EE\",\n \"flag-ck\": \"1F1E8-1F1F0\",\n \"flag-cl\": \"1F1E8-1F1F1\",\n \"flag-cm\": \"1F1E8-1F1F2\",\n \"cn\": \"1F1E8-1F1F3\",\n \"flag-co\": \"1F1E8-1F1F4\",\n \"flag-cp\": \"1F1E8-1F1F5\",\n \"flag-cr\": \"1F1E8-1F1F7\",\n \"flag-cu\": \"1F1E8-1F1FA\",\n \"flag-cv\": \"1F1E8-1F1FB\",\n \"flag-cw\": \"1F1E8-1F1FC\",\n \"flag-cx\": \"1F1E8-1F1FD\",\n \"flag-cy\": \"1F1E8-1F1FE\",\n \"flag-cz\": \"1F1E8-1F1FF\",\n \"de\": \"1F1E9-1F1EA\",\n \"flag-dg\": \"1F1E9-1F1EC\",\n \"flag-dj\": \"1F1E9-1F1EF\",\n \"flag-dk\": \"1F1E9-1F1F0\",\n \"flag-dm\": \"1F1E9-1F1F2\",\n \"flag-do\": \"1F1E9-1F1F4\",\n \"flag-dz\": \"1F1E9-1F1FF\",\n \"flag-ea\": \"1F1EA-1F1E6\",\n \"flag-ec\": \"1F1EA-1F1E8\",\n \"flag-ee\": \"1F1EA-1F1EA\",\n \"flag-eg\": \"1F1EA-1F1EC\",\n \"flag-eh\": \"1F1EA-1F1ED\",\n \"flag-er\": \"1F1EA-1F1F7\",\n \"es\": \"1F1EA-1F1F8\",\n \"flag-et\": \"1F1EA-1F1F9\",\n \"flag-eu\": \"1F1EA-1F1FA\",\n \"flag-fi\": \"1F1EB-1F1EE\",\n \"flag-fj\": \"1F1EB-1F1EF\",\n \"flag-fk\": \"1F1EB-1F1F0\",\n \"flag-fm\": \"1F1EB-1F1F2\",\n \"flag-fo\": \"1F1EB-1F1F4\",\n \"fr\": \"1F1EB-1F1F7\",\n \"flag-ga\": \"1F1EC-1F1E6\",\n \"gb\": \"1F1EC-1F1E7\",\n \"flag-gd\": \"1F1EC-1F1E9\",\n \"flag-ge\": \"1F1EC-1F1EA\",\n \"flag-gf\": \"1F1EC-1F1EB\",\n \"flag-gg\": \"1F1EC-1F1EC\",\n \"flag-gh\": \"1F1EC-1F1ED\",\n \"flag-gi\": \"1F1EC-1F1EE\",\n \"flag-gl\": \"1F1EC-1F1F1\",\n \"flag-gm\": \"1F1EC-1F1F2\",\n \"flag-gn\": \"1F1EC-1F1F3\",\n \"flag-gp\": \"1F1EC-1F1F5\",\n \"flag-gq\": \"1F1EC-1F1F6\",\n \"flag-gr\": \"1F1EC-1F1F7\",\n \"flag-gs\": \"1F1EC-1F1F8\",\n \"flag-gt\": \"1F1EC-1F1F9\",\n \"flag-gu\": \"1F1EC-1F1FA\",\n \"flag-gw\": \"1F1EC-1F1FC\",\n \"flag-gy\": \"1F1EC-1F1FE\",\n \"flag-hk\": \"1F1ED-1F1F0\",\n \"flag-hm\": \"1F1ED-1F1F2\",\n \"flag-hn\": \"1F1ED-1F1F3\",\n \"flag-hr\": \"1F1ED-1F1F7\",\n \"flag-ht\": \"1F1ED-1F1F9\",\n \"flag-hu\": \"1F1ED-1F1FA\",\n \"flag-ic\": \"1F1EE-1F1E8\",\n \"flag-id\": \"1F1EE-1F1E9\",\n \"flag-ie\": \"1F1EE-1F1EA\",\n \"flag-il\": \"1F1EE-1F1F1\",\n \"flag-im\": \"1F1EE-1F1F2\",\n \"flag-in\": \"1F1EE-1F1F3\",\n \"flag-io\": \"1F1EE-1F1F4\",\n \"flag-iq\": \"1F1EE-1F1F6\",\n \"flag-ir\": \"1F1EE-1F1F7\",\n \"flag-is\": \"1F1EE-1F1F8\",\n \"it\": \"1F1EE-1F1F9\",\n \"flag-je\": \"1F1EF-1F1EA\",\n \"flag-jm\": \"1F1EF-1F1F2\",\n \"flag-jo\": \"1F1EF-1F1F4\",\n \"jp\": \"1F1EF-1F1F5\",\n \"flag-ke\": \"1F1F0-1F1EA\",\n \"flag-kg\": \"1F1F0-1F1EC\",\n \"flag-kh\": \"1F1F0-1F1ED\",\n \"flag-ki\": \"1F1F0-1F1EE\",\n \"flag-km\": \"1F1F0-1F1F2\",\n \"flag-kn\": \"1F1F0-1F1F3\",\n \"flag-kp\": \"1F1F0-1F1F5\",\n \"kr\": \"1F1F0-1F1F7\",\n \"flag-kw\": \"1F1F0-1F1FC\",\n \"flag-ky\": \"1F1F0-1F1FE\",\n \"flag-kz\": \"1F1F0-1F1FF\",\n \"flag-la\": \"1F1F1-1F1E6\",\n \"flag-lb\": \"1F1F1-1F1E7\",\n \"flag-lc\": \"1F1F1-1F1E8\",\n \"flag-li\": \"1F1F1-1F1EE\",\n \"flag-lk\": \"1F1F1-1F1F0\",\n \"flag-lr\": \"1F1F1-1F1F7\",\n \"flag-ls\": \"1F1F1-1F1F8\",\n \"flag-lt\": \"1F1F1-1F1F9\",\n \"flag-lu\": \"1F1F1-1F1FA\",\n \"flag-lv\": \"1F1F1-1F1FB\",\n \"flag-ly\": \"1F1F1-1F1FE\",\n \"flag-ma\": \"1F1F2-1F1E6\",\n \"flag-mc\": \"1F1F2-1F1E8\",\n \"flag-md\": \"1F1F2-1F1E9\",\n \"flag-me\": \"1F1F2-1F1EA\",\n \"flag-mf\": \"1F1F2-1F1EB\",\n \"flag-mg\": \"1F1F2-1F1EC\",\n \"flag-mh\": \"1F1F2-1F1ED\",\n \"flag-mk\": \"1F1F2-1F1F0\",\n \"flag-ml\": \"1F1F2-1F1F1\",\n \"flag-mm\": \"1F1F2-1F1F2\",\n \"flag-mn\": \"1F1F2-1F1F3\",\n \"flag-mo\": \"1F1F2-1F1F4\",\n \"flag-mp\": \"1F1F2-1F1F5\",\n \"flag-mq\": \"1F1F2-1F1F6\",\n \"flag-mr\": \"1F1F2-1F1F7\",\n \"flag-ms\": \"1F1F2-1F1F8\",\n \"flag-mt\": \"1F1F2-1F1F9\",\n \"flag-mu\": \"1F1F2-1F1FA\",\n \"flag-mv\": \"1F1F2-1F1FB\",\n \"flag-mw\": \"1F1F2-1F1FC\",\n \"flag-mx\": \"1F1F2-1F1FD\",\n \"flag-my\": \"1F1F2-1F1FE\",\n \"flag-mz\": \"1F1F2-1F1FF\",\n \"flag-na\": \"1F1F3-1F1E6\",\n \"flag-nc\": \"1F1F3-1F1E8\",\n \"flag-ne\": \"1F1F3-1F1EA\",\n \"flag-nf\": \"1F1F3-1F1EB\",\n \"flag-ng\": \"1F1F3-1F1EC\",\n \"flag-ni\": \"1F1F3-1F1EE\",\n \"flag-nl\": \"1F1F3-1F1F1\",\n \"flag-no\": \"1F1F3-1F1F4\",\n \"flag-np\": \"1F1F3-1F1F5\",\n \"flag-nr\": \"1F1F3-1F1F7\",\n \"flag-nu\": \"1F1F3-1F1FA\",\n \"flag-nz\": \"1F1F3-1F1FF\",\n \"flag-om\": \"1F1F4-1F1F2\",\n \"flag-pa\": \"1F1F5-1F1E6\",\n \"flag-pe\": \"1F1F5-1F1EA\",\n \"flag-pf\": \"1F1F5-1F1EB\",\n \"flag-pg\": \"1F1F5-1F1EC\",\n \"flag-ph\": \"1F1F5-1F1ED\",\n \"flag-pk\": \"1F1F5-1F1F0\",\n \"flag-pl\": \"1F1F5-1F1F1\",\n \"flag-pm\": \"1F1F5-1F1F2\",\n \"flag-pn\": \"1F1F5-1F1F3\",\n \"flag-pr\": \"1F1F5-1F1F7\",\n \"flag-ps\": \"1F1F5-1F1F8\",\n \"flag-pt\": \"1F1F5-1F1F9\",\n \"flag-pw\": \"1F1F5-1F1FC\",\n \"flag-py\": \"1F1F5-1F1FE\",\n \"flag-qa\": \"1F1F6-1F1E6\",\n \"flag-re\": \"1F1F7-1F1EA\",\n \"flag-ro\": \"1F1F7-1F1F4\",\n \"flag-rs\": \"1F1F7-1F1F8\",\n \"ru\": \"1F1F7-1F1FA\",\n \"flag-rw\": \"1F1F7-1F1FC\",\n \"flag-sa\": \"1F1F8-1F1E6\",\n \"flag-sb\": \"1F1F8-1F1E7\",\n \"flag-sc\": \"1F1F8-1F1E8\",\n \"flag-sd\": \"1F1F8-1F1E9\",\n \"flag-se\": \"1F1F8-1F1EA\",\n \"flag-sg\": \"1F1F8-1F1EC\",\n \"flag-sh\": \"1F1F8-1F1ED\",\n \"flag-si\": \"1F1F8-1F1EE\",\n \"flag-sj\": \"1F1F8-1F1EF\",\n \"flag-sk\": \"1F1F8-1F1F0\",\n \"flag-sl\": \"1F1F8-1F1F1\",\n \"flag-sm\": \"1F1F8-1F1F2\",\n \"flag-sn\": \"1F1F8-1F1F3\",\n \"flag-so\": \"1F1F8-1F1F4\",\n \"flag-sr\": \"1F1F8-1F1F7\",\n \"flag-ss\": \"1F1F8-1F1F8\",\n \"flag-st\": \"1F1F8-1F1F9\",\n \"flag-sv\": \"1F1F8-1F1FB\",\n \"flag-sx\": \"1F1F8-1F1FD\",\n \"flag-sy\": \"1F1F8-1F1FE\",\n \"flag-sz\": \"1F1F8-1F1FF\",\n \"flag-ta\": \"1F1F9-1F1E6\",\n \"flag-tc\": \"1F1F9-1F1E8\",\n \"flag-td\": \"1F1F9-1F1E9\",\n \"flag-tf\": \"1F1F9-1F1EB\",\n \"flag-tg\": \"1F1F9-1F1EC\",\n \"flag-th\": \"1F1F9-1F1ED\",\n \"flag-tj\": \"1F1F9-1F1EF\",\n \"flag-tk\": \"1F1F9-1F1F0\",\n \"flag-tl\": \"1F1F9-1F1F1\",\n \"flag-tm\": \"1F1F9-1F1F2\",\n \"flag-tn\": \"1F1F9-1F1F3\",\n \"flag-to\": \"1F1F9-1F1F4\",\n \"flag-tr\": \"1F1F9-1F1F7\",\n \"flag-tt\": \"1F1F9-1F1F9\",\n \"flag-tv\": \"1F1F9-1F1FB\",\n \"flag-tw\": \"1F1F9-1F1FC\",\n \"flag-tz\": \"1F1F9-1F1FF\",\n \"flag-ua\": \"1F1FA-1F1E6\",\n \"flag-ug\": \"1F1FA-1F1EC\",\n \"flag-um\": \"1F1FA-1F1F2\",\n \"flag-un\": \"1F1FA-1F1F3\",\n \"us\": \"1F1FA-1F1F8\",\n \"flag-uy\": \"1F1FA-1F1FE\",\n \"flag-uz\": \"1F1FA-1F1FF\",\n \"flag-va\": \"1F1FB-1F1E6\",\n \"flag-vc\": \"1F1FB-1F1E8\",\n \"flag-ve\": \"1F1FB-1F1EA\",\n \"flag-vg\": \"1F1FB-1F1EC\",\n \"flag-vi\": \"1F1FB-1F1EE\",\n \"flag-vn\": \"1F1FB-1F1F3\",\n \"flag-vu\": \"1F1FB-1F1FA\",\n \"flag-wf\": \"1F1FC-1F1EB\",\n \"flag-ws\": \"1F1FC-1F1F8\",\n \"flag-xk\": \"1F1FD-1F1F0\",\n \"flag-ye\": \"1F1FE-1F1EA\",\n \"flag-yt\": \"1F1FE-1F1F9\",\n \"flag-za\": \"1F1FF-1F1E6\",\n \"flag-zm\": \"1F1FF-1F1F2\",\n \"flag-zw\": \"1F1FF-1F1FC\",\n \"koko\": \"1F201\",\n \"sa\": \"1F202-FE0F\",\n \"u7121\": \"1F21A\",\n \"u6307\": \"1F22F\",\n \"u7981\": \"1F232\",\n \"u7a7a\": \"1F233\",\n \"u5408\": \"1F234\",\n \"u6e80\": \"1F235\",\n \"u6709\": \"1F236\",\n \"u6708\": \"1F237-FE0F\",\n \"u7533\": \"1F238\",\n \"u5272\": \"1F239\",\n \"u55b6\": \"1F23A\",\n \"ideograph_advantage\": \"1F250\",\n \"accept\": \"1F251\",\n \"cyclone\": \"1F300\",\n \"foggy\": \"1F301\",\n \"closed_umbrella\": \"1F302\",\n \"night_with_stars\": \"1F303\",\n \"sunrise_over_mountains\": \"1F304\",\n \"sunrise\": \"1F305\",\n \"city_sunset\": \"1F306\",\n \"city_sunrise\": \"1F307\",\n \"rainbow\": \"1F308\",\n \"bridge_at_night\": \"1F309\",\n \"ocean\": \"1F30A\",\n \"volcano\": \"1F30B\",\n \"milky_way\": \"1F30C\",\n \"earth_africa\": \"1F30D\",\n \"earth_americas\": \"1F30E\",\n \"earth_asia\": \"1F30F\",\n \"globe_with_meridians\": \"1F310\",\n \"new_moon\": \"1F311\",\n \"waxing_crescent_moon\": \"1F312\",\n \"first_quarter_moon\": \"1F313\",\n \"moon\": \"1F314\",\n \"full_moon\": \"1F315\",\n \"waning_gibbous_moon\": \"1F316\",\n \"last_quarter_moon\": \"1F317\",\n \"waning_crescent_moon\": \"1F318\",\n \"crescent_moon\": \"1F319\",\n \"new_moon_with_face\": \"1F31A\",\n \"first_quarter_moon_with_face\": \"1F31B\",\n \"last_quarter_moon_with_face\": \"1F31C\",\n \"full_moon_with_face\": \"1F31D\",\n \"sun_with_face\": \"1F31E\",\n \"star2\": \"1F31F\",\n \"stars\": \"1F320\",\n \"thermometer\": \"1F321-FE0F\",\n \"mostly_sunny\": \"1F324-FE0F\",\n \"barely_sunny\": \"1F325-FE0F\",\n \"partly_sunny_rain\": \"1F326-FE0F\",\n \"rain_cloud\": \"1F327-FE0F\",\n \"snow_cloud\": \"1F328-FE0F\",\n \"lightning\": \"1F329-FE0F\",\n \"tornado\": \"1F32A-FE0F\",\n \"fog\": \"1F32B-FE0F\",\n \"wind_blowing_face\": \"1F32C-FE0F\",\n \"hotdog\": \"1F32D\",\n \"taco\": \"1F32E\",\n \"burrito\": \"1F32F\",\n \"chestnut\": \"1F330\",\n \"seedling\": \"1F331\",\n \"evergreen_tree\": \"1F332\",\n \"deciduous_tree\": \"1F333\",\n \"palm_tree\": \"1F334\",\n \"cactus\": \"1F335\",\n \"hot_pepper\": \"1F336-FE0F\",\n \"tulip\": \"1F337\",\n \"cherry_blossom\": \"1F338\",\n \"rose\": \"1F339\",\n \"hibiscus\": \"1F33A\",\n \"sunflower\": \"1F33B\",\n \"blossom\": \"1F33C\",\n \"corn\": \"1F33D\",\n \"ear_of_rice\": \"1F33E\",\n \"herb\": \"1F33F\",\n \"four_leaf_clover\": \"1F340\",\n \"maple_leaf\": \"1F341\",\n \"fallen_leaf\": \"1F342\",\n \"leaves\": \"1F343\",\n \"mushroom\": \"1F344\",\n \"tomato\": \"1F345\",\n \"eggplant\": \"1F346\",\n \"grapes\": \"1F347\",\n \"melon\": \"1F348\",\n \"watermelon\": \"1F349\",\n \"tangerine\": \"1F34A\",\n \"lemon\": \"1F34B\",\n \"banana\": \"1F34C\",\n \"pineapple\": \"1F34D\",\n \"apple\": \"1F34E\",\n \"green_apple\": \"1F34F\",\n \"pear\": \"1F350\",\n \"peach\": \"1F351\",\n \"cherries\": \"1F352\",\n \"strawberry\": \"1F353\",\n \"hamburger\": \"1F354\",\n \"pizza\": \"1F355\",\n \"meat_on_bone\": \"1F356\",\n \"poultry_leg\": \"1F357\",\n \"rice_cracker\": \"1F358\",\n \"rice_ball\": \"1F359\",\n \"rice\": \"1F35A\",\n \"curry\": \"1F35B\",\n \"ramen\": \"1F35C\",\n \"spaghetti\": \"1F35D\",\n \"bread\": \"1F35E\",\n \"fries\": \"1F35F\",\n \"sweet_potato\": \"1F360\",\n \"dango\": \"1F361\",\n \"oden\": \"1F362\",\n \"sushi\": \"1F363\",\n \"fried_shrimp\": \"1F364\",\n \"fish_cake\": \"1F365\",\n \"icecream\": \"1F366\",\n \"shaved_ice\": \"1F367\",\n \"ice_cream\": \"1F368\",\n \"doughnut\": \"1F369\",\n \"cookie\": \"1F36A\",\n \"chocolate_bar\": \"1F36B\",\n \"candy\": \"1F36C\",\n \"lollipop\": \"1F36D\",\n \"custard\": \"1F36E\",\n \"honey_pot\": \"1F36F\",\n \"cake\": \"1F370\",\n \"bento\": \"1F371\",\n \"stew\": \"1F372\",\n \"fried_egg\": \"1F373\",\n \"fork_and_knife\": \"1F374\",\n \"tea\": \"1F375\",\n \"sake\": \"1F376\",\n \"wine_glass\": \"1F377\",\n \"cocktail\": \"1F378\",\n \"tropical_drink\": \"1F379\",\n \"beer\": \"1F37A\",\n \"beers\": \"1F37B\",\n \"baby_bottle\": \"1F37C\",\n \"knife_fork_plate\": \"1F37D-FE0F\",\n \"champagne\": \"1F37E\",\n \"popcorn\": \"1F37F\",\n \"ribbon\": \"1F380\",\n \"gift\": \"1F381\",\n \"birthday\": \"1F382\",\n \"jack_o_lantern\": \"1F383\",\n \"christmas_tree\": \"1F384\",\n \"santa\": \"1F385\",\n \"fireworks\": \"1F386\",\n \"sparkler\": \"1F387\",\n \"balloon\": \"1F388\",\n \"tada\": \"1F389\",\n \"confetti_ball\": \"1F38A\",\n \"tanabata_tree\": \"1F38B\",\n \"crossed_flags\": \"1F38C\",\n \"bamboo\": \"1F38D\",\n \"dolls\": \"1F38E\",\n \"flags\": \"1F38F\",\n \"wind_chime\": \"1F390\",\n \"rice_scene\": \"1F391\",\n \"school_satchel\": \"1F392\",\n \"mortar_board\": \"1F393\",\n \"medal\": \"1F396-FE0F\",\n \"reminder_ribbon\": \"1F397-FE0F\",\n \"studio_microphone\": \"1F399-FE0F\",\n \"level_slider\": \"1F39A-FE0F\",\n \"control_knobs\": \"1F39B-FE0F\",\n \"film_frames\": \"1F39E-FE0F\",\n \"admission_tickets\": \"1F39F-FE0F\",\n \"carousel_horse\": \"1F3A0\",\n \"ferris_wheel\": \"1F3A1\",\n \"roller_coaster\": \"1F3A2\",\n \"fishing_pole_and_fish\": \"1F3A3\",\n \"microphone\": \"1F3A4\",\n \"movie_camera\": \"1F3A5\",\n \"cinema\": \"1F3A6\",\n \"headphones\": \"1F3A7\",\n \"art\": \"1F3A8\",\n \"tophat\": \"1F3A9\",\n \"circus_tent\": \"1F3AA\",\n \"ticket\": \"1F3AB\",\n \"clapper\": \"1F3AC\",\n \"performing_arts\": \"1F3AD\",\n \"video_game\": \"1F3AE\",\n \"dart\": \"1F3AF\",\n \"slot_machine\": \"1F3B0\",\n \"8ball\": \"1F3B1\",\n \"game_die\": \"1F3B2\",\n \"bowling\": \"1F3B3\",\n \"flower_playing_cards\": \"1F3B4\",\n \"musical_note\": \"1F3B5\",\n \"notes\": \"1F3B6\",\n \"saxophone\": \"1F3B7\",\n \"guitar\": \"1F3B8\",\n \"musical_keyboard\": \"1F3B9\",\n \"trumpet\": \"1F3BA\",\n \"violin\": \"1F3BB\",\n \"musical_score\": \"1F3BC\",\n \"running_shirt_with_sash\": \"1F3BD\",\n \"tennis\": \"1F3BE\",\n \"ski\": \"1F3BF\",\n \"basketball\": \"1F3C0\",\n \"checkered_flag\": \"1F3C1\",\n \"snowboarder\": \"1F3C2\",\n \"woman-running\": \"1F3C3-200D-2640-FE0F\",\n \"man-running\": \"1F3C3-200D-2642-FE0F\",\n \"runner\": \"1F3C3-200D-2642-FE0F\",\n \"woman-surfing\": \"1F3C4-200D-2640-FE0F\",\n \"man-surfing\": \"1F3C4-200D-2642-FE0F\",\n \"surfer\": \"1F3C4-200D-2642-FE0F\",\n \"sports_medal\": \"1F3C5\",\n \"trophy\": \"1F3C6\",\n \"horse_racing\": \"1F3C7\",\n \"football\": \"1F3C8\",\n \"rugby_football\": \"1F3C9\",\n \"woman-swimming\": \"1F3CA-200D-2640-FE0F\",\n \"man-swimming\": \"1F3CA-200D-2642-FE0F\",\n \"swimmer\": \"1F3CA-200D-2642-FE0F\",\n \"woman-lifting-weights\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"man-lifting-weights\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"weight_lifter\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"woman-golfing\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"man-golfing\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"golfer\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"racing_motorcycle\": \"1F3CD-FE0F\",\n \"racing_car\": \"1F3CE-FE0F\",\n \"cricket_bat_and_ball\": \"1F3CF\",\n \"volleyball\": \"1F3D0\",\n \"field_hockey_stick_and_ball\": \"1F3D1\",\n \"ice_hockey_stick_and_puck\": \"1F3D2\",\n \"table_tennis_paddle_and_ball\": \"1F3D3\",\n \"snow_capped_mountain\": \"1F3D4-FE0F\",\n \"camping\": \"1F3D5-FE0F\",\n \"beach_with_umbrella\": \"1F3D6-FE0F\",\n \"building_construction\": \"1F3D7-FE0F\",\n \"house_buildings\": \"1F3D8-FE0F\",\n \"cityscape\": \"1F3D9-FE0F\",\n \"derelict_house_building\": \"1F3DA-FE0F\",\n \"classical_building\": \"1F3DB-FE0F\",\n \"desert\": \"1F3DC-FE0F\",\n \"desert_island\": \"1F3DD-FE0F\",\n \"national_park\": \"1F3DE-FE0F\",\n \"stadium\": \"1F3DF-FE0F\",\n \"house\": \"1F3E0\",\n \"house_with_garden\": \"1F3E1\",\n \"office\": \"1F3E2\",\n \"post_office\": \"1F3E3\",\n \"european_post_office\": \"1F3E4\",\n \"hospital\": \"1F3E5\",\n \"bank\": \"1F3E6\",\n \"atm\": \"1F3E7\",\n \"hotel\": \"1F3E8\",\n \"love_hotel\": \"1F3E9\",\n \"convenience_store\": \"1F3EA\",\n \"school\": \"1F3EB\",\n \"department_store\": \"1F3EC\",\n \"factory\": \"1F3ED\",\n \"izakaya_lantern\": \"1F3EE\",\n \"japanese_castle\": \"1F3EF\",\n \"european_castle\": \"1F3F0\",\n \"rainbow-flag\": \"1F3F3-FE0F-200D-1F308\",\n \"transgender_flag\": \"1F3F3-FE0F-200D-26A7-FE0F\",\n \"waving_white_flag\": \"1F3F3-FE0F\",\n \"pirate_flag\": \"1F3F4-200D-2620-FE0F\",\n \"flag-england\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"flag-scotland\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"flag-wales\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"waving_black_flag\": \"1F3F4\",\n \"rosette\": \"1F3F5-FE0F\",\n \"label\": \"1F3F7-FE0F\",\n \"badminton_racquet_and_shuttlecock\": \"1F3F8\",\n \"bow_and_arrow\": \"1F3F9\",\n \"amphora\": \"1F3FA\",\n \"skin-tone-2\": \"1F3FB\",\n \"skin-tone-3\": \"1F3FC\",\n \"skin-tone-4\": \"1F3FD\",\n \"skin-tone-5\": \"1F3FE\",\n \"skin-tone-6\": \"1F3FF\",\n \"rat\": \"1F400\",\n \"mouse2\": \"1F401\",\n \"ox\": \"1F402\",\n \"water_buffalo\": \"1F403\",\n \"cow2\": \"1F404\",\n \"tiger2\": \"1F405\",\n \"leopard\": \"1F406\",\n \"rabbit2\": \"1F407\",\n \"black_cat\": \"1F408-200D-2B1B\",\n \"cat2\": \"1F408\",\n \"dragon\": \"1F409\",\n \"crocodile\": \"1F40A\",\n \"whale2\": \"1F40B\",\n \"snail\": \"1F40C\",\n \"snake\": \"1F40D\",\n \"racehorse\": \"1F40E\",\n \"ram\": \"1F40F\",\n \"goat\": \"1F410\",\n \"sheep\": \"1F411\",\n \"monkey\": \"1F412\",\n \"rooster\": \"1F413\",\n \"chicken\": \"1F414\",\n \"service_dog\": \"1F415-200D-1F9BA\",\n \"dog2\": \"1F415\",\n \"pig2\": \"1F416\",\n \"boar\": \"1F417\",\n \"elephant\": \"1F418\",\n \"octopus\": \"1F419\",\n \"shell\": \"1F41A\",\n \"bug\": \"1F41B\",\n \"ant\": \"1F41C\",\n \"bee\": \"1F41D\",\n \"beetle\": \"1FAB2\",\n \"fish\": \"1F41F\",\n \"tropical_fish\": \"1F420\",\n \"blowfish\": \"1F421\",\n \"turtle\": \"1F422\",\n \"hatching_chick\": \"1F423\",\n \"baby_chick\": \"1F424\",\n \"hatched_chick\": \"1F425\",\n \"bird\": \"1F426\",\n \"penguin\": \"1F427\",\n \"koala\": \"1F428\",\n \"poodle\": \"1F429\",\n \"dromedary_camel\": \"1F42A\",\n \"camel\": \"1F42B\",\n \"dolphin\": \"1F42C\",\n \"mouse\": \"1F42D\",\n \"cow\": \"1F42E\",\n \"tiger\": \"1F42F\",\n \"rabbit\": \"1F430\",\n \"cat\": \"1F431\",\n \"dragon_face\": \"1F432\",\n \"whale\": \"1F433\",\n \"horse\": \"1F434\",\n \"monkey_face\": \"1F435\",\n \"dog\": \"1F436\",\n \"pig\": \"1F437\",\n \"frog\": \"1F438\",\n \"hamster\": \"1F439\",\n \"wolf\": \"1F43A\",\n \"polar_bear\": \"1F43B-200D-2744-FE0F\",\n \"bear\": \"1F43B\",\n \"panda_face\": \"1F43C\",\n \"pig_nose\": \"1F43D\",\n \"feet\": \"1F43E\",\n \"chipmunk\": \"1F43F-FE0F\",\n \"eyes\": \"1F440\",\n \"eye-in-speech-bubble\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"eye\": \"1F441-FE0F\",\n \"ear\": \"1F442\",\n \"nose\": \"1F443\",\n \"lips\": \"1F444\",\n \"tongue\": \"1F445\",\n \"point_up_2\": \"1F446\",\n \"point_down\": \"1F447\",\n \"point_left\": \"1F448\",\n \"point_right\": \"1F449\",\n \"facepunch\": \"1F44A\",\n \"wave\": \"1F44B\",\n \"ok_hand\": \"1F44C\",\n \"+1\": \"1F44D\",\n \"-1\": \"1F44E\",\n \"clap\": \"1F44F\",\n \"open_hands\": \"1F450\",\n \"crown\": \"1F451\",\n \"womans_hat\": \"1F452\",\n \"eyeglasses\": \"1F453\",\n \"necktie\": \"1F454\",\n \"shirt\": \"1F455\",\n \"jeans\": \"1F456\",\n \"dress\": \"1F457\",\n \"kimono\": \"1F458\",\n \"bikini\": \"1F459\",\n \"womans_clothes\": \"1F45A\",\n \"purse\": \"1F45B\",\n \"handbag\": \"1F45C\",\n \"pouch\": \"1F45D\",\n \"mans_shoe\": \"1F45E\",\n \"athletic_shoe\": \"1F45F\",\n \"high_heel\": \"1F460\",\n \"sandal\": \"1F461\",\n \"boot\": \"1F462\",\n \"footprints\": \"1F463\",\n \"bust_in_silhouette\": \"1F464\",\n \"busts_in_silhouette\": \"1F465\",\n \"boy\": \"1F466\",\n \"girl\": \"1F467\",\n \"male-farmer\": \"1F468-200D-1F33E\",\n \"male-cook\": \"1F468-200D-1F373\",\n \"man_feeding_baby\": \"1F468-200D-1F37C\",\n \"male-student\": \"1F468-200D-1F393\",\n \"male-singer\": \"1F468-200D-1F3A4\",\n \"male-artist\": \"1F468-200D-1F3A8\",\n \"male-teacher\": \"1F468-200D-1F3EB\",\n \"male-factory-worker\": \"1F468-200D-1F3ED\",\n \"man-boy-boy\": \"1F468-200D-1F466-200D-1F466\",\n \"man-boy\": \"1F468-200D-1F466\",\n \"man-girl-boy\": \"1F468-200D-1F467-200D-1F466\",\n \"man-girl-girl\": \"1F468-200D-1F467-200D-1F467\",\n \"man-girl\": \"1F468-200D-1F467\",\n \"man-man-boy\": \"1F468-200D-1F468-200D-1F466\",\n \"man-man-boy-boy\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"man-man-girl\": \"1F468-200D-1F468-200D-1F467\",\n \"man-man-girl-boy\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"man-man-girl-girl\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"man-woman-boy\": \"1F468-200D-1F469-200D-1F466\",\n \"man-woman-boy-boy\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"man-woman-girl\": \"1F468-200D-1F469-200D-1F467\",\n \"man-woman-girl-boy\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"man-woman-girl-girl\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"male-technologist\": \"1F468-200D-1F4BB\",\n \"male-office-worker\": \"1F468-200D-1F4BC\",\n \"male-mechanic\": \"1F468-200D-1F527\",\n \"male-scientist\": \"1F468-200D-1F52C\",\n \"male-astronaut\": \"1F468-200D-1F680\",\n \"male-firefighter\": \"1F468-200D-1F692\",\n \"man_with_probing_cane\": \"1F468-200D-1F9AF\",\n \"red_haired_man\": \"1F468-200D-1F9B0\",\n \"curly_haired_man\": \"1F468-200D-1F9B1\",\n \"bald_man\": \"1F468-200D-1F9B2\",\n \"white_haired_man\": \"1F468-200D-1F9B3\",\n \"man_in_motorized_wheelchair\": \"1F468-200D-1F9BC\",\n \"man_in_manual_wheelchair\": \"1F468-200D-1F9BD\",\n \"male-doctor\": \"1F468-200D-2695-FE0F\",\n \"male-judge\": \"1F468-200D-2696-FE0F\",\n \"male-pilot\": \"1F468-200D-2708-FE0F\",\n \"man-heart-man\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"man-kiss-man\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"man\": \"1F468\",\n \"female-farmer\": \"1F469-200D-1F33E\",\n \"female-cook\": \"1F469-200D-1F373\",\n \"woman_feeding_baby\": \"1F469-200D-1F37C\",\n \"female-student\": \"1F469-200D-1F393\",\n \"female-singer\": \"1F469-200D-1F3A4\",\n \"female-artist\": \"1F469-200D-1F3A8\",\n \"female-teacher\": \"1F469-200D-1F3EB\",\n \"female-factory-worker\": \"1F469-200D-1F3ED\",\n \"woman-boy-boy\": \"1F469-200D-1F466-200D-1F466\",\n \"woman-boy\": \"1F469-200D-1F466\",\n \"woman-girl-boy\": \"1F469-200D-1F467-200D-1F466\",\n \"woman-girl-girl\": \"1F469-200D-1F467-200D-1F467\",\n \"woman-girl\": \"1F469-200D-1F467\",\n \"woman-woman-boy\": \"1F469-200D-1F469-200D-1F466\",\n \"woman-woman-boy-boy\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"woman-woman-girl\": \"1F469-200D-1F469-200D-1F467\",\n \"woman-woman-girl-boy\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"woman-woman-girl-girl\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"female-technologist\": \"1F469-200D-1F4BB\",\n \"female-office-worker\": \"1F469-200D-1F4BC\",\n \"female-mechanic\": \"1F469-200D-1F527\",\n \"female-scientist\": \"1F469-200D-1F52C\",\n \"female-astronaut\": \"1F469-200D-1F680\",\n \"female-firefighter\": \"1F469-200D-1F692\",\n \"woman_with_probing_cane\": \"1F469-200D-1F9AF\",\n \"red_haired_woman\": \"1F469-200D-1F9B0\",\n \"curly_haired_woman\": \"1F469-200D-1F9B1\",\n \"bald_woman\": \"1F469-200D-1F9B2\",\n \"white_haired_woman\": \"1F469-200D-1F9B3\",\n \"woman_in_motorized_wheelchair\": \"1F469-200D-1F9BC\",\n \"woman_in_manual_wheelchair\": \"1F469-200D-1F9BD\",\n \"female-doctor\": \"1F469-200D-2695-FE0F\",\n \"female-judge\": \"1F469-200D-2696-FE0F\",\n \"female-pilot\": \"1F469-200D-2708-FE0F\",\n \"woman-heart-man\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"woman-heart-woman\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"woman-kiss-man\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"woman-kiss-woman\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"woman\": \"1F469\",\n \"family\": \"1F468-200D-1F469-200D-1F466\",\n \"couple\": \"1F46B\",\n \"two_men_holding_hands\": \"1F46C\",\n \"two_women_holding_hands\": \"1F46D\",\n \"female-police-officer\": \"1F46E-200D-2640-FE0F\",\n \"male-police-officer\": \"1F46E-200D-2642-FE0F\",\n \"cop\": \"1F46E-200D-2642-FE0F\",\n \"woman-with-bunny-ears-partying\": \"1F46F-200D-2640-FE0F\",\n \"man-with-bunny-ears-partying\": \"1F46F-200D-2642-FE0F\",\n \"dancers\": \"1F46F-200D-2640-FE0F\",\n \"woman_with_veil\": \"1F470-200D-2640-FE0F\",\n \"man_with_veil\": \"1F470-200D-2642-FE0F\",\n \"bride_with_veil\": \"1F470\",\n \"blond-haired-woman\": \"1F471-200D-2640-FE0F\",\n \"blond-haired-man\": \"1F471-200D-2642-FE0F\",\n \"person_with_blond_hair\": \"1F471-200D-2642-FE0F\",\n \"man_with_gua_pi_mao\": \"1F472\",\n \"woman-wearing-turban\": \"1F473-200D-2640-FE0F\",\n \"man-wearing-turban\": \"1F473-200D-2642-FE0F\",\n \"man_with_turban\": \"1F473-200D-2642-FE0F\",\n \"older_man\": \"1F474\",\n \"older_woman\": \"1F475\",\n \"baby\": \"1F476\",\n \"female-construction-worker\": \"1F477-200D-2640-FE0F\",\n \"male-construction-worker\": \"1F477-200D-2642-FE0F\",\n \"construction_worker\": \"1F477-200D-2642-FE0F\",\n \"princess\": \"1F478\",\n \"japanese_ogre\": \"1F479\",\n \"japanese_goblin\": \"1F47A\",\n \"ghost\": \"1F47B\",\n \"angel\": \"1F47C\",\n \"alien\": \"1F47D\",\n \"space_invader\": \"1F47E\",\n \"imp\": \"1F47F\",\n \"skull\": \"1F480\",\n \"woman-tipping-hand\": \"1F481-200D-2640-FE0F\",\n \"man-tipping-hand\": \"1F481-200D-2642-FE0F\",\n \"information_desk_person\": \"1F481-200D-2640-FE0F\",\n \"female-guard\": \"1F482-200D-2640-FE0F\",\n \"male-guard\": \"1F482-200D-2642-FE0F\",\n \"guardsman\": \"1F482-200D-2642-FE0F\",\n \"dancer\": \"1F483\",\n \"lipstick\": \"1F484\",\n \"nail_care\": \"1F485\",\n \"woman-getting-massage\": \"1F486-200D-2640-FE0F\",\n \"man-getting-massage\": \"1F486-200D-2642-FE0F\",\n \"massage\": \"1F486-200D-2640-FE0F\",\n \"woman-getting-haircut\": \"1F487-200D-2640-FE0F\",\n \"man-getting-haircut\": \"1F487-200D-2642-FE0F\",\n \"haircut\": \"1F487-200D-2640-FE0F\",\n \"barber\": \"1F488\",\n \"syringe\": \"1F489\",\n \"pill\": \"1F48A\",\n \"kiss\": \"1F48B\",\n \"love_letter\": \"1F48C\",\n \"ring\": \"1F48D\",\n \"gem\": \"1F48E\",\n \"couplekiss\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"bouquet\": \"1F490\",\n \"couple_with_heart\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"wedding\": \"1F492\",\n \"heartbeat\": \"1F493\",\n \"broken_heart\": \"1F494\",\n \"two_hearts\": \"1F495\",\n \"sparkling_heart\": \"1F496\",\n \"heartpulse\": \"1F497\",\n \"cupid\": \"1F498\",\n \"blue_heart\": \"1F499\",\n \"green_heart\": \"1F49A\",\n \"yellow_heart\": \"1F49B\",\n \"purple_heart\": \"1F49C\",\n \"gift_heart\": \"1F49D\",\n \"revolving_hearts\": \"1F49E\",\n \"heart_decoration\": \"1F49F\",\n \"diamond_shape_with_a_dot_inside\": \"1F4A0\",\n \"bulb\": \"1F4A1\",\n \"anger\": \"1F4A2\",\n \"bomb\": \"1F4A3\",\n \"zzz\": \"1F4A4\",\n \"boom\": \"1F4A5\",\n \"sweat_drops\": \"1F4A6\",\n \"droplet\": \"1F4A7\",\n \"dash\": \"1F4A8\",\n \"hankey\": \"1F4A9\",\n \"muscle\": \"1F4AA\",\n \"dizzy\": \"1F4AB\",\n \"speech_balloon\": \"1F4AC\",\n \"thought_balloon\": \"1F4AD\",\n \"white_flower\": \"1F4AE\",\n \"100\": \"1F4AF\",\n \"moneybag\": \"1F4B0\",\n \"currency_exchange\": \"1F4B1\",\n \"heavy_dollar_sign\": \"1F4B2\",\n \"credit_card\": \"1F4B3\",\n \"yen\": \"1F4B4\",\n \"dollar\": \"1F4B5\",\n \"euro\": \"1F4B6\",\n \"pound\": \"1F4B7\",\n \"money_with_wings\": \"1F4B8\",\n \"chart\": \"1F4B9\",\n \"seat\": \"1F4BA\",\n \"computer\": \"1F4BB\",\n \"briefcase\": \"1F4BC\",\n \"minidisc\": \"1F4BD\",\n \"floppy_disk\": \"1F4BE\",\n \"cd\": \"1F4BF\",\n \"dvd\": \"1F4C0\",\n \"file_folder\": \"1F4C1\",\n \"open_file_folder\": \"1F4C2\",\n \"page_with_curl\": \"1F4C3\",\n \"page_facing_up\": \"1F4C4\",\n \"date\": \"1F4C5\",\n \"calendar\": \"1F4C6\",\n \"card_index\": \"1F4C7\",\n \"chart_with_upwards_trend\": \"1F4C8\",\n \"chart_with_downwards_trend\": \"1F4C9\",\n \"bar_chart\": \"1F4CA\",\n \"clipboard\": \"1F4CB\",\n \"pushpin\": \"1F4CC\",\n \"round_pushpin\": \"1F4CD\",\n \"paperclip\": \"1F4CE\",\n \"straight_ruler\": \"1F4CF\",\n \"triangular_ruler\": \"1F4D0\",\n \"bookmark_tabs\": \"1F4D1\",\n \"ledger\": \"1F4D2\",\n \"notebook\": \"1F4D3\",\n \"notebook_with_decorative_cover\": \"1F4D4\",\n \"closed_book\": \"1F4D5\",\n \"book\": \"1F4D6\",\n \"green_book\": \"1F4D7\",\n \"blue_book\": \"1F4D8\",\n \"orange_book\": \"1F4D9\",\n \"books\": \"1F4DA\",\n \"name_badge\": \"1F4DB\",\n \"scroll\": \"1F4DC\",\n \"memo\": \"1F4DD\",\n \"telephone_receiver\": \"1F4DE\",\n \"pager\": \"1F4DF\",\n \"fax\": \"1F4E0\",\n \"satellite_antenna\": \"1F4E1\",\n \"loudspeaker\": \"1F4E2\",\n \"mega\": \"1F4E3\",\n \"outbox_tray\": \"1F4E4\",\n \"inbox_tray\": \"1F4E5\",\n \"package\": \"1F4E6\",\n \"e-mail\": \"1F4E7\",\n \"incoming_envelope\": \"1F4E8\",\n \"envelope_with_arrow\": \"1F4E9\",\n \"mailbox_closed\": \"1F4EA\",\n \"mailbox\": \"1F4EB\",\n \"mailbox_with_mail\": \"1F4EC\",\n \"mailbox_with_no_mail\": \"1F4ED\",\n \"postbox\": \"1F4EE\",\n \"postal_horn\": \"1F4EF\",\n \"newspaper\": \"1F4F0\",\n \"iphone\": \"1F4F1\",\n \"calling\": \"1F4F2\",\n \"vibration_mode\": \"1F4F3\",\n \"mobile_phone_off\": \"1F4F4\",\n \"no_mobile_phones\": \"1F4F5\",\n \"signal_strength\": \"1F4F6\",\n \"camera\": \"1F4F7\",\n \"camera_with_flash\": \"1F4F8\",\n \"video_camera\": \"1F4F9\",\n \"tv\": \"1F4FA\",\n \"radio\": \"1F4FB\",\n \"vhs\": \"1F4FC\",\n \"film_projector\": \"1F4FD-FE0F\",\n \"prayer_beads\": \"1F4FF\",\n \"twisted_rightwards_arrows\": \"1F500\",\n \"repeat\": \"1F501\",\n \"repeat_one\": \"1F502\",\n \"arrows_clockwise\": \"1F503\",\n \"arrows_counterclockwise\": \"1F504\",\n \"low_brightness\": \"1F505\",\n \"high_brightness\": \"1F506\",\n \"mute\": \"1F507\",\n \"speaker\": \"1F508\",\n \"sound\": \"1F509\",\n \"loud_sound\": \"1F50A\",\n \"battery\": \"1F50B\",\n \"electric_plug\": \"1F50C\",\n \"mag\": \"1F50D\",\n \"mag_right\": \"1F50E\",\n \"lock_with_ink_pen\": \"1F50F\",\n \"closed_lock_with_key\": \"1F510\",\n \"key\": \"1F511\",\n \"lock\": \"1F512\",\n \"unlock\": \"1F513\",\n \"bell\": \"1F514\",\n \"no_bell\": \"1F515\",\n \"bookmark\": \"1F516\",\n \"link\": \"1F517\",\n \"radio_button\": \"1F518\",\n \"back\": \"1F519\",\n \"end\": \"1F51A\",\n \"on\": \"1F51B\",\n \"soon\": \"1F51C\",\n \"top\": \"1F51D\",\n \"underage\": \"1F51E\",\n \"keycap_ten\": \"1F51F\",\n \"capital_abcd\": \"1F520\",\n \"abcd\": \"1F521\",\n \"1234\": \"1F522\",\n \"symbols\": \"1F523\",\n \"abc\": \"1F524\",\n \"fire\": \"1F525\",\n \"flashlight\": \"1F526\",\n \"wrench\": \"1F527\",\n \"hammer\": \"1F528\",\n \"nut_and_bolt\": \"1F529\",\n \"hocho\": \"1F52A\",\n \"gun\": \"1F52B\",\n \"microscope\": \"1F52C\",\n \"telescope\": \"1F52D\",\n \"crystal_ball\": \"1F52E\",\n \"six_pointed_star\": \"1F52F\",\n \"beginner\": \"1F530\",\n \"trident\": \"1F531\",\n \"black_square_button\": \"1F532\",\n \"white_square_button\": \"1F533\",\n \"red_circle\": \"1F534\",\n \"large_blue_circle\": \"1F535\",\n \"large_orange_diamond\": \"1F536\",\n \"large_blue_diamond\": \"1F537\",\n \"small_orange_diamond\": \"1F538\",\n \"small_blue_diamond\": \"1F539\",\n \"small_red_triangle\": \"1F53A\",\n \"small_red_triangle_down\": \"1F53B\",\n \"arrow_up_small\": \"1F53C\",\n \"arrow_down_small\": \"1F53D\",\n \"om_symbol\": \"1F549-FE0F\",\n \"dove_of_peace\": \"1F54A-FE0F\",\n \"kaaba\": \"1F54B\",\n \"mosque\": \"1F54C\",\n \"synagogue\": \"1F54D\",\n \"menorah_with_nine_branches\": \"1F54E\",\n \"clock1\": \"1F550\",\n \"clock2\": \"1F551\",\n \"clock3\": \"1F552\",\n \"clock4\": \"1F553\",\n \"clock5\": \"1F554\",\n \"clock6\": \"1F555\",\n \"clock7\": \"1F556\",\n \"clock8\": \"1F557\",\n \"clock9\": \"1F558\",\n \"clock10\": \"1F559\",\n \"clock11\": \"1F55A\",\n \"clock12\": \"1F55B\",\n \"clock130\": \"1F55C\",\n \"clock230\": \"1F55D\",\n \"clock330\": \"1F55E\",\n \"clock430\": \"1F55F\",\n \"clock530\": \"1F560\",\n \"clock630\": \"1F561\",\n \"clock730\": \"1F562\",\n \"clock830\": \"1F563\",\n \"clock930\": \"1F564\",\n \"clock1030\": \"1F565\",\n \"clock1130\": \"1F566\",\n \"clock1230\": \"1F567\",\n \"candle\": \"1F56F-FE0F\",\n \"mantelpiece_clock\": \"1F570-FE0F\",\n \"hole\": \"1F573-FE0F\",\n \"man_in_business_suit_levitating\": \"1F574-FE0F\",\n \"female-detective\": \"1F575-FE0F-200D-2640-FE0F\",\n \"male-detective\": \"1F575-FE0F-200D-2642-FE0F\",\n \"sleuth_or_spy\": \"1F575-FE0F-200D-2642-FE0F\",\n \"dark_sunglasses\": \"1F576-FE0F\",\n \"spider\": \"1F577-FE0F\",\n \"spider_web\": \"1F578-FE0F\",\n \"joystick\": \"1F579-FE0F\",\n \"man_dancing\": \"1F57A\",\n \"linked_paperclips\": \"1F587-FE0F\",\n \"lower_left_ballpoint_pen\": \"1F58A-FE0F\",\n \"lower_left_fountain_pen\": \"1F58B-FE0F\",\n \"lower_left_paintbrush\": \"1F58C-FE0F\",\n \"lower_left_crayon\": \"1F58D-FE0F\",\n \"raised_hand_with_fingers_splayed\": \"1F590-FE0F\",\n \"middle_finger\": \"1F595\",\n \"spock-hand\": \"1F596\",\n \"black_heart\": \"1F5A4\",\n \"desktop_computer\": \"1F5A5-FE0F\",\n \"printer\": \"1F5A8-FE0F\",\n \"three_button_mouse\": \"1F5B1-FE0F\",\n \"trackball\": \"1F5B2-FE0F\",\n \"frame_with_picture\": \"1F5BC-FE0F\",\n \"card_index_dividers\": \"1F5C2-FE0F\",\n \"card_file_box\": \"1F5C3-FE0F\",\n \"file_cabinet\": \"1F5C4-FE0F\",\n \"wastebasket\": \"1F5D1-FE0F\",\n \"spiral_note_pad\": \"1F5D2-FE0F\",\n \"spiral_calendar_pad\": \"1F5D3-FE0F\",\n \"compression\": \"1F5DC-FE0F\",\n \"old_key\": \"1F5DD-FE0F\",\n \"rolled_up_newspaper\": \"1F5DE-FE0F\",\n \"dagger_knife\": \"1F5E1-FE0F\",\n \"speaking_head_in_silhouette\": \"1F5E3-FE0F\",\n \"left_speech_bubble\": \"1F5E8-FE0F\",\n \"right_anger_bubble\": \"1F5EF-FE0F\",\n \"ballot_box_with_ballot\": \"1F5F3-FE0F\",\n \"world_map\": \"1F5FA-FE0F\",\n \"mount_fuji\": \"1F5FB\",\n \"tokyo_tower\": \"1F5FC\",\n \"statue_of_liberty\": \"1F5FD\",\n \"japan\": \"1F5FE\",\n \"moyai\": \"1F5FF\",\n \"grinning\": \"1F600\",\n \"grin\": \"1F601\",\n \"joy\": \"1F602\",\n \"smiley\": \"1F603\",\n \"smile\": \"1F604\",\n \"sweat_smile\": \"1F605\",\n \"laughing\": \"1F606\",\n \"innocent\": \"1F607\",\n \"smiling_imp\": \"1F608\",\n \"wink\": \"1F609\",\n \"blush\": \"1F60A\",\n \"yum\": \"1F60B\",\n \"relieved\": \"1F60C\",\n \"heart_eyes\": \"1F60D\",\n \"sunglasses\": \"1F60E\",\n \"smirk\": \"1F60F\",\n \"neutral_face\": \"1F610\",\n \"expressionless\": \"1F611\",\n \"unamused\": \"1F612\",\n \"sweat\": \"1F613\",\n \"pensive\": \"1F614\",\n \"confused\": \"1F615\",\n \"confounded\": \"1F616\",\n \"kissing\": \"1F617\",\n \"kissing_heart\": \"1F618\",\n \"kissing_smiling_eyes\": \"1F619\",\n \"kissing_closed_eyes\": \"1F61A\",\n \"stuck_out_tongue\": \"1F61B\",\n \"stuck_out_tongue_winking_eye\": \"1F61C\",\n \"stuck_out_tongue_closed_eyes\": \"1F61D\",\n \"disappointed\": \"1F61E\",\n \"worried\": \"1F61F\",\n \"angry\": \"1F620\",\n \"rage\": \"1F621\",\n \"cry\": \"1F622\",\n \"persevere\": \"1F623\",\n \"triumph\": \"1F624\",\n \"disappointed_relieved\": \"1F625\",\n \"frowning\": \"1F626\",\n \"anguished\": \"1F627\",\n \"fearful\": \"1F628\",\n \"weary\": \"1F629\",\n \"sleepy\": \"1F62A\",\n \"tired_face\": \"1F62B\",\n \"grimacing\": \"1F62C\",\n \"sob\": \"1F62D\",\n \"open_mouth\": \"1F62E\",\n \"hushed\": \"1F62F\",\n \"cold_sweat\": \"1F630\",\n \"scream\": \"1F631\",\n \"astonished\": \"1F632\",\n \"flushed\": \"1F633\",\n \"sleeping\": \"1F634\",\n \"dizzy_face\": \"1F635\",\n \"no_mouth\": \"1F636\",\n \"mask\": \"1F637\",\n \"smile_cat\": \"1F638\",\n \"joy_cat\": \"1F639\",\n \"smiley_cat\": \"1F63A\",\n \"heart_eyes_cat\": \"1F63B\",\n \"smirk_cat\": \"1F63C\",\n \"kissing_cat\": \"1F63D\",\n \"pouting_cat\": \"1F63E\",\n \"crying_cat_face\": \"1F63F\",\n \"scream_cat\": \"1F640\",\n \"slightly_frowning_face\": \"1F641\",\n \"slightly_smiling_face\": \"1F642\",\n \"upside_down_face\": \"1F643\",\n \"face_with_rolling_eyes\": \"1F644\",\n \"woman-gesturing-no\": \"1F645-200D-2640-FE0F\",\n \"man-gesturing-no\": \"1F645-200D-2642-FE0F\",\n \"no_good\": \"1F645-200D-2640-FE0F\",\n \"woman-gesturing-ok\": \"1F646-200D-2640-FE0F\",\n \"man-gesturing-ok\": \"1F646-200D-2642-FE0F\",\n \"ok_woman\": \"1F646-200D-2640-FE0F\",\n \"woman-bowing\": \"1F647-200D-2640-FE0F\",\n \"man-bowing\": \"1F647-200D-2642-FE0F\",\n \"bow\": \"1F647-200D-2642-FE0F\",\n \"see_no_evil\": \"1F648\",\n \"hear_no_evil\": \"1F649\",\n \"speak_no_evil\": \"1F64A\",\n \"woman-raising-hand\": \"1F64B-200D-2640-FE0F\",\n \"man-raising-hand\": \"1F64B-200D-2642-FE0F\",\n \"raising_hand\": \"1F64B-200D-2640-FE0F\",\n \"raised_hands\": \"1F64C\",\n \"woman-frowning\": \"1F64D-200D-2640-FE0F\",\n \"man-frowning\": \"1F64D-200D-2642-FE0F\",\n \"person_frowning\": \"1F64D-200D-2640-FE0F\",\n \"woman-pouting\": \"1F64E-200D-2640-FE0F\",\n \"man-pouting\": \"1F64E-200D-2642-FE0F\",\n \"person_with_pouting_face\": \"1F64E-200D-2640-FE0F\",\n \"pray\": \"1F64F\",\n \"rocket\": \"1F680\",\n \"helicopter\": \"1F681\",\n \"steam_locomotive\": \"1F682\",\n \"railway_car\": \"1F683\",\n \"bullettrain_side\": \"1F684\",\n \"bullettrain_front\": \"1F685\",\n \"train2\": \"1F686\",\n \"metro\": \"1F687\",\n \"light_rail\": \"1F688\",\n \"station\": \"1F689\",\n \"tram\": \"1F68A\",\n \"train\": \"1F68B\",\n \"bus\": \"1F68C\",\n \"oncoming_bus\": \"1F68D\",\n \"trolleybus\": \"1F68E\",\n \"busstop\": \"1F68F\",\n \"minibus\": \"1F690\",\n \"ambulance\": \"1F691\",\n \"fire_engine\": \"1F692\",\n \"police_car\": \"1F693\",\n \"oncoming_police_car\": \"1F694\",\n \"taxi\": \"1F695\",\n \"oncoming_taxi\": \"1F696\",\n \"car\": \"1F697\",\n \"oncoming_automobile\": \"1F698\",\n \"blue_car\": \"1F699\",\n \"truck\": \"1F69A\",\n \"articulated_lorry\": \"1F69B\",\n \"tractor\": \"1F69C\",\n \"monorail\": \"1F69D\",\n \"mountain_railway\": \"1F69E\",\n \"suspension_railway\": \"1F69F\",\n \"mountain_cableway\": \"1F6A0\",\n \"aerial_tramway\": \"1F6A1\",\n \"ship\": \"1F6A2\",\n \"woman-rowing-boat\": \"1F6A3-200D-2640-FE0F\",\n \"man-rowing-boat\": \"1F6A3-200D-2642-FE0F\",\n \"rowboat\": \"1F6A3-200D-2642-FE0F\",\n \"speedboat\": \"1F6A4\",\n \"traffic_light\": \"1F6A5\",\n \"vertical_traffic_light\": \"1F6A6\",\n \"construction\": \"1F6A7\",\n \"rotating_light\": \"1F6A8\",\n \"triangular_flag_on_post\": \"1F6A9\",\n \"door\": \"1F6AA\",\n \"no_entry_sign\": \"1F6AB\",\n \"smoking\": \"1F6AC\",\n \"no_smoking\": \"1F6AD\",\n \"put_litter_in_its_place\": \"1F6AE\",\n \"do_not_litter\": \"1F6AF\",\n \"potable_water\": \"1F6B0\",\n \"non-potable_water\": \"1F6B1\",\n \"bike\": \"1F6B2\",\n \"no_bicycles\": \"1F6B3\",\n \"woman-biking\": \"1F6B4-200D-2640-FE0F\",\n \"man-biking\": \"1F6B4-200D-2642-FE0F\",\n \"bicyclist\": \"1F6B4-200D-2642-FE0F\",\n \"woman-mountain-biking\": \"1F6B5-200D-2640-FE0F\",\n \"man-mountain-biking\": \"1F6B5-200D-2642-FE0F\",\n \"mountain_bicyclist\": \"1F6B5-200D-2642-FE0F\",\n \"woman-walking\": \"1F6B6-200D-2640-FE0F\",\n \"man-walking\": \"1F6B6-200D-2642-FE0F\",\n \"walking\": \"1F6B6-200D-2642-FE0F\",\n \"no_pedestrians\": \"1F6B7\",\n \"children_crossing\": \"1F6B8\",\n \"mens\": \"1F6B9\",\n \"womens\": \"1F6BA\",\n \"restroom\": \"1F6BB\",\n \"baby_symbol\": \"1F6BC\",\n \"toilet\": \"1F6BD\",\n \"wc\": \"1F6BE\",\n \"shower\": \"1F6BF\",\n \"bath\": \"1F6C0\",\n \"bathtub\": \"1F6C1\",\n \"passport_control\": \"1F6C2\",\n \"customs\": \"1F6C3\",\n \"baggage_claim\": \"1F6C4\",\n \"left_luggage\": \"1F6C5\",\n \"couch_and_lamp\": \"1F6CB-FE0F\",\n \"sleeping_accommodation\": \"1F6CC\",\n \"shopping_bags\": \"1F6CD-FE0F\",\n \"bellhop_bell\": \"1F6CE-FE0F\",\n \"bed\": \"1F6CF-FE0F\",\n \"place_of_worship\": \"1F6D0\",\n \"octagonal_sign\": \"1F6D1\",\n \"shopping_trolley\": \"1F6D2\",\n \"hindu_temple\": \"1F6D5\",\n \"hut\": \"1F6D6\",\n \"elevator\": \"1F6D7\",\n \"hammer_and_wrench\": \"1F6E0-FE0F\",\n \"shield\": \"1F6E1-FE0F\",\n \"oil_drum\": \"1F6E2-FE0F\",\n \"motorway\": \"1F6E3-FE0F\",\n \"railway_track\": \"1F6E4-FE0F\",\n \"motor_boat\": \"1F6E5-FE0F\",\n \"small_airplane\": \"1F6E9-FE0F\",\n \"airplane_departure\": \"1F6EB\",\n \"airplane_arriving\": \"1F6EC\",\n \"satellite\": \"1F6F0-FE0F\",\n \"passenger_ship\": \"1F6F3-FE0F\",\n \"scooter\": \"1F6F4\",\n \"motor_scooter\": \"1F6F5\",\n \"canoe\": \"1F6F6\",\n \"sled\": \"1F6F7\",\n \"flying_saucer\": \"1F6F8\",\n \"skateboard\": \"1F6F9\",\n \"auto_rickshaw\": \"1F6FA\",\n \"pickup_truck\": \"1F6FB\",\n \"roller_skate\": \"1F6FC\",\n \"large_orange_circle\": \"1F7E0\",\n \"large_yellow_circle\": \"1F7E1\",\n \"large_green_circle\": \"1F7E2\",\n \"large_purple_circle\": \"1F7E3\",\n \"large_brown_circle\": \"1F7E4\",\n \"large_red_square\": \"1F7E5\",\n \"large_blue_square\": \"1F7E6\",\n \"large_orange_square\": \"1F7E7\",\n \"large_yellow_square\": \"1F7E8\",\n \"large_green_square\": \"1F7E9\",\n \"large_purple_square\": \"1F7EA\",\n \"large_brown_square\": \"1F7EB\",\n \"pinched_fingers\": \"1F90C\",\n \"white_heart\": \"1F90D\",\n \"brown_heart\": \"1F90E\",\n \"pinching_hand\": \"1F90F\",\n \"zipper_mouth_face\": \"1F910\",\n \"money_mouth_face\": \"1F911\",\n \"face_with_thermometer\": \"1F912\",\n \"nerd_face\": \"1F913\",\n \"thinking_face\": \"1F914\",\n \"face_with_head_bandage\": \"1F915\",\n \"robot_face\": \"1F916\",\n \"hugging_face\": \"1F917\",\n \"the_horns\": \"1F918\",\n \"call_me_hand\": \"1F919\",\n \"raised_back_of_hand\": \"1F91A\",\n \"left-facing_fist\": \"1F91B\",\n \"right-facing_fist\": \"1F91C\",\n \"handshake\": \"1F91D\",\n \"crossed_fingers\": \"1F91E\",\n \"i_love_you_hand_sign\": \"1F91F\",\n \"face_with_cowboy_hat\": \"1F920\",\n \"clown_face\": \"1F921\",\n \"nauseated_face\": \"1F922\",\n \"rolling_on_the_floor_laughing\": \"1F923\",\n \"drooling_face\": \"1F924\",\n \"lying_face\": \"1F925\",\n \"woman-facepalming\": \"1F926-200D-2640-FE0F\",\n \"man-facepalming\": \"1F926-200D-2642-FE0F\",\n \"face_palm\": \"1F926\",\n \"sneezing_face\": \"1F927\",\n \"face_with_raised_eyebrow\": \"1F928\",\n \"star-struck\": \"1F929\",\n \"zany_face\": \"1F92A\",\n \"shushing_face\": \"1F92B\",\n \"face_with_symbols_on_mouth\": \"1F92C\",\n \"face_with_hand_over_mouth\": \"1F92D\",\n \"face_vomiting\": \"1F92E\",\n \"exploding_head\": \"1F92F\",\n \"pregnant_woman\": \"1F930\",\n \"breast-feeding\": \"1F931\",\n \"palms_up_together\": \"1F932\",\n \"selfie\": \"1F933\",\n \"prince\": \"1F934\",\n \"woman_in_tuxedo\": \"1F935-200D-2640-FE0F\",\n \"man_in_tuxedo\": \"1F935\",\n \"mrs_claus\": \"1F936\",\n \"woman-shrugging\": \"1F937-200D-2640-FE0F\",\n \"man-shrugging\": \"1F937-200D-2642-FE0F\",\n \"shrug\": \"1F937\",\n \"woman-cartwheeling\": \"1F938-200D-2640-FE0F\",\n \"man-cartwheeling\": \"1F938-200D-2642-FE0F\",\n \"person_doing_cartwheel\": \"1F938\",\n \"woman-juggling\": \"1F939-200D-2640-FE0F\",\n \"man-juggling\": \"1F939-200D-2642-FE0F\",\n \"juggling\": \"1F939\",\n \"fencer\": \"1F93A\",\n \"woman-wrestling\": \"1F93C-200D-2640-FE0F\",\n \"man-wrestling\": \"1F93C-200D-2642-FE0F\",\n \"wrestlers\": \"1F93C\",\n \"woman-playing-water-polo\": \"1F93D-200D-2640-FE0F\",\n \"man-playing-water-polo\": \"1F93D-200D-2642-FE0F\",\n \"water_polo\": \"1F93D\",\n \"woman-playing-handball\": \"1F93E-200D-2640-FE0F\",\n \"man-playing-handball\": \"1F93E-200D-2642-FE0F\",\n \"handball\": \"1F93E\",\n \"diving_mask\": \"1F93F\",\n \"wilted_flower\": \"1F940\",\n \"drum_with_drumsticks\": \"1F941\",\n \"clinking_glasses\": \"1F942\",\n \"tumbler_glass\": \"1F943\",\n \"spoon\": \"1F944\",\n \"goal_net\": \"1F945\",\n \"first_place_medal\": \"1F947\",\n \"second_place_medal\": \"1F948\",\n \"third_place_medal\": \"1F949\",\n \"boxing_glove\": \"1F94A\",\n \"martial_arts_uniform\": \"1F94B\",\n \"curling_stone\": \"1F94C\",\n \"lacrosse\": \"1F94D\",\n \"softball\": \"1F94E\",\n \"flying_disc\": \"1F94F\",\n \"croissant\": \"1F950\",\n \"avocado\": \"1F951\",\n \"cucumber\": \"1F952\",\n \"bacon\": \"1F953\",\n \"potato\": \"1F954\",\n \"carrot\": \"1F955\",\n \"baguette_bread\": \"1F956\",\n \"green_salad\": \"1F957\",\n \"shallow_pan_of_food\": \"1F958\",\n \"stuffed_flatbread\": \"1F959\",\n \"egg\": \"1F95A\",\n \"glass_of_milk\": \"1F95B\",\n \"peanuts\": \"1F95C\",\n \"kiwifruit\": \"1F95D\",\n \"pancakes\": \"1F95E\",\n \"dumpling\": \"1F95F\",\n \"fortune_cookie\": \"1F960\",\n \"takeout_box\": \"1F961\",\n \"chopsticks\": \"1F962\",\n \"bowl_with_spoon\": \"1F963\",\n \"cup_with_straw\": \"1F964\",\n \"coconut\": \"1F965\",\n \"broccoli\": \"1F966\",\n \"pie\": \"1F967\",\n \"pretzel\": \"1F968\",\n \"cut_of_meat\": \"1F969\",\n \"sandwich\": \"1F96A\",\n \"canned_food\": \"1F96B\",\n \"leafy_green\": \"1F96C\",\n \"mango\": \"1F96D\",\n \"moon_cake\": \"1F96E\",\n \"bagel\": \"1F96F\",\n \"smiling_face_with_3_hearts\": \"1F970\",\n \"yawning_face\": \"1F971\",\n \"smiling_face_with_tear\": \"1F972\",\n \"partying_face\": \"1F973\",\n \"woozy_face\": \"1F974\",\n \"hot_face\": \"1F975\",\n \"cold_face\": \"1F976\",\n \"ninja\": \"1F977\",\n \"disguised_face\": \"1F978\",\n \"pleading_face\": \"1F97A\",\n \"sari\": \"1F97B\",\n \"lab_coat\": \"1F97C\",\n \"goggles\": \"1F97D\",\n \"hiking_boot\": \"1F97E\",\n \"womans_flat_shoe\": \"1F97F\",\n \"crab\": \"1F980\",\n \"lion_face\": \"1F981\",\n \"scorpion\": \"1F982\",\n \"turkey\": \"1F983\",\n \"unicorn_face\": \"1F984\",\n \"eagle\": \"1F985\",\n \"duck\": \"1F986\",\n \"bat\": \"1F987\",\n \"shark\": \"1F988\",\n \"owl\": \"1F989\",\n \"fox_face\": \"1F98A\",\n \"butterfly\": \"1F98B\",\n \"deer\": \"1F98C\",\n \"gorilla\": \"1F98D\",\n \"lizard\": \"1F98E\",\n \"rhinoceros\": \"1F98F\",\n \"shrimp\": \"1F990\",\n \"squid\": \"1F991\",\n \"giraffe_face\": \"1F992\",\n \"zebra_face\": \"1F993\",\n \"hedgehog\": \"1F994\",\n \"sauropod\": \"1F995\",\n \"t-rex\": \"1F996\",\n \"cricket\": \"1F997\",\n \"kangaroo\": \"1F998\",\n \"llama\": \"1F999\",\n \"peacock\": \"1F99A\",\n \"hippopotamus\": \"1F99B\",\n \"parrot\": \"1F99C\",\n \"raccoon\": \"1F99D\",\n \"lobster\": \"1F99E\",\n \"mosquito\": \"1F99F\",\n \"microbe\": \"1F9A0\",\n \"badger\": \"1F9A1\",\n \"swan\": \"1F9A2\",\n \"mammoth\": \"1F9A3\",\n \"dodo\": \"1F9A4\",\n \"sloth\": \"1F9A5\",\n \"otter\": \"1F9A6\",\n \"orangutan\": \"1F9A7\",\n \"skunk\": \"1F9A8\",\n \"flamingo\": \"1F9A9\",\n \"oyster\": \"1F9AA\",\n \"beaver\": \"1F9AB\",\n \"bison\": \"1F9AC\",\n \"seal\": \"1F9AD\",\n \"guide_dog\": \"1F9AE\",\n \"probing_cane\": \"1F9AF\",\n \"bone\": \"1F9B4\",\n \"leg\": \"1F9B5\",\n \"foot\": \"1F9B6\",\n \"tooth\": \"1F9B7\",\n \"female_superhero\": \"1F9B8-200D-2640-FE0F\",\n \"male_superhero\": \"1F9B8-200D-2642-FE0F\",\n \"superhero\": \"1F9B8\",\n \"female_supervillain\": \"1F9B9-200D-2640-FE0F\",\n \"male_supervillain\": \"1F9B9-200D-2642-FE0F\",\n \"supervillain\": \"1F9B9\",\n \"safety_vest\": \"1F9BA\",\n \"ear_with_hearing_aid\": \"1F9BB\",\n \"motorized_wheelchair\": \"1F9BC\",\n \"manual_wheelchair\": \"1F9BD\",\n \"mechanical_arm\": \"1F9BE\",\n \"mechanical_leg\": \"1F9BF\",\n \"cheese_wedge\": \"1F9C0\",\n \"cupcake\": \"1F9C1\",\n \"salt\": \"1F9C2\",\n \"beverage_box\": \"1F9C3\",\n \"garlic\": \"1F9C4\",\n \"onion\": \"1F9C5\",\n \"falafel\": \"1F9C6\",\n \"waffle\": \"1F9C7\",\n \"butter\": \"1F9C8\",\n \"mate_drink\": \"1F9C9\",\n \"ice_cube\": \"1F9CA\",\n \"bubble_tea\": \"1F9CB\",\n \"woman_standing\": \"1F9CD-200D-2640-FE0F\",\n \"man_standing\": \"1F9CD-200D-2642-FE0F\",\n \"standing_person\": \"1F9CD\",\n \"woman_kneeling\": \"1F9CE-200D-2640-FE0F\",\n \"man_kneeling\": \"1F9CE-200D-2642-FE0F\",\n \"kneeling_person\": \"1F9CE\",\n \"deaf_woman\": \"1F9CF-200D-2640-FE0F\",\n \"deaf_man\": \"1F9CF-200D-2642-FE0F\",\n \"deaf_person\": \"1F9CF\",\n \"face_with_monocle\": \"1F9D0\",\n \"farmer\": \"1F9D1-200D-1F33E\",\n \"cook\": \"1F9D1-200D-1F373\",\n \"person_feeding_baby\": \"1F9D1-200D-1F37C\",\n \"mx_claus\": \"1F9D1-200D-1F384\",\n \"student\": \"1F9D1-200D-1F393\",\n \"singer\": \"1F9D1-200D-1F3A4\",\n \"artist\": \"1F9D1-200D-1F3A8\",\n \"teacher\": \"1F9D1-200D-1F3EB\",\n \"factory_worker\": \"1F9D1-200D-1F3ED\",\n \"technologist\": \"1F9D1-200D-1F4BB\",\n \"office_worker\": \"1F9D1-200D-1F4BC\",\n \"mechanic\": \"1F9D1-200D-1F527\",\n \"scientist\": \"1F9D1-200D-1F52C\",\n \"astronaut\": \"1F9D1-200D-1F680\",\n \"firefighter\": \"1F9D1-200D-1F692\",\n \"people_holding_hands\": \"1F9D1-200D-1F91D-200D-1F9D1\",\n \"person_with_probing_cane\": \"1F9D1-200D-1F9AF\",\n \"red_haired_person\": \"1F9D1-200D-1F9B0\",\n \"curly_haired_person\": \"1F9D1-200D-1F9B1\",\n \"bald_person\": \"1F9D1-200D-1F9B2\",\n \"white_haired_person\": \"1F9D1-200D-1F9B3\",\n \"person_in_motorized_wheelchair\": \"1F9D1-200D-1F9BC\",\n \"person_in_manual_wheelchair\": \"1F9D1-200D-1F9BD\",\n \"health_worker\": \"1F9D1-200D-2695-FE0F\",\n \"judge\": \"1F9D1-200D-2696-FE0F\",\n \"pilot\": \"1F9D1-200D-2708-FE0F\",\n \"adult\": \"1F9D1\",\n \"child\": \"1F9D2\",\n \"older_adult\": \"1F9D3\",\n \"bearded_person\": \"1F9D4\",\n \"person_with_headscarf\": \"1F9D5\",\n \"woman_in_steamy_room\": \"1F9D6-200D-2640-FE0F\",\n \"man_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"person_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"woman_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"man_climbing\": \"1F9D7-200D-2642-FE0F\",\n \"person_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"woman_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"man_in_lotus_position\": \"1F9D8-200D-2642-FE0F\",\n \"person_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"female_mage\": \"1F9D9-200D-2640-FE0F\",\n \"male_mage\": \"1F9D9-200D-2642-FE0F\",\n \"mage\": \"1F9D9-200D-2640-FE0F\",\n \"female_fairy\": \"1F9DA-200D-2640-FE0F\",\n \"male_fairy\": \"1F9DA-200D-2642-FE0F\",\n \"fairy\": \"1F9DA-200D-2640-FE0F\",\n \"female_vampire\": \"1F9DB-200D-2640-FE0F\",\n \"male_vampire\": \"1F9DB-200D-2642-FE0F\",\n \"vampire\": \"1F9DB-200D-2640-FE0F\",\n \"mermaid\": \"1F9DC-200D-2640-FE0F\",\n \"merman\": \"1F9DC-200D-2642-FE0F\",\n \"merperson\": \"1F9DC-200D-2642-FE0F\",\n \"female_elf\": \"1F9DD-200D-2640-FE0F\",\n \"male_elf\": \"1F9DD-200D-2642-FE0F\",\n \"elf\": \"1F9DD-200D-2642-FE0F\",\n \"female_genie\": \"1F9DE-200D-2640-FE0F\",\n \"male_genie\": \"1F9DE-200D-2642-FE0F\",\n \"genie\": \"1F9DE-200D-2642-FE0F\",\n \"female_zombie\": \"1F9DF-200D-2640-FE0F\",\n \"male_zombie\": \"1F9DF-200D-2642-FE0F\",\n \"zombie\": \"1F9DF-200D-2642-FE0F\",\n \"brain\": \"1F9E0\",\n \"orange_heart\": \"1F9E1\",\n \"billed_cap\": \"1F9E2\",\n \"scarf\": \"1F9E3\",\n \"gloves\": \"1F9E4\",\n \"coat\": \"1F9E5\",\n \"socks\": \"1F9E6\",\n \"red_envelope\": \"1F9E7\",\n \"firecracker\": \"1F9E8\",\n \"jigsaw\": \"1F9E9\",\n \"test_tube\": \"1F9EA\",\n \"petri_dish\": \"1F9EB\",\n \"dna\": \"1F9EC\",\n \"compass\": \"1F9ED\",\n \"abacus\": \"1F9EE\",\n \"fire_extinguisher\": \"1F9EF\",\n \"toolbox\": \"1F9F0\",\n \"bricks\": \"1F9F1\",\n \"magnet\": \"1F9F2\",\n \"luggage\": \"1F9F3\",\n \"lotion_bottle\": \"1F9F4\",\n \"thread\": \"1F9F5\",\n \"yarn\": \"1F9F6\",\n \"safety_pin\": \"1F9F7\",\n \"teddy_bear\": \"1F9F8\",\n \"broom\": \"1F9F9\",\n \"basket\": \"1F9FA\",\n \"roll_of_paper\": \"1F9FB\",\n \"soap\": \"1F9FC\",\n \"sponge\": \"1F9FD\",\n \"receipt\": \"1F9FE\",\n \"nazar_amulet\": \"1F9FF\",\n \"ballet_shoes\": \"1FA70\",\n \"one-piece_swimsuit\": \"1FA71\",\n \"briefs\": \"1FA72\",\n \"shorts\": \"1FA73\",\n \"thong_sandal\": \"1FA74\",\n \"drop_of_blood\": \"1FA78\",\n \"adhesive_bandage\": \"1FA79\",\n \"stethoscope\": \"1FA7A\",\n \"yo-yo\": \"1FA80\",\n \"kite\": \"1FA81\",\n \"parachute\": \"1FA82\",\n \"boomerang\": \"1FA83\",\n \"magic_wand\": \"1FA84\",\n \"pinata\": \"1FA85\",\n \"nesting_dolls\": \"1FA86\",\n \"ringed_planet\": \"1FA90\",\n \"chair\": \"1FA91\",\n \"razor\": \"1FA92\",\n \"axe\": \"1FA93\",\n \"diya_lamp\": \"1FA94\",\n \"banjo\": \"1FA95\",\n \"military_helmet\": \"1FA96\",\n \"accordion\": \"1FA97\",\n \"long_drum\": \"1FA98\",\n \"coin\": \"1FA99\",\n \"carpentry_saw\": \"1FA9A\",\n \"screwdriver\": \"1FA9B\",\n \"ladder\": \"1FA9C\",\n \"hook\": \"1FA9D\",\n \"mirror\": \"1FA9E\",\n \"window\": \"1FA9F\",\n \"plunger\": \"1FAA0\",\n \"sewing_needle\": \"1FAA1\",\n \"knot\": \"1FAA2\",\n \"bucket\": \"1FAA3\",\n \"mouse_trap\": \"1FAA4\",\n \"toothbrush\": \"1FAA5\",\n \"headstone\": \"1FAA6\",\n \"placard\": \"1FAA7\",\n \"rock\": \"1FAA8\",\n \"fly\": \"1FAB0\",\n \"worm\": \"1FAB1\",\n \"cockroach\": \"1FAB3\",\n \"potted_plant\": \"1FAB4\",\n \"wood\": \"1FAB5\",\n \"feather\": \"1FAB6\",\n \"anatomical_heart\": \"1FAC0\",\n \"lungs\": \"1FAC1\",\n \"people_hugging\": \"1FAC2\",\n \"blueberries\": \"1FAD0\",\n \"bell_pepper\": \"1FAD1\",\n \"olive\": \"1FAD2\",\n \"flatbread\": \"1FAD3\",\n \"tamale\": \"1FAD4\",\n \"fondue\": \"1FAD5\",\n \"teapot\": \"1FAD6\",\n \"bangbang\": \"203C-FE0F\",\n \"interrobang\": \"2049-FE0F\",\n \"tm\": \"2122-FE0F\",\n \"information_source\": \"2139-FE0F\",\n \"left_right_arrow\": \"2194-FE0F\",\n \"arrow_up_down\": \"2195-FE0F\",\n \"arrow_upper_left\": \"2196-FE0F\",\n \"arrow_upper_right\": \"2197-FE0F\",\n \"arrow_lower_right\": \"2198-FE0F\",\n \"arrow_lower_left\": \"2199-FE0F\",\n \"leftwards_arrow_with_hook\": \"21A9-FE0F\",\n \"arrow_right_hook\": \"21AA-FE0F\",\n \"watch\": \"231A\",\n \"hourglass\": \"231B\",\n \"keyboard\": \"2328-FE0F\",\n \"eject\": \"23CF-FE0F\",\n \"fast_forward\": \"23E9\",\n \"rewind\": \"23EA\",\n \"arrow_double_up\": \"23EB\",\n \"arrow_double_down\": \"23EC\",\n \"black_right_pointing_double_triangle_with_vertical_bar\": \"23ED-FE0F\",\n \"black_left_pointing_double_triangle_with_vertical_bar\": \"23EE-FE0F\",\n \"black_right_pointing_triangle_with_double_vertical_bar\": \"23EF-FE0F\",\n \"alarm_clock\": \"23F0\",\n \"stopwatch\": \"23F1-FE0F\",\n \"timer_clock\": \"23F2-FE0F\",\n \"hourglass_flowing_sand\": \"23F3\",\n \"double_vertical_bar\": \"23F8-FE0F\",\n \"black_square_for_stop\": \"23F9-FE0F\",\n \"black_circle_for_record\": \"23FA-FE0F\",\n \"m\": \"24C2-FE0F\",\n \"black_small_square\": \"25AA-FE0F\",\n \"white_small_square\": \"25AB-FE0F\",\n \"arrow_forward\": \"25B6-FE0F\",\n \"arrow_backward\": \"25C0-FE0F\",\n \"white_medium_square\": \"25FB-FE0F\",\n \"black_medium_square\": \"25FC-FE0F\",\n \"white_medium_small_square\": \"25FD\",\n \"black_medium_small_square\": \"25FE\",\n \"sunny\": \"2600-FE0F\",\n \"cloud\": \"2601-FE0F\",\n \"umbrella\": \"2602-FE0F\",\n \"snowman\": \"2603-FE0F\",\n \"comet\": \"2604-FE0F\",\n \"phone\": \"260E-FE0F\",\n \"ballot_box_with_check\": \"2611-FE0F\",\n \"umbrella_with_rain_drops\": \"2614\",\n \"coffee\": \"2615\",\n \"shamrock\": \"2618-FE0F\",\n \"point_up\": \"261D-FE0F\",\n \"skull_and_crossbones\": \"2620-FE0F\",\n \"radioactive_sign\": \"2622-FE0F\",\n \"biohazard_sign\": \"2623-FE0F\",\n \"orthodox_cross\": \"2626-FE0F\",\n \"star_and_crescent\": \"262A-FE0F\",\n \"peace_symbol\": \"262E-FE0F\",\n \"yin_yang\": \"262F-FE0F\",\n \"wheel_of_dharma\": \"2638-FE0F\",\n \"white_frowning_face\": \"2639-FE0F\",\n \"relaxed\": \"263A-FE0F\",\n \"female_sign\": \"2640-FE0F\",\n \"male_sign\": \"2642-FE0F\",\n \"aries\": \"2648\",\n \"taurus\": \"2649\",\n \"gemini\": \"264A\",\n \"cancer\": \"264B\",\n \"leo\": \"264C\",\n \"virgo\": \"264D\",\n \"libra\": \"264E\",\n \"scorpius\": \"264F\",\n \"sagittarius\": \"2650\",\n \"capricorn\": \"2651\",\n \"aquarius\": \"2652\",\n \"pisces\": \"2653\",\n \"chess_pawn\": \"265F-FE0F\",\n \"spades\": \"2660-FE0F\",\n \"clubs\": \"2663-FE0F\",\n \"hearts\": \"2665-FE0F\",\n \"diamonds\": \"2666-FE0F\",\n \"hotsprings\": \"2668-FE0F\",\n \"recycle\": \"267B-FE0F\",\n \"infinity\": \"267E-FE0F\",\n \"wheelchair\": \"267F\",\n \"hammer_and_pick\": \"2692-FE0F\",\n \"anchor\": \"2693\",\n \"crossed_swords\": \"2694-FE0F\",\n \"medical_symbol\": \"2695-FE0F\",\n \"scales\": \"2696-FE0F\",\n \"alembic\": \"2697-FE0F\",\n \"gear\": \"2699-FE0F\",\n \"atom_symbol\": \"269B-FE0F\",\n \"fleur_de_lis\": \"269C-FE0F\",\n \"warning\": \"26A0-FE0F\",\n \"zap\": \"26A1\",\n \"transgender_symbol\": \"26A7-FE0F\",\n \"white_circle\": \"26AA\",\n \"black_circle\": \"26AB\",\n \"coffin\": \"26B0-FE0F\",\n \"funeral_urn\": \"26B1-FE0F\",\n \"soccer\": \"26BD\",\n \"baseball\": \"26BE\",\n \"snowman_without_snow\": \"26C4\",\n \"partly_sunny\": \"26C5\",\n \"thunder_cloud_and_rain\": \"26C8-FE0F\",\n \"ophiuchus\": \"26CE\",\n \"pick\": \"26CF-FE0F\",\n \"helmet_with_white_cross\": \"26D1-FE0F\",\n \"chains\": \"26D3-FE0F\",\n \"no_entry\": \"26D4\",\n \"shinto_shrine\": \"26E9-FE0F\",\n \"church\": \"26EA\",\n \"mountain\": \"26F0-FE0F\",\n \"umbrella_on_ground\": \"26F1-FE0F\",\n \"fountain\": \"26F2\",\n \"golf\": \"26F3\",\n \"ferry\": \"26F4-FE0F\",\n \"boat\": \"26F5\",\n \"skier\": \"26F7-FE0F\",\n \"ice_skate\": \"26F8-FE0F\",\n \"woman-bouncing-ball\": \"26F9-FE0F-200D-2640-FE0F\",\n \"man-bouncing-ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"person_with_ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"tent\": \"26FA\",\n \"fuelpump\": \"26FD\",\n \"scissors\": \"2702-FE0F\",\n \"white_check_mark\": \"2705\",\n \"airplane\": \"2708-FE0F\",\n \"email\": \"2709-FE0F\",\n \"fist\": \"270A\",\n \"hand\": \"270B\",\n \"v\": \"270C-FE0F\",\n \"writing_hand\": \"270D-FE0F\",\n \"pencil2\": \"270F-FE0F\",\n \"black_nib\": \"2712-FE0F\",\n \"heavy_check_mark\": \"2714-FE0F\",\n \"heavy_multiplication_x\": \"2716-FE0F\",\n \"latin_cross\": \"271D-FE0F\",\n \"star_of_david\": \"2721-FE0F\",\n \"sparkles\": \"2728\",\n \"eight_spoked_asterisk\": \"2733-FE0F\",\n \"eight_pointed_black_star\": \"2734-FE0F\",\n \"snowflake\": \"2744-FE0F\",\n \"sparkle\": \"2747-FE0F\",\n \"x\": \"274C\",\n \"negative_squared_cross_mark\": \"274E\",\n \"question\": \"2753\",\n \"grey_question\": \"2754\",\n \"grey_exclamation\": \"2755\",\n \"exclamation\": \"2757\",\n \"heavy_heart_exclamation_mark_ornament\": \"2763-FE0F\",\n \"heart\": \"2764-FE0F\",\n \"heavy_plus_sign\": \"2795\",\n \"heavy_minus_sign\": \"2796\",\n \"heavy_division_sign\": \"2797\",\n \"arrow_right\": \"27A1-FE0F\",\n \"curly_loop\": \"27B0\",\n \"loop\": \"27BF\",\n \"arrow_heading_up\": \"2934-FE0F\",\n \"arrow_heading_down\": \"2935-FE0F\",\n \"arrow_left\": \"2B05-FE0F\",\n \"arrow_up\": \"2B06-FE0F\",\n \"arrow_down\": \"2B07-FE0F\",\n \"black_large_square\": \"2B1B\",\n \"white_large_square\": \"2B1C\",\n \"star\": \"2B50\",\n \"o\": \"2B55\",\n \"wavy_dash\": \"3030-FE0F\",\n \"part_alternation_mark\": \"303D-FE0F\",\n \"congratulations\": \"3297-FE0F\",\n \"secret\": \"3299-FE0F\"\n};\n"],"file":"data.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../src/emoji/data.js"],"names":[],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Emoji data based on the data available from https://github.com/iamcal/emoji-data.\n *\n * @module core/emoji/data\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport const byCategory = [\n {\n \"name\": \"Smileys & Emotion\",\n \"emojis\": [\n {\n \"unified\": \"1F600\",\n \"shortnames\": [\n \"grinning\"\n ]\n },\n {\n \"unified\": \"1F603\",\n \"shortnames\": [\n \"smiley\"\n ]\n },\n {\n \"unified\": \"1F604\",\n \"shortnames\": [\n \"smile\"\n ]\n },\n {\n \"unified\": \"1F601\",\n \"shortnames\": [\n \"grin\"\n ]\n },\n {\n \"unified\": \"1F606\",\n \"shortnames\": [\n \"laughing\"\n ]\n },\n {\n \"unified\": \"1F605\",\n \"shortnames\": [\n \"sweat_smile\"\n ]\n },\n {\n \"unified\": \"1F923\",\n \"shortnames\": [\n \"rolling_on_the_floor_laughing\"\n ]\n },\n {\n \"unified\": \"1F602\",\n \"shortnames\": [\n \"joy\"\n ]\n },\n {\n \"unified\": \"1F642\",\n \"shortnames\": [\n \"slightly_smiling_face\"\n ]\n },\n {\n \"unified\": \"1F643\",\n \"shortnames\": [\n \"upside_down_face\"\n ]\n },\n {\n \"unified\": \"1F609\",\n \"shortnames\": [\n \"wink\"\n ]\n },\n {\n \"unified\": \"1F60A\",\n \"shortnames\": [\n \"blush\"\n ]\n },\n {\n \"unified\": \"1F607\",\n \"shortnames\": [\n \"innocent\"\n ]\n },\n {\n \"unified\": \"1F970\",\n \"shortnames\": [\n \"smiling_face_with_3_hearts\"\n ]\n },\n {\n \"unified\": \"1F60D\",\n \"shortnames\": [\n \"heart_eyes\"\n ]\n },\n {\n \"unified\": \"1F929\",\n \"shortnames\": [\n \"star-struck\"\n ]\n },\n {\n \"unified\": \"1F618\",\n \"shortnames\": [\n \"kissing_heart\"\n ]\n },\n {\n \"unified\": \"1F617\",\n \"shortnames\": [\n \"kissing\"\n ]\n },\n {\n \"unified\": \"263A-FE0F\",\n \"shortnames\": [\n \"relaxed\"\n ]\n },\n {\n \"unified\": \"1F61A\",\n \"shortnames\": [\n \"kissing_closed_eyes\"\n ]\n },\n {\n \"unified\": \"1F619\",\n \"shortnames\": [\n \"kissing_smiling_eyes\"\n ]\n },\n {\n \"unified\": \"1F972\",\n \"shortnames\": [\n \"smiling_face_with_tear\"\n ]\n },\n {\n \"unified\": \"1F60B\",\n \"shortnames\": [\n \"yum\"\n ]\n },\n {\n \"unified\": \"1F61B\",\n \"shortnames\": [\n \"stuck_out_tongue\"\n ]\n },\n {\n \"unified\": \"1F61C\",\n \"shortnames\": [\n \"stuck_out_tongue_winking_eye\"\n ]\n },\n {\n \"unified\": \"1F92A\",\n \"shortnames\": [\n \"zany_face\"\n ]\n },\n {\n \"unified\": \"1F61D\",\n \"shortnames\": [\n \"stuck_out_tongue_closed_eyes\"\n ]\n },\n {\n \"unified\": \"1F911\",\n \"shortnames\": [\n \"money_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F917\",\n \"shortnames\": [\n \"hugging_face\"\n ]\n },\n {\n \"unified\": \"1F92D\",\n \"shortnames\": [\n \"face_with_hand_over_mouth\"\n ]\n },\n {\n \"unified\": \"1F92B\",\n \"shortnames\": [\n \"shushing_face\"\n ]\n },\n {\n \"unified\": \"1F914\",\n \"shortnames\": [\n \"thinking_face\"\n ]\n },\n {\n \"unified\": \"1F910\",\n \"shortnames\": [\n \"zipper_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F928\",\n \"shortnames\": [\n \"face_with_raised_eyebrow\"\n ]\n },\n {\n \"unified\": \"1F610\",\n \"shortnames\": [\n \"neutral_face\"\n ]\n },\n {\n \"unified\": \"1F611\",\n \"shortnames\": [\n \"expressionless\"\n ]\n },\n {\n \"unified\": \"1F636\",\n \"shortnames\": [\n \"no_mouth\"\n ]\n },\n {\n \"unified\": \"1F60F\",\n \"shortnames\": [\n \"smirk\"\n ]\n },\n {\n \"unified\": \"1F612\",\n \"shortnames\": [\n \"unamused\"\n ]\n },\n {\n \"unified\": \"1F644\",\n \"shortnames\": [\n \"face_with_rolling_eyes\"\n ]\n },\n {\n \"unified\": \"1F62C\",\n \"shortnames\": [\n \"grimacing\"\n ]\n },\n {\n \"unified\": \"1F925\",\n \"shortnames\": [\n \"lying_face\"\n ]\n },\n {\n \"unified\": \"1F60C\",\n \"shortnames\": [\n \"relieved\"\n ]\n },\n {\n \"unified\": \"1F614\",\n \"shortnames\": [\n \"pensive\"\n ]\n },\n {\n \"unified\": \"1F62A\",\n \"shortnames\": [\n \"sleepy\"\n ]\n },\n {\n \"unified\": \"1F924\",\n \"shortnames\": [\n \"drooling_face\"\n ]\n },\n {\n \"unified\": \"1F634\",\n \"shortnames\": [\n \"sleeping\"\n ]\n },\n {\n \"unified\": \"1F637\",\n \"shortnames\": [\n \"mask\"\n ]\n },\n {\n \"unified\": \"1F912\",\n \"shortnames\": [\n \"face_with_thermometer\"\n ]\n },\n {\n \"unified\": \"1F915\",\n \"shortnames\": [\n \"face_with_head_bandage\"\n ]\n },\n {\n \"unified\": \"1F922\",\n \"shortnames\": [\n \"nauseated_face\"\n ]\n },\n {\n \"unified\": \"1F92E\",\n \"shortnames\": [\n \"face_vomiting\"\n ]\n },\n {\n \"unified\": \"1F927\",\n \"shortnames\": [\n \"sneezing_face\"\n ]\n },\n {\n \"unified\": \"1F975\",\n \"shortnames\": [\n \"hot_face\"\n ]\n },\n {\n \"unified\": \"1F976\",\n \"shortnames\": [\n \"cold_face\"\n ]\n },\n {\n \"unified\": \"1F974\",\n \"shortnames\": [\n \"woozy_face\"\n ]\n },\n {\n \"unified\": \"1F635\",\n \"shortnames\": [\n \"dizzy_face\"\n ]\n },\n {\n \"unified\": \"1F92F\",\n \"shortnames\": [\n \"exploding_head\"\n ]\n },\n {\n \"unified\": \"1F920\",\n \"shortnames\": [\n \"face_with_cowboy_hat\"\n ]\n },\n {\n \"unified\": \"1F973\",\n \"shortnames\": [\n \"partying_face\"\n ]\n },\n {\n \"unified\": \"1F978\",\n \"shortnames\": [\n \"disguised_face\"\n ]\n },\n {\n \"unified\": \"1F60E\",\n \"shortnames\": [\n \"sunglasses\"\n ]\n },\n {\n \"unified\": \"1F913\",\n \"shortnames\": [\n \"nerd_face\"\n ]\n },\n {\n \"unified\": \"1F9D0\",\n \"shortnames\": [\n \"face_with_monocle\"\n ]\n },\n {\n \"unified\": \"1F615\",\n \"shortnames\": [\n \"confused\"\n ]\n },\n {\n \"unified\": \"1F61F\",\n \"shortnames\": [\n \"worried\"\n ]\n },\n {\n \"unified\": \"1F641\",\n \"shortnames\": [\n \"slightly_frowning_face\"\n ]\n },\n {\n \"unified\": \"2639-FE0F\",\n \"shortnames\": [\n \"white_frowning_face\"\n ]\n },\n {\n \"unified\": \"1F62E\",\n \"shortnames\": [\n \"open_mouth\"\n ]\n },\n {\n \"unified\": \"1F62F\",\n \"shortnames\": [\n \"hushed\"\n ]\n },\n {\n \"unified\": \"1F632\",\n \"shortnames\": [\n \"astonished\"\n ]\n },\n {\n \"unified\": \"1F633\",\n \"shortnames\": [\n \"flushed\"\n ]\n },\n {\n \"unified\": \"1F97A\",\n \"shortnames\": [\n \"pleading_face\"\n ]\n },\n {\n \"unified\": \"1F626\",\n \"shortnames\": [\n \"frowning\"\n ]\n },\n {\n \"unified\": \"1F627\",\n \"shortnames\": [\n \"anguished\"\n ]\n },\n {\n \"unified\": \"1F628\",\n \"shortnames\": [\n \"fearful\"\n ]\n },\n {\n \"unified\": \"1F630\",\n \"shortnames\": [\n \"cold_sweat\"\n ]\n },\n {\n \"unified\": \"1F625\",\n \"shortnames\": [\n \"disappointed_relieved\"\n ]\n },\n {\n \"unified\": \"1F622\",\n \"shortnames\": [\n \"cry\"\n ]\n },\n {\n \"unified\": \"1F62D\",\n \"shortnames\": [\n \"sob\"\n ]\n },\n {\n \"unified\": \"1F631\",\n \"shortnames\": [\n \"scream\"\n ]\n },\n {\n \"unified\": \"1F616\",\n \"shortnames\": [\n \"confounded\"\n ]\n },\n {\n \"unified\": \"1F623\",\n \"shortnames\": [\n \"persevere\"\n ]\n },\n {\n \"unified\": \"1F61E\",\n \"shortnames\": [\n \"disappointed\"\n ]\n },\n {\n \"unified\": \"1F613\",\n \"shortnames\": [\n \"sweat\"\n ]\n },\n {\n \"unified\": \"1F629\",\n \"shortnames\": [\n \"weary\"\n ]\n },\n {\n \"unified\": \"1F62B\",\n \"shortnames\": [\n \"tired_face\"\n ]\n },\n {\n \"unified\": \"1F971\",\n \"shortnames\": [\n \"yawning_face\"\n ]\n },\n {\n \"unified\": \"1F624\",\n \"shortnames\": [\n \"triumph\"\n ]\n },\n {\n \"unified\": \"1F621\",\n \"shortnames\": [\n \"rage\"\n ]\n },\n {\n \"unified\": \"1F620\",\n \"shortnames\": [\n \"angry\"\n ]\n },\n {\n \"unified\": \"1F92C\",\n \"shortnames\": [\n \"face_with_symbols_on_mouth\"\n ]\n },\n {\n \"unified\": \"1F608\",\n \"shortnames\": [\n \"smiling_imp\"\n ]\n },\n {\n \"unified\": \"1F47F\",\n \"shortnames\": [\n \"imp\"\n ]\n },\n {\n \"unified\": \"1F480\",\n \"shortnames\": [\n \"skull\"\n ]\n },\n {\n \"unified\": \"2620-FE0F\",\n \"shortnames\": [\n \"skull_and_crossbones\"\n ]\n },\n {\n \"unified\": \"1F4A9\",\n \"shortnames\": [\n \"hankey\"\n ]\n },\n {\n \"unified\": \"1F921\",\n \"shortnames\": [\n \"clown_face\"\n ]\n },\n {\n \"unified\": \"1F479\",\n \"shortnames\": [\n \"japanese_ogre\"\n ]\n },\n {\n \"unified\": \"1F47A\",\n \"shortnames\": [\n \"japanese_goblin\"\n ]\n },\n {\n \"unified\": \"1F47B\",\n \"shortnames\": [\n \"ghost\"\n ]\n },\n {\n \"unified\": \"1F47D\",\n \"shortnames\": [\n \"alien\"\n ]\n },\n {\n \"unified\": \"1F47E\",\n \"shortnames\": [\n \"space_invader\"\n ]\n },\n {\n \"unified\": \"1F916\",\n \"shortnames\": [\n \"robot_face\"\n ]\n },\n {\n \"unified\": \"1F63A\",\n \"shortnames\": [\n \"smiley_cat\"\n ]\n },\n {\n \"unified\": \"1F638\",\n \"shortnames\": [\n \"smile_cat\"\n ]\n },\n {\n \"unified\": \"1F639\",\n \"shortnames\": [\n \"joy_cat\"\n ]\n },\n {\n \"unified\": \"1F63B\",\n \"shortnames\": [\n \"heart_eyes_cat\"\n ]\n },\n {\n \"unified\": \"1F63C\",\n \"shortnames\": [\n \"smirk_cat\"\n ]\n },\n {\n \"unified\": \"1F63D\",\n \"shortnames\": [\n \"kissing_cat\"\n ]\n },\n {\n \"unified\": \"1F640\",\n \"shortnames\": [\n \"scream_cat\"\n ]\n },\n {\n \"unified\": \"1F63F\",\n \"shortnames\": [\n \"crying_cat_face\"\n ]\n },\n {\n \"unified\": \"1F63E\",\n \"shortnames\": [\n \"pouting_cat\"\n ]\n },\n {\n \"unified\": \"1F648\",\n \"shortnames\": [\n \"see_no_evil\"\n ]\n },\n {\n \"unified\": \"1F649\",\n \"shortnames\": [\n \"hear_no_evil\"\n ]\n },\n {\n \"unified\": \"1F64A\",\n \"shortnames\": [\n \"speak_no_evil\"\n ]\n },\n {\n \"unified\": \"1F48B\",\n \"shortnames\": [\n \"kiss\"\n ]\n },\n {\n \"unified\": \"1F48C\",\n \"shortnames\": [\n \"love_letter\"\n ]\n },\n {\n \"unified\": \"1F498\",\n \"shortnames\": [\n \"cupid\"\n ]\n },\n {\n \"unified\": \"1F49D\",\n \"shortnames\": [\n \"gift_heart\"\n ]\n },\n {\n \"unified\": \"1F496\",\n \"shortnames\": [\n \"sparkling_heart\"\n ]\n },\n {\n \"unified\": \"1F497\",\n \"shortnames\": [\n \"heartpulse\"\n ]\n },\n {\n \"unified\": \"1F493\",\n \"shortnames\": [\n \"heartbeat\"\n ]\n },\n {\n \"unified\": \"1F49E\",\n \"shortnames\": [\n \"revolving_hearts\"\n ]\n },\n {\n \"unified\": \"1F495\",\n \"shortnames\": [\n \"two_hearts\"\n ]\n },\n {\n \"unified\": \"1F49F\",\n \"shortnames\": [\n \"heart_decoration\"\n ]\n },\n {\n \"unified\": \"2763-FE0F\",\n \"shortnames\": [\n \"heavy_heart_exclamation_mark_ornament\"\n ]\n },\n {\n \"unified\": \"1F494\",\n \"shortnames\": [\n \"broken_heart\"\n ]\n },\n {\n \"unified\": \"2764-FE0F\",\n \"shortnames\": [\n \"heart\"\n ]\n },\n {\n \"unified\": \"1F9E1\",\n \"shortnames\": [\n \"orange_heart\"\n ]\n },\n {\n \"unified\": \"1F49B\",\n \"shortnames\": [\n \"yellow_heart\"\n ]\n },\n {\n \"unified\": \"1F49A\",\n \"shortnames\": [\n \"green_heart\"\n ]\n },\n {\n \"unified\": \"1F499\",\n \"shortnames\": [\n \"blue_heart\"\n ]\n },\n {\n \"unified\": \"1F49C\",\n \"shortnames\": [\n \"purple_heart\"\n ]\n },\n {\n \"unified\": \"1F90E\",\n \"shortnames\": [\n \"brown_heart\"\n ]\n },\n {\n \"unified\": \"1F5A4\",\n \"shortnames\": [\n \"black_heart\"\n ]\n },\n {\n \"unified\": \"1F90D\",\n \"shortnames\": [\n \"white_heart\"\n ]\n },\n {\n \"unified\": \"1F4AF\",\n \"shortnames\": [\n \"100\"\n ]\n },\n {\n \"unified\": \"1F4A2\",\n \"shortnames\": [\n \"anger\"\n ]\n },\n {\n \"unified\": \"1F4A5\",\n \"shortnames\": [\n \"boom\"\n ]\n },\n {\n \"unified\": \"1F4AB\",\n \"shortnames\": [\n \"dizzy\"\n ]\n },\n {\n \"unified\": \"1F4A6\",\n \"shortnames\": [\n \"sweat_drops\"\n ]\n },\n {\n \"unified\": \"1F4A8\",\n \"shortnames\": [\n \"dash\"\n ]\n },\n {\n \"unified\": \"1F573-FE0F\",\n \"shortnames\": [\n \"hole\"\n ]\n },\n {\n \"unified\": \"1F4A3\",\n \"shortnames\": [\n \"bomb\"\n ]\n },\n {\n \"unified\": \"1F4AC\",\n \"shortnames\": [\n \"speech_balloon\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"shortnames\": [\n \"eye-in-speech-bubble\"\n ]\n },\n {\n \"unified\": \"1F5E8-FE0F\",\n \"shortnames\": [\n \"left_speech_bubble\"\n ]\n },\n {\n \"unified\": \"1F5EF-FE0F\",\n \"shortnames\": [\n \"right_anger_bubble\"\n ]\n },\n {\n \"unified\": \"1F4AD\",\n \"shortnames\": [\n \"thought_balloon\"\n ]\n },\n {\n \"unified\": \"1F4A4\",\n \"shortnames\": [\n \"zzz\"\n ]\n }\n ]\n },\n {\n \"name\": \"People & Body\",\n \"emojis\": [\n {\n \"unified\": \"1F44B\",\n \"shortnames\": [\n \"wave\"\n ]\n },\n {\n \"unified\": \"1F91A\",\n \"shortnames\": [\n \"raised_back_of_hand\"\n ]\n },\n {\n \"unified\": \"1F590-FE0F\",\n \"shortnames\": [\n \"raised_hand_with_fingers_splayed\"\n ]\n },\n {\n \"unified\": \"270B\",\n \"shortnames\": [\n \"hand\"\n ]\n },\n {\n \"unified\": \"1F596\",\n \"shortnames\": [\n \"spock-hand\"\n ]\n },\n {\n \"unified\": \"1F44C\",\n \"shortnames\": [\n \"ok_hand\"\n ]\n },\n {\n \"unified\": \"1F90C\",\n \"shortnames\": [\n \"pinched_fingers\"\n ]\n },\n {\n \"unified\": \"1F90F\",\n \"shortnames\": [\n \"pinching_hand\"\n ]\n },\n {\n \"unified\": \"270C-FE0F\",\n \"shortnames\": [\n \"v\"\n ]\n },\n {\n \"unified\": \"1F91E\",\n \"shortnames\": [\n \"crossed_fingers\"\n ]\n },\n {\n \"unified\": \"1F91F\",\n \"shortnames\": [\n \"i_love_you_hand_sign\"\n ]\n },\n {\n \"unified\": \"1F918\",\n \"shortnames\": [\n \"the_horns\"\n ]\n },\n {\n \"unified\": \"1F919\",\n \"shortnames\": [\n \"call_me_hand\"\n ]\n },\n {\n \"unified\": \"1F448\",\n \"shortnames\": [\n \"point_left\"\n ]\n },\n {\n \"unified\": \"1F449\",\n \"shortnames\": [\n \"point_right\"\n ]\n },\n {\n \"unified\": \"1F446\",\n \"shortnames\": [\n \"point_up_2\"\n ]\n },\n {\n \"unified\": \"1F595\",\n \"shortnames\": [\n \"middle_finger\"\n ]\n },\n {\n \"unified\": \"1F447\",\n \"shortnames\": [\n \"point_down\"\n ]\n },\n {\n \"unified\": \"261D-FE0F\",\n \"shortnames\": [\n \"point_up\"\n ]\n },\n {\n \"unified\": \"1F44D\",\n \"shortnames\": [\n \"+1\"\n ]\n },\n {\n \"unified\": \"1F44E\",\n \"shortnames\": [\n \"-1\"\n ]\n },\n {\n \"unified\": \"270A\",\n \"shortnames\": [\n \"fist\"\n ]\n },\n {\n \"unified\": \"1F44A\",\n \"shortnames\": [\n \"facepunch\"\n ]\n },\n {\n \"unified\": \"1F91B\",\n \"shortnames\": [\n \"left-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F91C\",\n \"shortnames\": [\n \"right-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F44F\",\n \"shortnames\": [\n \"clap\"\n ]\n },\n {\n \"unified\": \"1F64C\",\n \"shortnames\": [\n \"raised_hands\"\n ]\n },\n {\n \"unified\": \"1F450\",\n \"shortnames\": [\n \"open_hands\"\n ]\n },\n {\n \"unified\": \"1F932\",\n \"shortnames\": [\n \"palms_up_together\"\n ]\n },\n {\n \"unified\": \"1F91D\",\n \"shortnames\": [\n \"handshake\"\n ]\n },\n {\n \"unified\": \"1F64F\",\n \"shortnames\": [\n \"pray\"\n ]\n },\n {\n \"unified\": \"270D-FE0F\",\n \"shortnames\": [\n \"writing_hand\"\n ]\n },\n {\n \"unified\": \"1F485\",\n \"shortnames\": [\n \"nail_care\"\n ]\n },\n {\n \"unified\": \"1F933\",\n \"shortnames\": [\n \"selfie\"\n ]\n },\n {\n \"unified\": \"1F4AA\",\n \"shortnames\": [\n \"muscle\"\n ]\n },\n {\n \"unified\": \"1F9BE\",\n \"shortnames\": [\n \"mechanical_arm\"\n ]\n },\n {\n \"unified\": \"1F9BF\",\n \"shortnames\": [\n \"mechanical_leg\"\n ]\n },\n {\n \"unified\": \"1F9B5\",\n \"shortnames\": [\n \"leg\"\n ]\n },\n {\n \"unified\": \"1F9B6\",\n \"shortnames\": [\n \"foot\"\n ]\n },\n {\n \"unified\": \"1F442\",\n \"shortnames\": [\n \"ear\"\n ]\n },\n {\n \"unified\": \"1F9BB\",\n \"shortnames\": [\n \"ear_with_hearing_aid\"\n ]\n },\n {\n \"unified\": \"1F443\",\n \"shortnames\": [\n \"nose\"\n ]\n },\n {\n \"unified\": \"1F9E0\",\n \"shortnames\": [\n \"brain\"\n ]\n },\n {\n \"unified\": \"1FAC0\",\n \"shortnames\": [\n \"anatomical_heart\"\n ]\n },\n {\n \"unified\": \"1FAC1\",\n \"shortnames\": [\n \"lungs\"\n ]\n },\n {\n \"unified\": \"1F9B7\",\n \"shortnames\": [\n \"tooth\"\n ]\n },\n {\n \"unified\": \"1F9B4\",\n \"shortnames\": [\n \"bone\"\n ]\n },\n {\n \"unified\": \"1F440\",\n \"shortnames\": [\n \"eyes\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F\",\n \"shortnames\": [\n \"eye\"\n ]\n },\n {\n \"unified\": \"1F445\",\n \"shortnames\": [\n \"tongue\"\n ]\n },\n {\n \"unified\": \"1F444\",\n \"shortnames\": [\n \"lips\"\n ]\n },\n {\n \"unified\": \"1F476\",\n \"shortnames\": [\n \"baby\"\n ]\n },\n {\n \"unified\": \"1F9D2\",\n \"shortnames\": [\n \"child\"\n ]\n },\n {\n \"unified\": \"1F466\",\n \"shortnames\": [\n \"boy\"\n ]\n },\n {\n \"unified\": \"1F467\",\n \"shortnames\": [\n \"girl\"\n ]\n },\n {\n \"unified\": \"1F9D1\",\n \"shortnames\": [\n \"adult\"\n ]\n },\n {\n \"unified\": \"1F468\",\n \"shortnames\": [\n \"man\"\n ]\n },\n {\n \"unified\": \"1F9D4\",\n \"shortnames\": [\n \"bearded_person\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B0\",\n \"shortnames\": [\n \"red_haired_man\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B1\",\n \"shortnames\": [\n \"curly_haired_man\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B3\",\n \"shortnames\": [\n \"white_haired_man\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9B2\",\n \"shortnames\": [\n \"bald_man\"\n ]\n },\n {\n \"unified\": \"1F469\",\n \"shortnames\": [\n \"woman\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B0\",\n \"shortnames\": [\n \"red_haired_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B0\",\n \"shortnames\": [\n \"red_haired_person\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B1\",\n \"shortnames\": [\n \"curly_haired_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B1\",\n \"shortnames\": [\n \"curly_haired_person\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B3\",\n \"shortnames\": [\n \"white_haired_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B3\",\n \"shortnames\": [\n \"white_haired_person\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9B2\",\n \"shortnames\": [\n \"bald_woman\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9B2\",\n \"shortnames\": [\n \"bald_person\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2640-FE0F\",\n \"shortnames\": [\n \"blond-haired-woman\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2642-FE0F\",\n \"shortnames\": [\n \"blond-haired-man\",\n \"person_with_blond_hair\"\n ]\n },\n {\n \"unified\": \"1F9D3\",\n \"shortnames\": [\n \"older_adult\"\n ]\n },\n {\n \"unified\": \"1F474\",\n \"shortnames\": [\n \"older_man\"\n ]\n },\n {\n \"unified\": \"1F475\",\n \"shortnames\": [\n \"older_woman\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-frowning\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-frowning\",\n \"person_frowning\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-pouting\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-pouting\",\n \"person_with_pouting_face\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-no\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-no\",\n \"no_good\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-ok\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-ok\",\n \"ok_woman\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-tipping-hand\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-tipping-hand\",\n \"information_desk_person\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-raising-hand\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-raising-hand\",\n \"raising_hand\"\n ]\n },\n {\n \"unified\": \"1F9CF\",\n \"shortnames\": [\n \"deaf_person\"\n ]\n },\n {\n \"unified\": \"1F9CF-200D-2642-FE0F\",\n \"shortnames\": [\n \"deaf_man\"\n ]\n },\n {\n \"unified\": \"1F9CF-200D-2640-FE0F\",\n \"shortnames\": [\n \"deaf_woman\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bowing\",\n \"bow\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bowing\"\n ]\n },\n {\n \"unified\": \"1F926\",\n \"shortnames\": [\n \"face_palm\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-facepalming\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-facepalming\"\n ]\n },\n {\n \"unified\": \"1F937\",\n \"shortnames\": [\n \"shrug\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-shrugging\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-shrugging\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-2695-FE0F\",\n \"shortnames\": [\n \"health_worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2695-FE0F\",\n \"shortnames\": [\n \"male-doctor\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2695-FE0F\",\n \"shortnames\": [\n \"female-doctor\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F393\",\n \"shortnames\": [\n \"student\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F393\",\n \"shortnames\": [\n \"male-student\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F393\",\n \"shortnames\": [\n \"female-student\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3EB\",\n \"shortnames\": [\n \"teacher\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3EB\",\n \"shortnames\": [\n \"male-teacher\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3EB\",\n \"shortnames\": [\n \"female-teacher\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-2696-FE0F\",\n \"shortnames\": [\n \"judge\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2696-FE0F\",\n \"shortnames\": [\n \"male-judge\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2696-FE0F\",\n \"shortnames\": [\n \"female-judge\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F33E\",\n \"shortnames\": [\n \"farmer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F33E\",\n \"shortnames\": [\n \"male-farmer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F33E\",\n \"shortnames\": [\n \"female-farmer\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F373\",\n \"shortnames\": [\n \"cook\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F373\",\n \"shortnames\": [\n \"male-cook\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F373\",\n \"shortnames\": [\n \"female-cook\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F527\",\n \"shortnames\": [\n \"mechanic\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F527\",\n \"shortnames\": [\n \"male-mechanic\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F527\",\n \"shortnames\": [\n \"female-mechanic\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3ED\",\n \"shortnames\": [\n \"factory_worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3ED\",\n \"shortnames\": [\n \"male-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3ED\",\n \"shortnames\": [\n \"female-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F4BC\",\n \"shortnames\": [\n \"office_worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BC\",\n \"shortnames\": [\n \"male-office-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BC\",\n \"shortnames\": [\n \"female-office-worker\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F52C\",\n \"shortnames\": [\n \"scientist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F52C\",\n \"shortnames\": [\n \"male-scientist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F52C\",\n \"shortnames\": [\n \"female-scientist\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F4BB\",\n \"shortnames\": [\n \"technologist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BB\",\n \"shortnames\": [\n \"male-technologist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BB\",\n \"shortnames\": [\n \"female-technologist\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3A4\",\n \"shortnames\": [\n \"singer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A4\",\n \"shortnames\": [\n \"male-singer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A4\",\n \"shortnames\": [\n \"female-singer\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F3A8\",\n \"shortnames\": [\n \"artist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A8\",\n \"shortnames\": [\n \"male-artist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A8\",\n \"shortnames\": [\n \"female-artist\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-2708-FE0F\",\n \"shortnames\": [\n \"pilot\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2708-FE0F\",\n \"shortnames\": [\n \"male-pilot\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2708-FE0F\",\n \"shortnames\": [\n \"female-pilot\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F680\",\n \"shortnames\": [\n \"astronaut\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F680\",\n \"shortnames\": [\n \"male-astronaut\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F680\",\n \"shortnames\": [\n \"female-astronaut\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F692\",\n \"shortnames\": [\n \"firefighter\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F692\",\n \"shortnames\": [\n \"male-firefighter\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F692\",\n \"shortnames\": [\n \"female-firefighter\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-police-officer\",\n \"cop\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-police-officer\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-detective\",\n \"sleuth_or_spy\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-detective\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-guard\",\n \"guardsman\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-guard\"\n ]\n },\n {\n \"unified\": \"1F977\",\n \"shortnames\": [\n \"ninja\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-construction-worker\",\n \"construction_worker\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-construction-worker\"\n ]\n },\n {\n \"unified\": \"1F934\",\n \"shortnames\": [\n \"prince\"\n ]\n },\n {\n \"unified\": \"1F478\",\n \"shortnames\": [\n \"princess\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wearing-turban\",\n \"man_with_turban\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wearing-turban\"\n ]\n },\n {\n \"unified\": \"1F472\",\n \"shortnames\": [\n \"man_with_gua_pi_mao\"\n ]\n },\n {\n \"unified\": \"1F9D5\",\n \"shortnames\": [\n \"person_with_headscarf\"\n ]\n },\n {\n \"unified\": \"1F935-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_tuxedo\"\n ]\n },\n {\n \"unified\": \"1F935-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_tuxedo\"\n ]\n },\n {\n \"unified\": \"1F470\",\n \"shortnames\": [\n \"bride_with_veil\"\n ]\n },\n {\n \"unified\": \"1F470-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_with_veil\"\n ]\n },\n {\n \"unified\": \"1F470-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_with_veil\"\n ]\n },\n {\n \"unified\": \"1F930\",\n \"shortnames\": [\n \"pregnant_woman\"\n ]\n },\n {\n \"unified\": \"1F931\",\n \"shortnames\": [\n \"breast-feeding\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F37C\",\n \"shortnames\": [\n \"woman_feeding_baby\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F37C\",\n \"shortnames\": [\n \"man_feeding_baby\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F37C\",\n \"shortnames\": [\n \"person_feeding_baby\"\n ]\n },\n {\n \"unified\": \"1F47C\",\n \"shortnames\": [\n \"angel\"\n ]\n },\n {\n \"unified\": \"1F385\",\n \"shortnames\": [\n \"santa\"\n ]\n },\n {\n \"unified\": \"1F936\",\n \"shortnames\": [\n \"mrs_claus\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F384\",\n \"shortnames\": [\n \"mx_claus\"\n ]\n },\n {\n \"unified\": \"1F9B8\",\n \"shortnames\": [\n \"superhero\"\n ]\n },\n {\n \"unified\": \"1F9B8-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_superhero\"\n ]\n },\n {\n \"unified\": \"1F9B8-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_superhero\"\n ]\n },\n {\n \"unified\": \"1F9B9\",\n \"shortnames\": [\n \"supervillain\"\n ]\n },\n {\n \"unified\": \"1F9B9-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_supervillain\"\n ]\n },\n {\n \"unified\": \"1F9B9-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_supervillain\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_mage\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_mage\",\n \"mage\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_fairy\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_fairy\",\n \"fairy\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_vampire\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_vampire\",\n \"vampire\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2642-FE0F\",\n \"shortnames\": [\n \"merman\",\n \"merperson\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2640-FE0F\",\n \"shortnames\": [\n \"mermaid\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_elf\",\n \"elf\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_elf\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_genie\",\n \"genie\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_genie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_zombie\",\n \"zombie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_zombie\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-massage\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-massage\",\n \"massage\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-haircut\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-haircut\",\n \"haircut\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-walking\",\n \"walking\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-walking\"\n ]\n },\n {\n \"unified\": \"1F9CD\",\n \"shortnames\": [\n \"standing_person\"\n ]\n },\n {\n \"unified\": \"1F9CD-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_standing\"\n ]\n },\n {\n \"unified\": \"1F9CD-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_standing\"\n ]\n },\n {\n \"unified\": \"1F9CE\",\n \"shortnames\": [\n \"kneeling_person\"\n ]\n },\n {\n \"unified\": \"1F9CE-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_kneeling\"\n ]\n },\n {\n \"unified\": \"1F9CE-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_kneeling\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9AF\",\n \"shortnames\": [\n \"person_with_probing_cane\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9AF\",\n \"shortnames\": [\n \"man_with_probing_cane\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9AF\",\n \"shortnames\": [\n \"woman_with_probing_cane\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9BC\",\n \"shortnames\": [\n \"person_in_motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9BC\",\n \"shortnames\": [\n \"man_in_motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9BC\",\n \"shortnames\": [\n \"woman_in_motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F9BD\",\n \"shortnames\": [\n \"person_in_manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F9BD\",\n \"shortnames\": [\n \"man_in_manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F9BD\",\n \"shortnames\": [\n \"woman_in_manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-running\",\n \"runner\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-running\"\n ]\n },\n {\n \"unified\": \"1F483\",\n \"shortnames\": [\n \"dancer\"\n ]\n },\n {\n \"unified\": \"1F57A\",\n \"shortnames\": [\n \"man_dancing\"\n ]\n },\n {\n \"unified\": \"1F574-FE0F\",\n \"shortnames\": [\n \"man_in_business_suit_levitating\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-with-bunny-ears-partying\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-with-bunny-ears-partying\",\n \"dancers\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_steamy_room\",\n \"person_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_climbing\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_climbing\",\n \"person_climbing\"\n ]\n },\n {\n \"unified\": \"1F93A\",\n \"shortnames\": [\n \"fencer\"\n ]\n },\n {\n \"unified\": \"1F3C7\",\n \"shortnames\": [\n \"horse_racing\"\n ]\n },\n {\n \"unified\": \"26F7-FE0F\",\n \"shortnames\": [\n \"skier\"\n ]\n },\n {\n \"unified\": \"1F3C2\",\n \"shortnames\": [\n \"snowboarder\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-golfing\",\n \"golfer\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-golfing\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-surfing\",\n \"surfer\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-surfing\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-rowing-boat\",\n \"rowboat\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-rowing-boat\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-swimming\",\n \"swimmer\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-swimming\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bouncing-ball\",\n \"person_with_ball\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bouncing-ball\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-lifting-weights\",\n \"weight_lifter\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-lifting-weights\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-biking\",\n \"bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-biking\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-mountain-biking\",\n \"mountain_bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-mountain-biking\"\n ]\n },\n {\n \"unified\": \"1F938\",\n \"shortnames\": [\n \"person_doing_cartwheel\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F93C\",\n \"shortnames\": [\n \"wrestlers\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93D\",\n \"shortnames\": [\n \"water_polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93E\",\n \"shortnames\": [\n \"handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F939\",\n \"shortnames\": [\n \"juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-juggling\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_lotus_position\",\n \"person_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F6C0\",\n \"shortnames\": [\n \"bath\"\n ]\n },\n {\n \"unified\": \"1F6CC\",\n \"shortnames\": [\n \"sleeping_accommodation\"\n ]\n },\n {\n \"unified\": \"1F9D1-200D-1F91D-200D-1F9D1\",\n \"shortnames\": [\n \"people_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F46D\",\n \"shortnames\": [\n \"two_women_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F46B\",\n \"shortnames\": [\n \"couple\"\n ]\n },\n {\n \"unified\": \"1F46C\",\n \"shortnames\": [\n \"two_men_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"woman-kiss-man\",\n \"couplekiss\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"man-kiss-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"shortnames\": [\n \"woman-kiss-woman\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"woman-heart-man\",\n \"couple_with_heart\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"man-heart-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"shortnames\": [\n \"woman-heart-woman\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy\",\n \"family\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466\",\n \"shortnames\": [\n \"man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467\",\n \"shortnames\": [\n \"man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F5E3-FE0F\",\n \"shortnames\": [\n \"speaking_head_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F464\",\n \"shortnames\": [\n \"bust_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F465\",\n \"shortnames\": [\n \"busts_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1FAC2\",\n \"shortnames\": [\n \"people_hugging\"\n ]\n },\n {\n \"unified\": \"1F463\",\n \"shortnames\": [\n \"footprints\"\n ]\n },\n {\n \"unified\": \"1F935\",\n \"shortnames\": [\n \"man_in_tuxedo\"\n ]\n }\n ]\n },\n {\n \"name\": \"Animals & Nature\",\n \"emojis\": [\n {\n \"unified\": \"1F435\",\n \"shortnames\": [\n \"monkey_face\"\n ]\n },\n {\n \"unified\": \"1F412\",\n \"shortnames\": [\n \"monkey\"\n ]\n },\n {\n \"unified\": \"1F98D\",\n \"shortnames\": [\n \"gorilla\"\n ]\n },\n {\n \"unified\": \"1F9A7\",\n \"shortnames\": [\n \"orangutan\"\n ]\n },\n {\n \"unified\": \"1F436\",\n \"shortnames\": [\n \"dog\"\n ]\n },\n {\n \"unified\": \"1F415\",\n \"shortnames\": [\n \"dog2\"\n ]\n },\n {\n \"unified\": \"1F9AE\",\n \"shortnames\": [\n \"guide_dog\"\n ]\n },\n {\n \"unified\": \"1F415-200D-1F9BA\",\n \"shortnames\": [\n \"service_dog\"\n ]\n },\n {\n \"unified\": \"1F429\",\n \"shortnames\": [\n \"poodle\"\n ]\n },\n {\n \"unified\": \"1F43A\",\n \"shortnames\": [\n \"wolf\"\n ]\n },\n {\n \"unified\": \"1F98A\",\n \"shortnames\": [\n \"fox_face\"\n ]\n },\n {\n \"unified\": \"1F99D\",\n \"shortnames\": [\n \"raccoon\"\n ]\n },\n {\n \"unified\": \"1F431\",\n \"shortnames\": [\n \"cat\"\n ]\n },\n {\n \"unified\": \"1F408\",\n \"shortnames\": [\n \"cat2\"\n ]\n },\n {\n \"unified\": \"1F408-200D-2B1B\",\n \"shortnames\": [\n \"black_cat\"\n ]\n },\n {\n \"unified\": \"1F981\",\n \"shortnames\": [\n \"lion_face\"\n ]\n },\n {\n \"unified\": \"1F42F\",\n \"shortnames\": [\n \"tiger\"\n ]\n },\n {\n \"unified\": \"1F405\",\n \"shortnames\": [\n \"tiger2\"\n ]\n },\n {\n \"unified\": \"1F406\",\n \"shortnames\": [\n \"leopard\"\n ]\n },\n {\n \"unified\": \"1F434\",\n \"shortnames\": [\n \"horse\"\n ]\n },\n {\n \"unified\": \"1F40E\",\n \"shortnames\": [\n \"racehorse\"\n ]\n },\n {\n \"unified\": \"1F984\",\n \"shortnames\": [\n \"unicorn_face\"\n ]\n },\n {\n \"unified\": \"1F993\",\n \"shortnames\": [\n \"zebra_face\"\n ]\n },\n {\n \"unified\": \"1F98C\",\n \"shortnames\": [\n \"deer\"\n ]\n },\n {\n \"unified\": \"1F9AC\",\n \"shortnames\": [\n \"bison\"\n ]\n },\n {\n \"unified\": \"1F42E\",\n \"shortnames\": [\n \"cow\"\n ]\n },\n {\n \"unified\": \"1F402\",\n \"shortnames\": [\n \"ox\"\n ]\n },\n {\n \"unified\": \"1F403\",\n \"shortnames\": [\n \"water_buffalo\"\n ]\n },\n {\n \"unified\": \"1F404\",\n \"shortnames\": [\n \"cow2\"\n ]\n },\n {\n \"unified\": \"1F437\",\n \"shortnames\": [\n \"pig\"\n ]\n },\n {\n \"unified\": \"1F416\",\n \"shortnames\": [\n \"pig2\"\n ]\n },\n {\n \"unified\": \"1F417\",\n \"shortnames\": [\n \"boar\"\n ]\n },\n {\n \"unified\": \"1F43D\",\n \"shortnames\": [\n \"pig_nose\"\n ]\n },\n {\n \"unified\": \"1F40F\",\n \"shortnames\": [\n \"ram\"\n ]\n },\n {\n \"unified\": \"1F411\",\n \"shortnames\": [\n \"sheep\"\n ]\n },\n {\n \"unified\": \"1F410\",\n \"shortnames\": [\n \"goat\"\n ]\n },\n {\n \"unified\": \"1F42A\",\n \"shortnames\": [\n \"dromedary_camel\"\n ]\n },\n {\n \"unified\": \"1F42B\",\n \"shortnames\": [\n \"camel\"\n ]\n },\n {\n \"unified\": \"1F999\",\n \"shortnames\": [\n \"llama\"\n ]\n },\n {\n \"unified\": \"1F992\",\n \"shortnames\": [\n \"giraffe_face\"\n ]\n },\n {\n \"unified\": \"1F418\",\n \"shortnames\": [\n \"elephant\"\n ]\n },\n {\n \"unified\": \"1F9A3\",\n \"shortnames\": [\n \"mammoth\"\n ]\n },\n {\n \"unified\": \"1F98F\",\n \"shortnames\": [\n \"rhinoceros\"\n ]\n },\n {\n \"unified\": \"1F99B\",\n \"shortnames\": [\n \"hippopotamus\"\n ]\n },\n {\n \"unified\": \"1F42D\",\n \"shortnames\": [\n \"mouse\"\n ]\n },\n {\n \"unified\": \"1F401\",\n \"shortnames\": [\n \"mouse2\"\n ]\n },\n {\n \"unified\": \"1F400\",\n \"shortnames\": [\n \"rat\"\n ]\n },\n {\n \"unified\": \"1F439\",\n \"shortnames\": [\n \"hamster\"\n ]\n },\n {\n \"unified\": \"1F430\",\n \"shortnames\": [\n \"rabbit\"\n ]\n },\n {\n \"unified\": \"1F407\",\n \"shortnames\": [\n \"rabbit2\"\n ]\n },\n {\n \"unified\": \"1F43F-FE0F\",\n \"shortnames\": [\n \"chipmunk\"\n ]\n },\n {\n \"unified\": \"1F9AB\",\n \"shortnames\": [\n \"beaver\"\n ]\n },\n {\n \"unified\": \"1F994\",\n \"shortnames\": [\n \"hedgehog\"\n ]\n },\n {\n \"unified\": \"1F987\",\n \"shortnames\": [\n \"bat\"\n ]\n },\n {\n \"unified\": \"1F43B\",\n \"shortnames\": [\n \"bear\"\n ]\n },\n {\n \"unified\": \"1F43B-200D-2744-FE0F\",\n \"shortnames\": [\n \"polar_bear\"\n ]\n },\n {\n \"unified\": \"1F428\",\n \"shortnames\": [\n \"koala\"\n ]\n },\n {\n \"unified\": \"1F43C\",\n \"shortnames\": [\n \"panda_face\"\n ]\n },\n {\n \"unified\": \"1F9A5\",\n \"shortnames\": [\n \"sloth\"\n ]\n },\n {\n \"unified\": \"1F9A6\",\n \"shortnames\": [\n \"otter\"\n ]\n },\n {\n \"unified\": \"1F9A8\",\n \"shortnames\": [\n \"skunk\"\n ]\n },\n {\n \"unified\": \"1F998\",\n \"shortnames\": [\n \"kangaroo\"\n ]\n },\n {\n \"unified\": \"1F9A1\",\n \"shortnames\": [\n \"badger\"\n ]\n },\n {\n \"unified\": \"1F43E\",\n \"shortnames\": [\n \"feet\"\n ]\n },\n {\n \"unified\": \"1F983\",\n \"shortnames\": [\n \"turkey\"\n ]\n },\n {\n \"unified\": \"1F414\",\n \"shortnames\": [\n \"chicken\"\n ]\n },\n {\n \"unified\": \"1F413\",\n \"shortnames\": [\n \"rooster\"\n ]\n },\n {\n \"unified\": \"1F423\",\n \"shortnames\": [\n \"hatching_chick\"\n ]\n },\n {\n \"unified\": \"1F424\",\n \"shortnames\": [\n \"baby_chick\"\n ]\n },\n {\n \"unified\": \"1F425\",\n \"shortnames\": [\n \"hatched_chick\"\n ]\n },\n {\n \"unified\": \"1F426\",\n \"shortnames\": [\n \"bird\"\n ]\n },\n {\n \"unified\": \"1F427\",\n \"shortnames\": [\n \"penguin\"\n ]\n },\n {\n \"unified\": \"1F54A-FE0F\",\n \"shortnames\": [\n \"dove_of_peace\"\n ]\n },\n {\n \"unified\": \"1F985\",\n \"shortnames\": [\n \"eagle\"\n ]\n },\n {\n \"unified\": \"1F986\",\n \"shortnames\": [\n \"duck\"\n ]\n },\n {\n \"unified\": \"1F9A2\",\n \"shortnames\": [\n \"swan\"\n ]\n },\n {\n \"unified\": \"1F989\",\n \"shortnames\": [\n \"owl\"\n ]\n },\n {\n \"unified\": \"1F9A4\",\n \"shortnames\": [\n \"dodo\"\n ]\n },\n {\n \"unified\": \"1FAB6\",\n \"shortnames\": [\n \"feather\"\n ]\n },\n {\n \"unified\": \"1F9A9\",\n \"shortnames\": [\n \"flamingo\"\n ]\n },\n {\n \"unified\": \"1F99A\",\n \"shortnames\": [\n \"peacock\"\n ]\n },\n {\n \"unified\": \"1F99C\",\n \"shortnames\": [\n \"parrot\"\n ]\n },\n {\n \"unified\": \"1F438\",\n \"shortnames\": [\n \"frog\"\n ]\n },\n {\n \"unified\": \"1F40A\",\n \"shortnames\": [\n \"crocodile\"\n ]\n },\n {\n \"unified\": \"1F422\",\n \"shortnames\": [\n \"turtle\"\n ]\n },\n {\n \"unified\": \"1F98E\",\n \"shortnames\": [\n \"lizard\"\n ]\n },\n {\n \"unified\": \"1F40D\",\n \"shortnames\": [\n \"snake\"\n ]\n },\n {\n \"unified\": \"1F432\",\n \"shortnames\": [\n \"dragon_face\"\n ]\n },\n {\n \"unified\": \"1F409\",\n \"shortnames\": [\n \"dragon\"\n ]\n },\n {\n \"unified\": \"1F995\",\n \"shortnames\": [\n \"sauropod\"\n ]\n },\n {\n \"unified\": \"1F996\",\n \"shortnames\": [\n \"t-rex\"\n ]\n },\n {\n \"unified\": \"1F433\",\n \"shortnames\": [\n \"whale\"\n ]\n },\n {\n \"unified\": \"1F40B\",\n \"shortnames\": [\n \"whale2\"\n ]\n },\n {\n \"unified\": \"1F42C\",\n \"shortnames\": [\n \"dolphin\"\n ]\n },\n {\n \"unified\": \"1F9AD\",\n \"shortnames\": [\n \"seal\"\n ]\n },\n {\n \"unified\": \"1F41F\",\n \"shortnames\": [\n \"fish\"\n ]\n },\n {\n \"unified\": \"1F420\",\n \"shortnames\": [\n \"tropical_fish\"\n ]\n },\n {\n \"unified\": \"1F421\",\n \"shortnames\": [\n \"blowfish\"\n ]\n },\n {\n \"unified\": \"1F988\",\n \"shortnames\": [\n \"shark\"\n ]\n },\n {\n \"unified\": \"1F419\",\n \"shortnames\": [\n \"octopus\"\n ]\n },\n {\n \"unified\": \"1F41A\",\n \"shortnames\": [\n \"shell\"\n ]\n },\n {\n \"unified\": \"1F40C\",\n \"shortnames\": [\n \"snail\"\n ]\n },\n {\n \"unified\": \"1F98B\",\n \"shortnames\": [\n \"butterfly\"\n ]\n },\n {\n \"unified\": \"1F41B\",\n \"shortnames\": [\n \"bug\"\n ]\n },\n {\n \"unified\": \"1F41C\",\n \"shortnames\": [\n \"ant\"\n ]\n },\n {\n \"unified\": \"1F41D\",\n \"shortnames\": [\n \"bee\"\n ]\n },\n {\n \"unified\": \"1FAB2\",\n \"shortnames\": [\n \"beetle\"\n ]\n },\n {\n \"unified\": \"1F997\",\n \"shortnames\": [\n \"cricket\"\n ]\n },\n {\n \"unified\": \"1FAB3\",\n \"shortnames\": [\n \"cockroach\"\n ]\n },\n {\n \"unified\": \"1F577-FE0F\",\n \"shortnames\": [\n \"spider\"\n ]\n },\n {\n \"unified\": \"1F578-FE0F\",\n \"shortnames\": [\n \"spider_web\"\n ]\n },\n {\n \"unified\": \"1F982\",\n \"shortnames\": [\n \"scorpion\"\n ]\n },\n {\n \"unified\": \"1F99F\",\n \"shortnames\": [\n \"mosquito\"\n ]\n },\n {\n \"unified\": \"1FAB0\",\n \"shortnames\": [\n \"fly\"\n ]\n },\n {\n \"unified\": \"1FAB1\",\n \"shortnames\": [\n \"worm\"\n ]\n },\n {\n \"unified\": \"1F9A0\",\n \"shortnames\": [\n \"microbe\"\n ]\n },\n {\n \"unified\": \"1F490\",\n \"shortnames\": [\n \"bouquet\"\n ]\n },\n {\n \"unified\": \"1F338\",\n \"shortnames\": [\n \"cherry_blossom\"\n ]\n },\n {\n \"unified\": \"1F4AE\",\n \"shortnames\": [\n \"white_flower\"\n ]\n },\n {\n \"unified\": \"1F3F5-FE0F\",\n \"shortnames\": [\n \"rosette\"\n ]\n },\n {\n \"unified\": \"1F339\",\n \"shortnames\": [\n \"rose\"\n ]\n },\n {\n \"unified\": \"1F940\",\n \"shortnames\": [\n \"wilted_flower\"\n ]\n },\n {\n \"unified\": \"1F33A\",\n \"shortnames\": [\n \"hibiscus\"\n ]\n },\n {\n \"unified\": \"1F33B\",\n \"shortnames\": [\n \"sunflower\"\n ]\n },\n {\n \"unified\": \"1F33C\",\n \"shortnames\": [\n \"blossom\"\n ]\n },\n {\n \"unified\": \"1F337\",\n \"shortnames\": [\n \"tulip\"\n ]\n },\n {\n \"unified\": \"1F331\",\n \"shortnames\": [\n \"seedling\"\n ]\n },\n {\n \"unified\": \"1FAB4\",\n \"shortnames\": [\n \"potted_plant\"\n ]\n },\n {\n \"unified\": \"1F332\",\n \"shortnames\": [\n \"evergreen_tree\"\n ]\n },\n {\n \"unified\": \"1F333\",\n \"shortnames\": [\n \"deciduous_tree\"\n ]\n },\n {\n \"unified\": \"1F334\",\n \"shortnames\": [\n \"palm_tree\"\n ]\n },\n {\n \"unified\": \"1F335\",\n \"shortnames\": [\n \"cactus\"\n ]\n },\n {\n \"unified\": \"1F33E\",\n \"shortnames\": [\n \"ear_of_rice\"\n ]\n },\n {\n \"unified\": \"1F33F\",\n \"shortnames\": [\n \"herb\"\n ]\n },\n {\n \"unified\": \"2618-FE0F\",\n \"shortnames\": [\n \"shamrock\"\n ]\n },\n {\n \"unified\": \"1F340\",\n \"shortnames\": [\n \"four_leaf_clover\"\n ]\n },\n {\n \"unified\": \"1F341\",\n \"shortnames\": [\n \"maple_leaf\"\n ]\n },\n {\n \"unified\": \"1F342\",\n \"shortnames\": [\n \"fallen_leaf\"\n ]\n },\n {\n \"unified\": \"1F343\",\n \"shortnames\": [\n \"leaves\"\n ]\n },\n {\n \"unified\": \"1F41E\",\n \"shortnames\": [\n \"beetle\"\n ]\n }\n ]\n },\n {\n \"name\": \"Food & Drink\",\n \"emojis\": [\n {\n \"unified\": \"1F347\",\n \"shortnames\": [\n \"grapes\"\n ]\n },\n {\n \"unified\": \"1F348\",\n \"shortnames\": [\n \"melon\"\n ]\n },\n {\n \"unified\": \"1F349\",\n \"shortnames\": [\n \"watermelon\"\n ]\n },\n {\n \"unified\": \"1F34A\",\n \"shortnames\": [\n \"tangerine\"\n ]\n },\n {\n \"unified\": \"1F34B\",\n \"shortnames\": [\n \"lemon\"\n ]\n },\n {\n \"unified\": \"1F34C\",\n \"shortnames\": [\n \"banana\"\n ]\n },\n {\n \"unified\": \"1F34D\",\n \"shortnames\": [\n \"pineapple\"\n ]\n },\n {\n \"unified\": \"1F96D\",\n \"shortnames\": [\n \"mango\"\n ]\n },\n {\n \"unified\": \"1F34E\",\n \"shortnames\": [\n \"apple\"\n ]\n },\n {\n \"unified\": \"1F34F\",\n \"shortnames\": [\n \"green_apple\"\n ]\n },\n {\n \"unified\": \"1F350\",\n \"shortnames\": [\n \"pear\"\n ]\n },\n {\n \"unified\": \"1F351\",\n \"shortnames\": [\n \"peach\"\n ]\n },\n {\n \"unified\": \"1F352\",\n \"shortnames\": [\n \"cherries\"\n ]\n },\n {\n \"unified\": \"1F353\",\n \"shortnames\": [\n \"strawberry\"\n ]\n },\n {\n \"unified\": \"1FAD0\",\n \"shortnames\": [\n \"blueberries\"\n ]\n },\n {\n \"unified\": \"1F95D\",\n \"shortnames\": [\n \"kiwifruit\"\n ]\n },\n {\n \"unified\": \"1F345\",\n \"shortnames\": [\n \"tomato\"\n ]\n },\n {\n \"unified\": \"1FAD2\",\n \"shortnames\": [\n \"olive\"\n ]\n },\n {\n \"unified\": \"1F965\",\n \"shortnames\": [\n \"coconut\"\n ]\n },\n {\n \"unified\": \"1F951\",\n \"shortnames\": [\n \"avocado\"\n ]\n },\n {\n \"unified\": \"1F346\",\n \"shortnames\": [\n \"eggplant\"\n ]\n },\n {\n \"unified\": \"1F954\",\n \"shortnames\": [\n \"potato\"\n ]\n },\n {\n \"unified\": \"1F955\",\n \"shortnames\": [\n \"carrot\"\n ]\n },\n {\n \"unified\": \"1F33D\",\n \"shortnames\": [\n \"corn\"\n ]\n },\n {\n \"unified\": \"1F336-FE0F\",\n \"shortnames\": [\n \"hot_pepper\"\n ]\n },\n {\n \"unified\": \"1FAD1\",\n \"shortnames\": [\n \"bell_pepper\"\n ]\n },\n {\n \"unified\": \"1F952\",\n \"shortnames\": [\n \"cucumber\"\n ]\n },\n {\n \"unified\": \"1F96C\",\n \"shortnames\": [\n \"leafy_green\"\n ]\n },\n {\n \"unified\": \"1F966\",\n \"shortnames\": [\n \"broccoli\"\n ]\n },\n {\n \"unified\": \"1F9C4\",\n \"shortnames\": [\n \"garlic\"\n ]\n },\n {\n \"unified\": \"1F9C5\",\n \"shortnames\": [\n \"onion\"\n ]\n },\n {\n \"unified\": \"1F344\",\n \"shortnames\": [\n \"mushroom\"\n ]\n },\n {\n \"unified\": \"1F95C\",\n \"shortnames\": [\n \"peanuts\"\n ]\n },\n {\n \"unified\": \"1F330\",\n \"shortnames\": [\n \"chestnut\"\n ]\n },\n {\n \"unified\": \"1F35E\",\n \"shortnames\": [\n \"bread\"\n ]\n },\n {\n \"unified\": \"1F950\",\n \"shortnames\": [\n \"croissant\"\n ]\n },\n {\n \"unified\": \"1F956\",\n \"shortnames\": [\n \"baguette_bread\"\n ]\n },\n {\n \"unified\": \"1FAD3\",\n \"shortnames\": [\n \"flatbread\"\n ]\n },\n {\n \"unified\": \"1F968\",\n \"shortnames\": [\n \"pretzel\"\n ]\n },\n {\n \"unified\": \"1F96F\",\n \"shortnames\": [\n \"bagel\"\n ]\n },\n {\n \"unified\": \"1F95E\",\n \"shortnames\": [\n \"pancakes\"\n ]\n },\n {\n \"unified\": \"1F9C7\",\n \"shortnames\": [\n \"waffle\"\n ]\n },\n {\n \"unified\": \"1F9C0\",\n \"shortnames\": [\n \"cheese_wedge\"\n ]\n },\n {\n \"unified\": \"1F356\",\n \"shortnames\": [\n \"meat_on_bone\"\n ]\n },\n {\n \"unified\": \"1F357\",\n \"shortnames\": [\n \"poultry_leg\"\n ]\n },\n {\n \"unified\": \"1F969\",\n \"shortnames\": [\n \"cut_of_meat\"\n ]\n },\n {\n \"unified\": \"1F953\",\n \"shortnames\": [\n \"bacon\"\n ]\n },\n {\n \"unified\": \"1F354\",\n \"shortnames\": [\n \"hamburger\"\n ]\n },\n {\n \"unified\": \"1F35F\",\n \"shortnames\": [\n \"fries\"\n ]\n },\n {\n \"unified\": \"1F355\",\n \"shortnames\": [\n \"pizza\"\n ]\n },\n {\n \"unified\": \"1F32D\",\n \"shortnames\": [\n \"hotdog\"\n ]\n },\n {\n \"unified\": \"1F96A\",\n \"shortnames\": [\n \"sandwich\"\n ]\n },\n {\n \"unified\": \"1F32E\",\n \"shortnames\": [\n \"taco\"\n ]\n },\n {\n \"unified\": \"1F32F\",\n \"shortnames\": [\n \"burrito\"\n ]\n },\n {\n \"unified\": \"1FAD4\",\n \"shortnames\": [\n \"tamale\"\n ]\n },\n {\n \"unified\": \"1F959\",\n \"shortnames\": [\n \"stuffed_flatbread\"\n ]\n },\n {\n \"unified\": \"1F9C6\",\n \"shortnames\": [\n \"falafel\"\n ]\n },\n {\n \"unified\": \"1F95A\",\n \"shortnames\": [\n \"egg\"\n ]\n },\n {\n \"unified\": \"1F373\",\n \"shortnames\": [\n \"fried_egg\"\n ]\n },\n {\n \"unified\": \"1F958\",\n \"shortnames\": [\n \"shallow_pan_of_food\"\n ]\n },\n {\n \"unified\": \"1F372\",\n \"shortnames\": [\n \"stew\"\n ]\n },\n {\n \"unified\": \"1FAD5\",\n \"shortnames\": [\n \"fondue\"\n ]\n },\n {\n \"unified\": \"1F963\",\n \"shortnames\": [\n \"bowl_with_spoon\"\n ]\n },\n {\n \"unified\": \"1F957\",\n \"shortnames\": [\n \"green_salad\"\n ]\n },\n {\n \"unified\": \"1F37F\",\n \"shortnames\": [\n \"popcorn\"\n ]\n },\n {\n \"unified\": \"1F9C8\",\n \"shortnames\": [\n \"butter\"\n ]\n },\n {\n \"unified\": \"1F9C2\",\n \"shortnames\": [\n \"salt\"\n ]\n },\n {\n \"unified\": \"1F96B\",\n \"shortnames\": [\n \"canned_food\"\n ]\n },\n {\n \"unified\": \"1F371\",\n \"shortnames\": [\n \"bento\"\n ]\n },\n {\n \"unified\": \"1F358\",\n \"shortnames\": [\n \"rice_cracker\"\n ]\n },\n {\n \"unified\": \"1F359\",\n \"shortnames\": [\n \"rice_ball\"\n ]\n },\n {\n \"unified\": \"1F35A\",\n \"shortnames\": [\n \"rice\"\n ]\n },\n {\n \"unified\": \"1F35B\",\n \"shortnames\": [\n \"curry\"\n ]\n },\n {\n \"unified\": \"1F35C\",\n \"shortnames\": [\n \"ramen\"\n ]\n },\n {\n \"unified\": \"1F35D\",\n \"shortnames\": [\n \"spaghetti\"\n ]\n },\n {\n \"unified\": \"1F360\",\n \"shortnames\": [\n \"sweet_potato\"\n ]\n },\n {\n \"unified\": \"1F362\",\n \"shortnames\": [\n \"oden\"\n ]\n },\n {\n \"unified\": \"1F363\",\n \"shortnames\": [\n \"sushi\"\n ]\n },\n {\n \"unified\": \"1F364\",\n \"shortnames\": [\n \"fried_shrimp\"\n ]\n },\n {\n \"unified\": \"1F365\",\n \"shortnames\": [\n \"fish_cake\"\n ]\n },\n {\n \"unified\": \"1F96E\",\n \"shortnames\": [\n \"moon_cake\"\n ]\n },\n {\n \"unified\": \"1F361\",\n \"shortnames\": [\n \"dango\"\n ]\n },\n {\n \"unified\": \"1F95F\",\n \"shortnames\": [\n \"dumpling\"\n ]\n },\n {\n \"unified\": \"1F960\",\n \"shortnames\": [\n \"fortune_cookie\"\n ]\n },\n {\n \"unified\": \"1F961\",\n \"shortnames\": [\n \"takeout_box\"\n ]\n },\n {\n \"unified\": \"1F980\",\n \"shortnames\": [\n \"crab\"\n ]\n },\n {\n \"unified\": \"1F99E\",\n \"shortnames\": [\n \"lobster\"\n ]\n },\n {\n \"unified\": \"1F990\",\n \"shortnames\": [\n \"shrimp\"\n ]\n },\n {\n \"unified\": \"1F991\",\n \"shortnames\": [\n \"squid\"\n ]\n },\n {\n \"unified\": \"1F9AA\",\n \"shortnames\": [\n \"oyster\"\n ]\n },\n {\n \"unified\": \"1F366\",\n \"shortnames\": [\n \"icecream\"\n ]\n },\n {\n \"unified\": \"1F367\",\n \"shortnames\": [\n \"shaved_ice\"\n ]\n },\n {\n \"unified\": \"1F368\",\n \"shortnames\": [\n \"ice_cream\"\n ]\n },\n {\n \"unified\": \"1F369\",\n \"shortnames\": [\n \"doughnut\"\n ]\n },\n {\n \"unified\": \"1F36A\",\n \"shortnames\": [\n \"cookie\"\n ]\n },\n {\n \"unified\": \"1F382\",\n \"shortnames\": [\n \"birthday\"\n ]\n },\n {\n \"unified\": \"1F370\",\n \"shortnames\": [\n \"cake\"\n ]\n },\n {\n \"unified\": \"1F9C1\",\n \"shortnames\": [\n \"cupcake\"\n ]\n },\n {\n \"unified\": \"1F967\",\n \"shortnames\": [\n \"pie\"\n ]\n },\n {\n \"unified\": \"1F36B\",\n \"shortnames\": [\n \"chocolate_bar\"\n ]\n },\n {\n \"unified\": \"1F36C\",\n \"shortnames\": [\n \"candy\"\n ]\n },\n {\n \"unified\": \"1F36D\",\n \"shortnames\": [\n \"lollipop\"\n ]\n },\n {\n \"unified\": \"1F36E\",\n \"shortnames\": [\n \"custard\"\n ]\n },\n {\n \"unified\": \"1F36F\",\n \"shortnames\": [\n \"honey_pot\"\n ]\n },\n {\n \"unified\": \"1F37C\",\n \"shortnames\": [\n \"baby_bottle\"\n ]\n },\n {\n \"unified\": \"1F95B\",\n \"shortnames\": [\n \"glass_of_milk\"\n ]\n },\n {\n \"unified\": \"2615\",\n \"shortnames\": [\n \"coffee\"\n ]\n },\n {\n \"unified\": \"1FAD6\",\n \"shortnames\": [\n \"teapot\"\n ]\n },\n {\n \"unified\": \"1F375\",\n \"shortnames\": [\n \"tea\"\n ]\n },\n {\n \"unified\": \"1F376\",\n \"shortnames\": [\n \"sake\"\n ]\n },\n {\n \"unified\": \"1F37E\",\n \"shortnames\": [\n \"champagne\"\n ]\n },\n {\n \"unified\": \"1F377\",\n \"shortnames\": [\n \"wine_glass\"\n ]\n },\n {\n \"unified\": \"1F378\",\n \"shortnames\": [\n \"cocktail\"\n ]\n },\n {\n \"unified\": \"1F379\",\n \"shortnames\": [\n \"tropical_drink\"\n ]\n },\n {\n \"unified\": \"1F37A\",\n \"shortnames\": [\n \"beer\"\n ]\n },\n {\n \"unified\": \"1F37B\",\n \"shortnames\": [\n \"beers\"\n ]\n },\n {\n \"unified\": \"1F942\",\n \"shortnames\": [\n \"clinking_glasses\"\n ]\n },\n {\n \"unified\": \"1F943\",\n \"shortnames\": [\n \"tumbler_glass\"\n ]\n },\n {\n \"unified\": \"1F964\",\n \"shortnames\": [\n \"cup_with_straw\"\n ]\n },\n {\n \"unified\": \"1F9CB\",\n \"shortnames\": [\n \"bubble_tea\"\n ]\n },\n {\n \"unified\": \"1F9C3\",\n \"shortnames\": [\n \"beverage_box\"\n ]\n },\n {\n \"unified\": \"1F9C9\",\n \"shortnames\": [\n \"mate_drink\"\n ]\n },\n {\n \"unified\": \"1F9CA\",\n \"shortnames\": [\n \"ice_cube\"\n ]\n },\n {\n \"unified\": \"1F962\",\n \"shortnames\": [\n \"chopsticks\"\n ]\n },\n {\n \"unified\": \"1F37D-FE0F\",\n \"shortnames\": [\n \"knife_fork_plate\"\n ]\n },\n {\n \"unified\": \"1F374\",\n \"shortnames\": [\n \"fork_and_knife\"\n ]\n },\n {\n \"unified\": \"1F944\",\n \"shortnames\": [\n \"spoon\"\n ]\n },\n {\n \"unified\": \"1F52A\",\n \"shortnames\": [\n \"hocho\"\n ]\n },\n {\n \"unified\": \"1F3FA\",\n \"shortnames\": [\n \"amphora\"\n ]\n }\n ]\n },\n {\n \"name\": \"Travel & Places\",\n \"emojis\": [\n {\n \"unified\": \"1F30D\",\n \"shortnames\": [\n \"earth_africa\"\n ]\n },\n {\n \"unified\": \"1F30E\",\n \"shortnames\": [\n \"earth_americas\"\n ]\n },\n {\n \"unified\": \"1F30F\",\n \"shortnames\": [\n \"earth_asia\"\n ]\n },\n {\n \"unified\": \"1F310\",\n \"shortnames\": [\n \"globe_with_meridians\"\n ]\n },\n {\n \"unified\": \"1F5FA-FE0F\",\n \"shortnames\": [\n \"world_map\"\n ]\n },\n {\n \"unified\": \"1F5FE\",\n \"shortnames\": [\n \"japan\"\n ]\n },\n {\n \"unified\": \"1F9ED\",\n \"shortnames\": [\n \"compass\"\n ]\n },\n {\n \"unified\": \"1F3D4-FE0F\",\n \"shortnames\": [\n \"snow_capped_mountain\"\n ]\n },\n {\n \"unified\": \"26F0-FE0F\",\n \"shortnames\": [\n \"mountain\"\n ]\n },\n {\n \"unified\": \"1F30B\",\n \"shortnames\": [\n \"volcano\"\n ]\n },\n {\n \"unified\": \"1F5FB\",\n \"shortnames\": [\n \"mount_fuji\"\n ]\n },\n {\n \"unified\": \"1F3D5-FE0F\",\n \"shortnames\": [\n \"camping\"\n ]\n },\n {\n \"unified\": \"1F3D6-FE0F\",\n \"shortnames\": [\n \"beach_with_umbrella\"\n ]\n },\n {\n \"unified\": \"1F3DC-FE0F\",\n \"shortnames\": [\n \"desert\"\n ]\n },\n {\n \"unified\": \"1F3DD-FE0F\",\n \"shortnames\": [\n \"desert_island\"\n ]\n },\n {\n \"unified\": \"1F3DE-FE0F\",\n \"shortnames\": [\n \"national_park\"\n ]\n },\n {\n \"unified\": \"1F3DF-FE0F\",\n \"shortnames\": [\n \"stadium\"\n ]\n },\n {\n \"unified\": \"1F3DB-FE0F\",\n \"shortnames\": [\n \"classical_building\"\n ]\n },\n {\n \"unified\": \"1F3D7-FE0F\",\n \"shortnames\": [\n \"building_construction\"\n ]\n },\n {\n \"unified\": \"1F9F1\",\n \"shortnames\": [\n \"bricks\"\n ]\n },\n {\n \"unified\": \"1FAA8\",\n \"shortnames\": [\n \"rock\"\n ]\n },\n {\n \"unified\": \"1FAB5\",\n \"shortnames\": [\n \"wood\"\n ]\n },\n {\n \"unified\": \"1F6D6\",\n \"shortnames\": [\n \"hut\"\n ]\n },\n {\n \"unified\": \"1F3D8-FE0F\",\n \"shortnames\": [\n \"house_buildings\"\n ]\n },\n {\n \"unified\": \"1F3DA-FE0F\",\n \"shortnames\": [\n \"derelict_house_building\"\n ]\n },\n {\n \"unified\": \"1F3E0\",\n \"shortnames\": [\n \"house\"\n ]\n },\n {\n \"unified\": \"1F3E1\",\n \"shortnames\": [\n \"house_with_garden\"\n ]\n },\n {\n \"unified\": \"1F3E2\",\n \"shortnames\": [\n \"office\"\n ]\n },\n {\n \"unified\": \"1F3E3\",\n \"shortnames\": [\n \"post_office\"\n ]\n },\n {\n \"unified\": \"1F3E4\",\n \"shortnames\": [\n \"european_post_office\"\n ]\n },\n {\n \"unified\": \"1F3E5\",\n \"shortnames\": [\n \"hospital\"\n ]\n },\n {\n \"unified\": \"1F3E6\",\n \"shortnames\": [\n \"bank\"\n ]\n },\n {\n \"unified\": \"1F3E8\",\n \"shortnames\": [\n \"hotel\"\n ]\n },\n {\n \"unified\": \"1F3E9\",\n \"shortnames\": [\n \"love_hotel\"\n ]\n },\n {\n \"unified\": \"1F3EA\",\n \"shortnames\": [\n \"convenience_store\"\n ]\n },\n {\n \"unified\": \"1F3EB\",\n \"shortnames\": [\n \"school\"\n ]\n },\n {\n \"unified\": \"1F3EC\",\n \"shortnames\": [\n \"department_store\"\n ]\n },\n {\n \"unified\": \"1F3ED\",\n \"shortnames\": [\n \"factory\"\n ]\n },\n {\n \"unified\": \"1F3EF\",\n \"shortnames\": [\n \"japanese_castle\"\n ]\n },\n {\n \"unified\": \"1F3F0\",\n \"shortnames\": [\n \"european_castle\"\n ]\n },\n {\n \"unified\": \"1F492\",\n \"shortnames\": [\n \"wedding\"\n ]\n },\n {\n \"unified\": \"1F5FC\",\n \"shortnames\": [\n \"tokyo_tower\"\n ]\n },\n {\n \"unified\": \"1F5FD\",\n \"shortnames\": [\n \"statue_of_liberty\"\n ]\n },\n {\n \"unified\": \"26EA\",\n \"shortnames\": [\n \"church\"\n ]\n },\n {\n \"unified\": \"1F54C\",\n \"shortnames\": [\n \"mosque\"\n ]\n },\n {\n \"unified\": \"1F6D5\",\n \"shortnames\": [\n \"hindu_temple\"\n ]\n },\n {\n \"unified\": \"1F54D\",\n \"shortnames\": [\n \"synagogue\"\n ]\n },\n {\n \"unified\": \"26E9-FE0F\",\n \"shortnames\": [\n \"shinto_shrine\"\n ]\n },\n {\n \"unified\": \"1F54B\",\n \"shortnames\": [\n \"kaaba\"\n ]\n },\n {\n \"unified\": \"26F2\",\n \"shortnames\": [\n \"fountain\"\n ]\n },\n {\n \"unified\": \"26FA\",\n \"shortnames\": [\n \"tent\"\n ]\n },\n {\n \"unified\": \"1F301\",\n \"shortnames\": [\n \"foggy\"\n ]\n },\n {\n \"unified\": \"1F303\",\n \"shortnames\": [\n \"night_with_stars\"\n ]\n },\n {\n \"unified\": \"1F3D9-FE0F\",\n \"shortnames\": [\n \"cityscape\"\n ]\n },\n {\n \"unified\": \"1F304\",\n \"shortnames\": [\n \"sunrise_over_mountains\"\n ]\n },\n {\n \"unified\": \"1F305\",\n \"shortnames\": [\n \"sunrise\"\n ]\n },\n {\n \"unified\": \"1F306\",\n \"shortnames\": [\n \"city_sunset\"\n ]\n },\n {\n \"unified\": \"1F307\",\n \"shortnames\": [\n \"city_sunrise\"\n ]\n },\n {\n \"unified\": \"1F309\",\n \"shortnames\": [\n \"bridge_at_night\"\n ]\n },\n {\n \"unified\": \"2668-FE0F\",\n \"shortnames\": [\n \"hotsprings\"\n ]\n },\n {\n \"unified\": \"1F3A0\",\n \"shortnames\": [\n \"carousel_horse\"\n ]\n },\n {\n \"unified\": \"1F3A1\",\n \"shortnames\": [\n \"ferris_wheel\"\n ]\n },\n {\n \"unified\": \"1F3A2\",\n \"shortnames\": [\n \"roller_coaster\"\n ]\n },\n {\n \"unified\": \"1F488\",\n \"shortnames\": [\n \"barber\"\n ]\n },\n {\n \"unified\": \"1F3AA\",\n \"shortnames\": [\n \"circus_tent\"\n ]\n },\n {\n \"unified\": \"1F682\",\n \"shortnames\": [\n \"steam_locomotive\"\n ]\n },\n {\n \"unified\": \"1F683\",\n \"shortnames\": [\n \"railway_car\"\n ]\n },\n {\n \"unified\": \"1F684\",\n \"shortnames\": [\n \"bullettrain_side\"\n ]\n },\n {\n \"unified\": \"1F685\",\n \"shortnames\": [\n \"bullettrain_front\"\n ]\n },\n {\n \"unified\": \"1F686\",\n \"shortnames\": [\n \"train2\"\n ]\n },\n {\n \"unified\": \"1F687\",\n \"shortnames\": [\n \"metro\"\n ]\n },\n {\n \"unified\": \"1F688\",\n \"shortnames\": [\n \"light_rail\"\n ]\n },\n {\n \"unified\": \"1F689\",\n \"shortnames\": [\n \"station\"\n ]\n },\n {\n \"unified\": \"1F68A\",\n \"shortnames\": [\n \"tram\"\n ]\n },\n {\n \"unified\": \"1F69D\",\n \"shortnames\": [\n \"monorail\"\n ]\n },\n {\n \"unified\": \"1F69E\",\n \"shortnames\": [\n \"mountain_railway\"\n ]\n },\n {\n \"unified\": \"1F68B\",\n \"shortnames\": [\n \"train\"\n ]\n },\n {\n \"unified\": \"1F68C\",\n \"shortnames\": [\n \"bus\"\n ]\n },\n {\n \"unified\": \"1F68D\",\n \"shortnames\": [\n \"oncoming_bus\"\n ]\n },\n {\n \"unified\": \"1F68E\",\n \"shortnames\": [\n \"trolleybus\"\n ]\n },\n {\n \"unified\": \"1F690\",\n \"shortnames\": [\n \"minibus\"\n ]\n },\n {\n \"unified\": \"1F691\",\n \"shortnames\": [\n \"ambulance\"\n ]\n },\n {\n \"unified\": \"1F692\",\n \"shortnames\": [\n \"fire_engine\"\n ]\n },\n {\n \"unified\": \"1F693\",\n \"shortnames\": [\n \"police_car\"\n ]\n },\n {\n \"unified\": \"1F694\",\n \"shortnames\": [\n \"oncoming_police_car\"\n ]\n },\n {\n \"unified\": \"1F695\",\n \"shortnames\": [\n \"taxi\"\n ]\n },\n {\n \"unified\": \"1F696\",\n \"shortnames\": [\n \"oncoming_taxi\"\n ]\n },\n {\n \"unified\": \"1F697\",\n \"shortnames\": [\n \"car\"\n ]\n },\n {\n \"unified\": \"1F698\",\n \"shortnames\": [\n \"oncoming_automobile\"\n ]\n },\n {\n \"unified\": \"1F699\",\n \"shortnames\": [\n \"blue_car\"\n ]\n },\n {\n \"unified\": \"1F6FB\",\n \"shortnames\": [\n \"pickup_truck\"\n ]\n },\n {\n \"unified\": \"1F69A\",\n \"shortnames\": [\n \"truck\"\n ]\n },\n {\n \"unified\": \"1F69B\",\n \"shortnames\": [\n \"articulated_lorry\"\n ]\n },\n {\n \"unified\": \"1F69C\",\n \"shortnames\": [\n \"tractor\"\n ]\n },\n {\n \"unified\": \"1F3CE-FE0F\",\n \"shortnames\": [\n \"racing_car\"\n ]\n },\n {\n \"unified\": \"1F3CD-FE0F\",\n \"shortnames\": [\n \"racing_motorcycle\"\n ]\n },\n {\n \"unified\": \"1F6F5\",\n \"shortnames\": [\n \"motor_scooter\"\n ]\n },\n {\n \"unified\": \"1F9BD\",\n \"shortnames\": [\n \"manual_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F9BC\",\n \"shortnames\": [\n \"motorized_wheelchair\"\n ]\n },\n {\n \"unified\": \"1F6FA\",\n \"shortnames\": [\n \"auto_rickshaw\"\n ]\n },\n {\n \"unified\": \"1F6B2\",\n \"shortnames\": [\n \"bike\"\n ]\n },\n {\n \"unified\": \"1F6F4\",\n \"shortnames\": [\n \"scooter\"\n ]\n },\n {\n \"unified\": \"1F6F9\",\n \"shortnames\": [\n \"skateboard\"\n ]\n },\n {\n \"unified\": \"1F6FC\",\n \"shortnames\": [\n \"roller_skate\"\n ]\n },\n {\n \"unified\": \"1F68F\",\n \"shortnames\": [\n \"busstop\"\n ]\n },\n {\n \"unified\": \"1F6E3-FE0F\",\n \"shortnames\": [\n \"motorway\"\n ]\n },\n {\n \"unified\": \"1F6E4-FE0F\",\n \"shortnames\": [\n \"railway_track\"\n ]\n },\n {\n \"unified\": \"1F6E2-FE0F\",\n \"shortnames\": [\n \"oil_drum\"\n ]\n },\n {\n \"unified\": \"26FD\",\n \"shortnames\": [\n \"fuelpump\"\n ]\n },\n {\n \"unified\": \"1F6A8\",\n \"shortnames\": [\n \"rotating_light\"\n ]\n },\n {\n \"unified\": \"1F6A5\",\n \"shortnames\": [\n \"traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6A6\",\n \"shortnames\": [\n \"vertical_traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6D1\",\n \"shortnames\": [\n \"octagonal_sign\"\n ]\n },\n {\n \"unified\": \"1F6A7\",\n \"shortnames\": [\n \"construction\"\n ]\n },\n {\n \"unified\": \"2693\",\n \"shortnames\": [\n \"anchor\"\n ]\n },\n {\n \"unified\": \"26F5\",\n \"shortnames\": [\n \"boat\"\n ]\n },\n {\n \"unified\": \"1F6F6\",\n \"shortnames\": [\n \"canoe\"\n ]\n },\n {\n \"unified\": \"1F6A4\",\n \"shortnames\": [\n \"speedboat\"\n ]\n },\n {\n \"unified\": \"1F6F3-FE0F\",\n \"shortnames\": [\n \"passenger_ship\"\n ]\n },\n {\n \"unified\": \"26F4-FE0F\",\n \"shortnames\": [\n \"ferry\"\n ]\n },\n {\n \"unified\": \"1F6E5-FE0F\",\n \"shortnames\": [\n \"motor_boat\"\n ]\n },\n {\n \"unified\": \"1F6A2\",\n \"shortnames\": [\n \"ship\"\n ]\n },\n {\n \"unified\": \"2708-FE0F\",\n \"shortnames\": [\n \"airplane\"\n ]\n },\n {\n \"unified\": \"1F6E9-FE0F\",\n \"shortnames\": [\n \"small_airplane\"\n ]\n },\n {\n \"unified\": \"1F6EB\",\n \"shortnames\": [\n \"airplane_departure\"\n ]\n },\n {\n \"unified\": \"1F6EC\",\n \"shortnames\": [\n \"airplane_arriving\"\n ]\n },\n {\n \"unified\": \"1FA82\",\n \"shortnames\": [\n \"parachute\"\n ]\n },\n {\n \"unified\": \"1F4BA\",\n \"shortnames\": [\n \"seat\"\n ]\n },\n {\n \"unified\": \"1F681\",\n \"shortnames\": [\n \"helicopter\"\n ]\n },\n {\n \"unified\": \"1F69F\",\n \"shortnames\": [\n \"suspension_railway\"\n ]\n },\n {\n \"unified\": \"1F6A0\",\n \"shortnames\": [\n \"mountain_cableway\"\n ]\n },\n {\n \"unified\": \"1F6A1\",\n \"shortnames\": [\n \"aerial_tramway\"\n ]\n },\n {\n \"unified\": \"1F6F0-FE0F\",\n \"shortnames\": [\n \"satellite\"\n ]\n },\n {\n \"unified\": \"1F680\",\n \"shortnames\": [\n \"rocket\"\n ]\n },\n {\n \"unified\": \"1F6F8\",\n \"shortnames\": [\n \"flying_saucer\"\n ]\n },\n {\n \"unified\": \"1F6CE-FE0F\",\n \"shortnames\": [\n \"bellhop_bell\"\n ]\n },\n {\n \"unified\": \"1F9F3\",\n \"shortnames\": [\n \"luggage\"\n ]\n },\n {\n \"unified\": \"231B\",\n \"shortnames\": [\n \"hourglass\"\n ]\n },\n {\n \"unified\": \"23F3\",\n \"shortnames\": [\n \"hourglass_flowing_sand\"\n ]\n },\n {\n \"unified\": \"231A\",\n \"shortnames\": [\n \"watch\"\n ]\n },\n {\n \"unified\": \"23F0\",\n \"shortnames\": [\n \"alarm_clock\"\n ]\n },\n {\n \"unified\": \"23F1-FE0F\",\n \"shortnames\": [\n \"stopwatch\"\n ]\n },\n {\n \"unified\": \"23F2-FE0F\",\n \"shortnames\": [\n \"timer_clock\"\n ]\n },\n {\n \"unified\": \"1F570-FE0F\",\n \"shortnames\": [\n \"mantelpiece_clock\"\n ]\n },\n {\n \"unified\": \"1F55B\",\n \"shortnames\": [\n \"clock12\"\n ]\n },\n {\n \"unified\": \"1F567\",\n \"shortnames\": [\n \"clock1230\"\n ]\n },\n {\n \"unified\": \"1F550\",\n \"shortnames\": [\n \"clock1\"\n ]\n },\n {\n \"unified\": \"1F55C\",\n \"shortnames\": [\n \"clock130\"\n ]\n },\n {\n \"unified\": \"1F551\",\n \"shortnames\": [\n \"clock2\"\n ]\n },\n {\n \"unified\": \"1F55D\",\n \"shortnames\": [\n \"clock230\"\n ]\n },\n {\n \"unified\": \"1F552\",\n \"shortnames\": [\n \"clock3\"\n ]\n },\n {\n \"unified\": \"1F55E\",\n \"shortnames\": [\n \"clock330\"\n ]\n },\n {\n \"unified\": \"1F553\",\n \"shortnames\": [\n \"clock4\"\n ]\n },\n {\n \"unified\": \"1F55F\",\n \"shortnames\": [\n \"clock430\"\n ]\n },\n {\n \"unified\": \"1F554\",\n \"shortnames\": [\n \"clock5\"\n ]\n },\n {\n \"unified\": \"1F560\",\n \"shortnames\": [\n \"clock530\"\n ]\n },\n {\n \"unified\": \"1F555\",\n \"shortnames\": [\n \"clock6\"\n ]\n },\n {\n \"unified\": \"1F561\",\n \"shortnames\": [\n \"clock630\"\n ]\n },\n {\n \"unified\": \"1F556\",\n \"shortnames\": [\n \"clock7\"\n ]\n },\n {\n \"unified\": \"1F562\",\n \"shortnames\": [\n \"clock730\"\n ]\n },\n {\n \"unified\": \"1F557\",\n \"shortnames\": [\n \"clock8\"\n ]\n },\n {\n \"unified\": \"1F563\",\n \"shortnames\": [\n \"clock830\"\n ]\n },\n {\n \"unified\": \"1F558\",\n \"shortnames\": [\n \"clock9\"\n ]\n },\n {\n \"unified\": \"1F564\",\n \"shortnames\": [\n \"clock930\"\n ]\n },\n {\n \"unified\": \"1F559\",\n \"shortnames\": [\n \"clock10\"\n ]\n },\n {\n \"unified\": \"1F565\",\n \"shortnames\": [\n \"clock1030\"\n ]\n },\n {\n \"unified\": \"1F55A\",\n \"shortnames\": [\n \"clock11\"\n ]\n },\n {\n \"unified\": \"1F566\",\n \"shortnames\": [\n \"clock1130\"\n ]\n },\n {\n \"unified\": \"1F311\",\n \"shortnames\": [\n \"new_moon\"\n ]\n },\n {\n \"unified\": \"1F312\",\n \"shortnames\": [\n \"waxing_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F313\",\n \"shortnames\": [\n \"first_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F314\",\n \"shortnames\": [\n \"moon\"\n ]\n },\n {\n \"unified\": \"1F315\",\n \"shortnames\": [\n \"full_moon\"\n ]\n },\n {\n \"unified\": \"1F316\",\n \"shortnames\": [\n \"waning_gibbous_moon\"\n ]\n },\n {\n \"unified\": \"1F317\",\n \"shortnames\": [\n \"last_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F318\",\n \"shortnames\": [\n \"waning_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F319\",\n \"shortnames\": [\n \"crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F31A\",\n \"shortnames\": [\n \"new_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31B\",\n \"shortnames\": [\n \"first_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31C\",\n \"shortnames\": [\n \"last_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F321-FE0F\",\n \"shortnames\": [\n \"thermometer\"\n ]\n },\n {\n \"unified\": \"2600-FE0F\",\n \"shortnames\": [\n \"sunny\"\n ]\n },\n {\n \"unified\": \"1F31D\",\n \"shortnames\": [\n \"full_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31E\",\n \"shortnames\": [\n \"sun_with_face\"\n ]\n },\n {\n \"unified\": \"1FA90\",\n \"shortnames\": [\n \"ringed_planet\"\n ]\n },\n {\n \"unified\": \"2B50\",\n \"shortnames\": [\n \"star\"\n ]\n },\n {\n \"unified\": \"1F31F\",\n \"shortnames\": [\n \"star2\"\n ]\n },\n {\n \"unified\": \"1F320\",\n \"shortnames\": [\n \"stars\"\n ]\n },\n {\n \"unified\": \"1F30C\",\n \"shortnames\": [\n \"milky_way\"\n ]\n },\n {\n \"unified\": \"2601-FE0F\",\n \"shortnames\": [\n \"cloud\"\n ]\n },\n {\n \"unified\": \"26C5\",\n \"shortnames\": [\n \"partly_sunny\"\n ]\n },\n {\n \"unified\": \"26C8-FE0F\",\n \"shortnames\": [\n \"thunder_cloud_and_rain\"\n ]\n },\n {\n \"unified\": \"1F324-FE0F\",\n \"shortnames\": [\n \"mostly_sunny\"\n ]\n },\n {\n \"unified\": \"1F325-FE0F\",\n \"shortnames\": [\n \"barely_sunny\"\n ]\n },\n {\n \"unified\": \"1F326-FE0F\",\n \"shortnames\": [\n \"partly_sunny_rain\"\n ]\n },\n {\n \"unified\": \"1F327-FE0F\",\n \"shortnames\": [\n \"rain_cloud\"\n ]\n },\n {\n \"unified\": \"1F328-FE0F\",\n \"shortnames\": [\n \"snow_cloud\"\n ]\n },\n {\n \"unified\": \"1F329-FE0F\",\n \"shortnames\": [\n \"lightning\"\n ]\n },\n {\n \"unified\": \"1F32A-FE0F\",\n \"shortnames\": [\n \"tornado\"\n ]\n },\n {\n \"unified\": \"1F32B-FE0F\",\n \"shortnames\": [\n \"fog\"\n ]\n },\n {\n \"unified\": \"1F32C-FE0F\",\n \"shortnames\": [\n \"wind_blowing_face\"\n ]\n },\n {\n \"unified\": \"1F300\",\n \"shortnames\": [\n \"cyclone\"\n ]\n },\n {\n \"unified\": \"1F308\",\n \"shortnames\": [\n \"rainbow\"\n ]\n },\n {\n \"unified\": \"1F302\",\n \"shortnames\": [\n \"closed_umbrella\"\n ]\n },\n {\n \"unified\": \"2602-FE0F\",\n \"shortnames\": [\n \"umbrella\"\n ]\n },\n {\n \"unified\": \"2614\",\n \"shortnames\": [\n \"umbrella_with_rain_drops\"\n ]\n },\n {\n \"unified\": \"26F1-FE0F\",\n \"shortnames\": [\n \"umbrella_on_ground\"\n ]\n },\n {\n \"unified\": \"26A1\",\n \"shortnames\": [\n \"zap\"\n ]\n },\n {\n \"unified\": \"2744-FE0F\",\n \"shortnames\": [\n \"snowflake\"\n ]\n },\n {\n \"unified\": \"2603-FE0F\",\n \"shortnames\": [\n \"snowman\"\n ]\n },\n {\n \"unified\": \"26C4\",\n \"shortnames\": [\n \"snowman_without_snow\"\n ]\n },\n {\n \"unified\": \"2604-FE0F\",\n \"shortnames\": [\n \"comet\"\n ]\n },\n {\n \"unified\": \"1F525\",\n \"shortnames\": [\n \"fire\"\n ]\n },\n {\n \"unified\": \"1F4A7\",\n \"shortnames\": [\n \"droplet\"\n ]\n },\n {\n \"unified\": \"1F30A\",\n \"shortnames\": [\n \"ocean\"\n ]\n }\n ]\n },\n {\n \"name\": \"Activities\",\n \"emojis\": [\n {\n \"unified\": \"1F383\",\n \"shortnames\": [\n \"jack_o_lantern\"\n ]\n },\n {\n \"unified\": \"1F384\",\n \"shortnames\": [\n \"christmas_tree\"\n ]\n },\n {\n \"unified\": \"1F386\",\n \"shortnames\": [\n \"fireworks\"\n ]\n },\n {\n \"unified\": \"1F387\",\n \"shortnames\": [\n \"sparkler\"\n ]\n },\n {\n \"unified\": \"1F9E8\",\n \"shortnames\": [\n \"firecracker\"\n ]\n },\n {\n \"unified\": \"2728\",\n \"shortnames\": [\n \"sparkles\"\n ]\n },\n {\n \"unified\": \"1F388\",\n \"shortnames\": [\n \"balloon\"\n ]\n },\n {\n \"unified\": \"1F389\",\n \"shortnames\": [\n \"tada\"\n ]\n },\n {\n \"unified\": \"1F38A\",\n \"shortnames\": [\n \"confetti_ball\"\n ]\n },\n {\n \"unified\": \"1F38B\",\n \"shortnames\": [\n \"tanabata_tree\"\n ]\n },\n {\n \"unified\": \"1F38D\",\n \"shortnames\": [\n \"bamboo\"\n ]\n },\n {\n \"unified\": \"1F38E\",\n \"shortnames\": [\n \"dolls\"\n ]\n },\n {\n \"unified\": \"1F38F\",\n \"shortnames\": [\n \"flags\"\n ]\n },\n {\n \"unified\": \"1F390\",\n \"shortnames\": [\n \"wind_chime\"\n ]\n },\n {\n \"unified\": \"1F391\",\n \"shortnames\": [\n \"rice_scene\"\n ]\n },\n {\n \"unified\": \"1F9E7\",\n \"shortnames\": [\n \"red_envelope\"\n ]\n },\n {\n \"unified\": \"1F380\",\n \"shortnames\": [\n \"ribbon\"\n ]\n },\n {\n \"unified\": \"1F381\",\n \"shortnames\": [\n \"gift\"\n ]\n },\n {\n \"unified\": \"1F397-FE0F\",\n \"shortnames\": [\n \"reminder_ribbon\"\n ]\n },\n {\n \"unified\": \"1F39F-FE0F\",\n \"shortnames\": [\n \"admission_tickets\"\n ]\n },\n {\n \"unified\": \"1F3AB\",\n \"shortnames\": [\n \"ticket\"\n ]\n },\n {\n \"unified\": \"1F396-FE0F\",\n \"shortnames\": [\n \"medal\"\n ]\n },\n {\n \"unified\": \"1F3C6\",\n \"shortnames\": [\n \"trophy\"\n ]\n },\n {\n \"unified\": \"1F3C5\",\n \"shortnames\": [\n \"sports_medal\"\n ]\n },\n {\n \"unified\": \"1F947\",\n \"shortnames\": [\n \"first_place_medal\"\n ]\n },\n {\n \"unified\": \"1F948\",\n \"shortnames\": [\n \"second_place_medal\"\n ]\n },\n {\n \"unified\": \"1F949\",\n \"shortnames\": [\n \"third_place_medal\"\n ]\n },\n {\n \"unified\": \"26BD\",\n \"shortnames\": [\n \"soccer\"\n ]\n },\n {\n \"unified\": \"26BE\",\n \"shortnames\": [\n \"baseball\"\n ]\n },\n {\n \"unified\": \"1F94E\",\n \"shortnames\": [\n \"softball\"\n ]\n },\n {\n \"unified\": \"1F3C0\",\n \"shortnames\": [\n \"basketball\"\n ]\n },\n {\n \"unified\": \"1F3D0\",\n \"shortnames\": [\n \"volleyball\"\n ]\n },\n {\n \"unified\": \"1F3C8\",\n \"shortnames\": [\n \"football\"\n ]\n },\n {\n \"unified\": \"1F3C9\",\n \"shortnames\": [\n \"rugby_football\"\n ]\n },\n {\n \"unified\": \"1F3BE\",\n \"shortnames\": [\n \"tennis\"\n ]\n },\n {\n \"unified\": \"1F94F\",\n \"shortnames\": [\n \"flying_disc\"\n ]\n },\n {\n \"unified\": \"1F3B3\",\n \"shortnames\": [\n \"bowling\"\n ]\n },\n {\n \"unified\": \"1F3CF\",\n \"shortnames\": [\n \"cricket_bat_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D1\",\n \"shortnames\": [\n \"field_hockey_stick_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D2\",\n \"shortnames\": [\n \"ice_hockey_stick_and_puck\"\n ]\n },\n {\n \"unified\": \"1F94D\",\n \"shortnames\": [\n \"lacrosse\"\n ]\n },\n {\n \"unified\": \"1F3D3\",\n \"shortnames\": [\n \"table_tennis_paddle_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3F8\",\n \"shortnames\": [\n \"badminton_racquet_and_shuttlecock\"\n ]\n },\n {\n \"unified\": \"1F94A\",\n \"shortnames\": [\n \"boxing_glove\"\n ]\n },\n {\n \"unified\": \"1F94B\",\n \"shortnames\": [\n \"martial_arts_uniform\"\n ]\n },\n {\n \"unified\": \"1F945\",\n \"shortnames\": [\n \"goal_net\"\n ]\n },\n {\n \"unified\": \"26F3\",\n \"shortnames\": [\n \"golf\"\n ]\n },\n {\n \"unified\": \"26F8-FE0F\",\n \"shortnames\": [\n \"ice_skate\"\n ]\n },\n {\n \"unified\": \"1F3A3\",\n \"shortnames\": [\n \"fishing_pole_and_fish\"\n ]\n },\n {\n \"unified\": \"1F93F\",\n \"shortnames\": [\n \"diving_mask\"\n ]\n },\n {\n \"unified\": \"1F3BD\",\n \"shortnames\": [\n \"running_shirt_with_sash\"\n ]\n },\n {\n \"unified\": \"1F3BF\",\n \"shortnames\": [\n \"ski\"\n ]\n },\n {\n \"unified\": \"1F6F7\",\n \"shortnames\": [\n \"sled\"\n ]\n },\n {\n \"unified\": \"1F94C\",\n \"shortnames\": [\n \"curling_stone\"\n ]\n },\n {\n \"unified\": \"1F3AF\",\n \"shortnames\": [\n \"dart\"\n ]\n },\n {\n \"unified\": \"1FA80\",\n \"shortnames\": [\n \"yo-yo\"\n ]\n },\n {\n \"unified\": \"1FA81\",\n \"shortnames\": [\n \"kite\"\n ]\n },\n {\n \"unified\": \"1F3B1\",\n \"shortnames\": [\n \"8ball\"\n ]\n },\n {\n \"unified\": \"1F52E\",\n \"shortnames\": [\n \"crystal_ball\"\n ]\n },\n {\n \"unified\": \"1FA84\",\n \"shortnames\": [\n \"magic_wand\"\n ]\n },\n {\n \"unified\": \"1F9FF\",\n \"shortnames\": [\n \"nazar_amulet\"\n ]\n },\n {\n \"unified\": \"1F3AE\",\n \"shortnames\": [\n \"video_game\"\n ]\n },\n {\n \"unified\": \"1F579-FE0F\",\n \"shortnames\": [\n \"joystick\"\n ]\n },\n {\n \"unified\": \"1F3B0\",\n \"shortnames\": [\n \"slot_machine\"\n ]\n },\n {\n \"unified\": \"1F3B2\",\n \"shortnames\": [\n \"game_die\"\n ]\n },\n {\n \"unified\": \"1F9E9\",\n \"shortnames\": [\n \"jigsaw\"\n ]\n },\n {\n \"unified\": \"1F9F8\",\n \"shortnames\": [\n \"teddy_bear\"\n ]\n },\n {\n \"unified\": \"1FA85\",\n \"shortnames\": [\n \"pinata\"\n ]\n },\n {\n \"unified\": \"1FA86\",\n \"shortnames\": [\n \"nesting_dolls\"\n ]\n },\n {\n \"unified\": \"2660-FE0F\",\n \"shortnames\": [\n \"spades\"\n ]\n },\n {\n \"unified\": \"2665-FE0F\",\n \"shortnames\": [\n \"hearts\"\n ]\n },\n {\n \"unified\": \"2666-FE0F\",\n \"shortnames\": [\n \"diamonds\"\n ]\n },\n {\n \"unified\": \"2663-FE0F\",\n \"shortnames\": [\n \"clubs\"\n ]\n },\n {\n \"unified\": \"265F-FE0F\",\n \"shortnames\": [\n \"chess_pawn\"\n ]\n },\n {\n \"unified\": \"1F0CF\",\n \"shortnames\": [\n \"black_joker\"\n ]\n },\n {\n \"unified\": \"1F004\",\n \"shortnames\": [\n \"mahjong\"\n ]\n },\n {\n \"unified\": \"1F3B4\",\n \"shortnames\": [\n \"flower_playing_cards\"\n ]\n },\n {\n \"unified\": \"1F3AD\",\n \"shortnames\": [\n \"performing_arts\"\n ]\n },\n {\n \"unified\": \"1F5BC-FE0F\",\n \"shortnames\": [\n \"frame_with_picture\"\n ]\n },\n {\n \"unified\": \"1F3A8\",\n \"shortnames\": [\n \"art\"\n ]\n },\n {\n \"unified\": \"1F9F5\",\n \"shortnames\": [\n \"thread\"\n ]\n },\n {\n \"unified\": \"1FAA1\",\n \"shortnames\": [\n \"sewing_needle\"\n ]\n },\n {\n \"unified\": \"1F9F6\",\n \"shortnames\": [\n \"yarn\"\n ]\n },\n {\n \"unified\": \"1FAA2\",\n \"shortnames\": [\n \"knot\"\n ]\n }\n ]\n },\n {\n \"name\": \"Objects\",\n \"emojis\": [\n {\n \"unified\": \"1F453\",\n \"shortnames\": [\n \"eyeglasses\"\n ]\n },\n {\n \"unified\": \"1F576-FE0F\",\n \"shortnames\": [\n \"dark_sunglasses\"\n ]\n },\n {\n \"unified\": \"1F97D\",\n \"shortnames\": [\n \"goggles\"\n ]\n },\n {\n \"unified\": \"1F97C\",\n \"shortnames\": [\n \"lab_coat\"\n ]\n },\n {\n \"unified\": \"1F9BA\",\n \"shortnames\": [\n \"safety_vest\"\n ]\n },\n {\n \"unified\": \"1F454\",\n \"shortnames\": [\n \"necktie\"\n ]\n },\n {\n \"unified\": \"1F455\",\n \"shortnames\": [\n \"shirt\"\n ]\n },\n {\n \"unified\": \"1F456\",\n \"shortnames\": [\n \"jeans\"\n ]\n },\n {\n \"unified\": \"1F9E3\",\n \"shortnames\": [\n \"scarf\"\n ]\n },\n {\n \"unified\": \"1F9E4\",\n \"shortnames\": [\n \"gloves\"\n ]\n },\n {\n \"unified\": \"1F9E5\",\n \"shortnames\": [\n \"coat\"\n ]\n },\n {\n \"unified\": \"1F9E6\",\n \"shortnames\": [\n \"socks\"\n ]\n },\n {\n \"unified\": \"1F457\",\n \"shortnames\": [\n \"dress\"\n ]\n },\n {\n \"unified\": \"1F458\",\n \"shortnames\": [\n \"kimono\"\n ]\n },\n {\n \"unified\": \"1F97B\",\n \"shortnames\": [\n \"sari\"\n ]\n },\n {\n \"unified\": \"1FA71\",\n \"shortnames\": [\n \"one-piece_swimsuit\"\n ]\n },\n {\n \"unified\": \"1FA72\",\n \"shortnames\": [\n \"briefs\"\n ]\n },\n {\n \"unified\": \"1FA73\",\n \"shortnames\": [\n \"shorts\"\n ]\n },\n {\n \"unified\": \"1F459\",\n \"shortnames\": [\n \"bikini\"\n ]\n },\n {\n \"unified\": \"1F45A\",\n \"shortnames\": [\n \"womans_clothes\"\n ]\n },\n {\n \"unified\": \"1F45B\",\n \"shortnames\": [\n \"purse\"\n ]\n },\n {\n \"unified\": \"1F45C\",\n \"shortnames\": [\n \"handbag\"\n ]\n },\n {\n \"unified\": \"1F45D\",\n \"shortnames\": [\n \"pouch\"\n ]\n },\n {\n \"unified\": \"1F6CD-FE0F\",\n \"shortnames\": [\n \"shopping_bags\"\n ]\n },\n {\n \"unified\": \"1F392\",\n \"shortnames\": [\n \"school_satchel\"\n ]\n },\n {\n \"unified\": \"1FA74\",\n \"shortnames\": [\n \"thong_sandal\"\n ]\n },\n {\n \"unified\": \"1F45E\",\n \"shortnames\": [\n \"mans_shoe\"\n ]\n },\n {\n \"unified\": \"1F45F\",\n \"shortnames\": [\n \"athletic_shoe\"\n ]\n },\n {\n \"unified\": \"1F97E\",\n \"shortnames\": [\n \"hiking_boot\"\n ]\n },\n {\n \"unified\": \"1F97F\",\n \"shortnames\": [\n \"womans_flat_shoe\"\n ]\n },\n {\n \"unified\": \"1F460\",\n \"shortnames\": [\n \"high_heel\"\n ]\n },\n {\n \"unified\": \"1F461\",\n \"shortnames\": [\n \"sandal\"\n ]\n },\n {\n \"unified\": \"1FA70\",\n \"shortnames\": [\n \"ballet_shoes\"\n ]\n },\n {\n \"unified\": \"1F462\",\n \"shortnames\": [\n \"boot\"\n ]\n },\n {\n \"unified\": \"1F451\",\n \"shortnames\": [\n \"crown\"\n ]\n },\n {\n \"unified\": \"1F452\",\n \"shortnames\": [\n \"womans_hat\"\n ]\n },\n {\n \"unified\": \"1F3A9\",\n \"shortnames\": [\n \"tophat\"\n ]\n },\n {\n \"unified\": \"1F393\",\n \"shortnames\": [\n \"mortar_board\"\n ]\n },\n {\n \"unified\": \"1F9E2\",\n \"shortnames\": [\n \"billed_cap\"\n ]\n },\n {\n \"unified\": \"1FA96\",\n \"shortnames\": [\n \"military_helmet\"\n ]\n },\n {\n \"unified\": \"26D1-FE0F\",\n \"shortnames\": [\n \"helmet_with_white_cross\"\n ]\n },\n {\n \"unified\": \"1F4FF\",\n \"shortnames\": [\n \"prayer_beads\"\n ]\n },\n {\n \"unified\": \"1F484\",\n \"shortnames\": [\n \"lipstick\"\n ]\n },\n {\n \"unified\": \"1F48D\",\n \"shortnames\": [\n \"ring\"\n ]\n },\n {\n \"unified\": \"1F48E\",\n \"shortnames\": [\n \"gem\"\n ]\n },\n {\n \"unified\": \"1F507\",\n \"shortnames\": [\n \"mute\"\n ]\n },\n {\n \"unified\": \"1F508\",\n \"shortnames\": [\n \"speaker\"\n ]\n },\n {\n \"unified\": \"1F509\",\n \"shortnames\": [\n \"sound\"\n ]\n },\n {\n \"unified\": \"1F50A\",\n \"shortnames\": [\n \"loud_sound\"\n ]\n },\n {\n \"unified\": \"1F4E2\",\n \"shortnames\": [\n \"loudspeaker\"\n ]\n },\n {\n \"unified\": \"1F4E3\",\n \"shortnames\": [\n \"mega\"\n ]\n },\n {\n \"unified\": \"1F4EF\",\n \"shortnames\": [\n \"postal_horn\"\n ]\n },\n {\n \"unified\": \"1F514\",\n \"shortnames\": [\n \"bell\"\n ]\n },\n {\n \"unified\": \"1F515\",\n \"shortnames\": [\n \"no_bell\"\n ]\n },\n {\n \"unified\": \"1F3BC\",\n \"shortnames\": [\n \"musical_score\"\n ]\n },\n {\n \"unified\": \"1F3B5\",\n \"shortnames\": [\n \"musical_note\"\n ]\n },\n {\n \"unified\": \"1F3B6\",\n \"shortnames\": [\n \"notes\"\n ]\n },\n {\n \"unified\": \"1F399-FE0F\",\n \"shortnames\": [\n \"studio_microphone\"\n ]\n },\n {\n \"unified\": \"1F39A-FE0F\",\n \"shortnames\": [\n \"level_slider\"\n ]\n },\n {\n \"unified\": \"1F39B-FE0F\",\n \"shortnames\": [\n \"control_knobs\"\n ]\n },\n {\n \"unified\": \"1F3A4\",\n \"shortnames\": [\n \"microphone\"\n ]\n },\n {\n \"unified\": \"1F3A7\",\n \"shortnames\": [\n \"headphones\"\n ]\n },\n {\n \"unified\": \"1F4FB\",\n \"shortnames\": [\n \"radio\"\n ]\n },\n {\n \"unified\": \"1F3B7\",\n \"shortnames\": [\n \"saxophone\"\n ]\n },\n {\n \"unified\": \"1FA97\",\n \"shortnames\": [\n \"accordion\"\n ]\n },\n {\n \"unified\": \"1F3B8\",\n \"shortnames\": [\n \"guitar\"\n ]\n },\n {\n \"unified\": \"1F3B9\",\n \"shortnames\": [\n \"musical_keyboard\"\n ]\n },\n {\n \"unified\": \"1F3BA\",\n \"shortnames\": [\n \"trumpet\"\n ]\n },\n {\n \"unified\": \"1F3BB\",\n \"shortnames\": [\n \"violin\"\n ]\n },\n {\n \"unified\": \"1FA95\",\n \"shortnames\": [\n \"banjo\"\n ]\n },\n {\n \"unified\": \"1F941\",\n \"shortnames\": [\n \"drum_with_drumsticks\"\n ]\n },\n {\n \"unified\": \"1FA98\",\n \"shortnames\": [\n \"long_drum\"\n ]\n },\n {\n \"unified\": \"1F4F1\",\n \"shortnames\": [\n \"iphone\"\n ]\n },\n {\n \"unified\": \"1F4F2\",\n \"shortnames\": [\n \"calling\"\n ]\n },\n {\n \"unified\": \"260E-FE0F\",\n \"shortnames\": [\n \"phone\"\n ]\n },\n {\n \"unified\": \"1F4DE\",\n \"shortnames\": [\n \"telephone_receiver\"\n ]\n },\n {\n \"unified\": \"1F4DF\",\n \"shortnames\": [\n \"pager\"\n ]\n },\n {\n \"unified\": \"1F4E0\",\n \"shortnames\": [\n \"fax\"\n ]\n },\n {\n \"unified\": \"1F50B\",\n \"shortnames\": [\n \"battery\"\n ]\n },\n {\n \"unified\": \"1F50C\",\n \"shortnames\": [\n \"electric_plug\"\n ]\n },\n {\n \"unified\": \"1F4BB\",\n \"shortnames\": [\n \"computer\"\n ]\n },\n {\n \"unified\": \"1F5A5-FE0F\",\n \"shortnames\": [\n \"desktop_computer\"\n ]\n },\n {\n \"unified\": \"1F5A8-FE0F\",\n \"shortnames\": [\n \"printer\"\n ]\n },\n {\n \"unified\": \"2328-FE0F\",\n \"shortnames\": [\n \"keyboard\"\n ]\n },\n {\n \"unified\": \"1F5B1-FE0F\",\n \"shortnames\": [\n \"three_button_mouse\"\n ]\n },\n {\n \"unified\": \"1F5B2-FE0F\",\n \"shortnames\": [\n \"trackball\"\n ]\n },\n {\n \"unified\": \"1F4BD\",\n \"shortnames\": [\n \"minidisc\"\n ]\n },\n {\n \"unified\": \"1F4BE\",\n \"shortnames\": [\n \"floppy_disk\"\n ]\n },\n {\n \"unified\": \"1F4BF\",\n \"shortnames\": [\n \"cd\"\n ]\n },\n {\n \"unified\": \"1F4C0\",\n \"shortnames\": [\n \"dvd\"\n ]\n },\n {\n \"unified\": \"1F9EE\",\n \"shortnames\": [\n \"abacus\"\n ]\n },\n {\n \"unified\": \"1F3A5\",\n \"shortnames\": [\n \"movie_camera\"\n ]\n },\n {\n \"unified\": \"1F39E-FE0F\",\n \"shortnames\": [\n \"film_frames\"\n ]\n },\n {\n \"unified\": \"1F4FD-FE0F\",\n \"shortnames\": [\n \"film_projector\"\n ]\n },\n {\n \"unified\": \"1F3AC\",\n \"shortnames\": [\n \"clapper\"\n ]\n },\n {\n \"unified\": \"1F4FA\",\n \"shortnames\": [\n \"tv\"\n ]\n },\n {\n \"unified\": \"1F4F7\",\n \"shortnames\": [\n \"camera\"\n ]\n },\n {\n \"unified\": \"1F4F8\",\n \"shortnames\": [\n \"camera_with_flash\"\n ]\n },\n {\n \"unified\": \"1F4F9\",\n \"shortnames\": [\n \"video_camera\"\n ]\n },\n {\n \"unified\": \"1F4FC\",\n \"shortnames\": [\n \"vhs\"\n ]\n },\n {\n \"unified\": \"1F50D\",\n \"shortnames\": [\n \"mag\"\n ]\n },\n {\n \"unified\": \"1F50E\",\n \"shortnames\": [\n \"mag_right\"\n ]\n },\n {\n \"unified\": \"1F56F-FE0F\",\n \"shortnames\": [\n \"candle\"\n ]\n },\n {\n \"unified\": \"1F4A1\",\n \"shortnames\": [\n \"bulb\"\n ]\n },\n {\n \"unified\": \"1F526\",\n \"shortnames\": [\n \"flashlight\"\n ]\n },\n {\n \"unified\": \"1F3EE\",\n \"shortnames\": [\n \"izakaya_lantern\"\n ]\n },\n {\n \"unified\": \"1FA94\",\n \"shortnames\": [\n \"diya_lamp\"\n ]\n },\n {\n \"unified\": \"1F4D4\",\n \"shortnames\": [\n \"notebook_with_decorative_cover\"\n ]\n },\n {\n \"unified\": \"1F4D5\",\n \"shortnames\": [\n \"closed_book\"\n ]\n },\n {\n \"unified\": \"1F4D6\",\n \"shortnames\": [\n \"book\"\n ]\n },\n {\n \"unified\": \"1F4D7\",\n \"shortnames\": [\n \"green_book\"\n ]\n },\n {\n \"unified\": \"1F4D8\",\n \"shortnames\": [\n \"blue_book\"\n ]\n },\n {\n \"unified\": \"1F4D9\",\n \"shortnames\": [\n \"orange_book\"\n ]\n },\n {\n \"unified\": \"1F4DA\",\n \"shortnames\": [\n \"books\"\n ]\n },\n {\n \"unified\": \"1F4D3\",\n \"shortnames\": [\n \"notebook\"\n ]\n },\n {\n \"unified\": \"1F4D2\",\n \"shortnames\": [\n \"ledger\"\n ]\n },\n {\n \"unified\": \"1F4C3\",\n \"shortnames\": [\n \"page_with_curl\"\n ]\n },\n {\n \"unified\": \"1F4DC\",\n \"shortnames\": [\n \"scroll\"\n ]\n },\n {\n \"unified\": \"1F4C4\",\n \"shortnames\": [\n \"page_facing_up\"\n ]\n },\n {\n \"unified\": \"1F4F0\",\n \"shortnames\": [\n \"newspaper\"\n ]\n },\n {\n \"unified\": \"1F5DE-FE0F\",\n \"shortnames\": [\n \"rolled_up_newspaper\"\n ]\n },\n {\n \"unified\": \"1F4D1\",\n \"shortnames\": [\n \"bookmark_tabs\"\n ]\n },\n {\n \"unified\": \"1F516\",\n \"shortnames\": [\n \"bookmark\"\n ]\n },\n {\n \"unified\": \"1F3F7-FE0F\",\n \"shortnames\": [\n \"label\"\n ]\n },\n {\n \"unified\": \"1F4B0\",\n \"shortnames\": [\n \"moneybag\"\n ]\n },\n {\n \"unified\": \"1FA99\",\n \"shortnames\": [\n \"coin\"\n ]\n },\n {\n \"unified\": \"1F4B4\",\n \"shortnames\": [\n \"yen\"\n ]\n },\n {\n \"unified\": \"1F4B5\",\n \"shortnames\": [\n \"dollar\"\n ]\n },\n {\n \"unified\": \"1F4B6\",\n \"shortnames\": [\n \"euro\"\n ]\n },\n {\n \"unified\": \"1F4B7\",\n \"shortnames\": [\n \"pound\"\n ]\n },\n {\n \"unified\": \"1F4B8\",\n \"shortnames\": [\n \"money_with_wings\"\n ]\n },\n {\n \"unified\": \"1F4B3\",\n \"shortnames\": [\n \"credit_card\"\n ]\n },\n {\n \"unified\": \"1F9FE\",\n \"shortnames\": [\n \"receipt\"\n ]\n },\n {\n \"unified\": \"1F4B9\",\n \"shortnames\": [\n \"chart\"\n ]\n },\n {\n \"unified\": \"2709-FE0F\",\n \"shortnames\": [\n \"email\"\n ]\n },\n {\n \"unified\": \"1F4E7\",\n \"shortnames\": [\n \"e-mail\"\n ]\n },\n {\n \"unified\": \"1F4E8\",\n \"shortnames\": [\n \"incoming_envelope\"\n ]\n },\n {\n \"unified\": \"1F4E9\",\n \"shortnames\": [\n \"envelope_with_arrow\"\n ]\n },\n {\n \"unified\": \"1F4E4\",\n \"shortnames\": [\n \"outbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E5\",\n \"shortnames\": [\n \"inbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E6\",\n \"shortnames\": [\n \"package\"\n ]\n },\n {\n \"unified\": \"1F4EB\",\n \"shortnames\": [\n \"mailbox\"\n ]\n },\n {\n \"unified\": \"1F4EA\",\n \"shortnames\": [\n \"mailbox_closed\"\n ]\n },\n {\n \"unified\": \"1F4EC\",\n \"shortnames\": [\n \"mailbox_with_mail\"\n ]\n },\n {\n \"unified\": \"1F4ED\",\n \"shortnames\": [\n \"mailbox_with_no_mail\"\n ]\n },\n {\n \"unified\": \"1F4EE\",\n \"shortnames\": [\n \"postbox\"\n ]\n },\n {\n \"unified\": \"1F5F3-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_ballot\"\n ]\n },\n {\n \"unified\": \"270F-FE0F\",\n \"shortnames\": [\n \"pencil2\"\n ]\n },\n {\n \"unified\": \"2712-FE0F\",\n \"shortnames\": [\n \"black_nib\"\n ]\n },\n {\n \"unified\": \"1F58B-FE0F\",\n \"shortnames\": [\n \"lower_left_fountain_pen\"\n ]\n },\n {\n \"unified\": \"1F58A-FE0F\",\n \"shortnames\": [\n \"lower_left_ballpoint_pen\"\n ]\n },\n {\n \"unified\": \"1F58C-FE0F\",\n \"shortnames\": [\n \"lower_left_paintbrush\"\n ]\n },\n {\n \"unified\": \"1F58D-FE0F\",\n \"shortnames\": [\n \"lower_left_crayon\"\n ]\n },\n {\n \"unified\": \"1F4DD\",\n \"shortnames\": [\n \"memo\"\n ]\n },\n {\n \"unified\": \"1F4BC\",\n \"shortnames\": [\n \"briefcase\"\n ]\n },\n {\n \"unified\": \"1F4C1\",\n \"shortnames\": [\n \"file_folder\"\n ]\n },\n {\n \"unified\": \"1F4C2\",\n \"shortnames\": [\n \"open_file_folder\"\n ]\n },\n {\n \"unified\": \"1F5C2-FE0F\",\n \"shortnames\": [\n \"card_index_dividers\"\n ]\n },\n {\n \"unified\": \"1F4C5\",\n \"shortnames\": [\n \"date\"\n ]\n },\n {\n \"unified\": \"1F4C6\",\n \"shortnames\": [\n \"calendar\"\n ]\n },\n {\n \"unified\": \"1F5D2-FE0F\",\n \"shortnames\": [\n \"spiral_note_pad\"\n ]\n },\n {\n \"unified\": \"1F5D3-FE0F\",\n \"shortnames\": [\n \"spiral_calendar_pad\"\n ]\n },\n {\n \"unified\": \"1F4C7\",\n \"shortnames\": [\n \"card_index\"\n ]\n },\n {\n \"unified\": \"1F4C8\",\n \"shortnames\": [\n \"chart_with_upwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4C9\",\n \"shortnames\": [\n \"chart_with_downwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4CA\",\n \"shortnames\": [\n \"bar_chart\"\n ]\n },\n {\n \"unified\": \"1F4CB\",\n \"shortnames\": [\n \"clipboard\"\n ]\n },\n {\n \"unified\": \"1F4CC\",\n \"shortnames\": [\n \"pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CD\",\n \"shortnames\": [\n \"round_pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CE\",\n \"shortnames\": [\n \"paperclip\"\n ]\n },\n {\n \"unified\": \"1F587-FE0F\",\n \"shortnames\": [\n \"linked_paperclips\"\n ]\n },\n {\n \"unified\": \"1F4CF\",\n \"shortnames\": [\n \"straight_ruler\"\n ]\n },\n {\n \"unified\": \"1F4D0\",\n \"shortnames\": [\n \"triangular_ruler\"\n ]\n },\n {\n \"unified\": \"2702-FE0F\",\n \"shortnames\": [\n \"scissors\"\n ]\n },\n {\n \"unified\": \"1F5C3-FE0F\",\n \"shortnames\": [\n \"card_file_box\"\n ]\n },\n {\n \"unified\": \"1F5C4-FE0F\",\n \"shortnames\": [\n \"file_cabinet\"\n ]\n },\n {\n \"unified\": \"1F5D1-FE0F\",\n \"shortnames\": [\n \"wastebasket\"\n ]\n },\n {\n \"unified\": \"1F512\",\n \"shortnames\": [\n \"lock\"\n ]\n },\n {\n \"unified\": \"1F513\",\n \"shortnames\": [\n \"unlock\"\n ]\n },\n {\n \"unified\": \"1F50F\",\n \"shortnames\": [\n \"lock_with_ink_pen\"\n ]\n },\n {\n \"unified\": \"1F510\",\n \"shortnames\": [\n \"closed_lock_with_key\"\n ]\n },\n {\n \"unified\": \"1F511\",\n \"shortnames\": [\n \"key\"\n ]\n },\n {\n \"unified\": \"1F5DD-FE0F\",\n \"shortnames\": [\n \"old_key\"\n ]\n },\n {\n \"unified\": \"1F528\",\n \"shortnames\": [\n \"hammer\"\n ]\n },\n {\n \"unified\": \"1FA93\",\n \"shortnames\": [\n \"axe\"\n ]\n },\n {\n \"unified\": \"26CF-FE0F\",\n \"shortnames\": [\n \"pick\"\n ]\n },\n {\n \"unified\": \"2692-FE0F\",\n \"shortnames\": [\n \"hammer_and_pick\"\n ]\n },\n {\n \"unified\": \"1F6E0-FE0F\",\n \"shortnames\": [\n \"hammer_and_wrench\"\n ]\n },\n {\n \"unified\": \"1F5E1-FE0F\",\n \"shortnames\": [\n \"dagger_knife\"\n ]\n },\n {\n \"unified\": \"2694-FE0F\",\n \"shortnames\": [\n \"crossed_swords\"\n ]\n },\n {\n \"unified\": \"1F52B\",\n \"shortnames\": [\n \"gun\"\n ]\n },\n {\n \"unified\": \"1FA83\",\n \"shortnames\": [\n \"boomerang\"\n ]\n },\n {\n \"unified\": \"1F3F9\",\n \"shortnames\": [\n \"bow_and_arrow\"\n ]\n },\n {\n \"unified\": \"1F6E1-FE0F\",\n \"shortnames\": [\n \"shield\"\n ]\n },\n {\n \"unified\": \"1FA9A\",\n \"shortnames\": [\n \"carpentry_saw\"\n ]\n },\n {\n \"unified\": \"1F527\",\n \"shortnames\": [\n \"wrench\"\n ]\n },\n {\n \"unified\": \"1FA9B\",\n \"shortnames\": [\n \"screwdriver\"\n ]\n },\n {\n \"unified\": \"1F529\",\n \"shortnames\": [\n \"nut_and_bolt\"\n ]\n },\n {\n \"unified\": \"2699-FE0F\",\n \"shortnames\": [\n \"gear\"\n ]\n },\n {\n \"unified\": \"1F5DC-FE0F\",\n \"shortnames\": [\n \"compression\"\n ]\n },\n {\n \"unified\": \"2696-FE0F\",\n \"shortnames\": [\n \"scales\"\n ]\n },\n {\n \"unified\": \"1F9AF\",\n \"shortnames\": [\n \"probing_cane\"\n ]\n },\n {\n \"unified\": \"1F517\",\n \"shortnames\": [\n \"link\"\n ]\n },\n {\n \"unified\": \"26D3-FE0F\",\n \"shortnames\": [\n \"chains\"\n ]\n },\n {\n \"unified\": \"1FA9D\",\n \"shortnames\": [\n \"hook\"\n ]\n },\n {\n \"unified\": \"1F9F0\",\n \"shortnames\": [\n \"toolbox\"\n ]\n },\n {\n \"unified\": \"1F9F2\",\n \"shortnames\": [\n \"magnet\"\n ]\n },\n {\n \"unified\": \"1FA9C\",\n \"shortnames\": [\n \"ladder\"\n ]\n },\n {\n \"unified\": \"2697-FE0F\",\n \"shortnames\": [\n \"alembic\"\n ]\n },\n {\n \"unified\": \"1F9EA\",\n \"shortnames\": [\n \"test_tube\"\n ]\n },\n {\n \"unified\": \"1F9EB\",\n \"shortnames\": [\n \"petri_dish\"\n ]\n },\n {\n \"unified\": \"1F9EC\",\n \"shortnames\": [\n \"dna\"\n ]\n },\n {\n \"unified\": \"1F52C\",\n \"shortnames\": [\n \"microscope\"\n ]\n },\n {\n \"unified\": \"1F52D\",\n \"shortnames\": [\n \"telescope\"\n ]\n },\n {\n \"unified\": \"1F4E1\",\n \"shortnames\": [\n \"satellite_antenna\"\n ]\n },\n {\n \"unified\": \"1F489\",\n \"shortnames\": [\n \"syringe\"\n ]\n },\n {\n \"unified\": \"1FA78\",\n \"shortnames\": [\n \"drop_of_blood\"\n ]\n },\n {\n \"unified\": \"1F48A\",\n \"shortnames\": [\n \"pill\"\n ]\n },\n {\n \"unified\": \"1FA79\",\n \"shortnames\": [\n \"adhesive_bandage\"\n ]\n },\n {\n \"unified\": \"1FA7A\",\n \"shortnames\": [\n \"stethoscope\"\n ]\n },\n {\n \"unified\": \"1F6AA\",\n \"shortnames\": [\n \"door\"\n ]\n },\n {\n \"unified\": \"1F6D7\",\n \"shortnames\": [\n \"elevator\"\n ]\n },\n {\n \"unified\": \"1FA9E\",\n \"shortnames\": [\n \"mirror\"\n ]\n },\n {\n \"unified\": \"1FA9F\",\n \"shortnames\": [\n \"window\"\n ]\n },\n {\n \"unified\": \"1F6CF-FE0F\",\n \"shortnames\": [\n \"bed\"\n ]\n },\n {\n \"unified\": \"1F6CB-FE0F\",\n \"shortnames\": [\n \"couch_and_lamp\"\n ]\n },\n {\n \"unified\": \"1FA91\",\n \"shortnames\": [\n \"chair\"\n ]\n },\n {\n \"unified\": \"1F6BD\",\n \"shortnames\": [\n \"toilet\"\n ]\n },\n {\n \"unified\": \"1FAA0\",\n \"shortnames\": [\n \"plunger\"\n ]\n },\n {\n \"unified\": \"1F6BF\",\n \"shortnames\": [\n \"shower\"\n ]\n },\n {\n \"unified\": \"1F6C1\",\n \"shortnames\": [\n \"bathtub\"\n ]\n },\n {\n \"unified\": \"1FAA4\",\n \"shortnames\": [\n \"mouse_trap\"\n ]\n },\n {\n \"unified\": \"1FA92\",\n \"shortnames\": [\n \"razor\"\n ]\n },\n {\n \"unified\": \"1F9F4\",\n \"shortnames\": [\n \"lotion_bottle\"\n ]\n },\n {\n \"unified\": \"1F9F7\",\n \"shortnames\": [\n \"safety_pin\"\n ]\n },\n {\n \"unified\": \"1F9F9\",\n \"shortnames\": [\n \"broom\"\n ]\n },\n {\n \"unified\": \"1F9FA\",\n \"shortnames\": [\n \"basket\"\n ]\n },\n {\n \"unified\": \"1F9FB\",\n \"shortnames\": [\n \"roll_of_paper\"\n ]\n },\n {\n \"unified\": \"1FAA3\",\n \"shortnames\": [\n \"bucket\"\n ]\n },\n {\n \"unified\": \"1F9FC\",\n \"shortnames\": [\n \"soap\"\n ]\n },\n {\n \"unified\": \"1FAA5\",\n \"shortnames\": [\n \"toothbrush\"\n ]\n },\n {\n \"unified\": \"1F9FD\",\n \"shortnames\": [\n \"sponge\"\n ]\n },\n {\n \"unified\": \"1F9EF\",\n \"shortnames\": [\n \"fire_extinguisher\"\n ]\n },\n {\n \"unified\": \"1F6D2\",\n \"shortnames\": [\n \"shopping_trolley\"\n ]\n },\n {\n \"unified\": \"1F6AC\",\n \"shortnames\": [\n \"smoking\"\n ]\n },\n {\n \"unified\": \"26B0-FE0F\",\n \"shortnames\": [\n \"coffin\"\n ]\n },\n {\n \"unified\": \"1FAA6\",\n \"shortnames\": [\n \"headstone\"\n ]\n },\n {\n \"unified\": \"26B1-FE0F\",\n \"shortnames\": [\n \"funeral_urn\"\n ]\n },\n {\n \"unified\": \"1F5FF\",\n \"shortnames\": [\n \"moyai\"\n ]\n },\n {\n \"unified\": \"1FAA7\",\n \"shortnames\": [\n \"placard\"\n ]\n }\n ]\n },\n {\n \"name\": \"Symbols\",\n \"emojis\": [\n {\n \"unified\": \"1F3E7\",\n \"shortnames\": [\n \"atm\"\n ]\n },\n {\n \"unified\": \"1F6AE\",\n \"shortnames\": [\n \"put_litter_in_its_place\"\n ]\n },\n {\n \"unified\": \"1F6B0\",\n \"shortnames\": [\n \"potable_water\"\n ]\n },\n {\n \"unified\": \"267F\",\n \"shortnames\": [\n \"wheelchair\"\n ]\n },\n {\n \"unified\": \"1F6B9\",\n \"shortnames\": [\n \"mens\"\n ]\n },\n {\n \"unified\": \"1F6BA\",\n \"shortnames\": [\n \"womens\"\n ]\n },\n {\n \"unified\": \"1F6BB\",\n \"shortnames\": [\n \"restroom\"\n ]\n },\n {\n \"unified\": \"1F6BC\",\n \"shortnames\": [\n \"baby_symbol\"\n ]\n },\n {\n \"unified\": \"1F6BE\",\n \"shortnames\": [\n \"wc\"\n ]\n },\n {\n \"unified\": \"1F6C2\",\n \"shortnames\": [\n \"passport_control\"\n ]\n },\n {\n \"unified\": \"1F6C3\",\n \"shortnames\": [\n \"customs\"\n ]\n },\n {\n \"unified\": \"1F6C4\",\n \"shortnames\": [\n \"baggage_claim\"\n ]\n },\n {\n \"unified\": \"1F6C5\",\n \"shortnames\": [\n \"left_luggage\"\n ]\n },\n {\n \"unified\": \"26A0-FE0F\",\n \"shortnames\": [\n \"warning\"\n ]\n },\n {\n \"unified\": \"1F6B8\",\n \"shortnames\": [\n \"children_crossing\"\n ]\n },\n {\n \"unified\": \"26D4\",\n \"shortnames\": [\n \"no_entry\"\n ]\n },\n {\n \"unified\": \"1F6AB\",\n \"shortnames\": [\n \"no_entry_sign\"\n ]\n },\n {\n \"unified\": \"1F6B3\",\n \"shortnames\": [\n \"no_bicycles\"\n ]\n },\n {\n \"unified\": \"1F6AD\",\n \"shortnames\": [\n \"no_smoking\"\n ]\n },\n {\n \"unified\": \"1F6AF\",\n \"shortnames\": [\n \"do_not_litter\"\n ]\n },\n {\n \"unified\": \"1F6B1\",\n \"shortnames\": [\n \"non-potable_water\"\n ]\n },\n {\n \"unified\": \"1F6B7\",\n \"shortnames\": [\n \"no_pedestrians\"\n ]\n },\n {\n \"unified\": \"1F4F5\",\n \"shortnames\": [\n \"no_mobile_phones\"\n ]\n },\n {\n \"unified\": \"1F51E\",\n \"shortnames\": [\n \"underage\"\n ]\n },\n {\n \"unified\": \"2622-FE0F\",\n \"shortnames\": [\n \"radioactive_sign\"\n ]\n },\n {\n \"unified\": \"2623-FE0F\",\n \"shortnames\": [\n \"biohazard_sign\"\n ]\n },\n {\n \"unified\": \"2B06-FE0F\",\n \"shortnames\": [\n \"arrow_up\"\n ]\n },\n {\n \"unified\": \"2197-FE0F\",\n \"shortnames\": [\n \"arrow_upper_right\"\n ]\n },\n {\n \"unified\": \"27A1-FE0F\",\n \"shortnames\": [\n \"arrow_right\"\n ]\n },\n {\n \"unified\": \"2198-FE0F\",\n \"shortnames\": [\n \"arrow_lower_right\"\n ]\n },\n {\n \"unified\": \"2B07-FE0F\",\n \"shortnames\": [\n \"arrow_down\"\n ]\n },\n {\n \"unified\": \"2199-FE0F\",\n \"shortnames\": [\n \"arrow_lower_left\"\n ]\n },\n {\n \"unified\": \"2B05-FE0F\",\n \"shortnames\": [\n \"arrow_left\"\n ]\n },\n {\n \"unified\": \"2196-FE0F\",\n \"shortnames\": [\n \"arrow_upper_left\"\n ]\n },\n {\n \"unified\": \"2195-FE0F\",\n \"shortnames\": [\n \"arrow_up_down\"\n ]\n },\n {\n \"unified\": \"2194-FE0F\",\n \"shortnames\": [\n \"left_right_arrow\"\n ]\n },\n {\n \"unified\": \"21A9-FE0F\",\n \"shortnames\": [\n \"leftwards_arrow_with_hook\"\n ]\n },\n {\n \"unified\": \"21AA-FE0F\",\n \"shortnames\": [\n \"arrow_right_hook\"\n ]\n },\n {\n \"unified\": \"2934-FE0F\",\n \"shortnames\": [\n \"arrow_heading_up\"\n ]\n },\n {\n \"unified\": \"2935-FE0F\",\n \"shortnames\": [\n \"arrow_heading_down\"\n ]\n },\n {\n \"unified\": \"1F503\",\n \"shortnames\": [\n \"arrows_clockwise\"\n ]\n },\n {\n \"unified\": \"1F504\",\n \"shortnames\": [\n \"arrows_counterclockwise\"\n ]\n },\n {\n \"unified\": \"1F519\",\n \"shortnames\": [\n \"back\"\n ]\n },\n {\n \"unified\": \"1F51A\",\n \"shortnames\": [\n \"end\"\n ]\n },\n {\n \"unified\": \"1F51B\",\n \"shortnames\": [\n \"on\"\n ]\n },\n {\n \"unified\": \"1F51C\",\n \"shortnames\": [\n \"soon\"\n ]\n },\n {\n \"unified\": \"1F51D\",\n \"shortnames\": [\n \"top\"\n ]\n },\n {\n \"unified\": \"1F6D0\",\n \"shortnames\": [\n \"place_of_worship\"\n ]\n },\n {\n \"unified\": \"269B-FE0F\",\n \"shortnames\": [\n \"atom_symbol\"\n ]\n },\n {\n \"unified\": \"1F549-FE0F\",\n \"shortnames\": [\n \"om_symbol\"\n ]\n },\n {\n \"unified\": \"2721-FE0F\",\n \"shortnames\": [\n \"star_of_david\"\n ]\n },\n {\n \"unified\": \"2638-FE0F\",\n \"shortnames\": [\n \"wheel_of_dharma\"\n ]\n },\n {\n \"unified\": \"262F-FE0F\",\n \"shortnames\": [\n \"yin_yang\"\n ]\n },\n {\n \"unified\": \"271D-FE0F\",\n \"shortnames\": [\n \"latin_cross\"\n ]\n },\n {\n \"unified\": \"2626-FE0F\",\n \"shortnames\": [\n \"orthodox_cross\"\n ]\n },\n {\n \"unified\": \"262A-FE0F\",\n \"shortnames\": [\n \"star_and_crescent\"\n ]\n },\n {\n \"unified\": \"262E-FE0F\",\n \"shortnames\": [\n \"peace_symbol\"\n ]\n },\n {\n \"unified\": \"1F54E\",\n \"shortnames\": [\n \"menorah_with_nine_branches\"\n ]\n },\n {\n \"unified\": \"1F52F\",\n \"shortnames\": [\n \"six_pointed_star\"\n ]\n },\n {\n \"unified\": \"2648\",\n \"shortnames\": [\n \"aries\"\n ]\n },\n {\n \"unified\": \"2649\",\n \"shortnames\": [\n \"taurus\"\n ]\n },\n {\n \"unified\": \"264A\",\n \"shortnames\": [\n \"gemini\"\n ]\n },\n {\n \"unified\": \"264B\",\n \"shortnames\": [\n \"cancer\"\n ]\n },\n {\n \"unified\": \"264C\",\n \"shortnames\": [\n \"leo\"\n ]\n },\n {\n \"unified\": \"264D\",\n \"shortnames\": [\n \"virgo\"\n ]\n },\n {\n \"unified\": \"264E\",\n \"shortnames\": [\n \"libra\"\n ]\n },\n {\n \"unified\": \"264F\",\n \"shortnames\": [\n \"scorpius\"\n ]\n },\n {\n \"unified\": \"2650\",\n \"shortnames\": [\n \"sagittarius\"\n ]\n },\n {\n \"unified\": \"2651\",\n \"shortnames\": [\n \"capricorn\"\n ]\n },\n {\n \"unified\": \"2652\",\n \"shortnames\": [\n \"aquarius\"\n ]\n },\n {\n \"unified\": \"2653\",\n \"shortnames\": [\n \"pisces\"\n ]\n },\n {\n \"unified\": \"26CE\",\n \"shortnames\": [\n \"ophiuchus\"\n ]\n },\n {\n \"unified\": \"1F500\",\n \"shortnames\": [\n \"twisted_rightwards_arrows\"\n ]\n },\n {\n \"unified\": \"1F501\",\n \"shortnames\": [\n \"repeat\"\n ]\n },\n {\n \"unified\": \"1F502\",\n \"shortnames\": [\n \"repeat_one\"\n ]\n },\n {\n \"unified\": \"25B6-FE0F\",\n \"shortnames\": [\n \"arrow_forward\"\n ]\n },\n {\n \"unified\": \"23E9\",\n \"shortnames\": [\n \"fast_forward\"\n ]\n },\n {\n \"unified\": \"23ED-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23EF-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_triangle_with_double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"25C0-FE0F\",\n \"shortnames\": [\n \"arrow_backward\"\n ]\n },\n {\n \"unified\": \"23EA\",\n \"shortnames\": [\n \"rewind\"\n ]\n },\n {\n \"unified\": \"23EE-FE0F\",\n \"shortnames\": [\n \"black_left_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"1F53C\",\n \"shortnames\": [\n \"arrow_up_small\"\n ]\n },\n {\n \"unified\": \"23EB\",\n \"shortnames\": [\n \"arrow_double_up\"\n ]\n },\n {\n \"unified\": \"1F53D\",\n \"shortnames\": [\n \"arrow_down_small\"\n ]\n },\n {\n \"unified\": \"23EC\",\n \"shortnames\": [\n \"arrow_double_down\"\n ]\n },\n {\n \"unified\": \"23F8-FE0F\",\n \"shortnames\": [\n \"double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23F9-FE0F\",\n \"shortnames\": [\n \"black_square_for_stop\"\n ]\n },\n {\n \"unified\": \"23FA-FE0F\",\n \"shortnames\": [\n \"black_circle_for_record\"\n ]\n },\n {\n \"unified\": \"23CF-FE0F\",\n \"shortnames\": [\n \"eject\"\n ]\n },\n {\n \"unified\": \"1F3A6\",\n \"shortnames\": [\n \"cinema\"\n ]\n },\n {\n \"unified\": \"1F505\",\n \"shortnames\": [\n \"low_brightness\"\n ]\n },\n {\n \"unified\": \"1F506\",\n \"shortnames\": [\n \"high_brightness\"\n ]\n },\n {\n \"unified\": \"1F4F6\",\n \"shortnames\": [\n \"signal_strength\"\n ]\n },\n {\n \"unified\": \"1F4F3\",\n \"shortnames\": [\n \"vibration_mode\"\n ]\n },\n {\n \"unified\": \"1F4F4\",\n \"shortnames\": [\n \"mobile_phone_off\"\n ]\n },\n {\n \"unified\": \"2640-FE0F\",\n \"shortnames\": [\n \"female_sign\"\n ]\n },\n {\n \"unified\": \"2642-FE0F\",\n \"shortnames\": [\n \"male_sign\"\n ]\n },\n {\n \"unified\": \"26A7-FE0F\",\n \"shortnames\": [\n \"transgender_symbol\"\n ]\n },\n {\n \"unified\": \"2716-FE0F\",\n \"shortnames\": [\n \"heavy_multiplication_x\"\n ]\n },\n {\n \"unified\": \"2795\",\n \"shortnames\": [\n \"heavy_plus_sign\"\n ]\n },\n {\n \"unified\": \"2796\",\n \"shortnames\": [\n \"heavy_minus_sign\"\n ]\n },\n {\n \"unified\": \"2797\",\n \"shortnames\": [\n \"heavy_division_sign\"\n ]\n },\n {\n \"unified\": \"267E-FE0F\",\n \"shortnames\": [\n \"infinity\"\n ]\n },\n {\n \"unified\": \"203C-FE0F\",\n \"shortnames\": [\n \"bangbang\"\n ]\n },\n {\n \"unified\": \"2049-FE0F\",\n \"shortnames\": [\n \"interrobang\"\n ]\n },\n {\n \"unified\": \"2753\",\n \"shortnames\": [\n \"question\"\n ]\n },\n {\n \"unified\": \"2754\",\n \"shortnames\": [\n \"grey_question\"\n ]\n },\n {\n \"unified\": \"2755\",\n \"shortnames\": [\n \"grey_exclamation\"\n ]\n },\n {\n \"unified\": \"2757\",\n \"shortnames\": [\n \"exclamation\"\n ]\n },\n {\n \"unified\": \"3030-FE0F\",\n \"shortnames\": [\n \"wavy_dash\"\n ]\n },\n {\n \"unified\": \"1F4B1\",\n \"shortnames\": [\n \"currency_exchange\"\n ]\n },\n {\n \"unified\": \"1F4B2\",\n \"shortnames\": [\n \"heavy_dollar_sign\"\n ]\n },\n {\n \"unified\": \"2695-FE0F\",\n \"shortnames\": [\n \"medical_symbol\"\n ]\n },\n {\n \"unified\": \"267B-FE0F\",\n \"shortnames\": [\n \"recycle\"\n ]\n },\n {\n \"unified\": \"269C-FE0F\",\n \"shortnames\": [\n \"fleur_de_lis\"\n ]\n },\n {\n \"unified\": \"1F531\",\n \"shortnames\": [\n \"trident\"\n ]\n },\n {\n \"unified\": \"1F4DB\",\n \"shortnames\": [\n \"name_badge\"\n ]\n },\n {\n \"unified\": \"1F530\",\n \"shortnames\": [\n \"beginner\"\n ]\n },\n {\n \"unified\": \"2B55\",\n \"shortnames\": [\n \"o\"\n ]\n },\n {\n \"unified\": \"2705\",\n \"shortnames\": [\n \"white_check_mark\"\n ]\n },\n {\n \"unified\": \"2611-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_check\"\n ]\n },\n {\n \"unified\": \"2714-FE0F\",\n \"shortnames\": [\n \"heavy_check_mark\"\n ]\n },\n {\n \"unified\": \"274C\",\n \"shortnames\": [\n \"x\"\n ]\n },\n {\n \"unified\": \"274E\",\n \"shortnames\": [\n \"negative_squared_cross_mark\"\n ]\n },\n {\n \"unified\": \"27B0\",\n \"shortnames\": [\n \"curly_loop\"\n ]\n },\n {\n \"unified\": \"27BF\",\n \"shortnames\": [\n \"loop\"\n ]\n },\n {\n \"unified\": \"303D-FE0F\",\n \"shortnames\": [\n \"part_alternation_mark\"\n ]\n },\n {\n \"unified\": \"2733-FE0F\",\n \"shortnames\": [\n \"eight_spoked_asterisk\"\n ]\n },\n {\n \"unified\": \"2734-FE0F\",\n \"shortnames\": [\n \"eight_pointed_black_star\"\n ]\n },\n {\n \"unified\": \"2747-FE0F\",\n \"shortnames\": [\n \"sparkle\"\n ]\n },\n {\n \"unified\": \"00A9-FE0F\",\n \"shortnames\": [\n \"copyright\"\n ]\n },\n {\n \"unified\": \"00AE-FE0F\",\n \"shortnames\": [\n \"registered\"\n ]\n },\n {\n \"unified\": \"2122-FE0F\",\n \"shortnames\": [\n \"tm\"\n ]\n },\n {\n \"unified\": \"0023-FE0F-20E3\",\n \"shortnames\": [\n \"hash\"\n ]\n },\n {\n \"unified\": \"002A-FE0F-20E3\",\n \"shortnames\": [\n \"keycap_star\"\n ]\n },\n {\n \"unified\": \"0030-FE0F-20E3\",\n \"shortnames\": [\n \"zero\"\n ]\n },\n {\n \"unified\": \"0031-FE0F-20E3\",\n \"shortnames\": [\n \"one\"\n ]\n },\n {\n \"unified\": \"0032-FE0F-20E3\",\n \"shortnames\": [\n \"two\"\n ]\n },\n {\n \"unified\": \"0033-FE0F-20E3\",\n \"shortnames\": [\n \"three\"\n ]\n },\n {\n \"unified\": \"0034-FE0F-20E3\",\n \"shortnames\": [\n \"four\"\n ]\n },\n {\n \"unified\": \"0035-FE0F-20E3\",\n \"shortnames\": [\n \"five\"\n ]\n },\n {\n \"unified\": \"0036-FE0F-20E3\",\n \"shortnames\": [\n \"six\"\n ]\n },\n {\n \"unified\": \"0037-FE0F-20E3\",\n \"shortnames\": [\n \"seven\"\n ]\n },\n {\n \"unified\": \"0038-FE0F-20E3\",\n \"shortnames\": [\n \"eight\"\n ]\n },\n {\n \"unified\": \"0039-FE0F-20E3\",\n \"shortnames\": [\n \"nine\"\n ]\n },\n {\n \"unified\": \"1F51F\",\n \"shortnames\": [\n \"keycap_ten\"\n ]\n },\n {\n \"unified\": \"1F520\",\n \"shortnames\": [\n \"capital_abcd\"\n ]\n },\n {\n \"unified\": \"1F521\",\n \"shortnames\": [\n \"abcd\"\n ]\n },\n {\n \"unified\": \"1F522\",\n \"shortnames\": [\n \"1234\"\n ]\n },\n {\n \"unified\": \"1F523\",\n \"shortnames\": [\n \"symbols\"\n ]\n },\n {\n \"unified\": \"1F524\",\n \"shortnames\": [\n \"abc\"\n ]\n },\n {\n \"unified\": \"1F170-FE0F\",\n \"shortnames\": [\n \"a\"\n ]\n },\n {\n \"unified\": \"1F18E\",\n \"shortnames\": [\n \"ab\"\n ]\n },\n {\n \"unified\": \"1F171-FE0F\",\n \"shortnames\": [\n \"b\"\n ]\n },\n {\n \"unified\": \"1F191\",\n \"shortnames\": [\n \"cl\"\n ]\n },\n {\n \"unified\": \"1F192\",\n \"shortnames\": [\n \"cool\"\n ]\n },\n {\n \"unified\": \"1F193\",\n \"shortnames\": [\n \"free\"\n ]\n },\n {\n \"unified\": \"2139-FE0F\",\n \"shortnames\": [\n \"information_source\"\n ]\n },\n {\n \"unified\": \"1F194\",\n \"shortnames\": [\n \"id\"\n ]\n },\n {\n \"unified\": \"24C2-FE0F\",\n \"shortnames\": [\n \"m\"\n ]\n },\n {\n \"unified\": \"1F195\",\n \"shortnames\": [\n \"new\"\n ]\n },\n {\n \"unified\": \"1F196\",\n \"shortnames\": [\n \"ng\"\n ]\n },\n {\n \"unified\": \"1F17E-FE0F\",\n \"shortnames\": [\n \"o2\"\n ]\n },\n {\n \"unified\": \"1F197\",\n \"shortnames\": [\n \"ok\"\n ]\n },\n {\n \"unified\": \"1F17F-FE0F\",\n \"shortnames\": [\n \"parking\"\n ]\n },\n {\n \"unified\": \"1F198\",\n \"shortnames\": [\n \"sos\"\n ]\n },\n {\n \"unified\": \"1F199\",\n \"shortnames\": [\n \"up\"\n ]\n },\n {\n \"unified\": \"1F19A\",\n \"shortnames\": [\n \"vs\"\n ]\n },\n {\n \"unified\": \"1F201\",\n \"shortnames\": [\n \"koko\"\n ]\n },\n {\n \"unified\": \"1F202-FE0F\",\n \"shortnames\": [\n \"sa\"\n ]\n },\n {\n \"unified\": \"1F237-FE0F\",\n \"shortnames\": [\n \"u6708\"\n ]\n },\n {\n \"unified\": \"1F236\",\n \"shortnames\": [\n \"u6709\"\n ]\n },\n {\n \"unified\": \"1F22F\",\n \"shortnames\": [\n \"u6307\"\n ]\n },\n {\n \"unified\": \"1F250\",\n \"shortnames\": [\n \"ideograph_advantage\"\n ]\n },\n {\n \"unified\": \"1F239\",\n \"shortnames\": [\n \"u5272\"\n ]\n },\n {\n \"unified\": \"1F21A\",\n \"shortnames\": [\n \"u7121\"\n ]\n },\n {\n \"unified\": \"1F232\",\n \"shortnames\": [\n \"u7981\"\n ]\n },\n {\n \"unified\": \"1F251\",\n \"shortnames\": [\n \"accept\"\n ]\n },\n {\n \"unified\": \"1F238\",\n \"shortnames\": [\n \"u7533\"\n ]\n },\n {\n \"unified\": \"1F234\",\n \"shortnames\": [\n \"u5408\"\n ]\n },\n {\n \"unified\": \"1F233\",\n \"shortnames\": [\n \"u7a7a\"\n ]\n },\n {\n \"unified\": \"3297-FE0F\",\n \"shortnames\": [\n \"congratulations\"\n ]\n },\n {\n \"unified\": \"3299-FE0F\",\n \"shortnames\": [\n \"secret\"\n ]\n },\n {\n \"unified\": \"1F23A\",\n \"shortnames\": [\n \"u55b6\"\n ]\n },\n {\n \"unified\": \"1F235\",\n \"shortnames\": [\n \"u6e80\"\n ]\n },\n {\n \"unified\": \"1F534\",\n \"shortnames\": [\n \"red_circle\"\n ]\n },\n {\n \"unified\": \"1F7E0\",\n \"shortnames\": [\n \"large_orange_circle\"\n ]\n },\n {\n \"unified\": \"1F7E1\",\n \"shortnames\": [\n \"large_yellow_circle\"\n ]\n },\n {\n \"unified\": \"1F7E2\",\n \"shortnames\": [\n \"large_green_circle\"\n ]\n },\n {\n \"unified\": \"1F535\",\n \"shortnames\": [\n \"large_blue_circle\"\n ]\n },\n {\n \"unified\": \"1F7E3\",\n \"shortnames\": [\n \"large_purple_circle\"\n ]\n },\n {\n \"unified\": \"1F7E4\",\n \"shortnames\": [\n \"large_brown_circle\"\n ]\n },\n {\n \"unified\": \"26AB\",\n \"shortnames\": [\n \"black_circle\"\n ]\n },\n {\n \"unified\": \"26AA\",\n \"shortnames\": [\n \"white_circle\"\n ]\n },\n {\n \"unified\": \"1F7E5\",\n \"shortnames\": [\n \"large_red_square\"\n ]\n },\n {\n \"unified\": \"1F7E7\",\n \"shortnames\": [\n \"large_orange_square\"\n ]\n },\n {\n \"unified\": \"1F7E8\",\n \"shortnames\": [\n \"large_yellow_square\"\n ]\n },\n {\n \"unified\": \"1F7E9\",\n \"shortnames\": [\n \"large_green_square\"\n ]\n },\n {\n \"unified\": \"1F7E6\",\n \"shortnames\": [\n \"large_blue_square\"\n ]\n },\n {\n \"unified\": \"1F7EA\",\n \"shortnames\": [\n \"large_purple_square\"\n ]\n },\n {\n \"unified\": \"1F7EB\",\n \"shortnames\": [\n \"large_brown_square\"\n ]\n },\n {\n \"unified\": \"2B1B\",\n \"shortnames\": [\n \"black_large_square\"\n ]\n },\n {\n \"unified\": \"2B1C\",\n \"shortnames\": [\n \"white_large_square\"\n ]\n },\n {\n \"unified\": \"25FC-FE0F\",\n \"shortnames\": [\n \"black_medium_square\"\n ]\n },\n {\n \"unified\": \"25FB-FE0F\",\n \"shortnames\": [\n \"white_medium_square\"\n ]\n },\n {\n \"unified\": \"25FE\",\n \"shortnames\": [\n \"black_medium_small_square\"\n ]\n },\n {\n \"unified\": \"25FD\",\n \"shortnames\": [\n \"white_medium_small_square\"\n ]\n },\n {\n \"unified\": \"25AA-FE0F\",\n \"shortnames\": [\n \"black_small_square\"\n ]\n },\n {\n \"unified\": \"25AB-FE0F\",\n \"shortnames\": [\n \"white_small_square\"\n ]\n },\n {\n \"unified\": \"1F536\",\n \"shortnames\": [\n \"large_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F537\",\n \"shortnames\": [\n \"large_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F538\",\n \"shortnames\": [\n \"small_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F539\",\n \"shortnames\": [\n \"small_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F53A\",\n \"shortnames\": [\n \"small_red_triangle\"\n ]\n },\n {\n \"unified\": \"1F53B\",\n \"shortnames\": [\n \"small_red_triangle_down\"\n ]\n },\n {\n \"unified\": \"1F4A0\",\n \"shortnames\": [\n \"diamond_shape_with_a_dot_inside\"\n ]\n },\n {\n \"unified\": \"1F518\",\n \"shortnames\": [\n \"radio_button\"\n ]\n },\n {\n \"unified\": \"1F533\",\n \"shortnames\": [\n \"white_square_button\"\n ]\n },\n {\n \"unified\": \"1F532\",\n \"shortnames\": [\n \"black_square_button\"\n ]\n }\n ]\n },\n {\n \"name\": \"Flags\",\n \"emojis\": [\n {\n \"unified\": \"1F3C1\",\n \"shortnames\": [\n \"checkered_flag\"\n ]\n },\n {\n \"unified\": \"1F6A9\",\n \"shortnames\": [\n \"triangular_flag_on_post\"\n ]\n },\n {\n \"unified\": \"1F38C\",\n \"shortnames\": [\n \"crossed_flags\"\n ]\n },\n {\n \"unified\": \"1F3F4\",\n \"shortnames\": [\n \"waving_black_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F\",\n \"shortnames\": [\n \"waving_white_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F-200D-1F308\",\n \"shortnames\": [\n \"rainbow-flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F-200D-26A7-FE0F\",\n \"shortnames\": [\n \"transgender_flag\"\n ]\n },\n {\n \"unified\": \"1F3F4-200D-2620-FE0F\",\n \"shortnames\": [\n \"pirate_flag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E8\",\n \"shortnames\": [\n \"flag-ac\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E9\",\n \"shortnames\": [\n \"flag-ad\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EA\",\n \"shortnames\": [\n \"flag-ae\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EB\",\n \"shortnames\": [\n \"flag-af\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EC\",\n \"shortnames\": [\n \"flag-ag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EE\",\n \"shortnames\": [\n \"flag-ai\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F1\",\n \"shortnames\": [\n \"flag-al\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F2\",\n \"shortnames\": [\n \"flag-am\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F4\",\n \"shortnames\": [\n \"flag-ao\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F6\",\n \"shortnames\": [\n \"flag-aq\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F7\",\n \"shortnames\": [\n \"flag-ar\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F8\",\n \"shortnames\": [\n \"flag-as\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F9\",\n \"shortnames\": [\n \"flag-at\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FA\",\n \"shortnames\": [\n \"flag-au\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FC\",\n \"shortnames\": [\n \"flag-aw\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FD\",\n \"shortnames\": [\n \"flag-ax\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FF\",\n \"shortnames\": [\n \"flag-az\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E6\",\n \"shortnames\": [\n \"flag-ba\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E7\",\n \"shortnames\": [\n \"flag-bb\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E9\",\n \"shortnames\": [\n \"flag-bd\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EA\",\n \"shortnames\": [\n \"flag-be\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EB\",\n \"shortnames\": [\n \"flag-bf\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EC\",\n \"shortnames\": [\n \"flag-bg\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1ED\",\n \"shortnames\": [\n \"flag-bh\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EE\",\n \"shortnames\": [\n \"flag-bi\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EF\",\n \"shortnames\": [\n \"flag-bj\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F1\",\n \"shortnames\": [\n \"flag-bl\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F2\",\n \"shortnames\": [\n \"flag-bm\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F3\",\n \"shortnames\": [\n \"flag-bn\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F4\",\n \"shortnames\": [\n \"flag-bo\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F6\",\n \"shortnames\": [\n \"flag-bq\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F7\",\n \"shortnames\": [\n \"flag-br\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F8\",\n \"shortnames\": [\n \"flag-bs\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F9\",\n \"shortnames\": [\n \"flag-bt\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FB\",\n \"shortnames\": [\n \"flag-bv\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FC\",\n \"shortnames\": [\n \"flag-bw\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FE\",\n \"shortnames\": [\n \"flag-by\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FF\",\n \"shortnames\": [\n \"flag-bz\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E6\",\n \"shortnames\": [\n \"flag-ca\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E8\",\n \"shortnames\": [\n \"flag-cc\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E9\",\n \"shortnames\": [\n \"flag-cd\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EB\",\n \"shortnames\": [\n \"flag-cf\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EC\",\n \"shortnames\": [\n \"flag-cg\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1ED\",\n \"shortnames\": [\n \"flag-ch\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EE\",\n \"shortnames\": [\n \"flag-ci\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F0\",\n \"shortnames\": [\n \"flag-ck\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F1\",\n \"shortnames\": [\n \"flag-cl\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F2\",\n \"shortnames\": [\n \"flag-cm\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F3\",\n \"shortnames\": [\n \"cn\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F4\",\n \"shortnames\": [\n \"flag-co\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F5\",\n \"shortnames\": [\n \"flag-cp\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F7\",\n \"shortnames\": [\n \"flag-cr\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FA\",\n \"shortnames\": [\n \"flag-cu\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FB\",\n \"shortnames\": [\n \"flag-cv\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FC\",\n \"shortnames\": [\n \"flag-cw\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FD\",\n \"shortnames\": [\n \"flag-cx\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FE\",\n \"shortnames\": [\n \"flag-cy\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FF\",\n \"shortnames\": [\n \"flag-cz\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EA\",\n \"shortnames\": [\n \"de\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EC\",\n \"shortnames\": [\n \"flag-dg\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EF\",\n \"shortnames\": [\n \"flag-dj\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F0\",\n \"shortnames\": [\n \"flag-dk\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F2\",\n \"shortnames\": [\n \"flag-dm\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F4\",\n \"shortnames\": [\n \"flag-do\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1FF\",\n \"shortnames\": [\n \"flag-dz\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E6\",\n \"shortnames\": [\n \"flag-ea\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E8\",\n \"shortnames\": [\n \"flag-ec\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EA\",\n \"shortnames\": [\n \"flag-ee\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EC\",\n \"shortnames\": [\n \"flag-eg\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1ED\",\n \"shortnames\": [\n \"flag-eh\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F7\",\n \"shortnames\": [\n \"flag-er\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F8\",\n \"shortnames\": [\n \"es\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F9\",\n \"shortnames\": [\n \"flag-et\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1FA\",\n \"shortnames\": [\n \"flag-eu\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EE\",\n \"shortnames\": [\n \"flag-fi\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EF\",\n \"shortnames\": [\n \"flag-fj\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F0\",\n \"shortnames\": [\n \"flag-fk\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F2\",\n \"shortnames\": [\n \"flag-fm\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F4\",\n \"shortnames\": [\n \"flag-fo\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F7\",\n \"shortnames\": [\n \"fr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E6\",\n \"shortnames\": [\n \"flag-ga\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E7\",\n \"shortnames\": [\n \"gb\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E9\",\n \"shortnames\": [\n \"flag-gd\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EA\",\n \"shortnames\": [\n \"flag-ge\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EB\",\n \"shortnames\": [\n \"flag-gf\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EC\",\n \"shortnames\": [\n \"flag-gg\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1ED\",\n \"shortnames\": [\n \"flag-gh\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EE\",\n \"shortnames\": [\n \"flag-gi\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F1\",\n \"shortnames\": [\n \"flag-gl\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F2\",\n \"shortnames\": [\n \"flag-gm\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F3\",\n \"shortnames\": [\n \"flag-gn\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F5\",\n \"shortnames\": [\n \"flag-gp\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F6\",\n \"shortnames\": [\n \"flag-gq\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F7\",\n \"shortnames\": [\n \"flag-gr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F8\",\n \"shortnames\": [\n \"flag-gs\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F9\",\n \"shortnames\": [\n \"flag-gt\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FA\",\n \"shortnames\": [\n \"flag-gu\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FC\",\n \"shortnames\": [\n \"flag-gw\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FE\",\n \"shortnames\": [\n \"flag-gy\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F0\",\n \"shortnames\": [\n \"flag-hk\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F2\",\n \"shortnames\": [\n \"flag-hm\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F3\",\n \"shortnames\": [\n \"flag-hn\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F7\",\n \"shortnames\": [\n \"flag-hr\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F9\",\n \"shortnames\": [\n \"flag-ht\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1FA\",\n \"shortnames\": [\n \"flag-hu\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E8\",\n \"shortnames\": [\n \"flag-ic\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E9\",\n \"shortnames\": [\n \"flag-id\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1EA\",\n \"shortnames\": [\n \"flag-ie\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F1\",\n \"shortnames\": [\n \"flag-il\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F2\",\n \"shortnames\": [\n \"flag-im\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F3\",\n \"shortnames\": [\n \"flag-in\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F4\",\n \"shortnames\": [\n \"flag-io\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F6\",\n \"shortnames\": [\n \"flag-iq\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F7\",\n \"shortnames\": [\n \"flag-ir\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F8\",\n \"shortnames\": [\n \"flag-is\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F9\",\n \"shortnames\": [\n \"it\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1EA\",\n \"shortnames\": [\n \"flag-je\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F2\",\n \"shortnames\": [\n \"flag-jm\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F4\",\n \"shortnames\": [\n \"flag-jo\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F5\",\n \"shortnames\": [\n \"jp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EA\",\n \"shortnames\": [\n \"flag-ke\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EC\",\n \"shortnames\": [\n \"flag-kg\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1ED\",\n \"shortnames\": [\n \"flag-kh\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EE\",\n \"shortnames\": [\n \"flag-ki\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F2\",\n \"shortnames\": [\n \"flag-km\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F3\",\n \"shortnames\": [\n \"flag-kn\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F5\",\n \"shortnames\": [\n \"flag-kp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F7\",\n \"shortnames\": [\n \"kr\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FC\",\n \"shortnames\": [\n \"flag-kw\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FE\",\n \"shortnames\": [\n \"flag-ky\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FF\",\n \"shortnames\": [\n \"flag-kz\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E6\",\n \"shortnames\": [\n \"flag-la\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E7\",\n \"shortnames\": [\n \"flag-lb\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E8\",\n \"shortnames\": [\n \"flag-lc\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1EE\",\n \"shortnames\": [\n \"flag-li\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F0\",\n \"shortnames\": [\n \"flag-lk\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F7\",\n \"shortnames\": [\n \"flag-lr\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F8\",\n \"shortnames\": [\n \"flag-ls\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F9\",\n \"shortnames\": [\n \"flag-lt\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FA\",\n \"shortnames\": [\n \"flag-lu\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FB\",\n \"shortnames\": [\n \"flag-lv\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FE\",\n \"shortnames\": [\n \"flag-ly\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E6\",\n \"shortnames\": [\n \"flag-ma\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E8\",\n \"shortnames\": [\n \"flag-mc\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E9\",\n \"shortnames\": [\n \"flag-md\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EA\",\n \"shortnames\": [\n \"flag-me\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EB\",\n \"shortnames\": [\n \"flag-mf\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EC\",\n \"shortnames\": [\n \"flag-mg\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1ED\",\n \"shortnames\": [\n \"flag-mh\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F0\",\n \"shortnames\": [\n \"flag-mk\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F1\",\n \"shortnames\": [\n \"flag-ml\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F2\",\n \"shortnames\": [\n \"flag-mm\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F3\",\n \"shortnames\": [\n \"flag-mn\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F4\",\n \"shortnames\": [\n \"flag-mo\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F5\",\n \"shortnames\": [\n \"flag-mp\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F6\",\n \"shortnames\": [\n \"flag-mq\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F7\",\n \"shortnames\": [\n \"flag-mr\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F8\",\n \"shortnames\": [\n \"flag-ms\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F9\",\n \"shortnames\": [\n \"flag-mt\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FA\",\n \"shortnames\": [\n \"flag-mu\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FB\",\n \"shortnames\": [\n \"flag-mv\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FC\",\n \"shortnames\": [\n \"flag-mw\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FD\",\n \"shortnames\": [\n \"flag-mx\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FE\",\n \"shortnames\": [\n \"flag-my\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FF\",\n \"shortnames\": [\n \"flag-mz\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E6\",\n \"shortnames\": [\n \"flag-na\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E8\",\n \"shortnames\": [\n \"flag-nc\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EA\",\n \"shortnames\": [\n \"flag-ne\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EB\",\n \"shortnames\": [\n \"flag-nf\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EC\",\n \"shortnames\": [\n \"flag-ng\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EE\",\n \"shortnames\": [\n \"flag-ni\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F1\",\n \"shortnames\": [\n \"flag-nl\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F4\",\n \"shortnames\": [\n \"flag-no\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F5\",\n \"shortnames\": [\n \"flag-np\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F7\",\n \"shortnames\": [\n \"flag-nr\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FA\",\n \"shortnames\": [\n \"flag-nu\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FF\",\n \"shortnames\": [\n \"flag-nz\"\n ]\n },\n {\n \"unified\": \"1F1F4-1F1F2\",\n \"shortnames\": [\n \"flag-om\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1E6\",\n \"shortnames\": [\n \"flag-pa\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EA\",\n \"shortnames\": [\n \"flag-pe\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EB\",\n \"shortnames\": [\n \"flag-pf\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EC\",\n \"shortnames\": [\n \"flag-pg\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1ED\",\n \"shortnames\": [\n \"flag-ph\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F0\",\n \"shortnames\": [\n \"flag-pk\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F1\",\n \"shortnames\": [\n \"flag-pl\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F2\",\n \"shortnames\": [\n \"flag-pm\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F3\",\n \"shortnames\": [\n \"flag-pn\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F7\",\n \"shortnames\": [\n \"flag-pr\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F8\",\n \"shortnames\": [\n \"flag-ps\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F9\",\n \"shortnames\": [\n \"flag-pt\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FC\",\n \"shortnames\": [\n \"flag-pw\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FE\",\n \"shortnames\": [\n \"flag-py\"\n ]\n },\n {\n \"unified\": \"1F1F6-1F1E6\",\n \"shortnames\": [\n \"flag-qa\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1EA\",\n \"shortnames\": [\n \"flag-re\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F4\",\n \"shortnames\": [\n \"flag-ro\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F8\",\n \"shortnames\": [\n \"flag-rs\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FA\",\n \"shortnames\": [\n \"ru\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FC\",\n \"shortnames\": [\n \"flag-rw\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E6\",\n \"shortnames\": [\n \"flag-sa\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E7\",\n \"shortnames\": [\n \"flag-sb\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E8\",\n \"shortnames\": [\n \"flag-sc\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E9\",\n \"shortnames\": [\n \"flag-sd\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EA\",\n \"shortnames\": [\n \"flag-se\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EC\",\n \"shortnames\": [\n \"flag-sg\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1ED\",\n \"shortnames\": [\n \"flag-sh\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EE\",\n \"shortnames\": [\n \"flag-si\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EF\",\n \"shortnames\": [\n \"flag-sj\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F0\",\n \"shortnames\": [\n \"flag-sk\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F1\",\n \"shortnames\": [\n \"flag-sl\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F2\",\n \"shortnames\": [\n \"flag-sm\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F3\",\n \"shortnames\": [\n \"flag-sn\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F4\",\n \"shortnames\": [\n \"flag-so\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F7\",\n \"shortnames\": [\n \"flag-sr\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F8\",\n \"shortnames\": [\n \"flag-ss\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F9\",\n \"shortnames\": [\n \"flag-st\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FB\",\n \"shortnames\": [\n \"flag-sv\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FD\",\n \"shortnames\": [\n \"flag-sx\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FE\",\n \"shortnames\": [\n \"flag-sy\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FF\",\n \"shortnames\": [\n \"flag-sz\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E6\",\n \"shortnames\": [\n \"flag-ta\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E8\",\n \"shortnames\": [\n \"flag-tc\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E9\",\n \"shortnames\": [\n \"flag-td\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EB\",\n \"shortnames\": [\n \"flag-tf\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EC\",\n \"shortnames\": [\n \"flag-tg\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1ED\",\n \"shortnames\": [\n \"flag-th\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EF\",\n \"shortnames\": [\n \"flag-tj\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F0\",\n \"shortnames\": [\n \"flag-tk\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F1\",\n \"shortnames\": [\n \"flag-tl\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F2\",\n \"shortnames\": [\n \"flag-tm\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F3\",\n \"shortnames\": [\n \"flag-tn\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F4\",\n \"shortnames\": [\n \"flag-to\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F7\",\n \"shortnames\": [\n \"flag-tr\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F9\",\n \"shortnames\": [\n \"flag-tt\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FB\",\n \"shortnames\": [\n \"flag-tv\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FC\",\n \"shortnames\": [\n \"flag-tw\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FF\",\n \"shortnames\": [\n \"flag-tz\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1E6\",\n \"shortnames\": [\n \"flag-ua\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1EC\",\n \"shortnames\": [\n \"flag-ug\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F2\",\n \"shortnames\": [\n \"flag-um\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F3\",\n \"shortnames\": [\n \"flag-un\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F8\",\n \"shortnames\": [\n \"us\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FE\",\n \"shortnames\": [\n \"flag-uy\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FF\",\n \"shortnames\": [\n \"flag-uz\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E6\",\n \"shortnames\": [\n \"flag-va\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E8\",\n \"shortnames\": [\n \"flag-vc\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EA\",\n \"shortnames\": [\n \"flag-ve\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EC\",\n \"shortnames\": [\n \"flag-vg\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EE\",\n \"shortnames\": [\n \"flag-vi\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1F3\",\n \"shortnames\": [\n \"flag-vn\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1FA\",\n \"shortnames\": [\n \"flag-vu\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1EB\",\n \"shortnames\": [\n \"flag-wf\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1F8\",\n \"shortnames\": [\n \"flag-ws\"\n ]\n },\n {\n \"unified\": \"1F1FD-1F1F0\",\n \"shortnames\": [\n \"flag-xk\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1EA\",\n \"shortnames\": [\n \"flag-ye\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1F9\",\n \"shortnames\": [\n \"flag-yt\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1E6\",\n \"shortnames\": [\n \"flag-za\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1F2\",\n \"shortnames\": [\n \"flag-zm\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1FC\",\n \"shortnames\": [\n \"flag-zw\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"shortnames\": [\n \"flag-england\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"shortnames\": [\n \"flag-scotland\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"shortnames\": [\n \"flag-wales\"\n ]\n }\n ]\n }\n];\n\nexport const byShortName = {\n \"hash\": \"0023-FE0F-20E3\",\n \"keycap_star\": \"002A-FE0F-20E3\",\n \"zero\": \"0030-FE0F-20E3\",\n \"one\": \"0031-FE0F-20E3\",\n \"two\": \"0032-FE0F-20E3\",\n \"three\": \"0033-FE0F-20E3\",\n \"four\": \"0034-FE0F-20E3\",\n \"five\": \"0035-FE0F-20E3\",\n \"six\": \"0036-FE0F-20E3\",\n \"seven\": \"0037-FE0F-20E3\",\n \"eight\": \"0038-FE0F-20E3\",\n \"nine\": \"0039-FE0F-20E3\",\n \"copyright\": \"00A9-FE0F\",\n \"registered\": \"00AE-FE0F\",\n \"mahjong\": \"1F004\",\n \"black_joker\": \"1F0CF\",\n \"a\": \"1F170-FE0F\",\n \"b\": \"1F171-FE0F\",\n \"o2\": \"1F17E-FE0F\",\n \"parking\": \"1F17F-FE0F\",\n \"ab\": \"1F18E\",\n \"cl\": \"1F191\",\n \"cool\": \"1F192\",\n \"free\": \"1F193\",\n \"id\": \"1F194\",\n \"new\": \"1F195\",\n \"ng\": \"1F196\",\n \"ok\": \"1F197\",\n \"sos\": \"1F198\",\n \"up\": \"1F199\",\n \"vs\": \"1F19A\",\n \"flag-ac\": \"1F1E6-1F1E8\",\n \"flag-ad\": \"1F1E6-1F1E9\",\n \"flag-ae\": \"1F1E6-1F1EA\",\n \"flag-af\": \"1F1E6-1F1EB\",\n \"flag-ag\": \"1F1E6-1F1EC\",\n \"flag-ai\": \"1F1E6-1F1EE\",\n \"flag-al\": \"1F1E6-1F1F1\",\n \"flag-am\": \"1F1E6-1F1F2\",\n \"flag-ao\": \"1F1E6-1F1F4\",\n \"flag-aq\": \"1F1E6-1F1F6\",\n \"flag-ar\": \"1F1E6-1F1F7\",\n \"flag-as\": \"1F1E6-1F1F8\",\n \"flag-at\": \"1F1E6-1F1F9\",\n \"flag-au\": \"1F1E6-1F1FA\",\n \"flag-aw\": \"1F1E6-1F1FC\",\n \"flag-ax\": \"1F1E6-1F1FD\",\n \"flag-az\": \"1F1E6-1F1FF\",\n \"flag-ba\": \"1F1E7-1F1E6\",\n \"flag-bb\": \"1F1E7-1F1E7\",\n \"flag-bd\": \"1F1E7-1F1E9\",\n \"flag-be\": \"1F1E7-1F1EA\",\n \"flag-bf\": \"1F1E7-1F1EB\",\n \"flag-bg\": \"1F1E7-1F1EC\",\n \"flag-bh\": \"1F1E7-1F1ED\",\n \"flag-bi\": \"1F1E7-1F1EE\",\n \"flag-bj\": \"1F1E7-1F1EF\",\n \"flag-bl\": \"1F1E7-1F1F1\",\n \"flag-bm\": \"1F1E7-1F1F2\",\n \"flag-bn\": \"1F1E7-1F1F3\",\n \"flag-bo\": \"1F1E7-1F1F4\",\n \"flag-bq\": \"1F1E7-1F1F6\",\n \"flag-br\": \"1F1E7-1F1F7\",\n \"flag-bs\": \"1F1E7-1F1F8\",\n \"flag-bt\": \"1F1E7-1F1F9\",\n \"flag-bv\": \"1F1E7-1F1FB\",\n \"flag-bw\": \"1F1E7-1F1FC\",\n \"flag-by\": \"1F1E7-1F1FE\",\n \"flag-bz\": \"1F1E7-1F1FF\",\n \"flag-ca\": \"1F1E8-1F1E6\",\n \"flag-cc\": \"1F1E8-1F1E8\",\n \"flag-cd\": \"1F1E8-1F1E9\",\n \"flag-cf\": \"1F1E8-1F1EB\",\n \"flag-cg\": \"1F1E8-1F1EC\",\n \"flag-ch\": \"1F1E8-1F1ED\",\n \"flag-ci\": \"1F1E8-1F1EE\",\n \"flag-ck\": \"1F1E8-1F1F0\",\n \"flag-cl\": \"1F1E8-1F1F1\",\n \"flag-cm\": \"1F1E8-1F1F2\",\n \"cn\": \"1F1E8-1F1F3\",\n \"flag-co\": \"1F1E8-1F1F4\",\n \"flag-cp\": \"1F1E8-1F1F5\",\n \"flag-cr\": \"1F1E8-1F1F7\",\n \"flag-cu\": \"1F1E8-1F1FA\",\n \"flag-cv\": \"1F1E8-1F1FB\",\n \"flag-cw\": \"1F1E8-1F1FC\",\n \"flag-cx\": \"1F1E8-1F1FD\",\n \"flag-cy\": \"1F1E8-1F1FE\",\n \"flag-cz\": \"1F1E8-1F1FF\",\n \"de\": \"1F1E9-1F1EA\",\n \"flag-dg\": \"1F1E9-1F1EC\",\n \"flag-dj\": \"1F1E9-1F1EF\",\n \"flag-dk\": \"1F1E9-1F1F0\",\n \"flag-dm\": \"1F1E9-1F1F2\",\n \"flag-do\": \"1F1E9-1F1F4\",\n \"flag-dz\": \"1F1E9-1F1FF\",\n \"flag-ea\": \"1F1EA-1F1E6\",\n \"flag-ec\": \"1F1EA-1F1E8\",\n \"flag-ee\": \"1F1EA-1F1EA\",\n \"flag-eg\": \"1F1EA-1F1EC\",\n \"flag-eh\": \"1F1EA-1F1ED\",\n \"flag-er\": \"1F1EA-1F1F7\",\n \"es\": \"1F1EA-1F1F8\",\n \"flag-et\": \"1F1EA-1F1F9\",\n \"flag-eu\": \"1F1EA-1F1FA\",\n \"flag-fi\": \"1F1EB-1F1EE\",\n \"flag-fj\": \"1F1EB-1F1EF\",\n \"flag-fk\": \"1F1EB-1F1F0\",\n \"flag-fm\": \"1F1EB-1F1F2\",\n \"flag-fo\": \"1F1EB-1F1F4\",\n \"fr\": \"1F1EB-1F1F7\",\n \"flag-ga\": \"1F1EC-1F1E6\",\n \"gb\": \"1F1EC-1F1E7\",\n \"flag-gd\": \"1F1EC-1F1E9\",\n \"flag-ge\": \"1F1EC-1F1EA\",\n \"flag-gf\": \"1F1EC-1F1EB\",\n \"flag-gg\": \"1F1EC-1F1EC\",\n \"flag-gh\": \"1F1EC-1F1ED\",\n \"flag-gi\": \"1F1EC-1F1EE\",\n \"flag-gl\": \"1F1EC-1F1F1\",\n \"flag-gm\": \"1F1EC-1F1F2\",\n \"flag-gn\": \"1F1EC-1F1F3\",\n \"flag-gp\": \"1F1EC-1F1F5\",\n \"flag-gq\": \"1F1EC-1F1F6\",\n \"flag-gr\": \"1F1EC-1F1F7\",\n \"flag-gs\": \"1F1EC-1F1F8\",\n \"flag-gt\": \"1F1EC-1F1F9\",\n \"flag-gu\": \"1F1EC-1F1FA\",\n \"flag-gw\": \"1F1EC-1F1FC\",\n \"flag-gy\": \"1F1EC-1F1FE\",\n \"flag-hk\": \"1F1ED-1F1F0\",\n \"flag-hm\": \"1F1ED-1F1F2\",\n \"flag-hn\": \"1F1ED-1F1F3\",\n \"flag-hr\": \"1F1ED-1F1F7\",\n \"flag-ht\": \"1F1ED-1F1F9\",\n \"flag-hu\": \"1F1ED-1F1FA\",\n \"flag-ic\": \"1F1EE-1F1E8\",\n \"flag-id\": \"1F1EE-1F1E9\",\n \"flag-ie\": \"1F1EE-1F1EA\",\n \"flag-il\": \"1F1EE-1F1F1\",\n \"flag-im\": \"1F1EE-1F1F2\",\n \"flag-in\": \"1F1EE-1F1F3\",\n \"flag-io\": \"1F1EE-1F1F4\",\n \"flag-iq\": \"1F1EE-1F1F6\",\n \"flag-ir\": \"1F1EE-1F1F7\",\n \"flag-is\": \"1F1EE-1F1F8\",\n \"it\": \"1F1EE-1F1F9\",\n \"flag-je\": \"1F1EF-1F1EA\",\n \"flag-jm\": \"1F1EF-1F1F2\",\n \"flag-jo\": \"1F1EF-1F1F4\",\n \"jp\": \"1F1EF-1F1F5\",\n \"flag-ke\": \"1F1F0-1F1EA\",\n \"flag-kg\": \"1F1F0-1F1EC\",\n \"flag-kh\": \"1F1F0-1F1ED\",\n \"flag-ki\": \"1F1F0-1F1EE\",\n \"flag-km\": \"1F1F0-1F1F2\",\n \"flag-kn\": \"1F1F0-1F1F3\",\n \"flag-kp\": \"1F1F0-1F1F5\",\n \"kr\": \"1F1F0-1F1F7\",\n \"flag-kw\": \"1F1F0-1F1FC\",\n \"flag-ky\": \"1F1F0-1F1FE\",\n \"flag-kz\": \"1F1F0-1F1FF\",\n \"flag-la\": \"1F1F1-1F1E6\",\n \"flag-lb\": \"1F1F1-1F1E7\",\n \"flag-lc\": \"1F1F1-1F1E8\",\n \"flag-li\": \"1F1F1-1F1EE\",\n \"flag-lk\": \"1F1F1-1F1F0\",\n \"flag-lr\": \"1F1F1-1F1F7\",\n \"flag-ls\": \"1F1F1-1F1F8\",\n \"flag-lt\": \"1F1F1-1F1F9\",\n \"flag-lu\": \"1F1F1-1F1FA\",\n \"flag-lv\": \"1F1F1-1F1FB\",\n \"flag-ly\": \"1F1F1-1F1FE\",\n \"flag-ma\": \"1F1F2-1F1E6\",\n \"flag-mc\": \"1F1F2-1F1E8\",\n \"flag-md\": \"1F1F2-1F1E9\",\n \"flag-me\": \"1F1F2-1F1EA\",\n \"flag-mf\": \"1F1F2-1F1EB\",\n \"flag-mg\": \"1F1F2-1F1EC\",\n \"flag-mh\": \"1F1F2-1F1ED\",\n \"flag-mk\": \"1F1F2-1F1F0\",\n \"flag-ml\": \"1F1F2-1F1F1\",\n \"flag-mm\": \"1F1F2-1F1F2\",\n \"flag-mn\": \"1F1F2-1F1F3\",\n \"flag-mo\": \"1F1F2-1F1F4\",\n \"flag-mp\": \"1F1F2-1F1F5\",\n \"flag-mq\": \"1F1F2-1F1F6\",\n \"flag-mr\": \"1F1F2-1F1F7\",\n \"flag-ms\": \"1F1F2-1F1F8\",\n \"flag-mt\": \"1F1F2-1F1F9\",\n \"flag-mu\": \"1F1F2-1F1FA\",\n \"flag-mv\": \"1F1F2-1F1FB\",\n \"flag-mw\": \"1F1F2-1F1FC\",\n \"flag-mx\": \"1F1F2-1F1FD\",\n \"flag-my\": \"1F1F2-1F1FE\",\n \"flag-mz\": \"1F1F2-1F1FF\",\n \"flag-na\": \"1F1F3-1F1E6\",\n \"flag-nc\": \"1F1F3-1F1E8\",\n \"flag-ne\": \"1F1F3-1F1EA\",\n \"flag-nf\": \"1F1F3-1F1EB\",\n \"flag-ng\": \"1F1F3-1F1EC\",\n \"flag-ni\": \"1F1F3-1F1EE\",\n \"flag-nl\": \"1F1F3-1F1F1\",\n \"flag-no\": \"1F1F3-1F1F4\",\n \"flag-np\": \"1F1F3-1F1F5\",\n \"flag-nr\": \"1F1F3-1F1F7\",\n \"flag-nu\": \"1F1F3-1F1FA\",\n \"flag-nz\": \"1F1F3-1F1FF\",\n \"flag-om\": \"1F1F4-1F1F2\",\n \"flag-pa\": \"1F1F5-1F1E6\",\n \"flag-pe\": \"1F1F5-1F1EA\",\n \"flag-pf\": \"1F1F5-1F1EB\",\n \"flag-pg\": \"1F1F5-1F1EC\",\n \"flag-ph\": \"1F1F5-1F1ED\",\n \"flag-pk\": \"1F1F5-1F1F0\",\n \"flag-pl\": \"1F1F5-1F1F1\",\n \"flag-pm\": \"1F1F5-1F1F2\",\n \"flag-pn\": \"1F1F5-1F1F3\",\n \"flag-pr\": \"1F1F5-1F1F7\",\n \"flag-ps\": \"1F1F5-1F1F8\",\n \"flag-pt\": \"1F1F5-1F1F9\",\n \"flag-pw\": \"1F1F5-1F1FC\",\n \"flag-py\": \"1F1F5-1F1FE\",\n \"flag-qa\": \"1F1F6-1F1E6\",\n \"flag-re\": \"1F1F7-1F1EA\",\n \"flag-ro\": \"1F1F7-1F1F4\",\n \"flag-rs\": \"1F1F7-1F1F8\",\n \"ru\": \"1F1F7-1F1FA\",\n \"flag-rw\": \"1F1F7-1F1FC\",\n \"flag-sa\": \"1F1F8-1F1E6\",\n \"flag-sb\": \"1F1F8-1F1E7\",\n \"flag-sc\": \"1F1F8-1F1E8\",\n \"flag-sd\": \"1F1F8-1F1E9\",\n \"flag-se\": \"1F1F8-1F1EA\",\n \"flag-sg\": \"1F1F8-1F1EC\",\n \"flag-sh\": \"1F1F8-1F1ED\",\n \"flag-si\": \"1F1F8-1F1EE\",\n \"flag-sj\": \"1F1F8-1F1EF\",\n \"flag-sk\": \"1F1F8-1F1F0\",\n \"flag-sl\": \"1F1F8-1F1F1\",\n \"flag-sm\": \"1F1F8-1F1F2\",\n \"flag-sn\": \"1F1F8-1F1F3\",\n \"flag-so\": \"1F1F8-1F1F4\",\n \"flag-sr\": \"1F1F8-1F1F7\",\n \"flag-ss\": \"1F1F8-1F1F8\",\n \"flag-st\": \"1F1F8-1F1F9\",\n \"flag-sv\": \"1F1F8-1F1FB\",\n \"flag-sx\": \"1F1F8-1F1FD\",\n \"flag-sy\": \"1F1F8-1F1FE\",\n \"flag-sz\": \"1F1F8-1F1FF\",\n \"flag-ta\": \"1F1F9-1F1E6\",\n \"flag-tc\": \"1F1F9-1F1E8\",\n \"flag-td\": \"1F1F9-1F1E9\",\n \"flag-tf\": \"1F1F9-1F1EB\",\n \"flag-tg\": \"1F1F9-1F1EC\",\n \"flag-th\": \"1F1F9-1F1ED\",\n \"flag-tj\": \"1F1F9-1F1EF\",\n \"flag-tk\": \"1F1F9-1F1F0\",\n \"flag-tl\": \"1F1F9-1F1F1\",\n \"flag-tm\": \"1F1F9-1F1F2\",\n \"flag-tn\": \"1F1F9-1F1F3\",\n \"flag-to\": \"1F1F9-1F1F4\",\n \"flag-tr\": \"1F1F9-1F1F7\",\n \"flag-tt\": \"1F1F9-1F1F9\",\n \"flag-tv\": \"1F1F9-1F1FB\",\n \"flag-tw\": \"1F1F9-1F1FC\",\n \"flag-tz\": \"1F1F9-1F1FF\",\n \"flag-ua\": \"1F1FA-1F1E6\",\n \"flag-ug\": \"1F1FA-1F1EC\",\n \"flag-um\": \"1F1FA-1F1F2\",\n \"flag-un\": \"1F1FA-1F1F3\",\n \"us\": \"1F1FA-1F1F8\",\n \"flag-uy\": \"1F1FA-1F1FE\",\n \"flag-uz\": \"1F1FA-1F1FF\",\n \"flag-va\": \"1F1FB-1F1E6\",\n \"flag-vc\": \"1F1FB-1F1E8\",\n \"flag-ve\": \"1F1FB-1F1EA\",\n \"flag-vg\": \"1F1FB-1F1EC\",\n \"flag-vi\": \"1F1FB-1F1EE\",\n \"flag-vn\": \"1F1FB-1F1F3\",\n \"flag-vu\": \"1F1FB-1F1FA\",\n \"flag-wf\": \"1F1FC-1F1EB\",\n \"flag-ws\": \"1F1FC-1F1F8\",\n \"flag-xk\": \"1F1FD-1F1F0\",\n \"flag-ye\": \"1F1FE-1F1EA\",\n \"flag-yt\": \"1F1FE-1F1F9\",\n \"flag-za\": \"1F1FF-1F1E6\",\n \"flag-zm\": \"1F1FF-1F1F2\",\n \"flag-zw\": \"1F1FF-1F1FC\",\n \"koko\": \"1F201\",\n \"sa\": \"1F202-FE0F\",\n \"u7121\": \"1F21A\",\n \"u6307\": \"1F22F\",\n \"u7981\": \"1F232\",\n \"u7a7a\": \"1F233\",\n \"u5408\": \"1F234\",\n \"u6e80\": \"1F235\",\n \"u6709\": \"1F236\",\n \"u6708\": \"1F237-FE0F\",\n \"u7533\": \"1F238\",\n \"u5272\": \"1F239\",\n \"u55b6\": \"1F23A\",\n \"ideograph_advantage\": \"1F250\",\n \"accept\": \"1F251\",\n \"cyclone\": \"1F300\",\n \"foggy\": \"1F301\",\n \"closed_umbrella\": \"1F302\",\n \"night_with_stars\": \"1F303\",\n \"sunrise_over_mountains\": \"1F304\",\n \"sunrise\": \"1F305\",\n \"city_sunset\": \"1F306\",\n \"city_sunrise\": \"1F307\",\n \"rainbow\": \"1F308\",\n \"bridge_at_night\": \"1F309\",\n \"ocean\": \"1F30A\",\n \"volcano\": \"1F30B\",\n \"milky_way\": \"1F30C\",\n \"earth_africa\": \"1F30D\",\n \"earth_americas\": \"1F30E\",\n \"earth_asia\": \"1F30F\",\n \"globe_with_meridians\": \"1F310\",\n \"new_moon\": \"1F311\",\n \"waxing_crescent_moon\": \"1F312\",\n \"first_quarter_moon\": \"1F313\",\n \"moon\": \"1F314\",\n \"full_moon\": \"1F315\",\n \"waning_gibbous_moon\": \"1F316\",\n \"last_quarter_moon\": \"1F317\",\n \"waning_crescent_moon\": \"1F318\",\n \"crescent_moon\": \"1F319\",\n \"new_moon_with_face\": \"1F31A\",\n \"first_quarter_moon_with_face\": \"1F31B\",\n \"last_quarter_moon_with_face\": \"1F31C\",\n \"full_moon_with_face\": \"1F31D\",\n \"sun_with_face\": \"1F31E\",\n \"star2\": \"1F31F\",\n \"stars\": \"1F320\",\n \"thermometer\": \"1F321-FE0F\",\n \"mostly_sunny\": \"1F324-FE0F\",\n \"barely_sunny\": \"1F325-FE0F\",\n \"partly_sunny_rain\": \"1F326-FE0F\",\n \"rain_cloud\": \"1F327-FE0F\",\n \"snow_cloud\": \"1F328-FE0F\",\n \"lightning\": \"1F329-FE0F\",\n \"tornado\": \"1F32A-FE0F\",\n \"fog\": \"1F32B-FE0F\",\n \"wind_blowing_face\": \"1F32C-FE0F\",\n \"hotdog\": \"1F32D\",\n \"taco\": \"1F32E\",\n \"burrito\": \"1F32F\",\n \"chestnut\": \"1F330\",\n \"seedling\": \"1F331\",\n \"evergreen_tree\": \"1F332\",\n \"deciduous_tree\": \"1F333\",\n \"palm_tree\": \"1F334\",\n \"cactus\": \"1F335\",\n \"hot_pepper\": \"1F336-FE0F\",\n \"tulip\": \"1F337\",\n \"cherry_blossom\": \"1F338\",\n \"rose\": \"1F339\",\n \"hibiscus\": \"1F33A\",\n \"sunflower\": \"1F33B\",\n \"blossom\": \"1F33C\",\n \"corn\": \"1F33D\",\n \"ear_of_rice\": \"1F33E\",\n \"herb\": \"1F33F\",\n \"four_leaf_clover\": \"1F340\",\n \"maple_leaf\": \"1F341\",\n \"fallen_leaf\": \"1F342\",\n \"leaves\": \"1F343\",\n \"mushroom\": \"1F344\",\n \"tomato\": \"1F345\",\n \"eggplant\": \"1F346\",\n \"grapes\": \"1F347\",\n \"melon\": \"1F348\",\n \"watermelon\": \"1F349\",\n \"tangerine\": \"1F34A\",\n \"lemon\": \"1F34B\",\n \"banana\": \"1F34C\",\n \"pineapple\": \"1F34D\",\n \"apple\": \"1F34E\",\n \"green_apple\": \"1F34F\",\n \"pear\": \"1F350\",\n \"peach\": \"1F351\",\n \"cherries\": \"1F352\",\n \"strawberry\": \"1F353\",\n \"hamburger\": \"1F354\",\n \"pizza\": \"1F355\",\n \"meat_on_bone\": \"1F356\",\n \"poultry_leg\": \"1F357\",\n \"rice_cracker\": \"1F358\",\n \"rice_ball\": \"1F359\",\n \"rice\": \"1F35A\",\n \"curry\": \"1F35B\",\n \"ramen\": \"1F35C\",\n \"spaghetti\": \"1F35D\",\n \"bread\": \"1F35E\",\n \"fries\": \"1F35F\",\n \"sweet_potato\": \"1F360\",\n \"dango\": \"1F361\",\n \"oden\": \"1F362\",\n \"sushi\": \"1F363\",\n \"fried_shrimp\": \"1F364\",\n \"fish_cake\": \"1F365\",\n \"icecream\": \"1F366\",\n \"shaved_ice\": \"1F367\",\n \"ice_cream\": \"1F368\",\n \"doughnut\": \"1F369\",\n \"cookie\": \"1F36A\",\n \"chocolate_bar\": \"1F36B\",\n \"candy\": \"1F36C\",\n \"lollipop\": \"1F36D\",\n \"custard\": \"1F36E\",\n \"honey_pot\": \"1F36F\",\n \"cake\": \"1F370\",\n \"bento\": \"1F371\",\n \"stew\": \"1F372\",\n \"fried_egg\": \"1F373\",\n \"fork_and_knife\": \"1F374\",\n \"tea\": \"1F375\",\n \"sake\": \"1F376\",\n \"wine_glass\": \"1F377\",\n \"cocktail\": \"1F378\",\n \"tropical_drink\": \"1F379\",\n \"beer\": \"1F37A\",\n \"beers\": \"1F37B\",\n \"baby_bottle\": \"1F37C\",\n \"knife_fork_plate\": \"1F37D-FE0F\",\n \"champagne\": \"1F37E\",\n \"popcorn\": \"1F37F\",\n \"ribbon\": \"1F380\",\n \"gift\": \"1F381\",\n \"birthday\": \"1F382\",\n \"jack_o_lantern\": \"1F383\",\n \"christmas_tree\": \"1F384\",\n \"santa\": \"1F385\",\n \"fireworks\": \"1F386\",\n \"sparkler\": \"1F387\",\n \"balloon\": \"1F388\",\n \"tada\": \"1F389\",\n \"confetti_ball\": \"1F38A\",\n \"tanabata_tree\": \"1F38B\",\n \"crossed_flags\": \"1F38C\",\n \"bamboo\": \"1F38D\",\n \"dolls\": \"1F38E\",\n \"flags\": \"1F38F\",\n \"wind_chime\": \"1F390\",\n \"rice_scene\": \"1F391\",\n \"school_satchel\": \"1F392\",\n \"mortar_board\": \"1F393\",\n \"medal\": \"1F396-FE0F\",\n \"reminder_ribbon\": \"1F397-FE0F\",\n \"studio_microphone\": \"1F399-FE0F\",\n \"level_slider\": \"1F39A-FE0F\",\n \"control_knobs\": \"1F39B-FE0F\",\n \"film_frames\": \"1F39E-FE0F\",\n \"admission_tickets\": \"1F39F-FE0F\",\n \"carousel_horse\": \"1F3A0\",\n \"ferris_wheel\": \"1F3A1\",\n \"roller_coaster\": \"1F3A2\",\n \"fishing_pole_and_fish\": \"1F3A3\",\n \"microphone\": \"1F3A4\",\n \"movie_camera\": \"1F3A5\",\n \"cinema\": \"1F3A6\",\n \"headphones\": \"1F3A7\",\n \"art\": \"1F3A8\",\n \"tophat\": \"1F3A9\",\n \"circus_tent\": \"1F3AA\",\n \"ticket\": \"1F3AB\",\n \"clapper\": \"1F3AC\",\n \"performing_arts\": \"1F3AD\",\n \"video_game\": \"1F3AE\",\n \"dart\": \"1F3AF\",\n \"slot_machine\": \"1F3B0\",\n \"8ball\": \"1F3B1\",\n \"game_die\": \"1F3B2\",\n \"bowling\": \"1F3B3\",\n \"flower_playing_cards\": \"1F3B4\",\n \"musical_note\": \"1F3B5\",\n \"notes\": \"1F3B6\",\n \"saxophone\": \"1F3B7\",\n \"guitar\": \"1F3B8\",\n \"musical_keyboard\": \"1F3B9\",\n \"trumpet\": \"1F3BA\",\n \"violin\": \"1F3BB\",\n \"musical_score\": \"1F3BC\",\n \"running_shirt_with_sash\": \"1F3BD\",\n \"tennis\": \"1F3BE\",\n \"ski\": \"1F3BF\",\n \"basketball\": \"1F3C0\",\n \"checkered_flag\": \"1F3C1\",\n \"snowboarder\": \"1F3C2\",\n \"woman-running\": \"1F3C3-200D-2640-FE0F\",\n \"man-running\": \"1F3C3-200D-2642-FE0F\",\n \"runner\": \"1F3C3-200D-2642-FE0F\",\n \"woman-surfing\": \"1F3C4-200D-2640-FE0F\",\n \"man-surfing\": \"1F3C4-200D-2642-FE0F\",\n \"surfer\": \"1F3C4-200D-2642-FE0F\",\n \"sports_medal\": \"1F3C5\",\n \"trophy\": \"1F3C6\",\n \"horse_racing\": \"1F3C7\",\n \"football\": \"1F3C8\",\n \"rugby_football\": \"1F3C9\",\n \"woman-swimming\": \"1F3CA-200D-2640-FE0F\",\n \"man-swimming\": \"1F3CA-200D-2642-FE0F\",\n \"swimmer\": \"1F3CA-200D-2642-FE0F\",\n \"woman-lifting-weights\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"man-lifting-weights\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"weight_lifter\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"woman-golfing\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"man-golfing\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"golfer\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"racing_motorcycle\": \"1F3CD-FE0F\",\n \"racing_car\": \"1F3CE-FE0F\",\n \"cricket_bat_and_ball\": \"1F3CF\",\n \"volleyball\": \"1F3D0\",\n \"field_hockey_stick_and_ball\": \"1F3D1\",\n \"ice_hockey_stick_and_puck\": \"1F3D2\",\n \"table_tennis_paddle_and_ball\": \"1F3D3\",\n \"snow_capped_mountain\": \"1F3D4-FE0F\",\n \"camping\": \"1F3D5-FE0F\",\n \"beach_with_umbrella\": \"1F3D6-FE0F\",\n \"building_construction\": \"1F3D7-FE0F\",\n \"house_buildings\": \"1F3D8-FE0F\",\n \"cityscape\": \"1F3D9-FE0F\",\n \"derelict_house_building\": \"1F3DA-FE0F\",\n \"classical_building\": \"1F3DB-FE0F\",\n \"desert\": \"1F3DC-FE0F\",\n \"desert_island\": \"1F3DD-FE0F\",\n \"national_park\": \"1F3DE-FE0F\",\n \"stadium\": \"1F3DF-FE0F\",\n \"house\": \"1F3E0\",\n \"house_with_garden\": \"1F3E1\",\n \"office\": \"1F3E2\",\n \"post_office\": \"1F3E3\",\n \"european_post_office\": \"1F3E4\",\n \"hospital\": \"1F3E5\",\n \"bank\": \"1F3E6\",\n \"atm\": \"1F3E7\",\n \"hotel\": \"1F3E8\",\n \"love_hotel\": \"1F3E9\",\n \"convenience_store\": \"1F3EA\",\n \"school\": \"1F3EB\",\n \"department_store\": \"1F3EC\",\n \"factory\": \"1F3ED\",\n \"izakaya_lantern\": \"1F3EE\",\n \"japanese_castle\": \"1F3EF\",\n \"european_castle\": \"1F3F0\",\n \"rainbow-flag\": \"1F3F3-FE0F-200D-1F308\",\n \"transgender_flag\": \"1F3F3-FE0F-200D-26A7-FE0F\",\n \"waving_white_flag\": \"1F3F3-FE0F\",\n \"pirate_flag\": \"1F3F4-200D-2620-FE0F\",\n \"flag-england\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"flag-scotland\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"flag-wales\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"waving_black_flag\": \"1F3F4\",\n \"rosette\": \"1F3F5-FE0F\",\n \"label\": \"1F3F7-FE0F\",\n \"badminton_racquet_and_shuttlecock\": \"1F3F8\",\n \"bow_and_arrow\": \"1F3F9\",\n \"amphora\": \"1F3FA\",\n \"skin-tone-2\": \"1F3FB\",\n \"skin-tone-3\": \"1F3FC\",\n \"skin-tone-4\": \"1F3FD\",\n \"skin-tone-5\": \"1F3FE\",\n \"skin-tone-6\": \"1F3FF\",\n \"rat\": \"1F400\",\n \"mouse2\": \"1F401\",\n \"ox\": \"1F402\",\n \"water_buffalo\": \"1F403\",\n \"cow2\": \"1F404\",\n \"tiger2\": \"1F405\",\n \"leopard\": \"1F406\",\n \"rabbit2\": \"1F407\",\n \"black_cat\": \"1F408-200D-2B1B\",\n \"cat2\": \"1F408\",\n \"dragon\": \"1F409\",\n \"crocodile\": \"1F40A\",\n \"whale2\": \"1F40B\",\n \"snail\": \"1F40C\",\n \"snake\": \"1F40D\",\n \"racehorse\": \"1F40E\",\n \"ram\": \"1F40F\",\n \"goat\": \"1F410\",\n \"sheep\": \"1F411\",\n \"monkey\": \"1F412\",\n \"rooster\": \"1F413\",\n \"chicken\": \"1F414\",\n \"service_dog\": \"1F415-200D-1F9BA\",\n \"dog2\": \"1F415\",\n \"pig2\": \"1F416\",\n \"boar\": \"1F417\",\n \"elephant\": \"1F418\",\n \"octopus\": \"1F419\",\n \"shell\": \"1F41A\",\n \"bug\": \"1F41B\",\n \"ant\": \"1F41C\",\n \"bee\": \"1F41D\",\n \"beetle\": \"1FAB2\",\n \"fish\": \"1F41F\",\n \"tropical_fish\": \"1F420\",\n \"blowfish\": \"1F421\",\n \"turtle\": \"1F422\",\n \"hatching_chick\": \"1F423\",\n \"baby_chick\": \"1F424\",\n \"hatched_chick\": \"1F425\",\n \"bird\": \"1F426\",\n \"penguin\": \"1F427\",\n \"koala\": \"1F428\",\n \"poodle\": \"1F429\",\n \"dromedary_camel\": \"1F42A\",\n \"camel\": \"1F42B\",\n \"dolphin\": \"1F42C\",\n \"mouse\": \"1F42D\",\n \"cow\": \"1F42E\",\n \"tiger\": \"1F42F\",\n \"rabbit\": \"1F430\",\n \"cat\": \"1F431\",\n \"dragon_face\": \"1F432\",\n \"whale\": \"1F433\",\n \"horse\": \"1F434\",\n \"monkey_face\": \"1F435\",\n \"dog\": \"1F436\",\n \"pig\": \"1F437\",\n \"frog\": \"1F438\",\n \"hamster\": \"1F439\",\n \"wolf\": \"1F43A\",\n \"polar_bear\": \"1F43B-200D-2744-FE0F\",\n \"bear\": \"1F43B\",\n \"panda_face\": \"1F43C\",\n \"pig_nose\": \"1F43D\",\n \"feet\": \"1F43E\",\n \"chipmunk\": \"1F43F-FE0F\",\n \"eyes\": \"1F440\",\n \"eye-in-speech-bubble\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"eye\": \"1F441-FE0F\",\n \"ear\": \"1F442\",\n \"nose\": \"1F443\",\n \"lips\": \"1F444\",\n \"tongue\": \"1F445\",\n \"point_up_2\": \"1F446\",\n \"point_down\": \"1F447\",\n \"point_left\": \"1F448\",\n \"point_right\": \"1F449\",\n \"facepunch\": \"1F44A\",\n \"wave\": \"1F44B\",\n \"ok_hand\": \"1F44C\",\n \"+1\": \"1F44D\",\n \"-1\": \"1F44E\",\n \"clap\": \"1F44F\",\n \"open_hands\": \"1F450\",\n \"crown\": \"1F451\",\n \"womans_hat\": \"1F452\",\n \"eyeglasses\": \"1F453\",\n \"necktie\": \"1F454\",\n \"shirt\": \"1F455\",\n \"jeans\": \"1F456\",\n \"dress\": \"1F457\",\n \"kimono\": \"1F458\",\n \"bikini\": \"1F459\",\n \"womans_clothes\": \"1F45A\",\n \"purse\": \"1F45B\",\n \"handbag\": \"1F45C\",\n \"pouch\": \"1F45D\",\n \"mans_shoe\": \"1F45E\",\n \"athletic_shoe\": \"1F45F\",\n \"high_heel\": \"1F460\",\n \"sandal\": \"1F461\",\n \"boot\": \"1F462\",\n \"footprints\": \"1F463\",\n \"bust_in_silhouette\": \"1F464\",\n \"busts_in_silhouette\": \"1F465\",\n \"boy\": \"1F466\",\n \"girl\": \"1F467\",\n \"male-farmer\": \"1F468-200D-1F33E\",\n \"male-cook\": \"1F468-200D-1F373\",\n \"man_feeding_baby\": \"1F468-200D-1F37C\",\n \"male-student\": \"1F468-200D-1F393\",\n \"male-singer\": \"1F468-200D-1F3A4\",\n \"male-artist\": \"1F468-200D-1F3A8\",\n \"male-teacher\": \"1F468-200D-1F3EB\",\n \"male-factory-worker\": \"1F468-200D-1F3ED\",\n \"man-boy-boy\": \"1F468-200D-1F466-200D-1F466\",\n \"man-boy\": \"1F468-200D-1F466\",\n \"man-girl-boy\": \"1F468-200D-1F467-200D-1F466\",\n \"man-girl-girl\": \"1F468-200D-1F467-200D-1F467\",\n \"man-girl\": \"1F468-200D-1F467\",\n \"man-man-boy\": \"1F468-200D-1F468-200D-1F466\",\n \"man-man-boy-boy\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"man-man-girl\": \"1F468-200D-1F468-200D-1F467\",\n \"man-man-girl-boy\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"man-man-girl-girl\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"man-woman-boy\": \"1F468-200D-1F469-200D-1F466\",\n \"man-woman-boy-boy\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"man-woman-girl\": \"1F468-200D-1F469-200D-1F467\",\n \"man-woman-girl-boy\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"man-woman-girl-girl\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"male-technologist\": \"1F468-200D-1F4BB\",\n \"male-office-worker\": \"1F468-200D-1F4BC\",\n \"male-mechanic\": \"1F468-200D-1F527\",\n \"male-scientist\": \"1F468-200D-1F52C\",\n \"male-astronaut\": \"1F468-200D-1F680\",\n \"male-firefighter\": \"1F468-200D-1F692\",\n \"man_with_probing_cane\": \"1F468-200D-1F9AF\",\n \"red_haired_man\": \"1F468-200D-1F9B0\",\n \"curly_haired_man\": \"1F468-200D-1F9B1\",\n \"bald_man\": \"1F468-200D-1F9B2\",\n \"white_haired_man\": \"1F468-200D-1F9B3\",\n \"man_in_motorized_wheelchair\": \"1F468-200D-1F9BC\",\n \"man_in_manual_wheelchair\": \"1F468-200D-1F9BD\",\n \"male-doctor\": \"1F468-200D-2695-FE0F\",\n \"male-judge\": \"1F468-200D-2696-FE0F\",\n \"male-pilot\": \"1F468-200D-2708-FE0F\",\n \"man-heart-man\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"man-kiss-man\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"man\": \"1F468\",\n \"female-farmer\": \"1F469-200D-1F33E\",\n \"female-cook\": \"1F469-200D-1F373\",\n \"woman_feeding_baby\": \"1F469-200D-1F37C\",\n \"female-student\": \"1F469-200D-1F393\",\n \"female-singer\": \"1F469-200D-1F3A4\",\n \"female-artist\": \"1F469-200D-1F3A8\",\n \"female-teacher\": \"1F469-200D-1F3EB\",\n \"female-factory-worker\": \"1F469-200D-1F3ED\",\n \"woman-boy-boy\": \"1F469-200D-1F466-200D-1F466\",\n \"woman-boy\": \"1F469-200D-1F466\",\n \"woman-girl-boy\": \"1F469-200D-1F467-200D-1F466\",\n \"woman-girl-girl\": \"1F469-200D-1F467-200D-1F467\",\n \"woman-girl\": \"1F469-200D-1F467\",\n \"woman-woman-boy\": \"1F469-200D-1F469-200D-1F466\",\n \"woman-woman-boy-boy\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"woman-woman-girl\": \"1F469-200D-1F469-200D-1F467\",\n \"woman-woman-girl-boy\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"woman-woman-girl-girl\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"female-technologist\": \"1F469-200D-1F4BB\",\n \"female-office-worker\": \"1F469-200D-1F4BC\",\n \"female-mechanic\": \"1F469-200D-1F527\",\n \"female-scientist\": \"1F469-200D-1F52C\",\n \"female-astronaut\": \"1F469-200D-1F680\",\n \"female-firefighter\": \"1F469-200D-1F692\",\n \"woman_with_probing_cane\": \"1F469-200D-1F9AF\",\n \"red_haired_woman\": \"1F469-200D-1F9B0\",\n \"curly_haired_woman\": \"1F469-200D-1F9B1\",\n \"bald_woman\": \"1F469-200D-1F9B2\",\n \"white_haired_woman\": \"1F469-200D-1F9B3\",\n \"woman_in_motorized_wheelchair\": \"1F469-200D-1F9BC\",\n \"woman_in_manual_wheelchair\": \"1F469-200D-1F9BD\",\n \"female-doctor\": \"1F469-200D-2695-FE0F\",\n \"female-judge\": \"1F469-200D-2696-FE0F\",\n \"female-pilot\": \"1F469-200D-2708-FE0F\",\n \"woman-heart-man\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"woman-heart-woman\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"woman-kiss-man\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"woman-kiss-woman\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"woman\": \"1F469\",\n \"family\": \"1F468-200D-1F469-200D-1F466\",\n \"couple\": \"1F46B\",\n \"two_men_holding_hands\": \"1F46C\",\n \"two_women_holding_hands\": \"1F46D\",\n \"female-police-officer\": \"1F46E-200D-2640-FE0F\",\n \"male-police-officer\": \"1F46E-200D-2642-FE0F\",\n \"cop\": \"1F46E-200D-2642-FE0F\",\n \"woman-with-bunny-ears-partying\": \"1F46F-200D-2640-FE0F\",\n \"man-with-bunny-ears-partying\": \"1F46F-200D-2642-FE0F\",\n \"dancers\": \"1F46F-200D-2640-FE0F\",\n \"woman_with_veil\": \"1F470-200D-2640-FE0F\",\n \"man_with_veil\": \"1F470-200D-2642-FE0F\",\n \"bride_with_veil\": \"1F470\",\n \"blond-haired-woman\": \"1F471-200D-2640-FE0F\",\n \"blond-haired-man\": \"1F471-200D-2642-FE0F\",\n \"person_with_blond_hair\": \"1F471-200D-2642-FE0F\",\n \"man_with_gua_pi_mao\": \"1F472\",\n \"woman-wearing-turban\": \"1F473-200D-2640-FE0F\",\n \"man-wearing-turban\": \"1F473-200D-2642-FE0F\",\n \"man_with_turban\": \"1F473-200D-2642-FE0F\",\n \"older_man\": \"1F474\",\n \"older_woman\": \"1F475\",\n \"baby\": \"1F476\",\n \"female-construction-worker\": \"1F477-200D-2640-FE0F\",\n \"male-construction-worker\": \"1F477-200D-2642-FE0F\",\n \"construction_worker\": \"1F477-200D-2642-FE0F\",\n \"princess\": \"1F478\",\n \"japanese_ogre\": \"1F479\",\n \"japanese_goblin\": \"1F47A\",\n \"ghost\": \"1F47B\",\n \"angel\": \"1F47C\",\n \"alien\": \"1F47D\",\n \"space_invader\": \"1F47E\",\n \"imp\": \"1F47F\",\n \"skull\": \"1F480\",\n \"woman-tipping-hand\": \"1F481-200D-2640-FE0F\",\n \"man-tipping-hand\": \"1F481-200D-2642-FE0F\",\n \"information_desk_person\": \"1F481-200D-2640-FE0F\",\n \"female-guard\": \"1F482-200D-2640-FE0F\",\n \"male-guard\": \"1F482-200D-2642-FE0F\",\n \"guardsman\": \"1F482-200D-2642-FE0F\",\n \"dancer\": \"1F483\",\n \"lipstick\": \"1F484\",\n \"nail_care\": \"1F485\",\n \"woman-getting-massage\": \"1F486-200D-2640-FE0F\",\n \"man-getting-massage\": \"1F486-200D-2642-FE0F\",\n \"massage\": \"1F486-200D-2640-FE0F\",\n \"woman-getting-haircut\": \"1F487-200D-2640-FE0F\",\n \"man-getting-haircut\": \"1F487-200D-2642-FE0F\",\n \"haircut\": \"1F487-200D-2640-FE0F\",\n \"barber\": \"1F488\",\n \"syringe\": \"1F489\",\n \"pill\": \"1F48A\",\n \"kiss\": \"1F48B\",\n \"love_letter\": \"1F48C\",\n \"ring\": \"1F48D\",\n \"gem\": \"1F48E\",\n \"couplekiss\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"bouquet\": \"1F490\",\n \"couple_with_heart\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"wedding\": \"1F492\",\n \"heartbeat\": \"1F493\",\n \"broken_heart\": \"1F494\",\n \"two_hearts\": \"1F495\",\n \"sparkling_heart\": \"1F496\",\n \"heartpulse\": \"1F497\",\n \"cupid\": \"1F498\",\n \"blue_heart\": \"1F499\",\n \"green_heart\": \"1F49A\",\n \"yellow_heart\": \"1F49B\",\n \"purple_heart\": \"1F49C\",\n \"gift_heart\": \"1F49D\",\n \"revolving_hearts\": \"1F49E\",\n \"heart_decoration\": \"1F49F\",\n \"diamond_shape_with_a_dot_inside\": \"1F4A0\",\n \"bulb\": \"1F4A1\",\n \"anger\": \"1F4A2\",\n \"bomb\": \"1F4A3\",\n \"zzz\": \"1F4A4\",\n \"boom\": \"1F4A5\",\n \"sweat_drops\": \"1F4A6\",\n \"droplet\": \"1F4A7\",\n \"dash\": \"1F4A8\",\n \"hankey\": \"1F4A9\",\n \"muscle\": \"1F4AA\",\n \"dizzy\": \"1F4AB\",\n \"speech_balloon\": \"1F4AC\",\n \"thought_balloon\": \"1F4AD\",\n \"white_flower\": \"1F4AE\",\n \"100\": \"1F4AF\",\n \"moneybag\": \"1F4B0\",\n \"currency_exchange\": \"1F4B1\",\n \"heavy_dollar_sign\": \"1F4B2\",\n \"credit_card\": \"1F4B3\",\n \"yen\": \"1F4B4\",\n \"dollar\": \"1F4B5\",\n \"euro\": \"1F4B6\",\n \"pound\": \"1F4B7\",\n \"money_with_wings\": \"1F4B8\",\n \"chart\": \"1F4B9\",\n \"seat\": \"1F4BA\",\n \"computer\": \"1F4BB\",\n \"briefcase\": \"1F4BC\",\n \"minidisc\": \"1F4BD\",\n \"floppy_disk\": \"1F4BE\",\n \"cd\": \"1F4BF\",\n \"dvd\": \"1F4C0\",\n \"file_folder\": \"1F4C1\",\n \"open_file_folder\": \"1F4C2\",\n \"page_with_curl\": \"1F4C3\",\n \"page_facing_up\": \"1F4C4\",\n \"date\": \"1F4C5\",\n \"calendar\": \"1F4C6\",\n \"card_index\": \"1F4C7\",\n \"chart_with_upwards_trend\": \"1F4C8\",\n \"chart_with_downwards_trend\": \"1F4C9\",\n \"bar_chart\": \"1F4CA\",\n \"clipboard\": \"1F4CB\",\n \"pushpin\": \"1F4CC\",\n \"round_pushpin\": \"1F4CD\",\n \"paperclip\": \"1F4CE\",\n \"straight_ruler\": \"1F4CF\",\n \"triangular_ruler\": \"1F4D0\",\n \"bookmark_tabs\": \"1F4D1\",\n \"ledger\": \"1F4D2\",\n \"notebook\": \"1F4D3\",\n \"notebook_with_decorative_cover\": \"1F4D4\",\n \"closed_book\": \"1F4D5\",\n \"book\": \"1F4D6\",\n \"green_book\": \"1F4D7\",\n \"blue_book\": \"1F4D8\",\n \"orange_book\": \"1F4D9\",\n \"books\": \"1F4DA\",\n \"name_badge\": \"1F4DB\",\n \"scroll\": \"1F4DC\",\n \"memo\": \"1F4DD\",\n \"telephone_receiver\": \"1F4DE\",\n \"pager\": \"1F4DF\",\n \"fax\": \"1F4E0\",\n \"satellite_antenna\": \"1F4E1\",\n \"loudspeaker\": \"1F4E2\",\n \"mega\": \"1F4E3\",\n \"outbox_tray\": \"1F4E4\",\n \"inbox_tray\": \"1F4E5\",\n \"package\": \"1F4E6\",\n \"e-mail\": \"1F4E7\",\n \"incoming_envelope\": \"1F4E8\",\n \"envelope_with_arrow\": \"1F4E9\",\n \"mailbox_closed\": \"1F4EA\",\n \"mailbox\": \"1F4EB\",\n \"mailbox_with_mail\": \"1F4EC\",\n \"mailbox_with_no_mail\": \"1F4ED\",\n \"postbox\": \"1F4EE\",\n \"postal_horn\": \"1F4EF\",\n \"newspaper\": \"1F4F0\",\n \"iphone\": \"1F4F1\",\n \"calling\": \"1F4F2\",\n \"vibration_mode\": \"1F4F3\",\n \"mobile_phone_off\": \"1F4F4\",\n \"no_mobile_phones\": \"1F4F5\",\n \"signal_strength\": \"1F4F6\",\n \"camera\": \"1F4F7\",\n \"camera_with_flash\": \"1F4F8\",\n \"video_camera\": \"1F4F9\",\n \"tv\": \"1F4FA\",\n \"radio\": \"1F4FB\",\n \"vhs\": \"1F4FC\",\n \"film_projector\": \"1F4FD-FE0F\",\n \"prayer_beads\": \"1F4FF\",\n \"twisted_rightwards_arrows\": \"1F500\",\n \"repeat\": \"1F501\",\n \"repeat_one\": \"1F502\",\n \"arrows_clockwise\": \"1F503\",\n \"arrows_counterclockwise\": \"1F504\",\n \"low_brightness\": \"1F505\",\n \"high_brightness\": \"1F506\",\n \"mute\": \"1F507\",\n \"speaker\": \"1F508\",\n \"sound\": \"1F509\",\n \"loud_sound\": \"1F50A\",\n \"battery\": \"1F50B\",\n \"electric_plug\": \"1F50C\",\n \"mag\": \"1F50D\",\n \"mag_right\": \"1F50E\",\n \"lock_with_ink_pen\": \"1F50F\",\n \"closed_lock_with_key\": \"1F510\",\n \"key\": \"1F511\",\n \"lock\": \"1F512\",\n \"unlock\": \"1F513\",\n \"bell\": \"1F514\",\n \"no_bell\": \"1F515\",\n \"bookmark\": \"1F516\",\n \"link\": \"1F517\",\n \"radio_button\": \"1F518\",\n \"back\": \"1F519\",\n \"end\": \"1F51A\",\n \"on\": \"1F51B\",\n \"soon\": \"1F51C\",\n \"top\": \"1F51D\",\n \"underage\": \"1F51E\",\n \"keycap_ten\": \"1F51F\",\n \"capital_abcd\": \"1F520\",\n \"abcd\": \"1F521\",\n \"1234\": \"1F522\",\n \"symbols\": \"1F523\",\n \"abc\": \"1F524\",\n \"fire\": \"1F525\",\n \"flashlight\": \"1F526\",\n \"wrench\": \"1F527\",\n \"hammer\": \"1F528\",\n \"nut_and_bolt\": \"1F529\",\n \"hocho\": \"1F52A\",\n \"gun\": \"1F52B\",\n \"microscope\": \"1F52C\",\n \"telescope\": \"1F52D\",\n \"crystal_ball\": \"1F52E\",\n \"six_pointed_star\": \"1F52F\",\n \"beginner\": \"1F530\",\n \"trident\": \"1F531\",\n \"black_square_button\": \"1F532\",\n \"white_square_button\": \"1F533\",\n \"red_circle\": \"1F534\",\n \"large_blue_circle\": \"1F535\",\n \"large_orange_diamond\": \"1F536\",\n \"large_blue_diamond\": \"1F537\",\n \"small_orange_diamond\": \"1F538\",\n \"small_blue_diamond\": \"1F539\",\n \"small_red_triangle\": \"1F53A\",\n \"small_red_triangle_down\": \"1F53B\",\n \"arrow_up_small\": \"1F53C\",\n \"arrow_down_small\": \"1F53D\",\n \"om_symbol\": \"1F549-FE0F\",\n \"dove_of_peace\": \"1F54A-FE0F\",\n \"kaaba\": \"1F54B\",\n \"mosque\": \"1F54C\",\n \"synagogue\": \"1F54D\",\n \"menorah_with_nine_branches\": \"1F54E\",\n \"clock1\": \"1F550\",\n \"clock2\": \"1F551\",\n \"clock3\": \"1F552\",\n \"clock4\": \"1F553\",\n \"clock5\": \"1F554\",\n \"clock6\": \"1F555\",\n \"clock7\": \"1F556\",\n \"clock8\": \"1F557\",\n \"clock9\": \"1F558\",\n \"clock10\": \"1F559\",\n \"clock11\": \"1F55A\",\n \"clock12\": \"1F55B\",\n \"clock130\": \"1F55C\",\n \"clock230\": \"1F55D\",\n \"clock330\": \"1F55E\",\n \"clock430\": \"1F55F\",\n \"clock530\": \"1F560\",\n \"clock630\": \"1F561\",\n \"clock730\": \"1F562\",\n \"clock830\": \"1F563\",\n \"clock930\": \"1F564\",\n \"clock1030\": \"1F565\",\n \"clock1130\": \"1F566\",\n \"clock1230\": \"1F567\",\n \"candle\": \"1F56F-FE0F\",\n \"mantelpiece_clock\": \"1F570-FE0F\",\n \"hole\": \"1F573-FE0F\",\n \"man_in_business_suit_levitating\": \"1F574-FE0F\",\n \"female-detective\": \"1F575-FE0F-200D-2640-FE0F\",\n \"male-detective\": \"1F575-FE0F-200D-2642-FE0F\",\n \"sleuth_or_spy\": \"1F575-FE0F-200D-2642-FE0F\",\n \"dark_sunglasses\": \"1F576-FE0F\",\n \"spider\": \"1F577-FE0F\",\n \"spider_web\": \"1F578-FE0F\",\n \"joystick\": \"1F579-FE0F\",\n \"man_dancing\": \"1F57A\",\n \"linked_paperclips\": \"1F587-FE0F\",\n \"lower_left_ballpoint_pen\": \"1F58A-FE0F\",\n \"lower_left_fountain_pen\": \"1F58B-FE0F\",\n \"lower_left_paintbrush\": \"1F58C-FE0F\",\n \"lower_left_crayon\": \"1F58D-FE0F\",\n \"raised_hand_with_fingers_splayed\": \"1F590-FE0F\",\n \"middle_finger\": \"1F595\",\n \"spock-hand\": \"1F596\",\n \"black_heart\": \"1F5A4\",\n \"desktop_computer\": \"1F5A5-FE0F\",\n \"printer\": \"1F5A8-FE0F\",\n \"three_button_mouse\": \"1F5B1-FE0F\",\n \"trackball\": \"1F5B2-FE0F\",\n \"frame_with_picture\": \"1F5BC-FE0F\",\n \"card_index_dividers\": \"1F5C2-FE0F\",\n \"card_file_box\": \"1F5C3-FE0F\",\n \"file_cabinet\": \"1F5C4-FE0F\",\n \"wastebasket\": \"1F5D1-FE0F\",\n \"spiral_note_pad\": \"1F5D2-FE0F\",\n \"spiral_calendar_pad\": \"1F5D3-FE0F\",\n \"compression\": \"1F5DC-FE0F\",\n \"old_key\": \"1F5DD-FE0F\",\n \"rolled_up_newspaper\": \"1F5DE-FE0F\",\n \"dagger_knife\": \"1F5E1-FE0F\",\n \"speaking_head_in_silhouette\": \"1F5E3-FE0F\",\n \"left_speech_bubble\": \"1F5E8-FE0F\",\n \"right_anger_bubble\": \"1F5EF-FE0F\",\n \"ballot_box_with_ballot\": \"1F5F3-FE0F\",\n \"world_map\": \"1F5FA-FE0F\",\n \"mount_fuji\": \"1F5FB\",\n \"tokyo_tower\": \"1F5FC\",\n \"statue_of_liberty\": \"1F5FD\",\n \"japan\": \"1F5FE\",\n \"moyai\": \"1F5FF\",\n \"grinning\": \"1F600\",\n \"grin\": \"1F601\",\n \"joy\": \"1F602\",\n \"smiley\": \"1F603\",\n \"smile\": \"1F604\",\n \"sweat_smile\": \"1F605\",\n \"laughing\": \"1F606\",\n \"innocent\": \"1F607\",\n \"smiling_imp\": \"1F608\",\n \"wink\": \"1F609\",\n \"blush\": \"1F60A\",\n \"yum\": \"1F60B\",\n \"relieved\": \"1F60C\",\n \"heart_eyes\": \"1F60D\",\n \"sunglasses\": \"1F60E\",\n \"smirk\": \"1F60F\",\n \"neutral_face\": \"1F610\",\n \"expressionless\": \"1F611\",\n \"unamused\": \"1F612\",\n \"sweat\": \"1F613\",\n \"pensive\": \"1F614\",\n \"confused\": \"1F615\",\n \"confounded\": \"1F616\",\n \"kissing\": \"1F617\",\n \"kissing_heart\": \"1F618\",\n \"kissing_smiling_eyes\": \"1F619\",\n \"kissing_closed_eyes\": \"1F61A\",\n \"stuck_out_tongue\": \"1F61B\",\n \"stuck_out_tongue_winking_eye\": \"1F61C\",\n \"stuck_out_tongue_closed_eyes\": \"1F61D\",\n \"disappointed\": \"1F61E\",\n \"worried\": \"1F61F\",\n \"angry\": \"1F620\",\n \"rage\": \"1F621\",\n \"cry\": \"1F622\",\n \"persevere\": \"1F623\",\n \"triumph\": \"1F624\",\n \"disappointed_relieved\": \"1F625\",\n \"frowning\": \"1F626\",\n \"anguished\": \"1F627\",\n \"fearful\": \"1F628\",\n \"weary\": \"1F629\",\n \"sleepy\": \"1F62A\",\n \"tired_face\": \"1F62B\",\n \"grimacing\": \"1F62C\",\n \"sob\": \"1F62D\",\n \"open_mouth\": \"1F62E\",\n \"hushed\": \"1F62F\",\n \"cold_sweat\": \"1F630\",\n \"scream\": \"1F631\",\n \"astonished\": \"1F632\",\n \"flushed\": \"1F633\",\n \"sleeping\": \"1F634\",\n \"dizzy_face\": \"1F635\",\n \"no_mouth\": \"1F636\",\n \"mask\": \"1F637\",\n \"smile_cat\": \"1F638\",\n \"joy_cat\": \"1F639\",\n \"smiley_cat\": \"1F63A\",\n \"heart_eyes_cat\": \"1F63B\",\n \"smirk_cat\": \"1F63C\",\n \"kissing_cat\": \"1F63D\",\n \"pouting_cat\": \"1F63E\",\n \"crying_cat_face\": \"1F63F\",\n \"scream_cat\": \"1F640\",\n \"slightly_frowning_face\": \"1F641\",\n \"slightly_smiling_face\": \"1F642\",\n \"upside_down_face\": \"1F643\",\n \"face_with_rolling_eyes\": \"1F644\",\n \"woman-gesturing-no\": \"1F645-200D-2640-FE0F\",\n \"man-gesturing-no\": \"1F645-200D-2642-FE0F\",\n \"no_good\": \"1F645-200D-2640-FE0F\",\n \"woman-gesturing-ok\": \"1F646-200D-2640-FE0F\",\n \"man-gesturing-ok\": \"1F646-200D-2642-FE0F\",\n \"ok_woman\": \"1F646-200D-2640-FE0F\",\n \"woman-bowing\": \"1F647-200D-2640-FE0F\",\n \"man-bowing\": \"1F647-200D-2642-FE0F\",\n \"bow\": \"1F647-200D-2642-FE0F\",\n \"see_no_evil\": \"1F648\",\n \"hear_no_evil\": \"1F649\",\n \"speak_no_evil\": \"1F64A\",\n \"woman-raising-hand\": \"1F64B-200D-2640-FE0F\",\n \"man-raising-hand\": \"1F64B-200D-2642-FE0F\",\n \"raising_hand\": \"1F64B-200D-2640-FE0F\",\n \"raised_hands\": \"1F64C\",\n \"woman-frowning\": \"1F64D-200D-2640-FE0F\",\n \"man-frowning\": \"1F64D-200D-2642-FE0F\",\n \"person_frowning\": \"1F64D-200D-2640-FE0F\",\n \"woman-pouting\": \"1F64E-200D-2640-FE0F\",\n \"man-pouting\": \"1F64E-200D-2642-FE0F\",\n \"person_with_pouting_face\": \"1F64E-200D-2640-FE0F\",\n \"pray\": \"1F64F\",\n \"rocket\": \"1F680\",\n \"helicopter\": \"1F681\",\n \"steam_locomotive\": \"1F682\",\n \"railway_car\": \"1F683\",\n \"bullettrain_side\": \"1F684\",\n \"bullettrain_front\": \"1F685\",\n \"train2\": \"1F686\",\n \"metro\": \"1F687\",\n \"light_rail\": \"1F688\",\n \"station\": \"1F689\",\n \"tram\": \"1F68A\",\n \"train\": \"1F68B\",\n \"bus\": \"1F68C\",\n \"oncoming_bus\": \"1F68D\",\n \"trolleybus\": \"1F68E\",\n \"busstop\": \"1F68F\",\n \"minibus\": \"1F690\",\n \"ambulance\": \"1F691\",\n \"fire_engine\": \"1F692\",\n \"police_car\": \"1F693\",\n \"oncoming_police_car\": \"1F694\",\n \"taxi\": \"1F695\",\n \"oncoming_taxi\": \"1F696\",\n \"car\": \"1F697\",\n \"oncoming_automobile\": \"1F698\",\n \"blue_car\": \"1F699\",\n \"truck\": \"1F69A\",\n \"articulated_lorry\": \"1F69B\",\n \"tractor\": \"1F69C\",\n \"monorail\": \"1F69D\",\n \"mountain_railway\": \"1F69E\",\n \"suspension_railway\": \"1F69F\",\n \"mountain_cableway\": \"1F6A0\",\n \"aerial_tramway\": \"1F6A1\",\n \"ship\": \"1F6A2\",\n \"woman-rowing-boat\": \"1F6A3-200D-2640-FE0F\",\n \"man-rowing-boat\": \"1F6A3-200D-2642-FE0F\",\n \"rowboat\": \"1F6A3-200D-2642-FE0F\",\n \"speedboat\": \"1F6A4\",\n \"traffic_light\": \"1F6A5\",\n \"vertical_traffic_light\": \"1F6A6\",\n \"construction\": \"1F6A7\",\n \"rotating_light\": \"1F6A8\",\n \"triangular_flag_on_post\": \"1F6A9\",\n \"door\": \"1F6AA\",\n \"no_entry_sign\": \"1F6AB\",\n \"smoking\": \"1F6AC\",\n \"no_smoking\": \"1F6AD\",\n \"put_litter_in_its_place\": \"1F6AE\",\n \"do_not_litter\": \"1F6AF\",\n \"potable_water\": \"1F6B0\",\n \"non-potable_water\": \"1F6B1\",\n \"bike\": \"1F6B2\",\n \"no_bicycles\": \"1F6B3\",\n \"woman-biking\": \"1F6B4-200D-2640-FE0F\",\n \"man-biking\": \"1F6B4-200D-2642-FE0F\",\n \"bicyclist\": \"1F6B4-200D-2642-FE0F\",\n \"woman-mountain-biking\": \"1F6B5-200D-2640-FE0F\",\n \"man-mountain-biking\": \"1F6B5-200D-2642-FE0F\",\n \"mountain_bicyclist\": \"1F6B5-200D-2642-FE0F\",\n \"woman-walking\": \"1F6B6-200D-2640-FE0F\",\n \"man-walking\": \"1F6B6-200D-2642-FE0F\",\n \"walking\": \"1F6B6-200D-2642-FE0F\",\n \"no_pedestrians\": \"1F6B7\",\n \"children_crossing\": \"1F6B8\",\n \"mens\": \"1F6B9\",\n \"womens\": \"1F6BA\",\n \"restroom\": \"1F6BB\",\n \"baby_symbol\": \"1F6BC\",\n \"toilet\": \"1F6BD\",\n \"wc\": \"1F6BE\",\n \"shower\": \"1F6BF\",\n \"bath\": \"1F6C0\",\n \"bathtub\": \"1F6C1\",\n \"passport_control\": \"1F6C2\",\n \"customs\": \"1F6C3\",\n \"baggage_claim\": \"1F6C4\",\n \"left_luggage\": \"1F6C5\",\n \"couch_and_lamp\": \"1F6CB-FE0F\",\n \"sleeping_accommodation\": \"1F6CC\",\n \"shopping_bags\": \"1F6CD-FE0F\",\n \"bellhop_bell\": \"1F6CE-FE0F\",\n \"bed\": \"1F6CF-FE0F\",\n \"place_of_worship\": \"1F6D0\",\n \"octagonal_sign\": \"1F6D1\",\n \"shopping_trolley\": \"1F6D2\",\n \"hindu_temple\": \"1F6D5\",\n \"hut\": \"1F6D6\",\n \"elevator\": \"1F6D7\",\n \"hammer_and_wrench\": \"1F6E0-FE0F\",\n \"shield\": \"1F6E1-FE0F\",\n \"oil_drum\": \"1F6E2-FE0F\",\n \"motorway\": \"1F6E3-FE0F\",\n \"railway_track\": \"1F6E4-FE0F\",\n \"motor_boat\": \"1F6E5-FE0F\",\n \"small_airplane\": \"1F6E9-FE0F\",\n \"airplane_departure\": \"1F6EB\",\n \"airplane_arriving\": \"1F6EC\",\n \"satellite\": \"1F6F0-FE0F\",\n \"passenger_ship\": \"1F6F3-FE0F\",\n \"scooter\": \"1F6F4\",\n \"motor_scooter\": \"1F6F5\",\n \"canoe\": \"1F6F6\",\n \"sled\": \"1F6F7\",\n \"flying_saucer\": \"1F6F8\",\n \"skateboard\": \"1F6F9\",\n \"auto_rickshaw\": \"1F6FA\",\n \"pickup_truck\": \"1F6FB\",\n \"roller_skate\": \"1F6FC\",\n \"large_orange_circle\": \"1F7E0\",\n \"large_yellow_circle\": \"1F7E1\",\n \"large_green_circle\": \"1F7E2\",\n \"large_purple_circle\": \"1F7E3\",\n \"large_brown_circle\": \"1F7E4\",\n \"large_red_square\": \"1F7E5\",\n \"large_blue_square\": \"1F7E6\",\n \"large_orange_square\": \"1F7E7\",\n \"large_yellow_square\": \"1F7E8\",\n \"large_green_square\": \"1F7E9\",\n \"large_purple_square\": \"1F7EA\",\n \"large_brown_square\": \"1F7EB\",\n \"pinched_fingers\": \"1F90C\",\n \"white_heart\": \"1F90D\",\n \"brown_heart\": \"1F90E\",\n \"pinching_hand\": \"1F90F\",\n \"zipper_mouth_face\": \"1F910\",\n \"money_mouth_face\": \"1F911\",\n \"face_with_thermometer\": \"1F912\",\n \"nerd_face\": \"1F913\",\n \"thinking_face\": \"1F914\",\n \"face_with_head_bandage\": \"1F915\",\n \"robot_face\": \"1F916\",\n \"hugging_face\": \"1F917\",\n \"the_horns\": \"1F918\",\n \"call_me_hand\": \"1F919\",\n \"raised_back_of_hand\": \"1F91A\",\n \"left-facing_fist\": \"1F91B\",\n \"right-facing_fist\": \"1F91C\",\n \"handshake\": \"1F91D\",\n \"crossed_fingers\": \"1F91E\",\n \"i_love_you_hand_sign\": \"1F91F\",\n \"face_with_cowboy_hat\": \"1F920\",\n \"clown_face\": \"1F921\",\n \"nauseated_face\": \"1F922\",\n \"rolling_on_the_floor_laughing\": \"1F923\",\n \"drooling_face\": \"1F924\",\n \"lying_face\": \"1F925\",\n \"woman-facepalming\": \"1F926-200D-2640-FE0F\",\n \"man-facepalming\": \"1F926-200D-2642-FE0F\",\n \"face_palm\": \"1F926\",\n \"sneezing_face\": \"1F927\",\n \"face_with_raised_eyebrow\": \"1F928\",\n \"star-struck\": \"1F929\",\n \"zany_face\": \"1F92A\",\n \"shushing_face\": \"1F92B\",\n \"face_with_symbols_on_mouth\": \"1F92C\",\n \"face_with_hand_over_mouth\": \"1F92D\",\n \"face_vomiting\": \"1F92E\",\n \"exploding_head\": \"1F92F\",\n \"pregnant_woman\": \"1F930\",\n \"breast-feeding\": \"1F931\",\n \"palms_up_together\": \"1F932\",\n \"selfie\": \"1F933\",\n \"prince\": \"1F934\",\n \"woman_in_tuxedo\": \"1F935-200D-2640-FE0F\",\n \"man_in_tuxedo\": \"1F935\",\n \"mrs_claus\": \"1F936\",\n \"woman-shrugging\": \"1F937-200D-2640-FE0F\",\n \"man-shrugging\": \"1F937-200D-2642-FE0F\",\n \"shrug\": \"1F937\",\n \"woman-cartwheeling\": \"1F938-200D-2640-FE0F\",\n \"man-cartwheeling\": \"1F938-200D-2642-FE0F\",\n \"person_doing_cartwheel\": \"1F938\",\n \"woman-juggling\": \"1F939-200D-2640-FE0F\",\n \"man-juggling\": \"1F939-200D-2642-FE0F\",\n \"juggling\": \"1F939\",\n \"fencer\": \"1F93A\",\n \"woman-wrestling\": \"1F93C-200D-2640-FE0F\",\n \"man-wrestling\": \"1F93C-200D-2642-FE0F\",\n \"wrestlers\": \"1F93C\",\n \"woman-playing-water-polo\": \"1F93D-200D-2640-FE0F\",\n \"man-playing-water-polo\": \"1F93D-200D-2642-FE0F\",\n \"water_polo\": \"1F93D\",\n \"woman-playing-handball\": \"1F93E-200D-2640-FE0F\",\n \"man-playing-handball\": \"1F93E-200D-2642-FE0F\",\n \"handball\": \"1F93E\",\n \"diving_mask\": \"1F93F\",\n \"wilted_flower\": \"1F940\",\n \"drum_with_drumsticks\": \"1F941\",\n \"clinking_glasses\": \"1F942\",\n \"tumbler_glass\": \"1F943\",\n \"spoon\": \"1F944\",\n \"goal_net\": \"1F945\",\n \"first_place_medal\": \"1F947\",\n \"second_place_medal\": \"1F948\",\n \"third_place_medal\": \"1F949\",\n \"boxing_glove\": \"1F94A\",\n \"martial_arts_uniform\": \"1F94B\",\n \"curling_stone\": \"1F94C\",\n \"lacrosse\": \"1F94D\",\n \"softball\": \"1F94E\",\n \"flying_disc\": \"1F94F\",\n \"croissant\": \"1F950\",\n \"avocado\": \"1F951\",\n \"cucumber\": \"1F952\",\n \"bacon\": \"1F953\",\n \"potato\": \"1F954\",\n \"carrot\": \"1F955\",\n \"baguette_bread\": \"1F956\",\n \"green_salad\": \"1F957\",\n \"shallow_pan_of_food\": \"1F958\",\n \"stuffed_flatbread\": \"1F959\",\n \"egg\": \"1F95A\",\n \"glass_of_milk\": \"1F95B\",\n \"peanuts\": \"1F95C\",\n \"kiwifruit\": \"1F95D\",\n \"pancakes\": \"1F95E\",\n \"dumpling\": \"1F95F\",\n \"fortune_cookie\": \"1F960\",\n \"takeout_box\": \"1F961\",\n \"chopsticks\": \"1F962\",\n \"bowl_with_spoon\": \"1F963\",\n \"cup_with_straw\": \"1F964\",\n \"coconut\": \"1F965\",\n \"broccoli\": \"1F966\",\n \"pie\": \"1F967\",\n \"pretzel\": \"1F968\",\n \"cut_of_meat\": \"1F969\",\n \"sandwich\": \"1F96A\",\n \"canned_food\": \"1F96B\",\n \"leafy_green\": \"1F96C\",\n \"mango\": \"1F96D\",\n \"moon_cake\": \"1F96E\",\n \"bagel\": \"1F96F\",\n \"smiling_face_with_3_hearts\": \"1F970\",\n \"yawning_face\": \"1F971\",\n \"smiling_face_with_tear\": \"1F972\",\n \"partying_face\": \"1F973\",\n \"woozy_face\": \"1F974\",\n \"hot_face\": \"1F975\",\n \"cold_face\": \"1F976\",\n \"ninja\": \"1F977\",\n \"disguised_face\": \"1F978\",\n \"pleading_face\": \"1F97A\",\n \"sari\": \"1F97B\",\n \"lab_coat\": \"1F97C\",\n \"goggles\": \"1F97D\",\n \"hiking_boot\": \"1F97E\",\n \"womans_flat_shoe\": \"1F97F\",\n \"crab\": \"1F980\",\n \"lion_face\": \"1F981\",\n \"scorpion\": \"1F982\",\n \"turkey\": \"1F983\",\n \"unicorn_face\": \"1F984\",\n \"eagle\": \"1F985\",\n \"duck\": \"1F986\",\n \"bat\": \"1F987\",\n \"shark\": \"1F988\",\n \"owl\": \"1F989\",\n \"fox_face\": \"1F98A\",\n \"butterfly\": \"1F98B\",\n \"deer\": \"1F98C\",\n \"gorilla\": \"1F98D\",\n \"lizard\": \"1F98E\",\n \"rhinoceros\": \"1F98F\",\n \"shrimp\": \"1F990\",\n \"squid\": \"1F991\",\n \"giraffe_face\": \"1F992\",\n \"zebra_face\": \"1F993\",\n \"hedgehog\": \"1F994\",\n \"sauropod\": \"1F995\",\n \"t-rex\": \"1F996\",\n \"cricket\": \"1F997\",\n \"kangaroo\": \"1F998\",\n \"llama\": \"1F999\",\n \"peacock\": \"1F99A\",\n \"hippopotamus\": \"1F99B\",\n \"parrot\": \"1F99C\",\n \"raccoon\": \"1F99D\",\n \"lobster\": \"1F99E\",\n \"mosquito\": \"1F99F\",\n \"microbe\": \"1F9A0\",\n \"badger\": \"1F9A1\",\n \"swan\": \"1F9A2\",\n \"mammoth\": \"1F9A3\",\n \"dodo\": \"1F9A4\",\n \"sloth\": \"1F9A5\",\n \"otter\": \"1F9A6\",\n \"orangutan\": \"1F9A7\",\n \"skunk\": \"1F9A8\",\n \"flamingo\": \"1F9A9\",\n \"oyster\": \"1F9AA\",\n \"beaver\": \"1F9AB\",\n \"bison\": \"1F9AC\",\n \"seal\": \"1F9AD\",\n \"guide_dog\": \"1F9AE\",\n \"probing_cane\": \"1F9AF\",\n \"bone\": \"1F9B4\",\n \"leg\": \"1F9B5\",\n \"foot\": \"1F9B6\",\n \"tooth\": \"1F9B7\",\n \"female_superhero\": \"1F9B8-200D-2640-FE0F\",\n \"male_superhero\": \"1F9B8-200D-2642-FE0F\",\n \"superhero\": \"1F9B8\",\n \"female_supervillain\": \"1F9B9-200D-2640-FE0F\",\n \"male_supervillain\": \"1F9B9-200D-2642-FE0F\",\n \"supervillain\": \"1F9B9\",\n \"safety_vest\": \"1F9BA\",\n \"ear_with_hearing_aid\": \"1F9BB\",\n \"motorized_wheelchair\": \"1F9BC\",\n \"manual_wheelchair\": \"1F9BD\",\n \"mechanical_arm\": \"1F9BE\",\n \"mechanical_leg\": \"1F9BF\",\n \"cheese_wedge\": \"1F9C0\",\n \"cupcake\": \"1F9C1\",\n \"salt\": \"1F9C2\",\n \"beverage_box\": \"1F9C3\",\n \"garlic\": \"1F9C4\",\n \"onion\": \"1F9C5\",\n \"falafel\": \"1F9C6\",\n \"waffle\": \"1F9C7\",\n \"butter\": \"1F9C8\",\n \"mate_drink\": \"1F9C9\",\n \"ice_cube\": \"1F9CA\",\n \"bubble_tea\": \"1F9CB\",\n \"woman_standing\": \"1F9CD-200D-2640-FE0F\",\n \"man_standing\": \"1F9CD-200D-2642-FE0F\",\n \"standing_person\": \"1F9CD\",\n \"woman_kneeling\": \"1F9CE-200D-2640-FE0F\",\n \"man_kneeling\": \"1F9CE-200D-2642-FE0F\",\n \"kneeling_person\": \"1F9CE\",\n \"deaf_woman\": \"1F9CF-200D-2640-FE0F\",\n \"deaf_man\": \"1F9CF-200D-2642-FE0F\",\n \"deaf_person\": \"1F9CF\",\n \"face_with_monocle\": \"1F9D0\",\n \"farmer\": \"1F9D1-200D-1F33E\",\n \"cook\": \"1F9D1-200D-1F373\",\n \"person_feeding_baby\": \"1F9D1-200D-1F37C\",\n \"mx_claus\": \"1F9D1-200D-1F384\",\n \"student\": \"1F9D1-200D-1F393\",\n \"singer\": \"1F9D1-200D-1F3A4\",\n \"artist\": \"1F9D1-200D-1F3A8\",\n \"teacher\": \"1F9D1-200D-1F3EB\",\n \"factory_worker\": \"1F9D1-200D-1F3ED\",\n \"technologist\": \"1F9D1-200D-1F4BB\",\n \"office_worker\": \"1F9D1-200D-1F4BC\",\n \"mechanic\": \"1F9D1-200D-1F527\",\n \"scientist\": \"1F9D1-200D-1F52C\",\n \"astronaut\": \"1F9D1-200D-1F680\",\n \"firefighter\": \"1F9D1-200D-1F692\",\n \"people_holding_hands\": \"1F9D1-200D-1F91D-200D-1F9D1\",\n \"person_with_probing_cane\": \"1F9D1-200D-1F9AF\",\n \"red_haired_person\": \"1F9D1-200D-1F9B0\",\n \"curly_haired_person\": \"1F9D1-200D-1F9B1\",\n \"bald_person\": \"1F9D1-200D-1F9B2\",\n \"white_haired_person\": \"1F9D1-200D-1F9B3\",\n \"person_in_motorized_wheelchair\": \"1F9D1-200D-1F9BC\",\n \"person_in_manual_wheelchair\": \"1F9D1-200D-1F9BD\",\n \"health_worker\": \"1F9D1-200D-2695-FE0F\",\n \"judge\": \"1F9D1-200D-2696-FE0F\",\n \"pilot\": \"1F9D1-200D-2708-FE0F\",\n \"adult\": \"1F9D1\",\n \"child\": \"1F9D2\",\n \"older_adult\": \"1F9D3\",\n \"bearded_person\": \"1F9D4\",\n \"person_with_headscarf\": \"1F9D5\",\n \"woman_in_steamy_room\": \"1F9D6-200D-2640-FE0F\",\n \"man_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"person_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"woman_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"man_climbing\": \"1F9D7-200D-2642-FE0F\",\n \"person_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"woman_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"man_in_lotus_position\": \"1F9D8-200D-2642-FE0F\",\n \"person_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"female_mage\": \"1F9D9-200D-2640-FE0F\",\n \"male_mage\": \"1F9D9-200D-2642-FE0F\",\n \"mage\": \"1F9D9-200D-2640-FE0F\",\n \"female_fairy\": \"1F9DA-200D-2640-FE0F\",\n \"male_fairy\": \"1F9DA-200D-2642-FE0F\",\n \"fairy\": \"1F9DA-200D-2640-FE0F\",\n \"female_vampire\": \"1F9DB-200D-2640-FE0F\",\n \"male_vampire\": \"1F9DB-200D-2642-FE0F\",\n \"vampire\": \"1F9DB-200D-2640-FE0F\",\n \"mermaid\": \"1F9DC-200D-2640-FE0F\",\n \"merman\": \"1F9DC-200D-2642-FE0F\",\n \"merperson\": \"1F9DC-200D-2642-FE0F\",\n \"female_elf\": \"1F9DD-200D-2640-FE0F\",\n \"male_elf\": \"1F9DD-200D-2642-FE0F\",\n \"elf\": \"1F9DD-200D-2642-FE0F\",\n \"female_genie\": \"1F9DE-200D-2640-FE0F\",\n \"male_genie\": \"1F9DE-200D-2642-FE0F\",\n \"genie\": \"1F9DE-200D-2642-FE0F\",\n \"female_zombie\": \"1F9DF-200D-2640-FE0F\",\n \"male_zombie\": \"1F9DF-200D-2642-FE0F\",\n \"zombie\": \"1F9DF-200D-2642-FE0F\",\n \"brain\": \"1F9E0\",\n \"orange_heart\": \"1F9E1\",\n \"billed_cap\": \"1F9E2\",\n \"scarf\": \"1F9E3\",\n \"gloves\": \"1F9E4\",\n \"coat\": \"1F9E5\",\n \"socks\": \"1F9E6\",\n \"red_envelope\": \"1F9E7\",\n \"firecracker\": \"1F9E8\",\n \"jigsaw\": \"1F9E9\",\n \"test_tube\": \"1F9EA\",\n \"petri_dish\": \"1F9EB\",\n \"dna\": \"1F9EC\",\n \"compass\": \"1F9ED\",\n \"abacus\": \"1F9EE\",\n \"fire_extinguisher\": \"1F9EF\",\n \"toolbox\": \"1F9F0\",\n \"bricks\": \"1F9F1\",\n \"magnet\": \"1F9F2\",\n \"luggage\": \"1F9F3\",\n \"lotion_bottle\": \"1F9F4\",\n \"thread\": \"1F9F5\",\n \"yarn\": \"1F9F6\",\n \"safety_pin\": \"1F9F7\",\n \"teddy_bear\": \"1F9F8\",\n \"broom\": \"1F9F9\",\n \"basket\": \"1F9FA\",\n \"roll_of_paper\": \"1F9FB\",\n \"soap\": \"1F9FC\",\n \"sponge\": \"1F9FD\",\n \"receipt\": \"1F9FE\",\n \"nazar_amulet\": \"1F9FF\",\n \"ballet_shoes\": \"1FA70\",\n \"one-piece_swimsuit\": \"1FA71\",\n \"briefs\": \"1FA72\",\n \"shorts\": \"1FA73\",\n \"thong_sandal\": \"1FA74\",\n \"drop_of_blood\": \"1FA78\",\n \"adhesive_bandage\": \"1FA79\",\n \"stethoscope\": \"1FA7A\",\n \"yo-yo\": \"1FA80\",\n \"kite\": \"1FA81\",\n \"parachute\": \"1FA82\",\n \"boomerang\": \"1FA83\",\n \"magic_wand\": \"1FA84\",\n \"pinata\": \"1FA85\",\n \"nesting_dolls\": \"1FA86\",\n \"ringed_planet\": \"1FA90\",\n \"chair\": \"1FA91\",\n \"razor\": \"1FA92\",\n \"axe\": \"1FA93\",\n \"diya_lamp\": \"1FA94\",\n \"banjo\": \"1FA95\",\n \"military_helmet\": \"1FA96\",\n \"accordion\": \"1FA97\",\n \"long_drum\": \"1FA98\",\n \"coin\": \"1FA99\",\n \"carpentry_saw\": \"1FA9A\",\n \"screwdriver\": \"1FA9B\",\n \"ladder\": \"1FA9C\",\n \"hook\": \"1FA9D\",\n \"mirror\": \"1FA9E\",\n \"window\": \"1FA9F\",\n \"plunger\": \"1FAA0\",\n \"sewing_needle\": \"1FAA1\",\n \"knot\": \"1FAA2\",\n \"bucket\": \"1FAA3\",\n \"mouse_trap\": \"1FAA4\",\n \"toothbrush\": \"1FAA5\",\n \"headstone\": \"1FAA6\",\n \"placard\": \"1FAA7\",\n \"rock\": \"1FAA8\",\n \"fly\": \"1FAB0\",\n \"worm\": \"1FAB1\",\n \"cockroach\": \"1FAB3\",\n \"potted_plant\": \"1FAB4\",\n \"wood\": \"1FAB5\",\n \"feather\": \"1FAB6\",\n \"anatomical_heart\": \"1FAC0\",\n \"lungs\": \"1FAC1\",\n \"people_hugging\": \"1FAC2\",\n \"blueberries\": \"1FAD0\",\n \"bell_pepper\": \"1FAD1\",\n \"olive\": \"1FAD2\",\n \"flatbread\": \"1FAD3\",\n \"tamale\": \"1FAD4\",\n \"fondue\": \"1FAD5\",\n \"teapot\": \"1FAD6\",\n \"bangbang\": \"203C-FE0F\",\n \"interrobang\": \"2049-FE0F\",\n \"tm\": \"2122-FE0F\",\n \"information_source\": \"2139-FE0F\",\n \"left_right_arrow\": \"2194-FE0F\",\n \"arrow_up_down\": \"2195-FE0F\",\n \"arrow_upper_left\": \"2196-FE0F\",\n \"arrow_upper_right\": \"2197-FE0F\",\n \"arrow_lower_right\": \"2198-FE0F\",\n \"arrow_lower_left\": \"2199-FE0F\",\n \"leftwards_arrow_with_hook\": \"21A9-FE0F\",\n \"arrow_right_hook\": \"21AA-FE0F\",\n \"watch\": \"231A\",\n \"hourglass\": \"231B\",\n \"keyboard\": \"2328-FE0F\",\n \"eject\": \"23CF-FE0F\",\n \"fast_forward\": \"23E9\",\n \"rewind\": \"23EA\",\n \"arrow_double_up\": \"23EB\",\n \"arrow_double_down\": \"23EC\",\n \"black_right_pointing_double_triangle_with_vertical_bar\": \"23ED-FE0F\",\n \"black_left_pointing_double_triangle_with_vertical_bar\": \"23EE-FE0F\",\n \"black_right_pointing_triangle_with_double_vertical_bar\": \"23EF-FE0F\",\n \"alarm_clock\": \"23F0\",\n \"stopwatch\": \"23F1-FE0F\",\n \"timer_clock\": \"23F2-FE0F\",\n \"hourglass_flowing_sand\": \"23F3\",\n \"double_vertical_bar\": \"23F8-FE0F\",\n \"black_square_for_stop\": \"23F9-FE0F\",\n \"black_circle_for_record\": \"23FA-FE0F\",\n \"m\": \"24C2-FE0F\",\n \"black_small_square\": \"25AA-FE0F\",\n \"white_small_square\": \"25AB-FE0F\",\n \"arrow_forward\": \"25B6-FE0F\",\n \"arrow_backward\": \"25C0-FE0F\",\n \"white_medium_square\": \"25FB-FE0F\",\n \"black_medium_square\": \"25FC-FE0F\",\n \"white_medium_small_square\": \"25FD\",\n \"black_medium_small_square\": \"25FE\",\n \"sunny\": \"2600-FE0F\",\n \"cloud\": \"2601-FE0F\",\n \"umbrella\": \"2602-FE0F\",\n \"snowman\": \"2603-FE0F\",\n \"comet\": \"2604-FE0F\",\n \"phone\": \"260E-FE0F\",\n \"ballot_box_with_check\": \"2611-FE0F\",\n \"umbrella_with_rain_drops\": \"2614\",\n \"coffee\": \"2615\",\n \"shamrock\": \"2618-FE0F\",\n \"point_up\": \"261D-FE0F\",\n \"skull_and_crossbones\": \"2620-FE0F\",\n \"radioactive_sign\": \"2622-FE0F\",\n \"biohazard_sign\": \"2623-FE0F\",\n \"orthodox_cross\": \"2626-FE0F\",\n \"star_and_crescent\": \"262A-FE0F\",\n \"peace_symbol\": \"262E-FE0F\",\n \"yin_yang\": \"262F-FE0F\",\n \"wheel_of_dharma\": \"2638-FE0F\",\n \"white_frowning_face\": \"2639-FE0F\",\n \"relaxed\": \"263A-FE0F\",\n \"female_sign\": \"2640-FE0F\",\n \"male_sign\": \"2642-FE0F\",\n \"aries\": \"2648\",\n \"taurus\": \"2649\",\n \"gemini\": \"264A\",\n \"cancer\": \"264B\",\n \"leo\": \"264C\",\n \"virgo\": \"264D\",\n \"libra\": \"264E\",\n \"scorpius\": \"264F\",\n \"sagittarius\": \"2650\",\n \"capricorn\": \"2651\",\n \"aquarius\": \"2652\",\n \"pisces\": \"2653\",\n \"chess_pawn\": \"265F-FE0F\",\n \"spades\": \"2660-FE0F\",\n \"clubs\": \"2663-FE0F\",\n \"hearts\": \"2665-FE0F\",\n \"diamonds\": \"2666-FE0F\",\n \"hotsprings\": \"2668-FE0F\",\n \"recycle\": \"267B-FE0F\",\n \"infinity\": \"267E-FE0F\",\n \"wheelchair\": \"267F\",\n \"hammer_and_pick\": \"2692-FE0F\",\n \"anchor\": \"2693\",\n \"crossed_swords\": \"2694-FE0F\",\n \"medical_symbol\": \"2695-FE0F\",\n \"scales\": \"2696-FE0F\",\n \"alembic\": \"2697-FE0F\",\n \"gear\": \"2699-FE0F\",\n \"atom_symbol\": \"269B-FE0F\",\n \"fleur_de_lis\": \"269C-FE0F\",\n \"warning\": \"26A0-FE0F\",\n \"zap\": \"26A1\",\n \"transgender_symbol\": \"26A7-FE0F\",\n \"white_circle\": \"26AA\",\n \"black_circle\": \"26AB\",\n \"coffin\": \"26B0-FE0F\",\n \"funeral_urn\": \"26B1-FE0F\",\n \"soccer\": \"26BD\",\n \"baseball\": \"26BE\",\n \"snowman_without_snow\": \"26C4\",\n \"partly_sunny\": \"26C5\",\n \"thunder_cloud_and_rain\": \"26C8-FE0F\",\n \"ophiuchus\": \"26CE\",\n \"pick\": \"26CF-FE0F\",\n \"helmet_with_white_cross\": \"26D1-FE0F\",\n \"chains\": \"26D3-FE0F\",\n \"no_entry\": \"26D4\",\n \"shinto_shrine\": \"26E9-FE0F\",\n \"church\": \"26EA\",\n \"mountain\": \"26F0-FE0F\",\n \"umbrella_on_ground\": \"26F1-FE0F\",\n \"fountain\": \"26F2\",\n \"golf\": \"26F3\",\n \"ferry\": \"26F4-FE0F\",\n \"boat\": \"26F5\",\n \"skier\": \"26F7-FE0F\",\n \"ice_skate\": \"26F8-FE0F\",\n \"woman-bouncing-ball\": \"26F9-FE0F-200D-2640-FE0F\",\n \"man-bouncing-ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"person_with_ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"tent\": \"26FA\",\n \"fuelpump\": \"26FD\",\n \"scissors\": \"2702-FE0F\",\n \"white_check_mark\": \"2705\",\n \"airplane\": \"2708-FE0F\",\n \"email\": \"2709-FE0F\",\n \"fist\": \"270A\",\n \"hand\": \"270B\",\n \"v\": \"270C-FE0F\",\n \"writing_hand\": \"270D-FE0F\",\n \"pencil2\": \"270F-FE0F\",\n \"black_nib\": \"2712-FE0F\",\n \"heavy_check_mark\": \"2714-FE0F\",\n \"heavy_multiplication_x\": \"2716-FE0F\",\n \"latin_cross\": \"271D-FE0F\",\n \"star_of_david\": \"2721-FE0F\",\n \"sparkles\": \"2728\",\n \"eight_spoked_asterisk\": \"2733-FE0F\",\n \"eight_pointed_black_star\": \"2734-FE0F\",\n \"snowflake\": \"2744-FE0F\",\n \"sparkle\": \"2747-FE0F\",\n \"x\": \"274C\",\n \"negative_squared_cross_mark\": \"274E\",\n \"question\": \"2753\",\n \"grey_question\": \"2754\",\n \"grey_exclamation\": \"2755\",\n \"exclamation\": \"2757\",\n \"heavy_heart_exclamation_mark_ornament\": \"2763-FE0F\",\n \"heart\": \"2764-FE0F\",\n \"heavy_plus_sign\": \"2795\",\n \"heavy_minus_sign\": \"2796\",\n \"heavy_division_sign\": \"2797\",\n \"arrow_right\": \"27A1-FE0F\",\n \"curly_loop\": \"27B0\",\n \"loop\": \"27BF\",\n \"arrow_heading_up\": \"2934-FE0F\",\n \"arrow_heading_down\": \"2935-FE0F\",\n \"arrow_left\": \"2B05-FE0F\",\n \"arrow_up\": \"2B06-FE0F\",\n \"arrow_down\": \"2B07-FE0F\",\n \"black_large_square\": \"2B1B\",\n \"white_large_square\": \"2B1C\",\n \"star\": \"2B50\",\n \"o\": \"2B55\",\n \"wavy_dash\": \"3030-FE0F\",\n \"part_alternation_mark\": \"303D-FE0F\",\n \"congratulations\": \"3297-FE0F\",\n \"secret\": \"3299-FE0F\"\n};\n"],"file":"data.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/emoji/picker.min.js.map b/lib/amd/build/emoji/picker.min.js.map
index f476507fdf9..f150c1ed959 100644
--- a/lib/amd/build/emoji/picker.min.js.map
+++ b/lib/amd/build/emoji/picker.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/emoji/picker.js"],"names":["ROW_RENDER_BUFFER_COUNT","RECENT_EMOJIS_STORAGE_KEY","ROW_HEIGHT_RAW","EMOJIS_PER_ROW","ROW_TYPE","EMOJI","HEADER","SELECTORS","CATEGORY_SELECTOR","EMOJIS_CONTAINER","EMOJI_PREVIEW","EMOJI_SHORT_NAME","ROW_CONTAINER","SEARCH_INPUT","SEARCH_RESULTS_CONTAINER","createRowDataForCategory","categoryName","categoryDisplayName","emojis","totalRowCount","rowData","push","index","length","type","data","name","displayName","i","rowEmojis","slice","addIndexesToRowData","map","getCategoryScrollPositionsFromRowData","reduce","carry","row","createHeaderRow","rowIndex","context","text","html","temp","document","createElement","innerHTML","firstChild","createEmojiRow","emojiData","charCodes","unified","split","code","emojiText","String","fromCodePoint","apply","shortnames","join","spacer","spacers","Array","fill","isEmojiElement","element","getAttribute","findCategorySelectorFromElement","parentElement","getCategorySelectorByCategoryName","root","querySelector","setCategorySelectorActive","allCategorySelectors","querySelectorAll","selector","classList","remove","add","getCategoryByScrollPosition","position","categoryScrollPositions","positions","categoryPosition","sort","a","b","candidate","previousPosition","currentPosition","nextPosition","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","saveRecentEmoji","recentEmojis","set","stringify","addRecentEmoji","recentEmojiRowCount","newEmoji","newRecentEmojis","filter","emoji","newRecentEmojiRowData","concat","getRowsToRender","scrollPosition","visibleRowCount","minVisibleRow","Math","floor","start","rows","createRowElement","style","left","right","top","doRowsMatch","renderRows","rowContainer","currentRows","nextRows","toAdd","nextRow","some","currentRow","toKeep","toRemove","toRemoveElements","Promise","all","forEach","nextRowIndex","nextRowData","nextRowNode","insertBefore","splice","appendChild","removeChild","generateRenderRowsAtPositionFunction","rowCount","isRendering","renderNextRows","nextRowsToRender","rowLimit","height","showSearchResults","emojiContainer","searchResultsContainer","clearSearch","searchInput","value","getHandleMouseEnter","emojiPreview","emojiShortName","e","target","textContent","getHandleMouseLeave","getHandleClick","selectCallback","renderAtPosition","newRowData","newCategoryScrollPositions","replace","currentScrollTop","scrollTop","isRecentEmojiRowVisible","categorySelector","selectedCategory","getHandleScroll","currentVisibleRowScrollPosition","initialCategoryScrollPositions","currentCategoryElement","previousCategoryPosition","nextCategoryPosition","newScrollPosition","upperScrollBound","lowerScrollBound","updateActiveCategory","requestAnimationFrame","getHandleSearch","renderSearchResultsAtPosition","searchTerm","toLowerCase","matchingEmojis","Object","keys","EmojiData","byShortName","shortName","includes","searchResultsString","registerEventListeners","clickHandler","scrollHandler","searchHandler","addEventListener","allData","byCategory","category","title","categoryRowData"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Emoji picker.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport LocalStorage from 'core/localstorage';\nimport * as EmojiData from 'core/emoji/data';\nimport {throttle, debounce} from 'core/utils';\nimport {get_string} from 'core/str';\nimport {render as renderTemplate} from 'core/templates';\n\nconst VISIBLE_ROW_COUNT = 10;\nconst ROW_RENDER_BUFFER_COUNT = 5;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\nconst ROW_HEIGHT_RAW = 40;\nconst EMOJIS_PER_ROW = 7;\nconst MAX_RECENT_COUNT = EMOJIS_PER_ROW * 3;\nconst ROW_TYPE = {\n EMOJI: 0,\n HEADER: 1\n};\nconst SELECTORS = {\n CATEGORY_SELECTOR: '[data-action=\"show-category\"]',\n EMOJIS_CONTAINER: '[data-region=\"emojis-container\"]',\n EMOJI_PREVIEW: '[data-region=\"emoji-preview\"]',\n EMOJI_SHORT_NAME: '[data-region=\"emoji-short-name\"]',\n ROW_CONTAINER: '[data-region=\"row-container\"]',\n SEARCH_INPUT: '[data-region=\"search-input\"]',\n SEARCH_RESULTS_CONTAINER: '[data-region=\"search-results-container\"]'\n};\n\n/**\n * Create the row data for a category.\n *\n * @param {String} categoryName The category name\n * @param {String} categoryDisplayName The category display name\n * @param {Array} emojis The emoji data\n * @param {Number} totalRowCount The total number of rows generated so far\n * @return {Array}\n */\nconst createRowDataForCategory = (categoryName, categoryDisplayName, emojis, totalRowCount) => {\n const rowData = [];\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.HEADER,\n data: {\n name: categoryName,\n displayName: categoryDisplayName\n }\n });\n\n for (let i = 0; i < emojis.length; i += EMOJIS_PER_ROW) {\n const rowEmojis = emojis.slice(i, i + EMOJIS_PER_ROW);\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.EMOJI,\n data: rowEmojis\n });\n }\n\n return rowData;\n};\n\n/**\n * Add each row's index to it's value in the row data.\n *\n * @param {Array} rowData List of emoji row data\n * @return {Array}\n */\nconst addIndexesToRowData = (rowData) => {\n return rowData.map((data, index) => {\n return {...data, index};\n });\n};\n\n/**\n * Calculate the scroll position for the beginning of each category from\n * the row data.\n *\n * @param {Array} rowData List of emoji row data\n * @return {Object}\n */\nconst getCategoryScrollPositionsFromRowData = (rowData) => {\n return rowData.reduce((carry, row, index) => {\n if (row.type === ROW_TYPE.HEADER) {\n carry[row.data.name] = index * ROW_HEIGHT_RAW;\n }\n return carry;\n }, {});\n};\n\n/**\n * Create a header row element for the category name.\n *\n * @param {Number} rowIndex Index of the row in the row data\n * @param {String} name The category display name\n * @return {Element}\n */\nconst createHeaderRow = async (rowIndex, name) => {\n const context = {\n index: rowIndex,\n text: name\n };\n const html = await renderTemplate('core/emoji/header_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Create an emoji row element.\n *\n * @param {Number} rowIndex Index of the row in the row data\n * @param {Array} emojis The list of emoji data for the row\n * @return {Element}\n */\nconst createEmojiRow = async (rowIndex, emojis) => {\n const context = {\n index: rowIndex,\n emojis: emojis.map(emojiData => {\n const charCodes = emojiData.unified.split('-').map(code => `0x${code}`);\n const emojiText = String.fromCodePoint.apply(null, charCodes);\n return {\n shortnames: `:${emojiData.shortnames.join(': :')}:`,\n unified: emojiData.unified,\n text: emojiText,\n spacer: false\n };\n }),\n spacers: Array(EMOJIS_PER_ROW - emojis.length).fill(true)\n };\n const html = await renderTemplate('core/emoji/emoji_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Check if the element is an emoji element.\n *\n * @param {Element} element Element to check\n * @return {Bool}\n */\nconst isEmojiElement = element => element.getAttribute('data-short-names') !== null;\n\n/**\n * Search from an element and up through it's ancestors to fine the category\n * selector element and return it.\n *\n * @param {Element} element Element to begin searching from\n * @return {Element|null}\n */\nconst findCategorySelectorFromElement = element => {\n if (!element) {\n return null;\n }\n\n if (element.getAttribute('data-action') === 'show-category') {\n return element;\n } else {\n return findCategorySelectorFromElement(element.parentElement);\n }\n};\n\nconst getCategorySelectorByCategoryName = (root, name) => {\n return root.querySelector(`[data-category=\"${name}\"]`);\n};\n\n/**\n * Sets the given category selector element as active.\n *\n * @param {Element} root The root picker element\n * @param {Element} element The category selector element to make active\n */\nconst setCategorySelectorActive = (root, element) => {\n const allCategorySelectors = root.querySelectorAll(SELECTORS.CATEGORY_SELECTOR);\n\n for (let i = 0; i < allCategorySelectors.length; i++) {\n const selector = allCategorySelectors[i];\n selector.classList.remove('selected');\n }\n\n element.classList.add('selected');\n};\n\n/**\n * Get the category selector element and the scroll positions for the previous and\n * next categories for the given scroll position.\n *\n * @param {Element} root The picker root element\n * @param {Number} position The position to get the category for\n * @param {Object} categoryScrollPositions Set of scroll positions for all categories\n * @return {Array}\n */\nconst getCategoryByScrollPosition = (root, position, categoryScrollPositions) => {\n let positions = [];\n\n if (position < 0) {\n position = 0;\n }\n\n // Get all of the category positions.\n for (const categoryName in categoryScrollPositions) {\n const categoryPosition = categoryScrollPositions[categoryName];\n positions.push([categoryPosition, categoryName]);\n }\n\n // Sort the positions in ascending order.\n positions.sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // Get the current category name as well as the previous and next category\n // positions from the sorted list of positions.\n const {categoryName, previousPosition, nextPosition} = positions.reduce(\n (carry, candidate) => {\n const [categoryPosition, categoryName] = candidate;\n\n if (categoryPosition <= position) {\n carry.categoryName = categoryName;\n carry.previousPosition = carry.currentPosition;\n carry.currentPosition = position;\n } else if (carry.nextPosition === null) {\n carry.nextPosition = categoryPosition;\n }\n\n return carry;\n },\n {\n categoryName: null,\n currentPosition: null,\n previousPosition: null,\n nextPosition: null\n }\n );\n\n return [getCategorySelectorByCategoryName(root, categoryName), previousPosition, nextPosition];\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Save the list of recent emojis in local storage.\n *\n * @param {Array} recentEmojis List of emoji data to save\n */\nconst saveRecentEmoji = (recentEmojis) => {\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(recentEmojis));\n};\n\n/**\n * Add an emoji data to the set of recent emojis. This function will update the row\n * data to ensure that the recent emoji rows are correct and all of the rows are\n * re-indexed.\n *\n * The new set of recent emojis are saved in local storage and the full set of updated\n * row data and new emoji row count are returned.\n *\n * @param {Array} rowData The emoji rows data\n * @param {Number} recentEmojiRowCount Count of the recent emoji rows\n * @param {Object} newEmoji The emoji data for the emoji to add to the recent emoji list\n * @return {Array}\n */\nconst addRecentEmoji = (rowData, recentEmojiRowCount, newEmoji) => {\n // The first set of rows is always the recent emojis.\n const categoryName = rowData[0].data.name;\n const categoryDisplayName = rowData[0].data.displayName;\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n const newRecentEmojiRowData = createRowDataForCategory(categoryName, categoryDisplayName, newRecentEmojis);\n\n // Save the new list in local storage.\n saveRecentEmoji(newRecentEmojis);\n\n return [\n // Return the new rowData and re-index it to make sure it's all correct.\n addIndexesToRowData(newRecentEmojiRowData.concat(rowData.slice(recentEmojiRowCount))),\n newRecentEmojiRowData.length\n ];\n};\n\n/**\n * Calculate which rows should be visible based on the given scroll position. Adds a\n * buffer to amount to either side of the total number of requested rows so that\n * scrolling the emoji rows container is smooth.\n *\n * @param {Number} scrollPosition Scroll position within the emoji container\n * @param {Number} visibleRowCount How many rows should be visible\n * @param {Array} rowData The emoji rows data\n * @return {Array}\n */\nconst getRowsToRender = (scrollPosition, visibleRowCount, rowData) => {\n const minVisibleRow = scrollPosition > ROW_HEIGHT_RAW ? Math.floor(scrollPosition / ROW_HEIGHT_RAW) : 0;\n const start = minVisibleRow >= ROW_RENDER_BUFFER_COUNT ? minVisibleRow - ROW_RENDER_BUFFER_COUNT : minVisibleRow;\n const end = minVisibleRow + visibleRowCount + ROW_RENDER_BUFFER_COUNT;\n const rows = rowData.slice(start, end);\n return rows;\n};\n\n/**\n * Create a row element from the row data.\n *\n * @param {Object} rowData The emoji row data\n * @return {Element}\n */\nconst createRowElement = async (rowData) => {\n let row = null;\n if (rowData.type === ROW_TYPE.HEADER) {\n row = await createHeaderRow(rowData.index, rowData.data.displayName);\n } else {\n row = await createEmojiRow(rowData.index, rowData.data);\n }\n\n row.style.position = 'absolute';\n row.style.left = 0;\n row.style.right = 0;\n row.style.top = `${rowData.index * ROW_HEIGHT_RAW}px`;\n\n return row;\n};\n\n/**\n * Check if the given rows match.\n *\n * @param {Object} a The first row\n * @param {Object} b The second row\n * @return {Bool}\n */\nconst doRowsMatch = (a, b) => {\n if (a.index !== b.index) {\n return false;\n }\n\n if (a.type !== b.type) {\n return false;\n }\n\n if (typeof a.data != typeof b.data) {\n return false;\n }\n\n if (a.type === ROW_TYPE.HEADER) {\n return a.data.name === b.data.name;\n } else {\n if (a.data.length !== b.data.length) {\n return false;\n }\n\n for (let i = 0; i < a.data.length; i++) {\n if (a.data[i].unified != b.data[i].unified) {\n return false;\n }\n }\n }\n\n return true;\n};\n\n/**\n * Update the visible rows. Deletes any row elements that should no longer\n * be visible and creates the newly visible row elements. Any rows that haven't\n * changed visibility will be left untouched.\n *\n * @param {Element} rowContainer The container element for the emoji rows\n * @param {Array} currentRows List of row data that matches the currently visible rows\n * @param {Array} nextRows List of row data containing the new list of rows to be made visible\n */\nconst renderRows = async (rowContainer, currentRows, nextRows) => {\n // We need to add any rows that are in nextRows but not in currentRows.\n const toAdd = nextRows.filter(nextRow => !currentRows.some(currentRow => doRowsMatch(currentRow, nextRow)));\n // Remember which rows will still be visible so that we can insert our element in the correct place in the DOM.\n let toKeep = currentRows.filter(currentRow => nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n // We need to remove any rows that are in currentRows but not in nextRows.\n const toRemove = currentRows.filter(currentRow => !nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n const toRemoveElements = toRemove.map(rowData => rowContainer.querySelectorAll(`[data-row=\"${rowData.index}\"]`));\n\n // Render all of the templates first.\n const rows = await Promise.all(toAdd.map(rowData => createRowElement(rowData)));\n\n rows.forEach((row, index) => {\n const rowData = toAdd[index];\n let nextRowIndex = null;\n\n for (let i = 0; i < toKeep.length; i++) {\n const candidate = toKeep[i];\n if (candidate.index > rowData.index) {\n nextRowIndex = i;\n break;\n }\n }\n\n // Make sure the elements get added to the DOM in the correct order (ascending by row data index)\n // so that they appear naturally in the tab order.\n if (nextRowIndex !== null) {\n const nextRowData = toKeep[nextRowIndex];\n const nextRowNode = rowContainer.querySelector(`[data-row=\"${nextRowData.index}\"]`);\n\n rowContainer.insertBefore(row, nextRowNode);\n toKeep.splice(nextRowIndex, 0, toKeep);\n } else {\n toKeep.push(rowData);\n rowContainer.appendChild(row);\n }\n });\n\n toRemoveElements.forEach(rows => {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n rowContainer.removeChild(row);\n }\n });\n};\n\n/**\n * Build a function to render the visible emoji rows for a given scroll\n * position.\n *\n * @param {Element} rowContainer The container element for the emoji rows\n * @return {Function}\n */\nconst generateRenderRowsAtPositionFunction = (rowContainer) => {\n let currentRows = [];\n let nextRows = [];\n let rowCount = 0;\n let isRendering = false;\n const renderNextRows = async () => {\n if (!nextRows.length) {\n return;\n }\n\n if (isRendering) {\n return;\n }\n\n isRendering = true;\n const nextRowsToRender = nextRows.slice();\n nextRows = [];\n\n await renderRows(rowContainer, currentRows, nextRowsToRender);\n currentRows = nextRowsToRender;\n isRendering = false;\n renderNextRows();\n };\n\n return (scrollPosition, rowData, rowLimit = VISIBLE_ROW_COUNT) => {\n nextRows = getRowsToRender(scrollPosition, rowLimit, rowData);\n renderNextRows();\n\n if (rowCount !== rowData.length) {\n // Adjust the height of the container to match the number of rows.\n rowContainer.style.height = `${rowData.length * ROW_HEIGHT_RAW}px`;\n }\n\n rowCount = rowData.length;\n };\n};\n\n/**\n * Show the search results container and hide the emoji container.\n *\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n */\nconst showSearchResults = (emojiContainer, searchResultsContainer) => {\n searchResultsContainer.classList.remove('hidden');\n emojiContainer.classList.add('hidden');\n};\n\n/**\n * Hide the search result container and show the emojis container.\n *\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n * @param {Element} searchInput The search input\n */\nconst clearSearch = (emojiContainer, searchResultsContainer, searchInput) => {\n searchResultsContainer.classList.add('hidden');\n emojiContainer.classList.remove('hidden');\n searchInput.value = '';\n};\n\n/**\n * Build function to handle mouse hovering an emoji. Shows the preview.\n *\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseEnter = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = target.getAttribute('data-short-names');\n emojiPreview.textContent = target.textContent;\n }\n };\n};\n\n/**\n * Build function to handle mouse leaving an emoji. Removes the preview.\n *\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseLeave = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = '';\n emojiPreview.textContent = '';\n }\n };\n};\n\n/**\n * Build the function to handle a user clicking something in the picker.\n *\n * The function currently handles clicking on the category selector or selecting\n * a specific emoji.\n *\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n * @param {Element} emojiContainer Container element for the visible of emojis\n * @param {Element} searchResultsContainer Contaienr element for the search results\n * @param {Element} searchInput Search input element\n * @param {Function} selectCallback Callback function to execute when a user selects an emoji\n * @param {Function} renderAtPosition Render function to display current visible emojis\n * @return {Function}\n */\nconst getHandleClick = (\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n) => {\n return (e, rowData, categoryScrollPositions) => {\n const target = e.target;\n let newRowData = rowData;\n let newCategoryScrollPositions = categoryScrollPositions;\n\n // Hide the search results if they are visible.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n\n if (isEmojiElement(target)) {\n // Emoji selected.\n const unified = target.getAttribute('data-unified');\n const shortnames = target.getAttribute('data-short-names').replace(/:/g, '').split(' ');\n // Build the emoji data from the selected element.\n const emojiData = {unified, shortnames};\n const currentScrollTop = emojiContainer.scrollTop;\n const isRecentEmojiRowVisible = emojiContainer.querySelector(`[data-row=\"${recentEmojiRowCount - 1}\"]`) !== null;\n // Save the selected emoji in the recent emojis list.\n [newRowData, recentEmojiRowCount] = addRecentEmoji(rowData, recentEmojiRowCount, emojiData);\n // Re-index the category scroll positions because the additional recent emoji may have\n // changed their positions.\n newCategoryScrollPositions = getCategoryScrollPositionsFromRowData(newRowData);\n\n if (isRecentEmojiRowVisible) {\n // If the list of recent emojis is currently visible then we need to re-render the emojis\n // to update the display and show the newly selected recent emoji.\n renderAtPosition(currentScrollTop, newRowData);\n }\n\n // Call the client's callback function with the selected emoji.\n selectCallback(target.textContent);\n // Return the newly calculated row data and scroll positions.\n return [newRowData, newCategoryScrollPositions];\n }\n\n const categorySelector = findCategorySelectorFromElement(target);\n if (categorySelector) {\n // Category selector.\n const selectedCategory = categorySelector.getAttribute('data-category');\n const position = categoryScrollPositions[selectedCategory];\n // Scroll the container to the selected category. This will trigger the\n // on scroll handler to re-render the visibile emojis.\n emojiContainer.scrollTop = position;\n }\n\n return [newRowData, newCategoryScrollPositions];\n };\n};\n\n/**\n * Build the function that handles scrolling of the emoji container to display the\n * correct emojis.\n *\n * We render the emoji rows as they are needed rather than all up front so that we\n * can avoid adding tends of thousands of elements to the DOM unnecessarily which\n * would bog down performance.\n *\n * @param {Element} root The picker root element\n * @param {Number} currentVisibleRowScrollPosition The current scroll position of the container\n * @param {Element} emojiContainer The emojis container element\n * @param {Object} initialCategoryScrollPositions Scroll positions for each category\n * @param {Function} renderAtPosition Function to render the appropriate emojis for a scroll position\n * @return {Function}\n */\nconst getHandleScroll = (\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n initialCategoryScrollPositions,\n renderAtPosition\n) => {\n // Scope some local variables to track the scroll positions of the categories. We need to\n // recalculate these because adding recent emojis can change those positions by adding\n // additional rows.\n let [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, emojiContainer.scrollTop, initialCategoryScrollPositions);\n\n return (categoryScrollPositions, rowData) => {\n const newScrollPosition = emojiContainer.scrollTop;\n const upperScrollBound = currentVisibleRowScrollPosition + ROW_HEIGHT_RAW;\n const lowerScrollBound = currentVisibleRowScrollPosition - ROW_HEIGHT_RAW;\n // We only need to update the active category indicator if the user has scrolled into a\n // new category scroll position.\n const updateActiveCategory = (newScrollPosition >= nextCategoryPosition) ||\n (newScrollPosition < previousCategoryPosition);\n // We only need to render new emoji rows if the user has scrolled far enough that a new row\n // would be visible (i.e. they've scrolled up or down more than 40px - the height of a row).\n const updateRenderRows = (newScrollPosition < lowerScrollBound) || (newScrollPosition > upperScrollBound);\n\n if (updateActiveCategory) {\n // New category is visible so update the active category selector and re-index the\n // positions incase anything has changed.\n [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, newScrollPosition, categoryScrollPositions);\n setCategorySelectorActive(root, currentCategoryElement);\n }\n\n if (updateRenderRows) {\n // A new row should be visible so re-render the visible emojis at this new position.\n // We request an animation frame from the browser so that we're not blocking anything.\n // The animation only needs to occur as soon as the browser is ready not immediately.\n requestAnimationFrame(() => {\n renderAtPosition(newScrollPosition, rowData);\n // Remember the updated position.\n currentVisibleRowScrollPosition = newScrollPosition;\n });\n }\n };\n};\n\n/**\n * Build the function that handles search input from the user.\n *\n * @param {Element} searchInput The search input element\n * @param {Element} searchResultsContainer Container element to display the search results\n * @param {Element} emojiContainer Container element for the emoji rows\n * @return {Function}\n */\nconst getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) => {\n const rowContainer = searchResultsContainer.querySelector(SELECTORS.ROW_CONTAINER);\n // Build a render function for the search results.\n const renderSearchResultsAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n searchResultsContainer.appendChild(rowContainer);\n\n return async () => {\n const searchTerm = searchInput.value.toLowerCase();\n\n if (searchTerm) {\n // Display the search results container and hide the emojis container.\n showSearchResults(emojiContainer, searchResultsContainer);\n\n // Find which emojis match the user's search input.\n const matchingEmojis = Object.keys(EmojiData.byShortName).reduce((carry, shortName) => {\n if (shortName.includes(searchTerm)) {\n carry.push({\n shortnames: [shortName],\n unified: EmojiData.byShortName[shortName]\n });\n }\n return carry;\n }, []);\n\n const searchResultsString = await get_string('searchresults', 'core');\n const rowData = createRowDataForCategory(searchResultsString, searchResultsString, matchingEmojis, 0);\n // Show the emoji rows for the search results.\n renderSearchResultsAtPosition(0, rowData, rowData.length);\n } else {\n // Hide the search container and show the emojis container.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n }\n };\n};\n\n/**\n * Register the emoji picker event listeners.\n *\n * @param {Element} root The picker root element\n * @param {Element} emojiContainer Root element containing the list of visible emojis\n * @param {Function} renderAtPosition Function to render the visible emojis at a given scroll position\n * @param {Number} currentVisibleRowScrollPosition What is the current scroll position\n * @param {Function} selectCallback Function to execute when the user picks an emoji\n * @param {Object} categoryScrollPositions Scroll positions for where each of the emoji categories begin\n * @param {Array} rowData Data representing each of the display rows for hte emoji container\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n */\nconst registerEventListeners = (\n root,\n emojiContainer,\n renderAtPosition,\n currentVisibleRowScrollPosition,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n) => {\n const searchInput = root.querySelector(SELECTORS.SEARCH_INPUT);\n const searchResultsContainer = root.querySelector(SELECTORS.SEARCH_RESULTS_CONTAINER);\n const emojiPreview = root.querySelector(SELECTORS.EMOJI_PREVIEW);\n const emojiShortName = root.querySelector(SELECTORS.EMOJI_SHORT_NAME);\n // Build the click handler function.\n const clickHandler = getHandleClick(\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n );\n // Build the scroll handler function.\n const scrollHandler = getHandleScroll(\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n categoryScrollPositions,\n renderAtPosition\n );\n const searchHandler = getHandleSearch(searchInput, searchResultsContainer, emojiContainer);\n\n // Mouse enter/leave events to show the emoji preview on hover or focus.\n root.addEventListener('focus', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('blur', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseenter', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseleave', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n // User selects an emoji or clicks on one of the emoji category selectors.\n root.addEventListener('click', e => {\n // Update the row data and category scroll positions because they may have changes if the\n // user selects an emoji which updates the recent emojis list.\n [rowData, categoryScrollPositions] = clickHandler(e, rowData, categoryScrollPositions);\n });\n // Throttle the scroll event to only execute once every 50 milliseconds to prevent performance issues\n // in the browser when re-rendering the picker emojis. The scroll event fires a lot otherwise.\n emojiContainer.addEventListener('scroll', throttle(() => scrollHandler(categoryScrollPositions, rowData), 50));\n // Debounce the search input so that it only executes 200 milliseconds after the user has finished typing.\n searchInput.addEventListener('input', debounce(searchHandler, 200));\n};\n\n/**\n * Initialise the emoji picker.\n *\n * @param {Element} root The root element for the picker\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, selectCallback) => {\n const emojiContainer = root.querySelector(SELECTORS.EMOJIS_CONTAINER);\n const rowContainer = emojiContainer.querySelector(SELECTORS.ROW_CONTAINER);\n const recentEmojis = getRecentEmojis();\n // Add the recent emojis category to the list of standard categories.\n const allData = [{\n name: 'Recent',\n emojis: recentEmojis\n }, ...EmojiData.byCategory];\n let rowData = [];\n let recentEmojiRowCount = 0;\n\n /**\n * Split categories data into rows which represent how they will be displayed in the\n * picker. Each category will add a row containing the display name for the category\n * and a row for every 9 emojis in the category. The row data will be used to calculate\n * which emojis should be visible in the picker at any given time.\n *\n * E.g.\n * input = [\n * {name: 'example1', emojis: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n * {name: 'example2', emojis: [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]},\n * ]\n * output = [\n * {type: 'categoryName': data: 'Example 1'},\n * {type: 'emojiRow': data: [1, 2, 3, 4, 5, 6, 7, 8, 9]},\n * {type: 'emojiRow': data: [10, 11, 12]},\n * {type: 'categoryName': data: 'Example 2'},\n * {type: 'emojiRow': data: [13, 14, 15, 16, 17, 18, 19, 20, 21]},\n * {type: 'emojiRow': data: [22, 23]},\n * ]\n */\n allData.forEach(category => {\n const categorySelector = getCategorySelectorByCategoryName(root, category.name);\n // Get the display name from the category selector button so that we don't need to\n // send an ajax request for the string.\n const categoryDisplayName = categorySelector.title;\n const categoryRowData = createRowDataForCategory(category.name, categoryDisplayName, category.emojis, rowData.length);\n\n if (category.name === 'Recent') {\n // Remember how many recent emoji rows there are because it needs to be used to\n // re-index the row data later when we're adding more recent emojis.\n recentEmojiRowCount = categoryRowData.length;\n }\n\n rowData = rowData.concat(categoryRowData);\n });\n\n // Index the row data so that we can calculate which rows should be visible.\n rowData = addIndexesToRowData(rowData);\n // Calculate the scroll positions for each of the categories within the emoji container.\n // These are used to know where to jump to when the user selects a specific category.\n const categoryScrollPositions = getCategoryScrollPositionsFromRowData(rowData);\n const renderAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n // Display the initial set of emojis.\n renderAtPosition(0, rowData);\n\n registerEventListeners(\n root,\n emojiContainer,\n renderAtPosition,\n 0,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n );\n};"],"file":"picker.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../src/emoji/picker.js"],"names":["ROW_RENDER_BUFFER_COUNT","RECENT_EMOJIS_STORAGE_KEY","ROW_HEIGHT_RAW","EMOJIS_PER_ROW","ROW_TYPE","EMOJI","HEADER","SELECTORS","CATEGORY_SELECTOR","EMOJIS_CONTAINER","EMOJI_PREVIEW","EMOJI_SHORT_NAME","ROW_CONTAINER","SEARCH_INPUT","SEARCH_RESULTS_CONTAINER","createRowDataForCategory","categoryName","categoryDisplayName","emojis","totalRowCount","rowData","push","index","length","type","data","name","displayName","i","rowEmojis","slice","addIndexesToRowData","map","getCategoryScrollPositionsFromRowData","reduce","carry","row","createHeaderRow","rowIndex","context","text","html","temp","document","createElement","innerHTML","firstChild","createEmojiRow","emojiData","charCodes","unified","split","code","emojiText","String","fromCodePoint","apply","shortnames","join","spacer","spacers","Array","fill","isEmojiElement","element","getAttribute","findCategorySelectorFromElement","parentElement","getCategorySelectorByCategoryName","root","querySelector","setCategorySelectorActive","allCategorySelectors","querySelectorAll","selector","classList","remove","add","getCategoryByScrollPosition","position","categoryScrollPositions","positions","categoryPosition","sort","a","b","candidate","previousPosition","currentPosition","nextPosition","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","saveRecentEmoji","recentEmojis","set","stringify","addRecentEmoji","recentEmojiRowCount","newEmoji","newRecentEmojis","filter","emoji","newRecentEmojiRowData","concat","getRowsToRender","scrollPosition","visibleRowCount","minVisibleRow","Math","floor","start","rows","createRowElement","style","left","right","top","doRowsMatch","renderRows","rowContainer","currentRows","nextRows","toAdd","nextRow","some","currentRow","toKeep","toRemove","toRemoveElements","Promise","all","forEach","nextRowIndex","nextRowData","nextRowNode","insertBefore","splice","appendChild","removeChild","generateRenderRowsAtPositionFunction","rowCount","isRendering","renderNextRows","nextRowsToRender","rowLimit","height","showSearchResults","emojiContainer","searchResultsContainer","clearSearch","searchInput","value","getHandleMouseEnter","emojiPreview","emojiShortName","e","target","textContent","getHandleMouseLeave","getHandleClick","selectCallback","renderAtPosition","newRowData","newCategoryScrollPositions","replace","currentScrollTop","scrollTop","isRecentEmojiRowVisible","categorySelector","selectedCategory","getHandleScroll","currentVisibleRowScrollPosition","initialCategoryScrollPositions","currentCategoryElement","previousCategoryPosition","nextCategoryPosition","newScrollPosition","upperScrollBound","lowerScrollBound","updateActiveCategory","requestAnimationFrame","getHandleSearch","renderSearchResultsAtPosition","searchTerm","toLowerCase","matchingEmojis","Object","keys","EmojiData","byShortName","shortName","includes","searchResultsString","registerEventListeners","clickHandler","scrollHandler","searchHandler","addEventListener","allData","byCategory","category","title","categoryRowData"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Emoji picker.\n *\n * @module core/emoji/picker\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport LocalStorage from 'core/localstorage';\nimport * as EmojiData from 'core/emoji/data';\nimport {throttle, debounce} from 'core/utils';\nimport {get_string as getString} from 'core/str';\nimport {render as renderTemplate} from 'core/templates';\n\nconst VISIBLE_ROW_COUNT = 10;\nconst ROW_RENDER_BUFFER_COUNT = 5;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\nconst ROW_HEIGHT_RAW = 40;\nconst EMOJIS_PER_ROW = 7;\nconst MAX_RECENT_COUNT = EMOJIS_PER_ROW * 3;\nconst ROW_TYPE = {\n EMOJI: 0,\n HEADER: 1\n};\nconst SELECTORS = {\n CATEGORY_SELECTOR: '[data-action=\"show-category\"]',\n EMOJIS_CONTAINER: '[data-region=\"emojis-container\"]',\n EMOJI_PREVIEW: '[data-region=\"emoji-preview\"]',\n EMOJI_SHORT_NAME: '[data-region=\"emoji-short-name\"]',\n ROW_CONTAINER: '[data-region=\"row-container\"]',\n SEARCH_INPUT: '[data-region=\"search-input\"]',\n SEARCH_RESULTS_CONTAINER: '[data-region=\"search-results-container\"]'\n};\n\n/**\n * Create the row data for a category.\n *\n * @method\n * @param {String} categoryName The category name\n * @param {String} categoryDisplayName The category display name\n * @param {Array} emojis The emoji data\n * @param {Number} totalRowCount The total number of rows generated so far\n * @return {Array}\n */\nconst createRowDataForCategory = (categoryName, categoryDisplayName, emojis, totalRowCount) => {\n const rowData = [];\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.HEADER,\n data: {\n name: categoryName,\n displayName: categoryDisplayName\n }\n });\n\n for (let i = 0; i < emojis.length; i += EMOJIS_PER_ROW) {\n const rowEmojis = emojis.slice(i, i + EMOJIS_PER_ROW);\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.EMOJI,\n data: rowEmojis\n });\n }\n\n return rowData;\n};\n\n/**\n * Add each row's index to it's value in the row data.\n *\n * @method\n * @param {Array} rowData List of emoji row data\n * @return {Array}\n */\nconst addIndexesToRowData = (rowData) => {\n return rowData.map((data, index) => {\n return {...data, index};\n });\n};\n\n/**\n * Calculate the scroll position for the beginning of each category from\n * the row data.\n *\n * @method\n * @param {Array} rowData List of emoji row data\n * @return {Object}\n */\nconst getCategoryScrollPositionsFromRowData = (rowData) => {\n return rowData.reduce((carry, row, index) => {\n if (row.type === ROW_TYPE.HEADER) {\n carry[row.data.name] = index * ROW_HEIGHT_RAW;\n }\n return carry;\n }, {});\n};\n\n/**\n * Create a header row element for the category name.\n *\n * @method\n * @param {Number} rowIndex Index of the row in the row data\n * @param {String} name The category display name\n * @return {Element}\n */\nconst createHeaderRow = async(rowIndex, name) => {\n const context = {\n index: rowIndex,\n text: name\n };\n const html = await renderTemplate('core/emoji/header_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Create an emoji row element.\n *\n * @method\n * @param {Number} rowIndex Index of the row in the row data\n * @param {Array} emojis The list of emoji data for the row\n * @return {Element}\n */\nconst createEmojiRow = async(rowIndex, emojis) => {\n const context = {\n index: rowIndex,\n emojis: emojis.map(emojiData => {\n const charCodes = emojiData.unified.split('-').map(code => `0x${code}`);\n const emojiText = String.fromCodePoint.apply(null, charCodes);\n return {\n shortnames: `:${emojiData.shortnames.join(': :')}:`,\n unified: emojiData.unified,\n text: emojiText,\n spacer: false\n };\n }),\n spacers: Array(EMOJIS_PER_ROW - emojis.length).fill(true)\n };\n const html = await renderTemplate('core/emoji/emoji_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Check if the element is an emoji element.\n *\n * @method\n * @param {Element} element Element to check\n * @return {Bool}\n */\nconst isEmojiElement = element => element.getAttribute('data-short-names') !== null;\n\n/**\n * Search from an element and up through it's ancestors to fine the category\n * selector element and return it.\n *\n * @method\n * @param {Element} element Element to begin searching from\n * @return {Element|null}\n */\nconst findCategorySelectorFromElement = element => {\n if (!element) {\n return null;\n }\n\n if (element.getAttribute('data-action') === 'show-category') {\n return element;\n } else {\n return findCategorySelectorFromElement(element.parentElement);\n }\n};\n\nconst getCategorySelectorByCategoryName = (root, name) => {\n return root.querySelector(`[data-category=\"${name}\"]`);\n};\n\n/**\n * Sets the given category selector element as active.\n *\n * @method\n * @param {Element} root The root picker element\n * @param {Element} element The category selector element to make active\n */\nconst setCategorySelectorActive = (root, element) => {\n const allCategorySelectors = root.querySelectorAll(SELECTORS.CATEGORY_SELECTOR);\n\n for (let i = 0; i < allCategorySelectors.length; i++) {\n const selector = allCategorySelectors[i];\n selector.classList.remove('selected');\n }\n\n element.classList.add('selected');\n};\n\n/**\n * Get the category selector element and the scroll positions for the previous and\n * next categories for the given scroll position.\n *\n * @method\n * @param {Element} root The picker root element\n * @param {Number} position The position to get the category for\n * @param {Object} categoryScrollPositions Set of scroll positions for all categories\n * @return {Array}\n */\nconst getCategoryByScrollPosition = (root, position, categoryScrollPositions) => {\n let positions = [];\n\n if (position < 0) {\n position = 0;\n }\n\n // Get all of the category positions.\n for (const categoryName in categoryScrollPositions) {\n const categoryPosition = categoryScrollPositions[categoryName];\n positions.push([categoryPosition, categoryName]);\n }\n\n // Sort the positions in ascending order.\n positions.sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // Get the current category name as well as the previous and next category\n // positions from the sorted list of positions.\n const {categoryName, previousPosition, nextPosition} = positions.reduce(\n (carry, candidate) => {\n const [categoryPosition, categoryName] = candidate;\n\n if (categoryPosition <= position) {\n carry.categoryName = categoryName;\n carry.previousPosition = carry.currentPosition;\n carry.currentPosition = position;\n } else if (carry.nextPosition === null) {\n carry.nextPosition = categoryPosition;\n }\n\n return carry;\n },\n {\n categoryName: null,\n currentPosition: null,\n previousPosition: null,\n nextPosition: null\n }\n );\n\n return [getCategorySelectorByCategoryName(root, categoryName), previousPosition, nextPosition];\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @method\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Save the list of recent emojis in local storage.\n *\n * @method\n * @param {Array} recentEmojis List of emoji data to save\n */\nconst saveRecentEmoji = (recentEmojis) => {\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(recentEmojis));\n};\n\n/**\n * Add an emoji data to the set of recent emojis. This function will update the row\n * data to ensure that the recent emoji rows are correct and all of the rows are\n * re-indexed.\n *\n * The new set of recent emojis are saved in local storage and the full set of updated\n * row data and new emoji row count are returned.\n *\n * @method\n * @param {Array} rowData The emoji rows data\n * @param {Number} recentEmojiRowCount Count of the recent emoji rows\n * @param {Object} newEmoji The emoji data for the emoji to add to the recent emoji list\n * @return {Array}\n */\nconst addRecentEmoji = (rowData, recentEmojiRowCount, newEmoji) => {\n // The first set of rows is always the recent emojis.\n const categoryName = rowData[0].data.name;\n const categoryDisplayName = rowData[0].data.displayName;\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n const newRecentEmojiRowData = createRowDataForCategory(categoryName, categoryDisplayName, newRecentEmojis);\n\n // Save the new list in local storage.\n saveRecentEmoji(newRecentEmojis);\n\n return [\n // Return the new rowData and re-index it to make sure it's all correct.\n addIndexesToRowData(newRecentEmojiRowData.concat(rowData.slice(recentEmojiRowCount))),\n newRecentEmojiRowData.length\n ];\n};\n\n/**\n * Calculate which rows should be visible based on the given scroll position. Adds a\n * buffer to amount to either side of the total number of requested rows so that\n * scrolling the emoji rows container is smooth.\n *\n * @method\n * @param {Number} scrollPosition Scroll position within the emoji container\n * @param {Number} visibleRowCount How many rows should be visible\n * @param {Array} rowData The emoji rows data\n * @return {Array}\n */\nconst getRowsToRender = (scrollPosition, visibleRowCount, rowData) => {\n const minVisibleRow = scrollPosition > ROW_HEIGHT_RAW ? Math.floor(scrollPosition / ROW_HEIGHT_RAW) : 0;\n const start = minVisibleRow >= ROW_RENDER_BUFFER_COUNT ? minVisibleRow - ROW_RENDER_BUFFER_COUNT : minVisibleRow;\n const end = minVisibleRow + visibleRowCount + ROW_RENDER_BUFFER_COUNT;\n const rows = rowData.slice(start, end);\n return rows;\n};\n\n/**\n * Create a row element from the row data.\n *\n * @method\n * @param {Object} rowData The emoji row data\n * @return {Element}\n */\nconst createRowElement = async(rowData) => {\n let row = null;\n if (rowData.type === ROW_TYPE.HEADER) {\n row = await createHeaderRow(rowData.index, rowData.data.displayName);\n } else {\n row = await createEmojiRow(rowData.index, rowData.data);\n }\n\n row.style.position = 'absolute';\n row.style.left = 0;\n row.style.right = 0;\n row.style.top = `${rowData.index * ROW_HEIGHT_RAW}px`;\n\n return row;\n};\n\n/**\n * Check if the given rows match.\n *\n * @method\n * @param {Object} a The first row\n * @param {Object} b The second row\n * @return {Bool}\n */\nconst doRowsMatch = (a, b) => {\n if (a.index !== b.index) {\n return false;\n }\n\n if (a.type !== b.type) {\n return false;\n }\n\n if (typeof a.data != typeof b.data) {\n return false;\n }\n\n if (a.type === ROW_TYPE.HEADER) {\n return a.data.name === b.data.name;\n } else {\n if (a.data.length !== b.data.length) {\n return false;\n }\n\n for (let i = 0; i < a.data.length; i++) {\n if (a.data[i].unified != b.data[i].unified) {\n return false;\n }\n }\n }\n\n return true;\n};\n\n/**\n * Update the visible rows. Deletes any row elements that should no longer\n * be visible and creates the newly visible row elements. Any rows that haven't\n * changed visibility will be left untouched.\n *\n * @method\n * @param {Element} rowContainer The container element for the emoji rows\n * @param {Array} currentRows List of row data that matches the currently visible rows\n * @param {Array} nextRows List of row data containing the new list of rows to be made visible\n */\nconst renderRows = async(rowContainer, currentRows, nextRows) => {\n // We need to add any rows that are in nextRows but not in currentRows.\n const toAdd = nextRows.filter(nextRow => !currentRows.some(currentRow => doRowsMatch(currentRow, nextRow)));\n // Remember which rows will still be visible so that we can insert our element in the correct place in the DOM.\n let toKeep = currentRows.filter(currentRow => nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n // We need to remove any rows that are in currentRows but not in nextRows.\n const toRemove = currentRows.filter(currentRow => !nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n const toRemoveElements = toRemove.map(rowData => rowContainer.querySelectorAll(`[data-row=\"${rowData.index}\"]`));\n\n // Render all of the templates first.\n const rows = await Promise.all(toAdd.map(rowData => createRowElement(rowData)));\n\n rows.forEach((row, index) => {\n const rowData = toAdd[index];\n let nextRowIndex = null;\n\n for (let i = 0; i < toKeep.length; i++) {\n const candidate = toKeep[i];\n if (candidate.index > rowData.index) {\n nextRowIndex = i;\n break;\n }\n }\n\n // Make sure the elements get added to the DOM in the correct order (ascending by row data index)\n // so that they appear naturally in the tab order.\n if (nextRowIndex !== null) {\n const nextRowData = toKeep[nextRowIndex];\n const nextRowNode = rowContainer.querySelector(`[data-row=\"${nextRowData.index}\"]`);\n\n rowContainer.insertBefore(row, nextRowNode);\n toKeep.splice(nextRowIndex, 0, toKeep);\n } else {\n toKeep.push(rowData);\n rowContainer.appendChild(row);\n }\n });\n\n toRemoveElements.forEach(rows => {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n rowContainer.removeChild(row);\n }\n });\n};\n\n/**\n * Build a function to render the visible emoji rows for a given scroll\n * position.\n *\n * @method\n * @param {Element} rowContainer The container element for the emoji rows\n * @return {Function}\n */\nconst generateRenderRowsAtPositionFunction = (rowContainer) => {\n let currentRows = [];\n let nextRows = [];\n let rowCount = 0;\n let isRendering = false;\n const renderNextRows = async() => {\n if (!nextRows.length) {\n return;\n }\n\n if (isRendering) {\n return;\n }\n\n isRendering = true;\n const nextRowsToRender = nextRows.slice();\n nextRows = [];\n\n await renderRows(rowContainer, currentRows, nextRowsToRender);\n currentRows = nextRowsToRender;\n isRendering = false;\n renderNextRows();\n };\n\n return (scrollPosition, rowData, rowLimit = VISIBLE_ROW_COUNT) => {\n nextRows = getRowsToRender(scrollPosition, rowLimit, rowData);\n renderNextRows();\n\n if (rowCount !== rowData.length) {\n // Adjust the height of the container to match the number of rows.\n rowContainer.style.height = `${rowData.length * ROW_HEIGHT_RAW}px`;\n }\n\n rowCount = rowData.length;\n };\n};\n\n/**\n * Show the search results container and hide the emoji container.\n *\n * @method\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n */\nconst showSearchResults = (emojiContainer, searchResultsContainer) => {\n searchResultsContainer.classList.remove('hidden');\n emojiContainer.classList.add('hidden');\n};\n\n/**\n * Hide the search result container and show the emojis container.\n *\n * @method\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n * @param {Element} searchInput The search input\n */\nconst clearSearch = (emojiContainer, searchResultsContainer, searchInput) => {\n searchResultsContainer.classList.add('hidden');\n emojiContainer.classList.remove('hidden');\n searchInput.value = '';\n};\n\n/**\n * Build function to handle mouse hovering an emoji. Shows the preview.\n *\n * @method\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseEnter = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = target.getAttribute('data-short-names');\n emojiPreview.textContent = target.textContent;\n }\n };\n};\n\n/**\n * Build function to handle mouse leaving an emoji. Removes the preview.\n *\n * @method\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseLeave = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = '';\n emojiPreview.textContent = '';\n }\n };\n};\n\n/**\n * Build the function to handle a user clicking something in the picker.\n *\n * The function currently handles clicking on the category selector or selecting\n * a specific emoji.\n *\n * @method\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n * @param {Element} emojiContainer Container element for the visible of emojis\n * @param {Element} searchResultsContainer Contaienr element for the search results\n * @param {Element} searchInput Search input element\n * @param {Function} selectCallback Callback function to execute when a user selects an emoji\n * @param {Function} renderAtPosition Render function to display current visible emojis\n * @return {Function}\n */\nconst getHandleClick = (\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n) => {\n return (e, rowData, categoryScrollPositions) => {\n const target = e.target;\n let newRowData = rowData;\n let newCategoryScrollPositions = categoryScrollPositions;\n\n // Hide the search results if they are visible.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n\n if (isEmojiElement(target)) {\n // Emoji selected.\n const unified = target.getAttribute('data-unified');\n const shortnames = target.getAttribute('data-short-names').replace(/:/g, '').split(' ');\n // Build the emoji data from the selected element.\n const emojiData = {unified, shortnames};\n const currentScrollTop = emojiContainer.scrollTop;\n const isRecentEmojiRowVisible = emojiContainer.querySelector(`[data-row=\"${recentEmojiRowCount - 1}\"]`) !== null;\n // Save the selected emoji in the recent emojis list.\n [newRowData, recentEmojiRowCount] = addRecentEmoji(rowData, recentEmojiRowCount, emojiData);\n // Re-index the category scroll positions because the additional recent emoji may have\n // changed their positions.\n newCategoryScrollPositions = getCategoryScrollPositionsFromRowData(newRowData);\n\n if (isRecentEmojiRowVisible) {\n // If the list of recent emojis is currently visible then we need to re-render the emojis\n // to update the display and show the newly selected recent emoji.\n renderAtPosition(currentScrollTop, newRowData);\n }\n\n // Call the client's callback function with the selected emoji.\n selectCallback(target.textContent);\n // Return the newly calculated row data and scroll positions.\n return [newRowData, newCategoryScrollPositions];\n }\n\n const categorySelector = findCategorySelectorFromElement(target);\n if (categorySelector) {\n // Category selector.\n const selectedCategory = categorySelector.getAttribute('data-category');\n const position = categoryScrollPositions[selectedCategory];\n // Scroll the container to the selected category. This will trigger the\n // on scroll handler to re-render the visibile emojis.\n emojiContainer.scrollTop = position;\n }\n\n return [newRowData, newCategoryScrollPositions];\n };\n};\n\n/**\n * Build the function that handles scrolling of the emoji container to display the\n * correct emojis.\n *\n * We render the emoji rows as they are needed rather than all up front so that we\n * can avoid adding tends of thousands of elements to the DOM unnecessarily which\n * would bog down performance.\n *\n * @method\n * @param {Element} root The picker root element\n * @param {Number} currentVisibleRowScrollPosition The current scroll position of the container\n * @param {Element} emojiContainer The emojis container element\n * @param {Object} initialCategoryScrollPositions Scroll positions for each category\n * @param {Function} renderAtPosition Function to render the appropriate emojis for a scroll position\n * @return {Function}\n */\nconst getHandleScroll = (\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n initialCategoryScrollPositions,\n renderAtPosition\n) => {\n // Scope some local variables to track the scroll positions of the categories. We need to\n // recalculate these because adding recent emojis can change those positions by adding\n // additional rows.\n let [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, emojiContainer.scrollTop, initialCategoryScrollPositions);\n\n return (categoryScrollPositions, rowData) => {\n const newScrollPosition = emojiContainer.scrollTop;\n const upperScrollBound = currentVisibleRowScrollPosition + ROW_HEIGHT_RAW;\n const lowerScrollBound = currentVisibleRowScrollPosition - ROW_HEIGHT_RAW;\n // We only need to update the active category indicator if the user has scrolled into a\n // new category scroll position.\n const updateActiveCategory = (newScrollPosition >= nextCategoryPosition) ||\n (newScrollPosition < previousCategoryPosition);\n // We only need to render new emoji rows if the user has scrolled far enough that a new row\n // would be visible (i.e. they've scrolled up or down more than 40px - the height of a row).\n const updateRenderRows = (newScrollPosition < lowerScrollBound) || (newScrollPosition > upperScrollBound);\n\n if (updateActiveCategory) {\n // New category is visible so update the active category selector and re-index the\n // positions incase anything has changed.\n [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, newScrollPosition, categoryScrollPositions);\n setCategorySelectorActive(root, currentCategoryElement);\n }\n\n if (updateRenderRows) {\n // A new row should be visible so re-render the visible emojis at this new position.\n // We request an animation frame from the browser so that we're not blocking anything.\n // The animation only needs to occur as soon as the browser is ready not immediately.\n requestAnimationFrame(() => {\n renderAtPosition(newScrollPosition, rowData);\n // Remember the updated position.\n currentVisibleRowScrollPosition = newScrollPosition;\n });\n }\n };\n};\n\n/**\n * Build the function that handles search input from the user.\n *\n * @method\n * @param {Element} searchInput The search input element\n * @param {Element} searchResultsContainer Container element to display the search results\n * @param {Element} emojiContainer Container element for the emoji rows\n * @return {Function}\n */\nconst getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) => {\n const rowContainer = searchResultsContainer.querySelector(SELECTORS.ROW_CONTAINER);\n // Build a render function for the search results.\n const renderSearchResultsAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n searchResultsContainer.appendChild(rowContainer);\n\n return async() => {\n const searchTerm = searchInput.value.toLowerCase();\n\n if (searchTerm) {\n // Display the search results container and hide the emojis container.\n showSearchResults(emojiContainer, searchResultsContainer);\n\n // Find which emojis match the user's search input.\n const matchingEmojis = Object.keys(EmojiData.byShortName).reduce((carry, shortName) => {\n if (shortName.includes(searchTerm)) {\n carry.push({\n shortnames: [shortName],\n unified: EmojiData.byShortName[shortName]\n });\n }\n return carry;\n }, []);\n\n const searchResultsString = await getString('searchresults', 'core');\n const rowData = createRowDataForCategory(searchResultsString, searchResultsString, matchingEmojis, 0);\n // Show the emoji rows for the search results.\n renderSearchResultsAtPosition(0, rowData, rowData.length);\n } else {\n // Hide the search container and show the emojis container.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n }\n };\n};\n\n/**\n * Register the emoji picker event listeners.\n *\n * @method\n * @param {Element} root The picker root element\n * @param {Element} emojiContainer Root element containing the list of visible emojis\n * @param {Function} renderAtPosition Function to render the visible emojis at a given scroll position\n * @param {Number} currentVisibleRowScrollPosition What is the current scroll position\n * @param {Function} selectCallback Function to execute when the user picks an emoji\n * @param {Object} categoryScrollPositions Scroll positions for where each of the emoji categories begin\n * @param {Array} rowData Data representing each of the display rows for hte emoji container\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n */\nconst registerEventListeners = (\n root,\n emojiContainer,\n renderAtPosition,\n currentVisibleRowScrollPosition,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n) => {\n const searchInput = root.querySelector(SELECTORS.SEARCH_INPUT);\n const searchResultsContainer = root.querySelector(SELECTORS.SEARCH_RESULTS_CONTAINER);\n const emojiPreview = root.querySelector(SELECTORS.EMOJI_PREVIEW);\n const emojiShortName = root.querySelector(SELECTORS.EMOJI_SHORT_NAME);\n // Build the click handler function.\n const clickHandler = getHandleClick(\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n );\n // Build the scroll handler function.\n const scrollHandler = getHandleScroll(\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n categoryScrollPositions,\n renderAtPosition\n );\n const searchHandler = getHandleSearch(searchInput, searchResultsContainer, emojiContainer);\n\n // Mouse enter/leave events to show the emoji preview on hover or focus.\n root.addEventListener('focus', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('blur', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseenter', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseleave', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n // User selects an emoji or clicks on one of the emoji category selectors.\n root.addEventListener('click', e => {\n // Update the row data and category scroll positions because they may have changes if the\n // user selects an emoji which updates the recent emojis list.\n [rowData, categoryScrollPositions] = clickHandler(e, rowData, categoryScrollPositions);\n });\n // Throttle the scroll event to only execute once every 50 milliseconds to prevent performance issues\n // in the browser when re-rendering the picker emojis. The scroll event fires a lot otherwise.\n emojiContainer.addEventListener('scroll', throttle(() => scrollHandler(categoryScrollPositions, rowData), 50));\n // Debounce the search input so that it only executes 200 milliseconds after the user has finished typing.\n searchInput.addEventListener('input', debounce(searchHandler, 200));\n};\n\n/**\n * Initialise the emoji picker.\n *\n * @method\n * @param {Element} root The root element for the picker\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, selectCallback) => {\n const emojiContainer = root.querySelector(SELECTORS.EMOJIS_CONTAINER);\n const rowContainer = emojiContainer.querySelector(SELECTORS.ROW_CONTAINER);\n const recentEmojis = getRecentEmojis();\n // Add the recent emojis category to the list of standard categories.\n const allData = [{\n name: 'Recent',\n emojis: recentEmojis\n }, ...EmojiData.byCategory];\n let rowData = [];\n let recentEmojiRowCount = 0;\n\n /**\n * Split categories data into rows which represent how they will be displayed in the\n * picker. Each category will add a row containing the display name for the category\n * and a row for every 9 emojis in the category. The row data will be used to calculate\n * which emojis should be visible in the picker at any given time.\n *\n * E.g.\n * input = [\n * {name: 'example1', emojis: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n * {name: 'example2', emojis: [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]},\n * ]\n * output = [\n * {type: 'categoryName': data: 'Example 1'},\n * {type: 'emojiRow': data: [1, 2, 3, 4, 5, 6, 7, 8, 9]},\n * {type: 'emojiRow': data: [10, 11, 12]},\n * {type: 'categoryName': data: 'Example 2'},\n * {type: 'emojiRow': data: [13, 14, 15, 16, 17, 18, 19, 20, 21]},\n * {type: 'emojiRow': data: [22, 23]},\n * ]\n */\n allData.forEach(category => {\n const categorySelector = getCategorySelectorByCategoryName(root, category.name);\n // Get the display name from the category selector button so that we don't need to\n // send an ajax request for the string.\n const categoryDisplayName = categorySelector.title;\n const categoryRowData = createRowDataForCategory(category.name, categoryDisplayName, category.emojis, rowData.length);\n\n if (category.name === 'Recent') {\n // Remember how many recent emoji rows there are because it needs to be used to\n // re-index the row data later when we're adding more recent emojis.\n recentEmojiRowCount = categoryRowData.length;\n }\n\n rowData = rowData.concat(categoryRowData);\n });\n\n // Index the row data so that we can calculate which rows should be visible.\n rowData = addIndexesToRowData(rowData);\n // Calculate the scroll positions for each of the categories within the emoji container.\n // These are used to know where to jump to when the user selects a specific category.\n const categoryScrollPositions = getCategoryScrollPositionsFromRowData(rowData);\n const renderAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n // Display the initial set of emojis.\n renderAtPosition(0, rowData);\n\n registerEventListeners(\n root,\n emojiContainer,\n renderAtPosition,\n 0,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n );\n};\n"],"file":"picker.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/event_dispatcher.min.js.map b/lib/amd/build/event_dispatcher.min.js.map
index 72137d748a3..0a84c94a731 100644
--- a/lib/amd/build/event_dispatcher.min.js.map
+++ b/lib/amd/build/event_dispatcher.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/event_dispatcher.js"],"names":["dispatchEvent","eventName","detail","container","document","bubbles","cancelable","composed","customEvent","CustomEvent"],"mappings":"6JAyD6B,QAAhBA,CAAAA,aAAgB,CACzBC,CADyB,CASxB,IAPDC,CAAAA,CAOC,wDAPQ,EAOR,CANDC,CAMC,wDANWC,QAMX,0DADG,EACH,KAJGC,OAIH,CAJGA,CAIH,qBAHGC,UAGH,CAHGA,CAGH,qBAFGC,QAEH,CAFGA,CAEH,iBACKC,CAAW,CAAG,GAAIC,CAAAA,WAAJ,CAChBR,CADgB,CAEhB,CACII,OAAO,CAAPA,CADJ,CAEIC,UAAU,CAAVA,CAFJ,CAGIC,QAAQ,CAARA,CAHJ,CAIIL,MAAM,CAANA,CAJJ,CAFgB,CADnB,CAWDC,CAAS,CAACH,aAAV,CAAwBQ,CAAxB,EAEA,MAAOA,CAAAA,CACV,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/ //\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Event dispatcher used to dispatch Native JS CustomEvent objects.\n *\n * @module core/event_dispatcher\n * @copyright 2021 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.0\n */\n\n/**\n * Dispatch an event as a CustomEvent on the specified container.\n * By default events are bubbled, and cancelable.\n *\n * The eventName should typically by sourced using a constant, for example:\n *\n * // mod/example/amd/src/events.js\n *\n * import {dispatchEvent} from 'core/event_dispatcher';\n *\n * export const eventTypes = {\n * exampleDataDisplayed: 'mod_example/exampleDataDisplayed',\n * };\n *\n * export const notifyExampleDisplayed = someArgument => dispatchEvent(eventTypes.exampleDataDisplayed, {\n * someArgument,\n * }, document, {\n * cancelable: false,\n * });\n *\n * Note: This function uses native events. Any additional details are passed to the function in event.detail.\n *\n * This function mimics the behaviour of EventTarget.dispatchEvent but bubbles by default.\n *\n * @method dispatchEvent\n * @param {String} eventName The name of the event\n * @param {Object} detail Any additional details to pass into the eveent\n * @param {HTMLElement} container The point at which to dispatch the event\n * @param {Object} options\n * @param {Boolean} options.bubbles Whether to bubble up the DOM\n * @param {Boolean} options.cancelable Whether preventDefault() can be called\n * @param {Boolean} options.composed Whether the event can bubble across the ShadowDOM bounadry\n * @returns {CustomEvent}\n */\nexport const dispatchEvent = (\n eventName,\n detail = {},\n container = document,\n {\n bubbles = true,\n cancelable = false,\n composed = false,\n } = {}\n) => {\n const customEvent = new CustomEvent(\n eventName,\n {\n bubbles,\n cancelable,\n composed,\n detail,\n }\n );\n\n container.dispatchEvent(customEvent);\n\n return customEvent;\n};\n"],"file":"event_dispatcher.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/event_dispatcher.js"],"names":["dispatchEvent","eventName","detail","container","document","bubbles","cancelable","composed","customEvent","CustomEvent"],"mappings":"6JA0D6B,QAAhBA,CAAAA,aAAgB,CACzBC,CADyB,CASxB,IAPDC,CAAAA,CAOC,wDAPQ,EAOR,CANDC,CAMC,wDANWC,QAMX,0DADG,EACH,KAJGC,OAIH,CAJGA,CAIH,qBAHGC,UAGH,CAHGA,CAGH,qBAFGC,QAEH,CAFGA,CAEH,iBACKC,CAAW,CAAG,GAAIC,CAAAA,WAAJ,CAChBR,CADgB,CAEhB,CACII,OAAO,CAAPA,CADJ,CAEIC,UAAU,CAAVA,CAFJ,CAGIC,QAAQ,CAARA,CAHJ,CAIIL,MAAM,CAANA,CAJJ,CAFgB,CADnB,CAWDC,CAAS,CAACH,aAAV,CAAwBQ,CAAxB,EAEA,MAAOA,CAAAA,CACV,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/ //\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * An Event dispatcher used to dispatch Native JS CustomEvent objects with custom default properties.\n *\n * @module core/event_dispatcher\n * @copyright 2021 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.0\n */\n\n/**\n * Dispatch an event as a CustomEvent on the specified container.\n * By default events are bubbled, and cancelable.\n *\n * The eventName should typically by sourced using a constant. See the supplied examples.\n *\n * Note: This function uses native events. Any additional details are passed to the function in event.detail.\n *\n * This function mimics the behaviour of EventTarget.dispatchEvent but bubbles by default.\n *\n * @method dispatchEvent\n * @param {String} eventName The name of the event\n * @param {Object} detail Any additional details to pass into the eveent\n * @param {HTMLElement} container The point at which to dispatch the event\n * @param {Object} options\n * @param {Boolean} options.bubbles Whether to bubble up the DOM\n * @param {Boolean} options.cancelable Whether preventDefault() can be called\n * @param {Boolean} options.composed Whether the event can bubble across the ShadowDOM bounadry\n * @returns {CustomEvent}\n *\n * @example Using a native CustomEvent to indicate that some example data was displayed. \n * // mod/example/amd/src/events.js\n *\n * import {dispatchEvent} from 'core/event_dispatcher';\n *\n * export const eventTypes = {\n * exampleDataDisplayed: 'mod_example/exampleDataDisplayed',\n * };\n *\n * export const notifyExampleDisplayed = someArgument => dispatchEvent(eventTypes.exampleDataDisplayed, {\n * someArgument,\n * }, document, {\n * cancelable: false,\n * });\n */\nexport const dispatchEvent = (\n eventName,\n detail = {},\n container = document,\n {\n bubbles = true,\n cancelable = false,\n composed = false,\n } = {}\n) => {\n const customEvent = new CustomEvent(\n eventName,\n {\n bubbles,\n cancelable,\n composed,\n detail,\n }\n );\n\n container.dispatchEvent(customEvent);\n\n return customEvent;\n};\n"],"file":"event_dispatcher.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/form-autocomplete.min.js.map b/lib/amd/build/form-autocomplete.min.js.map
index 634fd1fbb64..60630f6b80b 100644
--- a/lib/amd/build/form-autocomplete.min.js.map
+++ b/lib/amd/build/form-autocomplete.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/form-autocomplete.js"],"names":["define","$","log","str","templates","notification","LoadingIcon","Aria","KEYS","DOWN","ENTER","SPACE","ESCAPE","COMMA","UP","LEFT","RIGHT","uniqueId","Date","now","activateSelection","index","state","selectionElement","document","getElementById","selectionId","length","children","element","get","itemId","attr","Deferred","resolve","getActiveElementFromState","selectionRegion","activeId","activeElement","activeValue","find","updateActiveSelectionFromState","activeIndex","updateSelectionList","options","originalSelect","pendingKey","inputId","M","util","js_pending","items","newSelection","each","ele","prop","label","data","html","push","value","hasItemListChanged","js_complete","Promise","context","extend","render","then","js","replaceNodeContents","catch","exception","filter","item","indexOf","notifyChange","core_formchangechecker","set_form_changed","dispatchEvent","Event","deselectItem","selectedItemValue","remove","activateItem","inputElement","suggestionsElement","suggestionsId","globalIndex","scrollPos","offset","top","scrollTop","height","animate","promise","activateNextItem","current","activatePreviousSelection","selectionsElement","activateNextSelection","activatePreviousItem","closeSuggestions","hide","updateSuggestions","query","matchingElements","suggestions","option","innerHTML","searchquery","caseSensitive","toLocaleLowerCase","returnVal","replaceNode","unhide","show","node","text","tags","get_string","done","nosuggestionsstr","createItem","val","split","found","tagindex","tag","trim","multiple","append","createTextNode","selectCurrentItem","closeSuggestionsOnSelect","focus","updateAjax","e","ajaxHandler","pendingPromise","addPendingJSPromise","parentElement","selectId","parent","addIconToContainerRemoveOnCompletion","currentTarget","transport","selector","results","processedResults","processResults","existingValues","optionIndex","isArray","resultIndex","result","error","reject","addNavigation","on","pendingJsPromise","keyCode","showSuggestions","ajax","require","preventDefault","closest","window","setTimeout","focusElement","timeoutPromise","is","arrowElement","downArrowId","off","selectedItem","throttleTimeout","inProgress","handler","arguments","throttledHandler","clearTimeout","bind","last","key","enhance","placeholder","noSelectionString","templateOverrides","input","layout","selection","fail","debug","css","prepend","originalLabel","collectedjs","renderLayout","renderInput","renderDatalist","renderSelection","when","container","replaceWith","runTemplateJS"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Autocomplete wrapper for select2 library.\n *\n * @module core/form-autocomplete\n * @class autocomplete\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\n/* globals require: false */\ndefine(\n ['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon', 'core/aria'],\nfunction($, log, str, templates, notification, LoadingIcon, Aria) {\n\n // Private functions and variables.\n /** @var {Object} KEYS - List of keycode constants. */\n var KEYS = {\n DOWN: 40,\n ENTER: 13,\n SPACE: 32,\n ESCAPE: 27,\n COMMA: 44,\n UP: 38,\n LEFT: 37,\n RIGHT: 39\n };\n\n var uniqueId = Date.now();\n\n /**\n * Make an item in the selection list \"active\".\n *\n * @method activateSelection\n * @private\n * @param {Number} index The index in the current (visible) list of selection.\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activateSelection = function(index, state) {\n // Find the elements in the DOM.\n var selectionElement = $(document.getElementById(state.selectionId));\n\n // Count the visible items.\n var length = selectionElement.children('[aria-selected=true]').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(selectionElement.children('[aria-selected=true]').get(index));\n // Create an id we can assign to this element.\n var itemId = state.selectionId + '-' + index;\n\n // Deselect all the selections.\n selectionElement.children().attr('data-active-selection', null).attr('id', '');\n\n // Select only this suggestion and assign it the id.\n element.attr('data-active-selection', true).attr('id', itemId);\n\n // Tell the input field it has a new active descendant so the item is announced.\n selectionElement.attr('aria-activedescendant', itemId);\n selectionElement.attr('data-active-value', element.attr('data-value'));\n\n return $.Deferred().resolve();\n };\n\n /**\n * Get the actively selected element from the state object.\n *\n * @param {Object} state\n * @returns {jQuery}\n */\n var getActiveElementFromState = function(state) {\n var selectionRegion = $(document.getElementById(state.selectionId));\n var activeId = selectionRegion.attr('aria-activedescendant');\n\n if (activeId) {\n var activeElement = $(document.getElementById(activeId));\n if (activeElement.length) {\n // The active descendent still exists.\n return activeElement;\n }\n }\n\n var activeValue = selectionRegion.attr('data-active-value');\n return selectionRegion.find('[data-value=\"' + activeValue + '\"]');\n };\n\n /**\n * Update the active selection from the given state object.\n *\n * @param {Object} state\n */\n var updateActiveSelectionFromState = function(state) {\n var activeElement = getActiveElementFromState(state);\n var activeValue = activeElement.attr('data-value');\n\n var selectionRegion = $(document.getElementById(state.selectionId));\n if (activeValue) {\n // Find the index of the currently selected index.\n var activeIndex = selectionRegion.find('[aria-selected=true]').index(activeElement);\n\n if (activeIndex !== -1) {\n activateSelection(activeIndex, state);\n return;\n }\n }\n\n // Either the active index was not set, or it could not be found.\n // Select the first value instead.\n activateSelection(0, state);\n };\n\n /**\n * Update the element that shows the currently selected items.\n *\n * @method updateSelectionList\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSelectionList = function(options, state, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSelectionList-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Build up a valid context to re-render the template.\n var items = [];\n var newSelection = $(document.getElementById(state.selectionId));\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).prop('selected')) {\n var label;\n if ($(ele).data('html')) {\n label = $(ele).data('html');\n } else {\n label = $(ele).html();\n }\n if (label !== '') {\n items.push({label: label, value: $(ele).attr('value')});\n }\n }\n });\n\n if (!hasItemListChanged(state, items)) {\n M.util.js_complete(pendingKey);\n return Promise.resolve();\n }\n\n state.items = items;\n\n var context = $.extend(options, state);\n // Render the template.\n return templates.render(options.templates.items, context)\n .then(function(html, js) {\n // Add it to the page.\n templates.replaceNodeContents(newSelection, html, js);\n\n updateActiveSelectionFromState(state);\n\n return;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n };\n\n /**\n * Check whether the list of items stored in the state has changed.\n *\n * @param {Object} state\n * @param {Array} items\n */\n var hasItemListChanged = function(state, items) {\n if (state.items.length !== items.length) {\n return true;\n }\n\n // Check for any items in the state items which are not present in the new items list.\n return state.items.filter(item => items.indexOf(item) === -1).length > 0;\n };\n\n /**\n * Notify of a change in the selection.\n *\n * @param {jQuery} originalSelect The jQuery object matching the hidden select list.\n */\n var notifyChange = function(originalSelect) {\n if (typeof M.core_formchangechecker !== 'undefined') {\n M.core_formchangechecker.set_form_changed();\n }\n\n // Note, jQuery .change() was not working here. Better to\n // use plain JavaScript anyway.\n originalSelect[0].dispatchEvent(new Event('change'));\n };\n\n /**\n * Remove the given item from the list of selected things.\n *\n * @method deselectItem\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {Element} item The item to be deselected.\n * @param {Element} originalSelect The original select list.\n * @return {Promise}\n */\n var deselectItem = function(options, state, item, originalSelect) {\n var selectedItemValue = $(item).attr('data-value');\n\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', false);\n // We remove newly created custom tags from the suggestions list when they are deselected.\n if ($(ele).attr('data-iscustom')) {\n $(ele).remove();\n }\n }\n });\n // Rerender the selection list.\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n });\n };\n\n /**\n * Make an item in the suggestions \"active\" (about to be selected).\n *\n * @method activateItem\n * @private\n * @param {Number} index The index in the current (visible) list of suggestions.\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateItem = function(index, state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Count the visible items.\n var length = suggestionsElement.children(':not([aria-hidden])').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(suggestionsElement.children(':not([aria-hidden])').get(index));\n // Find the index of this item in the full list of suggestions (including hidden).\n var globalIndex = $(suggestionsElement.children('[role=option]')).index(element);\n // Create an id we can assign to this element.\n var itemId = state.suggestionsId + '-' + globalIndex;\n\n // Deselect all the suggestions.\n suggestionsElement.children().attr('aria-selected', false).attr('id', '');\n // Select only this suggestion and assign it the id.\n element.attr('aria-selected', true).attr('id', itemId);\n // Tell the input field it has a new active descendant so the item is announced.\n inputElement.attr('aria-activedescendant', itemId);\n\n // Scroll it into view.\n var scrollPos = element.offset().top\n - suggestionsElement.offset().top\n + suggestionsElement.scrollTop()\n - (suggestionsElement.height() / 2);\n return suggestionsElement.animate({\n scrollTop: scrollPos\n }, 100).promise();\n };\n\n /**\n * Find the index of the current active suggestion, and activate the next one.\n *\n * @method activateNextItem\n * @private\n * @param {Object} state State variable for this auto complete element.\n * @return {Promise}\n */\n var activateNextItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n // Find it's index.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n // Activate the next one.\n return activateItem(current + 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the previous one.\n *\n * @method activatePreviousSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activatePreviousSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection]');\n if (!element) {\n return activateSelection(0, state);\n }\n // Find it's index.\n var current = selectionsElement.children('[aria-selected=true]').index(element);\n // Activate the next one.\n return activateSelection(current - 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the next one.\n *\n * @method activateNextSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateNextSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection]');\n var current = 0;\n\n if (element) {\n // The element was found. Determine the index and move to the next one.\n current = selectionsElement.children('[aria-selected=true]').index(element);\n current = current + 1;\n } else {\n // No selected item found. Move to the first.\n current = 0;\n }\n\n return activateSelection(current, state);\n };\n\n /**\n * Find the index of the current active suggestion, and activate the previous one.\n *\n * @method activatePreviousItem\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activatePreviousItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n\n // Find it's index.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n\n // Activate the previous one.\n return activateItem(current - 1, state);\n };\n\n /**\n * Close the list of suggestions.\n *\n * @method closeSuggestions\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var closeSuggestions = function(state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n if (inputElement.attr('aria-expanded') === \"true\") {\n // Announce the list of suggestions was closed.\n inputElement.attr('aria-expanded', false);\n }\n // Read the current list of selections.\n inputElement.attr('aria-activedescendant', state.selectionId);\n\n // Hide the suggestions list (from screen readers too).\n Aria.hide(suggestionsElement.get());\n suggestionsElement.hide();\n\n return $.Deferred().resolve();\n };\n\n /**\n * Rebuild the list of suggestions based on the current values in the select list, and the query.\n *\n * @method updateSuggestions\n * @private\n * @param {Object} options The original options for this autocomplete.\n * @param {Object} state The state variables for this autocomplete.\n * @param {String} query The current text for the search string.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSuggestions = function(options, state, query, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSuggestions-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Used to track if we found any visible suggestions.\n var matchingElements = false;\n // Options is used by the context when rendering the suggestions from a template.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n if ($(option).prop('selected') !== true) {\n suggestions[suggestions.length] = {label: option.innerHTML, value: $(option).attr('value')};\n }\n });\n\n // Re-render the list of suggestions.\n var searchquery = state.caseSensitive ? query : query.toLocaleLowerCase();\n var context = $.extend({options: suggestions}, options, state);\n var returnVal = templates.render(\n 'core/form_autocomplete_suggestions',\n context\n )\n .then(function(html, js) {\n // We have the new template, insert it in the page.\n templates.replaceNode(suggestionsElement, html, js);\n\n // Get the element again.\n suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Show it if it is hidden.\n Aria.unhide(suggestionsElement.get());\n suggestionsElement.show();\n\n // For each option in the list, hide it if it doesn't match the query.\n suggestionsElement.children().each(function(index, node) {\n node = $(node);\n if ((options.caseSensitive && node.text().indexOf(searchquery) > -1) ||\n (!options.caseSensitive && node.text().toLocaleLowerCase().indexOf(searchquery) > -1)) {\n Aria.unhide(node.get());\n node.show();\n matchingElements = true;\n } else {\n node.hide();\n Aria.hide(node.get());\n }\n });\n // If we found any matches, show the list.\n inputElement.attr('aria-expanded', true);\n if (originalSelect.attr('data-notice')) {\n // Display a notice rather than actual suggestions.\n suggestionsElement.html(originalSelect.attr('data-notice'));\n } else if (matchingElements) {\n // We only activate the first item in the list if tags is false,\n // because otherwise \"Enter\" would select the first item, instead of\n // creating a new tag.\n if (!options.tags) {\n activateItem(0, state);\n }\n } else {\n // Nothing matches. Tell them that.\n str.get_string('nosuggestions', 'form').done(function(nosuggestionsstr) {\n suggestionsElement.html(nosuggestionsstr);\n });\n }\n\n return suggestionsElement;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n\n return returnVal;\n };\n\n /**\n * Create a new item for the list (a tag).\n *\n * @method createItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var createItem = function(options, state, originalSelect) {\n // Find the element in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n // Get the current text in the input field.\n var query = inputElement.val();\n var tags = query.split(',');\n var found = false;\n\n $.each(tags, function(tagindex, tag) {\n // If we can only select one at a time, deselect any current value.\n tag = tag.trim();\n if (tag !== '') {\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for an existing option in the select list that matches this new tag.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == tag) {\n found = true;\n $(ele).prop('selected', true);\n }\n });\n // Only create the item if it's new.\n if (!found) {\n var option = $('');\n option.append(document.createTextNode(tag));\n option.attr('value', tag);\n originalSelect.append(option);\n option.prop('selected', true);\n // We mark newly created custom options as we handle them differently if they are \"deselected\".\n option.attr('data-iscustom', true);\n }\n }\n });\n\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n })\n .then(function() {\n // Clear the input field.\n inputElement.val('');\n\n return;\n })\n .then(function() {\n // Close the suggestions list.\n return closeSuggestions(state);\n });\n };\n\n /**\n * Select the currently active item from the suggestions list.\n *\n * @method selectCurrentItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var selectCurrentItem = function(options, state, originalSelect) {\n // Find the elements in the page.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Here loop through suggestions and set val to join of all selected items.\n\n var selectedItemValue = suggestionsElement.children('[aria-selected=true]').attr('data-value');\n // The select will either be a single or multi select, so the following will either\n // select one or more items correctly.\n // Take care to use 'prop' and not 'attr' for selected properties.\n // If only one can be selected at a time, start by deselecting everything.\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', true);\n }\n });\n\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n })\n .then(function() {\n if (options.closeSuggestionsOnSelect) {\n // Clear the input element.\n inputElement.val('');\n // Close the list of suggestions.\n return closeSuggestions(state);\n } else {\n // Focus on the input element so the suggestions does not auto-close.\n inputElement.focus();\n // Remove the last selected item from the suggestions list.\n return updateSuggestions(options, state, inputElement.val(), originalSelect);\n }\n });\n };\n\n /**\n * Fetch a new list of options via ajax.\n *\n * @method updateAjax\n * @private\n * @param {Event} e The event that triggered this update.\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state The state variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @param {Object} ajaxHandler This is a module that does the ajax fetch and translates the results.\n * @return {Promise}\n */\n var updateAjax = function(e, options, state, originalSelect, ajaxHandler) {\n var pendingPromise = addPendingJSPromise('updateAjax');\n // We need to show the indicator outside of the hidden select list.\n // So we get the parent id of the hidden select list.\n var parentElement = $(document.getElementById(state.selectId)).parent();\n LoadingIcon.addIconToContainerRemoveOnCompletion(parentElement, pendingPromise);\n\n // Get the query to pass to the ajax function.\n var query = $(e.currentTarget).val();\n // Call the transport function to do the ajax (name taken from Select2).\n ajaxHandler.transport(options.selector, query, function(results) {\n // We got a result - pass it through the translator before using it.\n var processedResults = ajaxHandler.processResults(options.selector, results);\n var existingValues = [];\n\n // Now destroy all options that are not currently selected.\n if (!options.multiple) {\n originalSelect.children('option').remove();\n }\n originalSelect.children('option').each(function(optionIndex, option) {\n option = $(option);\n if (!option.prop('selected')) {\n option.remove();\n } else {\n existingValues.push(String(option.attr('value')));\n }\n });\n\n if (!options.multiple && originalSelect.children('option').length === 0) {\n // If this is a single select - and there are no current options\n // the first option added will be selected by the browser. This causes a bug!\n // We need to insert an empty option so that none of the real options are selected.\n var option = $(' ');\n originalSelect.append(option);\n }\n if ($.isArray(processedResults)) {\n // Add all the new ones returned from ajax.\n $.each(processedResults, function(resultIndex, result) {\n if (existingValues.indexOf(String(result.value)) === -1) {\n var option = $(' ');\n option.append(result.label);\n option.attr('value', result.value);\n originalSelect.append(option);\n }\n });\n originalSelect.attr('data-notice', '');\n } else {\n // The AJAX handler returned a string instead of the array.\n originalSelect.attr('data-notice', processedResults);\n }\n // Update the list of suggestions now from the new values in the select list.\n pendingPromise.resolve(updateSuggestions(options, state, '', originalSelect));\n }, function(error) {\n pendingPromise.reject(error);\n });\n\n return pendingPromise;\n };\n\n /**\n * Add all the event listeners required for keyboard nav, blur clicks etc.\n *\n * @method addNavigation\n * @private\n * @param {Object} options The options used to create this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n */\n var addNavigation = function(options, state, originalSelect) {\n // Start with the input element.\n var inputElement = $(document.getElementById(state.inputId));\n // Add keyboard nav with keydown.\n inputElement.on('keydown', function(e) {\n var pendingJsPromise = addPendingJSPromise('addNavigation-' + state.inputId + '-' + e.keyCode);\n\n switch (e.keyCode) {\n case KEYS.DOWN:\n // If the suggestion list is open, move to the next item.\n if (!options.showSuggestions) {\n // Do not consume this event.\n pendingJsPromise.resolve();\n return true;\n } else if (inputElement.attr('aria-expanded') === \"true\") {\n pendingJsPromise.resolve(activateNextItem(state));\n } else {\n // Handle ajax population of suggestions.\n if (!inputElement.val() && options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n pendingJsPromise.resolve(updateAjax(e, options, state, originalSelect, ajaxHandler));\n });\n } else {\n // Open the suggestions list.\n pendingJsPromise.resolve(updateSuggestions(options, state, inputElement.val(), originalSelect));\n }\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.UP:\n // Choose the previous active item.\n pendingJsPromise.resolve(activatePreviousItem(state));\n\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.ENTER:\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n if ((inputElement.attr('aria-expanded') === \"true\") &&\n (suggestionsElement.children('[aria-selected=true]').length > 0)) {\n // If the suggestion list has an active item, select it.\n pendingJsPromise.resolve(selectCurrentItem(options, state, originalSelect));\n } else if (options.tags) {\n // If tags are enabled, create a tag.\n pendingJsPromise.resolve(createItem(options, state, originalSelect));\n } else {\n pendingJsPromise.resolve();\n }\n\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.ESCAPE:\n if (inputElement.attr('aria-expanded') === \"true\") {\n // If the suggestion list is open, close it.\n pendingJsPromise.resolve(closeSuggestions(state));\n } else {\n pendingJsPromise.resolve();\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n }\n pendingJsPromise.resolve();\n return true;\n });\n // Support multi lingual COMMA keycode (44).\n inputElement.on('keypress', function(e) {\n\n if (e.keyCode === KEYS.COMMA) {\n if (options.tags) {\n // If we are allowing tags, comma should create a tag (or enter).\n addPendingJSPromise('keypress-' + e.keyCode)\n .resolve(createItem(options, state, originalSelect));\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n }\n return true;\n });\n // Support submitting the form without leaving the autocomplete element,\n // or submitting too quick before the blur handler action is completed.\n inputElement.closest('form').on('submit', function() {\n if (options.tags) {\n // If tags are enabled, create a tag.\n addPendingJSPromise('form-autocomplete-submit')\n .resolve(createItem(options, state, originalSelect));\n }\n\n return true;\n });\n inputElement.on('blur', function() {\n var pendingPromise = addPendingJSPromise('form-autocomplete-blur');\n window.setTimeout(function() {\n // Get the current element with focus.\n var focusElement = $(document.activeElement);\n var timeoutPromise = $.Deferred();\n\n // Only close the menu if the input hasn't regained focus and if the element still exists,\n // and regain focus if the scrollbar is clicked.\n // Due to the half a second delay, it is possible that the input element no longer exist\n // by the time this code is being executed.\n if (focusElement.is(document.getElementById(state.suggestionsId))) {\n inputElement.focus(); // Probably the scrollbar is clicked. Regain focus.\n } else if (!focusElement.is(inputElement) && $(document.getElementById(state.inputId)).length) {\n if (options.tags) {\n timeoutPromise.then(function() {\n return createItem(options, state, originalSelect);\n })\n .catch();\n }\n timeoutPromise.then(function() {\n return closeSuggestions(state);\n })\n .catch();\n }\n\n timeoutPromise.then(function() {\n return pendingPromise.resolve();\n })\n .catch();\n timeoutPromise.resolve();\n }, 500);\n });\n if (options.showSuggestions) {\n var arrowElement = $(document.getElementById(state.downArrowId));\n arrowElement.on('click', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-show-suggestions');\n\n // Prevent the close timer, or we will open, then close the suggestions.\n inputElement.focus();\n\n // Handle ajax population of suggestions.\n if (!inputElement.val() && options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n pendingPromise.resolve(updateAjax(e, options, state, originalSelect, ajaxHandler));\n });\n } else {\n // Else - open the suggestions list.\n pendingPromise.resolve(updateSuggestions(options, state, inputElement.val(), originalSelect));\n }\n });\n }\n\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Remove any click handler first.\n suggestionsElement.parent().prop(\"onclick\", null).off(\"click\");\n suggestionsElement.parent().on('click', `#${state.suggestionsId} [role=option]`, function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-parent');\n // Handle clicks on suggestions.\n var element = $(e.currentTarget).closest('[role=option]');\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the index of the clicked on suggestion.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n\n // Activate it.\n activateItem(current, state)\n .then(function() {\n // And select it.\n return selectCurrentItem(options, state, originalSelect);\n })\n .then(function() {\n return pendingPromise.resolve();\n })\n .catch();\n });\n var selectionElement = $(document.getElementById(state.selectionId));\n\n // Handle clicks on the selected items (will unselect an item).\n selectionElement.on('click', '[role=option]', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-clicks');\n\n // Remove it from the selection.\n pendingPromise.resolve(deselectItem(options, state, $(e.currentTarget), originalSelect));\n });\n\n // When listbox is focused, focus on the first option if there is no focused option.\n selectionElement.on('focus', function() {\n updateActiveSelectionFromState(state);\n });\n\n // Keyboard navigation for the selection list.\n selectionElement.on('keydown', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-keydown-' + e.keyCode);\n switch (e.keyCode) {\n case KEYS.RIGHT:\n case KEYS.DOWN:\n // We handled this event, so prevent it.\n e.preventDefault();\n\n // Choose the next selection item.\n pendingPromise.resolve(activateNextSelection(state));\n return;\n case KEYS.LEFT:\n case KEYS.UP:\n // We handled this event, so prevent it.\n e.preventDefault();\n\n // Choose the previous selection item.\n pendingPromise.resolve(activatePreviousSelection(state));\n return;\n case KEYS.SPACE:\n case KEYS.ENTER:\n // Get the item that is currently selected.\n var selectedItem = $(document.getElementById(state.selectionId)).children('[data-active-selection]');\n if (selectedItem) {\n e.preventDefault();\n\n // Unselect this item.\n pendingPromise.resolve(deselectItem(options, state, selectedItem, originalSelect));\n }\n return;\n }\n\n // Not handled. Resolve the promise.\n pendingPromise.resolve();\n });\n // Whenever the input field changes, update the suggestion list.\n if (options.showSuggestions) {\n // Store the value of the field as its last value, when the field gains focus.\n inputElement.on('focus', function(e) {\n var query = $(e.currentTarget).val();\n $(e.currentTarget).data('last-value', query);\n });\n\n // If this field uses ajax, set it up.\n if (options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n // Creating throttled handlers free of race conditions, and accurate.\n // This code keeps track of a throttleTimeout, which is periodically polled.\n // Once the throttled function is executed, the fact that it is running is noted.\n // If a subsequent request comes in whilst it is running, this request is re-applied.\n var throttleTimeout = null;\n var inProgress = false;\n var pendingKey = 'autocomplete-throttledhandler';\n var handler = function(e) {\n // Empty the current timeout.\n throttleTimeout = null;\n\n // Mark this request as in-progress.\n inProgress = true;\n\n // Process the request.\n updateAjax(e, options, state, originalSelect, ajaxHandler)\n .then(function() {\n // Check if the throttleTimeout is still empty.\n // There's a potential condition whereby the JS request takes long enough to complete that\n // another task has been queued.\n // In this case another task will be kicked off and we must wait for that before marking htis as\n // complete.\n if (null === throttleTimeout) {\n // Mark this task as complete.\n M.util.js_complete(pendingKey);\n }\n inProgress = false;\n\n return arguments[0];\n })\n .catch(notification.exception);\n };\n\n // For input events, we do not want to trigger many, many updates.\n var throttledHandler = function(e) {\n window.clearTimeout(throttleTimeout);\n if (inProgress) {\n // A request is currently ongoing.\n // Delay this request another 100ms.\n throttleTimeout = window.setTimeout(throttledHandler.bind(this, e), 100);\n return;\n }\n\n if (throttleTimeout === null) {\n // There is currently no existing timeout handler, and it has not been recently cleared, so\n // this is the start of a throttling check.\n M.util.js_pending(pendingKey);\n }\n\n // There is currently no existing timeout handler, and it has not been recently cleared, so this\n // is the start of a throttling check.\n // Queue a call to the handler.\n throttleTimeout = window.setTimeout(handler.bind(this, e), 300);\n };\n\n // Trigger an ajax update after the text field value changes.\n inputElement.on('input', function(e) {\n var query = $(e.currentTarget).val();\n var last = $(e.currentTarget).data('last-value');\n // IE11 fires many more input events than required - even when the value has not changed.\n if (last !== query) {\n throttledHandler(e);\n }\n $(e.currentTarget).data('last-value', query);\n });\n });\n } else {\n inputElement.on('input', function(e) {\n var query = $(e.currentTarget).val();\n var last = $(e.currentTarget).data('last-value');\n // IE11 fires many more input events than required - even when the value has not changed.\n // We need to only do this for real value changed events or the suggestions will be\n // unclickable on IE11 (because they will be rebuilt before the click event fires).\n // Note - because of this we cannot close the list when the query is empty or it will break\n // on IE11.\n if (last !== query) {\n updateSuggestions(options, state, query, originalSelect);\n }\n $(e.currentTarget).data('last-value', query);\n });\n }\n }\n };\n\n /**\n * Create and return an unresolved Promise for some pending JS.\n *\n * @param {String} key The unique identifier for this promise\n * @return {Promise}\n */\n var addPendingJSPromise = function(key) {\n var pendingKey = 'form-autocomplete:' + key;\n\n M.util.js_pending(pendingKey);\n\n var pendingPromise = $.Deferred();\n\n pendingPromise\n .then(function() {\n M.util.js_complete(pendingKey);\n\n return arguments[0];\n })\n .catch(notification.exception);\n\n return pendingPromise;\n };\n\n return /** @alias module:core/form-autocomplete */ {\n // Public variables and functions.\n /**\n * Turn a boring select box into an auto-complete beast.\n *\n * @method enhance\n * @param {string} selector The selector that identifies the select box.\n * @param {boolean} tags Whether to allow support for tags (can define new entries).\n * @param {string} ajax Name of an AMD module to handle ajax requests. If specified, the AMD\n * module must expose 2 functions \"transport\" and \"processResults\".\n * These are modeled on Select2 see: https://select2.github.io/options.html#ajax\n * @param {String} placeholder - The text to display before a selection is made.\n * @param {Boolean} caseSensitive - If search has to be made case sensitive.\n * @param {Boolean} showSuggestions - If suggestions should be shown\n * @param {String} noSelectionString - Text to display when there is no selection\n * @param {Boolean} closeSuggestionsOnSelect - Whether to close the suggestions immediately after making a selection.\n * @param {Object} templateOverrides A set of templates to use instead of the standard templates\n * @return {Promise}\n */\n enhance: function(selector, tags, ajax, placeholder, caseSensitive, showSuggestions, noSelectionString,\n closeSuggestionsOnSelect, templateOverrides) {\n // Set some default values.\n var options = {\n selector: selector,\n tags: false,\n ajax: false,\n placeholder: placeholder,\n caseSensitive: false,\n showSuggestions: true,\n noSelectionString: noSelectionString,\n templates: $.extend({\n input: 'core/form_autocomplete_input',\n items: 'core/form_autocomplete_selection_items',\n layout: 'core/form_autocomplete_layout',\n selection: 'core/form_autocomplete_selection',\n suggestions: 'core/form_autocomplete_suggestions',\n }, templateOverrides),\n };\n var pendingKey = 'autocomplete-setup-' + selector;\n M.util.js_pending(pendingKey);\n if (typeof tags !== \"undefined\") {\n options.tags = tags;\n }\n if (typeof ajax !== \"undefined\") {\n options.ajax = ajax;\n }\n if (typeof caseSensitive !== \"undefined\") {\n options.caseSensitive = caseSensitive;\n }\n if (typeof showSuggestions !== \"undefined\") {\n options.showSuggestions = showSuggestions;\n }\n if (typeof noSelectionString === \"undefined\") {\n str.get_string('noselection', 'form').done(function(result) {\n options.noSelectionString = result;\n }).fail(notification.exception);\n }\n\n // Look for the select element.\n var originalSelect = $(selector);\n if (!originalSelect) {\n log.debug('Selector not found: ' + selector);\n M.util.js_complete(pendingKey);\n return false;\n }\n\n Aria.hide(originalSelect.get());\n originalSelect.css('visibility', 'hidden');\n\n // Hide the original select.\n\n // Find or generate some ids.\n var state = {\n selectId: originalSelect.attr('id'),\n inputId: 'form_autocomplete_input-' + uniqueId,\n suggestionsId: 'form_autocomplete_suggestions-' + uniqueId,\n selectionId: 'form_autocomplete_selection-' + uniqueId,\n downArrowId: 'form_autocomplete_downarrow-' + uniqueId,\n items: [],\n };\n\n // Increment the unique counter so we don't get duplicates ever.\n uniqueId++;\n\n options.multiple = originalSelect.attr('multiple');\n if (!options.multiple) {\n // If this is a single select then there is no way to de-select the current value -\n // unless we add a bogus blank option to be selected when nothing else is.\n // This matches similar code in updateAjax above.\n originalSelect.prepend(' ');\n }\n\n if (typeof closeSuggestionsOnSelect !== \"undefined\") {\n options.closeSuggestionsOnSelect = closeSuggestionsOnSelect;\n } else {\n // If not specified, this will close suggestions by default for single-select elements only.\n options.closeSuggestionsOnSelect = !options.multiple;\n }\n\n var originalLabel = $('[for=' + state.selectId + ']');\n // Create the new markup and insert it after the select.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n suggestions[index] = {label: option.innerHTML, value: $(option).attr('value')};\n });\n\n // Render all the parts of our UI.\n var context = $.extend({}, options, state);\n context.options = suggestions;\n context.items = [];\n\n // Collect rendered inline JS to be executed once the HTML is shown.\n var collectedjs = '';\n\n var renderLayout = templates.render(options.templates.layout, {})\n .then(function(html) {\n return $(html);\n });\n\n var renderInput = templates.render(options.templates.input, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n var renderDatalist = templates.render(options.templates.suggestions, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n var renderSelection = templates.render(options.templates.selection, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n return $.when(renderLayout, renderInput, renderDatalist, renderSelection)\n .then(function(layout, input, suggestions, selection) {\n originalSelect.hide();\n var container = originalSelect.parent();\n\n // Ensure that the data-fieldtype is set for behat.\n input.find('input').attr('data-fieldtype', 'autocomplete');\n\n container.append(layout);\n container.find('[data-region=\"form_autocomplete-input\"]').replaceWith(input);\n container.find('[data-region=\"form_autocomplete-suggestions\"]').replaceWith(suggestions);\n container.find('[data-region=\"form_autocomplete-selection\"]').replaceWith(selection);\n\n templates.runTemplateJS(collectedjs);\n\n // Update the form label to point to the text input.\n originalLabel.attr('for', state.inputId);\n // Add the event handlers.\n addNavigation(options, state, originalSelect);\n\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Hide the suggestions by default.\n suggestionsElement.hide();\n Aria.hide(suggestionsElement.get());\n\n return;\n })\n .then(function() {\n // Show the current values in the selection list.\n return updateSelectionList(options, state, originalSelect);\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(function(error) {\n M.util.js_complete(pendingKey);\n notification.exception(error);\n });\n }\n };\n});\n"],"file":"form-autocomplete.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/form-autocomplete.js"],"names":["define","$","log","str","templates","notification","LoadingIcon","Aria","KEYS","DOWN","ENTER","SPACE","ESCAPE","COMMA","UP","LEFT","RIGHT","uniqueId","Date","now","activateSelection","index","state","selectionElement","document","getElementById","selectionId","length","children","element","get","itemId","attr","Deferred","resolve","getActiveElementFromState","selectionRegion","activeId","activeElement","activeValue","find","updateActiveSelectionFromState","activeIndex","updateSelectionList","options","originalSelect","pendingKey","inputId","M","util","js_pending","items","newSelection","each","ele","prop","label","data","html","push","value","hasItemListChanged","js_complete","Promise","context","extend","render","then","js","replaceNodeContents","catch","exception","filter","item","indexOf","notifyChange","core_formchangechecker","set_form_changed","dispatchEvent","Event","deselectItem","selectedItemValue","remove","activateItem","inputElement","suggestionsElement","suggestionsId","globalIndex","scrollPos","offset","top","scrollTop","height","animate","promise","activateNextItem","current","activatePreviousSelection","selectionsElement","activateNextSelection","activatePreviousItem","closeSuggestions","hide","updateSuggestions","query","matchingElements","suggestions","option","innerHTML","searchquery","caseSensitive","toLocaleLowerCase","returnVal","replaceNode","unhide","show","node","text","tags","get_string","done","nosuggestionsstr","createItem","val","split","found","tagindex","tag","trim","multiple","append","createTextNode","selectCurrentItem","closeSuggestionsOnSelect","focus","updateAjax","e","ajaxHandler","pendingPromise","addPendingJSPromise","parentElement","selectId","parent","addIconToContainerRemoveOnCompletion","currentTarget","transport","selector","results","processedResults","processResults","existingValues","optionIndex","isArray","resultIndex","result","error","reject","addNavigation","on","pendingJsPromise","keyCode","showSuggestions","ajax","require","preventDefault","closest","window","setTimeout","focusElement","timeoutPromise","is","arrowElement","downArrowId","off","selectedItem","throttleTimeout","inProgress","handler","arguments","throttledHandler","clearTimeout","bind","last","key","enhance","placeholder","noSelectionString","templateOverrides","input","layout","selection","fail","debug","css","prepend","originalLabel","collectedjs","renderLayout","renderInput","renderDatalist","renderSelection","when","container","replaceWith","runTemplateJS"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Autocomplete wrapper for select2 library.\n *\n * @module core/form-autocomplete\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\ndefine(\n ['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon', 'core/aria'],\nfunction($, log, str, templates, notification, LoadingIcon, Aria) {\n\n // Private functions and variables.\n /** @var {Object} KEYS - List of keycode constants. */\n var KEYS = {\n DOWN: 40,\n ENTER: 13,\n SPACE: 32,\n ESCAPE: 27,\n COMMA: 44,\n UP: 38,\n LEFT: 37,\n RIGHT: 39\n };\n\n var uniqueId = Date.now();\n\n /**\n * Make an item in the selection list \"active\".\n *\n * @method activateSelection\n * @private\n * @param {Number} index The index in the current (visible) list of selection.\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activateSelection = function(index, state) {\n // Find the elements in the DOM.\n var selectionElement = $(document.getElementById(state.selectionId));\n\n // Count the visible items.\n var length = selectionElement.children('[aria-selected=true]').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(selectionElement.children('[aria-selected=true]').get(index));\n // Create an id we can assign to this element.\n var itemId = state.selectionId + '-' + index;\n\n // Deselect all the selections.\n selectionElement.children().attr('data-active-selection', null).attr('id', '');\n\n // Select only this suggestion and assign it the id.\n element.attr('data-active-selection', true).attr('id', itemId);\n\n // Tell the input field it has a new active descendant so the item is announced.\n selectionElement.attr('aria-activedescendant', itemId);\n selectionElement.attr('data-active-value', element.attr('data-value'));\n\n return $.Deferred().resolve();\n };\n\n /**\n * Get the actively selected element from the state object.\n *\n * @param {Object} state\n * @returns {jQuery}\n */\n var getActiveElementFromState = function(state) {\n var selectionRegion = $(document.getElementById(state.selectionId));\n var activeId = selectionRegion.attr('aria-activedescendant');\n\n if (activeId) {\n var activeElement = $(document.getElementById(activeId));\n if (activeElement.length) {\n // The active descendent still exists.\n return activeElement;\n }\n }\n\n var activeValue = selectionRegion.attr('data-active-value');\n return selectionRegion.find('[data-value=\"' + activeValue + '\"]');\n };\n\n /**\n * Update the active selection from the given state object.\n *\n * @param {Object} state\n */\n var updateActiveSelectionFromState = function(state) {\n var activeElement = getActiveElementFromState(state);\n var activeValue = activeElement.attr('data-value');\n\n var selectionRegion = $(document.getElementById(state.selectionId));\n if (activeValue) {\n // Find the index of the currently selected index.\n var activeIndex = selectionRegion.find('[aria-selected=true]').index(activeElement);\n\n if (activeIndex !== -1) {\n activateSelection(activeIndex, state);\n return;\n }\n }\n\n // Either the active index was not set, or it could not be found.\n // Select the first value instead.\n activateSelection(0, state);\n };\n\n /**\n * Update the element that shows the currently selected items.\n *\n * @method updateSelectionList\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSelectionList = function(options, state, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSelectionList-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Build up a valid context to re-render the template.\n var items = [];\n var newSelection = $(document.getElementById(state.selectionId));\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).prop('selected')) {\n var label;\n if ($(ele).data('html')) {\n label = $(ele).data('html');\n } else {\n label = $(ele).html();\n }\n if (label !== '') {\n items.push({label: label, value: $(ele).attr('value')});\n }\n }\n });\n\n if (!hasItemListChanged(state, items)) {\n M.util.js_complete(pendingKey);\n return Promise.resolve();\n }\n\n state.items = items;\n\n var context = $.extend(options, state);\n // Render the template.\n return templates.render(options.templates.items, context)\n .then(function(html, js) {\n // Add it to the page.\n templates.replaceNodeContents(newSelection, html, js);\n\n updateActiveSelectionFromState(state);\n\n return;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n };\n\n /**\n * Check whether the list of items stored in the state has changed.\n *\n * @param {Object} state\n * @param {Array} items\n * @returns {Boolean}\n */\n var hasItemListChanged = function(state, items) {\n if (state.items.length !== items.length) {\n return true;\n }\n\n // Check for any items in the state items which are not present in the new items list.\n return state.items.filter(item => items.indexOf(item) === -1).length > 0;\n };\n\n /**\n * Notify of a change in the selection.\n *\n * @param {jQuery} originalSelect The jQuery object matching the hidden select list.\n */\n var notifyChange = function(originalSelect) {\n if (typeof M.core_formchangechecker !== 'undefined') {\n M.core_formchangechecker.set_form_changed();\n }\n\n // Note, jQuery .change() was not working here. Better to\n // use plain JavaScript anyway.\n originalSelect[0].dispatchEvent(new Event('change'));\n };\n\n /**\n * Remove the given item from the list of selected things.\n *\n * @method deselectItem\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {Element} item The item to be deselected.\n * @param {Element} originalSelect The original select list.\n * @return {Promise}\n */\n var deselectItem = function(options, state, item, originalSelect) {\n var selectedItemValue = $(item).attr('data-value');\n\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', false);\n // We remove newly created custom tags from the suggestions list when they are deselected.\n if ($(ele).attr('data-iscustom')) {\n $(ele).remove();\n }\n }\n });\n // Rerender the selection list.\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n });\n };\n\n /**\n * Make an item in the suggestions \"active\" (about to be selected).\n *\n * @method activateItem\n * @private\n * @param {Number} index The index in the current (visible) list of suggestions.\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateItem = function(index, state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Count the visible items.\n var length = suggestionsElement.children(':not([aria-hidden])').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(suggestionsElement.children(':not([aria-hidden])').get(index));\n // Find the index of this item in the full list of suggestions (including hidden).\n var globalIndex = $(suggestionsElement.children('[role=option]')).index(element);\n // Create an id we can assign to this element.\n var itemId = state.suggestionsId + '-' + globalIndex;\n\n // Deselect all the suggestions.\n suggestionsElement.children().attr('aria-selected', false).attr('id', '');\n // Select only this suggestion and assign it the id.\n element.attr('aria-selected', true).attr('id', itemId);\n // Tell the input field it has a new active descendant so the item is announced.\n inputElement.attr('aria-activedescendant', itemId);\n\n // Scroll it into view.\n var scrollPos = element.offset().top\n - suggestionsElement.offset().top\n + suggestionsElement.scrollTop()\n - (suggestionsElement.height() / 2);\n return suggestionsElement.animate({\n scrollTop: scrollPos\n }, 100).promise();\n };\n\n /**\n * Find the index of the current active suggestion, and activate the next one.\n *\n * @method activateNextItem\n * @private\n * @param {Object} state State variable for this auto complete element.\n * @return {Promise}\n */\n var activateNextItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n // Find it's index.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n // Activate the next one.\n return activateItem(current + 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the previous one.\n *\n * @method activatePreviousSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activatePreviousSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection]');\n if (!element) {\n return activateSelection(0, state);\n }\n // Find it's index.\n var current = selectionsElement.children('[aria-selected=true]').index(element);\n // Activate the next one.\n return activateSelection(current - 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the next one.\n *\n * @method activateNextSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateNextSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection]');\n var current = 0;\n\n if (element) {\n // The element was found. Determine the index and move to the next one.\n current = selectionsElement.children('[aria-selected=true]').index(element);\n current = current + 1;\n } else {\n // No selected item found. Move to the first.\n current = 0;\n }\n\n return activateSelection(current, state);\n };\n\n /**\n * Find the index of the current active suggestion, and activate the previous one.\n *\n * @method activatePreviousItem\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activatePreviousItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n\n // Find it's index.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n\n // Activate the previous one.\n return activateItem(current - 1, state);\n };\n\n /**\n * Close the list of suggestions.\n *\n * @method closeSuggestions\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var closeSuggestions = function(state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n if (inputElement.attr('aria-expanded') === \"true\") {\n // Announce the list of suggestions was closed.\n inputElement.attr('aria-expanded', false);\n }\n // Read the current list of selections.\n inputElement.attr('aria-activedescendant', state.selectionId);\n\n // Hide the suggestions list (from screen readers too).\n Aria.hide(suggestionsElement.get());\n suggestionsElement.hide();\n\n return $.Deferred().resolve();\n };\n\n /**\n * Rebuild the list of suggestions based on the current values in the select list, and the query.\n *\n * @method updateSuggestions\n * @private\n * @param {Object} options The original options for this autocomplete.\n * @param {Object} state The state variables for this autocomplete.\n * @param {String} query The current text for the search string.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSuggestions = function(options, state, query, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSuggestions-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Used to track if we found any visible suggestions.\n var matchingElements = false;\n // Options is used by the context when rendering the suggestions from a template.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n if ($(option).prop('selected') !== true) {\n suggestions[suggestions.length] = {label: option.innerHTML, value: $(option).attr('value')};\n }\n });\n\n // Re-render the list of suggestions.\n var searchquery = state.caseSensitive ? query : query.toLocaleLowerCase();\n var context = $.extend({options: suggestions}, options, state);\n var returnVal = templates.render(\n 'core/form_autocomplete_suggestions',\n context\n )\n .then(function(html, js) {\n // We have the new template, insert it in the page.\n templates.replaceNode(suggestionsElement, html, js);\n\n // Get the element again.\n suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Show it if it is hidden.\n Aria.unhide(suggestionsElement.get());\n suggestionsElement.show();\n\n // For each option in the list, hide it if it doesn't match the query.\n suggestionsElement.children().each(function(index, node) {\n node = $(node);\n if ((options.caseSensitive && node.text().indexOf(searchquery) > -1) ||\n (!options.caseSensitive && node.text().toLocaleLowerCase().indexOf(searchquery) > -1)) {\n Aria.unhide(node.get());\n node.show();\n matchingElements = true;\n } else {\n node.hide();\n Aria.hide(node.get());\n }\n });\n // If we found any matches, show the list.\n inputElement.attr('aria-expanded', true);\n if (originalSelect.attr('data-notice')) {\n // Display a notice rather than actual suggestions.\n suggestionsElement.html(originalSelect.attr('data-notice'));\n } else if (matchingElements) {\n // We only activate the first item in the list if tags is false,\n // because otherwise \"Enter\" would select the first item, instead of\n // creating a new tag.\n if (!options.tags) {\n activateItem(0, state);\n }\n } else {\n // Nothing matches. Tell them that.\n str.get_string('nosuggestions', 'form').done(function(nosuggestionsstr) {\n suggestionsElement.html(nosuggestionsstr);\n });\n }\n\n return suggestionsElement;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n\n return returnVal;\n };\n\n /**\n * Create a new item for the list (a tag).\n *\n * @method createItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var createItem = function(options, state, originalSelect) {\n // Find the element in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n // Get the current text in the input field.\n var query = inputElement.val();\n var tags = query.split(',');\n var found = false;\n\n $.each(tags, function(tagindex, tag) {\n // If we can only select one at a time, deselect any current value.\n tag = tag.trim();\n if (tag !== '') {\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for an existing option in the select list that matches this new tag.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == tag) {\n found = true;\n $(ele).prop('selected', true);\n }\n });\n // Only create the item if it's new.\n if (!found) {\n var option = $('');\n option.append(document.createTextNode(tag));\n option.attr('value', tag);\n originalSelect.append(option);\n option.prop('selected', true);\n // We mark newly created custom options as we handle them differently if they are \"deselected\".\n option.attr('data-iscustom', true);\n }\n }\n });\n\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n })\n .then(function() {\n // Clear the input field.\n inputElement.val('');\n\n return;\n })\n .then(function() {\n // Close the suggestions list.\n return closeSuggestions(state);\n });\n };\n\n /**\n * Select the currently active item from the suggestions list.\n *\n * @method selectCurrentItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var selectCurrentItem = function(options, state, originalSelect) {\n // Find the elements in the page.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Here loop through suggestions and set val to join of all selected items.\n\n var selectedItemValue = suggestionsElement.children('[aria-selected=true]').attr('data-value');\n // The select will either be a single or multi select, so the following will either\n // select one or more items correctly.\n // Take care to use 'prop' and not 'attr' for selected properties.\n // If only one can be selected at a time, start by deselecting everything.\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', true);\n }\n });\n\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n })\n .then(function() {\n if (options.closeSuggestionsOnSelect) {\n // Clear the input element.\n inputElement.val('');\n // Close the list of suggestions.\n return closeSuggestions(state);\n } else {\n // Focus on the input element so the suggestions does not auto-close.\n inputElement.focus();\n // Remove the last selected item from the suggestions list.\n return updateSuggestions(options, state, inputElement.val(), originalSelect);\n }\n });\n };\n\n /**\n * Fetch a new list of options via ajax.\n *\n * @method updateAjax\n * @private\n * @param {Event} e The event that triggered this update.\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state The state variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @param {Object} ajaxHandler This is a module that does the ajax fetch and translates the results.\n * @return {Promise}\n */\n var updateAjax = function(e, options, state, originalSelect, ajaxHandler) {\n var pendingPromise = addPendingJSPromise('updateAjax');\n // We need to show the indicator outside of the hidden select list.\n // So we get the parent id of the hidden select list.\n var parentElement = $(document.getElementById(state.selectId)).parent();\n LoadingIcon.addIconToContainerRemoveOnCompletion(parentElement, pendingPromise);\n\n // Get the query to pass to the ajax function.\n var query = $(e.currentTarget).val();\n // Call the transport function to do the ajax (name taken from Select2).\n ajaxHandler.transport(options.selector, query, function(results) {\n // We got a result - pass it through the translator before using it.\n var processedResults = ajaxHandler.processResults(options.selector, results);\n var existingValues = [];\n\n // Now destroy all options that are not currently selected.\n if (!options.multiple) {\n originalSelect.children('option').remove();\n }\n originalSelect.children('option').each(function(optionIndex, option) {\n option = $(option);\n if (!option.prop('selected')) {\n option.remove();\n } else {\n existingValues.push(String(option.attr('value')));\n }\n });\n\n if (!options.multiple && originalSelect.children('option').length === 0) {\n // If this is a single select - and there are no current options\n // the first option added will be selected by the browser. This causes a bug!\n // We need to insert an empty option so that none of the real options are selected.\n var option = $(' ');\n originalSelect.append(option);\n }\n if ($.isArray(processedResults)) {\n // Add all the new ones returned from ajax.\n $.each(processedResults, function(resultIndex, result) {\n if (existingValues.indexOf(String(result.value)) === -1) {\n var option = $(' ');\n option.append(result.label);\n option.attr('value', result.value);\n originalSelect.append(option);\n }\n });\n originalSelect.attr('data-notice', '');\n } else {\n // The AJAX handler returned a string instead of the array.\n originalSelect.attr('data-notice', processedResults);\n }\n // Update the list of suggestions now from the new values in the select list.\n pendingPromise.resolve(updateSuggestions(options, state, '', originalSelect));\n }, function(error) {\n pendingPromise.reject(error);\n });\n\n return pendingPromise;\n };\n\n /**\n * Add all the event listeners required for keyboard nav, blur clicks etc.\n *\n * @method addNavigation\n * @private\n * @param {Object} options The options used to create this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n */\n var addNavigation = function(options, state, originalSelect) {\n // Start with the input element.\n var inputElement = $(document.getElementById(state.inputId));\n // Add keyboard nav with keydown.\n inputElement.on('keydown', function(e) {\n var pendingJsPromise = addPendingJSPromise('addNavigation-' + state.inputId + '-' + e.keyCode);\n\n switch (e.keyCode) {\n case KEYS.DOWN:\n // If the suggestion list is open, move to the next item.\n if (!options.showSuggestions) {\n // Do not consume this event.\n pendingJsPromise.resolve();\n return true;\n } else if (inputElement.attr('aria-expanded') === \"true\") {\n pendingJsPromise.resolve(activateNextItem(state));\n } else {\n // Handle ajax population of suggestions.\n if (!inputElement.val() && options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n pendingJsPromise.resolve(updateAjax(e, options, state, originalSelect, ajaxHandler));\n });\n } else {\n // Open the suggestions list.\n pendingJsPromise.resolve(updateSuggestions(options, state, inputElement.val(), originalSelect));\n }\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.UP:\n // Choose the previous active item.\n pendingJsPromise.resolve(activatePreviousItem(state));\n\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.ENTER:\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n if ((inputElement.attr('aria-expanded') === \"true\") &&\n (suggestionsElement.children('[aria-selected=true]').length > 0)) {\n // If the suggestion list has an active item, select it.\n pendingJsPromise.resolve(selectCurrentItem(options, state, originalSelect));\n } else if (options.tags) {\n // If tags are enabled, create a tag.\n pendingJsPromise.resolve(createItem(options, state, originalSelect));\n } else {\n pendingJsPromise.resolve();\n }\n\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.ESCAPE:\n if (inputElement.attr('aria-expanded') === \"true\") {\n // If the suggestion list is open, close it.\n pendingJsPromise.resolve(closeSuggestions(state));\n } else {\n pendingJsPromise.resolve();\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n }\n pendingJsPromise.resolve();\n return true;\n });\n // Support multi lingual COMMA keycode (44).\n inputElement.on('keypress', function(e) {\n\n if (e.keyCode === KEYS.COMMA) {\n if (options.tags) {\n // If we are allowing tags, comma should create a tag (or enter).\n addPendingJSPromise('keypress-' + e.keyCode)\n .resolve(createItem(options, state, originalSelect));\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n }\n return true;\n });\n // Support submitting the form without leaving the autocomplete element,\n // or submitting too quick before the blur handler action is completed.\n inputElement.closest('form').on('submit', function() {\n if (options.tags) {\n // If tags are enabled, create a tag.\n addPendingJSPromise('form-autocomplete-submit')\n .resolve(createItem(options, state, originalSelect));\n }\n\n return true;\n });\n inputElement.on('blur', function() {\n var pendingPromise = addPendingJSPromise('form-autocomplete-blur');\n window.setTimeout(function() {\n // Get the current element with focus.\n var focusElement = $(document.activeElement);\n var timeoutPromise = $.Deferred();\n\n // Only close the menu if the input hasn't regained focus and if the element still exists,\n // and regain focus if the scrollbar is clicked.\n // Due to the half a second delay, it is possible that the input element no longer exist\n // by the time this code is being executed.\n if (focusElement.is(document.getElementById(state.suggestionsId))) {\n inputElement.focus(); // Probably the scrollbar is clicked. Regain focus.\n } else if (!focusElement.is(inputElement) && $(document.getElementById(state.inputId)).length) {\n if (options.tags) {\n timeoutPromise.then(function() {\n return createItem(options, state, originalSelect);\n })\n .catch();\n }\n timeoutPromise.then(function() {\n return closeSuggestions(state);\n })\n .catch();\n }\n\n timeoutPromise.then(function() {\n return pendingPromise.resolve();\n })\n .catch();\n timeoutPromise.resolve();\n }, 500);\n });\n if (options.showSuggestions) {\n var arrowElement = $(document.getElementById(state.downArrowId));\n arrowElement.on('click', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-show-suggestions');\n\n // Prevent the close timer, or we will open, then close the suggestions.\n inputElement.focus();\n\n // Handle ajax population of suggestions.\n if (!inputElement.val() && options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n pendingPromise.resolve(updateAjax(e, options, state, originalSelect, ajaxHandler));\n });\n } else {\n // Else - open the suggestions list.\n pendingPromise.resolve(updateSuggestions(options, state, inputElement.val(), originalSelect));\n }\n });\n }\n\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Remove any click handler first.\n suggestionsElement.parent().prop(\"onclick\", null).off(\"click\");\n suggestionsElement.parent().on('click', `#${state.suggestionsId} [role=option]`, function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-parent');\n // Handle clicks on suggestions.\n var element = $(e.currentTarget).closest('[role=option]');\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the index of the clicked on suggestion.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n\n // Activate it.\n activateItem(current, state)\n .then(function() {\n // And select it.\n return selectCurrentItem(options, state, originalSelect);\n })\n .then(function() {\n return pendingPromise.resolve();\n })\n .catch();\n });\n var selectionElement = $(document.getElementById(state.selectionId));\n\n // Handle clicks on the selected items (will unselect an item).\n selectionElement.on('click', '[role=option]', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-clicks');\n\n // Remove it from the selection.\n pendingPromise.resolve(deselectItem(options, state, $(e.currentTarget), originalSelect));\n });\n\n // When listbox is focused, focus on the first option if there is no focused option.\n selectionElement.on('focus', function() {\n updateActiveSelectionFromState(state);\n });\n\n // Keyboard navigation for the selection list.\n selectionElement.on('keydown', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-keydown-' + e.keyCode);\n switch (e.keyCode) {\n case KEYS.RIGHT:\n case KEYS.DOWN:\n // We handled this event, so prevent it.\n e.preventDefault();\n\n // Choose the next selection item.\n pendingPromise.resolve(activateNextSelection(state));\n return;\n case KEYS.LEFT:\n case KEYS.UP:\n // We handled this event, so prevent it.\n e.preventDefault();\n\n // Choose the previous selection item.\n pendingPromise.resolve(activatePreviousSelection(state));\n return;\n case KEYS.SPACE:\n case KEYS.ENTER:\n // Get the item that is currently selected.\n var selectedItem = $(document.getElementById(state.selectionId)).children('[data-active-selection]');\n if (selectedItem) {\n e.preventDefault();\n\n // Unselect this item.\n pendingPromise.resolve(deselectItem(options, state, selectedItem, originalSelect));\n }\n return;\n }\n\n // Not handled. Resolve the promise.\n pendingPromise.resolve();\n });\n // Whenever the input field changes, update the suggestion list.\n if (options.showSuggestions) {\n // Store the value of the field as its last value, when the field gains focus.\n inputElement.on('focus', function(e) {\n var query = $(e.currentTarget).val();\n $(e.currentTarget).data('last-value', query);\n });\n\n // If this field uses ajax, set it up.\n if (options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n // Creating throttled handlers free of race conditions, and accurate.\n // This code keeps track of a throttleTimeout, which is periodically polled.\n // Once the throttled function is executed, the fact that it is running is noted.\n // If a subsequent request comes in whilst it is running, this request is re-applied.\n var throttleTimeout = null;\n var inProgress = false;\n var pendingKey = 'autocomplete-throttledhandler';\n var handler = function(e) {\n // Empty the current timeout.\n throttleTimeout = null;\n\n // Mark this request as in-progress.\n inProgress = true;\n\n // Process the request.\n updateAjax(e, options, state, originalSelect, ajaxHandler)\n .then(function() {\n // Check if the throttleTimeout is still empty.\n // There's a potential condition whereby the JS request takes long enough to complete that\n // another task has been queued.\n // In this case another task will be kicked off and we must wait for that before marking htis as\n // complete.\n if (null === throttleTimeout) {\n // Mark this task as complete.\n M.util.js_complete(pendingKey);\n }\n inProgress = false;\n\n return arguments[0];\n })\n .catch(notification.exception);\n };\n\n // For input events, we do not want to trigger many, many updates.\n var throttledHandler = function(e) {\n window.clearTimeout(throttleTimeout);\n if (inProgress) {\n // A request is currently ongoing.\n // Delay this request another 100ms.\n throttleTimeout = window.setTimeout(throttledHandler.bind(this, e), 100);\n return;\n }\n\n if (throttleTimeout === null) {\n // There is currently no existing timeout handler, and it has not been recently cleared, so\n // this is the start of a throttling check.\n M.util.js_pending(pendingKey);\n }\n\n // There is currently no existing timeout handler, and it has not been recently cleared, so this\n // is the start of a throttling check.\n // Queue a call to the handler.\n throttleTimeout = window.setTimeout(handler.bind(this, e), 300);\n };\n\n // Trigger an ajax update after the text field value changes.\n inputElement.on('input', function(e) {\n var query = $(e.currentTarget).val();\n var last = $(e.currentTarget).data('last-value');\n // IE11 fires many more input events than required - even when the value has not changed.\n if (last !== query) {\n throttledHandler(e);\n }\n $(e.currentTarget).data('last-value', query);\n });\n });\n } else {\n inputElement.on('input', function(e) {\n var query = $(e.currentTarget).val();\n var last = $(e.currentTarget).data('last-value');\n // IE11 fires many more input events than required - even when the value has not changed.\n // We need to only do this for real value changed events or the suggestions will be\n // unclickable on IE11 (because they will be rebuilt before the click event fires).\n // Note - because of this we cannot close the list when the query is empty or it will break\n // on IE11.\n if (last !== query) {\n updateSuggestions(options, state, query, originalSelect);\n }\n $(e.currentTarget).data('last-value', query);\n });\n }\n }\n };\n\n /**\n * Create and return an unresolved Promise for some pending JS.\n *\n * @param {String} key The unique identifier for this promise\n * @return {Promise}\n */\n var addPendingJSPromise = function(key) {\n var pendingKey = 'form-autocomplete:' + key;\n\n M.util.js_pending(pendingKey);\n\n var pendingPromise = $.Deferred();\n\n pendingPromise\n .then(function() {\n M.util.js_complete(pendingKey);\n\n return arguments[0];\n })\n .catch(notification.exception);\n\n return pendingPromise;\n };\n\n return {\n // Public variables and functions.\n /**\n * Turn a boring select box into an auto-complete beast.\n *\n * @method enhance\n * @param {string} selector The selector that identifies the select box.\n * @param {boolean} tags Whether to allow support for tags (can define new entries).\n * @param {string} ajax Name of an AMD module to handle ajax requests. If specified, the AMD\n * module must expose 2 functions \"transport\" and \"processResults\".\n * These are modeled on Select2 see: https://select2.github.io/options.html#ajax\n * @param {String} placeholder - The text to display before a selection is made.\n * @param {Boolean} caseSensitive - If search has to be made case sensitive.\n * @param {Boolean} showSuggestions - If suggestions should be shown\n * @param {String} noSelectionString - Text to display when there is no selection\n * @param {Boolean} closeSuggestionsOnSelect - Whether to close the suggestions immediately after making a selection.\n * @param {Object} templateOverrides A set of templates to use instead of the standard templates\n * @return {Promise}\n */\n enhance: function(selector, tags, ajax, placeholder, caseSensitive, showSuggestions, noSelectionString,\n closeSuggestionsOnSelect, templateOverrides) {\n // Set some default values.\n var options = {\n selector: selector,\n tags: false,\n ajax: false,\n placeholder: placeholder,\n caseSensitive: false,\n showSuggestions: true,\n noSelectionString: noSelectionString,\n templates: $.extend({\n input: 'core/form_autocomplete_input',\n items: 'core/form_autocomplete_selection_items',\n layout: 'core/form_autocomplete_layout',\n selection: 'core/form_autocomplete_selection',\n suggestions: 'core/form_autocomplete_suggestions',\n }, templateOverrides),\n };\n var pendingKey = 'autocomplete-setup-' + selector;\n M.util.js_pending(pendingKey);\n if (typeof tags !== \"undefined\") {\n options.tags = tags;\n }\n if (typeof ajax !== \"undefined\") {\n options.ajax = ajax;\n }\n if (typeof caseSensitive !== \"undefined\") {\n options.caseSensitive = caseSensitive;\n }\n if (typeof showSuggestions !== \"undefined\") {\n options.showSuggestions = showSuggestions;\n }\n if (typeof noSelectionString === \"undefined\") {\n str.get_string('noselection', 'form').done(function(result) {\n options.noSelectionString = result;\n }).fail(notification.exception);\n }\n\n // Look for the select element.\n var originalSelect = $(selector);\n if (!originalSelect) {\n log.debug('Selector not found: ' + selector);\n M.util.js_complete(pendingKey);\n return false;\n }\n\n Aria.hide(originalSelect.get());\n originalSelect.css('visibility', 'hidden');\n\n // Hide the original select.\n\n // Find or generate some ids.\n var state = {\n selectId: originalSelect.attr('id'),\n inputId: 'form_autocomplete_input-' + uniqueId,\n suggestionsId: 'form_autocomplete_suggestions-' + uniqueId,\n selectionId: 'form_autocomplete_selection-' + uniqueId,\n downArrowId: 'form_autocomplete_downarrow-' + uniqueId,\n items: [],\n };\n\n // Increment the unique counter so we don't get duplicates ever.\n uniqueId++;\n\n options.multiple = originalSelect.attr('multiple');\n if (!options.multiple) {\n // If this is a single select then there is no way to de-select the current value -\n // unless we add a bogus blank option to be selected when nothing else is.\n // This matches similar code in updateAjax above.\n originalSelect.prepend(' ');\n }\n\n if (typeof closeSuggestionsOnSelect !== \"undefined\") {\n options.closeSuggestionsOnSelect = closeSuggestionsOnSelect;\n } else {\n // If not specified, this will close suggestions by default for single-select elements only.\n options.closeSuggestionsOnSelect = !options.multiple;\n }\n\n var originalLabel = $('[for=' + state.selectId + ']');\n // Create the new markup and insert it after the select.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n suggestions[index] = {label: option.innerHTML, value: $(option).attr('value')};\n });\n\n // Render all the parts of our UI.\n var context = $.extend({}, options, state);\n context.options = suggestions;\n context.items = [];\n\n // Collect rendered inline JS to be executed once the HTML is shown.\n var collectedjs = '';\n\n var renderLayout = templates.render(options.templates.layout, {})\n .then(function(html) {\n return $(html);\n });\n\n var renderInput = templates.render(options.templates.input, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n var renderDatalist = templates.render(options.templates.suggestions, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n var renderSelection = templates.render(options.templates.selection, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n return $.when(renderLayout, renderInput, renderDatalist, renderSelection)\n .then(function(layout, input, suggestions, selection) {\n originalSelect.hide();\n var container = originalSelect.parent();\n\n // Ensure that the data-fieldtype is set for behat.\n input.find('input').attr('data-fieldtype', 'autocomplete');\n\n container.append(layout);\n container.find('[data-region=\"form_autocomplete-input\"]').replaceWith(input);\n container.find('[data-region=\"form_autocomplete-suggestions\"]').replaceWith(suggestions);\n container.find('[data-region=\"form_autocomplete-selection\"]').replaceWith(selection);\n\n templates.runTemplateJS(collectedjs);\n\n // Update the form label to point to the text input.\n originalLabel.attr('for', state.inputId);\n // Add the event handlers.\n addNavigation(options, state, originalSelect);\n\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Hide the suggestions by default.\n suggestionsElement.hide();\n Aria.hide(suggestionsElement.get());\n\n return;\n })\n .then(function() {\n // Show the current values in the selection list.\n return updateSelectionList(options, state, originalSelect);\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(function(error) {\n M.util.js_complete(pendingKey);\n notification.exception(error);\n });\n }\n };\n});\n"],"file":"form-autocomplete.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/form-cohort-selector.min.js.map b/lib/amd/build/form-cohort-selector.min.js.map
index 5e8a14ad23e..9fb599d776d 100644
--- a/lib/amd/build/form-cohort-selector.min.js.map
+++ b/lib/amd/build/form-cohort-selector.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/form-cohort-selector.js"],"names":["define","ajax","$","processResults","selector","data","results","i","excludelist","split","cohorts","length","indexOf","id","push","value","label","name","transport","query","success","failure","el","promises","contextid","searchargs","includes","limitfrom","limitnum","context","call","methodname","args","when","apply","done","fail"],"mappings":"AAwBAA,OAAM,6BAAC,CAAC,WAAD,CAAc,QAAd,CAAD,CAA0B,SAASC,CAAT,CAAeC,CAAf,CAAkB,CAE9C,MAAsD,CAElDC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAAyB,IAEjCC,CAAAA,CAAO,CAAG,EAFuB,CAGjCC,CAAC,CAAG,CAH6B,CAIjCC,CAAW,CAAG,CAAON,CAAC,CAACE,CAAD,CAAD,CAAYC,IAAZ,CAAiB,SAAjB,CAAP,KAAoCI,KAApC,CAA0C,GAA1C,CAJmB,CAMrC,IAAKF,CAAC,CAAG,CAAT,CAAYA,CAAC,CAAGF,CAAI,CAACK,OAAL,CAAaC,MAA7B,CAAqCJ,CAAC,EAAtC,CAA0C,CACtC,GAAwD,CAAC,CAArD,GAAAC,CAAW,CAACI,OAAZ,CAA2BP,CAAI,CAACK,OAAL,CAAaH,CAAb,EAAgBM,EAA3C,IAAJ,CAA4D,CACxDP,CAAO,CAACQ,IAAR,CAAa,CAACC,KAAK,CAAEV,CAAI,CAACK,OAAL,CAAaH,CAAb,EAAgBM,EAAxB,CAA4BG,KAAK,CAAEX,CAAI,CAACK,OAAL,CAAaH,CAAb,EAAgBU,IAAnD,CAAb,CACH,CACJ,CACD,MAAOX,CAAAA,CACV,CAdiD,CAgBlDY,SAAS,CAAE,mBAASd,CAAT,CAAmBe,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,IAC/CC,CAAAA,CAAE,CAAGpB,CAAC,CAACE,CAAD,CADyC,CAM/CmB,CAAQ,CAAG,IANoC,CAQnD,GAAqB,WAAjB,QAAOJ,CAAAA,CAAX,CAAkC,CAC9BA,CAAK,CAAG,EACX,CAVkD,GAW/CK,CAAAA,CAAS,CAAGF,CAAE,CAACjB,IAAH,CAAQ,WAAR,CAXmC,CAa/CoB,CAAU,CAAG,CACbN,KAAK,CAAEA,CADM,CAEbO,QAAQ,CAAE,SAFG,CAGbC,SAAS,CAAE,CAHE,CAIbC,QAAQ,CAAE,GAJG,CAKbC,OAAO,CAAE,CAACL,SAAS,CAAEA,CAAZ,CALI,CAbkC,CA0BnDD,CAAQ,CAAGtB,CAAI,CAAC6B,IAAL,CALC,CAAC,CACTC,UAAU,CAAE,4BADH,CACiCC,IAAI,CAAEP,CADvC,CAAD,CAKD,CAAX,CACAvB,CAAC,CAAC+B,IAAF,CAAOC,KAAP,CAAahC,CAAC,CAAC+B,IAAf,CAAqBV,CAArB,EAA+BY,IAA/B,CAAoC,SAAS9B,CAAT,CAAe,CAC/Ce,CAAO,CAACf,CAAD,CACV,CAFD,EAEG+B,IAFH,CAEQf,CAFR,CAGH,CA9CiD,CAgDzD,CAlDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Course selector adaptor for auto-complete form element.\n *\n * @module core/form-cohort-selector\n * @class form-cohort-selector\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['core/ajax', 'jquery'], function(ajax, $) {\n\n return /** @alias module:core/form-cohort-selector */ {\n // Public variables and functions.\n processResults: function(selector, data) {\n // Mangle the results into an array of objects.\n var results = [];\n var i = 0;\n var excludelist = String($(selector).data('exclude')).split(',');\n\n for (i = 0; i < data.cohorts.length; i++) {\n if (excludelist.indexOf(String(data.cohorts[i].id)) === -1) {\n results.push({value: data.cohorts[i].id, label: data.cohorts[i].name});\n }\n }\n return results;\n },\n\n transport: function(selector, query, success, failure) {\n var el = $(selector);\n\n // Parse some data-attributes from the form element.\n\n // Build the query.\n var promises = null;\n\n if (typeof query === \"undefined\") {\n query = '';\n }\n var contextid = el.data('contextid');\n\n var searchargs = {\n query: query,\n includes: 'parents',\n limitfrom: 0,\n limitnum: 100,\n context: {contextid: contextid}\n };\n\n var calls = [{\n methodname: 'core_cohort_search_cohorts', args: searchargs\n }];\n\n // Go go go!\n promises = ajax.call(calls);\n $.when.apply($.when, promises).done(function(data) {\n success(data);\n }).fail(failure);\n }\n };\n});\n"],"file":"form-cohort-selector.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/form-cohort-selector.js"],"names":["define","ajax","$","processResults","selector","data","results","i","excludelist","split","cohorts","length","indexOf","id","push","value","label","name","transport","query","success","failure","el","promises","contextid","searchargs","includes","limitfrom","limitnum","context","call","methodname","args","when","apply","done","fail"],"mappings":"AAuBAA,OAAM,6BAAC,CAAC,WAAD,CAAc,QAAd,CAAD,CAA0B,SAASC,CAAT,CAAeC,CAAf,CAAkB,CAE9C,MAAO,CAEHC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAAyB,IAEjCC,CAAAA,CAAO,CAAG,EAFuB,CAGjCC,CAAC,CAAG,CAH6B,CAIjCC,CAAW,CAAG,CAAON,CAAC,CAACE,CAAD,CAAD,CAAYC,IAAZ,CAAiB,SAAjB,CAAP,KAAoCI,KAApC,CAA0C,GAA1C,CAJmB,CAMrC,IAAKF,CAAC,CAAG,CAAT,CAAYA,CAAC,CAAGF,CAAI,CAACK,OAAL,CAAaC,MAA7B,CAAqCJ,CAAC,EAAtC,CAA0C,CACtC,GAAwD,CAAC,CAArD,GAAAC,CAAW,CAACI,OAAZ,CAA2BP,CAAI,CAACK,OAAL,CAAaH,CAAb,EAAgBM,EAA3C,IAAJ,CAA4D,CACxDP,CAAO,CAACQ,IAAR,CAAa,CAACC,KAAK,CAAEV,CAAI,CAACK,OAAL,CAAaH,CAAb,EAAgBM,EAAxB,CAA4BG,KAAK,CAAEX,CAAI,CAACK,OAAL,CAAaH,CAAb,EAAgBU,IAAnD,CAAb,CACH,CACJ,CACD,MAAOX,CAAAA,CACV,CAdE,CAgBHY,SAAS,CAAE,mBAASd,CAAT,CAAmBe,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,IAC/CC,CAAAA,CAAE,CAAGpB,CAAC,CAACE,CAAD,CADyC,CAM/CmB,CAAQ,CAAG,IANoC,CAQnD,GAAqB,WAAjB,QAAOJ,CAAAA,CAAX,CAAkC,CAC9BA,CAAK,CAAG,EACX,CAVkD,GAW/CK,CAAAA,CAAS,CAAGF,CAAE,CAACjB,IAAH,CAAQ,WAAR,CAXmC,CAa/CoB,CAAU,CAAG,CACbN,KAAK,CAAEA,CADM,CAEbO,QAAQ,CAAE,SAFG,CAGbC,SAAS,CAAE,CAHE,CAIbC,QAAQ,CAAE,GAJG,CAKbC,OAAO,CAAE,CAACL,SAAS,CAAEA,CAAZ,CALI,CAbkC,CA0BnDD,CAAQ,CAAGtB,CAAI,CAAC6B,IAAL,CALC,CAAC,CACTC,UAAU,CAAE,4BADH,CACiCC,IAAI,CAAEP,CADvC,CAAD,CAKD,CAAX,CACAvB,CAAC,CAAC+B,IAAF,CAAOC,KAAP,CAAahC,CAAC,CAAC+B,IAAf,CAAqBV,CAArB,EAA+BY,IAA/B,CAAoC,SAAS9B,CAAT,CAAe,CAC/Ce,CAAO,CAACf,CAAD,CACV,CAFD,EAEG+B,IAFH,CAEQf,CAFR,CAGH,CA9CE,CAgDV,CAlDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Course selector adaptor for auto-complete form element.\n *\n * @module core/form-cohort-selector\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['core/ajax', 'jquery'], function(ajax, $) {\n\n return {\n // Public variables and functions.\n processResults: function(selector, data) {\n // Mangle the results into an array of objects.\n var results = [];\n var i = 0;\n var excludelist = String($(selector).data('exclude')).split(',');\n\n for (i = 0; i < data.cohorts.length; i++) {\n if (excludelist.indexOf(String(data.cohorts[i].id)) === -1) {\n results.push({value: data.cohorts[i].id, label: data.cohorts[i].name});\n }\n }\n return results;\n },\n\n transport: function(selector, query, success, failure) {\n var el = $(selector);\n\n // Parse some data-attributes from the form element.\n\n // Build the query.\n var promises = null;\n\n if (typeof query === \"undefined\") {\n query = '';\n }\n var contextid = el.data('contextid');\n\n var searchargs = {\n query: query,\n includes: 'parents',\n limitfrom: 0,\n limitnum: 100,\n context: {contextid: contextid}\n };\n\n var calls = [{\n methodname: 'core_cohort_search_cohorts', args: searchargs\n }];\n\n // Go go go!\n promises = ajax.call(calls);\n $.when.apply($.when, promises).done(function(data) {\n success(data);\n }).fail(failure);\n }\n };\n});\n"],"file":"form-cohort-selector.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/form-course-selector.min.js.map b/lib/amd/build/form-course-selector.min.js.map
index 703de9c1630..0ff15339e05 100644
--- a/lib/amd/build/form-course-selector.min.js.map
+++ b/lib/amd/build/form-course-selector.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/form-course-selector.js"],"names":["define","ajax","$","processResults","selector","data","results","i","excludelist","split","courses","length","indexOf","id","push","value","label","displayname","transport","query","success","failure","el","requiredcapabilities","trim","limittoenrolled","includefrontpage","onlywithcompletion","promises","searchargs","criterianame","criteriavalue","page","perpage","calls","methodname","args","options","ids","call","when","apply","done","site","frontpage","pop","matches","fullname","toUpperCase","shortname","splice","fail"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Course selector adaptor for auto-complete form element.\n *\n * @module core/form-course-selector\n * @class form-course-selector\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['core/ajax', 'jquery'], function(ajax, $) {\n\n return /** @alias module:core/form-course-selector */ {\n // Public variables and functions.\n processResults: function(selector, data) {\n // Mangle the results into an array of objects.\n var results = [];\n var i = 0;\n var excludelist = String($(selector).data('exclude')).split(',');\n\n for (i = 0; i < data.courses.length; i++) {\n if (excludelist.indexOf(String(data.courses[i].id)) === -1) {\n results.push({value: data.courses[i].id, label: data.courses[i].displayname});\n }\n }\n return results;\n },\n\n transport: function(selector, query, success, failure) {\n var el = $(selector);\n\n // Parse some data-attributes from the form element.\n var requiredcapabilities = el.data('requiredcapabilities');\n if (requiredcapabilities.trim() !== \"\") {\n requiredcapabilities = requiredcapabilities.split(',');\n } else {\n requiredcapabilities = [];\n }\n\n var limittoenrolled = el.data('limittoenrolled');\n var includefrontpage = el.data('includefrontpage');\n var onlywithcompletion = el.data('onlywithcompletion');\n\n // Build the query.\n var promises = null;\n\n if (typeof query === \"undefined\") {\n query = '';\n }\n\n var searchargs = {\n criterianame: 'search',\n criteriavalue: query,\n page: 0,\n perpage: 100,\n requiredcapabilities: requiredcapabilities,\n limittoenrolled: limittoenrolled,\n onlywithcompletion: onlywithcompletion\n };\n\n var calls = [{\n methodname: 'core_course_search_courses', args: searchargs\n }];\n if (includefrontpage) {\n calls.push({\n methodname: 'core_course_get_courses',\n args: {\n options: {\n ids: [includefrontpage]\n }\n }\n });\n }\n\n // Go go go!\n promises = ajax.call(calls);\n $.when.apply($.when, promises).done(function(data, site) {\n if (site && site.length == 1) {\n var frontpage = site.pop();\n var matches = query === ''\n || frontpage.fullname.toUpperCase().indexOf(query.toUpperCase()) > -1\n || frontpage.shortname.toUpperCase().indexOf(query.toUpperCase()) > -1;\n if (matches) {\n data.courses.splice(0, 0, frontpage);\n }\n }\n success(data);\n }).fail(failure);\n }\n };\n});\n"],"file":"form-course-selector.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/form-course-selector.js"],"names":["define","ajax","$","processResults","selector","data","results","i","excludelist","split","courses","length","indexOf","id","push","value","label","displayname","transport","query","success","failure","el","requiredcapabilities","trim","limittoenrolled","includefrontpage","onlywithcompletion","promises","searchargs","criterianame","criteriavalue","page","perpage","calls","methodname","args","options","ids","call","when","apply","done","site","frontpage","pop","matches","fullname","toUpperCase","shortname","splice","fail"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Course selector adaptor for auto-complete form element.\n *\n * @module core/form-course-selector\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['core/ajax', 'jquery'], function(ajax, $) {\n\n return {\n // Public variables and functions.\n processResults: function(selector, data) {\n // Mangle the results into an array of objects.\n var results = [];\n var i = 0;\n var excludelist = String($(selector).data('exclude')).split(',');\n\n for (i = 0; i < data.courses.length; i++) {\n if (excludelist.indexOf(String(data.courses[i].id)) === -1) {\n results.push({value: data.courses[i].id, label: data.courses[i].displayname});\n }\n }\n return results;\n },\n\n transport: function(selector, query, success, failure) {\n var el = $(selector);\n\n // Parse some data-attributes from the form element.\n var requiredcapabilities = el.data('requiredcapabilities');\n if (requiredcapabilities.trim() !== \"\") {\n requiredcapabilities = requiredcapabilities.split(',');\n } else {\n requiredcapabilities = [];\n }\n\n var limittoenrolled = el.data('limittoenrolled');\n var includefrontpage = el.data('includefrontpage');\n var onlywithcompletion = el.data('onlywithcompletion');\n\n // Build the query.\n var promises = null;\n\n if (typeof query === \"undefined\") {\n query = '';\n }\n\n var searchargs = {\n criterianame: 'search',\n criteriavalue: query,\n page: 0,\n perpage: 100,\n requiredcapabilities: requiredcapabilities,\n limittoenrolled: limittoenrolled,\n onlywithcompletion: onlywithcompletion\n };\n\n var calls = [{\n methodname: 'core_course_search_courses', args: searchargs\n }];\n if (includefrontpage) {\n calls.push({\n methodname: 'core_course_get_courses',\n args: {\n options: {\n ids: [includefrontpage]\n }\n }\n });\n }\n\n // Go go go!\n promises = ajax.call(calls);\n $.when.apply($.when, promises).done(function(data, site) {\n if (site && site.length == 1) {\n var frontpage = site.pop();\n var matches = query === ''\n || frontpage.fullname.toUpperCase().indexOf(query.toUpperCase()) > -1\n || frontpage.shortname.toUpperCase().indexOf(query.toUpperCase()) > -1;\n if (matches) {\n data.courses.splice(0, 0, frontpage);\n }\n }\n success(data);\n }).fail(failure);\n }\n };\n});\n"],"file":"form-course-selector.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/fragment.min.js.map b/lib/amd/build/fragment.min.js.map
index b4e857f2f64..ef483c91d8e 100644
--- a/lib/amd/build/fragment.min.js.map
+++ b/lib/amd/build/fragment.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/fragment.js"],"names":["define","$","ajax","loadFragment","component","callback","contextid","params","formattedparams","index","push","name","value","call","methodname","args","processCollectedJavascript","js","jsNodes","allScript","each","scriptNode","tagName","prop","toLowerCase","attr","exists","s","encodeURI","text","promise","Deferred","then","data","resolve","html","javascript","fail","ex","reject"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A way to call HTML fragments to be inserted as required via JavaScript.\n *\n * @module core/fragment\n * @class fragment\n * @copyright 2016 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['jquery', 'core/ajax'], function($, ajax) {\n\n /**\n * Loads an HTML fragment through a callback.\n *\n * @method loadFragment\n * @param {string} component Component where callback is located.\n * @param {string} callback Callback function name.\n * @param {integer} contextid Context ID of the fragment.\n * @param {object} params Parameters for the callback.\n * @return {Promise} JQuery promise object resolved when the fragment has been loaded.\n */\n var loadFragment = function(component, callback, contextid, params) {\n // Change params into required webservice format.\n var formattedparams = [];\n for (var index in params) {\n formattedparams.push({\n name: index,\n value: params[index]\n });\n }\n\n return ajax.call([{\n methodname: 'core_get_fragment',\n args: {\n component: component,\n callback: callback,\n contextid: contextid,\n args: formattedparams\n }\n }])[0];\n };\n\n /**\n * Converts the JS that was received from collecting JS requirements on the $PAGE so it can be added to the existing page\n *\n * @param {string} js\n * @return {string}\n */\n var processCollectedJavascript = function(js) {\n var jsNodes = $(js);\n var allScript = '';\n jsNodes.each(function(index, scriptNode) {\n scriptNode = $(scriptNode);\n var tagName = scriptNode.prop('tagName');\n if (tagName && (tagName.toLowerCase() == 'script')) {\n if (scriptNode.attr('src')) {\n // We only reload the script if it was not loaded already.\n var exists = false;\n $('script').each(function(index, s) {\n if ($(s).attr('src') == scriptNode.attr('src')) {\n exists = true;\n }\n return !exists;\n });\n if (!exists) {\n allScript += ' { ';\n allScript += ' node = document.createElement(\"script\"); ';\n allScript += ' node.type = \"text/javascript\"; ';\n allScript += ' node.src = decodeURI(\"' + encodeURI(scriptNode.attr('src')) + '\"); ';\n allScript += ' document.getElementsByTagName(\"head\")[0].appendChild(node); ';\n allScript += ' } ';\n }\n } else {\n allScript += ' ' + scriptNode.text();\n }\n }\n });\n return allScript;\n };\n\n return /** @alias module:core/fragment */{\n /**\n * Appends HTML and JavaScript fragments to specified nodes.\n * Callbacks called by this AMD module are responsible for doing the appropriate security checks\n * to access the information that is returned. This only does minimal validation on the context.\n *\n * @method fragmentAppend\n * @param {string} component Component where callback is located.\n * @param {string} callback Callback function name.\n * @param {integer} contextid Context ID of the fragment.\n * @param {object} params Parameters for the callback.\n * @return {Deferred} new promise that is resolved with the html and js.\n */\n loadFragment: function(component, callback, contextid, params) {\n var promise = $.Deferred();\n loadFragment(component, callback, contextid, params).then(function(data) {\n promise.resolve(data.html, processCollectedJavascript(data.javascript));\n }).fail(function(ex) {\n promise.reject(ex);\n });\n return promise.promise();\n },\n\n /**\n * Converts the JS that was received from collecting JS requirements on the $PAGE so it can be added to the existing page\n *\n * @param {string} js\n * @return {string}\n */\n processCollectedJavascript: function(js) {\n return processCollectedJavascript(js);\n }\n };\n});\n"],"file":"fragment.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/fragment.js"],"names":["define","$","ajax","loadFragment","component","callback","contextid","params","formattedparams","index","push","name","value","call","methodname","args","processCollectedJavascript","js","jsNodes","allScript","each","scriptNode","tagName","prop","toLowerCase","attr","exists","s","encodeURI","text","promise","Deferred","then","data","resolve","html","javascript","fail","ex","reject"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A way to call HTML fragments to be inserted as required via JavaScript.\n *\n * @module core/fragment\n * @copyright 2016 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['jquery', 'core/ajax'], function($, ajax) {\n\n /**\n * Loads an HTML fragment through a callback.\n *\n * @method loadFragment\n * @param {string} component Component where callback is located.\n * @param {string} callback Callback function name.\n * @param {integer} contextid Context ID of the fragment.\n * @param {object} params Parameters for the callback.\n * @return {Promise} JQuery promise object resolved when the fragment has been loaded.\n */\n var loadFragment = function(component, callback, contextid, params) {\n // Change params into required webservice format.\n var formattedparams = [];\n for (var index in params) {\n formattedparams.push({\n name: index,\n value: params[index]\n });\n }\n\n return ajax.call([{\n methodname: 'core_get_fragment',\n args: {\n component: component,\n callback: callback,\n contextid: contextid,\n args: formattedparams\n }\n }])[0];\n };\n\n /**\n * Converts the JS that was received from collecting JS requirements on the $PAGE so it can be added to the existing page\n *\n * @param {string} js\n * @return {string}\n */\n var processCollectedJavascript = function(js) {\n var jsNodes = $(js);\n var allScript = '';\n jsNodes.each(function(index, scriptNode) {\n scriptNode = $(scriptNode);\n var tagName = scriptNode.prop('tagName');\n if (tagName && (tagName.toLowerCase() == 'script')) {\n if (scriptNode.attr('src')) {\n // We only reload the script if it was not loaded already.\n var exists = false;\n $('script').each(function(index, s) {\n if ($(s).attr('src') == scriptNode.attr('src')) {\n exists = true;\n }\n return !exists;\n });\n if (!exists) {\n allScript += ' { ';\n allScript += ' node = document.createElement(\"script\"); ';\n allScript += ' node.type = \"text/javascript\"; ';\n allScript += ' node.src = decodeURI(\"' + encodeURI(scriptNode.attr('src')) + '\"); ';\n allScript += ' document.getElementsByTagName(\"head\")[0].appendChild(node); ';\n allScript += ' } ';\n }\n } else {\n allScript += ' ' + scriptNode.text();\n }\n }\n });\n return allScript;\n };\n\n return {\n /**\n * Appends HTML and JavaScript fragments to specified nodes.\n * Callbacks called by this AMD module are responsible for doing the appropriate security checks\n * to access the information that is returned. This only does minimal validation on the context.\n *\n * @method fragmentAppend\n * @param {string} component Component where callback is located.\n * @param {string} callback Callback function name.\n * @param {integer} contextid Context ID of the fragment.\n * @param {object} params Parameters for the callback.\n * @return {Deferred} new promise that is resolved with the html and js.\n */\n loadFragment: function(component, callback, contextid, params) {\n var promise = $.Deferred();\n loadFragment(component, callback, contextid, params).then(function(data) {\n promise.resolve(data.html, processCollectedJavascript(data.javascript));\n }).fail(function(ex) {\n promise.reject(ex);\n });\n return promise.promise();\n },\n\n /**\n * Converts the JS that was received from collecting JS requirements on the $PAGE so it can be added to the existing page\n *\n * @param {string} js\n * @return {string}\n */\n processCollectedJavascript: function(js) {\n return processCollectedJavascript(js);\n }\n };\n});\n"],"file":"fragment.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/fullscreen.min.js.map b/lib/amd/build/fullscreen.min.js.map
index 696dbe08a15..e2e5132ca3c 100644
--- a/lib/amd/build/fullscreen.min.js.map
+++ b/lib/amd/build/fullscreen.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/fullscreen.js"],"names":["getElement","element","document","fullscreenElement","mozFullscreenElement","msFullscreenElement","webkitFullscreenElement"],"mappings":"iJA8B0B,QAAbA,CAAAA,UAAa,EAAM,CAC5B,GAAIC,CAAAA,CAAO,CAAG,IAAd,CACA,GAAIC,QAAQ,CAACC,iBAAb,CAAgC,CAC5BF,CAAO,CAAGC,QAAQ,CAACC,iBACtB,CAFD,IAEO,IAAID,QAAQ,CAACE,oBAAb,CAAmC,CAEtCH,CAAO,CAAGC,QAAQ,CAACE,oBACtB,CAHM,IAGA,IAAIF,QAAQ,CAACG,mBAAb,CAAkC,CAErCJ,CAAO,CAAGC,QAAQ,CAACG,mBACtB,CAHM,IAGA,IAAIH,QAAQ,CAACI,uBAAb,CAAsC,CAEzCL,CAAO,CAAGC,QAAQ,CAACI,uBACtB,CAED,MAAOL,CAAAA,CACV,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Detects if an element is fullscreen.\n *\n * @module core/fullscreen\n * @class fullscreen\n * @copyright 2020 University of Nottingham\n * @author Neill Magill \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Gets the element that is fullscreen or null if no element is fullscreen.\n *\n * @returns {HTMLElement}\n */\nexport const getElement = () => {\n let element = null;\n if (document.fullscreenElement) {\n element = document.fullscreenElement;\n } else if (document.mozFullscreenElement) {\n // Fallback for older Firefox.\n element = document.mozFullscreenElement;\n } else if (document.msFullscreenElement) {\n // Fallback for Edge and IE.\n element = document.msFullscreenElement;\n } else if (document.webkitFullscreenElement) {\n // Fallback for Chrome, Edge and Safari.\n element = document.webkitFullscreenElement;\n }\n\n return element;\n};\n"],"file":"fullscreen.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/fullscreen.js"],"names":["getElement","element","document","fullscreenElement","mozFullscreenElement","msFullscreenElement","webkitFullscreenElement"],"mappings":"iJA8B0B,QAAbA,CAAAA,UAAa,EAAM,CAC5B,GAAIC,CAAAA,CAAO,CAAG,IAAd,CACA,GAAIC,QAAQ,CAACC,iBAAb,CAAgC,CAC5BF,CAAO,CAAGC,QAAQ,CAACC,iBACtB,CAFD,IAEO,IAAID,QAAQ,CAACE,oBAAb,CAAmC,CAEtCH,CAAO,CAAGC,QAAQ,CAACE,oBACtB,CAHM,IAGA,IAAIF,QAAQ,CAACG,mBAAb,CAAkC,CAErCJ,CAAO,CAAGC,QAAQ,CAACG,mBACtB,CAHM,IAGA,IAAIH,QAAQ,CAACI,uBAAb,CAAsC,CAEzCL,CAAO,CAAGC,QAAQ,CAACI,uBACtB,CAED,MAAOL,CAAAA,CACV,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Detects if an element is fullscreen.\n *\n * @module core/fullscreen\n * @copyright 2020 University of Nottingham\n * @author Neill Magill \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Gets the element that is fullscreen or null if no element is fullscreen.\n *\n * @method\n * @returns {HTMLElement}\n */\nexport const getElement = () => {\n let element = null;\n if (document.fullscreenElement) {\n element = document.fullscreenElement;\n } else if (document.mozFullscreenElement) {\n // Fallback for older Firefox.\n element = document.mozFullscreenElement;\n } else if (document.msFullscreenElement) {\n // Fallback for Edge and IE.\n element = document.msFullscreenElement;\n } else if (document.webkitFullscreenElement) {\n // Fallback for Chrome, Edge and Safari.\n element = document.webkitFullscreenElement;\n }\n\n return element;\n};\n"],"file":"fullscreen.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/icon_system.min.js.map b/lib/amd/build/icon_system.min.js.map
index 2cd22824755..bd9050eb469 100644
--- a/lib/amd/build/icon_system.min.js.map
+++ b/lib/amd/build/icon_system.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/icon_system.js"],"names":["define","$","IconSystem","prototype","init","when","renderIcon","Error","getTemplateName"],"mappings":"AAsBAA,OAAM,oBAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAO3B,GAAIC,CAAAA,CAAU,CAAG,UAAW,CAC3B,CADD,CASAA,CAAU,CAACC,SAAX,CAAqBC,IAArB,CAA4B,UAAW,CACnC,MAAOH,CAAAA,CAAC,CAACI,IAAF,CAAO,IAAP,CACV,CAFD,CAoBAH,CAAU,CAACC,SAAX,CAAqBG,UAArB,CAAkC,UAA0C,CACxE,KAAM,IAAIC,CAAAA,KAAJ,CAAU,oCAAV,CACT,CAFD,CAUAL,CAAU,CAACC,SAAX,CAAqBK,eAArB,CAAuC,UAAW,CAC9C,KAAM,IAAID,CAAAA,KAAJ,CAAU,oCAAV,CACT,CAFD,CAIA,MAA6CL,CAAAA,CAChD,CAnDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Icon System base module.\n *\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * Icon System abstract class.\n *\n * Any icon system needs to define a module extending this one and return this module name from the php icon_system class.\n */\n var IconSystem = function() {\n };\n\n /**\n * Initialise the icon system.\n *\n * @return {Promise}\n * @method init\n */\n IconSystem.prototype.init = function() {\n return $.when(this);\n };\n\n /**\n * Render an icon.\n *\n * The key, component and title come from either the pix mustache helper tag, or the call to templates.renderIcon.\n * The template is the pre-loaded template string matching the template from getTemplateName() in this class.\n * This function must return a string (not a promise) because it is used during the internal rendering of the mustache\n * template (which is unfortunately synchronous). To render the mustache template in this function call\n * core/mustache.render() directly and do not use any partials, blocks or helper functions in the template.\n *\n * @param {String} key\n * @param {String} component\n * @param {String} title\n * @param {String} template\n * @return {String}\n * @method renderIcon\n */\n IconSystem.prototype.renderIcon = function(key, component, title, template) { // eslint-disable-line no-unused-vars\n throw new Error('Abstract function not implemented.');\n };\n\n /**\n * getTemplateName\n *\n * @return {String}\n * @method getTemplateName\n */\n IconSystem.prototype.getTemplateName = function() {\n throw new Error('Abstract function not implemented.');\n };\n\n return /** @alias module:core/icon_system */ IconSystem;\n});\n"],"file":"icon_system.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/icon_system.js"],"names":["define","$","IconSystem","prototype","init","when","renderIcon","Error","getTemplateName"],"mappings":"AAuBAA,OAAM,oBAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAS3B,GAAIC,CAAAA,CAAU,CAAG,UAAW,CAC3B,CADD,CASAA,CAAU,CAACC,SAAX,CAAqBC,IAArB,CAA4B,UAAW,CACnC,MAAOH,CAAAA,CAAC,CAACI,IAAF,CAAO,IAAP,CACV,CAFD,CAoBAH,CAAU,CAACC,SAAX,CAAqBG,UAArB,CAAkC,UAA0C,CACxE,KAAM,IAAIC,CAAAA,KAAJ,CAAU,oCAAV,CACT,CAFD,CAUAL,CAAU,CAACC,SAAX,CAAqBK,eAArB,CAAuC,UAAW,CAC9C,KAAM,IAAID,CAAAA,KAAJ,CAAU,oCAAV,CACT,CAFD,CAIA,MAA6CL,CAAAA,CAChD,CArDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Icon System base module.\n *\n * @module core/icon_system\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * Icon System abstract class.\n *\n * Any icon system needs to define a module extending this one and return this module name from the php icon_system class.\n *\n * @class core/icon_system\n */\n var IconSystem = function() {\n };\n\n /**\n * Initialise the icon system.\n *\n * @return {Promise}\n * @method init\n */\n IconSystem.prototype.init = function() {\n return $.when(this);\n };\n\n /**\n * Render an icon.\n *\n * The key, component and title come from either the pix mustache helper tag, or the call to templates.renderIcon.\n * The template is the pre-loaded template string matching the template from getTemplateName() in this class.\n * This function must return a string (not a promise) because it is used during the internal rendering of the mustache\n * template (which is unfortunately synchronous). To render the mustache template in this function call\n * core/mustache.render() directly and do not use any partials, blocks or helper functions in the template.\n *\n * @param {String} key\n * @param {String} component\n * @param {String} title\n * @param {String} template\n * @return {String}\n * @method renderIcon\n */\n IconSystem.prototype.renderIcon = function(key, component, title, template) { // eslint-disable-line no-unused-vars\n throw new Error('Abstract function not implemented.');\n };\n\n /**\n * getTemplateName\n *\n * @return {String}\n * @method getTemplateName\n */\n IconSystem.prototype.getTemplateName = function() {\n throw new Error('Abstract function not implemented.');\n };\n\n return /** @alias module:core/icon_system */ IconSystem;\n});\n"],"file":"icon_system.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/icon_system_fontawesome.min.js.map b/lib/amd/build/icon_system_fontawesome.min.js.map
index 3c310293342..551f4deb05e 100644
--- a/lib/amd/build/icon_system_fontawesome.min.js.map
+++ b/lib/amd/build/icon_system_fontawesome.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/icon_system_fontawesome.js"],"names":["define","IconSystem","$","Ajax","Mustache","LocalStorage","Url","staticMap","fetchMap","IconSystemFontawesome","apply","arguments","prototype","Object","create","init","currTheme","M","cfg","theme","when","map","get","JSON","parse","call","methodname","args","themename","themerev","then","each","index","value","component","pix","to","set","stringify","bind","renderIcon","key","title","template","mappedIcon","unmappedIcon","url","imageUrl","attributes","name","context","alt","result","render","trim","getTemplateName"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Competency rule points module.\n *\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['core/icon_system', 'jquery', 'core/ajax', 'core/mustache', 'core/localstorage', 'core/url'],\n function(IconSystem, $, Ajax, Mustache, LocalStorage, Url) {\n\n var staticMap = null;\n var fetchMap = null;\n\n /**\n * IconSystemFontawesome\n */\n var IconSystemFontawesome = function() {\n IconSystem.apply(this, arguments);\n };\n IconSystemFontawesome.prototype = Object.create(IconSystem.prototype);\n\n /**\n * Prefetch resources so later calls to renderIcon can be resolved synchronously.\n *\n * @method init\n * @return {Promise}\n */\n IconSystemFontawesome.prototype.init = function() {\n var currTheme = M.cfg.theme;\n\n if (staticMap) {\n return $.when(this);\n }\n\n var map = LocalStorage.get('core_iconsystem/theme/' + currTheme + '/core/iconmap-fontawesome');\n if (map) {\n map = JSON.parse(map);\n }\n\n if (map) {\n staticMap = map;\n return $.when(this);\n }\n\n if (fetchMap === null) {\n fetchMap = Ajax.call([{\n methodname: 'core_output_load_fontawesome_icon_system_map',\n args: {\n themename: M.cfg.theme,\n },\n }], true, false, false, 0, M.cfg.themerev)[0];\n }\n\n return fetchMap.then(function(map) {\n staticMap = {};\n $.each(map, function(index, value) {\n staticMap[value.component + '/' + value.pix] = value.to;\n });\n LocalStorage.set('core_iconsystem/theme/' + currTheme + '/core/iconmap-fontawesome', JSON.stringify(staticMap));\n return this;\n }.bind(this));\n };\n\n /**\n * Render an icon.\n *\n * @param {String} key\n * @param {String} component\n * @param {String} title\n * @param {String} template\n * @return {String}\n * @method renderIcon\n */\n IconSystemFontawesome.prototype.renderIcon = function(key, component, title, template) {\n var mappedIcon = staticMap[component + '/' + key];\n var unmappedIcon = false;\n if (typeof mappedIcon === \"undefined\") {\n var url = Url.imageUrl(key, component);\n\n unmappedIcon = {\n attributes: [\n {name: 'src', value: url},\n {name: 'alt', value: title},\n {name: 'title', value: title}\n ]\n };\n }\n\n var context = {\n key: mappedIcon,\n title: title,\n alt: title,\n unmappedIcon: unmappedIcon\n };\n\n if (typeof title === \"undefined\" || title === '') {\n context['aria-hidden'] = true;\n }\n\n var result = Mustache.render(template, context);\n return result.trim();\n };\n\n /**\n * Get the name of the template to pre-cache for this icon system.\n *\n * @return {String}\n * @method getTemplateName\n */\n IconSystemFontawesome.prototype.getTemplateName = function() {\n return 'core/pix_icon_fontawesome';\n };\n\n return /** @alias module:core/icon_system_fontawesome */ IconSystemFontawesome;\n\n});\n"],"file":"icon_system_fontawesome.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/icon_system_fontawesome.js"],"names":["define","IconSystem","$","Ajax","Mustache","LocalStorage","Url","staticMap","fetchMap","IconSystemFontawesome","apply","arguments","prototype","Object","create","init","currTheme","M","cfg","theme","when","map","get","JSON","parse","call","methodname","args","themename","themerev","then","each","index","value","component","pix","to","set","stringify","bind","renderIcon","key","title","template","mappedIcon","unmappedIcon","url","imageUrl","attributes","name","context","alt","result","render","trim","getTemplateName"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Competency rule points module.\n *\n * @module core/icon_system_fontawesome\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['core/icon_system', 'jquery', 'core/ajax', 'core/mustache', 'core/localstorage', 'core/url'],\n function(IconSystem, $, Ajax, Mustache, LocalStorage, Url) {\n\n var staticMap = null;\n var fetchMap = null;\n\n /**\n * IconSystemFontawesome\n * @class core/icon_system_fontawesome\n */\n var IconSystemFontawesome = function() {\n IconSystem.apply(this, arguments);\n };\n IconSystemFontawesome.prototype = Object.create(IconSystem.prototype);\n\n /**\n * Prefetch resources so later calls to renderIcon can be resolved synchronously.\n *\n * @method init\n * @return {Promise}\n */\n IconSystemFontawesome.prototype.init = function() {\n var currTheme = M.cfg.theme;\n\n if (staticMap) {\n return $.when(this);\n }\n\n var map = LocalStorage.get('core_iconsystem/theme/' + currTheme + '/core/iconmap-fontawesome');\n if (map) {\n map = JSON.parse(map);\n }\n\n if (map) {\n staticMap = map;\n return $.when(this);\n }\n\n if (fetchMap === null) {\n fetchMap = Ajax.call([{\n methodname: 'core_output_load_fontawesome_icon_system_map',\n args: {\n themename: M.cfg.theme,\n },\n }], true, false, false, 0, M.cfg.themerev)[0];\n }\n\n return fetchMap.then(function(map) {\n staticMap = {};\n $.each(map, function(index, value) {\n staticMap[value.component + '/' + value.pix] = value.to;\n });\n LocalStorage.set('core_iconsystem/theme/' + currTheme + '/core/iconmap-fontawesome', JSON.stringify(staticMap));\n return this;\n }.bind(this));\n };\n\n /**\n * Render an icon.\n *\n * @param {String} key\n * @param {String} component\n * @param {String} title\n * @param {String} template\n * @return {String}\n * @method renderIcon\n */\n IconSystemFontawesome.prototype.renderIcon = function(key, component, title, template) {\n var mappedIcon = staticMap[component + '/' + key];\n var unmappedIcon = false;\n if (typeof mappedIcon === \"undefined\") {\n var url = Url.imageUrl(key, component);\n\n unmappedIcon = {\n attributes: [\n {name: 'src', value: url},\n {name: 'alt', value: title},\n {name: 'title', value: title}\n ]\n };\n }\n\n var context = {\n key: mappedIcon,\n title: title,\n alt: title,\n unmappedIcon: unmappedIcon\n };\n\n if (typeof title === \"undefined\" || title === '') {\n context['aria-hidden'] = true;\n }\n\n var result = Mustache.render(template, context);\n return result.trim();\n };\n\n /**\n * Get the name of the template to pre-cache for this icon system.\n *\n * @return {String}\n * @method getTemplateName\n */\n IconSystemFontawesome.prototype.getTemplateName = function() {\n return 'core/pix_icon_fontawesome';\n };\n\n return /** @alias module:core/icon_system_fontawesome */ IconSystemFontawesome;\n\n});\n"],"file":"icon_system_fontawesome.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/icon_system_standard.min.js.map b/lib/amd/build/icon_system_standard.min.js.map
index 79e08a2fd5e..f3d0db73ead 100644
--- a/lib/amd/build/icon_system_standard.min.js.map
+++ b/lib/amd/build/icon_system_standard.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/icon_system_standard.js"],"names":["define","IconSystem","CoreUrl","Mustache","IconSystemStandard","apply","arguments","prototype","Object","create","renderIcon","key","component","title","template","url","imageUrl","templatecontext","attributes","name","value","push","result","render","trim","getTemplateName"],"mappings":"AAsBAA,OAAM,6BAAC,CAAC,kBAAD,CAAqB,UAArB,CAAiC,eAAjC,CAAD,CACE,SAASC,CAAT,CAAqBC,CAArB,CAA8BC,CAA9B,CAAwC,CAK5C,GAAIC,CAAAA,CAAkB,CAAG,UAAW,CAChCH,CAAU,CAACI,KAAX,CAAiB,IAAjB,CAAuBC,SAAvB,CACH,CAFD,CAGAF,CAAkB,CAACG,SAAnB,CAA+BC,MAAM,CAACC,MAAP,CAAcR,CAAU,CAACM,SAAzB,CAA/B,CAYAH,CAAkB,CAACG,SAAnB,CAA6BG,UAA7B,CAA0C,SAASC,CAAT,CAAcC,CAAd,CAAyBC,CAAzB,CAAgCC,CAAhC,CAA0C,IAC5EC,CAAAA,CAAG,CAAGb,CAAO,CAACc,QAAR,CAAiBL,CAAjB,CAAsBC,CAAtB,CADsE,CAG5EK,CAAe,CAAG,CAClBC,UAAU,CAAE,CACR,CAACC,IAAI,CAAE,KAAP,CAAcC,KAAK,CAAEL,CAArB,CADQ,CAER,CAACI,IAAI,CAAE,KAAP,CAAcC,KAAK,CAAEP,CAArB,CAFQ,CAGR,CAACM,IAAI,CAAE,OAAP,CAAgBC,KAAK,CAAEP,CAAvB,CAHQ,CADM,CAH0D,CAUhF,GAAqB,WAAjB,QAAOA,CAAAA,CAAP,EAAyC,EAAT,EAAAA,CAApC,CAAiD,CAC7CI,CAAe,CAACC,UAAhB,CAA2BG,IAA3B,CAAgC,CAACF,IAAI,CAAE,aAAP,CAAsBC,KAAK,CAAE,MAA7B,CAAhC,CACH,CAED,GAAIE,CAAAA,CAAM,CAAGnB,CAAQ,CAACoB,MAAT,CAAgBT,CAAhB,CAA0BG,CAA1B,CAAb,CACA,MAAOK,CAAAA,CAAM,CAACE,IAAP,EACV,CAhBD,CAwBApB,CAAkB,CAACG,SAAnB,CAA6BkB,eAA7B,CAA+C,UAAW,CACtD,MAAO,eACV,CAFD,CAIA,MAAsDrB,CAAAA,CAEzD,CAnDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Competency rule points module.\n *\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['core/icon_system', 'core/url', 'core/mustache'],\n function(IconSystem, CoreUrl, Mustache) {\n\n /**\n * IconSystemStandard\n */\n var IconSystemStandard = function() {\n IconSystem.apply(this, arguments);\n };\n IconSystemStandard.prototype = Object.create(IconSystem.prototype);\n\n /**\n * Render an icon.\n *\n * @param {String} key\n * @param {String} component\n * @param {String} title\n * @param {String} template\n * @return {String}\n * @method renderIcon\n */\n IconSystemStandard.prototype.renderIcon = function(key, component, title, template) {\n var url = CoreUrl.imageUrl(key, component);\n\n var templatecontext = {\n attributes: [\n {name: 'src', value: url},\n {name: 'alt', value: title},\n {name: 'title', value: title}\n ]\n };\n if (typeof title === \"undefined\" || title == \"\") {\n templatecontext.attributes.push({name: 'aria-hidden', value: 'true'});\n }\n\n var result = Mustache.render(template, templatecontext);\n return result.trim();\n };\n\n /**\n * Get the name of the template to pre-cache for this icon system.\n *\n * @return {String}\n * @method getTemplateName\n */\n IconSystemStandard.prototype.getTemplateName = function() {\n return 'core/pix_icon';\n };\n\n return /** @alias module:core/icon_system_standard */ IconSystemStandard;\n\n});\n"],"file":"icon_system_standard.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/icon_system_standard.js"],"names":["define","IconSystem","CoreUrl","Mustache","IconSystemStandard","apply","arguments","prototype","Object","create","renderIcon","key","component","title","template","url","imageUrl","templatecontext","attributes","name","value","push","result","render","trim","getTemplateName"],"mappings":"AAuBAA,OAAM,6BAAC,CAAC,kBAAD,CAAqB,UAArB,CAAiC,eAAjC,CAAD,CACE,SAASC,CAAT,CAAqBC,CAArB,CAA8BC,CAA9B,CAAwC,CAO5C,GAAIC,CAAAA,CAAkB,CAAG,UAAW,CAChCH,CAAU,CAACI,KAAX,CAAiB,IAAjB,CAAuBC,SAAvB,CACH,CAFD,CAGAF,CAAkB,CAACG,SAAnB,CAA+BC,MAAM,CAACC,MAAP,CAAcR,CAAU,CAACM,SAAzB,CAA/B,CAYAH,CAAkB,CAACG,SAAnB,CAA6BG,UAA7B,CAA0C,SAASC,CAAT,CAAcC,CAAd,CAAyBC,CAAzB,CAAgCC,CAAhC,CAA0C,IAC5EC,CAAAA,CAAG,CAAGb,CAAO,CAACc,QAAR,CAAiBL,CAAjB,CAAsBC,CAAtB,CADsE,CAG5EK,CAAe,CAAG,CAClBC,UAAU,CAAE,CACR,CAACC,IAAI,CAAE,KAAP,CAAcC,KAAK,CAAEL,CAArB,CADQ,CAER,CAACI,IAAI,CAAE,KAAP,CAAcC,KAAK,CAAEP,CAArB,CAFQ,CAGR,CAACM,IAAI,CAAE,OAAP,CAAgBC,KAAK,CAAEP,CAAvB,CAHQ,CADM,CAH0D,CAUhF,GAAqB,WAAjB,QAAOA,CAAAA,CAAP,EAAyC,EAAT,EAAAA,CAApC,CAAiD,CAC7CI,CAAe,CAACC,UAAhB,CAA2BG,IAA3B,CAAgC,CAACF,IAAI,CAAE,aAAP,CAAsBC,KAAK,CAAE,MAA7B,CAAhC,CACH,CAED,GAAIE,CAAAA,CAAM,CAAGnB,CAAQ,CAACoB,MAAT,CAAgBT,CAAhB,CAA0BG,CAA1B,CAAb,CACA,MAAOK,CAAAA,CAAM,CAACE,IAAP,EACV,CAhBD,CAwBApB,CAAkB,CAACG,SAAnB,CAA6BkB,eAA7B,CAA+C,UAAW,CACtD,MAAO,eACV,CAFD,CAIA,MAAOrB,CAAAA,CACV,CApDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Competency rule points module.\n *\n * @module core/icon_system_standard\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['core/icon_system', 'core/url', 'core/mustache'],\n function(IconSystem, CoreUrl, Mustache) {\n\n /**\n * IconSystemStandard\n *\n * @class core/icon_system_standard\n */\n var IconSystemStandard = function() {\n IconSystem.apply(this, arguments);\n };\n IconSystemStandard.prototype = Object.create(IconSystem.prototype);\n\n /**\n * Render an icon.\n *\n * @method renderIcon\n * @param {String} key\n * @param {String} component\n * @param {String} title\n * @param {String} template\n * @return {String}\n */\n IconSystemStandard.prototype.renderIcon = function(key, component, title, template) {\n var url = CoreUrl.imageUrl(key, component);\n\n var templatecontext = {\n attributes: [\n {name: 'src', value: url},\n {name: 'alt', value: title},\n {name: 'title', value: title}\n ]\n };\n if (typeof title === \"undefined\" || title == \"\") {\n templatecontext.attributes.push({name: 'aria-hidden', value: 'true'});\n }\n\n var result = Mustache.render(template, templatecontext);\n return result.trim();\n };\n\n /**\n * Get the name of the template to pre-cache for this icon system.\n *\n * @return {String}\n * @method getTemplateName\n */\n IconSystemStandard.prototype.getTemplateName = function() {\n return 'core/pix_icon';\n };\n\n return IconSystemStandard;\n});\n"],"file":"icon_system_standard.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/key_codes.min.js.map b/lib/amd/build/key_codes.min.js.map
index c3cbf31afd2..c1427385ec8 100644
--- a/lib/amd/build/key_codes.min.js.map
+++ b/lib/amd/build/key_codes.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/key_codes.js"],"names":["define"],"mappings":"AAwBAA,OAAM,kBAAC,UAAW,CAEd,MAA2C,CACvC,IAAO,CADgC,CAEvC,MAAS,EAF8B,CAGvC,MAAS,EAH8B,CAIvC,KAAQ,EAJ+B,CAKvC,IAAO,EALgC,CAMvC,OAAU,EAN6B,CAOvC,MAAS,EAP8B,CAQvC,IAAO,EARgC,CASvC,KAAQ,EAT+B,CAUvC,UAAa,EAV0B,CAWvC,QAAW,EAX4B,CAYvC,WAAc,EAZyB,CAavC,UAAa,EAb0B,CAcvC,EAAK,EAdkC,CAevC,QAAW,GAf4B,CAgBvC,OAAU,EAhB6B,CAiBvC,SAAY,EAjB2B,CAmB9C,CArBK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A list of human readable names for the keycodes.\n *\n * @module core/key_codes\n * @class key_codes\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(function() {\n\n return /** @alias module:core/key_codes */ {\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'ctrl': 17,\n 'alt': 18,\n 'escape': 27,\n 'space': 32,\n 'end': 35,\n 'home': 36,\n 'arrowLeft': 37,\n 'arrowUp': 38,\n 'arrowRight': 39,\n 'arrowDown': 40,\n '8': 56,\n 'asterix': 106,\n 'pageUp': 33,\n 'pageDown': 34,\n };\n});\n"],"file":"key_codes.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/key_codes.js"],"names":["define"],"mappings":"AAwBAA,OAAM,kBAAC,UAAW,CAId,MAAO,CACH,IAAO,CADJ,CAEH,MAAS,EAFN,CAGH,MAAS,EAHN,CAIH,KAAQ,EAJL,CAKH,IAAO,EALJ,CAMH,OAAU,EANP,CAOH,MAAS,EAPN,CAQH,IAAO,EARJ,CASH,KAAQ,EATL,CAUH,UAAa,EAVV,CAWH,QAAW,EAXR,CAYH,WAAc,EAZX,CAaH,UAAa,EAbV,CAcH,EAAK,EAdF,CAeH,QAAW,GAfR,CAgBH,OAAU,EAhBP,CAiBH,SAAY,EAjBT,CAmBV,CAvBK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A list of human readable names for the keycodes.\n *\n * @module core/key_codes\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\n\ndefine(function() {\n /**\n * @type {object}\n */\n return {\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'ctrl': 17,\n 'alt': 18,\n 'escape': 27,\n 'space': 32,\n 'end': 35,\n 'home': 36,\n 'arrowLeft': 37,\n 'arrowUp': 38,\n 'arrowRight': 39,\n 'arrowDown': 40,\n '8': 56,\n 'asterix': 106,\n 'pageUp': 33,\n 'pageDown': 34,\n };\n});\n"],"file":"key_codes.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/local/aria/aria-hidden.min.js.map b/lib/amd/build/local/aria/aria-hidden.min.js.map
index f5a90804961..35400961862 100644
--- a/lib/amd/build/local/aria/aria-hidden.min.js.map
+++ b/lib/amd/build/local/aria/aria-hidden.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../src/local/aria/aria-hidden.js"],"names":["childObserverMap","Map","siblingObserverMap","supportsMutationObservers","MutationObserver","disableElementFocusability","target","HTMLElement","matches","Selectors","elements","focusable","disableAndStoreTabIndex","querySelectorAll","forEach","element","dataset","ariaHiddenTabIndex","getAttribute","setAttribute","enableElementFocusability","focusableToUnhide","restoreTabIndex","closest","aria","hidden","oldTabIndex","removeAttribute","hide","_hide","newNodeObserver","mutationList","mutation","addedNodes","observe","childList","subtree","set","unhide","_unhide","has","get","disconnect","delete","hideSiblings","_hideSiblings","parentElement","childNodes","node","contains","unhideSiblings","_unhideSiblings"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * ARIA helpers related to the aria-hidden attribute.\n *\n * @module core/local/aria/aria-hidden.\n * @class aria\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {getList} from 'core/normalise';\nimport Selectors from './selectors';\n\n// The map of MutationObserver objects for an object.\nconst childObserverMap = new Map();\nconst siblingObserverMap = new Map();\n\n/**\n * Determine whether the browser supports the MutationObserver system.\n *\n * @returns {Bool}\n */\nconst supportsMutationObservers = () => (MutationObserver && typeof MutationObserver === 'function');\n\n/**\n * Disable element focusability, disabling the tabindex for child elements which are normally focusable.\n *\n * @param {HTMLElement} target\n */\nconst disableElementFocusability = target => {\n if (!(target instanceof HTMLElement)) {\n // This element is not an HTMLElement.\n // This can happen for Text Nodes.\n return;\n }\n\n if (target.matches(Selectors.elements.focusable)) {\n disableAndStoreTabIndex(target);\n }\n\n target.querySelectorAll(Selectors.elements.focusable).forEach(disableAndStoreTabIndex);\n};\n\n/**\n * Remove the current tab-index and store it for later restoration.\n *\n * @param {HTMLElement} element\n */\nconst disableAndStoreTabIndex = element => {\n if (typeof element.dataset.ariaHiddenTabIndex !== 'undefined') {\n // This child already has a hidden attribute.\n // Do not modify it as the original value will be lost.\n return;\n }\n\n // Store the old tabindex in a data attribute.\n if (element.getAttribute('tabindex')) {\n element.dataset.ariaHiddenTabIndex = element.getAttribute('tabindex');\n } else {\n element.dataset.ariaHiddenTabIndex = '';\n }\n element.setAttribute('tabindex', -1);\n};\n\n/**\n * Re-enable element focusability, restoring any tabindex.\n *\n * @param {HTMLElement} target\n */\nconst enableElementFocusability = target => {\n if (!(target instanceof HTMLElement)) {\n // This element is not an HTMLElement.\n // This can happen for Text Nodes.\n return;\n }\n\n if (target.matches(Selectors.elements.focusableToUnhide)) {\n restoreTabIndex(target);\n }\n\n target.querySelectorAll(Selectors.elements.focusableToUnhide).forEach(restoreTabIndex);\n};\n\n/**\n * Restore the tab-index of the supplied element.\n *\n * When disabling focusability the current tab-index is stored in the ariaHiddenTabIndex data attribute.\n * This is used to restore the tab-index, but only whilst the parent nodes remain unhidden.\n *\n * @param {HTMLElement} element\n */\nconst restoreTabIndex = element => {\n if (element.closest(Selectors.aria.hidden)) {\n // This item still has a hidden parent, or is hidden itself. Do not unhide it.\n return;\n }\n\n const oldTabIndex = element.dataset.ariaHiddenTabIndex;\n if (oldTabIndex === '') {\n element.removeAttribute('tabindex');\n } else {\n element.setAttribute('tabindex', oldTabIndex);\n }\n\n delete element.dataset.ariaHiddenTabIndex;\n};\n\n/**\n * Update the supplied DOM Module to be hidden.\n *\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const hide = target => getList(target).forEach(_hide);\n\nconst _hide = target => {\n if (!(target instanceof HTMLElement)) {\n // This element is not an HTMLElement.\n // This can happen for Text Nodes.\n return;\n }\n\n if (target.closest(Selectors.aria.hidden)) {\n // This Element, or a parent Element, is already hidden.\n // Stop processing.\n return;\n }\n\n // Set the aria-hidden attribute to true.\n target.setAttribute('aria-hidden', true);\n\n // Based on advice from https://dequeuniversity.com/rules/axe/3.3/aria-hidden-focus, upon setting the aria-hidden\n // attribute, all focusable elements underneath that element should be modified such that they are not focusable.\n disableElementFocusability(target);\n\n if (supportsMutationObservers()) {\n // Add a MutationObserver to check for new children to the tree.\n const newNodeObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n mutation.addedNodes.forEach(disableElementFocusability);\n });\n });\n\n newNodeObserver.observe(target, {childList: true, subtree: true});\n childObserverMap.set(target, newNodeObserver);\n }\n};\n\n/**\n * Reverse the effect of the hide action.\n *\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const unhide = target => getList(target).forEach(_unhide);\n\nconst _unhide = target => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Note: The aria-hidden attribute should be removed, and not set to false.\n // The presence of the attribute is sufficient for some browsers to treat it as being true, regardless of its value.\n target.removeAttribute('aria-hidden');\n\n // Restore the tabindex across all child nodes of the target.\n enableElementFocusability(target);\n\n // Remove the focusability MutationObserver watching this tree.\n if (childObserverMap.has(target)) {\n childObserverMap.get(target).disconnect();\n childObserverMap.delete(target);\n }\n};\n\n/**\n * Correctly mark all siblings of the supplied target Element as hidden.\n *\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const hideSiblings = target => getList(target).forEach(_hideSiblings);\n\nconst _hideSiblings = target => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n if (!target.parentElement) {\n return;\n }\n\n target.parentElement.childNodes.forEach(node => {\n if (node === target) {\n // Skip self;\n return;\n }\n\n hide(node);\n });\n\n if (supportsMutationObservers()) {\n // Add a MutationObserver to check for new children to the tree.\n const newNodeObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (target.contains(node)) {\n // Skip self, and children of self.\n return;\n }\n\n hide(node);\n });\n });\n });\n\n newNodeObserver.observe(target.parentElement, {childList: true, subtree: true});\n siblingObserverMap.set(target.parentElement, newNodeObserver);\n }\n};\n\n/**\n * Correctly reverse the hide action of all children of the supplied target Element.\n *\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const unhideSiblings = target => getList(target).forEach(_unhideSiblings);\n\nconst _unhideSiblings = target => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n if (!target.parentElement) {\n return;\n }\n\n target.parentElement.childNodes.forEach(node => {\n if (node === target) {\n // Skip self;\n return;\n }\n\n unhide(node);\n });\n\n // Remove the sibling MutationObserver watching this tree.\n if (siblingObserverMap.has(target.parentElement)) {\n siblingObserverMap.get(target.parentElement).disconnect();\n siblingObserverMap.delete(target.parentElement);\n }\n};\n"],"file":"aria-hidden.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../../src/local/aria/aria-hidden.js"],"names":["childObserverMap","Map","siblingObserverMap","supportsMutationObservers","MutationObserver","disableElementFocusability","target","HTMLElement","matches","Selectors","elements","focusable","disableAndStoreTabIndex","querySelectorAll","forEach","element","dataset","ariaHiddenTabIndex","getAttribute","setAttribute","enableElementFocusability","focusableToUnhide","restoreTabIndex","closest","aria","hidden","oldTabIndex","removeAttribute","hide","_hide","newNodeObserver","mutationList","mutation","addedNodes","observe","childList","subtree","set","unhide","_unhide","has","get","disconnect","delete","hideSiblings","_hideSiblings","parentElement","childNodes","node","contains","unhideSiblings","_unhideSiblings"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * ARIA helpers related to the aria-hidden attribute.\n *\n * @module core/local/aria/aria-hidden.\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {getList} from 'core/normalise';\nimport Selectors from './selectors';\n\n// The map of MutationObserver objects for an object.\nconst childObserverMap = new Map();\nconst siblingObserverMap = new Map();\n\n/**\n * Determine whether the browser supports the MutationObserver system.\n *\n * @method\n * @returns {Bool}\n */\nconst supportsMutationObservers = () => (MutationObserver && typeof MutationObserver === 'function');\n\n/**\n * Disable element focusability, disabling the tabindex for child elements which are normally focusable.\n *\n * @method\n * @param {HTMLElement} target\n */\nconst disableElementFocusability = target => {\n if (!(target instanceof HTMLElement)) {\n // This element is not an HTMLElement.\n // This can happen for Text Nodes.\n return;\n }\n\n if (target.matches(Selectors.elements.focusable)) {\n disableAndStoreTabIndex(target);\n }\n\n target.querySelectorAll(Selectors.elements.focusable).forEach(disableAndStoreTabIndex);\n};\n\n/**\n * Remove the current tab-index and store it for later restoration.\n *\n * @method\n * @param {HTMLElement} element\n */\nconst disableAndStoreTabIndex = element => {\n if (typeof element.dataset.ariaHiddenTabIndex !== 'undefined') {\n // This child already has a hidden attribute.\n // Do not modify it as the original value will be lost.\n return;\n }\n\n // Store the old tabindex in a data attribute.\n if (element.getAttribute('tabindex')) {\n element.dataset.ariaHiddenTabIndex = element.getAttribute('tabindex');\n } else {\n element.dataset.ariaHiddenTabIndex = '';\n }\n element.setAttribute('tabindex', -1);\n};\n\n/**\n * Re-enable element focusability, restoring any tabindex.\n *\n * @method\n * @param {HTMLElement} target\n */\nconst enableElementFocusability = target => {\n if (!(target instanceof HTMLElement)) {\n // This element is not an HTMLElement.\n // This can happen for Text Nodes.\n return;\n }\n\n if (target.matches(Selectors.elements.focusableToUnhide)) {\n restoreTabIndex(target);\n }\n\n target.querySelectorAll(Selectors.elements.focusableToUnhide).forEach(restoreTabIndex);\n};\n\n/**\n * Restore the tab-index of the supplied element.\n *\n * When disabling focusability the current tab-index is stored in the ariaHiddenTabIndex data attribute.\n * This is used to restore the tab-index, but only whilst the parent nodes remain unhidden.\n *\n * @method\n * @param {HTMLElement} element\n */\nconst restoreTabIndex = element => {\n if (element.closest(Selectors.aria.hidden)) {\n // This item still has a hidden parent, or is hidden itself. Do not unhide it.\n return;\n }\n\n const oldTabIndex = element.dataset.ariaHiddenTabIndex;\n if (oldTabIndex === '') {\n element.removeAttribute('tabindex');\n } else {\n element.setAttribute('tabindex', oldTabIndex);\n }\n\n delete element.dataset.ariaHiddenTabIndex;\n};\n\n/**\n * Update the supplied DOM Module to be hidden.\n *\n * @method\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const hide = target => getList(target).forEach(_hide);\n\nconst _hide = target => {\n if (!(target instanceof HTMLElement)) {\n // This element is not an HTMLElement.\n // This can happen for Text Nodes.\n return;\n }\n\n if (target.closest(Selectors.aria.hidden)) {\n // This Element, or a parent Element, is already hidden.\n // Stop processing.\n return;\n }\n\n // Set the aria-hidden attribute to true.\n target.setAttribute('aria-hidden', true);\n\n // Based on advice from https://dequeuniversity.com/rules/axe/3.3/aria-hidden-focus, upon setting the aria-hidden\n // attribute, all focusable elements underneath that element should be modified such that they are not focusable.\n disableElementFocusability(target);\n\n if (supportsMutationObservers()) {\n // Add a MutationObserver to check for new children to the tree.\n const newNodeObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n mutation.addedNodes.forEach(disableElementFocusability);\n });\n });\n\n newNodeObserver.observe(target, {childList: true, subtree: true});\n childObserverMap.set(target, newNodeObserver);\n }\n};\n\n/**\n * Reverse the effect of the hide action.\n *\n * @method\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const unhide = target => getList(target).forEach(_unhide);\n\nconst _unhide = target => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Note: The aria-hidden attribute should be removed, and not set to false.\n // The presence of the attribute is sufficient for some browsers to treat it as being true, regardless of its value.\n target.removeAttribute('aria-hidden');\n\n // Restore the tabindex across all child nodes of the target.\n enableElementFocusability(target);\n\n // Remove the focusability MutationObserver watching this tree.\n if (childObserverMap.has(target)) {\n childObserverMap.get(target).disconnect();\n childObserverMap.delete(target);\n }\n};\n\n/**\n * Correctly mark all siblings of the supplied target Element as hidden.\n *\n * @method\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const hideSiblings = target => getList(target).forEach(_hideSiblings);\n\nconst _hideSiblings = target => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n if (!target.parentElement) {\n return;\n }\n\n target.parentElement.childNodes.forEach(node => {\n if (node === target) {\n // Skip self;\n return;\n }\n\n hide(node);\n });\n\n if (supportsMutationObservers()) {\n // Add a MutationObserver to check for new children to the tree.\n const newNodeObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (target.contains(node)) {\n // Skip self, and children of self.\n return;\n }\n\n hide(node);\n });\n });\n });\n\n newNodeObserver.observe(target.parentElement, {childList: true, subtree: true});\n siblingObserverMap.set(target.parentElement, newNodeObserver);\n }\n};\n\n/**\n * Correctly reverse the hide action of all children of the supplied target Element.\n *\n * @method\n * @param {HTMLElement} target\n * @returns {Array}\n */\nexport const unhideSiblings = target => getList(target).forEach(_unhideSiblings);\n\nconst _unhideSiblings = target => {\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n if (!target.parentElement) {\n return;\n }\n\n target.parentElement.childNodes.forEach(node => {\n if (node === target) {\n // Skip self;\n return;\n }\n\n unhide(node);\n });\n\n // Remove the sibling MutationObserver watching this tree.\n if (siblingObserverMap.has(target.parentElement)) {\n siblingObserverMap.get(target.parentElement).disconnect();\n siblingObserverMap.delete(target.parentElement);\n }\n};\n"],"file":"aria-hidden.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/local/aria/focuslock.min.js.map b/lib/amd/build/local/aria/focuslock.min.js.map
index d8958084bdb..059682121da 100644
--- a/lib/amd/build/local/aria/focuslock.min.js.map
+++ b/lib/amd/build/local/aria/focuslock.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../src/local/aria/focuslock.js"],"names":["lockRegionStack","initialFocusElementStack","finalFocusElementStack","lastFocus","ignoreFocusChanges","isLocked","lockHandler","event","lockRegion","getCurrentLockRegion","parentNode","untrapFocus","contains","target","focusFirstDescendant","document","activeElement","focusLastDescendant","focusableElements","Array","from","querySelectorAll","Selectors","elements","focusable","unshift","some","focusableElement","attemptFocus","reverse","push","isFocusable","focusTarget","tabIndex","getAttribute","disabled","nodeName","href","rel","type","focus","e","length","addLockRegionToStack","newLockRegion","currentLockRegion","element","createElement","style","position","top","left","initialNode","cloneNode","insertBefore","finalNode","nextSibling","removeLastLockRegionFromStack","pop","remove","hasTrappedRegionsInStack","trapFocus","addEventListener","originalRegionTabIndex","removeEventListener"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Tab locking system.\n *\n * This is based on code and examples provided in the ARIA specification.\n * https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html\n *\n * @module core/tablock\n * @class tablock\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Selectors from './selectors';\n\nconst lockRegionStack = [];\nconst initialFocusElementStack = [];\nconst finalFocusElementStack = [];\n\nlet lastFocus = null;\nlet ignoreFocusChanges = false;\nlet isLocked = false;\n\n/**\n * The lock handler.\n *\n * This is the item that does a majority of the work.\n * The overall logic from this comes from the examles in the WCAG guidelines.\n *\n * The general idea is that if the focus is not held within by an Element within the lock region, then we replace focus\n * on the first element in the lock region. If the first element is the element previously selected prior to the\n * user-initiated focus change, then instead jump to the last element in the lock region.\n *\n * This gives us a solution which supports focus locking of any kind, which loops in both directions, and which\n * prevents the lock from escaping the modal entirely.\n *\n * @param {Event} event The event from the focus change\n */\nconst lockHandler = event => {\n if (ignoreFocusChanges) {\n // The focus change was made by an internal call to set focus.\n return;\n }\n\n const lockRegion = getCurrentLockRegion();\n\n if (!lockRegion.parentNode) {\n // The lock region does not exist.\n // Perhaps it was removed without being untrapped.\n untrapFocus();\n }\n\n if (lockRegion.contains(event.target)) {\n lastFocus = event.target;\n } else {\n focusFirstDescendant();\n if (lastFocus == document.activeElement) {\n focusLastDescendant();\n }\n lastFocus = document.activeElement;\n }\n};\n\n/**\n * Focus the first descendant of the current lock region.\n *\n * @returns {Bool} Whether a node was focused\n */\nconst focusFirstDescendant = () => {\n const lockRegion = getCurrentLockRegion();\n\n // Grab all elements in the lock region and attempt to focus each element until one is focused.\n // We can capture most of this in the query selector, but some cases may still reject focus.\n // For example, a disabled text area cannot be focused, and it becomes difficult to provide a decent query selector\n // to capture this.\n // The use of Array.some just ensures that we stop as soon as we have a successful focus.\n const focusableElements = Array.from(lockRegion.querySelectorAll(Selectors.elements.focusable));\n\n // The lock region itself may be focusable. This is particularly true on Moodle's older dialogues.\n // We must include it in the calculation of descendants to ensure that looping works correctly.\n focusableElements.unshift(lockRegion);\n return focusableElements.some(focusableElement => attemptFocus(focusableElement));\n};\n\n/**\n * Focus the last descendant of the current lock region.\n *\n * @returns {Bool} Whether a node was focused\n */\nconst focusLastDescendant = () => {\n const lockRegion = getCurrentLockRegion();\n\n // Grab all elements in the lock region, reverse them, and attempt to focus each element until one is focused.\n // We can capture most of this in the query selector, but some cases may still reject focus.\n // For example, a disabled text area cannot be focused, and it becomes difficult to provide a decent query selector\n // to capture this.\n // The use of Array.some just ensures that we stop as soon as we have a successful focus.\n const focusableElements = Array.from(lockRegion.querySelectorAll(Selectors.elements.focusable)).reverse();\n\n // The lock region itself may be focusable. This is particularly true on Moodle's older dialogues.\n // We must include it in the calculation of descendants to ensure that looping works correctly.\n focusableElements.push(lockRegion);\n return focusableElements.some(focusableElement => attemptFocus(focusableElement));\n};\n\n/**\n * Check whether the supplied focusTarget is actually focusable.\n * There are cases where a normally focusable element can reject focus.\n *\n * Note: This example is a wholesale copy of the WCAG example.\n *\n * @param {HTMLElement} focusTarget\n * @returns {Bool}\n */\nconst isFocusable = focusTarget => {\n if (focusTarget.tabIndex > 0 || (focusTarget.tabIndex === 0 && focusTarget.getAttribute('tabIndex') !== null)) {\n return true;\n }\n\n if (focusTarget.disabled) {\n return false;\n }\n\n switch (focusTarget.nodeName) {\n case 'A':\n return !!focusTarget.href && focusTarget.rel != 'ignore';\n case 'INPUT':\n return focusTarget.type != 'hidden' && focusTarget.type != 'file';\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n default:\n return false;\n }\n};\n\n/**\n * Attempt to focus the supplied focusTarget.\n *\n * Note: This example is a heavily inspired by the WCAG example.\n *\n * @param {HTMLElement} focusTarget\n * @returns {Bool} Whether focus was successful o rnot.\n */\nconst attemptFocus = focusTarget => {\n if (!isFocusable(focusTarget)) {\n return false;\n }\n\n // The ignoreFocusChanges variable prevents the focus event handler from interfering and entering a fight with itself.\n ignoreFocusChanges = true;\n\n try {\n focusTarget.focus();\n } catch (e) {\n // Ignore failures. We will just try to focus the next element in the list.\n // eslint-disable-line\n }\n\n ignoreFocusChanges = false;\n\n // If focus was successful the activeElement will be the one we focused.\n return (document.activeElement === focusTarget);\n};\n\n/**\n * Get the current lock region from the top of the stack.\n *\n * @returns {HTMLElement}\n */\nconst getCurrentLockRegion = () => {\n return lockRegionStack[lockRegionStack.length - 1];\n};\n\n/**\n * Add a new lock region to the stack.\n *\n * @param {HTMLElement} newLockRegion\n */\nconst addLockRegionToStack = newLockRegion => {\n if (newLockRegion === getCurrentLockRegion()) {\n return;\n }\n\n lockRegionStack.push(newLockRegion);\n const currentLockRegion = getCurrentLockRegion();\n\n // Append an empty div which can be focused just outside of the item locked.\n // This locks tab focus to within the tab region, and does not allow it to extend back into the window by\n // guaranteeing the existence of a tabable item after the lock region which can be focused but which will be caught\n // by the handler.\n const element = document.createElement('div');\n element.tabIndex = 0;\n element.style.position = 'fixed';\n element.style.top = 0;\n element.style.left = 0;\n\n const initialNode = element.cloneNode();\n currentLockRegion.parentNode.insertBefore(initialNode, currentLockRegion);\n initialFocusElementStack.push(initialNode);\n\n const finalNode = element.cloneNode();\n currentLockRegion.parentNode.insertBefore(finalNode, currentLockRegion.nextSibling);\n finalFocusElementStack.push(finalNode);\n};\n\n/**\n * Remove the top lock region from the stack.\n */\nconst removeLastLockRegionFromStack = () => {\n // Take the top element off the stack, and replce the current lockRegion value.\n lockRegionStack.pop();\n\n const finalNode = finalFocusElementStack.pop();\n if (finalNode) {\n // The final focus element may have been removed if it was part of a parent item.\n finalNode.remove();\n }\n\n const initialNode = initialFocusElementStack.pop();\n if (initialNode) {\n // The initial focus element may have been removed if it was part of a parent item.\n initialNode.remove();\n }\n};\n\n/**\n * Whether any region is left in the stack.\n *\n * @return {Bool}\n */\nconst hasTrappedRegionsInStack = () => {\n return !!lockRegionStack.length;\n};\n\n/**\n * Start trapping the focus and lock it to the specified newLockRegion.\n *\n * @param {HTMLElement} newLockRegion The container to lock focus to\n */\nexport const trapFocus = newLockRegion => {\n // Update the lock region stack.\n // This allows us to support nesting.\n addLockRegionToStack(newLockRegion);\n\n if (!isLocked) {\n // Add the focus handler.\n document.addEventListener('focus', lockHandler, true);\n }\n\n // Attempt to focus on the first item in the lock region.\n if (!focusFirstDescendant()) {\n const currentLockRegion = getCurrentLockRegion();\n\n // No focusable descendants found in the region yet.\n // This can happen when the region is locked before content is generated.\n // Focus on the region itself for now.\n const originalRegionTabIndex = currentLockRegion.tabIndex;\n currentLockRegion.tabIndex = 0;\n attemptFocus(currentLockRegion);\n currentLockRegion.tabIndex = originalRegionTabIndex;\n }\n\n // Keep track of the last item focused.\n lastFocus = document.activeElement;\n\n isLocked = true;\n};\n\n/**\n * Stop trapping the focus.\n */\nexport const untrapFocus = () => {\n // Remove the top region from the stack.\n removeLastLockRegionFromStack();\n\n if (hasTrappedRegionsInStack()) {\n // The focus manager still has items in the stack.\n return;\n }\n\n document.removeEventListener('focus', lockHandler, true);\n\n lastFocus = null;\n ignoreFocusChanges = false;\n isLocked = false;\n};\n"],"file":"focuslock.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../../src/local/aria/focuslock.js"],"names":["lockRegionStack","initialFocusElementStack","finalFocusElementStack","lastFocus","ignoreFocusChanges","isLocked","lockHandler","event","lockRegion","getCurrentLockRegion","parentNode","untrapFocus","contains","target","focusFirstDescendant","document","activeElement","focusLastDescendant","focusableElements","Array","from","querySelectorAll","Selectors","elements","focusable","unshift","some","focusableElement","attemptFocus","reverse","push","isFocusable","focusTarget","tabIndex","getAttribute","disabled","nodeName","href","rel","type","focus","e","length","addLockRegionToStack","newLockRegion","currentLockRegion","element","createElement","style","position","top","left","initialNode","cloneNode","insertBefore","finalNode","nextSibling","removeLastLockRegionFromStack","pop","remove","hasTrappedRegionsInStack","trapFocus","addEventListener","originalRegionTabIndex","removeEventListener"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Tab locking system.\n *\n * This is based on code and examples provided in the ARIA specification.\n * https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html\n *\n * @module core/tablock\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Selectors from './selectors';\n\nconst lockRegionStack = [];\nconst initialFocusElementStack = [];\nconst finalFocusElementStack = [];\n\nlet lastFocus = null;\nlet ignoreFocusChanges = false;\nlet isLocked = false;\n\n/**\n * The lock handler.\n *\n * This is the item that does a majority of the work.\n * The overall logic from this comes from the examles in the WCAG guidelines.\n *\n * The general idea is that if the focus is not held within by an Element within the lock region, then we replace focus\n * on the first element in the lock region. If the first element is the element previously selected prior to the\n * user-initiated focus change, then instead jump to the last element in the lock region.\n *\n * This gives us a solution which supports focus locking of any kind, which loops in both directions, and which\n * prevents the lock from escaping the modal entirely.\n *\n * @method\n * @param {Event} event The event from the focus change\n */\nconst lockHandler = event => {\n if (ignoreFocusChanges) {\n // The focus change was made by an internal call to set focus.\n return;\n }\n\n const lockRegion = getCurrentLockRegion();\n\n if (!lockRegion.parentNode) {\n // The lock region does not exist.\n // Perhaps it was removed without being untrapped.\n untrapFocus();\n }\n\n if (lockRegion.contains(event.target)) {\n lastFocus = event.target;\n } else {\n focusFirstDescendant();\n if (lastFocus == document.activeElement) {\n focusLastDescendant();\n }\n lastFocus = document.activeElement;\n }\n};\n\n/**\n * Focus the first descendant of the current lock region.\n *\n * @method\n * @returns {Bool} Whether a node was focused\n */\nconst focusFirstDescendant = () => {\n const lockRegion = getCurrentLockRegion();\n\n // Grab all elements in the lock region and attempt to focus each element until one is focused.\n // We can capture most of this in the query selector, but some cases may still reject focus.\n // For example, a disabled text area cannot be focused, and it becomes difficult to provide a decent query selector\n // to capture this.\n // The use of Array.some just ensures that we stop as soon as we have a successful focus.\n const focusableElements = Array.from(lockRegion.querySelectorAll(Selectors.elements.focusable));\n\n // The lock region itself may be focusable. This is particularly true on Moodle's older dialogues.\n // We must include it in the calculation of descendants to ensure that looping works correctly.\n focusableElements.unshift(lockRegion);\n return focusableElements.some(focusableElement => attemptFocus(focusableElement));\n};\n\n/**\n * Focus the last descendant of the current lock region.\n *\n * @method\n * @returns {Bool} Whether a node was focused\n */\nconst focusLastDescendant = () => {\n const lockRegion = getCurrentLockRegion();\n\n // Grab all elements in the lock region, reverse them, and attempt to focus each element until one is focused.\n // We can capture most of this in the query selector, but some cases may still reject focus.\n // For example, a disabled text area cannot be focused, and it becomes difficult to provide a decent query selector\n // to capture this.\n // The use of Array.some just ensures that we stop as soon as we have a successful focus.\n const focusableElements = Array.from(lockRegion.querySelectorAll(Selectors.elements.focusable)).reverse();\n\n // The lock region itself may be focusable. This is particularly true on Moodle's older dialogues.\n // We must include it in the calculation of descendants to ensure that looping works correctly.\n focusableElements.push(lockRegion);\n return focusableElements.some(focusableElement => attemptFocus(focusableElement));\n};\n\n/**\n * Check whether the supplied focusTarget is actually focusable.\n * There are cases where a normally focusable element can reject focus.\n *\n * Note: This example is a wholesale copy of the WCAG example.\n *\n * @method\n * @param {HTMLElement} focusTarget\n * @returns {Bool}\n */\nconst isFocusable = focusTarget => {\n if (focusTarget.tabIndex > 0 || (focusTarget.tabIndex === 0 && focusTarget.getAttribute('tabIndex') !== null)) {\n return true;\n }\n\n if (focusTarget.disabled) {\n return false;\n }\n\n switch (focusTarget.nodeName) {\n case 'A':\n return !!focusTarget.href && focusTarget.rel != 'ignore';\n case 'INPUT':\n return focusTarget.type != 'hidden' && focusTarget.type != 'file';\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n default:\n return false;\n }\n};\n\n/**\n * Attempt to focus the supplied focusTarget.\n *\n * Note: This example is a heavily inspired by the WCAG example.\n *\n * @method\n * @param {HTMLElement} focusTarget\n * @returns {Bool} Whether focus was successful o rnot.\n */\nconst attemptFocus = focusTarget => {\n if (!isFocusable(focusTarget)) {\n return false;\n }\n\n // The ignoreFocusChanges variable prevents the focus event handler from interfering and entering a fight with itself.\n ignoreFocusChanges = true;\n\n try {\n focusTarget.focus();\n } catch (e) {\n // Ignore failures. We will just try to focus the next element in the list.\n // eslint-disable-line\n }\n\n ignoreFocusChanges = false;\n\n // If focus was successful the activeElement will be the one we focused.\n return (document.activeElement === focusTarget);\n};\n\n/**\n * Get the current lock region from the top of the stack.\n *\n * @method\n * @returns {HTMLElement}\n */\nconst getCurrentLockRegion = () => {\n return lockRegionStack[lockRegionStack.length - 1];\n};\n\n/**\n * Add a new lock region to the stack.\n *\n * @method\n * @param {HTMLElement} newLockRegion\n */\nconst addLockRegionToStack = newLockRegion => {\n if (newLockRegion === getCurrentLockRegion()) {\n return;\n }\n\n lockRegionStack.push(newLockRegion);\n const currentLockRegion = getCurrentLockRegion();\n\n // Append an empty div which can be focused just outside of the item locked.\n // This locks tab focus to within the tab region, and does not allow it to extend back into the window by\n // guaranteeing the existence of a tabable item after the lock region which can be focused but which will be caught\n // by the handler.\n const element = document.createElement('div');\n element.tabIndex = 0;\n element.style.position = 'fixed';\n element.style.top = 0;\n element.style.left = 0;\n\n const initialNode = element.cloneNode();\n currentLockRegion.parentNode.insertBefore(initialNode, currentLockRegion);\n initialFocusElementStack.push(initialNode);\n\n const finalNode = element.cloneNode();\n currentLockRegion.parentNode.insertBefore(finalNode, currentLockRegion.nextSibling);\n finalFocusElementStack.push(finalNode);\n};\n\n/**\n * Remove the top lock region from the stack.\n *\n * @method\n */\nconst removeLastLockRegionFromStack = () => {\n // Take the top element off the stack, and replce the current lockRegion value.\n lockRegionStack.pop();\n\n const finalNode = finalFocusElementStack.pop();\n if (finalNode) {\n // The final focus element may have been removed if it was part of a parent item.\n finalNode.remove();\n }\n\n const initialNode = initialFocusElementStack.pop();\n if (initialNode) {\n // The initial focus element may have been removed if it was part of a parent item.\n initialNode.remove();\n }\n};\n\n/**\n * Whether any region is left in the stack.\n *\n * @return {Bool}\n */\nconst hasTrappedRegionsInStack = () => {\n return !!lockRegionStack.length;\n};\n\n/**\n * Start trapping the focus and lock it to the specified newLockRegion.\n *\n * @method\n * @param {HTMLElement} newLockRegion The container to lock focus to\n */\nexport const trapFocus = newLockRegion => {\n // Update the lock region stack.\n // This allows us to support nesting.\n addLockRegionToStack(newLockRegion);\n\n if (!isLocked) {\n // Add the focus handler.\n document.addEventListener('focus', lockHandler, true);\n }\n\n // Attempt to focus on the first item in the lock region.\n if (!focusFirstDescendant()) {\n const currentLockRegion = getCurrentLockRegion();\n\n // No focusable descendants found in the region yet.\n // This can happen when the region is locked before content is generated.\n // Focus on the region itself for now.\n const originalRegionTabIndex = currentLockRegion.tabIndex;\n currentLockRegion.tabIndex = 0;\n attemptFocus(currentLockRegion);\n currentLockRegion.tabIndex = originalRegionTabIndex;\n }\n\n // Keep track of the last item focused.\n lastFocus = document.activeElement;\n\n isLocked = true;\n};\n\n/**\n * Stop trapping the focus.\n *\n * @method\n */\nexport const untrapFocus = () => {\n // Remove the top region from the stack.\n removeLastLockRegionFromStack();\n\n if (hasTrappedRegionsInStack()) {\n // The focus manager still has items in the stack.\n return;\n }\n\n document.removeEventListener('focus', lockHandler, true);\n\n lastFocus = null;\n ignoreFocusChanges = false;\n isLocked = false;\n};\n"],"file":"focuslock.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/local/aria/selectors.min.js.map b/lib/amd/build/local/aria/selectors.min.js.map
index 7c548c471f6..d2a3e6ed924 100644
--- a/lib/amd/build/local/aria/selectors.min.js.map
+++ b/lib/amd/build/local/aria/selectors.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../src/local/aria/selectors.js"],"names":["aria","hidden","elements","focusable","focusableToUnhide"],"mappings":"qJAuBe,CACXA,IAAI,CAAE,CACFC,MAAM,CAAE,eADN,CADK,CAIXC,QAAQ,CAAE,CACNC,SAAS,CAAE,6EADL,CAENC,iBAAiB,CAAE,8BAFb,CAJC,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Selectors used for ARIA.\n *\n * @module core/local/aria/selectors\n * @class selectors\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default {\n aria: {\n hidden: '[aria-hidden]',\n },\n elements: {\n focusable: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n focusableToUnhide: '[data-aria-hidden-tab-index]',\n },\n};\n"],"file":"selectors.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../../src/local/aria/selectors.js"],"names":["aria","hidden","elements","focusable","focusableToUnhide"],"mappings":"qJAsBe,CACXA,IAAI,CAAE,CACFC,MAAM,CAAE,eADN,CADK,CAIXC,QAAQ,CAAE,CACNC,SAAS,CAAE,6EADL,CAENC,iBAAiB,CAAE,8BAFb,CAJC,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Selectors used for ARIA.\n *\n * @module core/local/aria/selectors\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default {\n aria: {\n hidden: '[aria-hidden]',\n },\n elements: {\n focusable: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n focusableToUnhide: '[data-aria-hidden-tab-index]',\n },\n};\n"],"file":"selectors.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/local/modal/alert.min.js.map b/lib/amd/build/local/modal/alert.min.js.map
index bf78557dece..370e9bcbb06 100644
--- a/lib/amd/build/local/modal/alert.min.js.map
+++ b/lib/amd/build/local/modal/alert.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../src/local/modal/alert.js"],"names":["registerCloseOnCancel","Modal"],"mappings":"uJAwBA,uD,+mEAM6B,CAErB,2DAGA,KAAKA,qBAAL,EACH,C,cAVwBC,S","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Alert modal.\n *\n * @module core/modal_alert\n * @class modal_alert\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Modal from 'core/modal';\n\nexport default class extends Modal {\n /**\n * Register all event listeners.\n */\n registerEventListeners() {\n // Call the parent registration.\n super.registerEventListeners();\n\n // Register to close on cancel.\n this.registerCloseOnCancel();\n }\n}\n"],"file":"alert.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../../src/local/modal/alert.js"],"names":["registerCloseOnCancel","Modal"],"mappings":"uJAuBA,uD,+mEAY6B,CAErB,2DAGA,KAAKA,qBAAL,EACH,C,cAVwBC,S","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Alert modal.\n *\n * @module core/modal_alert\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Modal from 'core/modal';\n\n/**\n * The Alert Modal\n *\n * @class\n * @extends Modal\n */\nexport default class extends Modal {\n /**\n * Register all event listeners.\n */\n registerEventListeners() {\n // Call the parent registration.\n super.registerEventListeners();\n\n // Register to close on cancel.\n this.registerCloseOnCancel();\n }\n}\n"],"file":"alert.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/modal.min.js.map b/lib/amd/build/modal.min.js.map
index efb52f1d685..5c83c98e282 100644
--- a/lib/amd/build/modal.min.js.map
+++ b/lib/amd/build/modal.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/modal.js"],"names":["define","$","Templates","Notification","KeyCodes","CustomEvents","ModalBackdrop","FilterEvents","ModalEvents","FocusLock","Pending","Aria","Fullscreen","SELECTORS","CONTAINER","MODAL","HEADER","TITLE","BODY","FOOTER","HIDE","DIALOG","FORM","MENU_BAR","HAS_Z_INDEX","CAN_RECEIVE_FOCUS","TEMPLATES","LOADING","BACKDROP","backdropPromise","modalCounter","Modal","root","modal","find","header","headerPromise","Deferred","title","titlePromise","body","bodyPromise","footer","footerPromise","hiddenSiblings","isAttached","bodyJS","footerJS","modalCount","attachmentPoint","document","createElement","append","is","exception","message","length","registerEventListeners","prototype","attachToDOM","getAttachmentPoint","trapFocus","runTemplateJS","countOtherVisibleModals","count","each","index","element","hasClass","bind","getBackdrop","render","then","html","fail","getRoot","getModal","getTitle","getBody","getFooter","getTitlePromise","getBodyPromise","getFooterPromise","getModalCount","setTitle","value","asyncSet","resolve","catch","setBody","notifyFilterContentUpdated","trigger","bodyRendered","jsPendingId","M","util","js_pending","contentPromise","css","when","state","height","innerHeight","animate","loadingIcon","hide","fadeIn","promise","fadeOut","js","result","isVisible","currentHeight","newHeight","opacity","duration","queue","always","js_complete","setBodyContent","setFooter","showFooter","hasFooterContent","children","hideFooter","addClass","removeClass","setLarge","isLarge","setSmall","isSmall","setScrollable","classList","remove","add","calculateZIndex","items","zIndex","parseInt","item","itemZIndex","hasFocus","target","activeElement","has","hasTransitions","getElement","show","pendingPromise","backdrop","currentIndex","newIndex","setZIndex","accessibilityShow","focus","shown","hideIfNotForm","formElement","done","untrapFocus","accessibilityHide","one","hidden","destroy","destroyed","unhide","get","hideSiblings","unhideSiblings","on","e","keyCode","escape","removeOnClose","click","closest","outsideClickEvent","Event","outsideClick","isDefaultPrevented","events","activate","data","originalEvent","preventDefault","registerCloseOnCancel","getActionSelector","cancelEvent","cancel","registerCloseOnSave","saveEvent","save","setFunction","p","hasOwnProperty","content","setButtonText","action","button","Error","text","setRemoveOnClose"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for modals.\n *\n * @module core/modal\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/notification',\n 'core/key_codes',\n 'core/custom_interaction_events',\n 'core/modal_backdrop',\n 'core_filters/events',\n 'core/modal_events',\n 'core/local/aria/focuslock',\n 'core/pending',\n 'core/aria',\n 'core/fullscreen'\n], function(\n $,\n Templates,\n Notification,\n KeyCodes,\n CustomEvents,\n ModalBackdrop,\n FilterEvents,\n ModalEvents,\n FocusLock,\n Pending,\n Aria,\n Fullscreen\n) {\n\n var SELECTORS = {\n CONTAINER: '[data-region=\"modal-container\"]',\n MODAL: '[data-region=\"modal\"]',\n HEADER: '[data-region=\"header\"]',\n TITLE: '[data-region=\"title\"]',\n BODY: '[data-region=\"body\"]',\n FOOTER: '[data-region=\"footer\"]',\n HIDE: '[data-action=\"hide\"]',\n DIALOG: '[role=dialog]',\n FORM: 'form',\n MENU_BAR: '[role=menubar]',\n HAS_Z_INDEX: '.moodle-has-zindex',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n };\n\n var TEMPLATES = {\n LOADING: 'core/loading',\n BACKDROP: 'core/modal_backdrop',\n };\n\n /**\n * Module singleton for the backdrop to be reused by all Modal instances.\n */\n var backdropPromise;\n\n /**\n * A counter that gets incremented for each modal created. This can be\n * used to generate unique values for the modals.\n */\n var modalCounter = 0;\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var Modal = function(root) {\n this.root = $(root);\n this.modal = this.root.find(SELECTORS.MODAL);\n this.header = this.modal.find(SELECTORS.HEADER);\n this.headerPromise = $.Deferred();\n this.title = this.header.find(SELECTORS.TITLE);\n this.titlePromise = $.Deferred();\n this.body = this.modal.find(SELECTORS.BODY);\n this.bodyPromise = $.Deferred();\n this.footer = this.modal.find(SELECTORS.FOOTER);\n this.footerPromise = $.Deferred();\n this.hiddenSiblings = [];\n this.isAttached = false;\n this.bodyJS = null;\n this.footerJS = null;\n this.modalCount = modalCounter++;\n this.attachmentPoint = document.createElement('div');\n document.body.append(this.attachmentPoint);\n\n if (!this.root.is(SELECTORS.CONTAINER)) {\n Notification.exception({message: 'Element is not a modal container'});\n }\n\n if (!this.modal.length) {\n Notification.exception({message: 'Container does not contain a modal'});\n }\n\n if (!this.header.length) {\n Notification.exception({message: 'Modal is missing a header region'});\n }\n\n if (!this.title.length) {\n Notification.exception({message: 'Modal header is missing a title region'});\n }\n\n if (!this.body.length) {\n Notification.exception({message: 'Modal is missing a body region'});\n }\n\n if (!this.footer.length) {\n Notification.exception({message: 'Modal is missing a footer region'});\n }\n\n this.registerEventListeners();\n };\n\n /**\n * Attach the modal to the correct part of the page.\n *\n * If it hasn't already been added it runs any\n * javascript that has been cached until now.\n *\n * @method attachToDOM\n */\n Modal.prototype.attachToDOM = function() {\n this.getAttachmentPoint().append(this.root);\n\n if (this.isAttached) {\n return;\n }\n\n FocusLock.trapFocus(this.root[0]);\n\n // If we'd cached any JS then we can run it how that the modal is\n // attached to the DOM.\n if (this.bodyJS) {\n Templates.runTemplateJS(this.bodyJS);\n this.bodyJS = null;\n }\n\n if (this.footerJS) {\n Templates.runTemplateJS(this.footerJS);\n this.footerJS = null;\n }\n\n this.isAttached = true;\n };\n\n /**\n * Count the number of other visible modals (not including this one).\n *\n * @method countOtherVisibleModals\n * @return {int}\n */\n Modal.prototype.countOtherVisibleModals = function() {\n var count = 0;\n $('body').find(SELECTORS.CONTAINER).each(function(index, element) {\n element = $(element);\n\n // If we haven't found ourself and the element is visible.\n if (!this.root.is(element) && element.hasClass('show')) {\n count++;\n }\n }.bind(this));\n\n return count;\n };\n\n /**\n * Get the modal backdrop.\n *\n * @method getBackdrop\n * @return {object} jQuery promise\n */\n Modal.prototype.getBackdrop = function() {\n if (!backdropPromise) {\n backdropPromise = Templates.render(TEMPLATES.BACKDROP, {})\n .then(function(html) {\n var element = $(html);\n\n return new ModalBackdrop(element);\n })\n .fail(Notification.exception);\n }\n\n return backdropPromise;\n };\n\n /**\n * Get the root element of this modal.\n *\n * @method getRoot\n * @return {object} jQuery object\n */\n Modal.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Get the modal element of this modal.\n *\n * @method getModal\n * @return {object} jQuery object\n */\n Modal.prototype.getModal = function() {\n return this.modal;\n };\n\n /**\n * Get the modal title element.\n *\n * @method getTitle\n * @return {object} jQuery object\n */\n Modal.prototype.getTitle = function() {\n return this.title;\n };\n\n /**\n * Get the modal body element.\n *\n * @method getBody\n * @return {object} jQuery object\n */\n Modal.prototype.getBody = function() {\n return this.body;\n };\n\n /**\n * Get the modal footer element.\n *\n * @method getFooter\n * @return {object} jQuery object\n */\n Modal.prototype.getFooter = function() {\n return this.footer;\n };\n\n /**\n * Get a promise resolving to the title region.\n *\n * @method getTitlePromise\n * @return {Promise}\n */\n Modal.prototype.getTitlePromise = function() {\n return this.titlePromise;\n };\n\n /**\n * Get a promise resolving to the body region.\n *\n * @method getBodyPromise\n * @return {object} jQuery object\n */\n Modal.prototype.getBodyPromise = function() {\n return this.bodyPromise;\n };\n\n /**\n * Get a promise resolving to the footer region.\n *\n * @method getFooterPromise\n * @return {object} jQuery object\n */\n Modal.prototype.getFooterPromise = function() {\n return this.footerPromise;\n };\n\n /**\n * Get the unique modal count.\n *\n * @method getModalCount\n * @return {int}\n */\n Modal.prototype.getModalCount = function() {\n return this.modalCount;\n };\n\n /**\n * Set the modal title element.\n *\n * This method is overloaded to take either a string value for the title or a jQuery promise that is resolved with\n * HTML most commonly from a Str.get_string call.\n *\n * @method setTitle\n * @param {(string|object)} value The title string or jQuery promise which resolves to the title.\n */\n Modal.prototype.setTitle = function(value) {\n var title = this.getTitle();\n this.titlePromise = $.Deferred();\n\n this.asyncSet(value, title.html.bind(title))\n .then(function() {\n this.titlePromise.resolve(title);\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Set the modal body element.\n *\n * This method is overloaded to take either a string value for the body or a jQuery promise that is resolved with\n * HTML and Javascript most commonly from a Templates.render call.\n *\n * @method setBody\n * @param {(string|object)} value The body string or jQuery promise which resolves to the body.\n * @fires event:filterContentUpdated\n */\n Modal.prototype.setBody = function(value) {\n this.bodyPromise = $.Deferred();\n\n var body = this.getBody();\n\n if (typeof value === 'string') {\n // Just set the value if it's a string.\n body.html(value);\n FilterEvents.notifyFilterContentUpdated(body);\n this.getRoot().trigger(ModalEvents.bodyRendered, this);\n this.bodyPromise.resolve(body);\n } else {\n var jsPendingId = 'amd-modal-js-pending-id-' + this.getModalCount();\n M.util.js_pending(jsPendingId);\n // Otherwise we assume it's a promise to be resolved with\n // html and javascript.\n var contentPromise = null;\n body.css('overflow', 'hidden');\n\n // Ensure that the `value` is a jQuery Promise.\n value = $.when(value);\n\n if (value.state() == 'pending') {\n // We're still waiting for the body promise to resolve so\n // let's show a loading icon.\n var height = body.innerHeight();\n if (height < 100) {\n height = 100;\n }\n\n body.animate({height: height + 'px'}, 150);\n\n body.html('');\n contentPromise = Templates.render(TEMPLATES.LOADING, {})\n .then(function(html) {\n var loadingIcon = $(html).hide();\n body.html(loadingIcon);\n loadingIcon.fadeIn(150);\n\n // We only want the loading icon to fade out\n // when the content for the body has finished\n // loading.\n return $.when(loadingIcon.promise(), value);\n })\n .then(function(loadingIcon) {\n // Once the content has finished loading and\n // the loading icon has been shown then we can\n // fade the icon away to reveal the content.\n return loadingIcon.fadeOut(100).promise();\n })\n .then(function() {\n return value;\n });\n } else {\n // The content is already loaded so let's just display\n // it to the user. No need for a loading icon.\n contentPromise = value;\n }\n\n // Now we can actually display the content.\n contentPromise.then(function(html, js) {\n var result = null;\n\n if (this.isVisible()) {\n // If the modal is visible then we should display\n // the content gracefully for the user.\n body.css('opacity', 0);\n var currentHeight = body.innerHeight();\n body.html(html);\n // We need to clear any height values we've set here\n // in order to measure the height of the content being\n // added. This then allows us to animate the height\n // transition.\n body.css('height', '');\n var newHeight = body.innerHeight();\n body.css('height', currentHeight + 'px');\n result = body.animate(\n {height: newHeight + 'px', opacity: 1},\n {duration: 150, queue: false}\n ).promise();\n } else {\n // Since the modal isn't visible we can just immediately\n // set the content. No need to animate it.\n body.html(html);\n }\n\n if (js) {\n if (this.isAttached) {\n // If we're in the DOM then run the JS immediately.\n Templates.runTemplateJS(js);\n } else {\n // Otherwise cache it to be run when we're attached.\n this.bodyJS = js;\n }\n }\n\n return result;\n }.bind(this))\n .then(function(result) {\n FilterEvents.notifyFilterContentUpdated(body);\n this.getRoot().trigger(ModalEvents.bodyRendered, this);\n return result;\n }.bind(this))\n .then(function() {\n this.bodyPromise.resolve(body);\n return;\n }.bind(this))\n .fail(Notification.exception)\n .always(function() {\n // When we're done displaying all of the content we need\n // to clear the custom values we've set here.\n body.css('height', '');\n body.css('overflow', '');\n body.css('opacity', '');\n M.util.js_complete(jsPendingId);\n\n return;\n })\n .fail(Notification.exception);\n }\n };\n\n /**\n * Alternative to setBody() that can be used from non-Jquery modules\n *\n * @param {Promise} promise promise that returns {html, js} object\n * @return {Promise}\n */\n Modal.prototype.setBodyContent = function(promise) {\n // Call the leegacy API for now and pass it a jQuery Promise.\n // This is a non-spec feature of jQuery and cannot be produced with spec promises.\n // We can encourage people to migrate to this approach, and in future we can swap\n // it so that setBody() calls setBodyPromise().\n return promise.then(({html, js}) => this.setBody($.when(html, js)))\n .catch(exception => {\n this.hide();\n throw exception;\n });\n };\n\n /**\n * Set the modal footer element. The footer element is made visible, if it\n * isn't already.\n *\n * This method is overloaded to take either a string\n * value for the body or a jQuery promise that is resolved with HTML and Javascript\n * most commonly from a Templates.render call.\n *\n * @method setFooter\n * @param {(string|object)} value The footer string or jQuery promise\n */\n Modal.prototype.setFooter = function(value) {\n // Make sure the footer is visible.\n this.showFooter();\n this.footerPromise = $.Deferred();\n\n var footer = this.getFooter();\n\n if (typeof value === 'string') {\n // Just set the value if it's a string.\n footer.html(value);\n this.footerPromise.resolve(footer);\n } else {\n // Otherwise we assume it's a promise to be resolved with\n // html and javascript.\n Templates.render(TEMPLATES.LOADING, {})\n .then(function(html) {\n footer.html(html);\n\n return value;\n })\n .then(function(html, js) {\n footer.html(html);\n\n if (js) {\n if (this.isAttached) {\n // If we're in the DOM then run the JS immediately.\n Templates.runTemplateJS(js);\n } else {\n // Otherwise cache it to be run when we're attached.\n this.footerJS = js;\n }\n }\n\n return footer;\n }.bind(this))\n .then(function(footer) {\n this.footerPromise.resolve(footer);\n return;\n }.bind(this))\n .catch(Notification.exception);\n }\n };\n\n /**\n * Check if the footer has any content in it.\n *\n * @method hasFooterContent\n * @return {bool}\n */\n Modal.prototype.hasFooterContent = function() {\n return this.getFooter().children().length ? true : false;\n };\n\n /**\n * Hide the footer element.\n *\n * @method hideFooter\n */\n Modal.prototype.hideFooter = function() {\n this.getFooter().addClass('hidden');\n };\n\n /**\n * Show the footer element.\n *\n * @method showFooter\n */\n Modal.prototype.showFooter = function() {\n this.getFooter().removeClass('hidden');\n };\n\n /**\n * Mark the modal as a large modal.\n *\n * @method setLarge\n */\n Modal.prototype.setLarge = function() {\n if (this.isLarge()) {\n return;\n }\n\n this.getModal().addClass('modal-lg');\n };\n\n /**\n * Check if the modal is a large modal.\n *\n * @method isLarge\n * @return {bool}\n */\n Modal.prototype.isLarge = function() {\n return this.getModal().hasClass('modal-lg');\n };\n\n /**\n * Mark the modal as a small modal.\n *\n * @method setSmall\n */\n Modal.prototype.setSmall = function() {\n if (this.isSmall()) {\n return;\n }\n\n this.getModal().removeClass('modal-lg');\n };\n\n /**\n * Check if the modal is a small modal.\n *\n * @method isSmall\n * @return {bool}\n */\n Modal.prototype.isSmall = function() {\n return !this.getModal().hasClass('modal-lg');\n };\n\n /**\n * Set this modal to be scrollable or not.\n *\n * @method setScrollable\n * @param {bool} value Whether the modal is scrollable or not\n */\n Modal.prototype.setScrollable = function(value) {\n if (!value) {\n this.getModal()[0].classList.remove('modal-dialog-scrollable');\n return;\n }\n\n this.getModal()[0].classList.add('modal-dialog-scrollable');\n };\n\n\n /**\n * Determine the highest z-index value currently on the page.\n *\n * @method calculateZIndex\n * @return {int}\n */\n Modal.prototype.calculateZIndex = function() {\n var items = $(SELECTORS.DIALOG + ', ' + SELECTORS.MENU_BAR + ', ' + SELECTORS.HAS_Z_INDEX);\n var zIndex = parseInt(this.root.css('z-index'));\n\n items.each(function(index, item) {\n item = $(item);\n // Note that webkit browsers won't return the z-index value from the CSS stylesheet\n // if the element doesn't have a position specified. Instead it'll return \"auto\".\n var itemZIndex = item.css('z-index') ? parseInt(item.css('z-index')) : 0;\n\n if (itemZIndex > zIndex) {\n zIndex = itemZIndex;\n }\n });\n\n return zIndex;\n };\n\n /**\n * Check if this modal is visible.\n *\n * @method isVisible\n * @return {bool}\n */\n Modal.prototype.isVisible = function() {\n return this.root.hasClass('show');\n };\n\n /**\n * Check if this modal has focus.\n *\n * @method hasFocus\n * @return {bool}\n */\n Modal.prototype.hasFocus = function() {\n var target = $(document.activeElement);\n return this.root.is(target) || this.root.has(target).length;\n };\n\n /**\n * Check if this modal has CSS transitions applied.\n *\n * @method hasTransitions\n * @return {bool}\n */\n Modal.prototype.hasTransitions = function() {\n return this.getRoot().hasClass('fade');\n };\n\n /**\n * Gets the jQuery wrapped node that the Modal should be attached to.\n *\n * @returns {jQuery}\n */\n Modal.prototype.getAttachmentPoint = function() {\n return $(Fullscreen.getElement() || this.attachmentPoint);\n };\n\n /**\n * Display this modal. The modal will be attached to the DOM if it hasn't\n * already been.\n *\n * @method show\n * @returns {Promise}\n */\n Modal.prototype.show = function() {\n if (this.isVisible()) {\n return $.Deferred().resolve();\n }\n\n var pendingPromise = new Pending('core/modal:show');\n\n if (this.hasFooterContent()) {\n this.showFooter();\n } else {\n this.hideFooter();\n }\n\n this.attachToDOM();\n\n return this.getBackdrop()\n .then(function(backdrop) {\n var currentIndex = this.calculateZIndex();\n var newIndex = currentIndex + 2;\n var newBackdropIndex = newIndex - 1;\n this.root.css('z-index', newIndex);\n backdrop.setZIndex(newBackdropIndex);\n backdrop.show();\n\n this.root.removeClass('hide').addClass('show');\n this.accessibilityShow();\n this.getModal().focus();\n $('body').addClass('modal-open');\n this.root.trigger(ModalEvents.shown, this);\n\n return;\n }.bind(this))\n .then(pendingPromise.resolve);\n };\n\n /**\n * Hide this modal if it does not contain a form.\n *\n * @method hideIfNotForm\n */\n Modal.prototype.hideIfNotForm = function() {\n var formElement = this.modal.find(SELECTORS.FORM);\n if (formElement.length == 0) {\n this.hide();\n }\n };\n\n /**\n * Hide this modal.\n *\n * @method hide\n */\n Modal.prototype.hide = function() {\n this.getBackdrop().done(function(backdrop) {\n FocusLock.untrapFocus();\n\n if (!this.countOtherVisibleModals()) {\n // Hide the backdrop if we're the last open modal.\n backdrop.hide();\n $('body').removeClass('modal-open');\n }\n\n var currentIndex = parseInt(this.root.css('z-index'));\n this.root.css('z-index', '');\n backdrop.setZIndex(currentIndex - 3);\n\n this.accessibilityHide();\n\n if (this.hasTransitions()) {\n // Wait for CSS transitions to complete before hiding the element.\n this.getRoot().one('transitionend webkitTransitionEnd oTransitionEnd', function() {\n this.getRoot().removeClass('show').addClass('hide');\n }.bind(this));\n } else {\n this.getRoot().removeClass('show').addClass('hide');\n }\n\n // Ensure the modal is moved onto the body node if it is still attached to the DOM.\n if ($(document.body).find(this.getRoot()).length) {\n $(document.body).append(this.getRoot());\n }\n\n this.root.trigger(ModalEvents.hidden, this);\n }.bind(this));\n };\n\n /**\n * Remove this modal from the DOM.\n *\n * @method destroy\n */\n Modal.prototype.destroy = function() {\n this.hide();\n this.root.remove();\n this.root.trigger(ModalEvents.destroyed, this);\n this.attachmentPoint.remove();\n };\n\n /**\n * Sets the appropriate aria attributes on this dialogue and the other\n * elements in the DOM to ensure that screen readers are able to navigate\n * the dialogue popup correctly.\n *\n * @method accessibilityShow\n */\n Modal.prototype.accessibilityShow = function() {\n // Make us visible to screen readers.\n Aria.unhide(this.root.get());\n\n // Hide siblings.\n Aria.hideSiblings(this.root.get()[0]);\n };\n\n /**\n * Restores the aria visibility on the DOM elements changed when displaying\n * the dialogue popup and makes the dialogue aria hidden to allow screen\n * readers to navigate the main page correctly when the dialogue is closed.\n *\n * @method accessibilityHide\n */\n Modal.prototype.accessibilityHide = function() {\n // Unhide siblings.\n Aria.unhideSiblings(this.root.get()[0]);\n\n // Hide this modal.\n Aria.hide(this.root.get());\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n Modal.prototype.registerEventListeners = function() {\n this.getRoot().on('keydown', function(e) {\n if (!this.isVisible()) {\n return;\n }\n\n if (e.keyCode == KeyCodes.escape) {\n if (this.removeOnClose) {\n this.destroy();\n } else {\n this.hide();\n }\n }\n }.bind(this));\n\n // Listen for clicks on the modal container.\n this.getRoot().click(function(e) {\n // If the click wasn't inside the modal element then we should\n // hide the modal.\n if (!$(e.target).closest(SELECTORS.MODAL).length) {\n // The check above fails to detect the click was inside the modal when the DOM tree is already changed.\n // So, we check if we can still find the container element or not. If not, then the DOM tree is changed.\n // It's best not to hide the modal in that case.\n if ($(e.target).closest(SELECTORS.CONTAINER).length) {\n var outsideClickEvent = $.Event(ModalEvents.outsideClick);\n this.getRoot().trigger(outsideClickEvent, this);\n\n if (!outsideClickEvent.isDefaultPrevented()) {\n this.hideIfNotForm();\n }\n }\n }\n }.bind(this));\n\n CustomEvents.define(this.getModal(), [CustomEvents.events.activate]);\n this.getModal().on(CustomEvents.events.activate, SELECTORS.HIDE, function(e, data) {\n this.hide();\n data.originalEvent.preventDefault();\n }.bind(this));\n };\n\n /**\n * Register a listener to close the dialogue when the cancel button is pressed.\n *\n * @method registerCloseOnCancel\n */\n Modal.prototype.registerCloseOnCancel = function() {\n // Handle the clicking of the Cancel button.\n this.getModal().on(CustomEvents.events.activate, this.getActionSelector('cancel'), function(e, data) {\n var cancelEvent = $.Event(ModalEvents.cancel);\n this.getRoot().trigger(cancelEvent, this);\n\n if (!cancelEvent.isDefaultPrevented()) {\n data.originalEvent.preventDefault();\n\n if (this.removeOnClose) {\n this.destroy();\n } else {\n this.hide();\n }\n }\n }.bind(this));\n };\n\n /**\n * Register a listener to close the dialogue when the save button is pressed.\n *\n * @method registerCloseOnSave\n */\n Modal.prototype.registerCloseOnSave = function() {\n // Handle the clicking of the Cancel button.\n this.getModal().on(CustomEvents.events.activate, this.getActionSelector('save'), function(e, data) {\n var saveEvent = $.Event(ModalEvents.save);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n data.originalEvent.preventDefault();\n\n if (this.removeOnClose) {\n this.destroy();\n } else {\n this.hide();\n }\n }\n }.bind(this));\n };\n\n /**\n * Set or resolve and set the value using the function.\n *\n * @method asyncSet\n * @param {(string|object)} value The string or jQuery promise.\n * @param {function} setFunction The setter\n * @return {Promise}\n */\n Modal.prototype.asyncSet = function(value, setFunction) {\n var p = value;\n if (typeof value !== 'object' || !value.hasOwnProperty('then')) {\n p = $.Deferred();\n p.resolve(value);\n }\n\n p.then(function(content) {\n setFunction(content);\n\n return;\n })\n .fail(Notification.exception);\n\n return p;\n };\n\n /**\n * Set the title text of a button.\n *\n * This method is overloaded to take either a string value for the button title or a jQuery promise that is resolved with\n * text most commonly from a Str.get_string call.\n *\n * @param {DOMString} action The action of the button\n * @param {(String|object)} value The button text, or a promise which will resolve to it\n * @returns {Promise}\n */\n Modal.prototype.setButtonText = function(action, value) {\n const button = this.getFooter().find(this.getActionSelector(action));\n\n if (!button) {\n throw new Error(\"Unable to find the '\" + action + \"' button\");\n }\n\n return this.asyncSet(value, button.text.bind(button));\n };\n\n /**\n * Get the Selector for an action.\n *\n * @param {String} action\n * @returns {DOMString}\n */\n Modal.prototype.getActionSelector = function(action) {\n return \"[data-action='\" + action + \"']\";\n };\n\n /**\n * Set the flag to remove the modal from the DOM on close.\n *\n * @param {Boolean} remove\n */\n Modal.prototype.setRemoveOnClose = function(remove) {\n this.removeOnClose = remove;\n };\n\n return Modal;\n});\n"],"file":"modal.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/modal.js"],"names":["define","$","Templates","Notification","KeyCodes","CustomEvents","ModalBackdrop","FilterEvents","ModalEvents","FocusLock","Pending","Aria","Fullscreen","SELECTORS","CONTAINER","MODAL","HEADER","TITLE","BODY","FOOTER","HIDE","DIALOG","FORM","MENU_BAR","HAS_Z_INDEX","CAN_RECEIVE_FOCUS","TEMPLATES","LOADING","BACKDROP","backdropPromise","modalCounter","Modal","root","modal","find","header","headerPromise","Deferred","title","titlePromise","body","bodyPromise","footer","footerPromise","hiddenSiblings","isAttached","bodyJS","footerJS","modalCount","attachmentPoint","document","createElement","append","is","exception","message","length","registerEventListeners","prototype","attachToDOM","getAttachmentPoint","trapFocus","runTemplateJS","countOtherVisibleModals","count","each","index","element","hasClass","bind","getBackdrop","render","then","html","fail","getRoot","getModal","getTitle","getBody","getFooter","getTitlePromise","getBodyPromise","getFooterPromise","getModalCount","setTitle","value","asyncSet","resolve","catch","setBody","notifyFilterContentUpdated","trigger","bodyRendered","jsPendingId","M","util","js_pending","contentPromise","css","when","state","height","innerHeight","animate","loadingIcon","hide","fadeIn","promise","fadeOut","js","result","isVisible","currentHeight","newHeight","opacity","duration","queue","always","js_complete","setBodyContent","setFooter","showFooter","hasFooterContent","children","hideFooter","addClass","removeClass","setLarge","isLarge","setSmall","isSmall","setScrollable","classList","remove","add","calculateZIndex","items","zIndex","parseInt","item","itemZIndex","hasFocus","target","activeElement","has","hasTransitions","getElement","show","pendingPromise","backdrop","currentIndex","newIndex","setZIndex","accessibilityShow","focus","shown","hideIfNotForm","formElement","done","untrapFocus","accessibilityHide","one","hidden","destroy","destroyed","unhide","get","hideSiblings","unhideSiblings","on","e","keyCode","escape","removeOnClose","click","closest","outsideClickEvent","Event","outsideClick","isDefaultPrevented","events","activate","data","originalEvent","preventDefault","registerCloseOnCancel","getActionSelector","cancelEvent","cancel","registerCloseOnSave","saveEvent","save","setFunction","p","hasOwnProperty","content","setButtonText","action","button","Error","text","setRemoveOnClose"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for modals.\n *\n * @module core/modal\n * @class core/modal\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/notification',\n 'core/key_codes',\n 'core/custom_interaction_events',\n 'core/modal_backdrop',\n 'core_filters/events',\n 'core/modal_events',\n 'core/local/aria/focuslock',\n 'core/pending',\n 'core/aria',\n 'core/fullscreen'\n], function(\n $,\n Templates,\n Notification,\n KeyCodes,\n CustomEvents,\n ModalBackdrop,\n FilterEvents,\n ModalEvents,\n FocusLock,\n Pending,\n Aria,\n Fullscreen\n) {\n\n var SELECTORS = {\n CONTAINER: '[data-region=\"modal-container\"]',\n MODAL: '[data-region=\"modal\"]',\n HEADER: '[data-region=\"header\"]',\n TITLE: '[data-region=\"title\"]',\n BODY: '[data-region=\"body\"]',\n FOOTER: '[data-region=\"footer\"]',\n HIDE: '[data-action=\"hide\"]',\n DIALOG: '[role=dialog]',\n FORM: 'form',\n MENU_BAR: '[role=menubar]',\n HAS_Z_INDEX: '.moodle-has-zindex',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n };\n\n var TEMPLATES = {\n LOADING: 'core/loading',\n BACKDROP: 'core/modal_backdrop',\n };\n\n /**\n * Module singleton for the backdrop to be reused by all Modal instances.\n */\n var backdropPromise;\n\n /**\n * A counter that gets incremented for each modal created. This can be\n * used to generate unique values for the modals.\n */\n var modalCounter = 0;\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var Modal = function(root) {\n this.root = $(root);\n this.modal = this.root.find(SELECTORS.MODAL);\n this.header = this.modal.find(SELECTORS.HEADER);\n this.headerPromise = $.Deferred();\n this.title = this.header.find(SELECTORS.TITLE);\n this.titlePromise = $.Deferred();\n this.body = this.modal.find(SELECTORS.BODY);\n this.bodyPromise = $.Deferred();\n this.footer = this.modal.find(SELECTORS.FOOTER);\n this.footerPromise = $.Deferred();\n this.hiddenSiblings = [];\n this.isAttached = false;\n this.bodyJS = null;\n this.footerJS = null;\n this.modalCount = modalCounter++;\n this.attachmentPoint = document.createElement('div');\n document.body.append(this.attachmentPoint);\n\n if (!this.root.is(SELECTORS.CONTAINER)) {\n Notification.exception({message: 'Element is not a modal container'});\n }\n\n if (!this.modal.length) {\n Notification.exception({message: 'Container does not contain a modal'});\n }\n\n if (!this.header.length) {\n Notification.exception({message: 'Modal is missing a header region'});\n }\n\n if (!this.title.length) {\n Notification.exception({message: 'Modal header is missing a title region'});\n }\n\n if (!this.body.length) {\n Notification.exception({message: 'Modal is missing a body region'});\n }\n\n if (!this.footer.length) {\n Notification.exception({message: 'Modal is missing a footer region'});\n }\n\n this.registerEventListeners();\n };\n\n /**\n * Attach the modal to the correct part of the page.\n *\n * If it hasn't already been added it runs any\n * javascript that has been cached until now.\n *\n * @method attachToDOM\n */\n Modal.prototype.attachToDOM = function() {\n this.getAttachmentPoint().append(this.root);\n\n if (this.isAttached) {\n return;\n }\n\n FocusLock.trapFocus(this.root[0]);\n\n // If we'd cached any JS then we can run it how that the modal is\n // attached to the DOM.\n if (this.bodyJS) {\n Templates.runTemplateJS(this.bodyJS);\n this.bodyJS = null;\n }\n\n if (this.footerJS) {\n Templates.runTemplateJS(this.footerJS);\n this.footerJS = null;\n }\n\n this.isAttached = true;\n };\n\n /**\n * Count the number of other visible modals (not including this one).\n *\n * @method countOtherVisibleModals\n * @return {int}\n */\n Modal.prototype.countOtherVisibleModals = function() {\n var count = 0;\n $('body').find(SELECTORS.CONTAINER).each(function(index, element) {\n element = $(element);\n\n // If we haven't found ourself and the element is visible.\n if (!this.root.is(element) && element.hasClass('show')) {\n count++;\n }\n }.bind(this));\n\n return count;\n };\n\n /**\n * Get the modal backdrop.\n *\n * @method getBackdrop\n * @return {object} jQuery promise\n */\n Modal.prototype.getBackdrop = function() {\n if (!backdropPromise) {\n backdropPromise = Templates.render(TEMPLATES.BACKDROP, {})\n .then(function(html) {\n var element = $(html);\n\n return new ModalBackdrop(element);\n })\n .fail(Notification.exception);\n }\n\n return backdropPromise;\n };\n\n /**\n * Get the root element of this modal.\n *\n * @method getRoot\n * @return {object} jQuery object\n */\n Modal.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Get the modal element of this modal.\n *\n * @method getModal\n * @return {object} jQuery object\n */\n Modal.prototype.getModal = function() {\n return this.modal;\n };\n\n /**\n * Get the modal title element.\n *\n * @method getTitle\n * @return {object} jQuery object\n */\n Modal.prototype.getTitle = function() {\n return this.title;\n };\n\n /**\n * Get the modal body element.\n *\n * @method getBody\n * @return {object} jQuery object\n */\n Modal.prototype.getBody = function() {\n return this.body;\n };\n\n /**\n * Get the modal footer element.\n *\n * @method getFooter\n * @return {object} jQuery object\n */\n Modal.prototype.getFooter = function() {\n return this.footer;\n };\n\n /**\n * Get a promise resolving to the title region.\n *\n * @method getTitlePromise\n * @return {Promise}\n */\n Modal.prototype.getTitlePromise = function() {\n return this.titlePromise;\n };\n\n /**\n * Get a promise resolving to the body region.\n *\n * @method getBodyPromise\n * @return {object} jQuery object\n */\n Modal.prototype.getBodyPromise = function() {\n return this.bodyPromise;\n };\n\n /**\n * Get a promise resolving to the footer region.\n *\n * @method getFooterPromise\n * @return {object} jQuery object\n */\n Modal.prototype.getFooterPromise = function() {\n return this.footerPromise;\n };\n\n /**\n * Get the unique modal count.\n *\n * @method getModalCount\n * @return {int}\n */\n Modal.prototype.getModalCount = function() {\n return this.modalCount;\n };\n\n /**\n * Set the modal title element.\n *\n * This method is overloaded to take either a string value for the title or a jQuery promise that is resolved with\n * HTML most commonly from a Str.get_string call.\n *\n * @method setTitle\n * @param {(string|object)} value The title string or jQuery promise which resolves to the title.\n */\n Modal.prototype.setTitle = function(value) {\n var title = this.getTitle();\n this.titlePromise = $.Deferred();\n\n this.asyncSet(value, title.html.bind(title))\n .then(function() {\n this.titlePromise.resolve(title);\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Set the modal body element.\n *\n * This method is overloaded to take either a string value for the body or a jQuery promise that is resolved with\n * HTML and Javascript most commonly from a Templates.render call.\n *\n * @method setBody\n * @param {(string|object)} value The body string or jQuery promise which resolves to the body.\n * @fires event:filterContentUpdated\n */\n Modal.prototype.setBody = function(value) {\n this.bodyPromise = $.Deferred();\n\n var body = this.getBody();\n\n if (typeof value === 'string') {\n // Just set the value if it's a string.\n body.html(value);\n FilterEvents.notifyFilterContentUpdated(body);\n this.getRoot().trigger(ModalEvents.bodyRendered, this);\n this.bodyPromise.resolve(body);\n } else {\n var jsPendingId = 'amd-modal-js-pending-id-' + this.getModalCount();\n M.util.js_pending(jsPendingId);\n // Otherwise we assume it's a promise to be resolved with\n // html and javascript.\n var contentPromise = null;\n body.css('overflow', 'hidden');\n\n // Ensure that the `value` is a jQuery Promise.\n value = $.when(value);\n\n if (value.state() == 'pending') {\n // We're still waiting for the body promise to resolve so\n // let's show a loading icon.\n var height = body.innerHeight();\n if (height < 100) {\n height = 100;\n }\n\n body.animate({height: height + 'px'}, 150);\n\n body.html('');\n contentPromise = Templates.render(TEMPLATES.LOADING, {})\n .then(function(html) {\n var loadingIcon = $(html).hide();\n body.html(loadingIcon);\n loadingIcon.fadeIn(150);\n\n // We only want the loading icon to fade out\n // when the content for the body has finished\n // loading.\n return $.when(loadingIcon.promise(), value);\n })\n .then(function(loadingIcon) {\n // Once the content has finished loading and\n // the loading icon has been shown then we can\n // fade the icon away to reveal the content.\n return loadingIcon.fadeOut(100).promise();\n })\n .then(function() {\n return value;\n });\n } else {\n // The content is already loaded so let's just display\n // it to the user. No need for a loading icon.\n contentPromise = value;\n }\n\n // Now we can actually display the content.\n contentPromise.then(function(html, js) {\n var result = null;\n\n if (this.isVisible()) {\n // If the modal is visible then we should display\n // the content gracefully for the user.\n body.css('opacity', 0);\n var currentHeight = body.innerHeight();\n body.html(html);\n // We need to clear any height values we've set here\n // in order to measure the height of the content being\n // added. This then allows us to animate the height\n // transition.\n body.css('height', '');\n var newHeight = body.innerHeight();\n body.css('height', currentHeight + 'px');\n result = body.animate(\n {height: newHeight + 'px', opacity: 1},\n {duration: 150, queue: false}\n ).promise();\n } else {\n // Since the modal isn't visible we can just immediately\n // set the content. No need to animate it.\n body.html(html);\n }\n\n if (js) {\n if (this.isAttached) {\n // If we're in the DOM then run the JS immediately.\n Templates.runTemplateJS(js);\n } else {\n // Otherwise cache it to be run when we're attached.\n this.bodyJS = js;\n }\n }\n\n return result;\n }.bind(this))\n .then(function(result) {\n FilterEvents.notifyFilterContentUpdated(body);\n this.getRoot().trigger(ModalEvents.bodyRendered, this);\n return result;\n }.bind(this))\n .then(function() {\n this.bodyPromise.resolve(body);\n return;\n }.bind(this))\n .fail(Notification.exception)\n .always(function() {\n // When we're done displaying all of the content we need\n // to clear the custom values we've set here.\n body.css('height', '');\n body.css('overflow', '');\n body.css('opacity', '');\n M.util.js_complete(jsPendingId);\n\n return;\n })\n .fail(Notification.exception);\n }\n };\n\n /**\n * Alternative to setBody() that can be used from non-Jquery modules\n *\n * @param {Promise} promise promise that returns {html, js} object\n * @return {Promise}\n */\n Modal.prototype.setBodyContent = function(promise) {\n // Call the leegacy API for now and pass it a jQuery Promise.\n // This is a non-spec feature of jQuery and cannot be produced with spec promises.\n // We can encourage people to migrate to this approach, and in future we can swap\n // it so that setBody() calls setBodyPromise().\n return promise.then(({html, js}) => this.setBody($.when(html, js)))\n .catch(exception => {\n this.hide();\n throw exception;\n });\n };\n\n /**\n * Set the modal footer element. The footer element is made visible, if it\n * isn't already.\n *\n * This method is overloaded to take either a string\n * value for the body or a jQuery promise that is resolved with HTML and Javascript\n * most commonly from a Templates.render call.\n *\n * @method setFooter\n * @param {(string|object)} value The footer string or jQuery promise\n */\n Modal.prototype.setFooter = function(value) {\n // Make sure the footer is visible.\n this.showFooter();\n this.footerPromise = $.Deferred();\n\n var footer = this.getFooter();\n\n if (typeof value === 'string') {\n // Just set the value if it's a string.\n footer.html(value);\n this.footerPromise.resolve(footer);\n } else {\n // Otherwise we assume it's a promise to be resolved with\n // html and javascript.\n Templates.render(TEMPLATES.LOADING, {})\n .then(function(html) {\n footer.html(html);\n\n return value;\n })\n .then(function(html, js) {\n footer.html(html);\n\n if (js) {\n if (this.isAttached) {\n // If we're in the DOM then run the JS immediately.\n Templates.runTemplateJS(js);\n } else {\n // Otherwise cache it to be run when we're attached.\n this.footerJS = js;\n }\n }\n\n return footer;\n }.bind(this))\n .then(function(footer) {\n this.footerPromise.resolve(footer);\n return;\n }.bind(this))\n .catch(Notification.exception);\n }\n };\n\n /**\n * Check if the footer has any content in it.\n *\n * @method hasFooterContent\n * @return {bool}\n */\n Modal.prototype.hasFooterContent = function() {\n return this.getFooter().children().length ? true : false;\n };\n\n /**\n * Hide the footer element.\n *\n * @method hideFooter\n */\n Modal.prototype.hideFooter = function() {\n this.getFooter().addClass('hidden');\n };\n\n /**\n * Show the footer element.\n *\n * @method showFooter\n */\n Modal.prototype.showFooter = function() {\n this.getFooter().removeClass('hidden');\n };\n\n /**\n * Mark the modal as a large modal.\n *\n * @method setLarge\n */\n Modal.prototype.setLarge = function() {\n if (this.isLarge()) {\n return;\n }\n\n this.getModal().addClass('modal-lg');\n };\n\n /**\n * Check if the modal is a large modal.\n *\n * @method isLarge\n * @return {bool}\n */\n Modal.prototype.isLarge = function() {\n return this.getModal().hasClass('modal-lg');\n };\n\n /**\n * Mark the modal as a small modal.\n *\n * @method setSmall\n */\n Modal.prototype.setSmall = function() {\n if (this.isSmall()) {\n return;\n }\n\n this.getModal().removeClass('modal-lg');\n };\n\n /**\n * Check if the modal is a small modal.\n *\n * @method isSmall\n * @return {bool}\n */\n Modal.prototype.isSmall = function() {\n return !this.getModal().hasClass('modal-lg');\n };\n\n /**\n * Set this modal to be scrollable or not.\n *\n * @method setScrollable\n * @param {bool} value Whether the modal is scrollable or not\n */\n Modal.prototype.setScrollable = function(value) {\n if (!value) {\n this.getModal()[0].classList.remove('modal-dialog-scrollable');\n return;\n }\n\n this.getModal()[0].classList.add('modal-dialog-scrollable');\n };\n\n\n /**\n * Determine the highest z-index value currently on the page.\n *\n * @method calculateZIndex\n * @return {int}\n */\n Modal.prototype.calculateZIndex = function() {\n var items = $(SELECTORS.DIALOG + ', ' + SELECTORS.MENU_BAR + ', ' + SELECTORS.HAS_Z_INDEX);\n var zIndex = parseInt(this.root.css('z-index'));\n\n items.each(function(index, item) {\n item = $(item);\n // Note that webkit browsers won't return the z-index value from the CSS stylesheet\n // if the element doesn't have a position specified. Instead it'll return \"auto\".\n var itemZIndex = item.css('z-index') ? parseInt(item.css('z-index')) : 0;\n\n if (itemZIndex > zIndex) {\n zIndex = itemZIndex;\n }\n });\n\n return zIndex;\n };\n\n /**\n * Check if this modal is visible.\n *\n * @method isVisible\n * @return {bool}\n */\n Modal.prototype.isVisible = function() {\n return this.root.hasClass('show');\n };\n\n /**\n * Check if this modal has focus.\n *\n * @method hasFocus\n * @return {bool}\n */\n Modal.prototype.hasFocus = function() {\n var target = $(document.activeElement);\n return this.root.is(target) || this.root.has(target).length;\n };\n\n /**\n * Check if this modal has CSS transitions applied.\n *\n * @method hasTransitions\n * @return {bool}\n */\n Modal.prototype.hasTransitions = function() {\n return this.getRoot().hasClass('fade');\n };\n\n /**\n * Gets the jQuery wrapped node that the Modal should be attached to.\n *\n * @returns {jQuery}\n */\n Modal.prototype.getAttachmentPoint = function() {\n return $(Fullscreen.getElement() || this.attachmentPoint);\n };\n\n /**\n * Display this modal. The modal will be attached to the DOM if it hasn't\n * already been.\n *\n * @method show\n * @returns {Promise}\n */\n Modal.prototype.show = function() {\n if (this.isVisible()) {\n return $.Deferred().resolve();\n }\n\n var pendingPromise = new Pending('core/modal:show');\n\n if (this.hasFooterContent()) {\n this.showFooter();\n } else {\n this.hideFooter();\n }\n\n this.attachToDOM();\n\n return this.getBackdrop()\n .then(function(backdrop) {\n var currentIndex = this.calculateZIndex();\n var newIndex = currentIndex + 2;\n var newBackdropIndex = newIndex - 1;\n this.root.css('z-index', newIndex);\n backdrop.setZIndex(newBackdropIndex);\n backdrop.show();\n\n this.root.removeClass('hide').addClass('show');\n this.accessibilityShow();\n this.getModal().focus();\n $('body').addClass('modal-open');\n this.root.trigger(ModalEvents.shown, this);\n\n return;\n }.bind(this))\n .then(pendingPromise.resolve);\n };\n\n /**\n * Hide this modal if it does not contain a form.\n *\n * @method hideIfNotForm\n */\n Modal.prototype.hideIfNotForm = function() {\n var formElement = this.modal.find(SELECTORS.FORM);\n if (formElement.length == 0) {\n this.hide();\n }\n };\n\n /**\n * Hide this modal.\n *\n * @method hide\n */\n Modal.prototype.hide = function() {\n this.getBackdrop().done(function(backdrop) {\n FocusLock.untrapFocus();\n\n if (!this.countOtherVisibleModals()) {\n // Hide the backdrop if we're the last open modal.\n backdrop.hide();\n $('body').removeClass('modal-open');\n }\n\n var currentIndex = parseInt(this.root.css('z-index'));\n this.root.css('z-index', '');\n backdrop.setZIndex(currentIndex - 3);\n\n this.accessibilityHide();\n\n if (this.hasTransitions()) {\n // Wait for CSS transitions to complete before hiding the element.\n this.getRoot().one('transitionend webkitTransitionEnd oTransitionEnd', function() {\n this.getRoot().removeClass('show').addClass('hide');\n }.bind(this));\n } else {\n this.getRoot().removeClass('show').addClass('hide');\n }\n\n // Ensure the modal is moved onto the body node if it is still attached to the DOM.\n if ($(document.body).find(this.getRoot()).length) {\n $(document.body).append(this.getRoot());\n }\n\n this.root.trigger(ModalEvents.hidden, this);\n }.bind(this));\n };\n\n /**\n * Remove this modal from the DOM.\n *\n * @method destroy\n */\n Modal.prototype.destroy = function() {\n this.hide();\n this.root.remove();\n this.root.trigger(ModalEvents.destroyed, this);\n this.attachmentPoint.remove();\n };\n\n /**\n * Sets the appropriate aria attributes on this dialogue and the other\n * elements in the DOM to ensure that screen readers are able to navigate\n * the dialogue popup correctly.\n *\n * @method accessibilityShow\n */\n Modal.prototype.accessibilityShow = function() {\n // Make us visible to screen readers.\n Aria.unhide(this.root.get());\n\n // Hide siblings.\n Aria.hideSiblings(this.root.get()[0]);\n };\n\n /**\n * Restores the aria visibility on the DOM elements changed when displaying\n * the dialogue popup and makes the dialogue aria hidden to allow screen\n * readers to navigate the main page correctly when the dialogue is closed.\n *\n * @method accessibilityHide\n */\n Modal.prototype.accessibilityHide = function() {\n // Unhide siblings.\n Aria.unhideSiblings(this.root.get()[0]);\n\n // Hide this modal.\n Aria.hide(this.root.get());\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n Modal.prototype.registerEventListeners = function() {\n this.getRoot().on('keydown', function(e) {\n if (!this.isVisible()) {\n return;\n }\n\n if (e.keyCode == KeyCodes.escape) {\n if (this.removeOnClose) {\n this.destroy();\n } else {\n this.hide();\n }\n }\n }.bind(this));\n\n // Listen for clicks on the modal container.\n this.getRoot().click(function(e) {\n // If the click wasn't inside the modal element then we should\n // hide the modal.\n if (!$(e.target).closest(SELECTORS.MODAL).length) {\n // The check above fails to detect the click was inside the modal when the DOM tree is already changed.\n // So, we check if we can still find the container element or not. If not, then the DOM tree is changed.\n // It's best not to hide the modal in that case.\n if ($(e.target).closest(SELECTORS.CONTAINER).length) {\n var outsideClickEvent = $.Event(ModalEvents.outsideClick);\n this.getRoot().trigger(outsideClickEvent, this);\n\n if (!outsideClickEvent.isDefaultPrevented()) {\n this.hideIfNotForm();\n }\n }\n }\n }.bind(this));\n\n CustomEvents.define(this.getModal(), [CustomEvents.events.activate]);\n this.getModal().on(CustomEvents.events.activate, SELECTORS.HIDE, function(e, data) {\n this.hide();\n data.originalEvent.preventDefault();\n }.bind(this));\n };\n\n /**\n * Register a listener to close the dialogue when the cancel button is pressed.\n *\n * @method registerCloseOnCancel\n */\n Modal.prototype.registerCloseOnCancel = function() {\n // Handle the clicking of the Cancel button.\n this.getModal().on(CustomEvents.events.activate, this.getActionSelector('cancel'), function(e, data) {\n var cancelEvent = $.Event(ModalEvents.cancel);\n this.getRoot().trigger(cancelEvent, this);\n\n if (!cancelEvent.isDefaultPrevented()) {\n data.originalEvent.preventDefault();\n\n if (this.removeOnClose) {\n this.destroy();\n } else {\n this.hide();\n }\n }\n }.bind(this));\n };\n\n /**\n * Register a listener to close the dialogue when the save button is pressed.\n *\n * @method registerCloseOnSave\n */\n Modal.prototype.registerCloseOnSave = function() {\n // Handle the clicking of the Cancel button.\n this.getModal().on(CustomEvents.events.activate, this.getActionSelector('save'), function(e, data) {\n var saveEvent = $.Event(ModalEvents.save);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n data.originalEvent.preventDefault();\n\n if (this.removeOnClose) {\n this.destroy();\n } else {\n this.hide();\n }\n }\n }.bind(this));\n };\n\n /**\n * Set or resolve and set the value using the function.\n *\n * @method asyncSet\n * @param {(string|object)} value The string or jQuery promise.\n * @param {function} setFunction The setter\n * @return {Promise}\n */\n Modal.prototype.asyncSet = function(value, setFunction) {\n var p = value;\n if (typeof value !== 'object' || !value.hasOwnProperty('then')) {\n p = $.Deferred();\n p.resolve(value);\n }\n\n p.then(function(content) {\n setFunction(content);\n\n return;\n })\n .fail(Notification.exception);\n\n return p;\n };\n\n /**\n * Set the title text of a button.\n *\n * This method is overloaded to take either a string value for the button title or a jQuery promise that is resolved with\n * text most commonly from a Str.get_string call.\n *\n * @param {DOMString} action The action of the button\n * @param {(String|object)} value The button text, or a promise which will resolve to it\n * @returns {Promise}\n */\n Modal.prototype.setButtonText = function(action, value) {\n const button = this.getFooter().find(this.getActionSelector(action));\n\n if (!button) {\n throw new Error(\"Unable to find the '\" + action + \"' button\");\n }\n\n return this.asyncSet(value, button.text.bind(button));\n };\n\n /**\n * Get the Selector for an action.\n *\n * @param {String} action\n * @returns {DOMString}\n */\n Modal.prototype.getActionSelector = function(action) {\n return \"[data-action='\" + action + \"']\";\n };\n\n /**\n * Set the flag to remove the modal from the DOM on close.\n *\n * @param {Boolean} remove\n */\n Modal.prototype.setRemoveOnClose = function(remove) {\n this.removeOnClose = remove;\n };\n\n return Modal;\n});\n"],"file":"modal.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/modal_backdrop.min.js.map b/lib/amd/build/modal_backdrop.min.js.map
index f62a08e4e2b..6c27072c291 100644
--- a/lib/amd/build/modal_backdrop.min.js.map
+++ b/lib/amd/build/modal_backdrop.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/modal_backdrop.js"],"names":["define","$","Templates","Notification","Fullscreen","SELECTORS","ROOT","ModalBackdrop","root","isAttached","attachmentPoint","document","createElement","body","append","is","exception","message","prototype","getRoot","getAttachmentPoint","getElement","attachToDOM","setZIndex","value","css","isVisible","hasClass","hasTransitions","show","removeClass","addClass","hide","one","bind","find","length","destroy","remove"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for modal backdrops.\n *\n * @module core/modal_backdrop\n * @class modal_backdrop\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/fullscreen'],\n function($, Templates, Notification, Fullscreen) {\n\n var SELECTORS = {\n ROOT: '[data-region=\"modal-backdrop\"]',\n };\n\n /**\n * Constructor for ModalBackdrop.\n *\n * @param {object} root The root element for the modal backdrop\n */\n var ModalBackdrop = function(root) {\n this.root = $(root);\n this.isAttached = false;\n this.attachmentPoint = document.createElement('div');\n document.body.append(this.attachmentPoint);\n\n if (!this.root.is(SELECTORS.ROOT)) {\n Notification.exception({message: 'Element is not a modal backdrop'});\n }\n };\n\n /**\n * Get the root element of this modal backdrop.\n *\n * @method getRoot\n * @return {object} jQuery object\n */\n ModalBackdrop.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Gets the jQuery wrapped node that the Modal should be attached to.\n *\n * @returns {jQuery}\n */\n ModalBackdrop.prototype.getAttachmentPoint = function() {\n return $(Fullscreen.getElement() || this.attachmentPoint);\n };\n\n /**\n * Add the modal backdrop to the page, if it hasn't already been added.\n *\n * @method attachToDOM\n */\n ModalBackdrop.prototype.attachToDOM = function() {\n this.getAttachmentPoint().append(this.root);\n\n if (this.isAttached) {\n return;\n }\n\n this.isAttached = true;\n };\n\n /**\n * Set the z-index value for this backdrop.\n *\n * @method setZIndex\n * @param {int} value The z-index value\n */\n ModalBackdrop.prototype.setZIndex = function(value) {\n this.root.css('z-index', value);\n };\n\n /**\n * Check if this backdrop is visible.\n *\n * @method isVisible\n * @return {bool}\n */\n ModalBackdrop.prototype.isVisible = function() {\n return this.root.hasClass('show');\n };\n\n /**\n * Check if this backdrop has CSS transitions applied.\n *\n * @method hasTransitions\n * @return {bool}\n */\n ModalBackdrop.prototype.hasTransitions = function() {\n return this.getRoot().hasClass('fade');\n };\n\n /**\n * Display this backdrop. The backdrop will be attached to the DOM if it hasn't\n * already been.\n *\n * @method show\n */\n ModalBackdrop.prototype.show = function() {\n if (this.isVisible()) {\n return;\n }\n\n this.attachToDOM();\n\n this.root.removeClass('hide').addClass('show');\n };\n\n /**\n * Hide this backdrop.\n *\n * @method hide\n */\n ModalBackdrop.prototype.hide = function() {\n if (!this.isVisible()) {\n return;\n }\n\n if (this.hasTransitions()) {\n // Wait for CSS transitions to complete before hiding the element.\n this.getRoot().one('transitionend webkitTransitionEnd oTransitionEnd', function() {\n this.getRoot().removeClass('show').addClass('hide');\n }.bind(this));\n } else {\n this.getRoot().removeClass('show').addClass('hide');\n }\n\n // Ensure the modal is moved onto the body node if it is still attached to the DOM.\n if ($(document.body).find(this.getRoot()).length) {\n $(document.body).append(this.getRoot());\n }\n };\n\n /**\n * Remove this backdrop from the DOM.\n *\n * @method destroy\n */\n ModalBackdrop.prototype.destroy = function() {\n this.root.remove();\n this.attachmentPoint.remove();\n };\n\n return ModalBackdrop;\n});\n"],"file":"modal_backdrop.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/modal_backdrop.js"],"names":["define","$","Templates","Notification","Fullscreen","SELECTORS","ROOT","ModalBackdrop","root","isAttached","attachmentPoint","document","createElement","body","append","is","exception","message","prototype","getRoot","getAttachmentPoint","getElement","attachToDOM","setZIndex","value","css","isVisible","hasClass","hasTransitions","show","removeClass","addClass","hide","one","bind","find","length","destroy","remove"],"mappings":"AAsBAA,OAAM,uBAAC,CAAC,QAAD,CAAW,gBAAX,CAA6B,mBAA7B,CAAkD,iBAAlD,CAAD,CACD,SAASC,CAAT,CAAYC,CAAZ,CAAuBC,CAAvB,CAAqCC,CAArC,CAAiD,IAE9CC,CAAAA,CAAS,CAAG,CACZC,IAAI,CAAE,kCADM,CAFkC,CAY9CC,CAAa,CAAG,SAASC,CAAT,CAAe,CAC/B,KAAKA,IAAL,CAAYP,CAAC,CAACO,CAAD,CAAb,CACA,KAAKC,UAAL,IACA,KAAKC,eAAL,CAAuBC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAvB,CACAD,QAAQ,CAACE,IAAT,CAAcC,MAAd,CAAqB,KAAKJ,eAA1B,EAEA,GAAI,CAAC,KAAKF,IAAL,CAAUO,EAAV,CAAaV,CAAS,CAACC,IAAvB,CAAL,CAAmC,CAC/BH,CAAY,CAACa,SAAb,CAAuB,CAACC,OAAO,CAAE,iCAAV,CAAvB,CACH,CACJ,CArBiD,CA6BlDV,CAAa,CAACW,SAAd,CAAwBC,OAAxB,CAAkC,UAAW,CACzC,MAAO,MAAKX,IACf,CAFD,CASCD,CAAa,CAACW,SAAd,CAAwBE,kBAAxB,CAA6C,UAAW,CACpD,MAAOnB,CAAAA,CAAC,CAACG,CAAU,CAACiB,UAAX,IAA2B,KAAKX,eAAjC,CACX,CAFD,CASDH,CAAa,CAACW,SAAd,CAAwBI,WAAxB,CAAsC,UAAW,CAC7C,KAAKF,kBAAL,GAA0BN,MAA1B,CAAiC,KAAKN,IAAtC,EAEA,GAAI,KAAKC,UAAT,CAAqB,CACjB,MACH,CAED,KAAKA,UAAL,GACH,CARD,CAgBAF,CAAa,CAACW,SAAd,CAAwBK,SAAxB,CAAoC,SAASC,CAAT,CAAgB,CAChD,KAAKhB,IAAL,CAAUiB,GAAV,CAAc,SAAd,CAAyBD,CAAzB,CACH,CAFD,CAUAjB,CAAa,CAACW,SAAd,CAAwBQ,SAAxB,CAAoC,UAAW,CAC3C,MAAO,MAAKlB,IAAL,CAAUmB,QAAV,CAAmB,MAAnB,CACV,CAFD,CAUApB,CAAa,CAACW,SAAd,CAAwBU,cAAxB,CAAyC,UAAW,CAChD,MAAO,MAAKT,OAAL,GAAeQ,QAAf,CAAwB,MAAxB,CACV,CAFD,CAUApB,CAAa,CAACW,SAAd,CAAwBW,IAAxB,CAA+B,UAAW,CACtC,GAAI,KAAKH,SAAL,EAAJ,CAAsB,CAClB,MACH,CAED,KAAKJ,WAAL,GAEA,KAAKd,IAAL,CAAUsB,WAAV,CAAsB,MAAtB,EAA8BC,QAA9B,CAAuC,MAAvC,CACH,CARD,CAeAxB,CAAa,CAACW,SAAd,CAAwBc,IAAxB,CAA+B,UAAW,CACtC,GAAI,CAAC,KAAKN,SAAL,EAAL,CAAuB,CACnB,MACH,CAED,GAAI,KAAKE,cAAL,EAAJ,CAA2B,CAEvB,KAAKT,OAAL,GAAec,GAAf,CAAmB,kDAAnB,CAAuE,UAAW,CAC9E,KAAKd,OAAL,GAAeW,WAAf,CAA2B,MAA3B,EAAmCC,QAAnC,CAA4C,MAA5C,CACH,CAFsE,CAErEG,IAFqE,CAEhE,IAFgE,CAAvE,CAGH,CALD,IAKO,CACH,KAAKf,OAAL,GAAeW,WAAf,CAA2B,MAA3B,EAAmCC,QAAnC,CAA4C,MAA5C,CACH,CAGD,GAAI9B,CAAC,CAACU,QAAQ,CAACE,IAAV,CAAD,CAAiBsB,IAAjB,CAAsB,KAAKhB,OAAL,EAAtB,EAAsCiB,MAA1C,CAAkD,CAC9CnC,CAAC,CAACU,QAAQ,CAACE,IAAV,CAAD,CAAiBC,MAAjB,CAAwB,KAAKK,OAAL,EAAxB,CACH,CACJ,CAlBD,CAyBAZ,CAAa,CAACW,SAAd,CAAwBmB,OAAxB,CAAkC,UAAW,CACzC,KAAK7B,IAAL,CAAU8B,MAAV,GACA,KAAK5B,eAAL,CAAqB4B,MAArB,EACH,CAHD,CAKA,MAAO/B,CAAAA,CACV,CA5IK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for modal backdrops.\n *\n * @module core/modal_backdrop\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/fullscreen'],\n function($, Templates, Notification, Fullscreen) {\n\n var SELECTORS = {\n ROOT: '[data-region=\"modal-backdrop\"]',\n };\n\n /**\n * Constructor for ModalBackdrop.\n *\n * @class core/modal_backdrop\n * @param {object} root The root element for the modal backdrop\n */\n var ModalBackdrop = function(root) {\n this.root = $(root);\n this.isAttached = false;\n this.attachmentPoint = document.createElement('div');\n document.body.append(this.attachmentPoint);\n\n if (!this.root.is(SELECTORS.ROOT)) {\n Notification.exception({message: 'Element is not a modal backdrop'});\n }\n };\n\n /**\n * Get the root element of this modal backdrop.\n *\n * @method getRoot\n * @return {object} jQuery object\n */\n ModalBackdrop.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Gets the jQuery wrapped node that the Modal should be attached to.\n *\n * @returns {jQuery}\n */\n ModalBackdrop.prototype.getAttachmentPoint = function() {\n return $(Fullscreen.getElement() || this.attachmentPoint);\n };\n\n /**\n * Add the modal backdrop to the page, if it hasn't already been added.\n *\n * @method attachToDOM\n */\n ModalBackdrop.prototype.attachToDOM = function() {\n this.getAttachmentPoint().append(this.root);\n\n if (this.isAttached) {\n return;\n }\n\n this.isAttached = true;\n };\n\n /**\n * Set the z-index value for this backdrop.\n *\n * @method setZIndex\n * @param {int} value The z-index value\n */\n ModalBackdrop.prototype.setZIndex = function(value) {\n this.root.css('z-index', value);\n };\n\n /**\n * Check if this backdrop is visible.\n *\n * @method isVisible\n * @return {bool}\n */\n ModalBackdrop.prototype.isVisible = function() {\n return this.root.hasClass('show');\n };\n\n /**\n * Check if this backdrop has CSS transitions applied.\n *\n * @method hasTransitions\n * @return {bool}\n */\n ModalBackdrop.prototype.hasTransitions = function() {\n return this.getRoot().hasClass('fade');\n };\n\n /**\n * Display this backdrop. The backdrop will be attached to the DOM if it hasn't\n * already been.\n *\n * @method show\n */\n ModalBackdrop.prototype.show = function() {\n if (this.isVisible()) {\n return;\n }\n\n this.attachToDOM();\n\n this.root.removeClass('hide').addClass('show');\n };\n\n /**\n * Hide this backdrop.\n *\n * @method hide\n */\n ModalBackdrop.prototype.hide = function() {\n if (!this.isVisible()) {\n return;\n }\n\n if (this.hasTransitions()) {\n // Wait for CSS transitions to complete before hiding the element.\n this.getRoot().one('transitionend webkitTransitionEnd oTransitionEnd', function() {\n this.getRoot().removeClass('show').addClass('hide');\n }.bind(this));\n } else {\n this.getRoot().removeClass('show').addClass('hide');\n }\n\n // Ensure the modal is moved onto the body node if it is still attached to the DOM.\n if ($(document.body).find(this.getRoot()).length) {\n $(document.body).append(this.getRoot());\n }\n };\n\n /**\n * Remove this backdrop from the DOM.\n *\n * @method destroy\n */\n ModalBackdrop.prototype.destroy = function() {\n this.root.remove();\n this.attachmentPoint.remove();\n };\n\n return ModalBackdrop;\n});\n"],"file":"modal_backdrop.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/modal_cancel.min.js.map b/lib/amd/build/modal_cancel.min.js.map
index 20f6d2dae9c..7ced2339d21 100644
--- a/lib/amd/build/modal_cancel.min.js.map
+++ b/lib/amd/build/modal_cancel.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/modal_cancel.js"],"names":["root","getFooter","find","getActionSelector","length","Notification","exception","message","registerCloseOnCancel","Modal"],"mappings":"kJAuBA,uD,++DAGI,WAAYA,CAAZ,CAAkB,iBACd,cAAMA,CAAN,EAEA,GAAI,CAAC,EAAKC,SAAL,GAAiBC,IAAjB,CAAsB,EAAKC,iBAAL,CAAuB,QAAvB,CAAtB,EAAwDC,MAA7D,CAAqE,CACjEC,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,wBAAV,CAAvB,CACH,CALa,QAMjB,C,0EAKwB,CAErB,2DAGA,KAAKC,qBAAL,EACH,C,cAlBwBC,S","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for the cancel modal.\n *\n * @module core/modal_cancel\n * @class modal_cancel\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Modal from 'core/modal';\n\nexport default class extends Modal {\n constructor(root) {\n super(root);\n\n if (!this.getFooter().find(this.getActionSelector('cancel')).length) {\n Notification.exception({message: 'No cancel button found'});\n }\n }\n\n /**\n * Register all event listeners.\n */\n registerEventListeners() {\n // Call the parent registration.\n super.registerEventListeners();\n\n // Register to close on cancel.\n this.registerCloseOnCancel();\n }\n}\n"],"file":"modal_cancel.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/modal_cancel.js"],"names":["root","getFooter","find","getActionSelector","length","Notification","exception","message","registerCloseOnCancel","Modal"],"mappings":"kJAsBA,uD,++DAOI,WAAYA,CAAZ,CAAkB,iBACd,cAAMA,CAAN,EAEA,GAAI,CAAC,EAAKC,SAAL,GAAiBC,IAAjB,CAAsB,EAAKC,iBAAL,CAAuB,QAAvB,CAAtB,EAAwDC,MAA7D,CAAqE,CACjEC,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,wBAAV,CAAvB,CACH,CALa,QAMjB,C,0EAKwB,CAErB,2DAGA,KAAKC,qBAAL,EACH,C,cAlBwBC,S","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for the cancel modal.\n *\n * @module core/modal_cancel\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Modal from 'core/modal';\n\n/**\n * @class\n * @extends module:core/modal\n */\nexport default class extends Modal {\n constructor(root) {\n super(root);\n\n if (!this.getFooter().find(this.getActionSelector('cancel')).length) {\n Notification.exception({message: 'No cancel button found'});\n }\n }\n\n /**\n * Register all event listeners.\n */\n registerEventListeners() {\n // Call the parent registration.\n super.registerEventListeners();\n\n // Register to close on cancel.\n this.registerCloseOnCancel();\n }\n}\n"],"file":"modal_cancel.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/modal_save_cancel.min.js.map b/lib/amd/build/modal_save_cancel.min.js.map
index 3427018ef49..adad5632763 100644
--- a/lib/amd/build/modal_save_cancel.min.js.map
+++ b/lib/amd/build/modal_save_cancel.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/modal_save_cancel.js"],"names":["root","getFooter","find","getActionSelector","length","Notification","exception","message","registerCloseOnSave","registerCloseOnCancel","value","setButtonText","Modal"],"mappings":"uJAuBA,uD,++DAGI,WAAYA,CAAZ,CAAkB,iBACd,cAAMA,CAAN,EAEA,GAAI,CAAC,EAAKC,SAAL,GAAiBC,IAAjB,CAAsB,EAAKC,iBAAL,CAAuB,MAAvB,CAAtB,EAAsDC,MAA3D,CAAmE,CAC/DC,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,sBAAV,CAAvB,CACH,CAED,GAAI,CAAC,EAAKN,SAAL,GAAiBC,IAAjB,CAAsB,EAAKC,iBAAL,CAAuB,QAAvB,CAAtB,EAAwDC,MAA7D,CAAqE,CACjEC,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,wBAAV,CAAvB,CACH,CATa,QAUjB,C,0EAKwB,CAErB,2DAGA,KAAKC,mBAAL,GACA,KAAKC,qBAAL,EACH,C,6CAKW,CACRJ,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,kDAAV,CAAvB,CAEH,C,4DAQiBG,C,CAAO,CACrB,MAAO,MAAKC,aAAL,CAAmB,MAAnB,CAA2BD,CAA3B,CACV,C,cAzCwBE,S","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for the save/cancel modal.\n *\n * @module core/modal_save_cancel\n * @class modal_save_cancel\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Modal from 'core/modal';\n\nexport default class extends Modal {\n constructor(root) {\n super(root);\n\n if (!this.getFooter().find(this.getActionSelector('save')).length) {\n Notification.exception({message: 'No save button found'});\n }\n\n if (!this.getFooter().find(this.getActionSelector('cancel')).length) {\n Notification.exception({message: 'No cancel button found'});\n }\n }\n\n /**\n * Register all event listeners.\n */\n registerEventListeners() {\n // Call the parent registration.\n super.registerEventListeners();\n\n // Register to close on save/cancel.\n this.registerCloseOnSave();\n this.registerCloseOnCancel();\n }\n\n /**\n * Override parent implementation to prevent changing the footer content.\n */\n setFooter() {\n Notification.exception({message: 'Can not change the footer of a save cancel modal'});\n return;\n }\n\n /**\n * Set the title of the save button.\n *\n * @param {String|Promise} value The button text, or a Promise which will resolve it\n * @returns{Promise}\n */\n setSaveButtonText(value) {\n return this.setButtonText('save', value);\n }\n}\n"],"file":"modal_save_cancel.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/modal_save_cancel.js"],"names":["root","getFooter","find","getActionSelector","length","Notification","exception","message","registerCloseOnSave","registerCloseOnCancel","value","setButtonText","Modal"],"mappings":"uJAsBA,uD,++DASI,WAAYA,CAAZ,CAAkB,iBACd,cAAMA,CAAN,EAEA,GAAI,CAAC,EAAKC,SAAL,GAAiBC,IAAjB,CAAsB,EAAKC,iBAAL,CAAuB,MAAvB,CAAtB,EAAsDC,MAA3D,CAAmE,CAC/DC,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,sBAAV,CAAvB,CACH,CAED,GAAI,CAAC,EAAKN,SAAL,GAAiBC,IAAjB,CAAsB,EAAKC,iBAAL,CAAuB,QAAvB,CAAtB,EAAwDC,MAA7D,CAAqE,CACjEC,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,wBAAV,CAAvB,CACH,CATa,QAUjB,C,0EAKwB,CAErB,2DAGA,KAAKC,mBAAL,GACA,KAAKC,qBAAL,EACH,C,6CAKW,CACRJ,YAAY,CAACC,SAAb,CAAuB,CAACC,OAAO,CAAE,kDAAV,CAAvB,CAEH,C,4DAQiBG,C,CAAO,CACrB,MAAO,MAAKC,aAAL,CAAmB,MAAnB,CAA2BD,CAA3B,CACV,C,cAzCwBE,S","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Contain the logic for the save/cancel modal.\n *\n * @module core/modal_save_cancel\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Modal from 'core/modal';\n\n/**\n * The Save/Cancel Modal.\n *\n * @class\n * @extends module:core/modal\n */\nexport default class extends Modal {\n constructor(root) {\n super(root);\n\n if (!this.getFooter().find(this.getActionSelector('save')).length) {\n Notification.exception({message: 'No save button found'});\n }\n\n if (!this.getFooter().find(this.getActionSelector('cancel')).length) {\n Notification.exception({message: 'No cancel button found'});\n }\n }\n\n /**\n * Register all event listeners.\n */\n registerEventListeners() {\n // Call the parent registration.\n super.registerEventListeners();\n\n // Register to close on save/cancel.\n this.registerCloseOnSave();\n this.registerCloseOnCancel();\n }\n\n /**\n * Override parent implementation to prevent changing the footer content.\n */\n setFooter() {\n Notification.exception({message: 'Can not change the footer of a save cancel modal'});\n return;\n }\n\n /**\n * Set the title of the save button.\n *\n * @param {String|Promise} value The button text, or a Promise which will resolve it\n * @returns{Promise}\n */\n setSaveButtonText(value) {\n return this.setButtonText('save', value);\n }\n}\n"],"file":"modal_save_cancel.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/normalise.min.js.map b/lib/amd/build/normalise.min.js.map
index 414b31f3d4d..9f3bab3046a 100644
--- a/lib/amd/build/normalise.min.js.map
+++ b/lib/amd/build/normalise.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/normalise.js"],"names":["getList","nodes","HTMLElement","Array","NodeList","from","jQuery","get"],"mappings":"2IAwBA,uDAEO,GAAMA,CAAAA,CAAO,CAAG,SAAAC,CAAK,CAAI,CAC5B,GAAIA,CAAK,WAAYC,CAAAA,WAArB,CAAkC,CAE9B,MAAO,CAACD,CAAD,CACV,CAED,GAAIA,CAAK,WAAYE,CAAAA,KAArB,CAA4B,CAExB,MAAOF,CAAAA,CACV,CAED,GAAIA,CAAK,WAAYG,CAAAA,QAArB,CAA+B,CAE3B,MAAOD,CAAAA,KAAK,CAACE,IAAN,CAAWJ,CAAX,CACV,CAED,GAAIA,CAAK,WAAYK,UAArB,CAA6B,CAEzB,MAAOL,CAAAA,CAAK,CAACM,GAAN,EACV,CAGD,MAAOJ,CAAAA,KAAK,CAACE,IAAN,CAAWJ,CAAX,CACV,CAvBM,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Normalisation helpers.\n *\n * @module core/normalise\n * @class normalise\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport jQuery from 'jquery';\n\nexport const getList = nodes => {\n if (nodes instanceof HTMLElement) {\n // A single record to conver to a NodeList.\n return [nodes];\n }\n\n if (nodes instanceof Array) {\n // A single record to conver to a NodeList.\n return nodes;\n }\n\n if (nodes instanceof NodeList) {\n // Already a NodeList.\n return Array.from(nodes);\n }\n\n if (nodes instanceof jQuery) {\n // A jQuery object to a NodeList.\n return nodes.get();\n }\n\n // Fallback to just having a go.\n return Array.from(nodes);\n};\n"],"file":"normalise.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/normalise.js"],"names":["getList","nodes","HTMLElement","Array","NodeList","from","jQuery","get"],"mappings":"2IAuBA,uDASO,GAAMA,CAAAA,CAAO,CAAG,SAAAC,CAAK,CAAI,CAC5B,GAAIA,CAAK,WAAYC,CAAAA,WAArB,CAAkC,CAE9B,MAAO,CAACD,CAAD,CACV,CAED,GAAIA,CAAK,WAAYE,CAAAA,KAArB,CAA4B,CAExB,MAAOF,CAAAA,CACV,CAED,GAAIA,CAAK,WAAYG,CAAAA,QAArB,CAA+B,CAE3B,MAAOD,CAAAA,KAAK,CAACE,IAAN,CAAWJ,CAAX,CACV,CAED,GAAIA,CAAK,WAAYK,UAArB,CAA6B,CAEzB,MAAOL,CAAAA,CAAK,CAACM,GAAN,EACV,CAGD,MAAOJ,CAAAA,KAAK,CAACE,IAAN,CAAWJ,CAAX,CACV,CAvBM,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Normalisation helpers.\n *\n * @module core/normalise\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport jQuery from 'jquery';\n\n/**\n * Normalise a list of Nodes into an Array of Nodes.\n *\n * @method getList\n * @param {(Array|jQuery|NodeList|HTMLElement)} nodes\n * @returns {HTMLElement[]}\n */\nexport const getList = nodes => {\n if (nodes instanceof HTMLElement) {\n // A single record to conver to a NodeList.\n return [nodes];\n }\n\n if (nodes instanceof Array) {\n // A single record to conver to a NodeList.\n return nodes;\n }\n\n if (nodes instanceof NodeList) {\n // Already a NodeList.\n return Array.from(nodes);\n }\n\n if (nodes instanceof jQuery) {\n // A jQuery object to a NodeList.\n return nodes.get();\n }\n\n // Fallback to just having a go.\n return Array.from(nodes);\n};\n"],"file":"normalise.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/permissionmanager.min.js.map b/lib/amd/build/permissionmanager.min.js.map
index 27f63bb467d..b6b9d8eed4c 100644
--- a/lib/amd/build/permissionmanager.min.js.map
+++ b/lib/amd/build/permissionmanager.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/permissionmanager.js"],"names":["define","$","config","notification","templates","Y","SELECTORS","ADDROLE","REMOVEROLE","UNPROHIBIT","rolesloadedevent","Event","contextid","contextname","adminurl","overideableroles","panel","loadOverideableRoles","params","getroles","sesskey","post","done","data","trigger","err","exception","fail","jqXHR","status","error","changePermissions","row","roleid","action","M","cfg","capability","templatedata","rolename","imageurl","util","image_url","spanclass","linkclass","icon","iconalt","get_string","find","first","closest","remove","render","content","insertBefore","allowedLink","hide","handleAddRole","e","preventDefault","link","currentTarget","one","use","confirmationDetails","cap","context","message","core","dialogue","draggable","modal","closeButton","width","set","i","existingrolelinks","roles","disabled","disable","filter","length","roledetails","push","show","on","handleRemoveRole","questionDetails","role","confirm","initialize","args","body"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n/*\n * @class permissionmanager\n * @copyright 2015 Martin Mastny \n * @since 3.0\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n /**\n * @module admin/permissionmanager\n */\ndefine(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yui'],\n function($, config, notification, templates, Y) {\n\n /**\n * Used CSS selectors\n * @access private\n */\n var SELECTORS = {\n ADDROLE: 'a.allowlink, a.prohibitlink',\n REMOVEROLE: 'a.preventlink, a.unprohibitlink',\n UNPROHIBIT: 'a.unprohibitlink'\n };\n var rolesloadedevent = $.Event('rolesloaded');\n var contextid;\n var contextname;\n var adminurl;\n var overideableroles;\n var panel = null;\n\n /**\n * Load all possible roles, which could be assigned from server\n *\n * @access private\n * @method loadOverideableRoles\n */\n var loadOverideableRoles = function() {\n var params = {\n contextid: contextid,\n getroles: 1,\n sesskey: config.sesskey\n };\n\n // Need to tell jQuery to expect JSON as the content type may not be correct (MDL-55041).\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n try {\n overideableroles = data;\n loadOverideableRoles = function() {\n $('body').trigger(rolesloadedevent);\n };\n loadOverideableRoles();\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Perform the UI changes after server change\n *\n * @access private\n * @method changePermissions\n * @param {JQuery} row\n * @param {int} roleid\n * @param {string} action\n */\n var changePermissions = function(row, roleid, action) {\n var params = {\n contextid: contextid,\n roleid: roleid,\n sesskey: M.cfg.sesskey,\n action: action,\n capability: row.data('name')\n };\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n var action = data;\n try {\n var templatedata = {rolename: overideableroles[roleid],\n roleid: roleid,\n adminurl: adminurl,\n imageurl: M.util.image_url('t/delete', 'moodle')\n };\n switch (action) {\n case 'allow':\n templatedata.spanclass = 'allowed';\n templatedata.linkclass = 'preventlink';\n templatedata.action = 'prevent';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prohibit':\n templatedata.spanclass = 'forbidden';\n templatedata.linkclass = 'unprohibitlink';\n templatedata.action = 'unprohibit';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prevent':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.allowed').remove();\n return;\n case 'unprohibit':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.forbidden').remove();\n return;\n default:\n return;\n }\n templates.render('core/permissionmanager_role', templatedata)\n .done(function(content) {\n if (action == 'allow') {\n $(content).insertBefore(row.find('.allowmore').first());\n } else if (action == 'prohibit') {\n $(content).insertBefore(row.find('.prohibitmore').first());\n // Remove allowed link\n var allowedLink = row.find('.allowedroles').first().find('a[data-role-id=\"' + roleid + '\"]');\n if (allowedLink) {\n allowedLink.first().closest('.allowed').remove();\n }\n }\n panel.hide();\n })\n .fail(notification.exception);\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Prompts user for selecting a role which is permitted\n *\n * @access private\n * @method handleAddRole\n * @param {event} e\n */\n var handleAddRole = function(e) {\n e.preventDefault();\n\n var link = $(e.currentTarget);\n\n // TODO: MDL-57778 Convert to core/modal.\n $('body').one('rolesloaded', function() {\n Y.use('moodle-core-notification-dialogue', function() {\n var action = link.data('action');\n var row = link.closest('tr.rolecap');\n var confirmationDetails = {\n cap: row.data('humanname'),\n context: contextname\n };\n var message = M.util.get_string('role' + action + 'info', 'core_role', confirmationDetails);\n if (panel === null) {\n panel = new M.core.dialogue({\n draggable: true,\n modal: true,\n closeButton: true,\n width: '450px'\n });\n }\n panel.set('headerContent', M.util.get_string('role' + action + 'header', 'core_role'));\n\n var i, existingrolelinks;\n\n var roles = [];\n switch (action) {\n case 'allow':\n existingrolelinks = row.find(SELECTORS.REMOVEROLE);\n break;\n case 'prohibit':\n existingrolelinks = row.find(SELECTORS.UNPROHIBIT);\n break;\n }\n for (i in overideableroles) {\n var disabled = '';\n var disable = existingrolelinks.filter(\"[data-role-id='\" + i + \"']\").length;\n if (disable) {\n disabled = 'disabled';\n }\n var roledetails = {roleid: i, rolename: overideableroles[i], disabled: disabled};\n roles.push(roledetails);\n }\n\n templates.render('core/permissionmanager_panelcontent', {message: message, roles: roles})\n .done(function(content) {\n panel.set('bodyContent', content);\n panel.show();\n $('div.role_buttons').on('click', 'button', function(e) {\n var roleid = $(e.currentTarget).data('role-id');\n changePermissions(row, roleid, action);\n });\n })\n .fail(notification.exception);\n\n });\n });\n loadOverideableRoles();\n };\n\n /**\n * Prompts user when removing permission\n *\n * @access private\n * @method handleRemoveRole\n * @param {event} e\n */\n var handleRemoveRole = function(e) {\n e.preventDefault();\n var link = $(e.currentTarget);\n $('body').one('rolesloaded', function() {\n var action = link.data('action');\n var roleid = link.data('role-id');\n var row = link.closest('tr.rolecap');\n var questionDetails = {\n role: overideableroles[roleid],\n cap: row.data('humanname'),\n context: contextname\n };\n\n notification.confirm(M.util.get_string('confirmunassigntitle', 'core_role'),\n M.util.get_string('confirmrole' + action, 'core_role', questionDetails),\n M.util.get_string('confirmunassignyes', 'core_role'),\n M.util.get_string('confirmunassignno', 'core_role'),\n function() {\n changePermissions(row, roleid, action);\n }\n );\n });\n loadOverideableRoles();\n };\n\n return /** @alias module:core/permissionmanager */ {\n /**\n * Initialize permissionmanager\n * @access public\n * @param {Object} args\n */\n initialize: function(args) {\n contextid = args.contextid;\n contextname = args.contextname;\n adminurl = args.adminurl;\n var body = $('body');\n body.on('click', SELECTORS.ADDROLE, handleAddRole);\n body.on('click', SELECTORS.REMOVEROLE, handleRemoveRole);\n }\n };\n});\n"],"file":"permissionmanager.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/permissionmanager.js"],"names":["define","$","config","notification","templates","Y","SELECTORS","ADDROLE","REMOVEROLE","UNPROHIBIT","rolesloadedevent","Event","contextid","contextname","adminurl","overideableroles","panel","loadOverideableRoles","params","getroles","sesskey","post","done","data","trigger","err","exception","fail","jqXHR","status","error","changePermissions","row","roleid","action","M","cfg","capability","templatedata","rolename","imageurl","util","image_url","spanclass","linkclass","icon","iconalt","get_string","find","first","closest","remove","render","content","insertBefore","allowedLink","hide","handleAddRole","e","preventDefault","link","currentTarget","one","use","confirmationDetails","cap","context","message","core","dialogue","draggable","modal","closeButton","width","set","i","existingrolelinks","roles","disabled","disable","filter","length","roledetails","push","show","on","handleRemoveRole","questionDetails","role","confirm","initialize","args","body"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * @copyright 2015 Martin Mastny \n * @since 3.0\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n /**\n * @module core/permissionmanager\n */\ndefine(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yui'],\n function($, config, notification, templates, Y) {\n\n /**\n * Used CSS selectors\n * @access private\n */\n var SELECTORS = {\n ADDROLE: 'a.allowlink, a.prohibitlink',\n REMOVEROLE: 'a.preventlink, a.unprohibitlink',\n UNPROHIBIT: 'a.unprohibitlink'\n };\n var rolesloadedevent = $.Event('rolesloaded');\n var contextid;\n var contextname;\n var adminurl;\n var overideableroles;\n var panel = null;\n\n /**\n * Load all possible roles, which could be assigned from server\n *\n * @access private\n * @method loadOverideableRoles\n */\n var loadOverideableRoles = function() {\n var params = {\n contextid: contextid,\n getroles: 1,\n sesskey: config.sesskey\n };\n\n // Need to tell jQuery to expect JSON as the content type may not be correct (MDL-55041).\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n try {\n overideableroles = data;\n loadOverideableRoles = function() {\n $('body').trigger(rolesloadedevent);\n };\n loadOverideableRoles();\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Perform the UI changes after server change\n *\n * @access private\n * @method changePermissions\n * @param {JQuery} row\n * @param {int} roleid\n * @param {string} action\n */\n var changePermissions = function(row, roleid, action) {\n var params = {\n contextid: contextid,\n roleid: roleid,\n sesskey: M.cfg.sesskey,\n action: action,\n capability: row.data('name')\n };\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n var action = data;\n try {\n var templatedata = {rolename: overideableroles[roleid],\n roleid: roleid,\n adminurl: adminurl,\n imageurl: M.util.image_url('t/delete', 'moodle')\n };\n switch (action) {\n case 'allow':\n templatedata.spanclass = 'allowed';\n templatedata.linkclass = 'preventlink';\n templatedata.action = 'prevent';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prohibit':\n templatedata.spanclass = 'forbidden';\n templatedata.linkclass = 'unprohibitlink';\n templatedata.action = 'unprohibit';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prevent':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.allowed').remove();\n return;\n case 'unprohibit':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.forbidden').remove();\n return;\n default:\n return;\n }\n templates.render('core/permissionmanager_role', templatedata)\n .done(function(content) {\n if (action == 'allow') {\n $(content).insertBefore(row.find('.allowmore').first());\n } else if (action == 'prohibit') {\n $(content).insertBefore(row.find('.prohibitmore').first());\n // Remove allowed link\n var allowedLink = row.find('.allowedroles').first().find('a[data-role-id=\"' + roleid + '\"]');\n if (allowedLink) {\n allowedLink.first().closest('.allowed').remove();\n }\n }\n panel.hide();\n })\n .fail(notification.exception);\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Prompts user for selecting a role which is permitted\n *\n * @access private\n * @method handleAddRole\n * @param {event} e\n */\n var handleAddRole = function(e) {\n e.preventDefault();\n\n var link = $(e.currentTarget);\n\n // TODO: MDL-57778 Convert to core/modal.\n $('body').one('rolesloaded', function() {\n Y.use('moodle-core-notification-dialogue', function() {\n var action = link.data('action');\n var row = link.closest('tr.rolecap');\n var confirmationDetails = {\n cap: row.data('humanname'),\n context: contextname\n };\n var message = M.util.get_string('role' + action + 'info', 'core_role', confirmationDetails);\n if (panel === null) {\n panel = new M.core.dialogue({\n draggable: true,\n modal: true,\n closeButton: true,\n width: '450px'\n });\n }\n panel.set('headerContent', M.util.get_string('role' + action + 'header', 'core_role'));\n\n var i, existingrolelinks;\n\n var roles = [];\n switch (action) {\n case 'allow':\n existingrolelinks = row.find(SELECTORS.REMOVEROLE);\n break;\n case 'prohibit':\n existingrolelinks = row.find(SELECTORS.UNPROHIBIT);\n break;\n }\n for (i in overideableroles) {\n var disabled = '';\n var disable = existingrolelinks.filter(\"[data-role-id='\" + i + \"']\").length;\n if (disable) {\n disabled = 'disabled';\n }\n var roledetails = {roleid: i, rolename: overideableroles[i], disabled: disabled};\n roles.push(roledetails);\n }\n\n templates.render('core/permissionmanager_panelcontent', {message: message, roles: roles})\n .done(function(content) {\n panel.set('bodyContent', content);\n panel.show();\n $('div.role_buttons').on('click', 'button', function(e) {\n var roleid = $(e.currentTarget).data('role-id');\n changePermissions(row, roleid, action);\n });\n })\n .fail(notification.exception);\n\n });\n });\n loadOverideableRoles();\n };\n\n /**\n * Prompts user when removing permission\n *\n * @access private\n * @method handleRemoveRole\n * @param {event} e\n */\n var handleRemoveRole = function(e) {\n e.preventDefault();\n var link = $(e.currentTarget);\n $('body').one('rolesloaded', function() {\n var action = link.data('action');\n var roleid = link.data('role-id');\n var row = link.closest('tr.rolecap');\n var questionDetails = {\n role: overideableroles[roleid],\n cap: row.data('humanname'),\n context: contextname\n };\n\n notification.confirm(M.util.get_string('confirmunassigntitle', 'core_role'),\n M.util.get_string('confirmrole' + action, 'core_role', questionDetails),\n M.util.get_string('confirmunassignyes', 'core_role'),\n M.util.get_string('confirmunassignno', 'core_role'),\n function() {\n changePermissions(row, roleid, action);\n }\n );\n });\n loadOverideableRoles();\n };\n\n return /** @alias module:core/permissionmanager */ {\n /**\n * Initialize permissionmanager\n * @access public\n * @param {Object} args\n */\n initialize: function(args) {\n contextid = args.contextid;\n contextname = args.contextname;\n adminurl = args.adminurl;\n var body = $('body');\n body.on('click', SELECTORS.ADDROLE, handleAddRole);\n body.on('click', SELECTORS.REMOVEROLE, handleRemoveRole);\n }\n };\n});\n"],"file":"permissionmanager.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/popover_region_controller.min.js.map b/lib/amd/build/popover_region_controller.min.js.map
index 5b080eae1ce..4301e6655dd 100644
--- a/lib/amd/build/popover_region_controller.min.js.map
+++ b/lib/amd/build/popover_region_controller.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/popover_region_controller.js"],"names":["define","$","str","customEvents","SELECTORS","CONTENT","CONTENT_CONTAINER","MENU_CONTAINER","MENU_TOGGLE","CAN_RECEIVE_FOCUS","PopoverRegionController","element","root","content","find","contentContainer","menuContainer","menuToggle","isLoading","promises","closeHandlers","Deferred","navigationHandlers","registerBaseEventListeners","prototype","events","menuOpened","menuClosed","startLoading","stopLoading","getContentContainer","getContent","isMenuOpen","hasClass","toggleMenu","closeMenu","openMenu","addClass","attr","updateButtonAriaLabel","trigger","removeClass","resolve","get_string","done","string","bind","focusMenuToggle","focus","contentItemHasFocus","getContentItemWithFocus","length","currentFocus","document","activeElement","items","children","currentItem","filter","has","focusContentItem","item","is","first","focusFirstContentItem","focusLastContentItem","last","focusNextContentItem","next","focusPreviousContentItem","prev","activate","escape","on","click","e","target","scrollBottom","registerListNavigationEventListeners","down","data","originalEvent","preventDefault","up","home","end"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the popover region element.\n *\n * See template: core/popover_region\n *\n * @module core/popover_region_controller\n * @class popover_region_controller\n * @copyright 2015 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/str', 'core/custom_interaction_events'],\n function($, str, customEvents) {\n\n var SELECTORS = {\n CONTENT: '.popover-region-content',\n CONTENT_CONTAINER: '.popover-region-content-container',\n MENU_CONTAINER: '.popover-region-container',\n MENU_TOGGLE: '.popover-region-toggle',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n };\n\n /**\n * Constructor for the PopoverRegionController.\n *\n * @param {jQuery} element object root element of the popover\n */\n var PopoverRegionController = function(element) {\n this.root = $(element);\n this.content = this.root.find(SELECTORS.CONTENT);\n this.contentContainer = this.root.find(SELECTORS.CONTENT_CONTAINER);\n this.menuContainer = this.root.find(SELECTORS.MENU_CONTAINER);\n this.menuToggle = this.root.find(SELECTORS.MENU_TOGGLE);\n this.isLoading = false;\n this.promises = {\n closeHandlers: $.Deferred(),\n navigationHandlers: $.Deferred(),\n };\n\n // Core event listeners to open and close.\n this.registerBaseEventListeners();\n };\n\n /**\n * The collection of events triggered by this controller.\n *\n * @returns {object}\n */\n PopoverRegionController.prototype.events = function() {\n return {\n menuOpened: 'popoverregion:menuopened',\n menuClosed: 'popoverregion:menuclosed',\n startLoading: 'popoverregion:startLoading',\n stopLoading: 'popoverregion:stopLoading',\n };\n };\n\n /**\n * Return the container element for the content element.\n *\n * @method getContentContainer\n * @return {jQuery} object\n */\n PopoverRegionController.prototype.getContentContainer = function() {\n return this.contentContainer;\n };\n\n /**\n * Return the content element.\n *\n * @method getContent\n * @return {jQuery} object\n */\n PopoverRegionController.prototype.getContent = function() {\n return this.content;\n };\n\n /**\n * Checks if the popover is displayed.\n *\n * @method isMenuOpen\n * @return {bool}\n */\n PopoverRegionController.prototype.isMenuOpen = function() {\n return !this.root.hasClass('collapsed');\n };\n\n /**\n * Toggle the visibility of the popover.\n *\n * @method toggleMenu\n */\n PopoverRegionController.prototype.toggleMenu = function() {\n if (this.isMenuOpen()) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n };\n\n /**\n * Hide the popover.\n *\n * Note: This triggers the menuClosed event.\n *\n * @method closeMenu\n */\n PopoverRegionController.prototype.closeMenu = function() {\n // We're already closed.\n if (!this.isMenuOpen()) {\n return;\n }\n\n this.root.addClass('collapsed');\n this.menuContainer.attr('aria-expanded', 'false');\n this.menuContainer.attr('aria-hidden', 'true');\n this.updateButtonAriaLabel();\n this.root.trigger(this.events().menuClosed);\n };\n\n /**\n * Show the popover.\n *\n * Note: This triggers the menuOpened event.\n *\n * @method openMenu\n */\n PopoverRegionController.prototype.openMenu = function() {\n // We're already open.\n if (this.isMenuOpen()) {\n return;\n }\n\n this.root.removeClass('collapsed');\n this.menuContainer.attr('aria-expanded', 'true');\n this.menuContainer.attr('aria-hidden', 'false');\n this.updateButtonAriaLabel();\n // Resolve the promises to allow the handlers to be added\n // to the DOM, if they have been requested.\n this.promises.closeHandlers.resolve();\n this.promises.navigationHandlers.resolve();\n this.root.trigger(this.events().menuOpened);\n };\n\n /**\n * Set the appropriate aria label on the popover toggle.\n *\n * @method updateButtonAriaLabel\n */\n PopoverRegionController.prototype.updateButtonAriaLabel = function() {\n if (this.isMenuOpen()) {\n str.get_string('hidepopoverwindow').done(function(string) {\n this.menuToggle.attr('aria-label', string);\n }.bind(this));\n } else {\n str.get_string('showpopoverwindow').done(function(string) {\n this.menuToggle.attr('aria-label', string);\n }.bind(this));\n }\n };\n\n /**\n * Set the loading state on this popover.\n *\n * Note: This triggers the startLoading event.\n *\n * @method startLoading\n */\n PopoverRegionController.prototype.startLoading = function() {\n this.isLoading = true;\n this.getContentContainer().addClass('loading');\n this.getContentContainer().attr('aria-busy', 'true');\n this.root.trigger(this.events().startLoading);\n };\n\n /**\n * Undo the loading state on this popover.\n *\n * Note: This triggers the stopLoading event.\n *\n * @method stopLoading\n */\n PopoverRegionController.prototype.stopLoading = function() {\n this.isLoading = false;\n this.getContentContainer().removeClass('loading');\n this.getContentContainer().attr('aria-busy', 'false');\n this.root.trigger(this.events().stopLoading);\n };\n\n /**\n * Sets the focus on the menu toggle.\n *\n * @method focusMenuToggle\n */\n PopoverRegionController.prototype.focusMenuToggle = function() {\n this.menuToggle.focus();\n };\n\n /**\n * Check if a content item has focus.\n *\n * @method contentItemHasFocus\n * @return {bool}\n */\n PopoverRegionController.prototype.contentItemHasFocus = function() {\n return this.getContentItemWithFocus().length > 0;\n };\n\n /**\n * Return the currently focused content item.\n *\n * @method getContentItemWithFocus\n * @return {jQuery} object\n */\n PopoverRegionController.prototype.getContentItemWithFocus = function() {\n var currentFocus = $(document.activeElement);\n var items = this.getContent().children();\n var currentItem = items.filter(currentFocus);\n\n if (!currentItem.length) {\n currentItem = items.has(currentFocus);\n }\n\n return currentItem;\n };\n\n /**\n * Focus the given content item or the first focusable element within\n * the content item.\n *\n * @method focusContentItem\n * @param {object} item The content item jQuery element\n */\n PopoverRegionController.prototype.focusContentItem = function(item) {\n if (item.is(SELECTORS.CAN_RECEIVE_FOCUS)) {\n item.focus();\n } else {\n item.find(SELECTORS.CAN_RECEIVE_FOCUS).first().focus();\n }\n };\n\n /**\n * Set focus on the first content item in the list.\n *\n * @method focusFirstContentItem\n */\n PopoverRegionController.prototype.focusFirstContentItem = function() {\n this.focusContentItem(this.getContent().children().first());\n };\n\n /**\n * Set focus on the last content item in the list.\n *\n * @method focusLastContentItem\n */\n PopoverRegionController.prototype.focusLastContentItem = function() {\n this.focusContentItem(this.getContent().children().last());\n };\n\n /**\n * Set focus on the content item after the item that currently has focus\n * in the list.\n *\n * @method focusNextContentItem\n */\n PopoverRegionController.prototype.focusNextContentItem = function() {\n var currentItem = this.getContentItemWithFocus();\n\n if (currentItem.length && currentItem.next()) {\n this.focusContentItem(currentItem.next());\n }\n };\n\n /**\n * Set focus on the content item preceding the item that currently has focus\n * in the list.\n *\n * @method focusPreviousContentItem\n */\n PopoverRegionController.prototype.focusPreviousContentItem = function() {\n var currentItem = this.getContentItemWithFocus();\n\n if (currentItem.length && currentItem.prev()) {\n this.focusContentItem(currentItem.prev());\n }\n };\n\n /**\n * Register the minimal amount of listeners for the popover to function.\n *\n * @method registerBaseEventListeners\n */\n PopoverRegionController.prototype.registerBaseEventListeners = function() {\n customEvents.define(this.root, [\n customEvents.events.activate,\n customEvents.events.escape,\n ]);\n\n // Toggle the popover visibility on activation (click/enter/space) of the toggle button.\n this.root.on(customEvents.events.activate, SELECTORS.MENU_TOGGLE, function() {\n this.toggleMenu();\n }.bind(this));\n\n // Delay the binding of these handlers until the region has been opened.\n this.promises.closeHandlers.done(function() {\n // Close the popover if escape is pressed.\n this.root.on(customEvents.events.escape, function() {\n this.closeMenu();\n this.focusMenuToggle();\n }.bind(this));\n\n // Close the popover if any other part of the page is clicked.\n $('html').click(function(e) {\n var target = $(e.target);\n if (!this.root.is(target) && !this.root.has(target).length) {\n this.closeMenu();\n }\n }.bind(this));\n\n customEvents.define(this.getContentContainer(), [\n customEvents.events.scrollBottom\n ]);\n }.bind(this));\n };\n\n /**\n * Set up the event listeners for keyboard navigating a list of content items.\n *\n * @method registerListNavigationEventListeners\n */\n PopoverRegionController.prototype.registerListNavigationEventListeners = function() {\n customEvents.define(this.root, [\n customEvents.events.down\n ]);\n\n // If the down arrow is pressed then open the menu and focus the first content\n // item or focus the next content item if the menu is open.\n this.root.on(customEvents.events.down, function(e, data) {\n if (!this.isMenuOpen()) {\n this.openMenu();\n this.focusFirstContentItem();\n } else {\n if (this.contentItemHasFocus()) {\n this.focusNextContentItem();\n } else {\n this.focusFirstContentItem();\n }\n }\n\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Delay the binding of these handlers until the region has been opened.\n this.promises.navigationHandlers.done(function() {\n customEvents.define(this.root, [\n customEvents.events.up,\n customEvents.events.home,\n customEvents.events.end,\n ]);\n\n // Shift focus to the previous content item if the up key is pressed.\n this.root.on(customEvents.events.up, function(e, data) {\n this.focusPreviousContentItem();\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Jump focus to the first content item if the home key is pressed.\n this.root.on(customEvents.events.home, function(e, data) {\n this.focusFirstContentItem();\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Jump focus to the last content item if the end key is pressed.\n this.root.on(customEvents.events.end, function(e, data) {\n this.focusLastContentItem();\n data.originalEvent.preventDefault();\n }.bind(this));\n }.bind(this));\n };\n\n return PopoverRegionController;\n});\n"],"file":"popover_region_controller.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/popover_region_controller.js"],"names":["define","$","str","customEvents","SELECTORS","CONTENT","CONTENT_CONTAINER","MENU_CONTAINER","MENU_TOGGLE","CAN_RECEIVE_FOCUS","PopoverRegionController","element","root","content","find","contentContainer","menuContainer","menuToggle","isLoading","promises","closeHandlers","Deferred","navigationHandlers","registerBaseEventListeners","prototype","events","menuOpened","menuClosed","startLoading","stopLoading","getContentContainer","getContent","isMenuOpen","hasClass","toggleMenu","closeMenu","openMenu","addClass","attr","updateButtonAriaLabel","trigger","removeClass","resolve","get_string","done","string","bind","focusMenuToggle","focus","contentItemHasFocus","getContentItemWithFocus","length","currentFocus","document","activeElement","items","children","currentItem","filter","has","focusContentItem","item","is","first","focusFirstContentItem","focusLastContentItem","last","focusNextContentItem","next","focusPreviousContentItem","prev","activate","escape","on","click","e","target","scrollBottom","registerListNavigationEventListeners","down","data","originalEvent","preventDefault","up","home","end"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the popover region element.\n *\n * See template: core/popover_region\n *\n * @module core/popover_region_controller\n * @copyright 2015 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/str', 'core/custom_interaction_events'],\n function($, str, customEvents) {\n\n var SELECTORS = {\n CONTENT: '.popover-region-content',\n CONTENT_CONTAINER: '.popover-region-content-container',\n MENU_CONTAINER: '.popover-region-container',\n MENU_TOGGLE: '.popover-region-toggle',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n };\n\n /**\n * Constructor for the PopoverRegionController.\n *\n * @param {jQuery} element object root element of the popover\n */\n var PopoverRegionController = function(element) {\n this.root = $(element);\n this.content = this.root.find(SELECTORS.CONTENT);\n this.contentContainer = this.root.find(SELECTORS.CONTENT_CONTAINER);\n this.menuContainer = this.root.find(SELECTORS.MENU_CONTAINER);\n this.menuToggle = this.root.find(SELECTORS.MENU_TOGGLE);\n this.isLoading = false;\n this.promises = {\n closeHandlers: $.Deferred(),\n navigationHandlers: $.Deferred(),\n };\n\n // Core event listeners to open and close.\n this.registerBaseEventListeners();\n };\n\n /**\n * The collection of events triggered by this controller.\n *\n * @returns {object}\n */\n PopoverRegionController.prototype.events = function() {\n return {\n menuOpened: 'popoverregion:menuopened',\n menuClosed: 'popoverregion:menuclosed',\n startLoading: 'popoverregion:startLoading',\n stopLoading: 'popoverregion:stopLoading',\n };\n };\n\n /**\n * Return the container element for the content element.\n *\n * @method getContentContainer\n * @return {jQuery} object\n */\n PopoverRegionController.prototype.getContentContainer = function() {\n return this.contentContainer;\n };\n\n /**\n * Return the content element.\n *\n * @method getContent\n * @return {jQuery} object\n */\n PopoverRegionController.prototype.getContent = function() {\n return this.content;\n };\n\n /**\n * Checks if the popover is displayed.\n *\n * @method isMenuOpen\n * @return {bool}\n */\n PopoverRegionController.prototype.isMenuOpen = function() {\n return !this.root.hasClass('collapsed');\n };\n\n /**\n * Toggle the visibility of the popover.\n *\n * @method toggleMenu\n */\n PopoverRegionController.prototype.toggleMenu = function() {\n if (this.isMenuOpen()) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n };\n\n /**\n * Hide the popover.\n *\n * Note: This triggers the menuClosed event.\n *\n * @method closeMenu\n */\n PopoverRegionController.prototype.closeMenu = function() {\n // We're already closed.\n if (!this.isMenuOpen()) {\n return;\n }\n\n this.root.addClass('collapsed');\n this.menuContainer.attr('aria-expanded', 'false');\n this.menuContainer.attr('aria-hidden', 'true');\n this.updateButtonAriaLabel();\n this.root.trigger(this.events().menuClosed);\n };\n\n /**\n * Show the popover.\n *\n * Note: This triggers the menuOpened event.\n *\n * @method openMenu\n */\n PopoverRegionController.prototype.openMenu = function() {\n // We're already open.\n if (this.isMenuOpen()) {\n return;\n }\n\n this.root.removeClass('collapsed');\n this.menuContainer.attr('aria-expanded', 'true');\n this.menuContainer.attr('aria-hidden', 'false');\n this.updateButtonAriaLabel();\n // Resolve the promises to allow the handlers to be added\n // to the DOM, if they have been requested.\n this.promises.closeHandlers.resolve();\n this.promises.navigationHandlers.resolve();\n this.root.trigger(this.events().menuOpened);\n };\n\n /**\n * Set the appropriate aria label on the popover toggle.\n *\n * @method updateButtonAriaLabel\n */\n PopoverRegionController.prototype.updateButtonAriaLabel = function() {\n if (this.isMenuOpen()) {\n str.get_string('hidepopoverwindow').done(function(string) {\n this.menuToggle.attr('aria-label', string);\n }.bind(this));\n } else {\n str.get_string('showpopoverwindow').done(function(string) {\n this.menuToggle.attr('aria-label', string);\n }.bind(this));\n }\n };\n\n /**\n * Set the loading state on this popover.\n *\n * Note: This triggers the startLoading event.\n *\n * @method startLoading\n */\n PopoverRegionController.prototype.startLoading = function() {\n this.isLoading = true;\n this.getContentContainer().addClass('loading');\n this.getContentContainer().attr('aria-busy', 'true');\n this.root.trigger(this.events().startLoading);\n };\n\n /**\n * Undo the loading state on this popover.\n *\n * Note: This triggers the stopLoading event.\n *\n * @method stopLoading\n */\n PopoverRegionController.prototype.stopLoading = function() {\n this.isLoading = false;\n this.getContentContainer().removeClass('loading');\n this.getContentContainer().attr('aria-busy', 'false');\n this.root.trigger(this.events().stopLoading);\n };\n\n /**\n * Sets the focus on the menu toggle.\n *\n * @method focusMenuToggle\n */\n PopoverRegionController.prototype.focusMenuToggle = function() {\n this.menuToggle.focus();\n };\n\n /**\n * Check if a content item has focus.\n *\n * @method contentItemHasFocus\n * @return {bool}\n */\n PopoverRegionController.prototype.contentItemHasFocus = function() {\n return this.getContentItemWithFocus().length > 0;\n };\n\n /**\n * Return the currently focused content item.\n *\n * @method getContentItemWithFocus\n * @return {jQuery} object\n */\n PopoverRegionController.prototype.getContentItemWithFocus = function() {\n var currentFocus = $(document.activeElement);\n var items = this.getContent().children();\n var currentItem = items.filter(currentFocus);\n\n if (!currentItem.length) {\n currentItem = items.has(currentFocus);\n }\n\n return currentItem;\n };\n\n /**\n * Focus the given content item or the first focusable element within\n * the content item.\n *\n * @method focusContentItem\n * @param {object} item The content item jQuery element\n */\n PopoverRegionController.prototype.focusContentItem = function(item) {\n if (item.is(SELECTORS.CAN_RECEIVE_FOCUS)) {\n item.focus();\n } else {\n item.find(SELECTORS.CAN_RECEIVE_FOCUS).first().focus();\n }\n };\n\n /**\n * Set focus on the first content item in the list.\n *\n * @method focusFirstContentItem\n */\n PopoverRegionController.prototype.focusFirstContentItem = function() {\n this.focusContentItem(this.getContent().children().first());\n };\n\n /**\n * Set focus on the last content item in the list.\n *\n * @method focusLastContentItem\n */\n PopoverRegionController.prototype.focusLastContentItem = function() {\n this.focusContentItem(this.getContent().children().last());\n };\n\n /**\n * Set focus on the content item after the item that currently has focus\n * in the list.\n *\n * @method focusNextContentItem\n */\n PopoverRegionController.prototype.focusNextContentItem = function() {\n var currentItem = this.getContentItemWithFocus();\n\n if (currentItem.length && currentItem.next()) {\n this.focusContentItem(currentItem.next());\n }\n };\n\n /**\n * Set focus on the content item preceding the item that currently has focus\n * in the list.\n *\n * @method focusPreviousContentItem\n */\n PopoverRegionController.prototype.focusPreviousContentItem = function() {\n var currentItem = this.getContentItemWithFocus();\n\n if (currentItem.length && currentItem.prev()) {\n this.focusContentItem(currentItem.prev());\n }\n };\n\n /**\n * Register the minimal amount of listeners for the popover to function.\n *\n * @method registerBaseEventListeners\n */\n PopoverRegionController.prototype.registerBaseEventListeners = function() {\n customEvents.define(this.root, [\n customEvents.events.activate,\n customEvents.events.escape,\n ]);\n\n // Toggle the popover visibility on activation (click/enter/space) of the toggle button.\n this.root.on(customEvents.events.activate, SELECTORS.MENU_TOGGLE, function() {\n this.toggleMenu();\n }.bind(this));\n\n // Delay the binding of these handlers until the region has been opened.\n this.promises.closeHandlers.done(function() {\n // Close the popover if escape is pressed.\n this.root.on(customEvents.events.escape, function() {\n this.closeMenu();\n this.focusMenuToggle();\n }.bind(this));\n\n // Close the popover if any other part of the page is clicked.\n $('html').click(function(e) {\n var target = $(e.target);\n if (!this.root.is(target) && !this.root.has(target).length) {\n this.closeMenu();\n }\n }.bind(this));\n\n customEvents.define(this.getContentContainer(), [\n customEvents.events.scrollBottom\n ]);\n }.bind(this));\n };\n\n /**\n * Set up the event listeners for keyboard navigating a list of content items.\n *\n * @method registerListNavigationEventListeners\n */\n PopoverRegionController.prototype.registerListNavigationEventListeners = function() {\n customEvents.define(this.root, [\n customEvents.events.down\n ]);\n\n // If the down arrow is pressed then open the menu and focus the first content\n // item or focus the next content item if the menu is open.\n this.root.on(customEvents.events.down, function(e, data) {\n if (!this.isMenuOpen()) {\n this.openMenu();\n this.focusFirstContentItem();\n } else {\n if (this.contentItemHasFocus()) {\n this.focusNextContentItem();\n } else {\n this.focusFirstContentItem();\n }\n }\n\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Delay the binding of these handlers until the region has been opened.\n this.promises.navigationHandlers.done(function() {\n customEvents.define(this.root, [\n customEvents.events.up,\n customEvents.events.home,\n customEvents.events.end,\n ]);\n\n // Shift focus to the previous content item if the up key is pressed.\n this.root.on(customEvents.events.up, function(e, data) {\n this.focusPreviousContentItem();\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Jump focus to the first content item if the home key is pressed.\n this.root.on(customEvents.events.home, function(e, data) {\n this.focusFirstContentItem();\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Jump focus to the last content item if the end key is pressed.\n this.root.on(customEvents.events.end, function(e, data) {\n this.focusLastContentItem();\n data.originalEvent.preventDefault();\n }.bind(this));\n }.bind(this));\n };\n\n return PopoverRegionController;\n});\n"],"file":"popover_region_controller.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/prefetch.min.js b/lib/amd/build/prefetch.min.js
index 95f70ab1cf8..5513353325c 100644
--- a/lib/amd/build/prefetch.min.js
+++ b/lib/amd/build/prefetch.min.js
@@ -1,2 +1,2 @@
-define ("core/prefetch",["exports","core/config"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;b=function(a){return a&&a.__esModule?a:{default:a}}(b);var i="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};function c(a){return g(a)||f(a)||e(a)||d()}function d(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function e(a,b){if(!a)return;if("string"==typeof a)return h(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return h(a,b)}function f(a){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(a))return Array.from(a)}function g(a){if(Array.isArray(a))return h(a)}function h(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);ca.length)b=a.length;for(var c=0,d=Array(b);c .\n\n/**\n * Prefetch module to help lazily load content for use on the current page.\n *\n * @module core/prefetch\n * @class prefetch\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Config from 'core/config';\n\n// Keep track of whether the initial prefetch has occurred.\nlet initialPrefetchComplete = false;\n\n// Prefetch templates.\nlet templateList = [];\n\n// Prefetch strings.\nlet stringList = {};\n\nlet prefetchTimer;\n\n/**\n * Fetch all queued items in the queue.\n *\n * Should only be called via processQueue.\n */\nconst fetchQueue = () => {\n // Prefetch templates.\n if (templateList) {\n const templatesToLoad = templateList.slice();\n templateList = [];\n import('core/templates')\n .then(Templates => Templates.prefetchTemplates(templatesToLoad))\n .catch();\n }\n\n // Prefetch strings.\n const mappedStringsToFetch = stringList;\n stringList = {};\n\n const stringsToFetch = [];\n Object.keys(mappedStringsToFetch).forEach(component => {\n stringsToFetch.push(...mappedStringsToFetch[component].map(key => {\n return {component, key};\n }));\n });\n\n if (stringsToFetch) {\n import('core/str')\n .then(Str => Str.get_strings(stringsToFetch))\n .catch();\n }\n};\n\n/**\n * Process the prefetch queues as required.\n *\n * The initial call will queue the first fetch after a delay.\n * Subsequent fetches are immediate.\n */\nconst processQueue = () => {\n if (prefetchTimer) {\n // There is a live prefetch timer. The initial prefetch has been scheduled but is not complete.\n return;\n }\n\n // The initial prefetch has compelted. Just queue as normal.\n if (initialPrefetchComplete) {\n fetchQueue();\n\n return;\n }\n\n // Queue the initial prefetch in a short while.\n prefetchTimer = setTimeout(() => {\n initialPrefetchComplete = true;\n prefetchTimer = null;\n\n // Ensure that the icon system is loaded.\n // This can be quite slow and delay UI interactions if it is loaded on demand.\n import(Config.iconsystemmodule)\n .then(IconSystem => {\n const iconSystem = new IconSystem();\n prefetchTemplate(iconSystem.getTemplateName());\n\n return iconSystem;\n })\n .then(iconSystem => {\n fetchQueue();\n iconSystem.init();\n\n return;\n })\n .catch();\n }, 500);\n};\n\n/**\n * Add a set of templates to the prefetch queue.\n *\n * @param {Array} templatesNames\n */\nconst prefetchTemplates = templatesNames => {\n templateList = templateList.concat(templatesNames);\n\n processQueue();\n};\n\n/**\n * Add a single template to the prefetch queue.\n *\n * @param {String} templateName\n * @returns {undefined}\n */\nconst prefetchTemplate = templateName => prefetchTemplates([templateName]);\n\n/**\n * Add a set of strings from the same component to the prefetch queue.\n *\n * @param {String} component\n * @param {String[]} keys\n */\nconst prefetchStrings = (component, keys) => {\n if (!stringList[component]) {\n stringList[component] = [];\n }\n\n stringList[component] = stringList[component].concat(keys);\n\n processQueue();\n};\n\n/**\n * Add a single string to the prefetch queue.\n *\n * @param {String} component\n * @param {String} key\n */\nconst prefetchString = (component, key) => {\n if (!stringList[component]) {\n stringList[component] = [];\n }\n\n stringList[component].push(key);\n\n processQueue();\n};\n\n// Prefetch some commonly-used templates.\nprefetchTemplates([].concat(\n ['core/loading'],\n ['core/modal'],\n ['core/modal_backdrop'],\n));\n\n// And some commonly used strings.\nprefetchStrings('core', [\n 'cancel',\n 'closebuttontitle',\n 'loading',\n 'savechanges',\n]);\nprefetchStrings('core_form', [\n 'showless',\n 'showmore',\n]);\n\nexport default {\n prefetchTemplate,\n prefetchTemplates,\n prefetchString,\n prefetchStrings,\n};\n"],"file":"prefetch.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/prefetch.js"],"names":["initialPrefetchComplete","templateList","stringList","prefetchTimer","fetchQueue","templatesToLoad","slice","then","Templates","prefetchTemplates","catch","mappedStringsToFetch","stringsToFetch","Object","keys","forEach","component","push","map","key","Str","get_strings","processQueue","setTimeout","Config","iconsystemmodule","IconSystem","iconSystem","prefetchTemplate","getTemplateName","init","templatesNames","concat","templateName","prefetchStrings","prefetchString"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Prefetch module to help lazily load content for use on the current page.\n *\n * @module core/prefetch\n * @copyright 2020 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n *\n * @example Pre-fetching a set of strings to use later \n *\n * import prefetch from 'core/prefetch';\n *\n * // A single string prefetch.\n * prefetch.prefetchString('error', 'cannotfindteacher');\n *\n * // Prefetch multiple strings in the same component.\n * prefetch.prefetchStrings('core', [\n * 'yes',\n * 'no',\n * ]);\n *\n * // Use the strings.\n * import {get_string as getString, get_strings as getStrings} from 'core/str';\n * getString('cannotfindteacher', 'error')\n * .then(str => {\n * window.console.log(str); // Cannot find teacher\n * })\n * .catch();\n * getStrings([\n * {\n * key: 'cannotfindteacher',\n * component: 'error',\n * },\n * {\n * key: 'yes',\n * component: 'core',\n * },\n * {\n * key: 'no',\n * component: 'core',\n * },\n * ])\n * .then((cannotFindTeacher, yes, no) => {\n * window.console.log(cannotFindTeacher); // Cannot find teacher\n * window.console.log(yes); // Yes\n * window.console.log(no); // No\n * })\n * .catch();\n */\nimport Config from 'core/config';\n\n// Keep track of whether the initial prefetch has occurred.\nlet initialPrefetchComplete = false;\n\n// Prefetch templates.\nlet templateList = [];\n\n// Prefetch strings.\nlet stringList = {};\n\nlet prefetchTimer;\n\n/**\n * Fetch all queued items in the queue.\n *\n * Should only be called via processQueue.\n * @private\n */\nconst fetchQueue = () => {\n // Prefetch templates.\n if (templateList) {\n const templatesToLoad = templateList.slice();\n templateList = [];\n import('core/templates')\n .then(Templates => Templates.prefetchTemplates(templatesToLoad))\n .catch();\n }\n\n // Prefetch strings.\n const mappedStringsToFetch = stringList;\n stringList = {};\n\n const stringsToFetch = [];\n Object.keys(mappedStringsToFetch).forEach(component => {\n stringsToFetch.push(...mappedStringsToFetch[component].map(key => {\n return {component, key};\n }));\n });\n\n if (stringsToFetch) {\n import('core/str')\n .then(Str => Str.get_strings(stringsToFetch))\n .catch();\n }\n};\n\n/**\n * Process the prefetch queues as required.\n *\n * The initial call will queue the first fetch after a delay.\n * Subsequent fetches are immediate.\n *\n * @private\n */\nconst processQueue = () => {\n if (prefetchTimer) {\n // There is a live prefetch timer. The initial prefetch has been scheduled but is not complete.\n return;\n }\n\n // The initial prefetch has compelted. Just queue as normal.\n if (initialPrefetchComplete) {\n fetchQueue();\n\n return;\n }\n\n // Queue the initial prefetch in a short while.\n prefetchTimer = setTimeout(() => {\n initialPrefetchComplete = true;\n prefetchTimer = null;\n\n // Ensure that the icon system is loaded.\n // This can be quite slow and delay UI interactions if it is loaded on demand.\n import(Config.iconsystemmodule)\n .then(IconSystem => {\n const iconSystem = new IconSystem();\n prefetchTemplate(iconSystem.getTemplateName());\n\n return iconSystem;\n })\n .then(iconSystem => {\n fetchQueue();\n iconSystem.init();\n\n return;\n })\n .catch();\n }, 500);\n};\n\n/**\n * Add a set of templates to the prefetch queue.\n *\n * @param {Array} templatesNames A list of the template names to fetch\n * @static\n */\nconst prefetchTemplates = templatesNames => {\n templateList = templateList.concat(templatesNames);\n\n processQueue();\n};\n\n/**\n * Add a single template to the prefetch queue.\n *\n * @param {String} templateName The template names to fetch\n * @static\n */\nconst prefetchTemplate = templateName => {\n prefetchTemplates([templateName]);\n};\n\n/**\n * Add a set of strings from the same component to the prefetch queue.\n *\n * @param {String} component The component that all of the strings belongs to\n * @param {String[]} keys An array of string identifiers.\n * @static\n */\nconst prefetchStrings = (component, keys) => {\n if (!stringList[component]) {\n stringList[component] = [];\n }\n\n stringList[component] = stringList[component].concat(keys);\n\n processQueue();\n};\n\n/**\n * Add a single string to the prefetch queue.\n *\n * @param {String} component The component that the string belongs to\n * @param {String} key The string identifier\n * @static\n */\nconst prefetchString = (component, key) => {\n if (!stringList[component]) {\n stringList[component] = [];\n }\n\n stringList[component].push(key);\n\n processQueue();\n};\n\n// Prefetch some commonly-used templates.\nprefetchTemplates([].concat(\n ['core/loading'],\n ['core/modal'],\n ['core/modal_backdrop'],\n));\n\n// And some commonly used strings.\nprefetchStrings('core', [\n 'cancel',\n 'closebuttontitle',\n 'loading',\n 'savechanges',\n]);\nprefetchStrings('core_form', [\n 'showless',\n 'showmore',\n]);\n\nexport default {\n prefetchTemplate,\n prefetchTemplates,\n prefetchString,\n prefetchStrings,\n};\n"],"file":"prefetch.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/sortable_list.min.js.map b/lib/amd/build/sortable_list.min.js.map
index 39d14f001cc..1c0d3dde72c 100644
--- a/lib/amd/build/sortable_list.min.js.map
+++ b/lib/amd/build/sortable_list.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/sortable_list.js"],"names":["define","$","log","autoScroll","str","ModalFactory","ModalEvents","Notification","defaultParameters","targetListSelector","moveHandlerSelector","isHorizontal","CSS","keyboardDragClass","isDraggedClass","currentPositionClass","sourceListClass","targetListClass","overElementClass","registerNotPassiveListeners","eventname","setup","x","ns","handle","includes","addEventListener","passive","eventListenerOptionsSupported","passivesupported","options","Object","defineProperty","get","document","removeEventListener","err","event","special","touchstart","touchmove","touchend","SortableList","root","config","info","proxy","proxyDelta","dragCounter","lastEvent","extend","listSelector","on","dragStartHandler","clickHandler","EVENTS","DRAGSTART","DRAG","DROP","DRAGEND","prototype","resetDraggedClasses","classes","i","removeClass","remove","calculatePositionOnPage","evt","originalEvent","touches","touch","pageX","pageY","clientX","Math","round","window","scrollLeft","clientY","scrollTop","type","moveElement","sourceList","sourceNextElement","finishDragging","which","movedElement","target","closest","currentTarget","children","length","stopPropagation","preventDefault","element","next","parent","targetNextElement","targetList","dropped","startX","startY","startTime","Date","getTime","addClass","offset","left","y","top","thisDragCounter","setTimeout","createProxy","dragHandler","dragcancelHandler","start","trigger","executeCallback","clone","append","removeAttr","css","position","keyCode","clickedElement","displayMoveDialogue","getPositionInNode","node","rect","getBoundingClientRect","scrollY","scrollX","width","height","xRatio","yRatio","isListHorizontal","elementFromPoint","mainElement","isNotSelf","current","filter","currentList","isNotProxy","find","coordinates","ratio","subList","subListEmpty","endX","endY","endTime","positionChanged","hasPositionChanged","oldinfo","parentElement","beforeElement","dragEl","insertBefore","appendChild","stop","off","eventName","getElementName","Deferred","resolve","text","getDestinationName","afterElement","get_string","then","name","getMoveDialogueTitle","handler","attr","getDestinationsList","addedLists","targets","destinations","result","when","createLink","is","contains","txt","li","appendTo","a","data","addList","inArray","push","list","each","prev","last","create","types","CANCEL","title","body","modal","quickMoveHandler","e","focus","hide","getRoot","hidden","destroy","setLarge","show","catch","exception"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A javascript module to handle list items drag and drop\n *\n * Example of usage:\n *\n * Create a list (for example or ) where each draggable element has a drag handle.\n * The best practice is to use the template core/drag_handle:\n * $OUTPUT->render_from_template('core/drag_handle', ['movetitle' => get_string('movecontent', 'moodle', ELEMENTNAME)]);\n *\n * Attach this JS module to this list:\n *\n * Space between define and ( critical in comment but not allowed in code in order to function\n * correctly with Moodle's requirejs.php\n *\n * define (['jquery', 'core/sortable_list'], function($, SortableList) {\n * var list = new SortableList('ul.my-awesome-list'); // source list (usually or ) - selector or element\n *\n * // Listen to the events when element is dragged.\n * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {\n * console.log(info);\n * });\n *\n * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:\n * list.getElementName = function(element) {\n * return $.Deferred().resolve(element.attr('data-name'));\n * }\n * }\n *\n * More details: https://docs.moodle.org/dev/Sortable_list\n *\n * For the full list of possible parameters see var defaultParameters below.\n *\n * The following jQuery events are fired:\n * - SortableList.EVENTS.DRAGSTART : when user started dragging a list element\n * - SortableList.EVENTS.DRAG : when user dragged a list element to a new position\n * - SortableList.EVENTS.DROP : when user dropped a list element\n * - SortableList.EVENTS.DROPEND : when user finished dragging - either fired right after dropping or\n * if \"Esc\" was pressed during dragging\n *\n * @module core/sortable_list\n * @class sortable_list\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/autoscroll', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification'],\nfunction($, log, autoScroll, str, ModalFactory, ModalEvents, Notification) {\n\n /**\n * Default parameters\n *\n * @private\n * @type {Object}\n */\n var defaultParameters = {\n targetListSelector: null,\n moveHandlerSelector: '[data-drag-type=move]',\n isHorizontal: false,\n autoScroll: true\n };\n\n /**\n * Class names for different elements that may be changed during sorting\n *\n * @private\n * @type {Object}\n */\n var CSS = {\n keyboardDragClass: 'dragdrop-keyboard-drag',\n isDraggedClass: 'sortable-list-is-dragged',\n currentPositionClass: 'sortable-list-current-position',\n sourceListClass: 'sortable-list-source',\n targetListClass: 'sortable-list-target',\n overElementClass: 'sortable-list-over-element'\n };\n\n /**\n * Test the browser support for options objects on event listeners.\n * @return {Boolean}\n */\n var eventListenerOptionsSupported = function() {\n var passivesupported = false,\n options,\n testeventname = \"testpassiveeventoptions\";\n\n // Options support testing example from:\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n\n try {\n options = Object.defineProperty({}, \"passive\", {\n get: function() {\n passivesupported = true;\n }\n });\n\n // We use an event name that is not likely to conflict with any real event.\n document.addEventListener(testeventname, options, options);\n // We remove the event listener as we have tested the options already.\n document.removeEventListener(testeventname, options, options);\n } catch (err) {\n // It's already false.\n passivesupported = false;\n }\n return passivesupported;\n };\n\n /**\n * Allow to create non-passive touchstart listeners and prevent page scrolling when dragging\n * From: https://stackoverflow.com/a/48098097\n *\n * @type {Object}\n */\n var registerNotPassiveListeners = function(eventname) {\n return {\n setup: function(x, ns, handle) {\n if (ns.includes('notPassive')) {\n this.addEventListener(eventname, handle, {passive: false});\n return true;\n } else {\n return false;\n }\n }\n };\n };\n\n if (eventListenerOptionsSupported) {\n $.event.special.touchstart = registerNotPassiveListeners('touchstart');\n $.event.special.touchmove = registerNotPassiveListeners('touchmove');\n $.event.special.touchend = registerNotPassiveListeners('touchend');\n }\n\n /**\n * Initialise sortable list.\n *\n * @param {(String|jQuery|Element)} root JQuery/DOM element representing sortable list (i.e. , ) or CSS selector\n * @param {Object} config Parameters for the list. See defaultParameters above for examples.\n * @property {(String|jQuery|Element)} config.targetListSelector target lists, by default same as root\n * @property {String} config.moveHandlerSelector CSS selector for a drag handle. By default '[data-drag-type=move]'\n * @property {String} config.targetListSelector CSS selector for target lists. By default the same as root\n * @property {(Boolean|Function)} config.isHorizontal Set to true if the list is horizontal\n * (can also be a callback with list as an argument)\n * @property {Boolean} config.autoScroll Engages autoscroll module for automatic vertical scrolling of the\n * whole page, by default true\n */\n var SortableList = function(root, config) {\n\n this.info = null;\n this.proxy = null;\n this.proxyDelta = null;\n this.dragCounter = 0;\n this.lastEvent = null;\n\n this.config = $.extend({}, defaultParameters, config || {});\n this.config.listSelector = root;\n if (!this.config.targetListSelector) {\n this.config.targetListSelector = root;\n }\n if (typeof this.config.listSelector === 'object') {\n // The root is an element on the page. Register a listener for this element.\n $(this.config.listSelector).on('mousedown touchstart.notPassive', $.proxy(this.dragStartHandler, this));\n } else {\n // The root is a CSS selector. Register a listener that picks up the element dynamically.\n $('body').on('mousedown touchstart.notPassive', this.config.listSelector, $.proxy(this.dragStartHandler, this));\n }\n if (this.config.moveHandlerSelector !== null) {\n $('body').on('click keypress', this.config.moveHandlerSelector, $.proxy(this.clickHandler, this));\n }\n\n };\n\n /**\n * Events fired by this entity\n *\n * @public\n * @type {Object}\n */\n SortableList.EVENTS = {\n DRAGSTART: 'sortablelist-dragstart',\n DRAG: 'sortablelist-drag',\n DROP: 'sortablelist-drop',\n DRAGEND: 'sortablelist-dragend'\n };\n\n /**\n * Resets the temporary classes assigned during dragging\n * @private\n */\n SortableList.prototype.resetDraggedClasses = function() {\n var classes = [\n CSS.isDraggedClass,\n CSS.currentPositionClass,\n CSS.overElementClass,\n CSS.targetListClass,\n ];\n for (var i in classes) {\n $('.' + classes[i]).removeClass(classes[i]);\n }\n if (this.proxy) {\n this.proxy.remove();\n this.proxy = $();\n }\n };\n\n /**\n * Calculates evt.pageX, evt.pageY, evt.clientX and evt.clientY\n *\n * For touch events pageX and pageY are taken from the first touch;\n * For the emulated mousemove event they are taken from the last real event.\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.calculatePositionOnPage = function(evt) {\n\n if (evt.originalEvent && evt.originalEvent.touches && evt.originalEvent.touches[0] !== undefined) {\n // This is a touchmove or touchstart event, get position from the first touch position.\n var touch = evt.originalEvent.touches[0];\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n }\n\n if (evt.pageX === undefined) {\n // Information is not present in case of touchend or when event was emulated by autoScroll.\n // Take the absolute mouse position from the last event.\n evt.pageX = this.lastEvent.pageX;\n evt.pageY = this.lastEvent.pageY;\n } else {\n this.lastEvent = evt;\n }\n\n if (evt.clientX === undefined) {\n // If not provided in event calculate relative mouse position.\n evt.clientX = Math.round(evt.pageX - $(window).scrollLeft());\n evt.clientY = Math.round(evt.pageY - $(window).scrollTop());\n }\n };\n\n /**\n * Handler from dragstart event\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragStartHandler = function(evt) {\n if (this.info !== null) {\n if (this.info.type === 'click' || this.info.type === 'touchend') {\n // Ignore double click.\n return;\n }\n // Mouse down or touch while already dragging, cancel previous dragging.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n }\n\n if (evt.type === 'mousedown' && evt.which !== 1) {\n // We only need left mouse click. If this is a mousedown event with right/middle click ignore it.\n return;\n }\n\n this.calculatePositionOnPage(evt);\n var movedElement = $(evt.target).closest($(evt.currentTarget).children());\n if (!movedElement.length) {\n // Can't find the element user wants to drag. They clicked on the list but outside of any element of the list.\n return;\n }\n\n // Check that we grabbed the element by the handle.\n if (this.config.moveHandlerSelector !== null) {\n if (!$(evt.target).closest(this.config.moveHandlerSelector, movedElement).length) {\n return;\n }\n }\n\n evt.stopPropagation();\n evt.preventDefault();\n\n // Information about moved element with original location.\n // This object is passed to event observers.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: movedElement.parent(),\n targetNextElement: movedElement.next(),\n targetList: movedElement.parent(),\n type: evt.type,\n dropped: false,\n startX: evt.pageX,\n startY: evt.pageY,\n startTime: new Date().getTime()\n };\n\n $(this.config.targetListSelector).addClass(CSS.targetListClass);\n\n var offset = movedElement.offset();\n movedElement.addClass(CSS.currentPositionClass);\n this.proxyDelta = {x: offset.left - evt.pageX, y: offset.top - evt.pageY};\n this.proxy = $();\n var thisDragCounter = this.dragCounter;\n setTimeout($.proxy(function() {\n // This mousedown event may in fact be a beginning of a 'click' event. Use timeout before showing the\n // dragged object so we can catch click event. When timeout finishes make sure that click event\n // has not happened during this half a second.\n // Verify dragcounter to make sure the user did not manage to do two very fast drag actions one after another.\n if (this.info === null || this.info.type === 'click' || this.info.type === 'keypress'\n || this.dragCounter !== thisDragCounter) {\n return;\n }\n\n // Create a proxy - the copy of the dragged element that moves together with a mouse.\n this.createProxy();\n }, this), 500);\n\n // Start drag.\n $(window).on('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).on('keypress', $.proxy(this.dragcancelHandler, this));\n\n // Start autoscrolling. Every time the page is scrolled emulate the mousemove event.\n if (this.config.autoScroll) {\n autoScroll.start(function() {\n $(window).trigger('mousemove');\n });\n }\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n };\n\n /**\n * Creates a \"proxy\" object - a copy of the element that is being moved that always follows the mouse\n * @private\n */\n SortableList.prototype.createProxy = function() {\n this.proxy = this.info.element.clone();\n this.info.sourceList.append(this.proxy);\n this.proxy.removeAttr('id').removeClass(CSS.currentPositionClass)\n .addClass(CSS.isDraggedClass).css({position: 'fixed'});\n this.proxy.offset({top: this.proxyDelta.y + this.lastEvent.pageY, left: this.proxyDelta.x + this.lastEvent.pageX});\n };\n\n /**\n * Handler for click event - when user clicks on the drag handler or presses Enter on keyboard\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.clickHandler = function(evt) {\n if (evt.type === 'keypress' && evt.originalEvent.keyCode !== 13 && evt.originalEvent.keyCode !== 32) {\n return;\n }\n if (this.info !== null) {\n // Ignore double click.\n return;\n }\n\n // Find the element that this draghandle belongs to.\n var clickedElement = $(evt.target).closest(this.config.moveHandlerSelector),\n sourceList = clickedElement.closest(this.config.listSelector),\n movedElement = clickedElement.closest(sourceList.children());\n if (!movedElement.length) {\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Store information about moved element with original location.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: sourceList,\n targetNextElement: movedElement.next(),\n targetList: sourceList,\n dropped: false,\n type: evt.type,\n startTime: new Date().getTime()\n };\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n this.displayMoveDialogue(clickedElement);\n };\n\n /**\n * Finds the position of the mouse inside the element - on the top, on the bottom, on the right or on the left\\\n *\n * Used to determine if the moved element should be moved after or before the current element\n *\n * @private\n * @param {Number} pageX\n * @param {Number} pageY\n * @param {jQuery} element\n * @returns {(Object|null)}\n */\n SortableList.prototype.getPositionInNode = function(pageX, pageY, element) {\n if (!element.length) {\n return null;\n }\n var node = element[0],\n offset = 0,\n rect = node.getBoundingClientRect(),\n y = pageY - (rect.top + window.scrollY),\n x = pageX - (rect.left + window.scrollX);\n if (x >= -offset && x <= rect.width + offset && y >= -offset && y <= rect.height + offset) {\n return {\n x: x,\n y: y,\n xRatio: rect.width ? (x / rect.width) : 0,\n yRatio: rect.height ? (y / rect.height) : 0\n };\n }\n return null;\n };\n\n /**\n * Check if list is horizontal\n *\n * @param {jQuery} element\n * @return {Boolean}\n */\n SortableList.prototype.isListHorizontal = function(element) {\n var isHorizontal = this.config.isHorizontal;\n if (isHorizontal === true || isHorizontal === false) {\n return isHorizontal;\n }\n return isHorizontal(element);\n };\n\n /**\n * Handler for events mousemove touchmove mouseup touchend\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragHandler = function(evt) {\n\n evt.preventDefault();\n evt.stopPropagation();\n\n this.calculatePositionOnPage(evt);\n\n // We can not use evt.target here because it will most likely be our proxy.\n // Move the proxy out of the way so we can find the element at the current mouse position.\n this.proxy.offset({top: -1000, left: -1000});\n // Find the element at the current mouse position.\n var element = $(document.elementFromPoint(evt.clientX, evt.clientY));\n\n // Find the list element and the list over the mouse position.\n var mainElement = this.info.element[0],\n isNotSelf = function() {\n return this !== mainElement;\n },\n current = element.closest('.' + CSS.targetListClass + ' > :not(.' + CSS.isDraggedClass + ')').filter(isNotSelf),\n currentList = element.closest('.' + CSS.targetListClass),\n proxy = this.proxy,\n isNotProxy = function() {\n return !proxy || !proxy.length || this !== proxy[0];\n };\n\n // Add the specified class to the list element we are hovering.\n $('.' + CSS.overElementClass).removeClass(CSS.overElementClass);\n current.addClass(CSS.overElementClass);\n\n // Move proxy to the current position.\n this.proxy.offset({top: this.proxyDelta.y + evt.pageY, left: this.proxyDelta.x + evt.pageX});\n\n if (currentList.length && !currentList.children().filter(isNotProxy).length) {\n // Mouse is over an empty list.\n this.moveElement(currentList, $());\n } else if (current.length === 1 && !this.info.element.find(current[0]).length) {\n // Mouse is over an element in a list - find whether we should move the current position\n // above or below this element.\n var coordinates = this.getPositionInNode(evt.pageX, evt.pageY, current);\n if (coordinates) {\n var parent = current.parent(),\n ratio = this.isListHorizontal(parent) ? coordinates.xRatio : coordinates.yRatio,\n subList = current.find('.' + CSS.targetListClass),\n subListEmpty = !subList.children().filter(isNotProxy).filter(isNotSelf).length;\n if (subList.length && subListEmpty && ratio > 0.2 && ratio < 0.8) {\n // This is an element that is a parent of an empty list and we are around the middle of this element.\n // Treat it as if we are over this empty list.\n this.moveElement(subList, $());\n } else if (ratio > 0.5) {\n // Insert after this element.\n this.moveElement(parent, current.next().filter(isNotProxy));\n } else {\n // Insert before this element.\n this.moveElement(parent, current);\n }\n }\n }\n\n if (evt.type === 'mouseup' || evt.type === 'touchend') {\n // Drop the moved element.\n this.info.endX = evt.pageX;\n this.info.endY = evt.pageY;\n this.info.endTime = new Date().getTime();\n this.info.dropped = true;\n this.info.positionChanged = this.hasPositionChanged(this.info);\n var oldinfo = this.info;\n this.executeCallback(SortableList.EVENTS.DROP);\n this.finishDragging();\n\n if (evt.type === 'touchend'\n && this.config.moveHandlerSelector !== null\n && (oldinfo.endTime - oldinfo.startTime < 500)\n && !oldinfo.positionChanged) {\n // The click event is not triggered on touch screens because we call preventDefault in touchstart handler.\n // If the touchend quickly followed touchstart without moving, consider it a \"click\".\n this.clickHandler(evt);\n }\n }\n };\n\n /**\n * Checks if the position of the dragged element in the list has changed\n *\n * @private\n * @param {Object} info\n * @return {Boolean}\n */\n SortableList.prototype.hasPositionChanged = function(info) {\n return info.sourceList[0] !== info.targetList[0] ||\n info.sourceNextElement.length !== info.targetNextElement.length ||\n (info.sourceNextElement.length && info.sourceNextElement[0] !== info.targetNextElement[0]);\n };\n\n /**\n * Moves the current position of the dragged element\n *\n * @private\n * @param {jQuery} parentElement\n * @param {jQuery} beforeElement\n */\n SortableList.prototype.moveElement = function(parentElement, beforeElement) {\n var dragEl = this.info.element;\n if (beforeElement.length && beforeElement[0] === dragEl[0]) {\n // Insert before the current position of the dragged element - nothing to do.\n return;\n }\n if (parentElement[0] === this.info.targetList[0] &&\n beforeElement.length === this.info.targetNextElement.length &&\n beforeElement[0] === this.info.targetNextElement[0]) {\n // Insert in the same location as the current position - nothing to do.\n return;\n }\n\n if (beforeElement.length) {\n // Move the dragged element before the specified element.\n parentElement[0].insertBefore(dragEl[0], beforeElement[0]);\n } else if (this.proxy && this.proxy.parent().length && this.proxy.parent()[0] === parentElement[0]) {\n // We need to move to the end of the list but the last element in this list is a proxy.\n // Always leave the proxy in the end of the list.\n parentElement[0].insertBefore(dragEl[0], this.proxy[0]);\n } else {\n // Insert in the end of a list (when proxy is in another list).\n parentElement[0].appendChild(dragEl[0]);\n }\n\n // Save the current position of the dragged element in the list.\n this.info.targetList = parentElement;\n this.info.targetNextElement = beforeElement;\n this.executeCallback(SortableList.EVENTS.DRAG);\n };\n\n /**\n * Finish dragging (when dropped or cancelled).\n * @private\n */\n SortableList.prototype.finishDragging = function() {\n this.resetDraggedClasses();\n if (this.config.autoScroll) {\n autoScroll.stop();\n }\n $(window).off('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).off('keypress', $.proxy(this.dragcancelHandler, this));\n this.executeCallback(SortableList.EVENTS.DRAGEND);\n this.info = null;\n };\n\n /**\n * Executes callback specified in sortable list parameters\n *\n * @private\n * @param {String} eventName\n */\n SortableList.prototype.executeCallback = function(eventName) {\n this.info.element.trigger(eventName, this.info);\n };\n\n /**\n * Handler from keypress event (cancel dragging when Esc is pressed)\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragcancelHandler = function(evt) {\n if (evt.type !== 'keypress' || evt.originalEvent.keyCode !== 27) {\n // Only cancel dragging when Esc was pressed.\n return;\n }\n // Dragging was cancelled. Return item to the original position.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n };\n\n /**\n * Returns the name of the current element to be used in the move dialogue\n *\n * @public\n * @param {jQuery} element\n * @return {Promise}\n */\n SortableList.prototype.getElementName = function(element) {\n return $.Deferred().resolve(element.text());\n };\n\n /**\n * Returns the label for the potential move destination, i.e. \"After ElementX\" or \"To the top of the list\"\n *\n * Note that we use \"after\" in the label for better UX\n *\n * @public\n * @param {jQuery} parentElement\n * @param {jQuery} afterElement\n * @return {Promise}\n */\n SortableList.prototype.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return str.get_string('movecontenttothetop', 'moodle');\n } else {\n return this.getElementName(afterElement)\n .then(function(name) {\n return str.get_string('movecontentafter', 'moodle', name);\n });\n }\n };\n\n /**\n * Returns the title for the move dialogue (\"Move elementY\")\n *\n * @public\n * @param {jQuery} element\n * @param {jQuery} handler\n * @return {Promise}\n */\n SortableList.prototype.getMoveDialogueTitle = function(element, handler) {\n if (handler.attr('title')) {\n return $.Deferred().resolve(handler.attr('title'));\n }\n return this.getElementName(element).then(function(name) {\n return str.get_string('movecontent', 'moodle', name);\n });\n };\n\n /**\n * Returns the list of possible move destinations\n *\n * @private\n * @return {Promise}\n */\n SortableList.prototype.getDestinationsList = function() {\n var addedLists = [],\n targets = $(this.config.targetListSelector),\n destinations = $('').addClass(CSS.keyboardDragClass),\n result = $.when().then(function() {\n return destinations;\n }),\n createLink = $.proxy(function(parentElement, beforeElement, afterElement) {\n if (beforeElement.is(this.info.element) || afterElement.is(this.info.element)) {\n // Can not move before or after itself.\n return;\n }\n if ($.contains(this.info.element[0], parentElement[0])) {\n // Can not move to its own child.\n return;\n }\n result = result\n .then($.proxy(function() {\n return this.getDestinationName(parentElement, afterElement);\n }, this))\n .then(function(txt) {\n var li = $(' ').appendTo(destinations);\n var a = $('').attr('data-core_sortable_list-quickmove', 1).appendTo(li);\n a.data('parent-element', parentElement).data('before-element', beforeElement).text(txt);\n return destinations;\n });\n }, this),\n addList = function() {\n // Destination lists may be nested. We want to add all move destinations in the same\n // order they appear on the screen for the user.\n if ($.inArray(this, addedLists) !== -1) {\n return;\n }\n addedLists.push(this);\n var list = $(this),\n children = list.children();\n children.each(function() {\n var element = $(this);\n createLink(list, element, element.prev());\n // Add all nested lists.\n element.find(targets).each(addList);\n });\n createLink(list, $(), children.last());\n };\n targets.each(addList);\n return result;\n };\n\n /**\n * Displays the dialogue to move element.\n * @param {jQuery} clickedElement element to return focus to after the modal is closed\n * @private\n */\n SortableList.prototype.displayMoveDialogue = function(clickedElement) {\n ModalFactory.create({\n type: ModalFactory.types.CANCEL,\n title: this.getMoveDialogueTitle(this.info.element, clickedElement),\n body: this.getDestinationsList()\n }).then($.proxy(function(modal) {\n var quickMoveHandler = $.proxy(function(e) {\n e.preventDefault();\n e.stopPropagation();\n this.moveElement($(e.currentTarget).data('parent-element'), $(e.currentTarget).data('before-element'));\n this.info.endTime = new Date().getTime();\n this.info.positionChanged = this.hasPositionChanged(this.info);\n this.info.dropped = true;\n clickedElement.focus();\n this.executeCallback(SortableList.EVENTS.DROP);\n modal.hide();\n }, this);\n modal.getRoot().on('click', '[data-core_sortable_list-quickmove]', quickMoveHandler);\n modal.getRoot().on(ModalEvents.hidden, $.proxy(function() {\n // Always destroy when hidden, it is generated dynamically each time.\n modal.getRoot().off('click', '[data-core_sortable_list-quickmove]', quickMoveHandler);\n modal.destroy();\n this.finishDragging();\n }, this));\n modal.setLarge();\n modal.show();\n return modal;\n }, this)).catch(Notification.exception);\n };\n\n return SortableList;\n\n});\n"],"file":"sortable_list.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/sortable_list.js"],"names":["define","$","log","autoScroll","str","ModalFactory","ModalEvents","Notification","defaultParameters","targetListSelector","moveHandlerSelector","isHorizontal","CSS","keyboardDragClass","isDraggedClass","currentPositionClass","sourceListClass","targetListClass","overElementClass","registerNotPassiveListeners","eventname","setup","x","ns","handle","includes","addEventListener","passive","eventListenerOptionsSupported","passivesupported","options","Object","defineProperty","get","document","removeEventListener","err","event","special","touchstart","touchmove","touchend","SortableList","root","config","info","proxy","proxyDelta","dragCounter","lastEvent","extend","listSelector","on","dragStartHandler","clickHandler","EVENTS","DRAGSTART","DRAG","DROP","DRAGEND","prototype","resetDraggedClasses","classes","i","removeClass","remove","calculatePositionOnPage","evt","originalEvent","touches","touch","pageX","pageY","clientX","Math","round","window","scrollLeft","clientY","scrollTop","type","moveElement","sourceList","sourceNextElement","finishDragging","which","movedElement","target","closest","currentTarget","children","length","stopPropagation","preventDefault","element","next","parent","targetNextElement","targetList","dropped","startX","startY","startTime","Date","getTime","addClass","offset","left","y","top","thisDragCounter","setTimeout","createProxy","dragHandler","dragcancelHandler","start","trigger","executeCallback","clone","append","removeAttr","css","position","keyCode","clickedElement","displayMoveDialogue","getPositionInNode","node","rect","getBoundingClientRect","scrollY","scrollX","width","height","xRatio","yRatio","isListHorizontal","elementFromPoint","mainElement","isNotSelf","current","filter","currentList","isNotProxy","find","coordinates","ratio","subList","subListEmpty","endX","endY","endTime","positionChanged","hasPositionChanged","oldinfo","parentElement","beforeElement","dragEl","insertBefore","appendChild","stop","off","eventName","getElementName","Deferred","resolve","text","getDestinationName","afterElement","get_string","then","name","getMoveDialogueTitle","handler","attr","getDestinationsList","addedLists","targets","destinations","result","when","createLink","is","contains","txt","li","appendTo","a","data","addList","inArray","push","list","each","prev","last","create","types","CANCEL","title","body","modal","quickMoveHandler","e","focus","hide","getRoot","hidden","destroy","setLarge","show","catch","exception"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A javascript module to handle list items drag and drop\n *\n * Example of usage:\n *\n * Create a list (for example `` or ``) where each draggable element has a drag handle.\n * The best practice is to use the template core/drag_handle:\n * $OUTPUT->render_from_template('core/drag_handle', ['movetitle' => get_string('movecontent', 'moodle', ELEMENTNAME)]);\n *\n * Attach this JS module to this list:\n *\n * Space between define and ( critical in comment but not allowed in code in order to function\n * correctly with Moodle's requirejs.php\n *\n * More details: https://docs.moodle.org/dev/Sortable_list\n *\n * For the full list of possible parameters see var defaultParameters below.\n *\n * The following jQuery events are fired:\n * - SortableList.EVENTS.DRAGSTART : when user started dragging a list element\n * - SortableList.EVENTS.DRAG : when user dragged a list element to a new position\n * - SortableList.EVENTS.DROP : when user dropped a list element\n * - SortableList.EVENTS.DROPEND : when user finished dragging - either fired right after dropping or\n * if \"Esc\" was pressed during dragging\n *\n * @example\n * define (['jquery', 'core/sortable_list'], function($, SortableList) {\n * var list = new SortableList('ul.my-awesome-list'); // source list (usually or ) - selector or element\n *\n * // Listen to the events when element is dragged.\n * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {\n * console.log(info);\n * });\n *\n * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:\n * list.getElementName = function(element) {\n * return $.Deferred().resolve(element.attr('data-name'));\n * }\n * });\n *\n * @module core/sortable_list\n * @class core/sortable_list\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/autoscroll', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification'],\nfunction($, log, autoScroll, str, ModalFactory, ModalEvents, Notification) {\n\n /**\n * Default parameters\n *\n * @private\n * @type {Object}\n */\n var defaultParameters = {\n targetListSelector: null,\n moveHandlerSelector: '[data-drag-type=move]',\n isHorizontal: false,\n autoScroll: true\n };\n\n /**\n * Class names for different elements that may be changed during sorting\n *\n * @private\n * @type {Object}\n */\n var CSS = {\n keyboardDragClass: 'dragdrop-keyboard-drag',\n isDraggedClass: 'sortable-list-is-dragged',\n currentPositionClass: 'sortable-list-current-position',\n sourceListClass: 'sortable-list-source',\n targetListClass: 'sortable-list-target',\n overElementClass: 'sortable-list-over-element'\n };\n\n /**\n * Test the browser support for options objects on event listeners.\n * @return {Boolean}\n */\n var eventListenerOptionsSupported = function() {\n var passivesupported = false,\n options,\n testeventname = \"testpassiveeventoptions\";\n\n // Options support testing example from:\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n\n try {\n options = Object.defineProperty({}, \"passive\", {\n get: function() {\n passivesupported = true;\n }\n });\n\n // We use an event name that is not likely to conflict with any real event.\n document.addEventListener(testeventname, options, options);\n // We remove the event listener as we have tested the options already.\n document.removeEventListener(testeventname, options, options);\n } catch (err) {\n // It's already false.\n passivesupported = false;\n }\n return passivesupported;\n };\n\n /**\n * Allow to create non-passive touchstart listeners and prevent page scrolling when dragging\n * From: https://stackoverflow.com/a/48098097\n *\n * @type {Object}\n */\n var registerNotPassiveListeners = function(eventname) {\n return {\n setup: function(x, ns, handle) {\n if (ns.includes('notPassive')) {\n this.addEventListener(eventname, handle, {passive: false});\n return true;\n } else {\n return false;\n }\n }\n };\n };\n\n if (eventListenerOptionsSupported) {\n $.event.special.touchstart = registerNotPassiveListeners('touchstart');\n $.event.special.touchmove = registerNotPassiveListeners('touchmove');\n $.event.special.touchend = registerNotPassiveListeners('touchend');\n }\n\n /**\n * Initialise sortable list.\n *\n * @param {(String|jQuery|Element)} root JQuery/DOM element representing sortable list (i.e. , ) or CSS selector\n * @param {Object} config Parameters for the list. See defaultParameters above for examples.\n * @property {(String|jQuery|Element)} config.targetListSelector target lists, by default same as root\n * @property {String} config.moveHandlerSelector CSS selector for a drag handle. By default '[data-drag-type=move]'\n * @property {String} config.targetListSelector CSS selector for target lists. By default the same as root\n * @property {(Boolean|Function)} config.isHorizontal Set to true if the list is horizontal\n * (can also be a callback with list as an argument)\n * @property {Boolean} config.autoScroll Engages autoscroll module for automatic vertical scrolling of the\n * whole page, by default true\n */\n var SortableList = function(root, config) {\n\n this.info = null;\n this.proxy = null;\n this.proxyDelta = null;\n this.dragCounter = 0;\n this.lastEvent = null;\n\n this.config = $.extend({}, defaultParameters, config || {});\n this.config.listSelector = root;\n if (!this.config.targetListSelector) {\n this.config.targetListSelector = root;\n }\n if (typeof this.config.listSelector === 'object') {\n // The root is an element on the page. Register a listener for this element.\n $(this.config.listSelector).on('mousedown touchstart.notPassive', $.proxy(this.dragStartHandler, this));\n } else {\n // The root is a CSS selector. Register a listener that picks up the element dynamically.\n $('body').on('mousedown touchstart.notPassive', this.config.listSelector, $.proxy(this.dragStartHandler, this));\n }\n if (this.config.moveHandlerSelector !== null) {\n $('body').on('click keypress', this.config.moveHandlerSelector, $.proxy(this.clickHandler, this));\n }\n\n };\n\n /**\n * Events fired by this entity\n *\n * @public\n * @type {Object}\n */\n SortableList.EVENTS = {\n DRAGSTART: 'sortablelist-dragstart',\n DRAG: 'sortablelist-drag',\n DROP: 'sortablelist-drop',\n DRAGEND: 'sortablelist-dragend'\n };\n\n /**\n * Resets the temporary classes assigned during dragging\n * @private\n */\n SortableList.prototype.resetDraggedClasses = function() {\n var classes = [\n CSS.isDraggedClass,\n CSS.currentPositionClass,\n CSS.overElementClass,\n CSS.targetListClass,\n ];\n for (var i in classes) {\n $('.' + classes[i]).removeClass(classes[i]);\n }\n if (this.proxy) {\n this.proxy.remove();\n this.proxy = $();\n }\n };\n\n /**\n * Calculates evt.pageX, evt.pageY, evt.clientX and evt.clientY\n *\n * For touch events pageX and pageY are taken from the first touch;\n * For the emulated mousemove event they are taken from the last real event.\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.calculatePositionOnPage = function(evt) {\n\n if (evt.originalEvent && evt.originalEvent.touches && evt.originalEvent.touches[0] !== undefined) {\n // This is a touchmove or touchstart event, get position from the first touch position.\n var touch = evt.originalEvent.touches[0];\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n }\n\n if (evt.pageX === undefined) {\n // Information is not present in case of touchend or when event was emulated by autoScroll.\n // Take the absolute mouse position from the last event.\n evt.pageX = this.lastEvent.pageX;\n evt.pageY = this.lastEvent.pageY;\n } else {\n this.lastEvent = evt;\n }\n\n if (evt.clientX === undefined) {\n // If not provided in event calculate relative mouse position.\n evt.clientX = Math.round(evt.pageX - $(window).scrollLeft());\n evt.clientY = Math.round(evt.pageY - $(window).scrollTop());\n }\n };\n\n /**\n * Handler from dragstart event\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragStartHandler = function(evt) {\n if (this.info !== null) {\n if (this.info.type === 'click' || this.info.type === 'touchend') {\n // Ignore double click.\n return;\n }\n // Mouse down or touch while already dragging, cancel previous dragging.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n }\n\n if (evt.type === 'mousedown' && evt.which !== 1) {\n // We only need left mouse click. If this is a mousedown event with right/middle click ignore it.\n return;\n }\n\n this.calculatePositionOnPage(evt);\n var movedElement = $(evt.target).closest($(evt.currentTarget).children());\n if (!movedElement.length) {\n // Can't find the element user wants to drag. They clicked on the list but outside of any element of the list.\n return;\n }\n\n // Check that we grabbed the element by the handle.\n if (this.config.moveHandlerSelector !== null) {\n if (!$(evt.target).closest(this.config.moveHandlerSelector, movedElement).length) {\n return;\n }\n }\n\n evt.stopPropagation();\n evt.preventDefault();\n\n // Information about moved element with original location.\n // This object is passed to event observers.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: movedElement.parent(),\n targetNextElement: movedElement.next(),\n targetList: movedElement.parent(),\n type: evt.type,\n dropped: false,\n startX: evt.pageX,\n startY: evt.pageY,\n startTime: new Date().getTime()\n };\n\n $(this.config.targetListSelector).addClass(CSS.targetListClass);\n\n var offset = movedElement.offset();\n movedElement.addClass(CSS.currentPositionClass);\n this.proxyDelta = {x: offset.left - evt.pageX, y: offset.top - evt.pageY};\n this.proxy = $();\n var thisDragCounter = this.dragCounter;\n setTimeout($.proxy(function() {\n // This mousedown event may in fact be a beginning of a 'click' event. Use timeout before showing the\n // dragged object so we can catch click event. When timeout finishes make sure that click event\n // has not happened during this half a second.\n // Verify dragcounter to make sure the user did not manage to do two very fast drag actions one after another.\n if (this.info === null || this.info.type === 'click' || this.info.type === 'keypress'\n || this.dragCounter !== thisDragCounter) {\n return;\n }\n\n // Create a proxy - the copy of the dragged element that moves together with a mouse.\n this.createProxy();\n }, this), 500);\n\n // Start drag.\n $(window).on('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).on('keypress', $.proxy(this.dragcancelHandler, this));\n\n // Start autoscrolling. Every time the page is scrolled emulate the mousemove event.\n if (this.config.autoScroll) {\n autoScroll.start(function() {\n $(window).trigger('mousemove');\n });\n }\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n };\n\n /**\n * Creates a \"proxy\" object - a copy of the element that is being moved that always follows the mouse\n * @private\n */\n SortableList.prototype.createProxy = function() {\n this.proxy = this.info.element.clone();\n this.info.sourceList.append(this.proxy);\n this.proxy.removeAttr('id').removeClass(CSS.currentPositionClass)\n .addClass(CSS.isDraggedClass).css({position: 'fixed'});\n this.proxy.offset({top: this.proxyDelta.y + this.lastEvent.pageY, left: this.proxyDelta.x + this.lastEvent.pageX});\n };\n\n /**\n * Handler for click event - when user clicks on the drag handler or presses Enter on keyboard\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.clickHandler = function(evt) {\n if (evt.type === 'keypress' && evt.originalEvent.keyCode !== 13 && evt.originalEvent.keyCode !== 32) {\n return;\n }\n if (this.info !== null) {\n // Ignore double click.\n return;\n }\n\n // Find the element that this draghandle belongs to.\n var clickedElement = $(evt.target).closest(this.config.moveHandlerSelector),\n sourceList = clickedElement.closest(this.config.listSelector),\n movedElement = clickedElement.closest(sourceList.children());\n if (!movedElement.length) {\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Store information about moved element with original location.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: sourceList,\n targetNextElement: movedElement.next(),\n targetList: sourceList,\n dropped: false,\n type: evt.type,\n startTime: new Date().getTime()\n };\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n this.displayMoveDialogue(clickedElement);\n };\n\n /**\n * Finds the position of the mouse inside the element - on the top, on the bottom, on the right or on the left\\\n *\n * Used to determine if the moved element should be moved after or before the current element\n *\n * @private\n * @param {Number} pageX\n * @param {Number} pageY\n * @param {jQuery} element\n * @returns {(Object|null)}\n */\n SortableList.prototype.getPositionInNode = function(pageX, pageY, element) {\n if (!element.length) {\n return null;\n }\n var node = element[0],\n offset = 0,\n rect = node.getBoundingClientRect(),\n y = pageY - (rect.top + window.scrollY),\n x = pageX - (rect.left + window.scrollX);\n if (x >= -offset && x <= rect.width + offset && y >= -offset && y <= rect.height + offset) {\n return {\n x: x,\n y: y,\n xRatio: rect.width ? (x / rect.width) : 0,\n yRatio: rect.height ? (y / rect.height) : 0\n };\n }\n return null;\n };\n\n /**\n * Check if list is horizontal\n *\n * @param {jQuery} element\n * @return {Boolean}\n */\n SortableList.prototype.isListHorizontal = function(element) {\n var isHorizontal = this.config.isHorizontal;\n if (isHorizontal === true || isHorizontal === false) {\n return isHorizontal;\n }\n return isHorizontal(element);\n };\n\n /**\n * Handler for events mousemove touchmove mouseup touchend\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragHandler = function(evt) {\n\n evt.preventDefault();\n evt.stopPropagation();\n\n this.calculatePositionOnPage(evt);\n\n // We can not use evt.target here because it will most likely be our proxy.\n // Move the proxy out of the way so we can find the element at the current mouse position.\n this.proxy.offset({top: -1000, left: -1000});\n // Find the element at the current mouse position.\n var element = $(document.elementFromPoint(evt.clientX, evt.clientY));\n\n // Find the list element and the list over the mouse position.\n var mainElement = this.info.element[0],\n isNotSelf = function() {\n return this !== mainElement;\n },\n current = element.closest('.' + CSS.targetListClass + ' > :not(.' + CSS.isDraggedClass + ')').filter(isNotSelf),\n currentList = element.closest('.' + CSS.targetListClass),\n proxy = this.proxy,\n isNotProxy = function() {\n return !proxy || !proxy.length || this !== proxy[0];\n };\n\n // Add the specified class to the list element we are hovering.\n $('.' + CSS.overElementClass).removeClass(CSS.overElementClass);\n current.addClass(CSS.overElementClass);\n\n // Move proxy to the current position.\n this.proxy.offset({top: this.proxyDelta.y + evt.pageY, left: this.proxyDelta.x + evt.pageX});\n\n if (currentList.length && !currentList.children().filter(isNotProxy).length) {\n // Mouse is over an empty list.\n this.moveElement(currentList, $());\n } else if (current.length === 1 && !this.info.element.find(current[0]).length) {\n // Mouse is over an element in a list - find whether we should move the current position\n // above or below this element.\n var coordinates = this.getPositionInNode(evt.pageX, evt.pageY, current);\n if (coordinates) {\n var parent = current.parent(),\n ratio = this.isListHorizontal(parent) ? coordinates.xRatio : coordinates.yRatio,\n subList = current.find('.' + CSS.targetListClass),\n subListEmpty = !subList.children().filter(isNotProxy).filter(isNotSelf).length;\n if (subList.length && subListEmpty && ratio > 0.2 && ratio < 0.8) {\n // This is an element that is a parent of an empty list and we are around the middle of this element.\n // Treat it as if we are over this empty list.\n this.moveElement(subList, $());\n } else if (ratio > 0.5) {\n // Insert after this element.\n this.moveElement(parent, current.next().filter(isNotProxy));\n } else {\n // Insert before this element.\n this.moveElement(parent, current);\n }\n }\n }\n\n if (evt.type === 'mouseup' || evt.type === 'touchend') {\n // Drop the moved element.\n this.info.endX = evt.pageX;\n this.info.endY = evt.pageY;\n this.info.endTime = new Date().getTime();\n this.info.dropped = true;\n this.info.positionChanged = this.hasPositionChanged(this.info);\n var oldinfo = this.info;\n this.executeCallback(SortableList.EVENTS.DROP);\n this.finishDragging();\n\n if (evt.type === 'touchend'\n && this.config.moveHandlerSelector !== null\n && (oldinfo.endTime - oldinfo.startTime < 500)\n && !oldinfo.positionChanged) {\n // The click event is not triggered on touch screens because we call preventDefault in touchstart handler.\n // If the touchend quickly followed touchstart without moving, consider it a \"click\".\n this.clickHandler(evt);\n }\n }\n };\n\n /**\n * Checks if the position of the dragged element in the list has changed\n *\n * @private\n * @param {Object} info\n * @return {Boolean}\n */\n SortableList.prototype.hasPositionChanged = function(info) {\n return info.sourceList[0] !== info.targetList[0] ||\n info.sourceNextElement.length !== info.targetNextElement.length ||\n (info.sourceNextElement.length && info.sourceNextElement[0] !== info.targetNextElement[0]);\n };\n\n /**\n * Moves the current position of the dragged element\n *\n * @private\n * @param {jQuery} parentElement\n * @param {jQuery} beforeElement\n */\n SortableList.prototype.moveElement = function(parentElement, beforeElement) {\n var dragEl = this.info.element;\n if (beforeElement.length && beforeElement[0] === dragEl[0]) {\n // Insert before the current position of the dragged element - nothing to do.\n return;\n }\n if (parentElement[0] === this.info.targetList[0] &&\n beforeElement.length === this.info.targetNextElement.length &&\n beforeElement[0] === this.info.targetNextElement[0]) {\n // Insert in the same location as the current position - nothing to do.\n return;\n }\n\n if (beforeElement.length) {\n // Move the dragged element before the specified element.\n parentElement[0].insertBefore(dragEl[0], beforeElement[0]);\n } else if (this.proxy && this.proxy.parent().length && this.proxy.parent()[0] === parentElement[0]) {\n // We need to move to the end of the list but the last element in this list is a proxy.\n // Always leave the proxy in the end of the list.\n parentElement[0].insertBefore(dragEl[0], this.proxy[0]);\n } else {\n // Insert in the end of a list (when proxy is in another list).\n parentElement[0].appendChild(dragEl[0]);\n }\n\n // Save the current position of the dragged element in the list.\n this.info.targetList = parentElement;\n this.info.targetNextElement = beforeElement;\n this.executeCallback(SortableList.EVENTS.DRAG);\n };\n\n /**\n * Finish dragging (when dropped or cancelled).\n * @private\n */\n SortableList.prototype.finishDragging = function() {\n this.resetDraggedClasses();\n if (this.config.autoScroll) {\n autoScroll.stop();\n }\n $(window).off('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).off('keypress', $.proxy(this.dragcancelHandler, this));\n this.executeCallback(SortableList.EVENTS.DRAGEND);\n this.info = null;\n };\n\n /**\n * Executes callback specified in sortable list parameters\n *\n * @private\n * @param {String} eventName\n */\n SortableList.prototype.executeCallback = function(eventName) {\n this.info.element.trigger(eventName, this.info);\n };\n\n /**\n * Handler from keypress event (cancel dragging when Esc is pressed)\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragcancelHandler = function(evt) {\n if (evt.type !== 'keypress' || evt.originalEvent.keyCode !== 27) {\n // Only cancel dragging when Esc was pressed.\n return;\n }\n // Dragging was cancelled. Return item to the original position.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n };\n\n /**\n * Returns the name of the current element to be used in the move dialogue\n *\n * @public\n * @param {jQuery} element\n * @return {Promise}\n */\n SortableList.prototype.getElementName = function(element) {\n return $.Deferred().resolve(element.text());\n };\n\n /**\n * Returns the label for the potential move destination, i.e. \"After ElementX\" or \"To the top of the list\"\n *\n * Note that we use \"after\" in the label for better UX\n *\n * @public\n * @param {jQuery} parentElement\n * @param {jQuery} afterElement\n * @return {Promise}\n */\n SortableList.prototype.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return str.get_string('movecontenttothetop', 'moodle');\n } else {\n return this.getElementName(afterElement)\n .then(function(name) {\n return str.get_string('movecontentafter', 'moodle', name);\n });\n }\n };\n\n /**\n * Returns the title for the move dialogue (\"Move elementY\")\n *\n * @public\n * @param {jQuery} element\n * @param {jQuery} handler\n * @return {Promise}\n */\n SortableList.prototype.getMoveDialogueTitle = function(element, handler) {\n if (handler.attr('title')) {\n return $.Deferred().resolve(handler.attr('title'));\n }\n return this.getElementName(element).then(function(name) {\n return str.get_string('movecontent', 'moodle', name);\n });\n };\n\n /**\n * Returns the list of possible move destinations\n *\n * @private\n * @return {Promise}\n */\n SortableList.prototype.getDestinationsList = function() {\n var addedLists = [],\n targets = $(this.config.targetListSelector),\n destinations = $('').addClass(CSS.keyboardDragClass),\n result = $.when().then(function() {\n return destinations;\n }),\n createLink = $.proxy(function(parentElement, beforeElement, afterElement) {\n if (beforeElement.is(this.info.element) || afterElement.is(this.info.element)) {\n // Can not move before or after itself.\n return;\n }\n if ($.contains(this.info.element[0], parentElement[0])) {\n // Can not move to its own child.\n return;\n }\n result = result\n .then($.proxy(function() {\n return this.getDestinationName(parentElement, afterElement);\n }, this))\n .then(function(txt) {\n var li = $(' ').appendTo(destinations);\n var a = $('').attr('data-core_sortable_list-quickmove', 1).appendTo(li);\n a.data('parent-element', parentElement).data('before-element', beforeElement).text(txt);\n return destinations;\n });\n }, this),\n addList = function() {\n // Destination lists may be nested. We want to add all move destinations in the same\n // order they appear on the screen for the user.\n if ($.inArray(this, addedLists) !== -1) {\n return;\n }\n addedLists.push(this);\n var list = $(this),\n children = list.children();\n children.each(function() {\n var element = $(this);\n createLink(list, element, element.prev());\n // Add all nested lists.\n element.find(targets).each(addList);\n });\n createLink(list, $(), children.last());\n };\n targets.each(addList);\n return result;\n };\n\n /**\n * Displays the dialogue to move element.\n * @param {jQuery} clickedElement element to return focus to after the modal is closed\n * @private\n */\n SortableList.prototype.displayMoveDialogue = function(clickedElement) {\n ModalFactory.create({\n type: ModalFactory.types.CANCEL,\n title: this.getMoveDialogueTitle(this.info.element, clickedElement),\n body: this.getDestinationsList()\n }).then($.proxy(function(modal) {\n var quickMoveHandler = $.proxy(function(e) {\n e.preventDefault();\n e.stopPropagation();\n this.moveElement($(e.currentTarget).data('parent-element'), $(e.currentTarget).data('before-element'));\n this.info.endTime = new Date().getTime();\n this.info.positionChanged = this.hasPositionChanged(this.info);\n this.info.dropped = true;\n clickedElement.focus();\n this.executeCallback(SortableList.EVENTS.DROP);\n modal.hide();\n }, this);\n modal.getRoot().on('click', '[data-core_sortable_list-quickmove]', quickMoveHandler);\n modal.getRoot().on(ModalEvents.hidden, $.proxy(function() {\n // Always destroy when hidden, it is generated dynamically each time.\n modal.getRoot().off('click', '[data-core_sortable_list-quickmove]', quickMoveHandler);\n modal.destroy();\n this.finishDragging();\n }, this));\n modal.setLarge();\n modal.show();\n return modal;\n }, this)).catch(Notification.exception);\n };\n\n return SortableList;\n\n});\n"],"file":"sortable_list.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/str.min.js.map b/lib/amd/build/str.min.js.map
index 8cb82e3f909..9dae7be5187 100644
--- a/lib/amd/build/str.min.js.map
+++ b/lib/amd/build/str.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/str.js"],"names":["promiseCache","get_string","key","component","param","lang","get_strings","then","results","requests","requestData","pageLang","attr","replace","getCacheKey","stringPromises","map","request","cacheKey","buildReturn","promise","M","str","Promise","resolve","util","cached","LocalStorage","get","reject","push","methodname","args","stringid","stringparams","done","set","fail","length","Ajax","call","cfg","langrev","$","when","apply","strings","cache_strings","defaultLang","forEach","value","join","Deferred"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Fetch and render language strings.\n * Hooks into the old M.str global - but can also fetch missing strings on the fly.\n *\n * @module core/str\n * @class str\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\nimport $ from 'jquery';\nimport Ajax from 'core/ajax';\nimport LocalStorage from 'core/localstorage';\n\n// Module cache for the promises so that we don't make multiple\n// unnecessary requests.\nlet promiseCache = [];\n\n/**\n * Return a promise object that will be resolved into a string eventually (maybe immediately).\n *\n * @method get_string\n * @param {string} key The language string key\n * @param {string} component The language string component\n * @param {string} param The param for variable expansion in the string.\n * @param {string} lang The users language - if not passed it is deduced.\n * @return {Promise}\n */\nexport const get_string = (key, component, param, lang) => {\n return get_strings([{key, component, param, lang}])\n .then(results => results[0]);\n};\n\n/**\n * Make a batch request to load a set of strings\n *\n * @method get_strings\n * @param {Object[]} requests Array of { key: key, component: component, param: param, lang: lang };\n * See get_string for more info on these args.\n * @return {Promise}\n */\nexport const get_strings = (requests) => {\n let requestData = [];\n const pageLang = $('html').attr('lang').replace(/-/g, '_');\n // Helper function to construct the cache key.\n const getCacheKey = ({key, component, lang = pageLang}) => {\n if (!component) {\n component = 'core';\n }\n return `core_str/${key}/${component}/${lang}`;\n };\n\n const stringPromises = requests.map((request) => {\n const cacheKey = getCacheKey(request);\n const {component, key, param, lang = pageLang} = request;\n // Helper function to add the promise to cache.\n const buildReturn = (promise) => {\n // Make sure the promise cache contains our promise.\n promiseCache[cacheKey] = promise;\n return promise;\n };\n\n // Check if we can serve the string straight from M.str.\n if (component in M.str && key in M.str[component]) {\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if the string is in the browser's local storage.\n const cached = LocalStorage.get(cacheKey);\n if (cached) {\n M.str[component] = {...M.str[component], [key]: cached};\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if we've already loaded this string from the server.\n if (cacheKey in promiseCache) {\n return buildReturn(promiseCache[cacheKey]).then(() => {\n return M.util.get_string(key, component, param, lang);\n });\n } else {\n // We're going to have to ask the server for the string so\n // add this string to the list of requests to be sent.\n return buildReturn(new Promise((resolve, reject) => {\n requestData.push({\n methodname: 'core_get_string',\n args: {\n stringid: key,\n stringparams: [],\n component,\n lang,\n },\n done: (str) => {\n // When we get the response from the server\n // we should update M.str and the browser's\n // local storage before resolving this promise.\n M.str[component] = {...M.str[component], [key]: str};\n LocalStorage.set(cacheKey, str);\n resolve(M.util.get_string(key, component, param, lang));\n },\n fail: reject\n });\n }));\n }\n });\n\n if (requestData.length) {\n // If we need to load any strings from the server then send\n // off the request.\n Ajax.call(requestData, true, false, false, 0, M.cfg.langrev);\n }\n\n // We need to use jQuery here because some calling code uses the\n // .done handler instead of the .then handler.\n return $.when.apply($, stringPromises)\n .then((...strings) => strings);\n};\n\n/**\n * Add a list of strings to the caches.\n *\n * @method cache_strings\n * @param {Object[]} strings Array of { key: key, component: component, lang: lang, value: value }\n */\nexport const cache_strings = (strings) => {\n const defaultLang = $('html').attr('lang').replace(/-/g, '_');\n\n strings.forEach(({key, component, value, lang = defaultLang}) => {\n const cacheKey = ['core_str', key, component, lang].join('/');\n\n // Check M.str caching.\n if (!(component in M.str) || !(key in M.str[component])) {\n if (!(component in M.str)) {\n M.str[component] = {};\n }\n\n M.str[component][key] = value;\n }\n\n // Check local storage.\n if (!LocalStorage.get(cacheKey)) {\n LocalStorage.set(cacheKey, value);\n }\n\n // Check the promises cache.\n if (!(cacheKey in promiseCache)) {\n promiseCache[cacheKey] = $.Deferred().resolve(value).promise();\n }\n });\n};\n"],"file":"str.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/str.js"],"names":["promiseCache","get_string","key","component","param","lang","get_strings","then","results","requests","requestData","pageLang","attr","replace","getCacheKey","stringPromises","map","request","cacheKey","buildReturn","promise","M","str","Promise","resolve","util","cached","LocalStorage","get","reject","push","methodname","args","stringid","stringparams","done","set","fail","length","Ajax","call","cfg","langrev","$","when","apply","strings","cache_strings","defaultLang","forEach","value","join","Deferred"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Fetch and return language strings.\n *\n * @module core/str\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n *\n */\nimport $ from 'jquery';\nimport Ajax from 'core/ajax';\nimport LocalStorage from 'core/localstorage';\n\n// Module cache for the promises so that we don't make multiple\n// unnecessary requests.\nlet promiseCache = [];\n\n/* eslint-disable no-restricted-properties */\n\n/**\n * Return a Promise that resolves to a string.\n *\n * If the string has previously been cached, then the Promise will be resolved immediately, otherwise it will be fetched\n * from the server and resolved when available.\n *\n * @method get_string\n * @param {string} key The language string key\n * @param {string} component The language string component\n * @param {string} param The param for variable expansion in the string.\n * @param {string} lang The users language - if not passed it is deduced.\n * @return {Promise}\n *\n * @example Fetching a string \n *\n * import {get_string as getString} from 'core/str';\n * get_string('cannotfindteacher', 'error')\n * .then(str => {\n * window.console.log(str); // Cannot find teacher\n * })\n * .catch();\n */\n// eslint-disable-next-line camelcase\nexport const get_string = (key, component, param, lang) => {\n return get_strings([{key, component, param, lang}])\n .then(results => results[0]);\n};\n\n/**\n * Make a batch request to load a set of strings.\n *\n * Any missing string will be fetched from the server.\n * The Promise will only be resolved once all strings are available, or an attempt has been made to fetch them.\n *\n * @method get_strings\n * @param {Object[]} requests List of strings to fetch\n * @param {string} requests.key The string identifer to fetch\n * @param {string} [requests.component='core'] The componet to fetch from\n * @param {string} [requests.lang] The language to fetch a string for. Defaults to current page language.\n * @param {object|string} [requests.param] The param for variable expansion in the string.\n * @return {Promise[]}\n *\n * @example Fetching a set of strings \n *\n * import {get_strings as getStrings} from 'core/str';\n * get_strings([\n * {\n * key: 'cannotfindteacher',\n * component: 'error',\n * },\n * {\n * key: 'yes',\n * component: 'core',\n * },\n * {\n * key: 'no',\n * component: 'core',\n * },\n * ])\n * .then((cannotFindTeacher, yes, no) => {\n * window.console.log(cannotFindTeacher); // Cannot find teacher\n * window.console.log(yes); // Yes\n * window.console.log(no); // No\n * })\n * .catch();\n */\n// eslint-disable-next-line camelcase\nexport const get_strings = (requests) => {\n let requestData = [];\n const pageLang = $('html').attr('lang').replace(/-/g, '_');\n // Helper function to construct the cache key.\n const getCacheKey = ({key, component, lang = pageLang}) => {\n if (!component) {\n component = 'core';\n }\n return `core_str/${key}/${component}/${lang}`;\n };\n\n const stringPromises = requests.map((request) => {\n const cacheKey = getCacheKey(request);\n const {component, key, param, lang = pageLang} = request;\n // Helper function to add the promise to cache.\n const buildReturn = (promise) => {\n // Make sure the promise cache contains our promise.\n promiseCache[cacheKey] = promise;\n return promise;\n };\n\n // Check if we can serve the string straight from M.str.\n if (component in M.str && key in M.str[component]) {\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if the string is in the browser's local storage.\n const cached = LocalStorage.get(cacheKey);\n if (cached) {\n M.str[component] = {...M.str[component], [key]: cached};\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if we've already loaded this string from the server.\n if (cacheKey in promiseCache) {\n return buildReturn(promiseCache[cacheKey]).then(() => {\n return M.util.get_string(key, component, param, lang);\n });\n } else {\n // We're going to have to ask the server for the string so\n // add this string to the list of requests to be sent.\n return buildReturn(new Promise((resolve, reject) => {\n requestData.push({\n methodname: 'core_get_string',\n args: {\n stringid: key,\n stringparams: [],\n component,\n lang,\n },\n done: (str) => {\n // When we get the response from the server\n // we should update M.str and the browser's\n // local storage before resolving this promise.\n M.str[component] = {...M.str[component], [key]: str};\n LocalStorage.set(cacheKey, str);\n resolve(M.util.get_string(key, component, param, lang));\n },\n fail: reject\n });\n }));\n }\n });\n\n if (requestData.length) {\n // If we need to load any strings from the server then send\n // off the request.\n Ajax.call(requestData, true, false, false, 0, M.cfg.langrev);\n }\n\n // We need to use jQuery here because some calling code uses the\n // .done handler instead of the .then handler.\n return $.when.apply($, stringPromises)\n .then((...strings) => strings);\n};\n\n/**\n * Add a list of strings to the caches.\n *\n * This function should typically only be called from core APIs to pre-cache values.\n *\n * @method cache_strings\n * @protected\n * @param {Object[]} strings List of strings to fetch\n * @param {string} strings.key The string identifer to fetch\n * @param {string} strings.value The string value\n * @param {string} [strings.component='core'] The componet to fetch from\n * @param {string} [strings.lang] The language to fetch a string for. Defaults to current page language.\n */\n// eslint-disable-next-line camelcase\nexport const cache_strings = (strings) => {\n const defaultLang = $('html').attr('lang').replace(/-/g, '_');\n\n strings.forEach(({key, component, value, lang = defaultLang}) => {\n const cacheKey = ['core_str', key, component, lang].join('/');\n\n // Check M.str caching.\n if (!(component in M.str) || !(key in M.str[component])) {\n if (!(component in M.str)) {\n M.str[component] = {};\n }\n\n M.str[component][key] = value;\n }\n\n // Check local storage.\n if (!LocalStorage.get(cacheKey)) {\n LocalStorage.set(cacheKey, value);\n }\n\n // Check the promises cache.\n if (!(cacheKey in promiseCache)) {\n promiseCache[cacheKey] = $.Deferred().resolve(value).promise();\n }\n });\n};\n/* eslint-enable no-restricted-properties */\n"],"file":"str.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/toast.min.js.map b/lib/amd/build/toast.min.js.map
index b8838e63892..5979ea3f262 100644
--- a/lib/amd/build/toast.min.js.map
+++ b/lib/amd/build/toast.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/toast.js"],"names":["addToastRegion","parent","pendingPromise","Pending","Templates","renderForPromise","html","js","prependNodeContents","Notification","exception","resolve","add","message","configuration","closeButton","autohide","delay","templateName","getTargetNode","targetNode","regions","document","querySelectorAll","length","body"],"mappings":"mMAsBA,OACA,OACA,O,6jCAOO,GAAMA,CAAAA,CAAc,4CAAG,WAAMC,CAAN,+FACpBC,CADoB,CACH,GAAIC,UAAJ,CAAY,gBAAZ,CADG,yBAIGC,WAAUC,gBAAV,CAA2B,0BAA3B,CAAuD,EAAvD,CAJH,iBAIfC,CAJe,GAIfA,IAJe,CAITC,CAJS,GAITA,EAJS,CAKtBH,UAAUI,mBAAV,CAA8BP,CAA9B,CAAsCK,CAAtC,CAA4CC,CAA5C,EALsB,qDAOtBE,UAAaC,SAAb,OAPsB,QAU1BR,CAAc,CAACS,OAAf,GAV0B,uDAAH,uDAApB,C,mBAyBA,GAAMC,CAAAA,CAAG,4CAAG,WAAMC,CAAN,CAAeC,CAAf,mGACTZ,CADS,CACQ,GAAIC,UAAJ,CAAY,gBAAZ,CADR,CAEfW,CAAa,IACTC,WAAW,GADF,CAETC,QAAQ,GAFC,CAGTC,KAAK,CAAE,GAHE,EAINH,CAJM,CAAb,CAOMI,CATS,oDAWcC,CAAAA,CAAa,EAX3B,QAWLC,CAXK,uBAYchB,WAAUC,gBAAV,CAA2Ba,CAA3B,IACrBL,OAAO,CAAPA,CADqB,EAElBC,CAFkB,EAZd,iBAYJR,CAZI,GAYJA,IAZI,CAYEC,CAZF,GAYEA,EAZF,CAgBXH,UAAUI,mBAAV,CAA8BY,CAA9B,CAA0Cd,CAA1C,CAAgDC,CAAhD,EAhBW,qDAkBXE,UAAaC,SAAb,OAlBW,QAqBfR,CAAc,CAACS,OAAf,GArBe,uDAAH,uDAAT,C,QAwBP,GAAMQ,CAAAA,CAAa,4CAAG,oGACZE,CADY,CACFC,QAAQ,CAACC,gBAAT,CAA0B,gBAA1B,CADE,KAGdF,CAAO,CAACG,MAHM,0CAIPH,CAAO,CAACA,CAAO,CAACG,MAAR,CAAiB,CAAlB,CAJA,wBAOZxB,CAAAA,CAAc,CAACsB,QAAQ,CAACG,IAAV,CAAgB,cAAhB,CAPF,iCAQXN,CAAa,EARF,0CAAH,uD","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A system for displaying small snackbar notifications to users which disappear shortly after they are shown.\n *\n * @module core/toast\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\n\n/**\n * Add a new region to place toasts in, taking in a parent element.\n *\n * @param {Element} parent\n */\nexport const addToastRegion = async(parent) => {\n const pendingPromise = new Pending('addToastRegion');\n\n try {\n const {html, js} = await Templates.renderForPromise('core/local/toast/wrapper', {});\n Templates.prependNodeContents(parent, html, js);\n } catch (e) {\n Notification.exception(e);\n }\n\n pendingPromise.resolve();\n};\n\n/**\n * Add a new toast or snackbar notification to the page.\n *\n * @param {String} message\n * @param {Object} configuration\n * @param {String} [configuration.title]\n * @param {String} [configuration.subtitle]\n * @param {String} [configuration.type] Optional type of the toast notification ('success', 'info', 'warning' or 'danger')\n * @param {Boolean} [configuration.autohide=true]\n * @param {Boolean} [configuration.closeButton=false]\n * @param {Number} [configuration.delay=4000]\n */\nexport const add = async(message, configuration) => {\n const pendingPromise = new Pending('addToastRegion');\n configuration = {\n closeButton: false,\n autohide: true,\n delay: 4000,\n ...configuration,\n };\n\n const templateName = `core/local/toast/message`;\n try {\n const targetNode = await getTargetNode();\n const {html, js} = await Templates.renderForPromise(templateName, {\n message,\n ...configuration\n });\n Templates.prependNodeContents(targetNode, html, js);\n } catch (e) {\n Notification.exception(e);\n }\n\n pendingPromise.resolve();\n};\n\nconst getTargetNode = async() => {\n const regions = document.querySelectorAll('.toast-wrapper');\n\n if (regions.length) {\n return regions[regions.length - 1];\n }\n\n await addToastRegion(document.body, 'fixed-bottom');\n return getTargetNode();\n};\n"],"file":"toast.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/toast.js"],"names":["addToastRegion","parent","pendingPromise","Pending","Templates","renderForPromise","html","js","prependNodeContents","Notification","exception","resolve","add","message","configuration","closeButton","autohide","delay","templateName","getTargetNode","targetNode","regions","document","querySelectorAll","length","body"],"mappings":"mMAsBA,OACA,OACA,O,6jCAQO,GAAMA,CAAAA,CAAc,4CAAG,WAAMC,CAAN,+FACpBC,CADoB,CACH,GAAIC,UAAJ,CAAY,gBAAZ,CADG,yBAIGC,WAAUC,gBAAV,CAA2B,0BAA3B,CAAuD,EAAvD,CAJH,iBAIfC,CAJe,GAIfA,IAJe,CAITC,CAJS,GAITA,EAJS,CAKtBH,UAAUI,mBAAV,CAA8BP,CAA9B,CAAsCK,CAAtC,CAA4CC,CAA5C,EALsB,qDAOtBE,UAAaC,SAAb,OAPsB,QAU1BR,CAAc,CAACS,OAAf,GAV0B,uDAAH,uDAApB,C,mBAyCA,GAAMC,CAAAA,CAAG,4CAAG,WAAMC,CAAN,CAAeC,CAAf,mGACTZ,CADS,CACQ,GAAIC,UAAJ,CAAY,gBAAZ,CADR,CAEfW,CAAa,IACTC,WAAW,GADF,CAETC,QAAQ,GAFC,CAGTC,KAAK,CAAE,GAHE,EAINH,CAJM,CAAb,CAOMI,CATS,oDAWcC,CAAAA,CAAa,EAX3B,QAWLC,CAXK,uBAYchB,WAAUC,gBAAV,CAA2Ba,CAA3B,IACrBL,OAAO,CAAPA,CADqB,EAElBC,CAFkB,EAZd,iBAYJR,CAZI,GAYJA,IAZI,CAYEC,CAZF,GAYEA,EAZF,CAgBXH,UAAUI,mBAAV,CAA8BY,CAA9B,CAA0Cd,CAA1C,CAAgDC,CAAhD,EAhBW,qDAkBXE,UAAaC,SAAb,OAlBW,QAqBfR,CAAc,CAACS,OAAf,GArBe,uDAAH,uDAAT,C,QAwBP,GAAMQ,CAAAA,CAAa,4CAAG,oGACZE,CADY,CACFC,QAAQ,CAACC,gBAAT,CAA0B,gBAA1B,CADE,KAGdF,CAAO,CAACG,MAHM,0CAIPH,CAAO,CAACA,CAAO,CAACG,MAAR,CAAiB,CAAlB,CAJA,wBAOZxB,CAAAA,CAAc,CAACsB,QAAQ,CAACG,IAAV,CAAgB,cAAhB,CAPF,iCAQXN,CAAa,EARF,0CAAH,uD","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A system for displaying small snackbar notifications to users which disappear shortly after they are shown.\n *\n * @module core/toast\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\n\n/**\n * Add a new region to place toasts in, taking in a parent element.\n *\n * @method\n * @param {HTMLElement} parent\n */\nexport const addToastRegion = async(parent) => {\n const pendingPromise = new Pending('addToastRegion');\n\n try {\n const {html, js} = await Templates.renderForPromise('core/local/toast/wrapper', {});\n Templates.prependNodeContents(parent, html, js);\n } catch (e) {\n Notification.exception(e);\n }\n\n pendingPromise.resolve();\n};\n\n/**\n * Add a new toast or snackbar notification to the page.\n *\n * @method\n * @param {String} message\n * @param {Object} configuration\n * @param {String} [configuration.title]\n * @param {String} [configuration.subtitle]\n * @param {String} [configuration.type] Optional type of the toast notification ('success', 'info', 'warning' or 'danger')\n * @param {Boolean} [configuration.autohide=true]\n * @param {Boolean} [configuration.closeButton=false]\n * @param {Number} [configuration.delay=4000]\n *\n * @example\n * import {add as addToast} from 'core/toast';\n * import {get_string as getString} from 'core/str';\n *\n * getString('example', 'mod_myexample')\n * .then(str => {\n * addToast(str, {\n * type: 'warning',\n * autohide: false,\n * closeButton: true,\n * });\n * return;\n * })\n * .catch();\n */\nexport const add = async(message, configuration) => {\n const pendingPromise = new Pending('addToastRegion');\n configuration = {\n closeButton: false,\n autohide: true,\n delay: 4000,\n ...configuration,\n };\n\n const templateName = `core/local/toast/message`;\n try {\n const targetNode = await getTargetNode();\n const {html, js} = await Templates.renderForPromise(templateName, {\n message,\n ...configuration\n });\n Templates.prependNodeContents(targetNode, html, js);\n } catch (e) {\n Notification.exception(e);\n }\n\n pendingPromise.resolve();\n};\n\nconst getTargetNode = async() => {\n const regions = document.querySelectorAll('.toast-wrapper');\n\n if (regions.length) {\n return regions[regions.length - 1];\n }\n\n await addToastRegion(document.body, 'fixed-bottom');\n return getTargetNode();\n};\n"],"file":"toast.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/truncate.min.js.map b/lib/amd/build/truncate.min.js.map
index f9207740232..9c7e128458b 100644
--- a/lib/amd/build/truncate.min.js.map
+++ b/lib/amd/build/truncate.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/truncate.js"],"names":["define","$","charLengthAt","text","position","string","size","length","index","cuFirst","charCodeAt","cuSecond","nextIndex","len","lengthMultiByte","count","i","getSliceLength","amount","truncate","html","options","append","fn","isNaN","parseFloat","o","extend","defaults","each","self","noBreaks","find","replaceWith","ellipsisLength","ellipsis","textLength","excess","stripTags","words","sliced","slice","replaced","replace","truncated","oneWord","match","keepFirstWord","exec","contents","get","reverse","el","$el","remove","nodeType","splitAmount","splitText"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Description of import/upgrade into Moodle:\n * 1.) Download from https://github.com/pathable/truncate\n * 2.) Copy jquery.truncate.js into lib/amd/src/truncate.js\n * 3.) Edit truncate.js to return the $.truncate function as truncate\n * 4.) Apply Moodle changes from git commit 7172b33e241c4d42cff01f78bf8570408f43fdc2\n */\n\n/**\n * Module for text truncation.\n *\n * Implementation provided by Pathable (thanks!).\n * See: https://github.com/pathable/truncate\n *\n * @module core/truncate\n * @class truncate\n * @copyright 2017 Pathable\n * 2017 Mathias Bynens\n * 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n // Matches trailing non-space characters.\n var chop = /(\\s*\\S+|\\s)$/;\n\n // Matches the first word in the string.\n var start = /^(\\S*)/;\n\n // Matches any space characters.\n var space = /\\s/;\n\n // Special thanks to Mathias Bynens for the multi-byte char\n // implementation. Much love.\n // see: https://github.com/mathiasbynens/String.prototype.at/blob/master/at.js\n var charLengthAt = function(text, position) {\n var string = String(text);\n var size = string.length;\n // `ToInteger`\n var index = position ? Number(position) : 0;\n if (index != index) { // better `isNaN`\n index = 0;\n }\n // Account for out-of-bounds indices\n // The odd lower bound is because the ToInteger operation is\n // going to round `n` to `0` for `-1 < n <= 0`.\n if (index <= -1 || index >= size) {\n return '';\n }\n // Second half of `ToInteger`\n index = index | 0;\n // Get the first code unit and code unit value\n var cuFirst = string.charCodeAt(index);\n var cuSecond;\n var nextIndex = index + 1;\n var len = 1;\n if ( // Check if it’s the start of a surrogate pair.\n cuFirst >= 0xD800 && cuFirst <= 0xDBFF && // high surrogate\n size > nextIndex // there is a next code unit\n ) {\n cuSecond = string.charCodeAt(nextIndex);\n if (cuSecond >= 0xDC00 && cuSecond <= 0xDFFF) { // low surrogate\n len = 2;\n }\n }\n return len;\n };\n\n var lengthMultiByte = function(text) {\n var count = 0;\n\n for (var i = 0; i < text.length; i += charLengthAt(text, i)) {\n count++;\n }\n\n return count;\n };\n\n var getSliceLength = function(text, amount) {\n if (!text.length) {\n return 0;\n }\n\n var length = 0;\n var count = 0;\n\n do {\n length += charLengthAt(text, length);\n count++;\n } while (length < text.length && count < amount);\n\n return length;\n };\n\n // Return a truncated html string. Delegates to $.fn.truncate.\n $.truncate = function(html, options) {\n return $('
').append(html).truncate(options).html();\n };\n\n // Truncate the contents of an element in place.\n $.fn.truncate = function(options) {\n if (!isNaN(parseFloat(options))) options = {length: options};\n var o = $.extend({}, $.truncate.defaults, options);\n\n return this.each(function() {\n var self = $(this);\n\n if (o.noBreaks) self.find('br').replaceWith(' ');\n\n var ellipsisLength = o.ellipsis.length;\n var text = self.text();\n var textLength = lengthMultiByte(text);\n var excess = textLength - o.length + ellipsisLength;\n\n if (textLength < o.length) return;\n if (o.stripTags) self.text(text);\n\n // Chop off any partial words if appropriate.\n if (o.words && excess > 0) {\n var sliced = text.slice(0, getSliceLength(text, o.length - ellipsisLength) + 1);\n var replaced = sliced.replace(chop, '');\n var truncated = lengthMultiByte(replaced);\n var oneWord = sliced.match(space) ? false : true;\n\n if (o.keepFirstWord && truncated === 0) {\n excess = textLength - lengthMultiByte(start.exec(text)[0]) - ellipsisLength;\n } else if (oneWord && truncated === 0) {\n excess = textLength - o.length + ellipsisLength;\n } else {\n excess = textLength - truncated - 1;\n }\n }\n\n // The requested length is larger than the text. No need for ellipsis.\n if (excess > textLength) {\n excess = textLength - o.length;\n }\n\n if (excess < 0 || !excess && !o.truncated) return;\n\n // Iterate over each child node in reverse, removing excess text.\n $.each(self.contents().get().reverse(), function(i, el) {\n var $el = $(el);\n var text = $el.text();\n var length = lengthMultiByte(text);\n\n // If the text is longer than the excess, remove the node and continue.\n if (length <= excess) {\n o.truncated = true;\n excess -= length;\n $el.remove();\n return;\n }\n\n // Remove the excess text and append the ellipsis.\n if (el.nodeType === 3) {\n var splitAmount = length - excess;\n splitAmount = splitAmount >= 0 ? getSliceLength(text, splitAmount) : 0;\n $(el.splitText(splitAmount)).replaceWith(o.ellipsis);\n return false;\n }\n\n // Recursively truncate child nodes.\n $el.truncate($.extend(o, {length: length - excess + ellipsisLength}));\n return false;\n });\n });\n };\n\n $.truncate.defaults = {\n\n // Strip all html elements, leaving only plain text.\n stripTags: false,\n\n // Only truncate at word boundaries.\n words: false,\n\n // When 'words' is active, keeps the first word in the string\n // even if it's longer than a target length.\n keepFirstWord: false,\n\n // Replace instances of with a single space.\n noBreaks: false,\n\n // The maximum length of the truncated html.\n length: Infinity,\n\n // The character to use as the ellipsis. The word joiner (U+2060) can be\n // used to prevent a hanging ellipsis, but displays incorrectly in Chrome\n // on Windows 7.\n // http://code.google.com/p/chromium/issues/detail?id=68323\n //ellipsis: '\\u2026' // '\\u2060\\u2026'\n ellipsis: '\\u2026' // '\\u2060\\u2026'\n\n };\n\n return {\n truncate: $.truncate,\n };\n});\n"],"file":"truncate.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/truncate.js"],"names":["define","$","charLengthAt","text","position","string","size","length","index","cuFirst","charCodeAt","cuSecond","nextIndex","len","lengthMultiByte","count","i","getSliceLength","amount","truncate","html","options","append","fn","isNaN","parseFloat","o","extend","defaults","each","self","noBreaks","find","replaceWith","ellipsisLength","ellipsis","textLength","excess","stripTags","words","sliced","slice","replaced","replace","truncated","oneWord","match","keepFirstWord","exec","contents","get","reverse","el","$el","remove","nodeType","splitAmount","splitText"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Description of import/upgrade into Moodle:\n * 1.) Download from https://github.com/pathable/truncate\n * 2.) Copy jquery.truncate.js into lib/amd/src/truncate.js\n * 3.) Edit truncate.js to return the $.truncate function as truncate\n * 4.) Apply Moodle changes from git commit 7172b33e241c4d42cff01f78bf8570408f43fdc2\n */\n\n/**\n * Module for text truncation.\n *\n * Implementation provided by Pathable (thanks!).\n * See: https://github.com/pathable/truncate\n *\n * @module core/truncate\n * @copyright 2017 Pathable\n * 2017 Mathias Bynens\n * 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n // Matches trailing non-space characters.\n var chop = /(\\s*\\S+|\\s)$/;\n\n // Matches the first word in the string.\n var start = /^(\\S*)/;\n\n // Matches any space characters.\n var space = /\\s/;\n\n // Special thanks to Mathias Bynens for the multi-byte char\n // implementation. Much love.\n // see: https://github.com/mathiasbynens/String.prototype.at/blob/master/at.js\n var charLengthAt = function(text, position) {\n var string = String(text);\n var size = string.length;\n // `ToInteger`\n var index = position ? Number(position) : 0;\n if (index != index) { // better `isNaN`\n index = 0;\n }\n // Account for out-of-bounds indices\n // The odd lower bound is because the ToInteger operation is\n // going to round `n` to `0` for `-1 < n <= 0`.\n if (index <= -1 || index >= size) {\n return '';\n }\n // Second half of `ToInteger`\n index = index | 0;\n // Get the first code unit and code unit value\n var cuFirst = string.charCodeAt(index);\n var cuSecond;\n var nextIndex = index + 1;\n var len = 1;\n if ( // Check if it’s the start of a surrogate pair.\n cuFirst >= 0xD800 && cuFirst <= 0xDBFF && // high surrogate\n size > nextIndex // there is a next code unit\n ) {\n cuSecond = string.charCodeAt(nextIndex);\n if (cuSecond >= 0xDC00 && cuSecond <= 0xDFFF) { // low surrogate\n len = 2;\n }\n }\n return len;\n };\n\n var lengthMultiByte = function(text) {\n var count = 0;\n\n for (var i = 0; i < text.length; i += charLengthAt(text, i)) {\n count++;\n }\n\n return count;\n };\n\n var getSliceLength = function(text, amount) {\n if (!text.length) {\n return 0;\n }\n\n var length = 0;\n var count = 0;\n\n do {\n length += charLengthAt(text, length);\n count++;\n } while (length < text.length && count < amount);\n\n return length;\n };\n\n // Return a truncated html string. Delegates to $.fn.truncate.\n $.truncate = function(html, options) {\n return $('
').append(html).truncate(options).html();\n };\n\n // Truncate the contents of an element in place.\n $.fn.truncate = function(options) {\n if (!isNaN(parseFloat(options))) options = {length: options};\n var o = $.extend({}, $.truncate.defaults, options);\n\n return this.each(function() {\n var self = $(this);\n\n if (o.noBreaks) self.find('br').replaceWith(' ');\n\n var ellipsisLength = o.ellipsis.length;\n var text = self.text();\n var textLength = lengthMultiByte(text);\n var excess = textLength - o.length + ellipsisLength;\n\n if (textLength < o.length) return;\n if (o.stripTags) self.text(text);\n\n // Chop off any partial words if appropriate.\n if (o.words && excess > 0) {\n var sliced = text.slice(0, getSliceLength(text, o.length - ellipsisLength) + 1);\n var replaced = sliced.replace(chop, '');\n var truncated = lengthMultiByte(replaced);\n var oneWord = sliced.match(space) ? false : true;\n\n if (o.keepFirstWord && truncated === 0) {\n excess = textLength - lengthMultiByte(start.exec(text)[0]) - ellipsisLength;\n } else if (oneWord && truncated === 0) {\n excess = textLength - o.length + ellipsisLength;\n } else {\n excess = textLength - truncated - 1;\n }\n }\n\n // The requested length is larger than the text. No need for ellipsis.\n if (excess > textLength) {\n excess = textLength - o.length;\n }\n\n if (excess < 0 || !excess && !o.truncated) return;\n\n // Iterate over each child node in reverse, removing excess text.\n $.each(self.contents().get().reverse(), function(i, el) {\n var $el = $(el);\n var text = $el.text();\n var length = lengthMultiByte(text);\n\n // If the text is longer than the excess, remove the node and continue.\n if (length <= excess) {\n o.truncated = true;\n excess -= length;\n $el.remove();\n return;\n }\n\n // Remove the excess text and append the ellipsis.\n if (el.nodeType === 3) {\n var splitAmount = length - excess;\n splitAmount = splitAmount >= 0 ? getSliceLength(text, splitAmount) : 0;\n $(el.splitText(splitAmount)).replaceWith(o.ellipsis);\n return false;\n }\n\n // Recursively truncate child nodes.\n $el.truncate($.extend(o, {length: length - excess + ellipsisLength}));\n return false;\n });\n });\n };\n\n $.truncate.defaults = {\n\n // Strip all html elements, leaving only plain text.\n stripTags: false,\n\n // Only truncate at word boundaries.\n words: false,\n\n // When 'words' is active, keeps the first word in the string\n // even if it's longer than a target length.\n keepFirstWord: false,\n\n // Replace instances of with a single space.\n noBreaks: false,\n\n // The maximum length of the truncated html.\n length: Infinity,\n\n // The character to use as the ellipsis. The word joiner (U+2060) can be\n // used to prevent a hanging ellipsis, but displays incorrectly in Chrome\n // on Windows 7.\n // http://code.google.com/p/chromium/issues/detail?id=68323\n //ellipsis: '\\u2026' // '\\u2060\\u2026'\n ellipsis: '\\u2026' // '\\u2060\\u2026'\n\n };\n\n return {\n truncate: $.truncate,\n };\n});\n"],"file":"truncate.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/url.min.js.map b/lib/amd/build/url.min.js.map
index 0862cdbe423..93e38742fe2 100644
--- a/lib/amd/build/url.min.js.map
+++ b/lib/amd/build/url.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/url.js"],"names":["define","$","config","fileUrl","relativeScript","slashArg","url","wwwroot","charAt","slasharguments","encodeURIComponent","relativeUrl","relativePath","params","includeSessKey","indexOf","Error","admin","replace","sesskey","queryString","Object","keys","length","map","value","param","join","imageUrl","imagename","component","M","util","image_url"],"mappings":"AAwBAA,OAAM,YAAC,CAAC,QAAD,CAAW,aAAX,CAAD,CAA4B,SAASC,CAAT,CAAYC,CAAZ,CAAoB,CAGlD,MAAqC,CAUjCC,OAAO,CAAE,iBAASC,CAAT,CAAyBC,CAAzB,CAAmC,CAExC,GAAIC,CAAAA,CAAG,CAAGJ,CAAM,CAACK,OAAP,CAAiBH,CAA3B,CAGA,GAA0B,GAAtB,EAAAC,CAAQ,CAACG,MAAT,CAAgB,CAAhB,CAAJ,CAA+B,CAC3BH,CAAQ,CAAG,IAAMA,CACpB,CACD,GAAIH,CAAM,CAACO,cAAX,CAA2B,CACvBH,CAAG,EAAID,CACV,CAFD,IAEO,CACHC,CAAG,EAAI,SAAWI,kBAAkB,CAACL,CAAD,CACvC,CACD,MAAOC,CAAAA,CACV,CAxBgC,CAmCjCK,WAAW,CAAE,qBAASC,CAAT,CAAuBC,CAAvB,CAA+BC,CAA/B,CAA+C,CAExD,GAAsC,CAAlC,GAAAF,CAAY,CAACG,OAAb,CAAqB,OAArB,GAA0E,CAAnC,GAAAH,CAAY,CAACG,OAAb,CAAqB,QAArB,CAAvC,EAA8G,CAA/B,EAAAH,CAAY,CAACG,OAAb,CAAqB,KAArB,CAAnF,CAAqH,CACjH,KAAM,IAAIC,CAAAA,KAAJ,CAAU,oDAAV,CACT,CAGD,GAA8B,GAA1B,EAAAJ,CAAY,CAACJ,MAAb,CAAoB,CAApB,CAAJ,CAAmC,CAC/BI,CAAY,CAAG,IAAMA,CACxB,CAGD,GAAqB,OAAjB,GAAAV,CAAM,CAACe,KAAX,CAA8B,CAC1BL,CAAY,CAAGA,CAAY,CAACM,OAAb,CAAqB,YAArB,CAAmC,IAAMhB,CAAM,CAACe,KAAb,CAAqB,GAAxD,CAClB,CAEDJ,CAAM,CAAGA,CAAM,EAAI,EAAnB,CACA,GAAIC,CAAJ,CAAoB,CAChBD,CAAM,CAACM,OAAP,CAAiBjB,CAAM,CAACiB,OAC3B,CAED,GAAIC,CAAAA,CAAW,CAAG,EAAlB,CACA,GAAIC,MAAM,CAACC,IAAP,CAAYT,CAAZ,EAAoBU,MAAxB,CAAgC,CAC5BH,CAAW,CAAGnB,CAAC,CAACuB,GAAF,CAAMX,CAAN,CAAc,SAASY,CAAT,CAAgBC,CAAhB,CAAuB,CAC/C,MAAOA,CAAAA,CAAK,CAAG,GAAR,CAAcD,CACxB,CAFa,EAEXE,IAFW,CAEN,GAFM,CAGjB,CAED,GAAoB,EAAhB,GAAAP,CAAJ,CAAwB,CACpB,MAAOlB,CAAAA,CAAM,CAACK,OAAP,CAAiBK,CAAjB,CAAgC,GAAhC,CAAsCQ,CAChD,CAFD,IAEO,CACH,MAAOlB,CAAAA,CAAM,CAACK,OAAP,CAAiBK,CAC3B,CACJ,CApEgC,CA8EjCgB,QAAQ,CAAE,kBAASC,CAAT,CAAoBC,CAApB,CAA+B,CACrC,MAAOC,CAAAA,CAAC,CAACC,IAAF,CAAOC,SAAP,CAAiBJ,CAAjB,CAA4BC,CAA5B,CACV,CAhFgC,CAkFxC,CArFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * URL utility functions.\n *\n * @module core/url\n * @class url\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(['jquery', 'core/config'], function($, config) {\n\n\n return /** @alias module:core/url */ {\n // Public variables and functions.\n /**\n * Construct a file url\n *\n * @method fileUrl\n * @param {string} relativeScript\n * @param {string} slashArg\n * @return {string}\n */\n fileUrl: function(relativeScript, slashArg) {\n\n var url = config.wwwroot + relativeScript;\n\n // Force a /\n if (slashArg.charAt(0) != '/') {\n slashArg = '/' + slashArg;\n }\n if (config.slasharguments) {\n url += slashArg;\n } else {\n url += '?file=' + encodeURIComponent(slashArg);\n }\n return url;\n },\n\n /**\n * Take a path relative to the moodle basedir and do some fixing (see class moodle_url in php).\n *\n * @method relativeUrl\n * @param {string} relativePath The path relative to the moodle basedir.\n * @param {object} params The query parameters for the URL.\n * @param {bool} includeSessKey Add the session key to the query params.\n * @return {string}\n */\n relativeUrl: function(relativePath, params, includeSessKey) {\n\n if (relativePath.indexOf('http:') === 0 || relativePath.indexOf('https:') === 0 || relativePath.indexOf('://') >= 0) {\n throw new Error('relativeUrl function does not accept absolute urls');\n }\n\n // Fix non-relative paths;\n if (relativePath.charAt(0) != '/') {\n relativePath = '/' + relativePath;\n }\n\n // Fix admin urls.\n if (config.admin !== 'admin') {\n relativePath = relativePath.replace(/^\\/admin\\//, '/' + config.admin + '/');\n }\n\n params = params || {};\n if (includeSessKey) {\n params.sesskey = config.sesskey;\n }\n\n var queryString = '';\n if (Object.keys(params).length) {\n queryString = $.map(params, function(value, param) {\n return param + '=' + value;\n }).join('&');\n }\n\n if (queryString !== '') {\n return config.wwwroot + relativePath + '?' + queryString;\n } else {\n return config.wwwroot + relativePath;\n }\n },\n\n /**\n * Wrapper for image_url function.\n *\n * @method imageUrl\n * @param {string} imagename The image name (e.g. t/edit).\n * @param {string} component The component (e.g. mod_feedback).\n * @return {string}\n */\n imageUrl: function(imagename, component) {\n return M.util.image_url(imagename, component);\n }\n };\n});\n"],"file":"url.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/url.js"],"names":["define","$","config","fileUrl","relativeScript","slashArg","url","wwwroot","charAt","slasharguments","encodeURIComponent","relativeUrl","relativePath","params","includeSessKey","indexOf","Error","admin","replace","sesskey","queryString","Object","keys","length","map","value","param","join","imageUrl","imagename","component","M","util","image_url"],"mappings":"AAuBAA,OAAM,YAAC,CAAC,QAAD,CAAW,aAAX,CAAD,CAA4B,SAASC,CAAT,CAAYC,CAAZ,CAAoB,CAGlD,MAAqC,CAUjCC,OAAO,CAAE,iBAASC,CAAT,CAAyBC,CAAzB,CAAmC,CAExC,GAAIC,CAAAA,CAAG,CAAGJ,CAAM,CAACK,OAAP,CAAiBH,CAA3B,CAGA,GAA0B,GAAtB,EAAAC,CAAQ,CAACG,MAAT,CAAgB,CAAhB,CAAJ,CAA+B,CAC3BH,CAAQ,CAAG,IAAMA,CACpB,CACD,GAAIH,CAAM,CAACO,cAAX,CAA2B,CACvBH,CAAG,EAAID,CACV,CAFD,IAEO,CACHC,CAAG,EAAI,SAAWI,kBAAkB,CAACL,CAAD,CACvC,CACD,MAAOC,CAAAA,CACV,CAxBgC,CAmCjCK,WAAW,CAAE,qBAASC,CAAT,CAAuBC,CAAvB,CAA+BC,CAA/B,CAA+C,CAExD,GAAsC,CAAlC,GAAAF,CAAY,CAACG,OAAb,CAAqB,OAArB,GAA0E,CAAnC,GAAAH,CAAY,CAACG,OAAb,CAAqB,QAArB,CAAvC,EAA8G,CAA/B,EAAAH,CAAY,CAACG,OAAb,CAAqB,KAArB,CAAnF,CAAqH,CACjH,KAAM,IAAIC,CAAAA,KAAJ,CAAU,oDAAV,CACT,CAGD,GAA8B,GAA1B,EAAAJ,CAAY,CAACJ,MAAb,CAAoB,CAApB,CAAJ,CAAmC,CAC/BI,CAAY,CAAG,IAAMA,CACxB,CAGD,GAAqB,OAAjB,GAAAV,CAAM,CAACe,KAAX,CAA8B,CAC1BL,CAAY,CAAGA,CAAY,CAACM,OAAb,CAAqB,YAArB,CAAmC,IAAMhB,CAAM,CAACe,KAAb,CAAqB,GAAxD,CAClB,CAEDJ,CAAM,CAAGA,CAAM,EAAI,EAAnB,CACA,GAAIC,CAAJ,CAAoB,CAChBD,CAAM,CAACM,OAAP,CAAiBjB,CAAM,CAACiB,OAC3B,CAED,GAAIC,CAAAA,CAAW,CAAG,EAAlB,CACA,GAAIC,MAAM,CAACC,IAAP,CAAYT,CAAZ,EAAoBU,MAAxB,CAAgC,CAC5BH,CAAW,CAAGnB,CAAC,CAACuB,GAAF,CAAMX,CAAN,CAAc,SAASY,CAAT,CAAgBC,CAAhB,CAAuB,CAC/C,MAAOA,CAAAA,CAAK,CAAG,GAAR,CAAcD,CACxB,CAFa,EAEXE,IAFW,CAEN,GAFM,CAGjB,CAED,GAAoB,EAAhB,GAAAP,CAAJ,CAAwB,CACpB,MAAOlB,CAAAA,CAAM,CAACK,OAAP,CAAiBK,CAAjB,CAAgC,GAAhC,CAAsCQ,CAChD,CAFD,IAEO,CACH,MAAOlB,CAAAA,CAAM,CAACK,OAAP,CAAiBK,CAC3B,CACJ,CApEgC,CA8EjCgB,QAAQ,CAAE,kBAASC,CAAT,CAAoBC,CAApB,CAA+B,CACrC,MAAOC,CAAAA,CAAC,CAACC,IAAF,CAAOC,SAAP,CAAiBJ,CAAjB,CAA4BC,CAA5B,CACV,CAhFgC,CAkFxC,CArFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * URL utility functions.\n *\n * @module core/url\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(['jquery', 'core/config'], function($, config) {\n\n\n return /** @alias module:core/url */ {\n // Public variables and functions.\n /**\n * Construct a file url\n *\n * @method fileUrl\n * @param {string} relativeScript\n * @param {string} slashArg\n * @return {string}\n */\n fileUrl: function(relativeScript, slashArg) {\n\n var url = config.wwwroot + relativeScript;\n\n // Force a /\n if (slashArg.charAt(0) != '/') {\n slashArg = '/' + slashArg;\n }\n if (config.slasharguments) {\n url += slashArg;\n } else {\n url += '?file=' + encodeURIComponent(slashArg);\n }\n return url;\n },\n\n /**\n * Take a path relative to the moodle basedir and do some fixing (see class moodle_url in php).\n *\n * @method relativeUrl\n * @param {string} relativePath The path relative to the moodle basedir.\n * @param {object} params The query parameters for the URL.\n * @param {bool} includeSessKey Add the session key to the query params.\n * @return {string}\n */\n relativeUrl: function(relativePath, params, includeSessKey) {\n\n if (relativePath.indexOf('http:') === 0 || relativePath.indexOf('https:') === 0 || relativePath.indexOf('://') >= 0) {\n throw new Error('relativeUrl function does not accept absolute urls');\n }\n\n // Fix non-relative paths;\n if (relativePath.charAt(0) != '/') {\n relativePath = '/' + relativePath;\n }\n\n // Fix admin urls.\n if (config.admin !== 'admin') {\n relativePath = relativePath.replace(/^\\/admin\\//, '/' + config.admin + '/');\n }\n\n params = params || {};\n if (includeSessKey) {\n params.sesskey = config.sesskey;\n }\n\n var queryString = '';\n if (Object.keys(params).length) {\n queryString = $.map(params, function(value, param) {\n return param + '=' + value;\n }).join('&');\n }\n\n if (queryString !== '') {\n return config.wwwroot + relativePath + '?' + queryString;\n } else {\n return config.wwwroot + relativePath;\n }\n },\n\n /**\n * Wrapper for image_url function.\n *\n * @method imageUrl\n * @param {string} imagename The image name (e.g. t/edit).\n * @param {string} component The component (e.g. mod_feedback).\n * @return {string}\n */\n imageUrl: function(imagename, component) {\n return M.util.image_url(imagename, component);\n }\n };\n});\n"],"file":"url.min.js"}
\ No newline at end of file
diff --git a/lib/amd/build/utils.min.js.map b/lib/amd/build/utils.min.js.map
index 5d083626c27..8733312d8ce 100644
--- a/lib/amd/build/utils.min.js.map
+++ b/lib/amd/build/utils.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/utils.js"],"names":["throttle","func","wait","onCooldown","runAgain","run","args","apply","setTimeout","recurse","debounce","timeout","clearTimeout"],"mappings":"mJAkCwB,QAAXA,CAAAA,QAAW,CAACC,CAAD,CAAOC,CAAP,CAAgB,IAChCC,CAAAA,CAAU,GADsB,CAEhCC,CAAQ,CAAG,IAFqB,CAG9BC,CAAG,CAAG,UAAkB,4BAANC,CAAM,uBAANA,CAAM,iBAC1B,GAAiB,IAAb,GAAAF,CAAJ,CAAuB,CAEnBA,CAAQ,GACX,CAHD,IAGO,CAGHA,CAAQ,GACX,CAED,GAAID,CAAJ,CAAgB,CAEZ,MACH,CAEDF,CAAI,CAACM,KAAL,CAAW,IAAX,CAAiBD,CAAjB,EACAH,CAAU,GAAV,CAEAK,UAAU,CAAC,UAAM,CACb,GAAMC,CAAAA,CAAO,CAAGL,CAAhB,CACAD,CAAU,GAAV,CACAC,CAAQ,CAAG,IAAX,CAEA,GAAIK,CAAJ,CAAa,CACTJ,CAAG,CAACC,CAAD,CACN,CACJ,CARS,CAQPJ,CARO,CASb,CA9BmC,CAgCpC,MAAOG,CAAAA,CACV,C,YAWuB,QAAXK,CAAAA,QAAW,CAACT,CAAD,CAAOC,CAAP,CAAgB,CACpC,GAAIS,CAAAA,CAAO,CAAG,IAAd,CACA,MAAO,WAAkB,mCAANL,CAAM,uBAANA,CAAM,iBACrBM,YAAY,CAACD,CAAD,CAAZ,CACAA,CAAO,CAAGH,UAAU,CAAC,UAAM,CACvBP,CAAI,CAACM,KAAL,CAAW,CAAX,CAAiBD,CAAjB,CACH,CAFmB,CAEjBJ,CAFiB,CAGvB,CACJ,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Utility functions.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n /**\n * Create a wrapper function to throttle the execution of the given\n * function to at most once every specified period.\n *\n * If the function is attempted to be executed while it's in cooldown\n * (during the wait period) then it'll immediately execute again as\n * soon as the cooldown is over.\n *\n * @param {Function} func The function to throttle\n * @param {Number} wait The number of milliseconds to wait between executions\n * @return {Function}\n */\nexport const throttle = (func, wait) => {\n let onCooldown = false;\n let runAgain = null;\n const run = function(...args) {\n if (runAgain === null) {\n // This is the first time the function has been called.\n runAgain = false;\n } else {\n // This function has been called a second time during the wait period\n // so re-run it once the wait period is over.\n runAgain = true;\n }\n\n if (onCooldown) {\n // Function has already run for this wait period.\n return;\n }\n\n func.apply(this, args);\n onCooldown = true;\n\n setTimeout(() => {\n const recurse = runAgain;\n onCooldown = false;\n runAgain = null;\n\n if (recurse) {\n run(args);\n }\n }, wait);\n };\n\n return run;\n};\n\n/**\n * Create a wrapper function to debounce the execution of the given\n * function. Each attempt to execute the function will reset the cooldown\n * period.\n *\n * @param {Function} func The function to debounce\n * @param {Number} wait The number of milliseconds to wait after the final attempt to execute\n * @return {Function}\n */\nexport const debounce = (func, wait) => {\n let timeout = null;\n return function(...args) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n};\n"],"file":"utils.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/utils.js"],"names":["throttle","func","wait","onCooldown","runAgain","run","args","apply","setTimeout","recurse","debounce","timeout","clearTimeout"],"mappings":"mJAoCwB,QAAXA,CAAAA,QAAW,CAACC,CAAD,CAAOC,CAAP,CAAgB,IAChCC,CAAAA,CAAU,GADsB,CAEhCC,CAAQ,CAAG,IAFqB,CAG9BC,CAAG,CAAG,UAAkB,4BAANC,CAAM,uBAANA,CAAM,iBAC1B,GAAiB,IAAb,GAAAF,CAAJ,CAAuB,CAEnBA,CAAQ,GACX,CAHD,IAGO,CAGHA,CAAQ,GACX,CAED,GAAID,CAAJ,CAAgB,CAEZ,MACH,CAEDF,CAAI,CAACM,KAAL,CAAW,IAAX,CAAiBD,CAAjB,EACAH,CAAU,GAAV,CAEAK,UAAU,CAAC,UAAM,CACb,GAAMC,CAAAA,CAAO,CAAGL,CAAhB,CACAD,CAAU,GAAV,CACAC,CAAQ,CAAG,IAAX,CAEA,GAAIK,CAAJ,CAAa,CACTJ,CAAG,CAACC,CAAD,CACN,CACJ,CARS,CAQPJ,CARO,CASb,CA9BmC,CAgCpC,MAAOG,CAAAA,CACV,C,YAYuB,QAAXK,CAAAA,QAAW,CAACT,CAAD,CAAOC,CAAP,CAAgB,CACpC,GAAIS,CAAAA,CAAO,CAAG,IAAd,CACA,MAAO,WAAkB,mCAANL,CAAM,uBAANA,CAAM,iBACrBM,YAAY,CAACD,CAAD,CAAZ,CACAA,CAAO,CAAGH,UAAU,CAAC,UAAM,CACvBP,CAAI,CAACM,KAAL,CAAW,CAAX,CAAiBD,CAAjB,CACH,CAFmB,CAEjBJ,CAFiB,CAGvB,CACJ,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Utility functions.\n *\n * @module core/utils\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n /**\n * Create a wrapper function to throttle the execution of the given\n * function to at most once every specified period.\n *\n * If the function is attempted to be executed while it's in cooldown\n * (during the wait period) then it'll immediately execute again as\n * soon as the cooldown is over.\n *\n * @method\n * @param {Function} func The function to throttle\n * @param {Number} wait The number of milliseconds to wait between executions\n * @return {Function}\n */\nexport const throttle = (func, wait) => {\n let onCooldown = false;\n let runAgain = null;\n const run = function(...args) {\n if (runAgain === null) {\n // This is the first time the function has been called.\n runAgain = false;\n } else {\n // This function has been called a second time during the wait period\n // so re-run it once the wait period is over.\n runAgain = true;\n }\n\n if (onCooldown) {\n // Function has already run for this wait period.\n return;\n }\n\n func.apply(this, args);\n onCooldown = true;\n\n setTimeout(() => {\n const recurse = runAgain;\n onCooldown = false;\n runAgain = null;\n\n if (recurse) {\n run(args);\n }\n }, wait);\n };\n\n return run;\n};\n\n/**\n * Create a wrapper function to debounce the execution of the given\n * function. Each attempt to execute the function will reset the cooldown\n * period.\n *\n * @method\n * @param {Function} func The function to debounce\n * @param {Number} wait The number of milliseconds to wait after the final attempt to execute\n * @return {Function}\n */\nexport const debounce = (func, wait) => {\n let timeout = null;\n return function(...args) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n};\n"],"file":"utils.min.js"}
\ No newline at end of file
diff --git a/lib/amd/src/ajax.js b/lib/amd/src/ajax.js
index eee1a143e03..761c686e188 100644
--- a/lib/amd/src/ajax.js
+++ b/lib/amd/src/ajax.js
@@ -25,6 +25,14 @@
*/
define(['jquery', 'core/config', 'core/log', 'core/url'], function($, config, Log, URL) {
+/**
+ * A request to be performed.
+ *
+ * @typedef {object} request
+ * @property {string} methodname The remote method to be called
+ * @property {object} args The arguments to pass when fetching the remote content
+ */
+
// Keeps track of when the user leaves the page so we know not to show an error.
var unloading = false;
@@ -123,23 +131,48 @@ define(['jquery', 'core/config', 'core/log', 'core/url'], function($, config, Lo
* Make a series of ajax requests and return all the responses.
*
* @method call
- * @param {Object[]} requests Array of requests with each containing methodname and args properties.
+ * @param {request[]} requests Array of requests with each containing methodname and args properties.
* done and fail callbacks can be set for each element in the array, or the
* can be attached to the promises returned by this function.
- * @param {Boolean} async Optional, defaults to true.
- * If false - this function will not return until the promises are resolved.
- * @param {Boolean} loginrequired Optional, defaults to true.
- * If false - this function will call the faster nologin ajax script - but
- * will fail unless all functions have been marked as 'loginrequired' => false
- * in services.php
- * @param {Boolean} nosessionupdate Optional, defaults to false.
- * If true, the timemodified for the session will not be updated.
- * @param {Integer} timeout number of milliseconds to wait for a response. Defaults to no limit.
- * @param {Integer} cachekey This is used in order to identify the request. If this id changes then we
- * will be sending a different URL and any caching (eg. browser, proxy) knows that it
- * should perform another request and not use the cache. Note - this variable is only
- * used when we are calling 'service-nologin.php'. See MDL-65794.
- * @return {Promise[]} Array of promises that will be resolved when the ajax call returns.
+ * @param {Boolean} [async=true] If false this function will not return until the promises are resolved.
+ * @param {Boolean} [loginrequired=true] When false this function calls an endpoint which does not use the
+ * session.
+ * Note: This may only be used with external functions which have been marked as
+ * `'loginrequired' => false`
+ * @param {Boolean} [nosessionupdate=false] If true, the timemodified for the session will not be updated.
+ * @param {Number} [timeout] number of milliseconds to wait for a response. Defaults to no limit.
+ * @param {Number} [cachekey] A cache key used to improve browser-side caching.
+ * Typically the same `cachekey` is used for all function calls.
+ * When the key changes, this causes the URL used to perform the fetch to change, which
+ * prevents the existing browser cache from being used.
+ * Note: This option is only availbale when `loginrequired` is `false`.
+ * See {@link https://tracker.moodle.org/browser/MDL-65794} for more information.
+ * @return {Promise[]} The Promises for each of the supplied requests.
+ * The order of the Promise matches the order of requests exactly.
+ *
+ * @example An example of fetching a string using the cachekey parameter
+ * import {call as fetchMany} from 'core/ajax';
+ * import * as Notification from 'core/notification';
+ *
+ * export const performAction = (some, args) => {
+ * Promises.all(fetchMany('core_get_string', {
+ * stringid: 'do_not_copy',
+ * component: 'core',
+ * lang: 'en',
+ * stringparams: [],
+ * }, true, false, false, undefined, M.cfg.langrev))
+ * .then(([doNotCopyString]) => {
+ * window.console.log(doNotCopyString);
+ * })
+ * .catch(Notification.exception);
+ * };
+ *
+ * @example A simple example that you might find in a repository function
+ *
+ * import {call as fetchMany} from 'core/ajax';
+ *
+ * export const fetchMessages = timeSince => fetchMany('core_message_get_messages', {timeSince}})[0];
+ * export const fetchNotifications = timeSince => fetchMany('core_message_get_notifications', {timeSince}})[0];
*/
call: function(requests, async, loginrequired, nosessionupdate, timeout, cachekey) {
$(window).bind('beforeunload', function() {
diff --git a/lib/amd/src/aria.js b/lib/amd/src/aria.js
index 883dc593cc2..baa0c1a0d45 100644
--- a/lib/amd/src/aria.js
+++ b/lib/amd/src/aria.js
@@ -17,7 +17,6 @@
* Helpers to perform ARIA compliance changes to the DOM.
*
* @module core/aria
- * @class aria
* @copyright 2020 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
diff --git a/lib/amd/src/auto_rows.js b/lib/amd/src/auto_rows.js
index 394c37dd36c..86e367664ff 100644
--- a/lib/amd/src/auto_rows.js
+++ b/lib/amd/src/auto_rows.js
@@ -17,7 +17,6 @@
* Enhance a textarea with auto growing rows to fit the content.
*
* @module core/auto_rows
- * @class auto_rows
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.2
diff --git a/lib/amd/src/autoscroll.js b/lib/amd/src/autoscroll.js
index a1c887860ff..4d5f084179d 100644
--- a/lib/amd/src/autoscroll.js
+++ b/lib/amd/src/autoscroll.js
@@ -22,7 +22,6 @@
* drag one thing at a time, this is not a problem in practice.
*
* @module core/autoscroll
- * @class autoscroll
* @copyright 2016 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.6
diff --git a/lib/amd/src/backoff_timer.js b/lib/amd/src/backoff_timer.js
index 07e822cc481..887ebf1106a 100644
--- a/lib/amd/src/backoff_timer.js
+++ b/lib/amd/src/backoff_timer.js
@@ -18,7 +18,6 @@
* doing polling on the server without overwhelming it with requests.
*
* @module core/backoff_timer
- * @class backoff_timer
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -27,6 +26,7 @@ define(function() {
/**
* Constructor for the back off timer.
*
+ * @class
* @param {function} callback The function to execute after each tick
* @param {function} backoffFunction The function to determine what the next timeout value should be
*/
@@ -62,7 +62,6 @@ define(function() {
* The back off function is called to calculate the next value.
* It is given the current value and an array of all previous values.
*
- * @method generateNextTime
* @return {int} The new timeout value (in milliseconds)
*/
BackoffTimer.prototype.generateNextTime = function() {
@@ -75,7 +74,6 @@ define(function() {
/**
* Stop the current timer and clear the previous time values
*
- * @method reset
* @return {object} this
*/
BackoffTimer.prototype.reset = function() {
@@ -88,7 +86,6 @@ define(function() {
/**
* Clear the current timeout, if one is set.
*
- * @method stop
* @return {object} this
*/
BackoffTimer.prototype.stop = function() {
@@ -109,7 +106,6 @@ define(function() {
*
* The callback function is called after each tick.
*
- * @method start
* @return {object} this
*/
BackoffTimer.prototype.start = function() {
@@ -132,7 +128,6 @@ define(function() {
* Reset the timer and start it again from the initial timeout
* values
*
- * @method restart
* @return {object} this
*/
BackoffTimer.prototype.restart = function() {
diff --git a/lib/amd/src/chart_axis.js b/lib/amd/src/chart_axis.js
index 53a5057241a..09dd497d52c 100644
--- a/lib/amd/src/chart_axis.js
+++ b/lib/amd/src/chart_axis.js
@@ -16,9 +16,9 @@
/**
* Chart axis.
*
+ * @module core/chart_axis
* @copyright 2016 Frédéric Massart - FMCorz.net
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- * @module core/chart_axis
*/
define([], function() {
@@ -27,8 +27,7 @@ define([], function() {
*
* This is used to represent an axis, whether X or Y.
*
- * @alias module:core/chart_axis
- * @class
+ * @class core/chart_axis
*/
function Axis() {
// Please eslint no-empty-function.
diff --git a/lib/amd/src/chart_bar.js b/lib/amd/src/chart_bar.js
index ac3d8de0551..fc11a9a3f02 100644
--- a/lib/amd/src/chart_bar.js
+++ b/lib/amd/src/chart_bar.js
@@ -25,7 +25,6 @@ define(['core/chart_base'], function(Base) {
/**
* Bar chart.
*
- * @alias module:core/chart_bar
* @extends {module:core/chart_base}
* @class
*/
diff --git a/lib/amd/src/chart_base.js b/lib/amd/src/chart_base.js
index b33486e2827..fa4000797b2 100644
--- a/lib/amd/src/chart_base.js
+++ b/lib/amd/src/chart_base.js
@@ -29,7 +29,6 @@ define(['core/chart_series', 'core/chart_axis'], function(Series, Axis) {
*
* {@link module:core/chart_base#_setDefault} to set the defaults on instantiation.
*
- * @alias module:core/chart_base
* @class
*/
function Base() {
diff --git a/lib/amd/src/chart_line.js b/lib/amd/src/chart_line.js
index 185b0c33eca..6967dabc6f6 100644
--- a/lib/amd/src/chart_line.js
+++ b/lib/amd/src/chart_line.js
@@ -25,7 +25,6 @@ define(['core/chart_base'], function(Base) {
/**
* Line chart.
*
- * @alias module:core/chart_line
* @extends {module:core/chart_base}
* @class
*/
diff --git a/lib/amd/src/chart_output_base.js b/lib/amd/src/chart_output_base.js
index 25a809caff6..bebebfe7d0c 100644
--- a/lib/amd/src/chart_output_base.js
+++ b/lib/amd/src/chart_output_base.js
@@ -37,7 +37,6 @@ define(['jquery'], function($) {
* two simultaneous output modules.
*
* @class
- * @alias module:core/chart_output_base
* @param {Node} node The node to output with/in.
* @param {Chart} chart A chart object.
*/
diff --git a/lib/amd/src/chart_output_chartjs.js b/lib/amd/src/chart_output_chartjs.js
index 84f44cc938f..64ad2112f4c 100644
--- a/lib/amd/src/chart_output_chartjs.js
+++ b/lib/amd/src/chart_output_chartjs.js
@@ -46,7 +46,6 @@ define([
* Chart output for Chart.js.
*
* @class
- * @alias module:core/chart_output_chartjs
* @extends {module:core/chart_output_base}
*/
function Output() {
diff --git a/lib/amd/src/chart_output_htmltable.js b/lib/amd/src/chart_output_htmltable.js
index ca6c2b0f619..eb082e4252a 100644
--- a/lib/amd/src/chart_output_htmltable.js
+++ b/lib/amd/src/chart_output_htmltable.js
@@ -30,7 +30,6 @@ define([
*
* @class
* @extends {module:core/chart_output_base}
- * @alias module:core/chart_output_htmltable
*/
function Output() {
Base.prototype.constructor.apply(this, arguments);
diff --git a/lib/amd/src/chart_pie.js b/lib/amd/src/chart_pie.js
index d5df4f3c741..dd687565564 100644
--- a/lib/amd/src/chart_pie.js
+++ b/lib/amd/src/chart_pie.js
@@ -26,7 +26,6 @@ define(['core/chart_base'], function(Base) {
* Pie chart.
*
* @class
- * @alias module:core/chart_pie
* @extends {module:core/chart_base}
*/
function Pie() {
diff --git a/lib/amd/src/chart_series.js b/lib/amd/src/chart_series.js
index 0444d3a414f..a048855c0c3 100644
--- a/lib/amd/src/chart_series.js
+++ b/lib/amd/src/chart_series.js
@@ -26,7 +26,6 @@ define([], function() {
* Chart data series.
*
* @class
- * @alias module:core/chart_series
* @param {String} label The series label.
* @param {Number[]} values The values.
*/
diff --git a/lib/amd/src/config.js b/lib/amd/src/config.js
index 046cc350017..82084bfcab0 100644
--- a/lib/amd/src/config.js
+++ b/lib/amd/src/config.js
@@ -17,13 +17,11 @@
* Expose the M.cfg global variable.
*
* @module core/config
- * @class config
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 2.9
*/
define(function() {
-
// This module exposes only the raw data from M.cfg;
- return /** @alias module:core/config */ M.cfg;
+ return M.cfg;
});
diff --git a/lib/amd/src/custom_interaction_events.js b/lib/amd/src/custom_interaction_events.js
index 4288de96d35..c5ae065f29a 100644
--- a/lib/amd/src/custom_interaction_events.js
+++ b/lib/amd/src/custom_interaction_events.js
@@ -18,7 +18,6 @@
* user interaction we use in Moodle.
*
* @module core/custom_interaction_events
- * @class custom_interaction_events
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.2
@@ -573,7 +572,7 @@ define(['jquery', 'core/key_codes'], function($, keyCodes) {
});
};
- return /** @module core/custom_interaction_events */ {
+ return {
define: define,
events: events,
};
diff --git a/lib/amd/src/dragdrop.js b/lib/amd/src/dragdrop.js
index cf5531514a8..6e050ebd53a 100644
--- a/lib/amd/src/dragdrop.js
+++ b/lib/amd/src/dragdrop.js
@@ -21,15 +21,11 @@
* can only drag one thing at a time, this is not a problem in practice.
*
* @module core/dragdrop
- * @class dragdrop
* @copyright 2016 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.6
*/
define(['jquery', 'core/autoscroll'], function($, autoScroll) {
- /**
- * @alias module:core/dragdrop
- */
var dragdrop = {
/**
* A boolean or options argument depending on whether browser supports passive events.
diff --git a/lib/amd/src/emoji/auto_complete.js b/lib/amd/src/emoji/auto_complete.js
index 5b4c003577d..4fb407f1ced 100644
--- a/lib/amd/src/emoji/auto_complete.js
+++ b/lib/amd/src/emoji/auto_complete.js
@@ -16,6 +16,7 @@
/**
* Emoji auto complete.
*
+ * @module core/emoji/auto_complete
* @copyright 2019 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -89,7 +90,7 @@ const getEmojiTextFromShortName = (shortName) => {
* @param {Element} root The root container for the emoji auto complete
* @param {Array} shortNames The list of short names for emoji suggestions to show
*/
-const render = async (root, shortNames) => {
+const render = async(root, shortNames) => {
const renderContext = {
emojis: shortNames.map((shortName, index) => {
return {
@@ -233,6 +234,7 @@ const selectEmojiElement = (element, selectCallback) => {
/**
* Initialise the emoji auto complete.
*
+ * @method
* @param {Element} root The root container element for the auto complete
* @param {Element} textArea The text area element to monitor for auto complete
* @param {Function} hasSuggestionCallback Callback for when there are auto-complete suggestions
@@ -323,4 +325,4 @@ export default (root, textArea, hasSuggestionCallback, selectCallback) => {
selectEmojiElement(target, selectCallback);
}
});
-};
\ No newline at end of file
+};
diff --git a/lib/amd/src/emoji/data.js b/lib/amd/src/emoji/data.js
index 5cb1bbe90e0..aad55b3b84c 100644
--- a/lib/amd/src/emoji/data.js
+++ b/lib/amd/src/emoji/data.js
@@ -16,6 +16,7 @@
/**
* Emoji data based on the data available from https://github.com/iamcal/emoji-data.
*
+ * @module core/emoji/data
* @copyright 2019 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
diff --git a/lib/amd/src/emoji/picker.js b/lib/amd/src/emoji/picker.js
index e9dc85c057d..2b489a136a5 100644
--- a/lib/amd/src/emoji/picker.js
+++ b/lib/amd/src/emoji/picker.js
@@ -16,13 +16,14 @@
/**
* Emoji picker.
*
+ * @module core/emoji/picker
* @copyright 2019 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import LocalStorage from 'core/localstorage';
import * as EmojiData from 'core/emoji/data';
import {throttle, debounce} from 'core/utils';
-import {get_string} from 'core/str';
+import {get_string as getString} from 'core/str';
import {render as renderTemplate} from 'core/templates';
const VISIBLE_ROW_COUNT = 10;
@@ -48,6 +49,7 @@ const SELECTORS = {
/**
* Create the row data for a category.
*
+ * @method
* @param {String} categoryName The category name
* @param {String} categoryDisplayName The category display name
* @param {Array} emojis The emoji data
@@ -80,6 +82,7 @@ const createRowDataForCategory = (categoryName, categoryDisplayName, emojis, tot
/**
* Add each row's index to it's value in the row data.
*
+ * @method
* @param {Array} rowData List of emoji row data
* @return {Array}
*/
@@ -93,6 +96,7 @@ const addIndexesToRowData = (rowData) => {
* Calculate the scroll position for the beginning of each category from
* the row data.
*
+ * @method
* @param {Array} rowData List of emoji row data
* @return {Object}
*/
@@ -108,11 +112,12 @@ const getCategoryScrollPositionsFromRowData = (rowData) => {
/**
* Create a header row element for the category name.
*
+ * @method
* @param {Number} rowIndex Index of the row in the row data
* @param {String} name The category display name
* @return {Element}
*/
-const createHeaderRow = async (rowIndex, name) => {
+const createHeaderRow = async(rowIndex, name) => {
const context = {
index: rowIndex,
text: name
@@ -126,11 +131,12 @@ const createHeaderRow = async (rowIndex, name) => {
/**
* Create an emoji row element.
*
+ * @method
* @param {Number} rowIndex Index of the row in the row data
* @param {Array} emojis The list of emoji data for the row
* @return {Element}
*/
-const createEmojiRow = async (rowIndex, emojis) => {
+const createEmojiRow = async(rowIndex, emojis) => {
const context = {
index: rowIndex,
emojis: emojis.map(emojiData => {
@@ -154,6 +160,7 @@ const createEmojiRow = async (rowIndex, emojis) => {
/**
* Check if the element is an emoji element.
*
+ * @method
* @param {Element} element Element to check
* @return {Bool}
*/
@@ -163,6 +170,7 @@ const isEmojiElement = element => element.getAttribute('data-short-names') !== n
* Search from an element and up through it's ancestors to fine the category
* selector element and return it.
*
+ * @method
* @param {Element} element Element to begin searching from
* @return {Element|null}
*/
@@ -185,6 +193,7 @@ const getCategorySelectorByCategoryName = (root, name) => {
/**
* Sets the given category selector element as active.
*
+ * @method
* @param {Element} root The root picker element
* @param {Element} element The category selector element to make active
*/
@@ -203,6 +212,7 @@ const setCategorySelectorActive = (root, element) => {
* Get the category selector element and the scroll positions for the previous and
* next categories for the given scroll position.
*
+ * @method
* @param {Element} root The picker root element
* @param {Number} position The position to get the category for
* @param {Object} categoryScrollPositions Set of scroll positions for all categories
@@ -262,6 +272,7 @@ const getCategoryByScrollPosition = (root, position, categoryScrollPositions) =>
/**
* Get the list of recent emojis data from local storage.
*
+ * @method
* @return {Array}
*/
const getRecentEmojis = () => {
@@ -272,6 +283,7 @@ const getRecentEmojis = () => {
/**
* Save the list of recent emojis in local storage.
*
+ * @method
* @param {Array} recentEmojis List of emoji data to save
*/
const saveRecentEmoji = (recentEmojis) => {
@@ -286,6 +298,7 @@ const saveRecentEmoji = (recentEmojis) => {
* The new set of recent emojis are saved in local storage and the full set of updated
* row data and new emoji row count are returned.
*
+ * @method
* @param {Array} rowData The emoji rows data
* @param {Number} recentEmojiRowCount Count of the recent emoji rows
* @param {Object} newEmoji The emoji data for the emoji to add to the recent emoji list
@@ -317,6 +330,7 @@ const addRecentEmoji = (rowData, recentEmojiRowCount, newEmoji) => {
* buffer to amount to either side of the total number of requested rows so that
* scrolling the emoji rows container is smooth.
*
+ * @method
* @param {Number} scrollPosition Scroll position within the emoji container
* @param {Number} visibleRowCount How many rows should be visible
* @param {Array} rowData The emoji rows data
@@ -333,10 +347,11 @@ const getRowsToRender = (scrollPosition, visibleRowCount, rowData) => {
/**
* Create a row element from the row data.
*
+ * @method
* @param {Object} rowData The emoji row data
* @return {Element}
*/
-const createRowElement = async (rowData) => {
+const createRowElement = async(rowData) => {
let row = null;
if (rowData.type === ROW_TYPE.HEADER) {
row = await createHeaderRow(rowData.index, rowData.data.displayName);
@@ -355,6 +370,7 @@ const createRowElement = async (rowData) => {
/**
* Check if the given rows match.
*
+ * @method
* @param {Object} a The first row
* @param {Object} b The second row
* @return {Bool}
@@ -394,11 +410,12 @@ const doRowsMatch = (a, b) => {
* be visible and creates the newly visible row elements. Any rows that haven't
* changed visibility will be left untouched.
*
+ * @method
* @param {Element} rowContainer The container element for the emoji rows
* @param {Array} currentRows List of row data that matches the currently visible rows
* @param {Array} nextRows List of row data containing the new list of rows to be made visible
*/
-const renderRows = async (rowContainer, currentRows, nextRows) => {
+const renderRows = async(rowContainer, currentRows, nextRows) => {
// We need to add any rows that are in nextRows but not in currentRows.
const toAdd = nextRows.filter(nextRow => !currentRows.some(currentRow => doRowsMatch(currentRow, nextRow)));
// Remember which rows will still be visible so that we can insert our element in the correct place in the DOM.
@@ -448,6 +465,7 @@ const renderRows = async (rowContainer, currentRows, nextRows) => {
* Build a function to render the visible emoji rows for a given scroll
* position.
*
+ * @method
* @param {Element} rowContainer The container element for the emoji rows
* @return {Function}
*/
@@ -456,7 +474,7 @@ const generateRenderRowsAtPositionFunction = (rowContainer) => {
let nextRows = [];
let rowCount = 0;
let isRendering = false;
- const renderNextRows = async () => {
+ const renderNextRows = async() => {
if (!nextRows.length) {
return;
}
@@ -491,6 +509,7 @@ const generateRenderRowsAtPositionFunction = (rowContainer) => {
/**
* Show the search results container and hide the emoji container.
*
+ * @method
* @param {Element} emojiContainer The emojis container
* @param {Element} searchResultsContainer The search results container
*/
@@ -502,6 +521,7 @@ const showSearchResults = (emojiContainer, searchResultsContainer) => {
/**
* Hide the search result container and show the emojis container.
*
+ * @method
* @param {Element} emojiContainer The emojis container
* @param {Element} searchResultsContainer The search results container
* @param {Element} searchInput The search input
@@ -515,6 +535,7 @@ const clearSearch = (emojiContainer, searchResultsContainer, searchInput) => {
/**
* Build function to handle mouse hovering an emoji. Shows the preview.
*
+ * @method
* @param {Element} emojiPreview The emoji preview element
* @param {Element} emojiShortName The emoji short name element
* @return {Function}
@@ -532,6 +553,7 @@ const getHandleMouseEnter = (emojiPreview, emojiShortName) => {
/**
* Build function to handle mouse leaving an emoji. Removes the preview.
*
+ * @method
* @param {Element} emojiPreview The emoji preview element
* @param {Element} emojiShortName The emoji short name element
* @return {Function}
@@ -552,6 +574,7 @@ const getHandleMouseLeave = (emojiPreview, emojiShortName) => {
* The function currently handles clicking on the category selector or selecting
* a specific emoji.
*
+ * @method
* @param {Number} recentEmojiRowCount Number of rows of recent emojis
* @param {Element} emojiContainer Container element for the visible of emojis
* @param {Element} searchResultsContainer Contaienr element for the search results
@@ -624,6 +647,7 @@ const getHandleClick = (
* can avoid adding tends of thousands of elements to the DOM unnecessarily which
* would bog down performance.
*
+ * @method
* @param {Element} root The picker root element
* @param {Number} currentVisibleRowScrollPosition The current scroll position of the container
* @param {Element} emojiContainer The emojis container element
@@ -686,6 +710,7 @@ const getHandleScroll = (
/**
* Build the function that handles search input from the user.
*
+ * @method
* @param {Element} searchInput The search input element
* @param {Element} searchResultsContainer Container element to display the search results
* @param {Element} emojiContainer Container element for the emoji rows
@@ -697,7 +722,7 @@ const getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) =>
const renderSearchResultsAtPosition = generateRenderRowsAtPositionFunction(rowContainer);
searchResultsContainer.appendChild(rowContainer);
- return async () => {
+ return async() => {
const searchTerm = searchInput.value.toLowerCase();
if (searchTerm) {
@@ -715,7 +740,7 @@ const getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) =>
return carry;
}, []);
- const searchResultsString = await get_string('searchresults', 'core');
+ const searchResultsString = await getString('searchresults', 'core');
const rowData = createRowDataForCategory(searchResultsString, searchResultsString, matchingEmojis, 0);
// Show the emoji rows for the search results.
renderSearchResultsAtPosition(0, rowData, rowData.length);
@@ -729,6 +754,7 @@ const getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) =>
/**
* Register the emoji picker event listeners.
*
+ * @method
* @param {Element} root The picker root element
* @param {Element} emojiContainer Root element containing the list of visible emojis
* @param {Function} renderAtPosition Function to render the visible emojis at a given scroll position
@@ -792,6 +818,7 @@ const registerEventListeners = (
/**
* Initialise the emoji picker.
*
+ * @method
* @param {Element} root The root element for the picker
* @param {Function} selectCallback Callback for when the user selects an emoji
*/
@@ -862,4 +889,4 @@ export default (root, selectCallback) => {
rowData,
recentEmojiRowCount
);
-};
\ No newline at end of file
+};
diff --git a/lib/amd/src/event_dispatcher.js b/lib/amd/src/event_dispatcher.js
index 9da69e72465..92667d3e9fd 100644
--- a/lib/amd/src/event_dispatcher.js
+++ b/lib/amd/src/event_dispatcher.js
@@ -13,7 +13,7 @@
// along with Moodle. If not, see .
/**
- * Event dispatcher used to dispatch Native JS CustomEvent objects.
+ * An Event dispatcher used to dispatch Native JS CustomEvent objects with custom default properties.
*
* @module core/event_dispatcher
* @copyright 2021 Andrew Nicols
@@ -25,21 +25,7 @@
* Dispatch an event as a CustomEvent on the specified container.
* By default events are bubbled, and cancelable.
*
- * The eventName should typically by sourced using a constant, for example:
- *
- * // mod/example/amd/src/events.js
- *
- * import {dispatchEvent} from 'core/event_dispatcher';
- *
- * export const eventTypes = {
- * exampleDataDisplayed: 'mod_example/exampleDataDisplayed',
- * };
- *
- * export const notifyExampleDisplayed = someArgument => dispatchEvent(eventTypes.exampleDataDisplayed, {
- * someArgument,
- * }, document, {
- * cancelable: false,
- * });
+ * The eventName should typically by sourced using a constant. See the supplied examples.
*
* Note: This function uses native events. Any additional details are passed to the function in event.detail.
*
@@ -54,6 +40,21 @@
* @param {Boolean} options.cancelable Whether preventDefault() can be called
* @param {Boolean} options.composed Whether the event can bubble across the ShadowDOM bounadry
* @returns {CustomEvent}
+ *
+ * @example Using a native CustomEvent to indicate that some example data was displayed.
+ * // mod/example/amd/src/events.js
+ *
+ * import {dispatchEvent} from 'core/event_dispatcher';
+ *
+ * export const eventTypes = {
+ * exampleDataDisplayed: 'mod_example/exampleDataDisplayed',
+ * };
+ *
+ * export const notifyExampleDisplayed = someArgument => dispatchEvent(eventTypes.exampleDataDisplayed, {
+ * someArgument,
+ * }, document, {
+ * cancelable: false,
+ * });
*/
export const dispatchEvent = (
eventName,
diff --git a/lib/amd/src/form-autocomplete.js b/lib/amd/src/form-autocomplete.js
index a198ef7c5e0..f234ffff29a 100644
--- a/lib/amd/src/form-autocomplete.js
+++ b/lib/amd/src/form-autocomplete.js
@@ -17,12 +17,10 @@
* Autocomplete wrapper for select2 library.
*
* @module core/form-autocomplete
- * @class autocomplete
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.0
*/
-/* globals require: false */
define(
['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon', 'core/aria'],
function($, log, str, templates, notification, LoadingIcon, Aria) {
@@ -187,6 +185,7 @@ function($, log, str, templates, notification, LoadingIcon, Aria) {
*
* @param {Object} state
* @param {Array} items
+ * @returns {Boolean}
*/
var hasItemListChanged = function(state, items) {
if (state.items.length !== items.length) {
@@ -1033,7 +1032,7 @@ function($, log, str, templates, notification, LoadingIcon, Aria) {
return pendingPromise;
};
- return /** @alias module:core/form-autocomplete */ {
+ return {
// Public variables and functions.
/**
* Turn a boring select box into an auto-complete beast.
diff --git a/lib/amd/src/form-cohort-selector.js b/lib/amd/src/form-cohort-selector.js
index d61c70d321c..23d98068be8 100644
--- a/lib/amd/src/form-cohort-selector.js
+++ b/lib/amd/src/form-cohort-selector.js
@@ -17,14 +17,13 @@
* Course selector adaptor for auto-complete form element.
*
* @module core/form-cohort-selector
- * @class form-cohort-selector
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.1
*/
define(['core/ajax', 'jquery'], function(ajax, $) {
- return /** @alias module:core/form-cohort-selector */ {
+ return {
// Public variables and functions.
processResults: function(selector, data) {
// Mangle the results into an array of objects.
diff --git a/lib/amd/src/form-course-selector.js b/lib/amd/src/form-course-selector.js
index 2e9323b10a7..1ea5f4f9368 100644
--- a/lib/amd/src/form-course-selector.js
+++ b/lib/amd/src/form-course-selector.js
@@ -17,14 +17,13 @@
* Course selector adaptor for auto-complete form element.
*
* @module core/form-course-selector
- * @class form-course-selector
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.1
*/
define(['core/ajax', 'jquery'], function(ajax, $) {
- return /** @alias module:core/form-course-selector */ {
+ return {
// Public variables and functions.
processResults: function(selector, data) {
// Mangle the results into an array of objects.
diff --git a/lib/amd/src/fragment.js b/lib/amd/src/fragment.js
index aa223adab43..837bdc2c640 100644
--- a/lib/amd/src/fragment.js
+++ b/lib/amd/src/fragment.js
@@ -17,7 +17,6 @@
* A way to call HTML fragments to be inserted as required via JavaScript.
*
* @module core/fragment
- * @class fragment
* @copyright 2016 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.1
@@ -93,7 +92,7 @@ define(['jquery', 'core/ajax'], function($, ajax) {
return allScript;
};
- return /** @alias module:core/fragment */{
+ return {
/**
* Appends HTML and JavaScript fragments to specified nodes.
* Callbacks called by this AMD module are responsible for doing the appropriate security checks
diff --git a/lib/amd/src/fullscreen.js b/lib/amd/src/fullscreen.js
index d37a860c20c..2fcfef09591 100644
--- a/lib/amd/src/fullscreen.js
+++ b/lib/amd/src/fullscreen.js
@@ -17,7 +17,6 @@
* Detects if an element is fullscreen.
*
* @module core/fullscreen
- * @class fullscreen
* @copyright 2020 University of Nottingham
* @author Neill Magill
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@@ -26,6 +25,7 @@
/**
* Gets the element that is fullscreen or null if no element is fullscreen.
*
+ * @method
* @returns {HTMLElement}
*/
export const getElement = () => {
diff --git a/lib/amd/src/icon_system.js b/lib/amd/src/icon_system.js
index 99738104657..902f9cccf9f 100644
--- a/lib/amd/src/icon_system.js
+++ b/lib/amd/src/icon_system.js
@@ -16,6 +16,7 @@
/**
* Icon System base module.
*
+ * @module core/icon_system
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -26,6 +27,8 @@ define(['jquery'], function($) {
* Icon System abstract class.
*
* Any icon system needs to define a module extending this one and return this module name from the php icon_system class.
+ *
+ * @class core/icon_system
*/
var IconSystem = function() {
};
diff --git a/lib/amd/src/icon_system_fontawesome.js b/lib/amd/src/icon_system_fontawesome.js
index a374741feec..f148572c522 100644
--- a/lib/amd/src/icon_system_fontawesome.js
+++ b/lib/amd/src/icon_system_fontawesome.js
@@ -16,6 +16,7 @@
/**
* Competency rule points module.
*
+ * @module core/icon_system_fontawesome
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -28,6 +29,7 @@ define(['core/icon_system', 'jquery', 'core/ajax', 'core/mustache', 'core/locals
/**
* IconSystemFontawesome
+ * @class core/icon_system_fontawesome
*/
var IconSystemFontawesome = function() {
IconSystem.apply(this, arguments);
diff --git a/lib/amd/src/icon_system_standard.js b/lib/amd/src/icon_system_standard.js
index 4163ac384c2..be2c7cf32f5 100644
--- a/lib/amd/src/icon_system_standard.js
+++ b/lib/amd/src/icon_system_standard.js
@@ -16,6 +16,7 @@
/**
* Competency rule points module.
*
+ * @module core/icon_system_standard
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -25,6 +26,8 @@ define(['core/icon_system', 'core/url', 'core/mustache'],
/**
* IconSystemStandard
+ *
+ * @class core/icon_system_standard
*/
var IconSystemStandard = function() {
IconSystem.apply(this, arguments);
@@ -34,12 +37,12 @@ define(['core/icon_system', 'core/url', 'core/mustache'],
/**
* Render an icon.
*
+ * @method renderIcon
* @param {String} key
* @param {String} component
* @param {String} title
* @param {String} template
* @return {String}
- * @method renderIcon
*/
IconSystemStandard.prototype.renderIcon = function(key, component, title, template) {
var url = CoreUrl.imageUrl(key, component);
@@ -69,6 +72,5 @@ define(['core/icon_system', 'core/url', 'core/mustache'],
return 'core/pix_icon';
};
- return /** @alias module:core/icon_system_standard */ IconSystemStandard;
-
+ return IconSystemStandard;
});
diff --git a/lib/amd/src/key_codes.js b/lib/amd/src/key_codes.js
index 86afb261dcc..01bf6c3497a 100644
--- a/lib/amd/src/key_codes.js
+++ b/lib/amd/src/key_codes.js
@@ -17,14 +17,16 @@
* A list of human readable names for the keycodes.
*
* @module core/key_codes
- * @class key_codes
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.2
*/
-define(function() {
- return /** @alias module:core/key_codes */ {
+define(function() {
+ /**
+ * @type {object}
+ */
+ return {
'tab': 9,
'enter': 13,
'shift': 16,
diff --git a/lib/amd/src/local/aria/aria-hidden.js b/lib/amd/src/local/aria/aria-hidden.js
index 2a5aa79262a..6dbc9d8ef8c 100644
--- a/lib/amd/src/local/aria/aria-hidden.js
+++ b/lib/amd/src/local/aria/aria-hidden.js
@@ -17,7 +17,6 @@
* ARIA helpers related to the aria-hidden attribute.
*
* @module core/local/aria/aria-hidden.
- * @class aria
* @copyright 2020 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -31,6 +30,7 @@ const siblingObserverMap = new Map();
/**
* Determine whether the browser supports the MutationObserver system.
*
+ * @method
* @returns {Bool}
*/
const supportsMutationObservers = () => (MutationObserver && typeof MutationObserver === 'function');
@@ -38,6 +38,7 @@ const supportsMutationObservers = () => (MutationObserver && typeof MutationObse
/**
* Disable element focusability, disabling the tabindex for child elements which are normally focusable.
*
+ * @method
* @param {HTMLElement} target
*/
const disableElementFocusability = target => {
@@ -57,6 +58,7 @@ const disableElementFocusability = target => {
/**
* Remove the current tab-index and store it for later restoration.
*
+ * @method
* @param {HTMLElement} element
*/
const disableAndStoreTabIndex = element => {
@@ -78,6 +80,7 @@ const disableAndStoreTabIndex = element => {
/**
* Re-enable element focusability, restoring any tabindex.
*
+ * @method
* @param {HTMLElement} target
*/
const enableElementFocusability = target => {
@@ -100,6 +103,7 @@ const enableElementFocusability = target => {
* When disabling focusability the current tab-index is stored in the ariaHiddenTabIndex data attribute.
* This is used to restore the tab-index, but only whilst the parent nodes remain unhidden.
*
+ * @method
* @param {HTMLElement} element
*/
const restoreTabIndex = element => {
@@ -121,6 +125,7 @@ const restoreTabIndex = element => {
/**
* Update the supplied DOM Module to be hidden.
*
+ * @method
* @param {HTMLElement} target
* @returns {Array}
*/
@@ -162,6 +167,7 @@ const _hide = target => {
/**
* Reverse the effect of the hide action.
*
+ * @method
* @param {HTMLElement} target
* @returns {Array}
*/
@@ -189,6 +195,7 @@ const _unhide = target => {
/**
* Correctly mark all siblings of the supplied target Element as hidden.
*
+ * @method
* @param {HTMLElement} target
* @returns {Array}
*/
@@ -235,6 +242,7 @@ const _hideSiblings = target => {
/**
* Correctly reverse the hide action of all children of the supplied target Element.
*
+ * @method
* @param {HTMLElement} target
* @returns {Array}
*/
diff --git a/lib/amd/src/local/aria/focuslock.js b/lib/amd/src/local/aria/focuslock.js
index 0dbeb8abce8..9b28ae9ccfe 100644
--- a/lib/amd/src/local/aria/focuslock.js
+++ b/lib/amd/src/local/aria/focuslock.js
@@ -20,7 +20,6 @@
* https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html
*
* @module core/tablock
- * @class tablock
* @copyright 2019 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -47,6 +46,7 @@ let isLocked = false;
* This gives us a solution which supports focus locking of any kind, which loops in both directions, and which
* prevents the lock from escaping the modal entirely.
*
+ * @method
* @param {Event} event The event from the focus change
*/
const lockHandler = event => {
@@ -77,6 +77,7 @@ const lockHandler = event => {
/**
* Focus the first descendant of the current lock region.
*
+ * @method
* @returns {Bool} Whether a node was focused
*/
const focusFirstDescendant = () => {
@@ -98,6 +99,7 @@ const focusFirstDescendant = () => {
/**
* Focus the last descendant of the current lock region.
*
+ * @method
* @returns {Bool} Whether a node was focused
*/
const focusLastDescendant = () => {
@@ -122,6 +124,7 @@ const focusLastDescendant = () => {
*
* Note: This example is a wholesale copy of the WCAG example.
*
+ * @method
* @param {HTMLElement} focusTarget
* @returns {Bool}
*/
@@ -153,6 +156,7 @@ const isFocusable = focusTarget => {
*
* Note: This example is a heavily inspired by the WCAG example.
*
+ * @method
* @param {HTMLElement} focusTarget
* @returns {Bool} Whether focus was successful o rnot.
*/
@@ -180,6 +184,7 @@ const attemptFocus = focusTarget => {
/**
* Get the current lock region from the top of the stack.
*
+ * @method
* @returns {HTMLElement}
*/
const getCurrentLockRegion = () => {
@@ -189,6 +194,7 @@ const getCurrentLockRegion = () => {
/**
* Add a new lock region to the stack.
*
+ * @method
* @param {HTMLElement} newLockRegion
*/
const addLockRegionToStack = newLockRegion => {
@@ -220,6 +226,8 @@ const addLockRegionToStack = newLockRegion => {
/**
* Remove the top lock region from the stack.
+ *
+ * @method
*/
const removeLastLockRegionFromStack = () => {
// Take the top element off the stack, and replce the current lockRegion value.
@@ -250,6 +258,7 @@ const hasTrappedRegionsInStack = () => {
/**
* Start trapping the focus and lock it to the specified newLockRegion.
*
+ * @method
* @param {HTMLElement} newLockRegion The container to lock focus to
*/
export const trapFocus = newLockRegion => {
@@ -283,6 +292,8 @@ export const trapFocus = newLockRegion => {
/**
* Stop trapping the focus.
+ *
+ * @method
*/
export const untrapFocus = () => {
// Remove the top region from the stack.
diff --git a/lib/amd/src/local/aria/selectors.js b/lib/amd/src/local/aria/selectors.js
index af952f3ef64..d7d31b34ad1 100644
--- a/lib/amd/src/local/aria/selectors.js
+++ b/lib/amd/src/local/aria/selectors.js
@@ -17,7 +17,6 @@
* Selectors used for ARIA.
*
* @module core/local/aria/selectors
- * @class selectors
* @copyright 2020 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
diff --git a/lib/amd/src/local/modal/alert.js b/lib/amd/src/local/modal/alert.js
index fecba1447f4..22d73fca051 100644
--- a/lib/amd/src/local/modal/alert.js
+++ b/lib/amd/src/local/modal/alert.js
@@ -17,13 +17,18 @@
* Alert modal.
*
* @module core/modal_alert
- * @class modal_alert
* @copyright 2020 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import Modal from 'core/modal';
+/**
+ * The Alert Modal
+ *
+ * @class
+ * @extends Modal
+ */
export default class extends Modal {
/**
* Register all event listeners.
diff --git a/lib/amd/src/modal.js b/lib/amd/src/modal.js
index d9006de24d0..f106e81a672 100644
--- a/lib/amd/src/modal.js
+++ b/lib/amd/src/modal.js
@@ -16,7 +16,8 @@
/**
* Contain the logic for modals.
*
- * @module core/modal
+ * @module core/modal
+ * @class core/modal
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
diff --git a/lib/amd/src/modal_backdrop.js b/lib/amd/src/modal_backdrop.js
index 688583c0ab5..6da66ca5615 100644
--- a/lib/amd/src/modal_backdrop.js
+++ b/lib/amd/src/modal_backdrop.js
@@ -17,7 +17,6 @@
* Contain the logic for modal backdrops.
*
* @module core/modal_backdrop
- * @class modal_backdrop
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -31,6 +30,7 @@ define(['jquery', 'core/templates', 'core/notification', 'core/fullscreen'],
/**
* Constructor for ModalBackdrop.
*
+ * @class core/modal_backdrop
* @param {object} root The root element for the modal backdrop
*/
var ModalBackdrop = function(root) {
diff --git a/lib/amd/src/modal_cancel.js b/lib/amd/src/modal_cancel.js
index ce23600d30b..9874aaa5533 100644
--- a/lib/amd/src/modal_cancel.js
+++ b/lib/amd/src/modal_cancel.js
@@ -17,12 +17,15 @@
* Contain the logic for the cancel modal.
*
* @module core/modal_cancel
- * @class modal_cancel
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import Modal from 'core/modal';
+/**
+ * @class
+ * @extends module:core/modal
+ */
export default class extends Modal {
constructor(root) {
super(root);
diff --git a/lib/amd/src/modal_save_cancel.js b/lib/amd/src/modal_save_cancel.js
index 71d254d9835..52d70c08658 100644
--- a/lib/amd/src/modal_save_cancel.js
+++ b/lib/amd/src/modal_save_cancel.js
@@ -17,12 +17,17 @@
* Contain the logic for the save/cancel modal.
*
* @module core/modal_save_cancel
- * @class modal_save_cancel
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import Modal from 'core/modal';
+/**
+ * The Save/Cancel Modal.
+ *
+ * @class
+ * @extends module:core/modal
+ */
export default class extends Modal {
constructor(root) {
super(root);
diff --git a/lib/amd/src/normalise.js b/lib/amd/src/normalise.js
index 1016080f938..c55d82f47ef 100644
--- a/lib/amd/src/normalise.js
+++ b/lib/amd/src/normalise.js
@@ -17,13 +17,19 @@
* Normalisation helpers.
*
* @module core/normalise
- * @class normalise
* @copyright 2020 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import jQuery from 'jquery';
+/**
+ * Normalise a list of Nodes into an Array of Nodes.
+ *
+ * @method getList
+ * @param {(Array|jQuery|NodeList|HTMLElement)} nodes
+ * @returns {HTMLElement[]}
+ */
export const getList = nodes => {
if (nodes instanceof HTMLElement) {
// A single record to conver to a NodeList.
diff --git a/lib/amd/src/permissionmanager.js b/lib/amd/src/permissionmanager.js
index 2a57cc64621..35193da01cf 100644
--- a/lib/amd/src/permissionmanager.js
+++ b/lib/amd/src/permissionmanager.js
@@ -12,15 +12,15 @@
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-/*
- * @class permissionmanager
+
+/**
* @copyright 2015 Martin Mastny
* @since 3.0
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
- * @module admin/permissionmanager
+ * @module core/permissionmanager
*/
define(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yui'],
function($, config, notification, templates, Y) {
diff --git a/lib/amd/src/popover_region_controller.js b/lib/amd/src/popover_region_controller.js
index d9b790f0b3f..b758f97ed8c 100644
--- a/lib/amd/src/popover_region_controller.js
+++ b/lib/amd/src/popover_region_controller.js
@@ -19,7 +19,6 @@
* See template: core/popover_region
*
* @module core/popover_region_controller
- * @class popover_region_controller
* @copyright 2015 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.2
diff --git a/lib/amd/src/prefetch.js b/lib/amd/src/prefetch.js
index 4e79b1b6396..84b5050b75a 100644
--- a/lib/amd/src/prefetch.js
+++ b/lib/amd/src/prefetch.js
@@ -17,9 +17,49 @@
* Prefetch module to help lazily load content for use on the current page.
*
* @module core/prefetch
- * @class prefetch
* @copyright 2020 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ *
+ * @example Pre-fetching a set of strings to use later
+ *
+ * import prefetch from 'core/prefetch';
+ *
+ * // A single string prefetch.
+ * prefetch.prefetchString('error', 'cannotfindteacher');
+ *
+ * // Prefetch multiple strings in the same component.
+ * prefetch.prefetchStrings('core', [
+ * 'yes',
+ * 'no',
+ * ]);
+ *
+ * // Use the strings.
+ * import {get_string as getString, get_strings as getStrings} from 'core/str';
+ * getString('cannotfindteacher', 'error')
+ * .then(str => {
+ * window.console.log(str); // Cannot find teacher
+ * })
+ * .catch();
+ * getStrings([
+ * {
+ * key: 'cannotfindteacher',
+ * component: 'error',
+ * },
+ * {
+ * key: 'yes',
+ * component: 'core',
+ * },
+ * {
+ * key: 'no',
+ * component: 'core',
+ * },
+ * ])
+ * .then((cannotFindTeacher, yes, no) => {
+ * window.console.log(cannotFindTeacher); // Cannot find teacher
+ * window.console.log(yes); // Yes
+ * window.console.log(no); // No
+ * })
+ * .catch();
*/
import Config from 'core/config';
@@ -38,6 +78,7 @@ let prefetchTimer;
* Fetch all queued items in the queue.
*
* Should only be called via processQueue.
+ * @private
*/
const fetchQueue = () => {
// Prefetch templates.
@@ -72,6 +113,8 @@ const fetchQueue = () => {
*
* The initial call will queue the first fetch after a delay.
* Subsequent fetches are immediate.
+ *
+ * @private
*/
const processQueue = () => {
if (prefetchTimer) {
@@ -113,7 +156,8 @@ const processQueue = () => {
/**
* Add a set of templates to the prefetch queue.
*
- * @param {Array} templatesNames
+ * @param {Array} templatesNames A list of the template names to fetch
+ * @static
*/
const prefetchTemplates = templatesNames => {
templateList = templateList.concat(templatesNames);
@@ -124,16 +168,19 @@ const prefetchTemplates = templatesNames => {
/**
* Add a single template to the prefetch queue.
*
- * @param {String} templateName
- * @returns {undefined}
+ * @param {String} templateName The template names to fetch
+ * @static
*/
-const prefetchTemplate = templateName => prefetchTemplates([templateName]);
+const prefetchTemplate = templateName => {
+ prefetchTemplates([templateName]);
+};
/**
* Add a set of strings from the same component to the prefetch queue.
*
- * @param {String} component
- * @param {String[]} keys
+ * @param {String} component The component that all of the strings belongs to
+ * @param {String[]} keys An array of string identifiers.
+ * @static
*/
const prefetchStrings = (component, keys) => {
if (!stringList[component]) {
@@ -148,8 +195,9 @@ const prefetchStrings = (component, keys) => {
/**
* Add a single string to the prefetch queue.
*
- * @param {String} component
- * @param {String} key
+ * @param {String} component The component that the string belongs to
+ * @param {String} key The string identifier
+ * @static
*/
const prefetchString = (component, key) => {
if (!stringList[component]) {
diff --git a/lib/amd/src/sortable_list.js b/lib/amd/src/sortable_list.js
index 3f7e46331e1..ba00d60fcb8 100644
--- a/lib/amd/src/sortable_list.js
+++ b/lib/amd/src/sortable_list.js
@@ -18,7 +18,7 @@
*
* Example of usage:
*
- * Create a list (for example or ) where each draggable element has a drag handle.
+ * Create a list (for example `` or ``) where each draggable element has a drag handle.
* The best practice is to use the template core/drag_handle:
* $OUTPUT->render_from_template('core/drag_handle', ['movetitle' => get_string('movecontent', 'moodle', ELEMENTNAME)]);
*
@@ -27,20 +27,6 @@
* Space between define and ( critical in comment but not allowed in code in order to function
* correctly with Moodle's requirejs.php
*
- * define (['jquery', 'core/sortable_list'], function($, SortableList) {
- * var list = new SortableList('ul.my-awesome-list'); // source list (usually or ) - selector or element
- *
- * // Listen to the events when element is dragged.
- * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {
- * console.log(info);
- * });
- *
- * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:
- * list.getElementName = function(element) {
- * return $.Deferred().resolve(element.attr('data-name'));
- * }
- * }
- *
* More details: https://docs.moodle.org/dev/Sortable_list
*
* For the full list of possible parameters see var defaultParameters below.
@@ -52,8 +38,23 @@
* - SortableList.EVENTS.DROPEND : when user finished dragging - either fired right after dropping or
* if "Esc" was pressed during dragging
*
+ * @example
+ * define (['jquery', 'core/sortable_list'], function($, SortableList) {
+ * var list = new SortableList('ul.my-awesome-list'); // source list (usually or ) - selector or element
+ *
+ * // Listen to the events when element is dragged.
+ * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {
+ * console.log(info);
+ * });
+ *
+ * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:
+ * list.getElementName = function(element) {
+ * return $.Deferred().resolve(element.attr('data-name'));
+ * }
+ * });
+ *
* @module core/sortable_list
- * @class sortable_list
+ * @class core/sortable_list
* @copyright 2018 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
diff --git a/lib/amd/src/str.js b/lib/amd/src/str.js
index a9b4c5c1d62..ea75611d899 100644
--- a/lib/amd/src/str.js
+++ b/lib/amd/src/str.js
@@ -14,14 +14,13 @@
// along with Moodle. If not, see .
/**
- * Fetch and render language strings.
- * Hooks into the old M.str global - but can also fetch missing strings on the fly.
+ * Fetch and return language strings.
*
* @module core/str
- * @class str
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 2.9
+ *
*/
import $ from 'jquery';
import Ajax from 'core/ajax';
@@ -31,8 +30,13 @@ import LocalStorage from 'core/localstorage';
// unnecessary requests.
let promiseCache = [];
+/* eslint-disable no-restricted-properties */
+
/**
- * Return a promise object that will be resolved into a string eventually (maybe immediately).
+ * Return a Promise that resolves to a string.
+ *
+ * If the string has previously been cached, then the Promise will be resolved immediately, otherwise it will be fetched
+ * from the server and resolved when available.
*
* @method get_string
* @param {string} key The language string key
@@ -40,20 +44,61 @@ let promiseCache = [];
* @param {string} param The param for variable expansion in the string.
* @param {string} lang The users language - if not passed it is deduced.
* @return {Promise}
+ *
+ * @example Fetching a string
+ *
+ * import {get_string as getString} from 'core/str';
+ * get_string('cannotfindteacher', 'error')
+ * .then(str => {
+ * window.console.log(str); // Cannot find teacher
+ * })
+ * .catch();
*/
+// eslint-disable-next-line camelcase
export const get_string = (key, component, param, lang) => {
return get_strings([{key, component, param, lang}])
.then(results => results[0]);
};
/**
- * Make a batch request to load a set of strings
+ * Make a batch request to load a set of strings.
+ *
+ * Any missing string will be fetched from the server.
+ * The Promise will only be resolved once all strings are available, or an attempt has been made to fetch them.
*
* @method get_strings
- * @param {Object[]} requests Array of { key: key, component: component, param: param, lang: lang };
- * See get_string for more info on these args.
- * @return {Promise}
+ * @param {Object[]} requests List of strings to fetch
+ * @param {string} requests.key The string identifer to fetch
+ * @param {string} [requests.component='core'] The componet to fetch from
+ * @param {string} [requests.lang] The language to fetch a string for. Defaults to current page language.
+ * @param {object|string} [requests.param] The param for variable expansion in the string.
+ * @return {Promise[]}
+ *
+ * @example Fetching a set of strings
+ *
+ * import {get_strings as getStrings} from 'core/str';
+ * get_strings([
+ * {
+ * key: 'cannotfindteacher',
+ * component: 'error',
+ * },
+ * {
+ * key: 'yes',
+ * component: 'core',
+ * },
+ * {
+ * key: 'no',
+ * component: 'core',
+ * },
+ * ])
+ * .then((cannotFindTeacher, yes, no) => {
+ * window.console.log(cannotFindTeacher); // Cannot find teacher
+ * window.console.log(yes); // Yes
+ * window.console.log(no); // No
+ * })
+ * .catch();
*/
+// eslint-disable-next-line camelcase
export const get_strings = (requests) => {
let requestData = [];
const pageLang = $('html').attr('lang').replace(/-/g, '_');
@@ -137,9 +182,17 @@ export const get_strings = (requests) => {
/**
* Add a list of strings to the caches.
*
+ * This function should typically only be called from core APIs to pre-cache values.
+ *
* @method cache_strings
- * @param {Object[]} strings Array of { key: key, component: component, lang: lang, value: value }
+ * @protected
+ * @param {Object[]} strings List of strings to fetch
+ * @param {string} strings.key The string identifer to fetch
+ * @param {string} strings.value The string value
+ * @param {string} [strings.component='core'] The componet to fetch from
+ * @param {string} [strings.lang] The language to fetch a string for. Defaults to current page language.
*/
+// eslint-disable-next-line camelcase
export const cache_strings = (strings) => {
const defaultLang = $('html').attr('lang').replace(/-/g, '_');
@@ -166,3 +219,4 @@ export const cache_strings = (strings) => {
}
});
};
+/* eslint-enable no-restricted-properties */
diff --git a/lib/amd/src/toast.js b/lib/amd/src/toast.js
index bba97b6a2aa..0f7106977f7 100644
--- a/lib/amd/src/toast.js
+++ b/lib/amd/src/toast.js
@@ -27,7 +27,8 @@ import Pending from 'core/pending';
/**
* Add a new region to place toasts in, taking in a parent element.
*
- * @param {Element} parent
+ * @method
+ * @param {HTMLElement} parent
*/
export const addToastRegion = async(parent) => {
const pendingPromise = new Pending('addToastRegion');
@@ -45,6 +46,7 @@ export const addToastRegion = async(parent) => {
/**
* Add a new toast or snackbar notification to the page.
*
+ * @method
* @param {String} message
* @param {Object} configuration
* @param {String} [configuration.title]
@@ -53,6 +55,21 @@ export const addToastRegion = async(parent) => {
* @param {Boolean} [configuration.autohide=true]
* @param {Boolean} [configuration.closeButton=false]
* @param {Number} [configuration.delay=4000]
+ *
+ * @example
+ * import {add as addToast} from 'core/toast';
+ * import {get_string as getString} from 'core/str';
+ *
+ * getString('example', 'mod_myexample')
+ * .then(str => {
+ * addToast(str, {
+ * type: 'warning',
+ * autohide: false,
+ * closeButton: true,
+ * });
+ * return;
+ * })
+ * .catch();
*/
export const add = async(message, configuration) => {
const pendingPromise = new Pending('addToastRegion');
diff --git a/lib/amd/src/truncate.js b/lib/amd/src/truncate.js
index 9373d1341c0..b9bd6e8b024 100644
--- a/lib/amd/src/truncate.js
+++ b/lib/amd/src/truncate.js
@@ -28,7 +28,6 @@
* See: https://github.com/pathable/truncate
*
* @module core/truncate
- * @class truncate
* @copyright 2017 Pathable
* 2017 Mathias Bynens
* 2017 Ryan Wyllie
diff --git a/lib/amd/src/url.js b/lib/amd/src/url.js
index fb7344b9a08..47929eed9a5 100644
--- a/lib/amd/src/url.js
+++ b/lib/amd/src/url.js
@@ -17,7 +17,6 @@
* URL utility functions.
*
* @module core/url
- * @class url
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 2.9
diff --git a/lib/amd/src/utils.js b/lib/amd/src/utils.js
index 933e99fb413..bae507aa8e5 100644
--- a/lib/amd/src/utils.js
+++ b/lib/amd/src/utils.js
@@ -16,22 +16,24 @@
/**
* Utility functions.
*
+ * @module core/utils
* @copyright 2019 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
- * Create a wrapper function to throttle the execution of the given
- * function to at most once every specified period.
- *
- * If the function is attempted to be executed while it's in cooldown
- * (during the wait period) then it'll immediately execute again as
- * soon as the cooldown is over.
- *
- * @param {Function} func The function to throttle
- * @param {Number} wait The number of milliseconds to wait between executions
- * @return {Function}
- */
+ * Create a wrapper function to throttle the execution of the given
+ * function to at most once every specified period.
+ *
+ * If the function is attempted to be executed while it's in cooldown
+ * (during the wait period) then it'll immediately execute again as
+ * soon as the cooldown is over.
+ *
+ * @method
+ * @param {Function} func The function to throttle
+ * @param {Number} wait The number of milliseconds to wait between executions
+ * @return {Function}
+ */
export const throttle = (func, wait) => {
let onCooldown = false;
let runAgain = null;
@@ -68,14 +70,15 @@ export const throttle = (func, wait) => {
};
/**
- * Create a wrapper function to debounce the execution of the given
- * function. Each attempt to execute the function will reset the cooldown
- * period.
- *
- * @param {Function} func The function to debounce
- * @param {Number} wait The number of milliseconds to wait after the final attempt to execute
- * @return {Function}
- */
+ * Create a wrapper function to debounce the execution of the given
+ * function. Each attempt to execute the function will reset the cooldown
+ * period.
+ *
+ * @method
+ * @param {Function} func The function to debounce
+ * @param {Number} wait The number of milliseconds to wait after the final attempt to execute
+ * @return {Function}
+ */
export const debounce = (func, wait) => {
let timeout = null;
return function(...args) {
diff --git a/lib/form/amd/build/defaultcustom.min.js.map b/lib/form/amd/build/defaultcustom.min.js.map
index 1be9a098e5a..706fd5bc865 100644
--- a/lib/form/amd/build/defaultcustom.min.js.map
+++ b/lib/form/amd/build/defaultcustom.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/defaultcustom.js"],"names":["define","$","on","onChangeSelect","event","element","target","defaultvalue","JSON","parse","attr","customvalue","type","form","closest","elementName","replace","newvalue","prop","find","val","day","month","year","hour","minute"],"mappings":"AAwBAA,OAAM,2BAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CA0B3BA,CAAC,CAAC,MAAD,CAAD,CAAUC,EAAV,CAAa,QAAb,CADe,gCACf,CAzBqB,QAAjBC,CAAAA,cAAiB,CAASC,CAAT,CAAgB,CACjC,GAAIC,CAAAA,CAAO,CAAGJ,CAAC,CAACG,CAAK,CAACE,MAAP,CAAf,CACIC,CAAY,CAAGC,IAAI,CAACC,KAAL,CAAWJ,CAAO,CAACK,IAAR,CAAa,mBAAb,CAAX,CADnB,CAEIC,CAAW,CAAGH,IAAI,CAACC,KAAL,CAAWJ,CAAO,CAACK,IAAR,CAAa,kBAAb,CAAX,CAFlB,CAGIE,CAAI,CAAGP,CAAO,CAACK,IAAR,CAAa,WAAb,CAHX,CAIIG,CAAI,CAAGR,CAAO,CAACS,OAAR,CAAgB,MAAhB,CAJX,CAKIC,CAAW,CAAGV,CAAO,CAACK,IAAR,CAAa,MAAb,EAAqBM,OAArB,CAA6B,gBAA7B,CAA+C,SAA/C,CALlB,CAMIC,CAAQ,CAAGZ,CAAO,CAACa,IAAR,CAAa,SAAb,EAA0BP,CAA1B,CAAwCJ,CANvD,CAQA,GAAa,MAAT,GAAAK,CAAJ,CAAqB,CACjBC,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,KAApC,EAA0CK,GAA1C,CAA8CH,CAA9C,CACH,CAFD,IAEO,IAAa,eAAT,GAAAL,CAAJ,CAA8B,CACjCC,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,UAApC,EAA+CK,GAA/C,CAAmDH,CAAQ,CAACI,GAA5D,EACAR,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,YAApC,EAAiDK,GAAjD,CAAqDH,CAAQ,CAACK,KAA9D,EACAT,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,WAApC,EAAgDK,GAAhD,CAAoDH,CAAQ,CAACM,IAA7D,CACH,CAJM,IAIA,IAAa,oBAAT,GAAAX,CAAJ,CAAmC,CACtCC,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,UAApC,EAA+CK,GAA/C,CAAmDH,CAAQ,CAACI,GAA5D,EACAR,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,YAApC,EAAiDK,GAAjD,CAAqDH,CAAQ,CAACK,KAA9D,EACAT,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,WAApC,EAAgDK,GAAhD,CAAoDH,CAAQ,CAACM,IAA7D,EACAV,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,WAApC,EAAgDK,GAAhD,CAAoDH,CAAQ,CAACO,IAA7D,EACAX,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,aAApC,EAAkDK,GAAlD,CAAsDH,CAAQ,CAACQ,MAA/D,CACH,CACJ,CAGD,CACH,CA3BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Functionality for the form element defaultcustom\n *\n * @module core_form/defaultcustom\n * @class defaultcustom\n * @copyright 2017 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery'], function($) {\n var onChangeSelect = function(event) {\n var element = $(event.target),\n defaultvalue = JSON.parse(element.attr('data-defaultvalue')),\n customvalue = JSON.parse(element.attr('data-customvalue')),\n type = element.attr('data-type'),\n form = element.closest('form'),\n elementName = element.attr('name').replace(/\\[customize\\]$/, '[value]'),\n newvalue = element.prop('checked') ? customvalue : defaultvalue;\n\n if (type === 'text') {\n form.find('[name=\"' + elementName + '\"]').val(newvalue);\n } else if (type === 'date_selector') {\n form.find('[name=\"' + elementName + '[day]\"]').val(newvalue.day);\n form.find('[name=\"' + elementName + '[month]\"]').val(newvalue.month);\n form.find('[name=\"' + elementName + '[year]\"]').val(newvalue.year);\n } else if (type === 'date_time_selector') {\n form.find('[name=\"' + elementName + '[day]\"]').val(newvalue.day);\n form.find('[name=\"' + elementName + '[month]\"]').val(newvalue.month);\n form.find('[name=\"' + elementName + '[year]\"]').val(newvalue.year);\n form.find('[name=\"' + elementName + '[hour]\"]').val(newvalue.hour);\n form.find('[name=\"' + elementName + '[minute]\"]').val(newvalue.minute);\n }\n };\n\n var selector = 'input[data-defaultcustom=true]';\n $('body').on('change', selector, onChangeSelect);\n});\n"],"file":"defaultcustom.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/defaultcustom.js"],"names":["define","$","on","onChangeSelect","event","element","target","defaultvalue","JSON","parse","attr","customvalue","type","form","closest","elementName","replace","newvalue","prop","find","val","day","month","year","hour","minute"],"mappings":"AAuBAA,OAAM,2BAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CA0B3BA,CAAC,CAAC,MAAD,CAAD,CAAUC,EAAV,CAAa,QAAb,CADe,gCACf,CAzBqB,QAAjBC,CAAAA,cAAiB,CAASC,CAAT,CAAgB,CACjC,GAAIC,CAAAA,CAAO,CAAGJ,CAAC,CAACG,CAAK,CAACE,MAAP,CAAf,CACIC,CAAY,CAAGC,IAAI,CAACC,KAAL,CAAWJ,CAAO,CAACK,IAAR,CAAa,mBAAb,CAAX,CADnB,CAEIC,CAAW,CAAGH,IAAI,CAACC,KAAL,CAAWJ,CAAO,CAACK,IAAR,CAAa,kBAAb,CAAX,CAFlB,CAGIE,CAAI,CAAGP,CAAO,CAACK,IAAR,CAAa,WAAb,CAHX,CAIIG,CAAI,CAAGR,CAAO,CAACS,OAAR,CAAgB,MAAhB,CAJX,CAKIC,CAAW,CAAGV,CAAO,CAACK,IAAR,CAAa,MAAb,EAAqBM,OAArB,CAA6B,gBAA7B,CAA+C,SAA/C,CALlB,CAMIC,CAAQ,CAAGZ,CAAO,CAACa,IAAR,CAAa,SAAb,EAA0BP,CAA1B,CAAwCJ,CANvD,CAQA,GAAa,MAAT,GAAAK,CAAJ,CAAqB,CACjBC,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,KAApC,EAA0CK,GAA1C,CAA8CH,CAA9C,CACH,CAFD,IAEO,IAAa,eAAT,GAAAL,CAAJ,CAA8B,CACjCC,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,UAApC,EAA+CK,GAA/C,CAAmDH,CAAQ,CAACI,GAA5D,EACAR,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,YAApC,EAAiDK,GAAjD,CAAqDH,CAAQ,CAACK,KAA9D,EACAT,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,WAApC,EAAgDK,GAAhD,CAAoDH,CAAQ,CAACM,IAA7D,CACH,CAJM,IAIA,IAAa,oBAAT,GAAAX,CAAJ,CAAmC,CACtCC,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,UAApC,EAA+CK,GAA/C,CAAmDH,CAAQ,CAACI,GAA5D,EACAR,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,YAApC,EAAiDK,GAAjD,CAAqDH,CAAQ,CAACK,KAA9D,EACAT,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,WAApC,EAAgDK,GAAhD,CAAoDH,CAAQ,CAACM,IAA7D,EACAV,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,WAApC,EAAgDK,GAAhD,CAAoDH,CAAQ,CAACO,IAA7D,EACAX,CAAI,CAACM,IAAL,CAAU,WAAYJ,CAAZ,CAA0B,aAApC,EAAkDK,GAAlD,CAAsDH,CAAQ,CAACQ,MAA/D,CACH,CACJ,CAGD,CACH,CA3BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Functionality for the form element defaultcustom\n *\n * @module core_form/defaultcustom\n * @copyright 2017 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery'], function($) {\n var onChangeSelect = function(event) {\n var element = $(event.target),\n defaultvalue = JSON.parse(element.attr('data-defaultvalue')),\n customvalue = JSON.parse(element.attr('data-customvalue')),\n type = element.attr('data-type'),\n form = element.closest('form'),\n elementName = element.attr('name').replace(/\\[customize\\]$/, '[value]'),\n newvalue = element.prop('checked') ? customvalue : defaultvalue;\n\n if (type === 'text') {\n form.find('[name=\"' + elementName + '\"]').val(newvalue);\n } else if (type === 'date_selector') {\n form.find('[name=\"' + elementName + '[day]\"]').val(newvalue.day);\n form.find('[name=\"' + elementName + '[month]\"]').val(newvalue.month);\n form.find('[name=\"' + elementName + '[year]\"]').val(newvalue.year);\n } else if (type === 'date_time_selector') {\n form.find('[name=\"' + elementName + '[day]\"]').val(newvalue.day);\n form.find('[name=\"' + elementName + '[month]\"]').val(newvalue.month);\n form.find('[name=\"' + elementName + '[year]\"]').val(newvalue.year);\n form.find('[name=\"' + elementName + '[hour]\"]').val(newvalue.hour);\n form.find('[name=\"' + elementName + '[minute]\"]').val(newvalue.minute);\n }\n };\n\n var selector = 'input[data-defaultcustom=true]';\n $('body').on('change', selector, onChangeSelect);\n});\n"],"file":"defaultcustom.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/build/dynamicform.min.js.map b/lib/form/amd/build/dynamicform.min.js.map
index c7f4241dd20..e5cd9d95f78 100644
--- a/lib/form/amd/build/dynamicform.min.js.map
+++ b/lib/form/amd/build/dynamicform.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/dynamicform.js"],"names":["DynamicForm","container","formClass","FORM_SUBMITTED","FORM_CANCELLED","CLIENT_VALIDATION_ERROR","SERVER_VALIDATION_ERROR","ERROR","NOSUBMIT_BUTTON_PRESSED","SUBMIT_BUTTON_PRESSED","CANCEL_BUTTON_PRESSED","key","component","catch","Notification","exception","addEventListener","e","target","matches","preventDefault","event","trigger","events","defaultPrevented","processCancelButton","processNoSubmitButton","submitFormAjax","args","formData","URLSearchParams","Object","entries","pendingPromise","Pending","getBody","toString","then","resp","updateForm","resolve","eventName","detail","cancelable","CustomEvent","dispatchEvent","formDataString","Ajax","call","methodname","formdata","form","response","html","js","Fragment","processCollectedJavascript","javascript","innerHTML","button","getFormNode","FormData","append","getAttribute","FormEvents","notifyFormSubmittedByJavascript","disableButtons","onSubmitError","querySelector","Promise","Y","use","M","core_formchangechecker","reset_form_dirty_state","notifyResetFormChanges","Templates","replaceNodeContents","invalid","querySelectorAll","length","focus","forEach","el","setAttribute","removeAttribute","validateElements","submitted","enableButtons","data","JSON","parse","onSubmitSuccess"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Display an embedded form, it is only loaded and reloaded inside its container\n *\n * Example:\n * import DynamicForm from 'core_form/dynamicform';\n *\n * const dynamicForm = new DynamicForm(document.querySelector('#mycontainer', 'pluginname\\\\form\\\\formname');\n * dynamicForm.addEventListener(dynamicForm.events.FORM_SUBMITTED, e => {\n * e.preventDefault();\n * window.console.log(e.detail);\n * dynamicForm.container.innerHTML = 'Thank you, your form is submitted!';\n * });\n * dynamicForm.load();\n *\n * See also https://docs.moodle.org/dev/Modal_and_AJAX_forms\n *\n * @module core_form/dynamicform\n * @copyright 2019 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport * as FormEvents from 'core_form/events';\nimport Fragment from 'core/fragment';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport Templates from 'core/templates';\nimport Y from 'core/yui';\nimport {get_strings as getStrings} from 'core/str';\n\nexport default class DynamicForm {\n\n /**\n * Various events that can be observed.\n *\n * @type {Object}\n */\n events = {\n // Form was successfully submitted - the response is passed to the event listener.\n // Cancellable (in order to prevent default behavior to clear the container).\n FORM_SUBMITTED: 'core_form_dynamicform_formsubmitted',\n // Cancel button was pressed.\n // Cancellable (in order to prevent default behavior to clear the container).\n FORM_CANCELLED: 'core_form_dynamicform_formcancelled',\n // User attempted to submit the form but there was client-side validation error.\n CLIENT_VALIDATION_ERROR: 'core_form_dynamicform_clientvalidationerror',\n // User attempted to submit the form but server returned validation error.\n SERVER_VALIDATION_ERROR: 'core_form_dynamicform_validationerror',\n // Error occurred while performing request to the server.\n // Cancellable (by default calls Notification.exception).\n ERROR: 'core_form_dynamicform_error',\n // Right after user pressed no-submit button,\n // listen to this event if you want to add JS validation or processing for no-submit button.\n // Cancellable.\n NOSUBMIT_BUTTON_PRESSED: 'core_form_dynamicform_nosubmitbutton',\n // Right after user pressed submit button,\n // listen to this event if you want to add additional JS validation or confirmation dialog.\n // Cancellable.\n SUBMIT_BUTTON_PRESSED: 'core_form_dynamicform_submitbutton',\n // Right after user pressed cancel button,\n // listen to this event if you want to add confirmation dialog.\n // Cancellable.\n CANCEL_BUTTON_PRESSED: 'core_form_dynamicform_cancelbutton',\n };\n\n /**\n * Constructor\n *\n * Creates an instance\n *\n * @param {Element} container - the parent element for the form\n * @param {string} formClass full name of the php class that extends \\core_form\\modal , must be in autoloaded location\n */\n constructor(container, formClass) {\n this.formClass = formClass;\n this.container = container;\n\n // Ensure strings required for shortforms are always available.\n getStrings([\n {key: 'collapseall', component: 'moodle'},\n {key: 'expandall', component: 'moodle'}\n ]).catch(Notification.exception);\n\n // Register delegated events handlers in vanilla JS.\n this.container.addEventListener('click', e => {\n if (e.target.matches('form input[type=submit][data-cancel]')) {\n e.preventDefault();\n const event = this.trigger(this.events.CANCEL_BUTTON_PRESSED, e.target);\n if (!event.defaultPrevented) {\n this.processCancelButton();\n }\n } else if (e.target.matches('form input[type=submit][data-no-submit=\"1\"]')) {\n e.preventDefault();\n const event = this.trigger(this.events.NOSUBMIT_BUTTON_PRESSED, e.target);\n if (!event.defaultPrevented) {\n this.processNoSubmitButton(e.target);\n }\n }\n });\n\n this.container.addEventListener('submit', e => {\n if (e.target.matches('form')) {\n e.preventDefault();\n const event = this.trigger(this.events.SUBMIT_BUTTON_PRESSED);\n if (!event.defaultPrevented) {\n this.submitFormAjax();\n }\n }\n });\n }\n\n /**\n * Loads the form via AJAX and shows it inside a given container\n *\n * @param {Object} args\n * @return {Promise}\n * @public\n */\n load(args = null) {\n const formData = new URLSearchParams(Object.entries(args || {}));\n const pendingPromise = new Pending('core_form/dynamicform:load');\n return this.getBody(formData.toString())\n .then((resp) => this.updateForm(resp))\n .then(pendingPromise.resolve);\n }\n\n /**\n * Triggers a custom event\n *\n * @private\n * @param {String} eventName\n * @param {*} detail\n * @param {Boolean} cancelable\n * @return {CustomEvent}\n */\n trigger(eventName, detail = null, cancelable = true) {\n const e = new CustomEvent(eventName, {detail, cancelable});\n this.container.dispatchEvent(e);\n return e;\n }\n\n /**\n * Add listener for an event\n *\n * Example:\n * const dynamicForm = new DynamicForm(...);\n * dynamicForm.addEventListener(dynamicForm.events.FORM_SUBMITTED, e => {\n * e.preventDefault();\n * window.console.log(e.detail);\n * dynamicForm.container.innerHTML = 'Thank you, your form is submitted!';\n * });\n */\n addEventListener(...args) {\n this.container.addEventListener(...args);\n }\n\n /**\n * Get form body\n *\n * @param {String} formDataString form data in format of a query string\n * @private\n * @return {Promise}\n */\n getBody(formDataString) {\n return Ajax.call([{\n methodname: 'core_form_dynamic_form',\n args: {\n formdata: formDataString,\n form: this.formClass,\n }\n }])[0]\n .then(response => {\n return {html: response.html, js: Fragment.processCollectedJavascript(response.javascript)};\n });\n }\n\n /**\n * On form submit\n *\n * @param {*} response Response received from the form's \"process\" method\n */\n onSubmitSuccess(response) {\n const event = this.trigger(this.events.FORM_SUBMITTED, response);\n if (event.defaultPrevented) {\n return;\n }\n\n // Default implementation is to remove the form. Event listener should either remove or reload the form\n // since its contents is no longer correct. For example, if an element was created as a result of\n // form submission, the \"id\" in the form would be still zero. Also the server-side validation\n // errors from the previous submission may still be present.\n this.container.innerHTML = '';\n }\n\n /**\n * On exception during form processing\n *\n * @private\n * @param {Object} exception\n */\n onSubmitError(exception) {\n const event = this.trigger(this.events.ERROR, exception);\n if (event.defaultPrevented) {\n return;\n }\n\n Notification.exception(exception);\n }\n\n /**\n * Click on a \"submit\" button that is marked in the form as registerNoSubmitButton()\n *\n * @method submitButtonPressed\n * @param {Element} button that was pressed\n * @fires event:formSubmittedByJavascript\n */\n processNoSubmitButton(button) {\n const pendingPromise = new Pending('core_form/dynamicform:nosubmit');\n const form = this.getFormNode();\n const formData = new URLSearchParams([...(new FormData(form)).entries()]);\n formData.append(button.getAttribute('name'), button.getAttribute('value'));\n\n FormEvents.notifyFormSubmittedByJavascript(form, true);\n\n // Add the button name to the form data and submit it.\n this.disableButtons();\n\n this.getBody(formData.toString())\n .then(this.updateForm)\n .then(pendingPromise.resolve)\n .catch(this.onSubmitError);\n }\n\n /**\n * Get the form node from the Dialogue.\n *\n * @returns {HTMLFormElement}\n */\n getFormNode() {\n return this.container.querySelector('form');\n }\n\n /**\n * Notifies listeners that form dirty state should be reset.\n *\n * @return {Promise}\n * @fires event:formSubmittedByJavascript\n */\n notifyResetFormChanges() {\n FormEvents.notifyFormSubmittedByJavascript(this.getFormNode(), true);\n\n return new Promise(resolve => {\n Y.use('event', 'moodle-core-event', 'moodle-core-formchangechecker', () => {\n M.core_formchangechecker.reset_form_dirty_state();\n resolve();\n });\n });\n }\n\n /**\n * Click on a \"cancel\" button\n */\n processCancelButton() {\n // Notify listeners that the form is about to be submitted (this will reset atto autosave).\n this.notifyResetFormChanges()\n .then(() => {\n const event = this.trigger(this.events.FORM_CANCELLED);\n if (!event.defaultPrevented) {\n // By default removes the form from the DOM.\n this.container.innerHTML = '';\n }\n return null;\n })\n .catch(null);\n }\n\n /**\n * Update form contents\n *\n * @param {string} html\n * @param {string} js\n * @returns {Promise}\n */\n updateForm({html, js}) {\n return Templates.replaceNodeContents(this.container, html, js);\n }\n\n /**\n * Validate form elements\n * @return {Boolean} Whether client-side validation has passed, false if there are errors\n * @fires event:formSubmittedByJavascript\n */\n validateElements() {\n // Notify listeners that the form is about to be submitted (this will reset atto autosave).\n FormEvents.notifyFormSubmittedByJavascript(this.getFormNode());\n\n // Now the change events have run, see if there are any \"invalid\" form fields.\n const invalid = [...this.container.querySelectorAll('[aria-invalid=\"true\"], .error')];\n\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (invalid.length) {\n invalid[0].focus();\n return false;\n }\n\n return true;\n }\n\n /**\n * Disable buttons during form submission\n */\n disableButtons() {\n this.container.querySelectorAll('form input[type=\"submit\"]')\n .forEach(el => el.setAttribute('disabled', true));\n }\n\n /**\n * Enable buttons after form submission (on validation error)\n */\n enableButtons() {\n this.container.querySelectorAll('form input[type=\"submit\"]')\n .forEach(el => el.removeAttribute('disabled'));\n }\n\n /**\n * Submit the form via AJAX call to the core_form_dynamic_form WS\n */\n async submitFormAjax() {\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (!(await this.validateElements())) {\n this.trigger(this.events.CLIENT_VALIDATION_ERROR, null, false);\n return;\n }\n this.disableButtons();\n\n // Convert all the form elements values to a serialised string.\n const form = this.container.querySelector('form');\n const formData = new URLSearchParams([...(new FormData(form)).entries()]);\n\n // Now we can continue...\n Ajax.call([{\n methodname: 'core_form_dynamic_form',\n args: {\n formdata: formData.toString(),\n form: this.formClass\n }\n }])[0]\n .then((response) => {\n if (!response.submitted) {\n // Form was not submitted, it could be either because validation failed or because no-submit button was pressed.\n this.updateForm({html: response.html, js: Fragment.processCollectedJavascript(response.javascript)});\n this.enableButtons();\n this.trigger(this.events.SERVER_VALIDATION_ERROR, null, false);\n } else {\n // Form was submitted properly.\n const data = JSON.parse(response.data);\n this.enableButtons();\n this.notifyResetFormChanges()\n .then(() => this.onSubmitSuccess(data))\n .catch();\n }\n return null;\n })\n .catch(this.onSubmitError);\n }\n}\n"],"file":"dynamicform.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/dynamicform.js"],"names":["DynamicForm","container","formClass","FORM_SUBMITTED","FORM_CANCELLED","CLIENT_VALIDATION_ERROR","SERVER_VALIDATION_ERROR","ERROR","NOSUBMIT_BUTTON_PRESSED","SUBMIT_BUTTON_PRESSED","CANCEL_BUTTON_PRESSED","key","component","catch","Notification","exception","addEventListener","e","target","matches","preventDefault","event","trigger","events","defaultPrevented","processCancelButton","processNoSubmitButton","submitFormAjax","args","formData","URLSearchParams","Object","entries","pendingPromise","Pending","getBody","toString","then","resp","updateForm","resolve","eventName","detail","cancelable","CustomEvent","dispatchEvent","formDataString","Ajax","call","methodname","formdata","form","response","html","js","Fragment","processCollectedJavascript","javascript","innerHTML","button","getFormNode","FormData","append","getAttribute","FormEvents","notifyFormSubmittedByJavascript","disableButtons","onSubmitError","querySelector","Promise","Y","use","M","core_formchangechecker","reset_form_dirty_state","notifyResetFormChanges","Templates","replaceNodeContents","invalid","querySelectorAll","length","focus","forEach","el","setAttribute","removeAttribute","validateElements","submitted","enableButtons","data","JSON","parse","onSubmitSuccess"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Display an embedded form, it is only loaded and reloaded inside its container\n *\n * Example:\n * import DynamicForm from 'core_form/dynamicform';\n *\n * const dynamicForm = new DynamicForm(document.querySelector('#mycontainer', 'pluginname\\\\form\\\\formname');\n * dynamicForm.addEventListener(dynamicForm.events.FORM_SUBMITTED, e => {\n * e.preventDefault();\n * window.console.log(e.detail);\n * dynamicForm.container.innerHTML = 'Thank you, your form is submitted!';\n * });\n * dynamicForm.load();\n *\n * See also https://docs.moodle.org/dev/Modal_and_AJAX_forms\n *\n * @module core_form/dynamicform\n * @copyright 2019 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport * as FormEvents from 'core_form/events';\nimport Fragment from 'core/fragment';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport Templates from 'core/templates';\nimport Y from 'core/yui';\nimport {get_strings as getStrings} from 'core/str';\n\n/**\n * @class core_form/dynamicform\n */\nexport default class DynamicForm {\n\n /**\n * Various events that can be observed.\n *\n * @type {Object}\n */\n events = {\n // Form was successfully submitted - the response is passed to the event listener.\n // Cancellable (in order to prevent default behavior to clear the container).\n FORM_SUBMITTED: 'core_form_dynamicform_formsubmitted',\n // Cancel button was pressed.\n // Cancellable (in order to prevent default behavior to clear the container).\n FORM_CANCELLED: 'core_form_dynamicform_formcancelled',\n // User attempted to submit the form but there was client-side validation error.\n CLIENT_VALIDATION_ERROR: 'core_form_dynamicform_clientvalidationerror',\n // User attempted to submit the form but server returned validation error.\n SERVER_VALIDATION_ERROR: 'core_form_dynamicform_validationerror',\n // Error occurred while performing request to the server.\n // Cancellable (by default calls Notification.exception).\n ERROR: 'core_form_dynamicform_error',\n // Right after user pressed no-submit button,\n // listen to this event if you want to add JS validation or processing for no-submit button.\n // Cancellable.\n NOSUBMIT_BUTTON_PRESSED: 'core_form_dynamicform_nosubmitbutton',\n // Right after user pressed submit button,\n // listen to this event if you want to add additional JS validation or confirmation dialog.\n // Cancellable.\n SUBMIT_BUTTON_PRESSED: 'core_form_dynamicform_submitbutton',\n // Right after user pressed cancel button,\n // listen to this event if you want to add confirmation dialog.\n // Cancellable.\n CANCEL_BUTTON_PRESSED: 'core_form_dynamicform_cancelbutton',\n };\n\n /**\n * Constructor\n *\n * Creates an instance\n *\n * @param {Element} container - the parent element for the form\n * @param {string} formClass full name of the php class that extends \\core_form\\modal , must be in autoloaded location\n */\n constructor(container, formClass) {\n this.formClass = formClass;\n this.container = container;\n\n // Ensure strings required for shortforms are always available.\n getStrings([\n {key: 'collapseall', component: 'moodle'},\n {key: 'expandall', component: 'moodle'}\n ]).catch(Notification.exception);\n\n // Register delegated events handlers in vanilla JS.\n this.container.addEventListener('click', e => {\n if (e.target.matches('form input[type=submit][data-cancel]')) {\n e.preventDefault();\n const event = this.trigger(this.events.CANCEL_BUTTON_PRESSED, e.target);\n if (!event.defaultPrevented) {\n this.processCancelButton();\n }\n } else if (e.target.matches('form input[type=submit][data-no-submit=\"1\"]')) {\n e.preventDefault();\n const event = this.trigger(this.events.NOSUBMIT_BUTTON_PRESSED, e.target);\n if (!event.defaultPrevented) {\n this.processNoSubmitButton(e.target);\n }\n }\n });\n\n this.container.addEventListener('submit', e => {\n if (e.target.matches('form')) {\n e.preventDefault();\n const event = this.trigger(this.events.SUBMIT_BUTTON_PRESSED);\n if (!event.defaultPrevented) {\n this.submitFormAjax();\n }\n }\n });\n }\n\n /**\n * Loads the form via AJAX and shows it inside a given container\n *\n * @param {Object} args\n * @return {Promise}\n * @public\n */\n load(args = null) {\n const formData = new URLSearchParams(Object.entries(args || {}));\n const pendingPromise = new Pending('core_form/dynamicform:load');\n return this.getBody(formData.toString())\n .then((resp) => this.updateForm(resp))\n .then(pendingPromise.resolve);\n }\n\n /**\n * Triggers a custom event\n *\n * @private\n * @param {String} eventName\n * @param {*} detail\n * @param {Boolean} cancelable\n * @return {CustomEvent}\n */\n trigger(eventName, detail = null, cancelable = true) {\n const e = new CustomEvent(eventName, {detail, cancelable});\n this.container.dispatchEvent(e);\n return e;\n }\n\n /**\n * Add listener for an event\n *\n * Example:\n * const dynamicForm = new DynamicForm(...);\n * dynamicForm.addEventListener(dynamicForm.events.FORM_SUBMITTED, e => {\n * e.preventDefault();\n * window.console.log(e.detail);\n * dynamicForm.container.innerHTML = 'Thank you, your form is submitted!';\n * });\n */\n addEventListener(...args) {\n this.container.addEventListener(...args);\n }\n\n /**\n * Get form body\n *\n * @param {String} formDataString form data in format of a query string\n * @private\n * @return {Promise}\n */\n getBody(formDataString) {\n return Ajax.call([{\n methodname: 'core_form_dynamic_form',\n args: {\n formdata: formDataString,\n form: this.formClass,\n }\n }])[0]\n .then(response => {\n return {html: response.html, js: Fragment.processCollectedJavascript(response.javascript)};\n });\n }\n\n /**\n * On form submit\n *\n * @param {*} response Response received from the form's \"process\" method\n */\n onSubmitSuccess(response) {\n const event = this.trigger(this.events.FORM_SUBMITTED, response);\n if (event.defaultPrevented) {\n return;\n }\n\n // Default implementation is to remove the form. Event listener should either remove or reload the form\n // since its contents is no longer correct. For example, if an element was created as a result of\n // form submission, the \"id\" in the form would be still zero. Also the server-side validation\n // errors from the previous submission may still be present.\n this.container.innerHTML = '';\n }\n\n /**\n * On exception during form processing\n *\n * @private\n * @param {Object} exception\n */\n onSubmitError(exception) {\n const event = this.trigger(this.events.ERROR, exception);\n if (event.defaultPrevented) {\n return;\n }\n\n Notification.exception(exception);\n }\n\n /**\n * Click on a \"submit\" button that is marked in the form as registerNoSubmitButton()\n *\n * @method submitButtonPressed\n * @param {Element} button that was pressed\n * @fires event:formSubmittedByJavascript\n */\n processNoSubmitButton(button) {\n const pendingPromise = new Pending('core_form/dynamicform:nosubmit');\n const form = this.getFormNode();\n const formData = new URLSearchParams([...(new FormData(form)).entries()]);\n formData.append(button.getAttribute('name'), button.getAttribute('value'));\n\n FormEvents.notifyFormSubmittedByJavascript(form, true);\n\n // Add the button name to the form data and submit it.\n this.disableButtons();\n\n this.getBody(formData.toString())\n .then(this.updateForm)\n .then(pendingPromise.resolve)\n .catch(this.onSubmitError);\n }\n\n /**\n * Get the form node from the Dialogue.\n *\n * @returns {HTMLFormElement}\n */\n getFormNode() {\n return this.container.querySelector('form');\n }\n\n /**\n * Notifies listeners that form dirty state should be reset.\n *\n * @return {Promise}\n * @fires event:formSubmittedByJavascript\n */\n notifyResetFormChanges() {\n FormEvents.notifyFormSubmittedByJavascript(this.getFormNode(), true);\n\n return new Promise(resolve => {\n Y.use('event', 'moodle-core-event', 'moodle-core-formchangechecker', () => {\n M.core_formchangechecker.reset_form_dirty_state();\n resolve();\n });\n });\n }\n\n /**\n * Click on a \"cancel\" button\n */\n processCancelButton() {\n // Notify listeners that the form is about to be submitted (this will reset atto autosave).\n this.notifyResetFormChanges()\n .then(() => {\n const event = this.trigger(this.events.FORM_CANCELLED);\n if (!event.defaultPrevented) {\n // By default removes the form from the DOM.\n this.container.innerHTML = '';\n }\n return null;\n })\n .catch(null);\n }\n\n /**\n * Update form contents\n *\n * @param {string} html\n * @param {string} js\n * @returns {Promise}\n */\n updateForm({html, js}) {\n return Templates.replaceNodeContents(this.container, html, js);\n }\n\n /**\n * Validate form elements\n * @return {Boolean} Whether client-side validation has passed, false if there are errors\n * @fires event:formSubmittedByJavascript\n */\n validateElements() {\n // Notify listeners that the form is about to be submitted (this will reset atto autosave).\n FormEvents.notifyFormSubmittedByJavascript(this.getFormNode());\n\n // Now the change events have run, see if there are any \"invalid\" form fields.\n const invalid = [...this.container.querySelectorAll('[aria-invalid=\"true\"], .error')];\n\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (invalid.length) {\n invalid[0].focus();\n return false;\n }\n\n return true;\n }\n\n /**\n * Disable buttons during form submission\n */\n disableButtons() {\n this.container.querySelectorAll('form input[type=\"submit\"]')\n .forEach(el => el.setAttribute('disabled', true));\n }\n\n /**\n * Enable buttons after form submission (on validation error)\n */\n enableButtons() {\n this.container.querySelectorAll('form input[type=\"submit\"]')\n .forEach(el => el.removeAttribute('disabled'));\n }\n\n /**\n * Submit the form via AJAX call to the core_form_dynamic_form WS\n */\n async submitFormAjax() {\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (!(await this.validateElements())) {\n this.trigger(this.events.CLIENT_VALIDATION_ERROR, null, false);\n return;\n }\n this.disableButtons();\n\n // Convert all the form elements values to a serialised string.\n const form = this.container.querySelector('form');\n const formData = new URLSearchParams([...(new FormData(form)).entries()]);\n\n // Now we can continue...\n Ajax.call([{\n methodname: 'core_form_dynamic_form',\n args: {\n formdata: formData.toString(),\n form: this.formClass\n }\n }])[0]\n .then((response) => {\n if (!response.submitted) {\n // Form was not submitted, it could be either because validation failed or because no-submit button was pressed.\n this.updateForm({html: response.html, js: Fragment.processCollectedJavascript(response.javascript)});\n this.enableButtons();\n this.trigger(this.events.SERVER_VALIDATION_ERROR, null, false);\n } else {\n // Form was submitted properly.\n const data = JSON.parse(response.data);\n this.enableButtons();\n this.notifyResetFormChanges()\n .then(() => this.onSubmitSuccess(data))\n .catch();\n }\n return null;\n })\n .catch(this.onSubmitError);\n }\n}\n"],"file":"dynamicform.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/build/encryptedpassword.min.js.map b/lib/form/amd/build/encryptedpassword.min.js.map
index 2e89e87aea5..f0c65e4b924 100644
--- a/lib/form/amd/build/encryptedpassword.min.js.map
+++ b/lib/form/amd/build/encryptedpassword.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/encryptedpassword.js"],"names":["EncryptedPassword","elementId","wrapper","document","querySelector","spanOrLink","input","editButtonOrLink","cancelButton","editHandler","e","stopImmediatePropagation","preventDefault","startEditing","addEventListener","nodeName","parentElement","previousElementSibling","cancelEditing","dataset","novalue","style","display","prototype","moveFocus","disabled","id","removeAttribute","focus","value"],"mappings":"uJA6BO,GAAMA,CAAAA,CAAiB,CAAG,SAASC,CAAT,CAAoB,YAC3CC,CAAO,CAAGC,QAAQ,CAACC,aAAT,CAAuB,kCAAmCH,CAAnC,CAA+C,KAAtE,CADiC,CAEjD,KAAKI,UAAL,CAAkBH,CAAO,CAACE,aAAR,CAAsB,SAAtB,CAAlB,CACA,KAAKE,KAAL,CAAaJ,CAAO,CAACE,aAAR,CAAsB,OAAtB,CAAb,CACA,KAAKG,gBAAL,CAAwBL,CAAO,CAACE,aAAR,CAAsB,4BAAtB,CAAxB,CACA,KAAKI,YAAL,CAAoBN,CAAO,CAACE,aAAR,CAAsB,2BAAtB,CAApB,CAGA,GAAIK,CAAAA,CAAW,CAAG,SAACC,CAAD,CAAO,CACrBA,CAAC,CAACC,wBAAF,GACAD,CAAC,CAACE,cAAF,GACA,CAAI,CAACC,YAAL,IACH,CAJD,CAKA,KAAKN,gBAAL,CAAsBO,gBAAtB,CAAuC,OAAvC,CAAgDL,CAAhD,EAGA,GAAuC,GAAnC,QAAKF,gBAAL,CAAsBQ,QAA1B,CAA4C,CACxCb,CAAO,CAACc,aAAR,CAAsBC,sBAAtB,CAA6Cb,aAA7C,CAA2D,OAA3D,EAAoEU,gBAApE,CAAqF,OAArF,CAA8FL,CAA9F,CACH,CAGD,KAAKD,YAAL,CAAkBM,gBAAlB,CAAmC,OAAnC,CAA4C,SAACJ,CAAD,CAAO,CAC/CA,CAAC,CAACC,wBAAF,GACAD,CAAC,CAACE,cAAF,GACA,CAAI,CAACM,aAAL,EACH,CAJD,EASA,GAAgC,GAA5B,GAAAhB,CAAO,CAACiB,OAAR,CAAgBC,OAApB,CAAqC,CACjC,KAAKP,YAAL,KACA,KAAKL,YAAL,CAAkBa,KAAlB,CAAwBC,OAAxB,CAAkC,MACrC,CACJ,CAlCM,C,sBAyCPtB,CAAiB,CAACuB,SAAlB,CAA4BV,YAA5B,CAA2C,SAASW,CAAT,CAAoB,CAC3D,KAAKlB,KAAL,CAAWe,KAAX,CAAiBC,OAAjB,CAA2B,QAA3B,CACA,KAAKhB,KAAL,CAAWmB,QAAX,IACA,KAAKpB,UAAL,CAAgBgB,KAAhB,CAAsBC,OAAtB,CAAgC,MAAhC,CACA,KAAKf,gBAAL,CAAsBc,KAAtB,CAA4BC,OAA5B,CAAsC,MAAtC,CACA,KAAKd,YAAL,CAAkBa,KAAlB,CAAwBC,OAAxB,CAAkC,QAAlC,CAGA,GAAMI,CAAAA,CAAE,CAAG,KAAKnB,gBAAL,CAAsBmB,EAAjC,CACA,KAAKnB,gBAAL,CAAsBoB,eAAtB,CAAsC,IAAtC,EACA,KAAKrB,KAAL,CAAWoB,EAAX,CAAgBA,CAAhB,CAEA,GAAIF,CAAJ,CAAe,CACX,KAAKlB,KAAL,CAAWsB,KAAX,EACH,CACJ,CAfD,CAoBA5B,CAAiB,CAACuB,SAAlB,CAA4BL,aAA5B,CAA4C,UAAW,CACnD,KAAKZ,KAAL,CAAWe,KAAX,CAAiBC,OAAjB,CAA2B,MAA3B,CACA,KAAKhB,KAAL,CAAWuB,KAAX,CAAmB,EAAnB,CACA,KAAKvB,KAAL,CAAWmB,QAAX,IACA,KAAKpB,UAAL,CAAgBgB,KAAhB,CAAsBC,OAAtB,CAAgC,QAAhC,CACA,KAAKf,gBAAL,CAAsBc,KAAtB,CAA4BC,OAA5B,CAAsC,QAAtC,CACA,KAAKd,YAAL,CAAkBa,KAAlB,CAAwBC,OAAxB,CAAkC,MAAlC,CAGA,GAAMI,CAAAA,CAAE,CAAG,KAAKpB,KAAL,CAAWoB,EAAtB,CACA,KAAKpB,KAAL,CAAWqB,eAAX,CAA2B,IAA3B,EACA,KAAKpB,gBAAL,CAAsBmB,EAAtB,CAA2BA,CAC9B,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Encrypted password functionality.\n *\n * @module core_form/encryptedpassword\n * @class encryptedpassword\n * @copyright 2019 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Constructor for EncryptedPassword.\n *\n * @param {String} elementId The element to apply the encrypted password JS to\n */\nexport const EncryptedPassword = function(elementId) {\n const wrapper = document.querySelector('div[data-encryptedpasswordid=\"' + elementId + '\"]');\n this.spanOrLink = wrapper.querySelector('span, a');\n this.input = wrapper.querySelector('input');\n this.editButtonOrLink = wrapper.querySelector('button[data-editbutton], a');\n this.cancelButton = wrapper.querySelector('button[data-cancelbutton]');\n\n // Edit button action.\n var editHandler = (e) => {\n e.stopImmediatePropagation();\n e.preventDefault();\n this.startEditing(true);\n };\n this.editButtonOrLink.addEventListener('click', editHandler);\n\n // When it's a link, do some magic to make the label work as well.\n if (this.editButtonOrLink.nodeName === 'A') {\n wrapper.parentElement.previousElementSibling.querySelector('label').addEventListener('click', editHandler);\n }\n\n // Cancel button action.\n this.cancelButton.addEventListener('click', (e) => {\n e.stopImmediatePropagation();\n e.preventDefault();\n this.cancelEditing();\n });\n\n // If the value is not set yet, start editing and remove the cancel option - so that\n // it saves something in the config table and doesn't keep repeat showing it as a new\n // admin setting...\n if (wrapper.dataset.novalue === 'y') {\n this.startEditing(false);\n this.cancelButton.style.display = 'none';\n }\n};\n\n/**\n * Starts editing.\n *\n * @param {Boolean} moveFocus If true, sets focus to the edit box\n */\nEncryptedPassword.prototype.startEditing = function(moveFocus) {\n this.input.style.display = 'inline';\n this.input.disabled = false;\n this.spanOrLink.style.display = 'none';\n this.editButtonOrLink.style.display = 'none';\n this.cancelButton.style.display = 'inline';\n\n // Move the id around, which changes what happens when you click the label.\n const id = this.editButtonOrLink.id;\n this.editButtonOrLink.removeAttribute('id');\n this.input.id = id;\n\n if (moveFocus) {\n this.input.focus();\n }\n};\n\n/**\n * Cancels editing.\n */\nEncryptedPassword.prototype.cancelEditing = function() {\n this.input.style.display = 'none';\n this.input.value = '';\n this.input.disabled = true;\n this.spanOrLink.style.display = 'inline';\n this.editButtonOrLink.style.display = 'inline';\n this.cancelButton.style.display = 'none';\n\n // Move the id around, which changes what happens when you click the label.\n const id = this.input.id;\n this.input.removeAttribute('id');\n this.editButtonOrLink.id = id;\n};\n"],"file":"encryptedpassword.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/encryptedpassword.js"],"names":["EncryptedPassword","elementId","wrapper","document","querySelector","spanOrLink","input","editButtonOrLink","cancelButton","editHandler","e","stopImmediatePropagation","preventDefault","startEditing","addEventListener","nodeName","parentElement","previousElementSibling","cancelEditing","dataset","novalue","style","display","prototype","moveFocus","disabled","id","removeAttribute","focus","value"],"mappings":"uJA6BO,GAAMA,CAAAA,CAAiB,CAAG,SAASC,CAAT,CAAoB,YAC3CC,CAAO,CAAGC,QAAQ,CAACC,aAAT,CAAuB,kCAAmCH,CAAnC,CAA+C,KAAtE,CADiC,CAEjD,KAAKI,UAAL,CAAkBH,CAAO,CAACE,aAAR,CAAsB,SAAtB,CAAlB,CACA,KAAKE,KAAL,CAAaJ,CAAO,CAACE,aAAR,CAAsB,OAAtB,CAAb,CACA,KAAKG,gBAAL,CAAwBL,CAAO,CAACE,aAAR,CAAsB,4BAAtB,CAAxB,CACA,KAAKI,YAAL,CAAoBN,CAAO,CAACE,aAAR,CAAsB,2BAAtB,CAApB,CAGA,GAAIK,CAAAA,CAAW,CAAG,SAACC,CAAD,CAAO,CACrBA,CAAC,CAACC,wBAAF,GACAD,CAAC,CAACE,cAAF,GACA,CAAI,CAACC,YAAL,IACH,CAJD,CAKA,KAAKN,gBAAL,CAAsBO,gBAAtB,CAAuC,OAAvC,CAAgDL,CAAhD,EAGA,GAAuC,GAAnC,QAAKF,gBAAL,CAAsBQ,QAA1B,CAA4C,CACxCb,CAAO,CAACc,aAAR,CAAsBC,sBAAtB,CAA6Cb,aAA7C,CAA2D,OAA3D,EAAoEU,gBAApE,CAAqF,OAArF,CAA8FL,CAA9F,CACH,CAGD,KAAKD,YAAL,CAAkBM,gBAAlB,CAAmC,OAAnC,CAA4C,SAACJ,CAAD,CAAO,CAC/CA,CAAC,CAACC,wBAAF,GACAD,CAAC,CAACE,cAAF,GACA,CAAI,CAACM,aAAL,EACH,CAJD,EASA,GAAgC,GAA5B,GAAAhB,CAAO,CAACiB,OAAR,CAAgBC,OAApB,CAAqC,CACjC,KAAKP,YAAL,KACA,KAAKL,YAAL,CAAkBa,KAAlB,CAAwBC,OAAxB,CAAkC,MACrC,CACJ,CAlCM,C,sBAyCPtB,CAAiB,CAACuB,SAAlB,CAA4BV,YAA5B,CAA2C,SAASW,CAAT,CAAoB,CAC3D,KAAKlB,KAAL,CAAWe,KAAX,CAAiBC,OAAjB,CAA2B,QAA3B,CACA,KAAKhB,KAAL,CAAWmB,QAAX,IACA,KAAKpB,UAAL,CAAgBgB,KAAhB,CAAsBC,OAAtB,CAAgC,MAAhC,CACA,KAAKf,gBAAL,CAAsBc,KAAtB,CAA4BC,OAA5B,CAAsC,MAAtC,CACA,KAAKd,YAAL,CAAkBa,KAAlB,CAAwBC,OAAxB,CAAkC,QAAlC,CAGA,GAAMI,CAAAA,CAAE,CAAG,KAAKnB,gBAAL,CAAsBmB,EAAjC,CACA,KAAKnB,gBAAL,CAAsBoB,eAAtB,CAAsC,IAAtC,EACA,KAAKrB,KAAL,CAAWoB,EAAX,CAAgBA,CAAhB,CAEA,GAAIF,CAAJ,CAAe,CACX,KAAKlB,KAAL,CAAWsB,KAAX,EACH,CACJ,CAfD,CAoBA5B,CAAiB,CAACuB,SAAlB,CAA4BL,aAA5B,CAA4C,UAAW,CACnD,KAAKZ,KAAL,CAAWe,KAAX,CAAiBC,OAAjB,CAA2B,MAA3B,CACA,KAAKhB,KAAL,CAAWuB,KAAX,CAAmB,EAAnB,CACA,KAAKvB,KAAL,CAAWmB,QAAX,IACA,KAAKpB,UAAL,CAAgBgB,KAAhB,CAAsBC,OAAtB,CAAgC,QAAhC,CACA,KAAKf,gBAAL,CAAsBc,KAAtB,CAA4BC,OAA5B,CAAsC,QAAtC,CACA,KAAKd,YAAL,CAAkBa,KAAlB,CAAwBC,OAAxB,CAAkC,MAAlC,CAGA,GAAMI,CAAAA,CAAE,CAAG,KAAKpB,KAAL,CAAWoB,EAAtB,CACA,KAAKpB,KAAL,CAAWqB,eAAX,CAA2B,IAA3B,EACA,KAAKpB,gBAAL,CAAsBmB,EAAtB,CAA2BA,CAC9B,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Encrypted password functionality.\n *\n * @module core_form/encryptedpassword\n * @copyright 2019 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Constructor for EncryptedPassword.\n *\n * @class core_form/encryptedpassword\n * @param {String} elementId The element to apply the encrypted password JS to\n */\nexport const EncryptedPassword = function(elementId) {\n const wrapper = document.querySelector('div[data-encryptedpasswordid=\"' + elementId + '\"]');\n this.spanOrLink = wrapper.querySelector('span, a');\n this.input = wrapper.querySelector('input');\n this.editButtonOrLink = wrapper.querySelector('button[data-editbutton], a');\n this.cancelButton = wrapper.querySelector('button[data-cancelbutton]');\n\n // Edit button action.\n var editHandler = (e) => {\n e.stopImmediatePropagation();\n e.preventDefault();\n this.startEditing(true);\n };\n this.editButtonOrLink.addEventListener('click', editHandler);\n\n // When it's a link, do some magic to make the label work as well.\n if (this.editButtonOrLink.nodeName === 'A') {\n wrapper.parentElement.previousElementSibling.querySelector('label').addEventListener('click', editHandler);\n }\n\n // Cancel button action.\n this.cancelButton.addEventListener('click', (e) => {\n e.stopImmediatePropagation();\n e.preventDefault();\n this.cancelEditing();\n });\n\n // If the value is not set yet, start editing and remove the cancel option - so that\n // it saves something in the config table and doesn't keep repeat showing it as a new\n // admin setting...\n if (wrapper.dataset.novalue === 'y') {\n this.startEditing(false);\n this.cancelButton.style.display = 'none';\n }\n};\n\n/**\n * Starts editing.\n *\n * @param {Boolean} moveFocus If true, sets focus to the edit box\n */\nEncryptedPassword.prototype.startEditing = function(moveFocus) {\n this.input.style.display = 'inline';\n this.input.disabled = false;\n this.spanOrLink.style.display = 'none';\n this.editButtonOrLink.style.display = 'none';\n this.cancelButton.style.display = 'inline';\n\n // Move the id around, which changes what happens when you click the label.\n const id = this.editButtonOrLink.id;\n this.editButtonOrLink.removeAttribute('id');\n this.input.id = id;\n\n if (moveFocus) {\n this.input.focus();\n }\n};\n\n/**\n * Cancels editing.\n */\nEncryptedPassword.prototype.cancelEditing = function() {\n this.input.style.display = 'none';\n this.input.value = '';\n this.input.disabled = true;\n this.spanOrLink.style.display = 'inline';\n this.editButtonOrLink.style.display = 'inline';\n this.cancelButton.style.display = 'none';\n\n // Move the id around, which changes what happens when you click the label.\n const id = this.input.id;\n this.input.removeAttribute('id');\n this.editButtonOrLink.id = id;\n};\n"],"file":"encryptedpassword.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/build/events.min.js.map b/lib/form/amd/build/events.min.js.map
index 4acf0ad272c..ecc688b030a 100644
--- a/lib/form/amd/build/events.min.js.map
+++ b/lib/form/amd/build/events.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/events.js"],"names":["changesMadeString","then","string","catch","changesMadeCheck","e","returnValue","eventTypes","formError","formSubmittedByJavascript","formFieldValidationFailed","uploadStarted","uploadCompleted","notifyFormError","field","notifyFormSubmittedByJavascript","form","skipValidation","fallbackHandled","window","skipClientValidation","customEvent","notifyFieldValidationFailure","message","cancelable","notifyUploadStarted","elementId","addEventListener","document","getElementById","bubbles","cancellable","notifyUploadCompleted","removeEventListener","legacyEventsRegistered","Y","use","element","one","target","formElement","closest","Global","fire","M","core","globalEvents","FORM_ERROR","formid","generateID","elementid","detail","event","FORM_SUBMIT_AJAX","currentTarget","legacyEvent","jQuery","Event","trigger"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Javascript events for the `core_form` subsystem.\n *\n * @module core_form/events\n * @copyright 2021 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.10\n */\n\nimport {get_string as getString} from 'core/str';\nimport {dispatchEvent} from 'core/event_dispatcher';\n\nlet changesMadeString;\ngetString('changesmadereallygoaway', 'moodle').then(string => {\n changesMadeString = string;\n return string;\n}).catch();\n\n/**\n * Prevent user navigate away when upload progress still running.\n * @param {Event} e The event\n */\nconst changesMadeCheck = e => {\n if (e) {\n e.returnValue = changesMadeString;\n }\n};\n\n/**\n * Events for `core_form`.\n *\n * @constant\n * @property {String} formError See {@link event:formError}\n * @property {String} formFieldValidationFailed See {@link event:formFieldValidationFailed}\n * @property {String} formSubmittedByJavascript See {@link event:formSubmittedByJavascript}\n */\nexport const eventTypes = {\n /**\n * An event triggered when a form contains an error\n *\n * @event formError\n * @type {CustomEvent}\n * @property {HTMLElement} target The form field which errored\n */\n formError: 'core_form/error',\n\n /**\n * An event triggered when an mform is about to be submitted via javascript.\n *\n * @event formSubmittedByJavascript\n * @type {CustomEvent}\n * @property {HTMLElement} target The form that was submitted\n * @property {Boolean} skipValidation Whether the form was submitted without validation (i.e. via a Cancel button)\n * @property {Boolean} fallbackHandled Whether the legacy YUI event has been handled\n */\n formSubmittedByJavascript: 'core_form/submittedByJavascript',\n\n /**\n * An event triggered upon form field validation failure.\n *\n * @event formFieldValidationFailed\n * @type {CustomEvent}\n * @property {HTMLElement} target The field that failed validation\n * @property {String} message The message displayed upon failure\n */\n formFieldValidationFailed: 'core_form/fieldValidationFailed',\n\n /**\n * An event triggered when an upload is started\n *\n * @event uploadStarted\n * @type {CustomEvent}\n * @property {HTMLElement} target The location where the upload began\n */\n uploadStarted: 'core_form/uploadStarted',\n\n /**\n * An event triggered when an upload completes\n *\n * @event uploadCompleted\n * @type {CustomEvent}\n * @property {HTMLElement} target The location where the upload completd\n */\n uploadCompleted: 'core_form/uploadCompleted',\n};\n\n// These are only imported for legacy.\nimport jQuery from 'jquery';\nimport Y from 'core/yui';\n\n/**\n * Trigger an event to indicate that a form field contained an error.\n *\n * @method notifyFormError\n * @param {HTMLElement} field The form field causing the error\n * @returns {CustomEvent}\n * @fires formError\n */\nexport const notifyFormError = field => dispatchEvent(eventTypes.formError, {}, field);\n\n/**\n * Trigger an event to indiciate that a form was submitted by Javascript.\n *\n * @method\n * @param {HTMLElement} form The form that was submitted\n * @param {Boolean} skipValidation Submit the form without validation. E.g. \"Cancel\".\n * @param {Boolean} fallbackHandled The legacy YUI event has been handled\n * @returns {CustomEvent}\n * @fires formSubmittedByJavascript\n */\nexport const notifyFormSubmittedByJavascript = (form, skipValidation = false, fallbackHandled = false) => {\n if (skipValidation) {\n window.skipClientValidation = true;\n }\n\n const customEvent = dispatchEvent(\n eventTypes.formSubmittedByJavascript,\n {\n skipValidation,\n fallbackHandled,\n },\n form\n );\n\n if (skipValidation) {\n window.skipClientValidation = false;\n }\n\n return customEvent;\n};\n\n/**\n * Trigger an event to indicate that a form field contained an error.\n *\n * @method notifyFieldValidationFailure\n * @param {HTMLElement} field The field which failed validation\n * @param {String} message The message displayed\n * @returns {CustomEvent}\n * @fires formFieldValidationFailed\n */\nexport const notifyFieldValidationFailure = (field, message) => dispatchEvent(\n eventTypes.formFieldValidationFailed,\n {\n message,\n },\n field,\n {\n cancelable: true\n }\n);\n\n/**\n * Trigger an event to indicate that an upload was started.\n *\n * @method\n * @param {String} elementId The element which was uploaded to\n * @returns {CustomEvent}\n * @fires uploadStarted\n */\nexport const notifyUploadStarted = elementId => {\n // Add an additional check for changes made.\n window.addEventListener('beforeunload', changesMadeCheck);\n\n return dispatchEvent(\n eventTypes.uploadStarted,\n {},\n document.getElementById(elementId),\n {\n bubbles: true,\n cancellable: false,\n }\n );\n};\n\n/**\n * Trigger an event to indicate that an upload was completed.\n *\n * @method\n * @param {String} elementId The element which was uploaded to\n * @returns {CustomEvent}\n * @fires uploadCompleted\n */\nexport const notifyUploadCompleted = elementId => {\n // Remove the additional check for changes made.\n window.removeEventListener('beforeunload', changesMadeCheck);\n\n return dispatchEvent(\n eventTypes.uploadCompleted,\n {},\n document.getElementById(elementId),\n {\n bubbles: true,\n cancellable: false,\n }\n );\n};\n\n/**\n * Trigger upload start event.\n *\n * @method\n * @param {String} elementId\n * @returns {CustomEvent}\n * @fires uploadStarted\n * @deprecated Since Moodle 4.0 See {@link notifyUploadStarted}\n */\nexport const triggerUploadStarted = notifyUploadStarted;\n\n/**\n * Trigger upload complete event.\n *\n * @method\n * @param {String} elementId\n * @returns {CustomEvent}\n * @fires uploadCompleted\n * @deprecated Since Moodle 4.0 See {@link notifyUploadCompleted}\n */\nexport const triggerUploadCompleted = notifyUploadCompleted;\n\n/**\n * List of the events.\n *\n * @deprecated since Moodle 4.0. See {@link eventTypes} instead.\n **/\nexport const types = {\n uploadStarted: 'core_form/uploadStarted',\n uploadCompleted: 'core_form/uploadCompleted',\n};\n\nlet legacyEventsRegistered = false;\nif (!legacyEventsRegistered) {\n // The following event triggers are legacy and will be removed in the future.\n // The following approach provides a backwards-compatability layer for the new events.\n // Code should be updated to make use of native events.\n Y.use('event', 'moodle-core-event', () => {\n\n // Watch for the new native formError event, and trigger the legacy YUI event.\n document.addEventListener(eventTypes.formError, e => {\n const element = Y.one(e.target);\n const formElement = Y.one(e.target.closest('form'));\n\n Y.Global.fire(\n M.core.globalEvents.FORM_ERROR,\n {\n formid: formElement.generateID(),\n elementid: element.generateID(),\n }\n );\n });\n\n // Watch for the new native formSubmittedByJavascript event, and trigger the legacy YUI event.\n document.addEventListener(eventTypes.formSubmittedByJavascript, e => {\n if (e.detail.fallbackHandled) {\n // This event was originally generated by a YUI event.\n // Do not generate another as this will recurse.\n return;\n }\n\n if (e.skipValidation) {\n window.skipClientValidation = true;\n }\n\n // Trigger the legacy YUI event.\n const form = Y.one(e.target);\n form.fire(\n M.core.event.FORM_SUBMIT_AJAX,\n {\n currentTarget: form,\n fallbackHandled: true,\n }\n );\n\n if (e.skipValidation) {\n window.skipClientValidation = false;\n }\n });\n });\n\n // Watch for the new native formFieldValidationFailed event, and trigger the legacy jQuery event.\n document.addEventListener(eventTypes.formFieldValidationFailed, e => {\n // Note: The \"core_form-field-validation\" event is hard-coded in core/event.\n // This is not included to prevent cyclic module dependencies.\n const legacyEvent = jQuery.Event(\"core_form-field-validation\");\n\n jQuery(e.target).trigger(legacyEvent, e.detail.message);\n });\n\n legacyEventsRegistered = true;\n}\n"],"file":"events.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/events.js"],"names":["changesMadeString","then","string","catch","changesMadeCheck","e","returnValue","eventTypes","formError","formSubmittedByJavascript","formFieldValidationFailed","uploadStarted","uploadCompleted","notifyFormError","field","notifyFormSubmittedByJavascript","form","skipValidation","fallbackHandled","window","skipClientValidation","customEvent","notifyFieldValidationFailure","message","cancelable","notifyUploadStarted","elementId","addEventListener","document","getElementById","bubbles","cancellable","notifyUploadCompleted","removeEventListener","legacyEventsRegistered","Y","use","element","one","target","formElement","closest","Global","fire","M","core","globalEvents","FORM_ERROR","formid","generateID","elementid","detail","event","FORM_SUBMIT_AJAX","currentTarget","legacyEvent","jQuery","Event","trigger"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Javascript events for the `core_form` subsystem.\n *\n * @module core_form/events\n * @copyright 2021 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.10\n *\n * @example Example of listening to a form event. \n * import {eventTypes as formEventTypes} from 'core_form/events';\n *\n * document.addEventListener(formEventTypes.formSubmittedByJavascript, e => {\n * window.console.log(e.target); // The form that was submitted.\n * window.console.log(e.detail.skipValidation); // Whether form validation was skipped.\n * });\n */\n\nimport {get_string as getString} from 'core/str';\nimport {dispatchEvent} from 'core/event_dispatcher';\n\nlet changesMadeString;\ngetString('changesmadereallygoaway', 'moodle').then(string => {\n changesMadeString = string;\n return string;\n}).catch();\n\n/**\n * Prevent user navigate away when upload progress still running.\n * @param {Event} e The event\n */\nconst changesMadeCheck = e => {\n if (e) {\n e.returnValue = changesMadeString;\n }\n};\n\n/**\n * Events for `core_form`.\n *\n * @constant\n * @property {String} formError See {@link event:formError}\n * @property {String} formFieldValidationFailed See {@link event:formFieldValidationFailed}\n * @property {String} formSubmittedByJavascript See {@link event:formSubmittedByJavascript}\n */\nexport const eventTypes = {\n /**\n * An event triggered when a form contains an error\n *\n * @event formError\n * @type {CustomEvent}\n * @property {HTMLElement} target The form field which errored\n */\n formError: 'core_form/error',\n\n /**\n * An event triggered when an mform is about to be submitted via javascript.\n *\n * @event formSubmittedByJavascript\n * @type {CustomEvent}\n * @property {HTMLElement} target The form that was submitted\n * @property {object} detail\n * @property {boolean} detail.skipValidation Whether the form was submitted without validation (i.e. via a Cancel button)\n * @property {boolean} detail.fallbackHandled Whether the legacy YUI event has been handled\n */\n formSubmittedByJavascript: 'core_form/submittedByJavascript',\n\n /**\n * An event triggered upon form field validation failure.\n *\n * @event formFieldValidationFailed\n * @type {CustomEvent}\n * @property {HTMLElement} target The field that failed validation\n * @property {object} detail\n * @property {String} detail.message The message displayed upon failure\n */\n formFieldValidationFailed: 'core_form/fieldValidationFailed',\n\n /**\n * An event triggered when an upload is started\n *\n * @event uploadStarted\n * @type {CustomEvent}\n * @property {HTMLElement} target The location where the upload began\n */\n uploadStarted: 'core_form/uploadStarted',\n\n /**\n * An event triggered when an upload completes\n *\n * @event uploadCompleted\n * @type {CustomEvent}\n * @property {HTMLElement} target The location where the upload completd\n */\n uploadCompleted: 'core_form/uploadCompleted',\n};\n\n// These are only imported for legacy.\nimport jQuery from 'jquery';\nimport Y from 'core/yui';\n\n/**\n * Trigger an event to indicate that a form field contained an error.\n *\n * @method notifyFormError\n * @param {HTMLElement} field The form field causing the error\n * @returns {CustomEvent}\n * @fires formError\n */\nexport const notifyFormError = field => dispatchEvent(eventTypes.formError, {}, field);\n\n/**\n * Trigger an event to indiciate that a form was submitted by Javascript.\n *\n * @method\n * @param {HTMLElement} form The form that was submitted\n * @param {Boolean} skipValidation Submit the form without validation. E.g. \"Cancel\".\n * @param {Boolean} fallbackHandled The legacy YUI event has been handled\n * @returns {CustomEvent}\n * @fires formSubmittedByJavascript\n */\nexport const notifyFormSubmittedByJavascript = (form, skipValidation = false, fallbackHandled = false) => {\n if (skipValidation) {\n window.skipClientValidation = true;\n }\n\n const customEvent = dispatchEvent(\n eventTypes.formSubmittedByJavascript,\n {\n skipValidation,\n fallbackHandled,\n },\n form\n );\n\n if (skipValidation) {\n window.skipClientValidation = false;\n }\n\n return customEvent;\n};\n\n/**\n * Trigger an event to indicate that a form field contained an error.\n *\n * @method notifyFieldValidationFailure\n * @param {HTMLElement} field The field which failed validation\n * @param {String} message The message displayed\n * @returns {CustomEvent}\n * @fires formFieldValidationFailed\n */\nexport const notifyFieldValidationFailure = (field, message) => dispatchEvent(\n eventTypes.formFieldValidationFailed,\n {\n message,\n },\n field,\n {\n cancelable: true\n }\n);\n\n/**\n * Trigger an event to indicate that an upload was started.\n *\n * @method\n * @param {String} elementId The element which was uploaded to\n * @returns {CustomEvent}\n * @fires uploadStarted\n */\nexport const notifyUploadStarted = elementId => {\n // Add an additional check for changes made.\n window.addEventListener('beforeunload', changesMadeCheck);\n\n return dispatchEvent(\n eventTypes.uploadStarted,\n {},\n document.getElementById(elementId),\n {\n bubbles: true,\n cancellable: false,\n }\n );\n};\n\n/**\n * Trigger an event to indicate that an upload was completed.\n *\n * @method\n * @param {String} elementId The element which was uploaded to\n * @returns {CustomEvent}\n * @fires uploadCompleted\n */\nexport const notifyUploadCompleted = elementId => {\n // Remove the additional check for changes made.\n window.removeEventListener('beforeunload', changesMadeCheck);\n\n return dispatchEvent(\n eventTypes.uploadCompleted,\n {},\n document.getElementById(elementId),\n {\n bubbles: true,\n cancellable: false,\n }\n );\n};\n\n/**\n * Trigger upload start event.\n *\n * @method\n * @param {String} elementId\n * @returns {CustomEvent}\n * @fires uploadStarted\n * @deprecated Since Moodle 4.0 See {@link module:core_form/events.notifyUploadStarted notifyUploadStarted}\n */\nexport const triggerUploadStarted = notifyUploadStarted;\n\n/**\n * Trigger upload complete event.\n *\n * @method\n * @param {String} elementId\n * @returns {CustomEvent}\n * @fires uploadCompleted\n * @deprecated Since Moodle 4.0 See {@link module:core_form/events.notifyUploadCompleted notifyUploadCompleted}\n */\nexport const triggerUploadCompleted = notifyUploadCompleted;\n\n/**\n * List of the events.\n *\n * @deprecated since Moodle 4.0. See {@link module:core_form/events.eventTypes eventTypes} instead.\n **/\nexport const types = {\n uploadStarted: 'core_form/uploadStarted',\n uploadCompleted: 'core_form/uploadCompleted',\n};\n\nlet legacyEventsRegistered = false;\nif (!legacyEventsRegistered) {\n // The following event triggers are legacy and will be removed in the future.\n // The following approach provides a backwards-compatability layer for the new events.\n // Code should be updated to make use of native events.\n Y.use('event', 'moodle-core-event', () => {\n\n // Watch for the new native formError event, and trigger the legacy YUI event.\n document.addEventListener(eventTypes.formError, e => {\n const element = Y.one(e.target);\n const formElement = Y.one(e.target.closest('form'));\n\n Y.Global.fire(\n M.core.globalEvents.FORM_ERROR,\n {\n formid: formElement.generateID(),\n elementid: element.generateID(),\n }\n );\n });\n\n // Watch for the new native formSubmittedByJavascript event, and trigger the legacy YUI event.\n document.addEventListener(eventTypes.formSubmittedByJavascript, e => {\n if (e.detail.fallbackHandled) {\n // This event was originally generated by a YUI event.\n // Do not generate another as this will recurse.\n return;\n }\n\n if (e.skipValidation) {\n window.skipClientValidation = true;\n }\n\n // Trigger the legacy YUI event.\n const form = Y.one(e.target);\n form.fire(\n M.core.event.FORM_SUBMIT_AJAX,\n {\n currentTarget: form,\n fallbackHandled: true,\n }\n );\n\n if (e.skipValidation) {\n window.skipClientValidation = false;\n }\n });\n });\n\n // Watch for the new native formFieldValidationFailed event, and trigger the legacy jQuery event.\n document.addEventListener(eventTypes.formFieldValidationFailed, e => {\n // Note: The \"core_form-field-validation\" event is hard-coded in core/event.\n // This is not included to prevent cyclic module dependencies.\n const legacyEvent = jQuery.Event(\"core_form-field-validation\");\n\n jQuery(e.target).trigger(legacyEvent, e.detail.message);\n });\n\n legacyEventsRegistered = true;\n}\n"],"file":"events.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/build/passwordunmask.min.js.map b/lib/form/amd/build/passwordunmask.min.js.map
index 8adc2f6b41a..13806fc896d 100644
--- a/lib/form/amd/build/passwordunmask.min.js.map
+++ b/lib/form/amd/build/passwordunmask.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/passwordunmask.js"],"names":["define","$","Template","PasswordUnmask","elementid","wrapperSelector","wrapper","editorSpace","find","editLink","editInstructions","displayValue","inputFieldLabel","inputField","document","getElementById","attr","removeClass","hide","setDisplayValue","addListeners","prototype","on","proxy","e","type","keyCode","stopImmediatePropagation","preventDefault","relatedTarget","is","turnEditingOff","turnEditingOn","data","checkFocusOut","isEditing","window","setTimeout","activeElement","has","length","passwordVisible","value","getDisplayValue","val","show","focus","select","focusOnEditLink","off","removeAttr","text","render","element","frozen","valuechars","split","done","html","js","runTemplateJS"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Password Unmask functionality.\n *\n * @module core_form/passwordunmask\n * @class passwordunmask\n * @copyright 2016 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/templates'], function($, Template) {\n\n /**\n * Constructor for PasswordUnmask.\n *\n * @param {String} elementid The element to apply the PasswordUnmask to\n */\n var PasswordUnmask = function(elementid) {\n // Setup variables.\n this.wrapperSelector = '[data-passwordunmask=\"wrapper\"][data-passwordunmaskid=\"' + elementid + '\"]';\n this.wrapper = $(this.wrapperSelector);\n this.editorSpace = this.wrapper.find('[data-passwordunmask=\"editor\"]');\n this.editLink = this.wrapper.find('a[data-passwordunmask=\"edit\"]');\n this.editInstructions = this.wrapper.find('[data-passwordunmask=\"instructions\"]');\n this.displayValue = this.wrapper.find('[data-passwordunmask=\"displayvalue\"]');\n this.inputFieldLabel = $('label[for=\"' + elementid + '\"]');\n\n this.inputField = this.editorSpace.find(document.getElementById(elementid));\n this.inputField.attr('type', 'hidden');\n this.inputField.removeClass('hiddenifjs');\n\n if (!this.editInstructions.attr('id')) {\n this.editInstructions.attr('id', elementid + '_instructions');\n }\n this.editInstructions.hide();\n\n this.setDisplayValue();\n\n // Add the listeners.\n this.addListeners();\n };\n\n /**\n * Add the event listeners required for PasswordUnmask.\n *\n * @method addListeners\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.addListeners = function() {\n this.wrapper.on('click keypress', '[data-passwordunmask=\"edit\"]', $.proxy(function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n\n if (this.inputField.attr('type') !== 'hidden') {\n // Only focus on the edit link if the event was not a click, and the new target is not an input field.\n if (e.type !== 'click' && !$(e.relatedTarget).is(':input')) {\n this.turnEditingOff(true);\n } else {\n this.turnEditingOff(false);\n }\n } else {\n this.turnEditingOn();\n }\n }, this));\n\n this.wrapper.on('click keypress', '[data-passwordunmask=\"unmask\"]', $.proxy(function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n\n // Toggle the data attribute.\n this.wrapper.data('unmasked', !this.wrapper.data('unmasked'));\n\n this.setDisplayValue();\n }, this));\n\n this.wrapper.on('keydown', 'input', $.proxy(function(e) {\n if (e.type === 'keydown' && e.keyCode !== 13) {\n return;\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n\n this.turnEditingOff(true);\n }, this));\n\n this.inputFieldLabel.on('click', $.proxy(function(e) {\n e.preventDefault();\n\n this.turnEditingOn();\n }, this));\n\n return this;\n };\n\n /**\n * Check whether focus was lost from the PasswordUnmask and turn editing off if required.\n *\n * @method checkFocusOut\n * @param {EventFacade} e The EventFacade generating the suspsected Focus Out\n */\n PasswordUnmask.prototype.checkFocusOut = function(e) {\n if (!this.isEditing()) {\n // Ignore - not editing.\n return;\n }\n\n window.setTimeout($.proxy(function() {\n // Firefox does not have the focusout event. Instead jQuery falls back to the 'blur' event.\n // The blur event does not have a relatedTarget, so instead we use a timeout and the new activeElement.\n var relatedTarget = e.relatedTarget || document.activeElement;\n if (this.wrapper.has($(relatedTarget)).length) {\n // Ignore, some part of the element is still active.\n return;\n }\n\n // Only focus on the edit link if the new related target is not an input field or anchor.\n this.turnEditingOff(!$(relatedTarget).is(':input,a'));\n }, this), 100);\n };\n\n /**\n * Whether the password is currently visible (unmasked).\n *\n * @method passwordVisible\n * @return {Boolean} True if the password is unmasked\n */\n PasswordUnmask.prototype.passwordVisible = function() {\n return !!this.wrapper.data('unmasked');\n };\n\n /**\n * Whether the user is currently editing the field.\n *\n * @method isEditing\n * @return {Boolean} True if edit mode is enabled\n */\n PasswordUnmask.prototype.isEditing = function() {\n return this.inputField.attr('type') !== 'hidden';\n };\n\n /**\n * Enable the editing functionality.\n *\n * @method turnEditingOn\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.turnEditingOn = function() {\n var value = this.getDisplayValue();\n if (this.passwordVisible()) {\n this.inputField.attr('type', 'text');\n } else {\n this.inputField.attr('type', 'password');\n }\n this.inputField.val(value);\n this.inputField.attr('size', this.inputField.attr('data-size'));\n\n if (this.editInstructions.length) {\n this.inputField.attr('aria-describedby', this.editInstructions.attr('id'));\n this.editInstructions.show();\n }\n\n this.wrapper.attr('data-passwordunmask-visible', 1);\n\n this.editLink.hide();\n this.inputField\n .focus()\n .select();\n\n // Note, this cannot be added as a delegated listener on init because Firefox does not support the FocusOut\n // event (https://bugzilla.mozilla.org/show_bug.cgi?id=687787) and the blur event does not identify the\n // relatedTarget.\n // The act of focusing the this.inputField means that in Firefox the focusout will be triggered on blur of the edit\n // link anchor.\n $('body').on('focusout', this.wrapperSelector, $.proxy(this.checkFocusOut, this));\n\n return this;\n };\n\n /**\n * Disable the editing functionality, optionally focusing on the edit link.\n *\n * @method turnEditingOff\n * @param {Boolean} focusOnEditLink Whether to focus on the edit link after disabling the editor\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.turnEditingOff = function(focusOnEditLink) {\n $('body').off('focusout', this.wrapperSelector, this.checkFocusOut);\n var value = this.getDisplayValue();\n this.inputField\n // Hide the field again.\n .attr('type', 'hidden')\n\n // Ensure that the aria-describedby is removed.\n .attr('aria-describedby', null);\n this.inputField.val(value);\n\n this.editInstructions.hide();\n\n // Remove the visible attr.\n this.wrapper.removeAttr('data-passwordunmask-visible');\n\n // Remove the size attr.\n this.inputField.removeAttr('size');\n\n this.editLink.show();\n this.setDisplayValue();\n\n if (focusOnEditLink) {\n this.editLink.focus();\n }\n\n return this;\n };\n\n /**\n * Get the currently value.\n *\n * @method getDisplayValue\n * @return {String}\n */\n PasswordUnmask.prototype.getDisplayValue = function() {\n return this.inputField.val();\n };\n\n /**\n * Set the currently value in the display, taking into account the current settings.\n *\n * @method setDisplayValue\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.setDisplayValue = function() {\n var value = this.getDisplayValue();\n if (this.isEditing()) {\n if (this.wrapper.data('unmasked')) {\n this.inputField.attr('type', 'text');\n } else {\n this.inputField.attr('type', 'password');\n }\n this.inputField.val(value);\n }\n\n // Update the display value.\n // Note: This must always be updated.\n // The unmask value can be changed whilst editing and the editing can then be disabled.\n if (value && this.wrapper.data('unmasked')) {\n // There is a value, and we will show it.\n this.displayValue.text(value);\n } else {\n if (!value) {\n value = \"\";\n }\n // There is a value, but it will be disguised.\n // We use the passwordunmask-fill to allow modification of the fill and to ensure that the display does not\n // change as the page loads the JS.\n Template.render('core_form/element-passwordunmask-fill', {\n element: {\n frozen: this.inputField.is('[readonly]'),\n value: value,\n valuechars: value.split(''),\n },\n }).done($.proxy(function(html, js) {\n this.displayValue.html(html);\n\n Template.runTemplateJS(js);\n }, this));\n }\n\n return this;\n };\n\n return PasswordUnmask;\n});\n"],"file":"passwordunmask.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/passwordunmask.js"],"names":["define","$","Template","PasswordUnmask","elementid","wrapperSelector","wrapper","editorSpace","find","editLink","editInstructions","displayValue","inputFieldLabel","inputField","document","getElementById","attr","removeClass","hide","setDisplayValue","addListeners","prototype","on","proxy","e","type","keyCode","stopImmediatePropagation","preventDefault","relatedTarget","is","turnEditingOff","turnEditingOn","data","checkFocusOut","isEditing","window","setTimeout","activeElement","has","length","passwordVisible","value","getDisplayValue","val","show","focus","select","focusOnEditLink","off","removeAttr","text","render","element","frozen","valuechars","split","done","html","js","runTemplateJS"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Password Unmask functionality.\n *\n * @module core_form/passwordunmask\n * @copyright 2016 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/templates'], function($, Template) {\n\n /**\n * Constructor for PasswordUnmask.\n *\n * @class core_form/passwordunmask\n * @param {String} elementid The element to apply the PasswordUnmask to\n */\n var PasswordUnmask = function(elementid) {\n // Setup variables.\n this.wrapperSelector = '[data-passwordunmask=\"wrapper\"][data-passwordunmaskid=\"' + elementid + '\"]';\n this.wrapper = $(this.wrapperSelector);\n this.editorSpace = this.wrapper.find('[data-passwordunmask=\"editor\"]');\n this.editLink = this.wrapper.find('a[data-passwordunmask=\"edit\"]');\n this.editInstructions = this.wrapper.find('[data-passwordunmask=\"instructions\"]');\n this.displayValue = this.wrapper.find('[data-passwordunmask=\"displayvalue\"]');\n this.inputFieldLabel = $('label[for=\"' + elementid + '\"]');\n\n this.inputField = this.editorSpace.find(document.getElementById(elementid));\n this.inputField.attr('type', 'hidden');\n this.inputField.removeClass('hiddenifjs');\n\n if (!this.editInstructions.attr('id')) {\n this.editInstructions.attr('id', elementid + '_instructions');\n }\n this.editInstructions.hide();\n\n this.setDisplayValue();\n\n // Add the listeners.\n this.addListeners();\n };\n\n /**\n * Add the event listeners required for PasswordUnmask.\n *\n * @method addListeners\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.addListeners = function() {\n this.wrapper.on('click keypress', '[data-passwordunmask=\"edit\"]', $.proxy(function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n\n if (this.inputField.attr('type') !== 'hidden') {\n // Only focus on the edit link if the event was not a click, and the new target is not an input field.\n if (e.type !== 'click' && !$(e.relatedTarget).is(':input')) {\n this.turnEditingOff(true);\n } else {\n this.turnEditingOff(false);\n }\n } else {\n this.turnEditingOn();\n }\n }, this));\n\n this.wrapper.on('click keypress', '[data-passwordunmask=\"unmask\"]', $.proxy(function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n\n // Toggle the data attribute.\n this.wrapper.data('unmasked', !this.wrapper.data('unmasked'));\n\n this.setDisplayValue();\n }, this));\n\n this.wrapper.on('keydown', 'input', $.proxy(function(e) {\n if (e.type === 'keydown' && e.keyCode !== 13) {\n return;\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n\n this.turnEditingOff(true);\n }, this));\n\n this.inputFieldLabel.on('click', $.proxy(function(e) {\n e.preventDefault();\n\n this.turnEditingOn();\n }, this));\n\n return this;\n };\n\n /**\n * Check whether focus was lost from the PasswordUnmask and turn editing off if required.\n *\n * @method checkFocusOut\n * @param {EventFacade} e The EventFacade generating the suspsected Focus Out\n */\n PasswordUnmask.prototype.checkFocusOut = function(e) {\n if (!this.isEditing()) {\n // Ignore - not editing.\n return;\n }\n\n window.setTimeout($.proxy(function() {\n // Firefox does not have the focusout event. Instead jQuery falls back to the 'blur' event.\n // The blur event does not have a relatedTarget, so instead we use a timeout and the new activeElement.\n var relatedTarget = e.relatedTarget || document.activeElement;\n if (this.wrapper.has($(relatedTarget)).length) {\n // Ignore, some part of the element is still active.\n return;\n }\n\n // Only focus on the edit link if the new related target is not an input field or anchor.\n this.turnEditingOff(!$(relatedTarget).is(':input,a'));\n }, this), 100);\n };\n\n /**\n * Whether the password is currently visible (unmasked).\n *\n * @method passwordVisible\n * @return {Boolean} True if the password is unmasked\n */\n PasswordUnmask.prototype.passwordVisible = function() {\n return !!this.wrapper.data('unmasked');\n };\n\n /**\n * Whether the user is currently editing the field.\n *\n * @method isEditing\n * @return {Boolean} True if edit mode is enabled\n */\n PasswordUnmask.prototype.isEditing = function() {\n return this.inputField.attr('type') !== 'hidden';\n };\n\n /**\n * Enable the editing functionality.\n *\n * @method turnEditingOn\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.turnEditingOn = function() {\n var value = this.getDisplayValue();\n if (this.passwordVisible()) {\n this.inputField.attr('type', 'text');\n } else {\n this.inputField.attr('type', 'password');\n }\n this.inputField.val(value);\n this.inputField.attr('size', this.inputField.attr('data-size'));\n\n if (this.editInstructions.length) {\n this.inputField.attr('aria-describedby', this.editInstructions.attr('id'));\n this.editInstructions.show();\n }\n\n this.wrapper.attr('data-passwordunmask-visible', 1);\n\n this.editLink.hide();\n this.inputField\n .focus()\n .select();\n\n // Note, this cannot be added as a delegated listener on init because Firefox does not support the FocusOut\n // event (https://bugzilla.mozilla.org/show_bug.cgi?id=687787) and the blur event does not identify the\n // relatedTarget.\n // The act of focusing the this.inputField means that in Firefox the focusout will be triggered on blur of the edit\n // link anchor.\n $('body').on('focusout', this.wrapperSelector, $.proxy(this.checkFocusOut, this));\n\n return this;\n };\n\n /**\n * Disable the editing functionality, optionally focusing on the edit link.\n *\n * @method turnEditingOff\n * @param {Boolean} focusOnEditLink Whether to focus on the edit link after disabling the editor\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.turnEditingOff = function(focusOnEditLink) {\n $('body').off('focusout', this.wrapperSelector, this.checkFocusOut);\n var value = this.getDisplayValue();\n this.inputField\n // Hide the field again.\n .attr('type', 'hidden')\n\n // Ensure that the aria-describedby is removed.\n .attr('aria-describedby', null);\n this.inputField.val(value);\n\n this.editInstructions.hide();\n\n // Remove the visible attr.\n this.wrapper.removeAttr('data-passwordunmask-visible');\n\n // Remove the size attr.\n this.inputField.removeAttr('size');\n\n this.editLink.show();\n this.setDisplayValue();\n\n if (focusOnEditLink) {\n this.editLink.focus();\n }\n\n return this;\n };\n\n /**\n * Get the currently value.\n *\n * @method getDisplayValue\n * @return {String}\n */\n PasswordUnmask.prototype.getDisplayValue = function() {\n return this.inputField.val();\n };\n\n /**\n * Set the currently value in the display, taking into account the current settings.\n *\n * @method setDisplayValue\n * @return {PasswordUnmask}\n * @chainable\n */\n PasswordUnmask.prototype.setDisplayValue = function() {\n var value = this.getDisplayValue();\n if (this.isEditing()) {\n if (this.wrapper.data('unmasked')) {\n this.inputField.attr('type', 'text');\n } else {\n this.inputField.attr('type', 'password');\n }\n this.inputField.val(value);\n }\n\n // Update the display value.\n // Note: This must always be updated.\n // The unmask value can be changed whilst editing and the editing can then be disabled.\n if (value && this.wrapper.data('unmasked')) {\n // There is a value, and we will show it.\n this.displayValue.text(value);\n } else {\n if (!value) {\n value = \"\";\n }\n // There is a value, but it will be disguised.\n // We use the passwordunmask-fill to allow modification of the fill and to ensure that the display does not\n // change as the page loads the JS.\n Template.render('core_form/element-passwordunmask-fill', {\n element: {\n frozen: this.inputField.is('[readonly]'),\n value: value,\n valuechars: value.split(''),\n },\n }).done($.proxy(function(html, js) {\n this.displayValue.html(html);\n\n Template.runTemplateJS(js);\n }, this));\n }\n\n return this;\n };\n\n return PasswordUnmask;\n});\n"],"file":"passwordunmask.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/build/showadvanced.min.js.map b/lib/form/amd/build/showadvanced.min.js.map
index 02bef37add7..a6848402d17 100644
--- a/lib/form/amd/build/showadvanced.min.js.map
+++ b/lib/form/amd/build/showadvanced.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/showadvanced.js"],"names":["define","$","Log","Strings","Notification","SELECTORS","FIELDSETCONTAINSADVANCED","DIVFITEMADVANCED","DIVADVANCEDSECTION","DIVFCONTAINER","MORELESSLINK","CSS","SHOW","MORELESSACTIONS","MORELESSTOGGLER","SHOWLESS","WRAPPERS","FITEM","FELEMENT","ADVANCEDDIV","uniqIdSeed","ShowAdvanced","id","form","document","getElementById","enhanceForm","prototype","fieldsets","find","each","index","item","enhanceFieldset","bind","on","switchState","e","which","generateId","node","prop","fieldset","statuselement","length","debug","get_strings","key","component","then","results","showmore","showless","morelesslink","addClass","val","html","attr","idlist","formadvancedsection","wrapAll","fitem","felement","append","before","fail","exception","preventDefault","target","closest","toggleClass","removeClass","init","formid"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A class to help show and hide advanced form content.\n *\n * @module core_form/showadvanced\n * @class showadvanced\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/str', 'core/notification'], function($, Log, Strings, Notification) {\n\n var SELECTORS = {\n FIELDSETCONTAINSADVANCED: 'fieldset.containsadvancedelements',\n DIVFITEMADVANCED: 'div.fitem.advanced',\n DIVADVANCEDSECTION: 'div#form-advanced-div',\n DIVFCONTAINER: 'div.fcontainer',\n MORELESSLINK: 'fieldset.containsadvancedelements .moreless-toggler'\n },\n CSS = {\n SHOW: 'show',\n MORELESSACTIONS: 'moreless-actions',\n MORELESSTOGGLER: 'moreless-toggler',\n SHOWLESS: 'moreless-less'\n },\n WRAPPERS = {\n FITEM: '
',\n FELEMENT: '
',\n ADVANCEDDIV: '
'\n },\n IDPREFIX = 'showadvancedid-';\n\n /** @property {Integer} uniqIdSeed Auto incrementing number used to generate ids. */\n var uniqIdSeed = 0;\n\n /**\n * ShowAdvanced behaviour class.\n * @param {String} id The id of the form.\n */\n var ShowAdvanced = function(id) {\n this.id = id;\n\n var form = $(document.getElementById(id));\n this.enhanceForm(form);\n };\n\n /** @property {String} id The form id to enhance. */\n ShowAdvanced.prototype.id = '';\n\n /**\n * @method enhanceForm\n * @param {JQuery} form JQuery selector representing the form\n * @return {ShowAdvanced}\n */\n ShowAdvanced.prototype.enhanceForm = function(form) {\n var fieldsets = form.find(SELECTORS.FIELDSETCONTAINSADVANCED);\n\n // Enhance each fieldset in the form matching the selector.\n fieldsets.each(function(index, item) {\n this.enhanceFieldset($(item));\n }.bind(this));\n\n // Attach some event listeners.\n // Subscribe more/less links to click event.\n form.on('click', SELECTORS.MORELESSLINK, this.switchState);\n\n // Subscribe to key events but filter for space or enter.\n form.on('keydown', SELECTORS.MORELESSLINK, function(e) {\n // Enter or space.\n if (e.which == 13 || e.which == 32) {\n return this.switchState(e);\n }\n return true;\n }.bind(this));\n return this;\n };\n\n\n /**\n * Generates a uniq id for the dom element it's called on unless the element already has an id.\n * The id is set on the dom node before being returned.\n *\n * @method generateId\n * @param {JQuery} node JQuery selector representing a single DOM Node.\n * @return {String}\n */\n ShowAdvanced.prototype.generateId = function(node) {\n var id = node.prop('id');\n if (typeof id === 'undefined') {\n id = IDPREFIX + (uniqIdSeed++);\n node.prop('id', id);\n }\n return id;\n };\n\n /**\n * @method enhanceFieldset\n * @param {JQuery} fieldset JQuery selector representing a fieldset\n * @return {ShowAdvanced}\n */\n ShowAdvanced.prototype.enhanceFieldset = function(fieldset) {\n var statuselement = $('input[name=mform_showmore_' + fieldset.prop('id') + ']');\n if (!statuselement.length) {\n Log.debug(\"M.form.showadvanced::processFieldset was called on an fieldset without a status field: '\" +\n fieldset.prop('id') + \"'\");\n return this;\n }\n\n // Fetch some strings.\n Strings.get_strings([{\n key: 'showmore',\n component: 'core_form'\n }, {\n key: 'showless',\n component: 'core_form'\n }]).then(function(results) {\n var showmore = results[0],\n showless = results[1];\n\n // Generate more/less links.\n var morelesslink = $(' ');\n morelesslink.addClass(CSS.MORELESSTOGGLER);\n if (statuselement.val() === '0') {\n morelesslink.html(showmore);\n morelesslink.attr('aria-expanded', 'false');\n } else {\n morelesslink.html(showless);\n morelesslink.attr('aria-expanded', 'true');\n morelesslink.addClass(CSS.SHOWLESS);\n fieldset.find(SELECTORS.DIVFITEMADVANCED).addClass(CSS.SHOW);\n }\n // Build a list of advanced fieldsets.\n var idlist = [];\n fieldset.find(SELECTORS.DIVFITEMADVANCED).each(function(index, node) {\n idlist[idlist.length] = this.generateId($(node));\n }.bind(this));\n\n // Set aria attributes.\n morelesslink.attr('role', 'button');\n morelesslink.attr('aria-controls', 'form-advanced-div');\n\n var formadvancedsection = $(WRAPPERS.ADVANCEDDIV);\n fieldset.find(SELECTORS.DIVFITEMADVANCED).wrapAll(formadvancedsection);\n // Add elements to the DOM.\n var fitem = $(WRAPPERS.FITEM);\n fitem.addClass(CSS.MORELESSACTIONS);\n var felement = $(WRAPPERS.FELEMENT);\n felement.append(morelesslink);\n fitem.append(felement);\n\n fieldset.find(SELECTORS.DIVADVANCEDSECTION).before(fitem);\n return true;\n }.bind(this)).fail(Notification.exception);\n\n return this;\n };\n\n /**\n * @method switchState\n * @param {Event} e Event that triggered this action.\n * @return {Boolean}\n */\n ShowAdvanced.prototype.switchState = function(e) {\n e.preventDefault();\n\n // Fetch some strings.\n Strings.get_strings([{\n key: 'showmore',\n component: 'core_form'\n }, {\n key: 'showless',\n component: 'core_form'\n }]).then(function(results) {\n var showmore = results[0],\n showless = results[1],\n fieldset = $(e.target).closest(SELECTORS.FIELDSETCONTAINSADVANCED);\n\n // Toggle collapsed class.\n fieldset.find(SELECTORS.DIVFITEMADVANCED).toggleClass(CSS.SHOW);\n\n // Get corresponding hidden variable.\n var statuselement = $('input[name=mform_showmore_' + fieldset.prop('id') + ']');\n\n // Invert it and change the link text.\n if (statuselement.val() === '0') {\n statuselement.val(1);\n $(e.target).addClass(CSS.SHOWLESS);\n $(e.target).html(showless);\n $(e.target).attr('aria-expanded', 'true');\n } else {\n statuselement.val(0);\n $(e.target).removeClass(CSS.SHOWLESS);\n $(e.target).html(showmore);\n $(e.target).attr('aria-expanded', 'false');\n }\n return true;\n }).fail(Notification.exception);\n\n return this;\n };\n\n return {\n /**\n * Initialise this module.\n * @method init\n * @param {String} formid\n * @return {ShowAdvanced}\n */\n init: function(formid) {\n return new ShowAdvanced(formid);\n }\n };\n});\n"],"file":"showadvanced.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/showadvanced.js"],"names":["define","$","Log","Strings","Notification","SELECTORS","FIELDSETCONTAINSADVANCED","DIVFITEMADVANCED","DIVADVANCEDSECTION","DIVFCONTAINER","MORELESSLINK","CSS","SHOW","MORELESSACTIONS","MORELESSTOGGLER","SHOWLESS","WRAPPERS","FITEM","FELEMENT","ADVANCEDDIV","uniqIdSeed","ShowAdvanced","id","form","document","getElementById","enhanceForm","prototype","fieldsets","find","each","index","item","enhanceFieldset","bind","on","switchState","e","which","generateId","node","prop","fieldset","statuselement","length","debug","get_strings","key","component","then","results","showmore","showless","morelesslink","addClass","val","html","attr","idlist","formadvancedsection","wrapAll","fitem","felement","append","before","fail","exception","preventDefault","target","closest","toggleClass","removeClass","init","formid"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A class to help show and hide advanced form content.\n *\n * @module core_form/showadvanced\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/str', 'core/notification'], function($, Log, Strings, Notification) {\n\n var SELECTORS = {\n FIELDSETCONTAINSADVANCED: 'fieldset.containsadvancedelements',\n DIVFITEMADVANCED: 'div.fitem.advanced',\n DIVADVANCEDSECTION: 'div#form-advanced-div',\n DIVFCONTAINER: 'div.fcontainer',\n MORELESSLINK: 'fieldset.containsadvancedelements .moreless-toggler'\n },\n CSS = {\n SHOW: 'show',\n MORELESSACTIONS: 'moreless-actions',\n MORELESSTOGGLER: 'moreless-toggler',\n SHOWLESS: 'moreless-less'\n },\n WRAPPERS = {\n FITEM: '
',\n FELEMENT: '
',\n ADVANCEDDIV: '
'\n },\n IDPREFIX = 'showadvancedid-';\n\n /** @property {Integer} uniqIdSeed Auto incrementing number used to generate ids. */\n var uniqIdSeed = 0;\n\n /**\n * ShowAdvanced behaviour class.\n *\n * @class core_form/showadvanced\n * @param {String} id The id of the form.\n */\n var ShowAdvanced = function(id) {\n this.id = id;\n\n var form = $(document.getElementById(id));\n this.enhanceForm(form);\n };\n\n /** @property {String} id The form id to enhance. */\n ShowAdvanced.prototype.id = '';\n\n /**\n * @method enhanceForm\n * @param {JQuery} form JQuery selector representing the form\n * @return {ShowAdvanced}\n */\n ShowAdvanced.prototype.enhanceForm = function(form) {\n var fieldsets = form.find(SELECTORS.FIELDSETCONTAINSADVANCED);\n\n // Enhance each fieldset in the form matching the selector.\n fieldsets.each(function(index, item) {\n this.enhanceFieldset($(item));\n }.bind(this));\n\n // Attach some event listeners.\n // Subscribe more/less links to click event.\n form.on('click', SELECTORS.MORELESSLINK, this.switchState);\n\n // Subscribe to key events but filter for space or enter.\n form.on('keydown', SELECTORS.MORELESSLINK, function(e) {\n // Enter or space.\n if (e.which == 13 || e.which == 32) {\n return this.switchState(e);\n }\n return true;\n }.bind(this));\n return this;\n };\n\n\n /**\n * Generates a uniq id for the dom element it's called on unless the element already has an id.\n * The id is set on the dom node before being returned.\n *\n * @method generateId\n * @param {JQuery} node JQuery selector representing a single DOM Node.\n * @return {String}\n */\n ShowAdvanced.prototype.generateId = function(node) {\n var id = node.prop('id');\n if (typeof id === 'undefined') {\n id = IDPREFIX + (uniqIdSeed++);\n node.prop('id', id);\n }\n return id;\n };\n\n /**\n * @method enhanceFieldset\n * @param {JQuery} fieldset JQuery selector representing a fieldset\n * @return {ShowAdvanced}\n */\n ShowAdvanced.prototype.enhanceFieldset = function(fieldset) {\n var statuselement = $('input[name=mform_showmore_' + fieldset.prop('id') + ']');\n if (!statuselement.length) {\n Log.debug(\"M.form.showadvanced::processFieldset was called on an fieldset without a status field: '\" +\n fieldset.prop('id') + \"'\");\n return this;\n }\n\n // Fetch some strings.\n Strings.get_strings([{\n key: 'showmore',\n component: 'core_form'\n }, {\n key: 'showless',\n component: 'core_form'\n }]).then(function(results) {\n var showmore = results[0],\n showless = results[1];\n\n // Generate more/less links.\n var morelesslink = $(' ');\n morelesslink.addClass(CSS.MORELESSTOGGLER);\n if (statuselement.val() === '0') {\n morelesslink.html(showmore);\n morelesslink.attr('aria-expanded', 'false');\n } else {\n morelesslink.html(showless);\n morelesslink.attr('aria-expanded', 'true');\n morelesslink.addClass(CSS.SHOWLESS);\n fieldset.find(SELECTORS.DIVFITEMADVANCED).addClass(CSS.SHOW);\n }\n // Build a list of advanced fieldsets.\n var idlist = [];\n fieldset.find(SELECTORS.DIVFITEMADVANCED).each(function(index, node) {\n idlist[idlist.length] = this.generateId($(node));\n }.bind(this));\n\n // Set aria attributes.\n morelesslink.attr('role', 'button');\n morelesslink.attr('aria-controls', 'form-advanced-div');\n\n var formadvancedsection = $(WRAPPERS.ADVANCEDDIV);\n fieldset.find(SELECTORS.DIVFITEMADVANCED).wrapAll(formadvancedsection);\n // Add elements to the DOM.\n var fitem = $(WRAPPERS.FITEM);\n fitem.addClass(CSS.MORELESSACTIONS);\n var felement = $(WRAPPERS.FELEMENT);\n felement.append(morelesslink);\n fitem.append(felement);\n\n fieldset.find(SELECTORS.DIVADVANCEDSECTION).before(fitem);\n return true;\n }.bind(this)).fail(Notification.exception);\n\n return this;\n };\n\n /**\n * @method switchState\n * @param {Event} e Event that triggered this action.\n * @return {Boolean}\n */\n ShowAdvanced.prototype.switchState = function(e) {\n e.preventDefault();\n\n // Fetch some strings.\n Strings.get_strings([{\n key: 'showmore',\n component: 'core_form'\n }, {\n key: 'showless',\n component: 'core_form'\n }]).then(function(results) {\n var showmore = results[0],\n showless = results[1],\n fieldset = $(e.target).closest(SELECTORS.FIELDSETCONTAINSADVANCED);\n\n // Toggle collapsed class.\n fieldset.find(SELECTORS.DIVFITEMADVANCED).toggleClass(CSS.SHOW);\n\n // Get corresponding hidden variable.\n var statuselement = $('input[name=mform_showmore_' + fieldset.prop('id') + ']');\n\n // Invert it and change the link text.\n if (statuselement.val() === '0') {\n statuselement.val(1);\n $(e.target).addClass(CSS.SHOWLESS);\n $(e.target).html(showless);\n $(e.target).attr('aria-expanded', 'true');\n } else {\n statuselement.val(0);\n $(e.target).removeClass(CSS.SHOWLESS);\n $(e.target).html(showmore);\n $(e.target).attr('aria-expanded', 'false');\n }\n return true;\n }).fail(Notification.exception);\n\n return this;\n };\n\n return {\n /**\n * Initialise this module.\n * @method init\n * @param {String} formid\n * @return {ShowAdvanced}\n */\n init: function(formid) {\n return new ShowAdvanced(formid);\n }\n };\n});\n"],"file":"showadvanced.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/src/defaultcustom.js b/lib/form/amd/src/defaultcustom.js
index 67cafdac99a..bc0a2d5fe29 100644
--- a/lib/form/amd/src/defaultcustom.js
+++ b/lib/form/amd/src/defaultcustom.js
@@ -17,7 +17,6 @@
* Functionality for the form element defaultcustom
*
* @module core_form/defaultcustom
- * @class defaultcustom
* @copyright 2017 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.3
diff --git a/lib/form/amd/src/dynamicform.js b/lib/form/amd/src/dynamicform.js
index 49acfb5c4aa..c7ab32bb0b5 100644
--- a/lib/form/amd/src/dynamicform.js
+++ b/lib/form/amd/src/dynamicform.js
@@ -43,6 +43,9 @@ import Templates from 'core/templates';
import Y from 'core/yui';
import {get_strings as getStrings} from 'core/str';
+/**
+ * @class core_form/dynamicform
+ */
export default class DynamicForm {
/**
diff --git a/lib/form/amd/src/encryptedpassword.js b/lib/form/amd/src/encryptedpassword.js
index dd37dbe60db..a681d6787c8 100644
--- a/lib/form/amd/src/encryptedpassword.js
+++ b/lib/form/amd/src/encryptedpassword.js
@@ -17,7 +17,6 @@
* Encrypted password functionality.
*
* @module core_form/encryptedpassword
- * @class encryptedpassword
* @copyright 2019 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -25,6 +24,7 @@
/**
* Constructor for EncryptedPassword.
*
+ * @class core_form/encryptedpassword
* @param {String} elementId The element to apply the encrypted password JS to
*/
export const EncryptedPassword = function(elementId) {
diff --git a/lib/form/amd/src/events.js b/lib/form/amd/src/events.js
index f059453dc27..fc2658ea104 100644
--- a/lib/form/amd/src/events.js
+++ b/lib/form/amd/src/events.js
@@ -20,6 +20,14 @@
* @copyright 2021 Huong Nguyen
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.10
+ *
+ * @example Example of listening to a form event.
+ * import {eventTypes as formEventTypes} from 'core_form/events';
+ *
+ * document.addEventListener(formEventTypes.formSubmittedByJavascript, e => {
+ * window.console.log(e.target); // The form that was submitted.
+ * window.console.log(e.detail.skipValidation); // Whether form validation was skipped.
+ * });
*/
import {get_string as getString} from 'core/str';
@@ -65,8 +73,9 @@ export const eventTypes = {
* @event formSubmittedByJavascript
* @type {CustomEvent}
* @property {HTMLElement} target The form that was submitted
- * @property {Boolean} skipValidation Whether the form was submitted without validation (i.e. via a Cancel button)
- * @property {Boolean} fallbackHandled Whether the legacy YUI event has been handled
+ * @property {object} detail
+ * @property {boolean} detail.skipValidation Whether the form was submitted without validation (i.e. via a Cancel button)
+ * @property {boolean} detail.fallbackHandled Whether the legacy YUI event has been handled
*/
formSubmittedByJavascript: 'core_form/submittedByJavascript',
@@ -76,7 +85,8 @@ export const eventTypes = {
* @event formFieldValidationFailed
* @type {CustomEvent}
* @property {HTMLElement} target The field that failed validation
- * @property {String} message The message displayed upon failure
+ * @property {object} detail
+ * @property {String} detail.message The message displayed upon failure
*/
formFieldValidationFailed: 'core_form/fieldValidationFailed',
@@ -217,7 +227,7 @@ export const notifyUploadCompleted = elementId => {
* @param {String} elementId
* @returns {CustomEvent}
* @fires uploadStarted
- * @deprecated Since Moodle 4.0 See {@link notifyUploadStarted}
+ * @deprecated Since Moodle 4.0 See {@link module:core_form/events.notifyUploadStarted notifyUploadStarted}
*/
export const triggerUploadStarted = notifyUploadStarted;
@@ -228,14 +238,14 @@ export const triggerUploadStarted = notifyUploadStarted;
* @param {String} elementId
* @returns {CustomEvent}
* @fires uploadCompleted
- * @deprecated Since Moodle 4.0 See {@link notifyUploadCompleted}
+ * @deprecated Since Moodle 4.0 See {@link module:core_form/events.notifyUploadCompleted notifyUploadCompleted}
*/
export const triggerUploadCompleted = notifyUploadCompleted;
/**
* List of the events.
*
- * @deprecated since Moodle 4.0. See {@link eventTypes} instead.
+ * @deprecated since Moodle 4.0. See {@link module:core_form/events.eventTypes eventTypes} instead.
**/
export const types = {
uploadStarted: 'core_form/uploadStarted',
diff --git a/lib/form/amd/src/passwordunmask.js b/lib/form/amd/src/passwordunmask.js
index 884db7cf607..3cf7893b333 100644
--- a/lib/form/amd/src/passwordunmask.js
+++ b/lib/form/amd/src/passwordunmask.js
@@ -17,7 +17,6 @@
* Password Unmask functionality.
*
* @module core_form/passwordunmask
- * @class passwordunmask
* @copyright 2016 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.2
@@ -27,6 +26,7 @@ define(['jquery', 'core/templates'], function($, Template) {
/**
* Constructor for PasswordUnmask.
*
+ * @class core_form/passwordunmask
* @param {String} elementid The element to apply the PasswordUnmask to
*/
var PasswordUnmask = function(elementid) {
diff --git a/lib/form/amd/src/showadvanced.js b/lib/form/amd/src/showadvanced.js
index a7a6e9cb2c8..4579a75bf1a 100644
--- a/lib/form/amd/src/showadvanced.js
+++ b/lib/form/amd/src/showadvanced.js
@@ -17,7 +17,6 @@
* A class to help show and hide advanced form content.
*
* @module core_form/showadvanced
- * @class showadvanced
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -48,6 +47,8 @@ define(['jquery', 'core/log', 'core/str', 'core/notification'], function($, Log,
/**
* ShowAdvanced behaviour class.
+ *
+ * @class core_form/showadvanced
* @param {String} id The id of the form.
*/
var ShowAdvanced = function(id) {
diff --git a/lib/table/amd/build/local/dynamic/repository.min.js.map b/lib/table/amd/build/local/dynamic/repository.min.js.map
index 0dd30b2fb54..af7144fe64e 100644
--- a/lib/table/amd/build/local/dynamic/repository.min.js.map
+++ b/lib/table/amd/build/local/dynamic/repository.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../src/local/dynamic/repository.js"],"names":["fetch","component","handler","uniqueid","sortData","joinType","filters","firstinitial","lastinitial","pageNumber","pageSize","hiddenColumns","resetPreferences","methodname","args","sortdata","jointype","pagenumber","pagesize","hiddencolumns","resetpreferences"],"mappings":"yKA4CqB,QAARA,CAAAA,KAAQ,CAACC,CAAD,CAAYC,CAAZ,CAAqBC,CAArB,CASoB,8DAAjC,EAAiC,KARjCC,QAQiC,CARjCA,CAQiC,YARtB,EAQsB,OAPjCC,QAOiC,CAPjCA,CAOiC,YAPtB,IAOsB,OANjCC,OAMiC,CANjCA,CAMiC,YANvB,EAMuB,OALjCC,YAKiC,CALjCA,CAKiC,YALlB,IAKkB,OAJjCC,WAIiC,CAJjCA,CAIiC,YAJnB,IAImB,OAHjCC,UAGiC,CAHjCA,CAGiC,YAHpB,IAGoB,OAFjCC,QAEiC,CAFjCA,CAEiC,YAFtB,IAEsB,OADjCC,aACiC,CADjCA,CACiC,YADjB,EACiB,GAA7BC,CAA6B,2DACrC,MAAO,WAAU,CAAC,CACdC,UAAU,uCADI,CAEdC,IAAI,CAAE,CACFb,SAAS,CAATA,CADE,CAEFC,OAAO,CAAPA,CAFE,CAGFC,QAAQ,CAARA,CAHE,CAIFY,QAAQ,CAAEX,CAJR,CAKFY,QAAQ,CAAEX,CALR,CAMFC,OAAO,CAAPA,CANE,CAOFC,YAAY,CAAZA,CAPE,CAQFC,WAAW,CAAXA,CARE,CASFS,UAAU,CAAER,CATV,CAUFS,QAAQ,CAAER,CAVR,CAWFS,aAAa,CAAER,CAXb,CAYFS,gBAAgB,CAAER,CAZhB,CAFQ,CAAD,CAAV,EAgBH,CAhBG,CAiBV,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @class repository\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\n\n/**\n * Fetch table view.\n *\n * @method fetch\n * @param {String} component The component\n * @param {String} handler The name of the handler\n * @param {String} uniqueid The unique id of the table\n * @param {Object} options The options to use when updating the table\n * @param {Array} options.sortData The list of columns to sort by\n * @param {Number} options.joinType The filterset join type\n * @param {Object} options.filters The filters to apply when searching\n * @param {String} options.firstinitial The first name initial to filter on\n * @param {String} options.lastinitial The last name initial to filter on\n * @param {String} options.pageNumber The page number\n * @param {Number} options.pageSize The page size\n * @param {Object} options.hiddenColumns The columns to hide\n * @param {Bool} resetPreferences\n * @return {Promise} Resolved with requested table view\n */\nexport const fetch = (component, handler, uniqueid, {\n sortData = [],\n joinType = null,\n filters = {},\n firstinitial = null,\n lastinitial = null,\n pageNumber = null,\n pageSize = null,\n hiddenColumns = {}\n } = {}, resetPreferences = false) => {\n return fetchMany([{\n methodname: `core_table_get_dynamic_table_content`,\n args: {\n component,\n handler,\n uniqueid,\n sortdata: sortData,\n jointype: joinType,\n filters,\n firstinitial,\n lastinitial,\n pagenumber: pageNumber,\n pagesize: pageSize,\n hiddencolumns: hiddenColumns,\n resetpreferences: resetPreferences\n },\n }])[0];\n};\n"],"file":"repository.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../../../src/local/dynamic/repository.js"],"names":["fetch","component","handler","uniqueid","sortData","joinType","filters","firstinitial","lastinitial","pageNumber","pageSize","hiddenColumns","resetPreferences","methodname","args","sortdata","jointype","pagenumber","pagesize","hiddencolumns","resetpreferences"],"mappings":"yKA2CqB,QAARA,CAAAA,KAAQ,CAACC,CAAD,CAAYC,CAAZ,CAAqBC,CAArB,+DASjB,EATiB,KACjBC,QADiB,CACjBA,CADiB,YACN,EADM,OAEjBC,QAFiB,CAEjBA,CAFiB,YAEN,IAFM,OAGjBC,OAHiB,CAGjBA,CAHiB,YAGP,EAHO,OAIjBC,YAJiB,CAIjBA,CAJiB,YAIF,IAJE,OAKjBC,WALiB,CAKjBA,CALiB,YAKH,IALG,OAMjBC,UANiB,CAMjBA,CANiB,YAMJ,IANI,OAOjBC,QAPiB,CAOjBA,CAPiB,YAON,IAPM,OAQjBC,aARiB,CAQjBA,CARiB,YAQD,EARC,GASbC,CATa,iEASgB,WAAU,CAAC,CAC5CC,UAAU,uCADkC,CAE5CC,IAAI,CAAE,CACFb,SAAS,CAATA,CADE,CAEFC,OAAO,CAAPA,CAFE,CAGFC,QAAQ,CAARA,CAHE,CAIFY,QAAQ,CAAEX,CAJR,CAKFY,QAAQ,CAAEX,CALR,CAMFC,OAAO,CAAPA,CANE,CAOFC,YAAY,CAAZA,CAPE,CAQFC,WAAW,CAAXA,CARE,CASFS,UAAU,CAAER,CATV,CAUFS,QAAQ,CAAER,CAVR,CAWFS,aAAa,CAAER,CAXb,CAYFS,gBAAgB,CAAER,CAZhB,CAFsC,CAAD,CAAV,EAgBjC,CAhBiC,CAThB,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * A javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\n\n/**\n * Fetch table view.\n *\n * @method fetch\n * @param {String} component The component\n * @param {String} handler The name of the handler\n * @param {String} uniqueid The unique id of the table\n * @param {Object} options The options to use when updating the table\n * @param {Array} options.sortData The list of columns to sort by\n * @param {Number} options.joinType The filterset join type\n * @param {Object} options.filters The filters to apply when searching\n * @param {String} options.firstinitial The first name initial to filter on\n * @param {String} options.lastinitial The last name initial to filter on\n * @param {String} options.pageNumber The page number\n * @param {Number} options.pageSize The page size\n * @param {Object} options.hiddenColumns The columns to hide\n * @param {Bool} resetPreferences\n * @return {Promise} Resolved with requested table view\n */\nexport const fetch = (component, handler, uniqueid, {\n sortData = [],\n joinType = null,\n filters = {},\n firstinitial = null,\n lastinitial = null,\n pageNumber = null,\n pageSize = null,\n hiddenColumns = {}\n} = {}, resetPreferences = false) => fetchMany([{\n methodname: `core_table_get_dynamic_table_content`,\n args: {\n component,\n handler,\n uniqueid,\n sortdata: sortData,\n jointype: joinType,\n filters,\n firstinitial,\n lastinitial,\n pagenumber: pageNumber,\n pagesize: pageSize,\n hiddencolumns: hiddenColumns,\n resetpreferences: resetPreferences\n },\n}])[0];\n"],"file":"repository.min.js"}
\ No newline at end of file
diff --git a/lib/table/amd/src/local/dynamic/repository.js b/lib/table/amd/src/local/dynamic/repository.js
index c86f30e22fc..371bc5418a0 100644
--- a/lib/table/amd/src/local/dynamic/repository.js
+++ b/lib/table/amd/src/local/dynamic/repository.js
@@ -17,7 +17,6 @@
* A javascript module to handle calendar ajax actions.
*
* @module core_calendar/repository
- * @class repository
* @copyright 2017 Simey Lameze
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -43,30 +42,28 @@ import {call as fetchMany} from 'core/ajax';
* @return {Promise} Resolved with requested table view
*/
export const fetch = (component, handler, uniqueid, {
- sortData = [],
- joinType = null,
- filters = {},
- firstinitial = null,
- lastinitial = null,
- pageNumber = null,
- pageSize = null,
- hiddenColumns = {}
- } = {}, resetPreferences = false) => {
- return fetchMany([{
- methodname: `core_table_get_dynamic_table_content`,
- args: {
- component,
- handler,
- uniqueid,
- sortdata: sortData,
- jointype: joinType,
- filters,
- firstinitial,
- lastinitial,
- pagenumber: pageNumber,
- pagesize: pageSize,
- hiddencolumns: hiddenColumns,
- resetpreferences: resetPreferences
- },
- }])[0];
-};
+ sortData = [],
+ joinType = null,
+ filters = {},
+ firstinitial = null,
+ lastinitial = null,
+ pageNumber = null,
+ pageSize = null,
+ hiddenColumns = {}
+} = {}, resetPreferences = false) => fetchMany([{
+ methodname: `core_table_get_dynamic_table_content`,
+ args: {
+ component,
+ handler,
+ uniqueid,
+ sortdata: sortData,
+ jointype: joinType,
+ filters,
+ firstinitial,
+ lastinitial,
+ pagenumber: pageNumber,
+ pagesize: pageSize,
+ hiddencolumns: hiddenColumns,
+ resetpreferences: resetPreferences
+ },
+}])[0];
diff --git a/message/amd/build/message_notification_preference.min.js.map b/message/amd/build/message_notification_preference.min.js.map
index 9325132f52c..f326d8d2b7d 100644
--- a/message/amd/build/message_notification_preference.min.js.map
+++ b/message/amd/build/message_notification_preference.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/message_notification_preference.js"],"names":["define","$","NotificationPreference","SELECTORS","PREFERENCE_KEY","MessageNotificationPreference","element","userId","call","prototype","Object","create","constructor","getPreferenceKey","root","find","attr"],"mappings":"AAwBAA,OAAM,gDAAC,CAAC,QAAD,CAAW,sCAAX,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAoC,IAEpCC,CAAAA,CAAS,CAAG,CACZC,cAAc,CAAE,uBADJ,CAFwB,CAYpCC,CAA6B,CAAG,SAASC,CAAT,CAAkBC,CAAlB,CAA0B,CAC1DL,CAAsB,CAACM,IAAvB,CAA4B,IAA5B,CAAkCF,CAAlC,CAA2CC,CAA3C,CACH,CAduC,CAmBxCF,CAA6B,CAACI,SAA9B,CAA0CC,MAAM,CAACC,MAAP,CAAcT,CAAsB,CAACO,SAArC,CAA1C,CAKAJ,CAA6B,CAACI,SAA9B,CAAwCG,WAAxC,CAAsDP,CAAtD,CAQAA,CAA6B,CAACI,SAA9B,CAAwCI,gBAAxC,CAA2D,UAAW,CAClE,MAAO,MAAKC,IAAL,CAAUC,IAAV,CAAeZ,CAAS,CAACC,cAAzB,EAAyCY,IAAzC,CAA8C,qBAA9C,CACV,CAFD,CAIA,MAAOX,CAAAA,CACV,CAtCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the preference for an individual notification type on the\n * message preference page.\n *\n * @module core_message/message_notification_preference\n * @class message_notification_preference\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core_message/notification_preference'],\n function($, NotificationPreference) {\n\n var SELECTORS = {\n PREFERENCE_KEY: '[data-preference-key]',\n };\n\n /**\n * Constructor for the Preference.\n *\n * @param {object} element jQuery object root element of the preference\n * @param {int} userId The current user id\n */\n var MessageNotificationPreference = function(element, userId) {\n NotificationPreference.call(this, element, userId);\n };\n\n /**\n * Clone the parent prototype.\n */\n MessageNotificationPreference.prototype = Object.create(NotificationPreference.prototype);\n\n /**\n * Set constructor.\n */\n MessageNotificationPreference.prototype.constructor = MessageNotificationPreference;\n\n /**\n * Get the unique prefix key that identifies this user preference.\n *\n * @method getPreferenceKey\n * @return {string}\n */\n MessageNotificationPreference.prototype.getPreferenceKey = function() {\n return this.root.find(SELECTORS.PREFERENCE_KEY).attr('data-preference-key');\n };\n\n return MessageNotificationPreference;\n});\n"],"file":"message_notification_preference.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/message_notification_preference.js"],"names":["define","$","NotificationPreference","SELECTORS","PREFERENCE_KEY","MessageNotificationPreference","element","userId","call","prototype","Object","create","constructor","getPreferenceKey","root","find","attr"],"mappings":"AAuBAA,OAAM,gDAAC,CAAC,QAAD,CAAW,sCAAX,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAoC,IAEpCC,CAAAA,CAAS,CAAG,CACZC,cAAc,CAAE,uBADJ,CAFwB,CAapCC,CAA6B,CAAG,SAASC,CAAT,CAAkBC,CAAlB,CAA0B,CAC1DL,CAAsB,CAACM,IAAvB,CAA4B,IAA5B,CAAkCF,CAAlC,CAA2CC,CAA3C,CACH,CAfuC,CAoBxCF,CAA6B,CAACI,SAA9B,CAA0CC,MAAM,CAACC,MAAP,CAAcT,CAAsB,CAACO,SAArC,CAA1C,CAKAJ,CAA6B,CAACI,SAA9B,CAAwCG,WAAxC,CAAsDP,CAAtD,CAQAA,CAA6B,CAACI,SAA9B,CAAwCI,gBAAxC,CAA2D,UAAW,CAClE,MAAO,MAAKC,IAAL,CAAUC,IAAV,CAAeZ,CAAS,CAACC,cAAzB,EAAyCY,IAAzC,CAA8C,qBAA9C,CACV,CAFD,CAIA,MAAOX,CAAAA,CACV,CAvCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the preference for an individual notification type on the\n * message preference page.\n *\n * @module core_message/message_notification_preference\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core_message/notification_preference'],\n function($, NotificationPreference) {\n\n var SELECTORS = {\n PREFERENCE_KEY: '[data-preference-key]',\n };\n\n /**\n * Constructor for the Preference.\n *\n * @class\n * @param {object} element jQuery object root element of the preference\n * @param {int} userId The current user id\n */\n var MessageNotificationPreference = function(element, userId) {\n NotificationPreference.call(this, element, userId);\n };\n\n /**\n * Clone the parent prototype.\n */\n MessageNotificationPreference.prototype = Object.create(NotificationPreference.prototype);\n\n /**\n * Set constructor.\n */\n MessageNotificationPreference.prototype.constructor = MessageNotificationPreference;\n\n /**\n * Get the unique prefix key that identifies this user preference.\n *\n * @method getPreferenceKey\n * @return {string}\n */\n MessageNotificationPreference.prototype.getPreferenceKey = function() {\n return this.root.find(SELECTORS.PREFERENCE_KEY).attr('data-preference-key');\n };\n\n return MessageNotificationPreference;\n});\n"],"file":"message_notification_preference.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/message_preferences.min.js.map b/message/amd/build/message_preferences.min.js.map
index 776988794a4..0151b1e4ff3 100644
--- a/message/amd/build/message_preferences.min.js.map
+++ b/message/amd/build/message_preferences.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/message_preferences.js"],"names":["define","$","Ajax","Notification","MessageNotificationPreference","CustomEvents","SELECTORS","PREFERENCE","PREFERENCES_CONTAINER","CONTACTABLE_PRIVACY_CONTAINER","MessagePreferences","element","root","userId","find","attr","registerEventListeners","prototype","preferencesDisabled","hasClass","saveContactablePrivacySetting","container","value","val","Deferred","resolve","addClass","request","methodname","args","userid","preferences","type","call","fail","exception","always","removeClass","events","activate","on","e","target","name","preferencesContainer","closest","preferenceElement","messagePreference","save","bind"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the message preference page.\n *\n * @module core_message/message_preferences\n * @class message_preferences\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification',\n 'core_message/message_notification_preference', 'core/custom_interaction_events'],\n function($, Ajax, Notification, MessageNotificationPreference, CustomEvents) {\n\n var SELECTORS = {\n PREFERENCE: '[data-state]',\n PREFERENCES_CONTAINER: '[data-region=\"preferences-container\"]',\n CONTACTABLE_PRIVACY_CONTAINER: '[data-region=\"privacy-setting-container\"]',\n };\n\n /**\n * Constructor for the MessagePreferences.\n *\n * @param {object} element The root element for the message preferences\n */\n var MessagePreferences = function(element) {\n this.root = $(element);\n this.userId = this.root.find(SELECTORS.PREFERENCES_CONTAINER).attr('data-user-id');\n\n this.registerEventListeners();\n };\n\n /**\n * Check if the preferences have been disabled on this page.\n *\n * @method preferencesDisabled\n * @return {bool}\n */\n MessagePreferences.prototype.preferencesDisabled = function() {\n return this.root.find(SELECTORS.PREFERENCES_CONTAINER).hasClass('disabled');\n };\n\n /**\n * Update the contactable privacy user preference in the DOM and\n * send a request to update on the server.\n *\n * @return {Promise}\n * @method saveContactablePrivacySetting\n */\n MessagePreferences.prototype.saveContactablePrivacySetting = function() {\n var container = this.root.find(SELECTORS.CONTACTABLE_PRIVACY_CONTAINER);\n var value = $(\"input[type='radio']:checked\").val();\n\n if (container.hasClass('loading')) {\n return $.Deferred().resolve();\n }\n\n container.addClass('loading');\n\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n userid: this.userId,\n preferences: [\n {\n type: container.attr('data-preference-key'),\n value: value,\n }\n ]\n }\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n container.removeClass('loading');\n });\n };\n\n /**\n * Create all of the event listeners for the message preferences page.\n *\n * @method registerEventListeners\n */\n MessagePreferences.prototype.registerEventListeners = function() {\n CustomEvents.define(this.root, [\n CustomEvents.events.activate\n ]);\n\n this.root.on('change', function(e) {\n // Add listener for privacy setting radio buttons change.\n if (e.target.name == 'message_blocknoncontacts') {\n this.saveContactablePrivacySetting();\n } else {\n // Add listener for processor preferences.\n if (!this.preferencesDisabled()) {\n var preferencesContainer = $(e.target).closest(SELECTORS.PREFERENCES_CONTAINER);\n var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE);\n var messagePreference = new MessageNotificationPreference(preferencesContainer, this.userId);\n\n preferenceElement.addClass('loading');\n messagePreference.save().always(function() {\n preferenceElement.removeClass('loading');\n });\n }\n }\n }.bind(this));\n };\n\n return MessagePreferences;\n});\n"],"file":"message_preferences.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/message_preferences.js"],"names":["define","$","Ajax","Notification","MessageNotificationPreference","CustomEvents","SELECTORS","PREFERENCE","PREFERENCES_CONTAINER","CONTACTABLE_PRIVACY_CONTAINER","MessagePreferences","element","root","userId","find","attr","registerEventListeners","prototype","preferencesDisabled","hasClass","saveContactablePrivacySetting","container","value","val","Deferred","resolve","addClass","request","methodname","args","userid","preferences","type","call","fail","exception","always","removeClass","events","activate","on","e","target","name","preferencesContainer","closest","preferenceElement","messagePreference","save","bind"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the message preference page.\n *\n * @module core_message/message_preferences\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification',\n 'core_message/message_notification_preference', 'core/custom_interaction_events'],\n function($, Ajax, Notification, MessageNotificationPreference, CustomEvents) {\n\n var SELECTORS = {\n PREFERENCE: '[data-state]',\n PREFERENCES_CONTAINER: '[data-region=\"preferences-container\"]',\n CONTACTABLE_PRIVACY_CONTAINER: '[data-region=\"privacy-setting-container\"]',\n };\n\n /**\n * Constructor for the MessagePreferences.\n *\n * @class\n * @param {object} element The root element for the message preferences\n */\n var MessagePreferences = function(element) {\n this.root = $(element);\n this.userId = this.root.find(SELECTORS.PREFERENCES_CONTAINER).attr('data-user-id');\n\n this.registerEventListeners();\n };\n\n /**\n * Check if the preferences have been disabled on this page.\n *\n * @method preferencesDisabled\n * @return {bool}\n */\n MessagePreferences.prototype.preferencesDisabled = function() {\n return this.root.find(SELECTORS.PREFERENCES_CONTAINER).hasClass('disabled');\n };\n\n /**\n * Update the contactable privacy user preference in the DOM and\n * send a request to update on the server.\n *\n * @return {Promise}\n * @method saveContactablePrivacySetting\n */\n MessagePreferences.prototype.saveContactablePrivacySetting = function() {\n var container = this.root.find(SELECTORS.CONTACTABLE_PRIVACY_CONTAINER);\n var value = $(\"input[type='radio']:checked\").val();\n\n if (container.hasClass('loading')) {\n return $.Deferred().resolve();\n }\n\n container.addClass('loading');\n\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n userid: this.userId,\n preferences: [\n {\n type: container.attr('data-preference-key'),\n value: value,\n }\n ]\n }\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n container.removeClass('loading');\n });\n };\n\n /**\n * Create all of the event listeners for the message preferences page.\n *\n * @method registerEventListeners\n */\n MessagePreferences.prototype.registerEventListeners = function() {\n CustomEvents.define(this.root, [\n CustomEvents.events.activate\n ]);\n\n this.root.on('change', function(e) {\n // Add listener for privacy setting radio buttons change.\n if (e.target.name == 'message_blocknoncontacts') {\n this.saveContactablePrivacySetting();\n } else {\n // Add listener for processor preferences.\n if (!this.preferencesDisabled()) {\n var preferencesContainer = $(e.target).closest(SELECTORS.PREFERENCES_CONTAINER);\n var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE);\n var messagePreference = new MessageNotificationPreference(preferencesContainer, this.userId);\n\n preferenceElement.addClass('loading');\n messagePreference.save().always(function() {\n preferenceElement.removeClass('loading');\n });\n }\n }\n }.bind(this));\n };\n\n return MessagePreferences;\n});\n"],"file":"message_preferences.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/message_repository.min.js.map b/message/amd/build/message_repository.min.js.map
index e430a7a8aad..ad4e02a0696 100644
--- a/message/amd/build/message_repository.min.js.map
+++ b/message/amd/build/message_repository.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/message_repository.js"],"names":["define","$","Ajax","Notification","Constants","CONVERSATION_TYPES","sendMessagesToUser","toUserId","messages","formattedMessages","map","message","touserid","text","call","methodname","args","then","results","errors","reduce","carry","result","errormessage","push","length","Error","join","id","msgid","timecreated","useridfrom","conversationid","candeletemessagesforallusers","sendMessagesToConversation","conversationId","countUnreadConversations","promise","fail","exception","getContacts","userId","limit","offset","userid","limitnum","limitfrom","blockUser","blockedUserId","when","apply","blockeduserid","referenceuserid","userids","includecontactrequests","includeprivacyinfo","reponse1","profiles","unblockUser","unblockedUserId","unblockeduserid","createContactRequest","requestUserIds","requesteduserid","deleteContacts","contactUserIds","response1","getMessages","currentUserId","newestFirst","timeFrom","currentuserid","convid","newest","timefrom","searchUsers","searchString","search","searchMessages","sendMessageToUser","sendMessageToConversation","savePreferences","preferences","getPreferences","deleteMessages","messageIds","messageId","messageid","deleteMessagesForAllUsers","deleteConversation","conversationids","getContactRequests","acceptContactRequest","sendingUserId","recipientUserId","declineContactRequest","getConversation","loggedInUserId","includeContactRequests","includePrivacyInfo","memberLimit","memberOffset","messageLimit","messageOffset","newestMessagesFirst","memberlimit","memberoffset","messagelimit","messageoffset","newestmessagesfirst","getConversationBetweenUsers","otherUserId","otheruserid","getSelfConversation","getConversations","type","favourites","mergeself","conversations","conversation","PRIVATE","SELF","otherUser","members","name","fullname","imageurl","profileimageurl","getConversationMembers","setFavouriteConversations","conversationIds","setMutedConversations","unsetFavouriteConversations","unsetMutedConversations","getMemberInfo","referenceUserId","userIds","markAllConversationMessagesAsRead","getUserMessagePreferences","getTotalConversationCounts","getUnreadConversationCounts","getAllConversationCounts","total","unread"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Retrieves messages from the server.\n *\n * @module core_message/message_repository\n * @class message_repository\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core_message/message_drawer_view_conversation_constants'\n], function(\n $,\n Ajax,\n Notification,\n Constants) {\n\n var CONVERSATION_TYPES = Constants.CONVERSATION_TYPES;\n\n /**\n * Count the number of unread conversations (one or more messages from a user)\n * for a given user.\n *\n * @param {object} args The request arguments:\n * @return {object} jQuery promise\n */\n var countUnreadConversations = function(args) {\n var request = {\n methodname: 'core_message_get_unread_conversations_count',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Get contacts for given user.\n *\n * @param {int} userId The user id\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @return {object} jQuery promise\n */\n var getContacts = function(userId, limit, offset) {\n var args = {\n userid: userId\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n var request = {\n methodname: 'core_message_get_user_contacts',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Block a user.\n *\n * @param {int} userId The requesting user\n * @param {int} blockedUserId Id of user to block\n * @return {object} jQuery promise\n */\n var blockUser = function(userId, blockedUserId) {\n var requests = [\n {\n methodname: 'core_message_block_user',\n args: {\n userid: userId,\n blockeduserid: blockedUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: userId,\n userids: [blockedUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Unblock a user.\n *\n * @param {int} userId The requesting user\n * @param {int} unblockedUserId Id of user to unblock\n * @return {object} jQuery promise\n */\n var unblockUser = function(userId, unblockedUserId) {\n var requests = [\n {\n methodname: 'core_message_unblock_user',\n args: {\n userid: userId,\n unblockeduserid: unblockedUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: userId,\n userids: [unblockedUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Create a request to add a user as a contact.\n *\n * @param {int} userId The requesting user\n * @param {int[]} requestUserIds List of user ids to add\n * @return {object} jQuery promise\n */\n var createContactRequest = function(userId, requestUserIds) {\n var request = {\n methodname: 'core_message_create_contact_request',\n args: {\n userid: userId,\n requesteduserid: requestUserIds\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Remove a list of users as contacts.\n *\n * @param {int} userId The requesting user\n * @param {int[]} contactUserIds List of user ids to add\n * @return {object} jQuery promise\n */\n var deleteContacts = function(userId, contactUserIds) {\n var requests = [\n {\n methodname: 'core_message_delete_contacts',\n args: {\n userid: userId,\n userids: contactUserIds\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: userId,\n userids: contactUserIds,\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n return $.when.apply(null, Ajax.call(requests)).then(function(response1, profiles) {\n // Return all of the profiles as an array.\n return profiles;\n });\n };\n\n /**\n * Get messages between two users.\n *\n * @param {int} currentUserId The requesting user\n * @param {int} conversationId Other user in the conversation\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @param {bool} newestFirst Order results by newest first\n * @param {int} timeFrom Only return messages after this timestamp\n * @return {object} jQuery promise\n */\n var getMessages = function(currentUserId, conversationId, limit, offset, newestFirst, timeFrom) {\n var args = {\n currentuserid: currentUserId,\n convid: conversationId,\n newest: newestFirst ? true : false\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n if (typeof timeFrom !== 'undefined') {\n args.timefrom = timeFrom;\n }\n\n var request = {\n methodname: 'core_message_get_conversation_messages',\n args: args\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Search for users.\n *\n * @param {int} userId The requesting user\n * @param {string} searchString Search string\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @return {object} jQuery promise\n */\n var searchUsers = function(userId, searchString, limit, offset) {\n var args = {\n userid: userId,\n search: searchString\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n var request = {\n methodname: 'core_message_message_search_users',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Search for messages.\n *\n * @param {int} userId The requesting user\n * @param {string} searchString Search string\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @return {object} jQuery promise\n */\n var searchMessages = function(userId, searchString, limit, offset) {\n var args = {\n userid: userId,\n search: searchString\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n var request = {\n methodname: 'core_message_data_for_messagearea_search_messages',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Send a list of messages to a user.\n *\n * @param {int} toUserId The recipient user id\n * @param {string[]} messages List of messages to send\n * @return {object} jQuery promise\n */\n var sendMessagesToUser = function(toUserId, messages) {\n var formattedMessages = messages.map(function(message) {\n return {\n touserid: toUserId,\n text: message\n };\n });\n var request = {\n methodname: 'core_message_send_instant_messages',\n args: {\n messages: formattedMessages\n }\n };\n\n return Ajax.call([request])[0]\n .then(function(results) {\n // Error handling for the weird way the old function works.\n var errors = results.reduce(function(carry, result) {\n if (result.errormessage) {\n carry.push(result.errormessage);\n }\n\n return carry;\n }, []);\n if (errors.length) {\n throw new Error(errors.join(\"\\n\"));\n }\n\n return results;\n })\n .then(function(results) {\n // Format the results to match the other send message function.\n return results.map(function(result) {\n return {\n id: result.msgid,\n text: result.text,\n timecreated: result.timecreated,\n useridfrom: result.useridfrom,\n conversationid: result.conversationid,\n candeletemessagesforallusers: result.candeletemessagesforallusers\n };\n });\n });\n };\n\n /**\n * Send a single message to a user.\n *\n * @param {int} toUserId The recipient user id\n * @param {string} text The message text\n * @return {object} jQuery promise\n */\n var sendMessageToUser = function(toUserId, text) {\n return sendMessagesToUser(toUserId, [text])\n .then(function(results) {\n return results[0];\n });\n };\n\n /**\n * Send messages to a conversation.\n *\n * @param {int} conversationId The conversation id\n * @param {string[]} messages List of messages to send\n * @return {object} jQuery promise\n */\n var sendMessagesToConversation = function(conversationId, messages) {\n var formattedMessages = messages.map(function(message) {\n return {\n text: message\n };\n });\n var request = {\n methodname: 'core_message_send_messages_to_conversation',\n args: {\n conversationid: conversationId,\n messages: formattedMessages\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Send a message to a conversation.\n *\n * @param {int} conversationId The conversation id\n * @param {string} text The message text\n * @return {object} jQuery promise\n */\n var sendMessageToConversation = function(conversationId, text) {\n return sendMessagesToConversation(conversationId, [text])\n .then(function(result) {\n return result[0];\n });\n };\n\n /**\n * Save message preferences.\n *\n * @param {int} userId The owner of the preferences\n * @param {object[]} preferences New preferences values\n * @return {object} jQuery promise\n */\n var savePreferences = function(userId, preferences) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n userid: userId,\n preferences: preferences\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the user's preferences.\n *\n * @param {int} userId The target user\n * @return {object} jQuery promise\n */\n var getPreferences = function(userId) {\n var request = {\n methodname: 'core_user_get_user_preferences',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Delete a list of messages.\n *\n * @param {int} userId The user to delete messages for\n * @param {int[]} messageIds List of message ids to delete\n * @return {object} jQuery promise\n */\n var deleteMessages = function(userId, messageIds) {\n return $.when.apply(null, Ajax.call(messageIds.map(function(messageId) {\n return {\n methodname: 'core_message_delete_message',\n args: {\n messageid: messageId,\n userid: userId\n }\n };\n })));\n };\n\n /**\n * Delete a list of messages for all users.\n *\n * @param {int} userId The user to delete messages for\n * @param {int[]} messageIds List of message ids to delete\n * @return {object} jQuery promise\n */\n var deleteMessagesForAllUsers = function(userId, messageIds) {\n return $.when.apply(null, Ajax.call(messageIds.map(function(messageId) {\n return {\n methodname: 'core_message_delete_message_for_all_users',\n args: {\n messageid: messageId,\n userid: userId\n }\n };\n })));\n };\n\n /**\n * Delete a conversation between two users.\n *\n * @param {int} userId The user to delete messages for\n * @param {int} conversationId The id of the conversation\n * @return {object} jQuery promise\n */\n var deleteConversation = function(userId, conversationId) {\n var request = {\n methodname: 'core_message_delete_conversations_by_id',\n args: {\n userid: userId,\n conversationids: [conversationId]\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the list of contact requests for a user.\n *\n * @param {int} userId The user id\n * @return {object} jQuery promise\n */\n var getContactRequests = function(userId) {\n var request = {\n methodname: 'core_message_get_contact_requests',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Accept a contact request.\n *\n * @param {int} sendingUserId The user that sent the request\n * @param {int} recipientUserId The user that received the request\n * @return {object} jQuery promise\n */\n var acceptContactRequest = function(sendingUserId, recipientUserId) {\n var requests = [\n {\n methodname: 'core_message_confirm_contact_request',\n args: {\n userid: sendingUserId,\n requesteduserid: recipientUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: recipientUserId,\n userids: [sendingUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Decline a contact request.\n *\n * @param {int} sendingUserId The user that sent the request\n * @param {int} recipientUserId The user that received the request\n * @return {object} jQuery promise\n */\n var declineContactRequest = function(sendingUserId, recipientUserId) {\n var requests = [\n {\n methodname: 'core_message_decline_contact_request',\n args: {\n userid: sendingUserId,\n requesteduserid: recipientUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: recipientUserId,\n userids: [sendingUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Get a conversation.\n *\n * @param {int} loggedInUserId The logged in user\n * @param {int} conversationId The conversation id\n * @param {bool} includeContactRequests Incldue contact requests between members\n * @param {bool} includePrivacyInfo Include privacy info for members\n * @param {int} memberLimit Limit for members\n * @param {int} memberOffset Offset for members\n * @param {int} messageLimit Limit for messages\n * @param {int} messageOffset Offset for messages\n * @param {bool} newestMessagesFirst Order the messages by newest first\n * @return {object} jQuery promise\n */\n var getConversation = function(\n loggedInUserId,\n conversationId,\n includeContactRequests,\n includePrivacyInfo,\n memberLimit,\n memberOffset,\n messageLimit,\n messageOffset,\n newestMessagesFirst\n ) {\n var args = {\n userid: loggedInUserId,\n conversationid: conversationId\n };\n\n if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {\n args.includecontactrequests = includeContactRequests;\n }\n\n if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {\n args.includeprivacyinfo = includePrivacyInfo;\n }\n\n if (typeof memberLimit != 'undefined' && memberLimit !== null) {\n args.memberlimit = memberLimit;\n }\n\n if (typeof memberOffset != 'undefined' && memberOffset !== null) {\n args.memberoffset = memberOffset;\n }\n\n if (typeof messageLimit != 'undefined' && messageLimit !== null) {\n args.messagelimit = messageLimit;\n }\n\n if (typeof messageOffset != 'undefined' && messageOffset !== null) {\n args.messageoffset = messageOffset;\n }\n\n if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {\n args.newestmessagesfirst = newestMessagesFirst;\n }\n\n var request = {\n methodname: 'core_message_get_conversation',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a conversation between users.\n *\n * @param {int} loggedInUserId The logged in user\n * @param {int} otherUserId The other user id\n * @param {bool} includeContactRequests Incldue contact requests between members\n * @param {bool} includePrivacyInfo Include privacy info for members\n * @param {int} memberLimit Limit for members\n * @param {int} memberOffset Offset for members\n * @param {int} messageLimit Limit for messages\n * @param {int} messageOffset Offset for messages\n * @param {bool} newestMessagesFirst Order the messages by newest first\n * @return {object} jQuery promise\n */\n var getConversationBetweenUsers = function(\n loggedInUserId,\n otherUserId,\n includeContactRequests,\n includePrivacyInfo,\n memberLimit,\n memberOffset,\n messageLimit,\n messageOffset,\n newestMessagesFirst\n ) {\n var args = {\n userid: loggedInUserId,\n otheruserid: otherUserId\n };\n\n if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {\n args.includecontactrequests = includeContactRequests;\n }\n\n if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {\n args.includeprivacyinfo = includePrivacyInfo;\n }\n\n if (typeof memberLimit != 'undefined' && memberLimit !== null) {\n args.memberlimit = memberLimit;\n }\n\n if (typeof memberOffset != 'undefined' && memberOffset !== null) {\n args.memberoffset = memberOffset;\n }\n\n if (typeof messageLimit != 'undefined' && messageLimit !== null) {\n args.messagelimit = messageLimit;\n }\n\n if (typeof messageOffset != 'undefined' && messageOffset !== null) {\n args.messageoffset = messageOffset;\n }\n\n if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {\n args.newestmessagesfirst = newestMessagesFirst;\n }\n\n var request = {\n methodname: 'core_message_get_conversation_between_users',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a self-conversation.\n *\n * @param {int} loggedInUserId The logged in user\n * @param {int} messageLimit Limit for messages\n * @param {int} messageOffset Offset for messages\n * @param {bool} newestMessagesFirst Order the messages by newest first\n * @return {object} jQuery promise\n */\n var getSelfConversation = function(\n loggedInUserId,\n messageLimit,\n messageOffset,\n newestMessagesFirst\n ) {\n var args = {\n userid: loggedInUserId\n };\n\n if (typeof messageLimit != 'undefined' && messageLimit !== null) {\n args.messagelimit = messageLimit;\n }\n\n if (typeof messageOffset != 'undefined' && messageOffset !== null) {\n args.messageoffset = messageOffset;\n }\n\n if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {\n args.newestmessagesfirst = newestMessagesFirst;\n }\n\n var request = {\n methodname: 'core_message_get_self_conversation',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the conversations for a user.\n *\n * @param {int} userId The logged in user\n * @param {int|null} type The type of conversation to get\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @param {bool|null} favourites If favourites should be included or not\n * @return {object} jQuery promise\n */\n var getConversations = function(\n userId,\n type,\n limit,\n offset,\n favourites,\n mergeself\n ) {\n var args = {\n userid: userId,\n type: type\n };\n\n if (typeof limit != 'undefined' && limit !== null) {\n args.limitnum = limit;\n }\n\n if (typeof offset != 'undefined' && offset !== null) {\n args.limitfrom = offset;\n }\n\n if (typeof favourites != 'undefined' && favourites !== null) {\n args.favourites = favourites;\n }\n\n if (typeof mergeself != 'undefined' && mergeself !== null) {\n args.mergeself = mergeself;\n }\n\n var request = {\n methodname: 'core_message_get_conversations',\n args: args\n };\n\n return Ajax.call([request])[0]\n .then(function(result) {\n if (result.conversations.length) {\n result.conversations = result.conversations.map(function(conversation) {\n if (conversation.type == CONVERSATION_TYPES.PRIVATE || conversation.type == CONVERSATION_TYPES.SELF) {\n var otherUser = conversation.members.length ? conversation.members[0] : null;\n\n if (otherUser) {\n conversation.name = conversation.name ? conversation.name : otherUser.fullname;\n conversation.imageurl = conversation.imageurl ? conversation.imageurl : otherUser.profileimageurl;\n }\n }\n\n return conversation;\n });\n }\n\n return result;\n });\n };\n\n /**\n * Get the conversations for a user.\n *\n * @param {int} conversationId The conversation id\n * @param {int} loggedInUserId The logged in user\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @param {bool} includeContactRequests If contact requests should be included in result\n * @return {object} jQuery promise\n */\n var getConversationMembers = function(conversationId, loggedInUserId, limit, offset, includeContactRequests) {\n var args = {\n userid: loggedInUserId,\n conversationid: conversationId\n };\n\n if (typeof limit != 'undefined' && limit !== null) {\n args.limitnum = limit;\n }\n\n if (typeof offset != 'undefined' && offset !== null) {\n args.limitfrom = offset;\n }\n\n if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {\n args.includecontactrequests = includeContactRequests;\n }\n\n var request = {\n methodname: 'core_message_get_conversation_members',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to set as favourites for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to set as favourite\n * @return {object} jQuery promise\n */\n var setFavouriteConversations = function(userId, conversationIds) {\n\n var request = {\n methodname: 'core_message_set_favourite_conversations',\n args: {\n userid: userId,\n conversations: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to unset as favourites for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to unset as favourite\n * @return {object} jQuery promise\n */\n var unsetFavouriteConversations = function(userId, conversationIds) {\n\n var request = {\n methodname: 'core_message_unset_favourite_conversations',\n args: {\n userid: userId,\n conversations: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to set as muted for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to set as favourite\n * @return {object} jQuery promise\n */\n var setMutedConversations = function(userId, conversationIds) {\n var request = {\n methodname: 'core_message_mute_conversations',\n args: {\n userid: userId,\n conversationids: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to unset as muted for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to unset as favourite\n * @return {object} jQuery promise\n */\n var unsetMutedConversations = function(userId, conversationIds) {\n var request = {\n methodname: 'core_message_unmute_conversations',\n args: {\n userid: userId,\n conversationids: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a list of user's member info.\n *\n * @param {int} referenceUserId The user id\n * @param {array} userIds List of user ids to get\n * @param {bool} includeContactRequests Include contact requests between users in response\n * @param {bool} includePrivacyInfo Include privacy info for reference user in response\n * @return {object} jQuery promise\n */\n var getMemberInfo = function(referenceUserId, userIds, includeContactRequests, includePrivacyInfo) {\n var args = {\n referenceuserid: referenceUserId,\n userids: userIds\n };\n\n if (typeof includeContactRequests != 'undefined') {\n args.includecontactrequests = includeContactRequests;\n }\n\n if (typeof includePrivacyInfo != 'undefined') {\n args.includeprivacyinfo = includePrivacyInfo;\n }\n\n var request = {\n methodname: 'core_message_get_member_info',\n args: args\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a list of user's member info.\n *\n * @param {int} userId The user id to mark as read for\n * @param {int} conversationId The conversation to mark as read\n * @return {object} jQuery promise\n */\n var markAllConversationMessagesAsRead = function(userId, conversationId) {\n\n var request = {\n methodname: 'core_message_mark_all_conversation_messages_as_read',\n args: {\n userid: userId,\n conversationid: conversationId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the user's message preferences.\n *\n * @param {int} userId The user id to load preferences for\n * @return {object} jQuery promise\n */\n var getUserMessagePreferences = function(userId) {\n var request = {\n methodname: 'core_message_get_user_message_preferences',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * The the count of the user's conversations grouped by type.\n *\n * @param {Number} userId The user's id.\n * @return {Object} jQuery promise.\n */\n var getTotalConversationCounts = function(userId) {\n var request = {\n methodname: 'core_message_get_conversation_counts',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * The the count of the user's unread conversations grouped by type.\n *\n * @param {Number} userId The user's id.\n * @return {Object} jQuery promise.\n */\n var getUnreadConversationCounts = function(userId) {\n var request = {\n methodname: 'core_message_get_unread_conversation_counts',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get both the unread and total conversation counts in a single request.\n *\n * @param {Number} userId The user's id.\n * @return {Object} jQuery promise.\n */\n var getAllConversationCounts = function(userId) {\n var requests = [\n {\n methodname: 'core_message_get_conversation_counts',\n args: {\n userid: userId\n }\n },\n {\n methodname: 'core_message_get_unread_conversation_counts',\n args: {\n userid: userId\n }\n },\n ];\n return $.when.apply(null, Ajax.call(requests)).then(function(total, unread) {\n return {\n total: total,\n unread: unread\n };\n });\n };\n\n return {\n countUnreadConversations: countUnreadConversations,\n getContacts: getContacts,\n blockUser: blockUser,\n unblockUser: unblockUser,\n createContactRequest: createContactRequest,\n deleteContacts: deleteContacts,\n getMessages: getMessages,\n searchUsers: searchUsers,\n searchMessages: searchMessages,\n sendMessagesToUser: sendMessagesToUser,\n sendMessageToUser: sendMessageToUser,\n sendMessagesToConversation: sendMessagesToConversation,\n sendMessageToConversation: sendMessageToConversation,\n savePreferences: savePreferences,\n getPreferences: getPreferences,\n deleteMessages: deleteMessages,\n deleteMessagesForAllUsers: deleteMessagesForAllUsers,\n deleteConversation: deleteConversation,\n getContactRequests: getContactRequests,\n acceptContactRequest: acceptContactRequest,\n declineContactRequest: declineContactRequest,\n getConversation: getConversation,\n getConversationBetweenUsers: getConversationBetweenUsers,\n getSelfConversation: getSelfConversation,\n getConversations: getConversations,\n getConversationMembers: getConversationMembers,\n setFavouriteConversations: setFavouriteConversations,\n setMutedConversations: setMutedConversations,\n unsetFavouriteConversations: unsetFavouriteConversations,\n unsetMutedConversations: unsetMutedConversations,\n getMemberInfo: getMemberInfo,\n markAllConversationMessagesAsRead: markAllConversationMessagesAsRead,\n getUserMessagePreferences: getUserMessagePreferences,\n getTotalConversationCounts: getTotalConversationCounts,\n getUnreadConversationCounts: getUnreadConversationCounts,\n getAllConversationCounts: getAllConversationCounts\n };\n});\n"],"file":"message_repository.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/message_repository.js"],"names":["define","$","Ajax","Notification","Constants","CONVERSATION_TYPES","sendMessagesToUser","toUserId","messages","formattedMessages","map","message","touserid","text","call","methodname","args","then","results","errors","reduce","carry","result","errormessage","push","length","Error","join","id","msgid","timecreated","useridfrom","conversationid","candeletemessagesforallusers","sendMessagesToConversation","conversationId","countUnreadConversations","promise","fail","exception","getContacts","userId","limit","offset","userid","limitnum","limitfrom","blockUser","blockedUserId","when","apply","blockeduserid","referenceuserid","userids","includecontactrequests","includeprivacyinfo","reponse1","profiles","unblockUser","unblockedUserId","unblockeduserid","createContactRequest","requestUserIds","requesteduserid","deleteContacts","contactUserIds","response1","getMessages","currentUserId","newestFirst","timeFrom","currentuserid","convid","newest","timefrom","searchUsers","searchString","search","searchMessages","sendMessageToUser","sendMessageToConversation","savePreferences","preferences","getPreferences","deleteMessages","messageIds","messageId","messageid","deleteMessagesForAllUsers","deleteConversation","conversationids","getContactRequests","acceptContactRequest","sendingUserId","recipientUserId","declineContactRequest","getConversation","loggedInUserId","includeContactRequests","includePrivacyInfo","memberLimit","memberOffset","messageLimit","messageOffset","newestMessagesFirst","memberlimit","memberoffset","messagelimit","messageoffset","newestmessagesfirst","getConversationBetweenUsers","otherUserId","otheruserid","getSelfConversation","getConversations","type","favourites","mergeself","conversations","conversation","PRIVATE","SELF","otherUser","members","name","fullname","imageurl","profileimageurl","getConversationMembers","setFavouriteConversations","conversationIds","setMutedConversations","unsetFavouriteConversations","unsetMutedConversations","getMemberInfo","referenceUserId","userIds","markAllConversationMessagesAsRead","getUserMessagePreferences","getTotalConversationCounts","getUnreadConversationCounts","getAllConversationCounts","total","unread"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Retrieves messages from the server.\n *\n * @module core_message/message_repository\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core_message/message_drawer_view_conversation_constants'\n], function(\n $,\n Ajax,\n Notification,\n Constants) {\n\n var CONVERSATION_TYPES = Constants.CONVERSATION_TYPES;\n\n /**\n * Count the number of unread conversations (one or more messages from a user)\n * for a given user.\n *\n * @param {object} args The request arguments:\n * @return {object} jQuery promise\n */\n var countUnreadConversations = function(args) {\n var request = {\n methodname: 'core_message_get_unread_conversations_count',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Get contacts for given user.\n *\n * @param {int} userId The user id\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @return {object} jQuery promise\n */\n var getContacts = function(userId, limit, offset) {\n var args = {\n userid: userId\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n var request = {\n methodname: 'core_message_get_user_contacts',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Block a user.\n *\n * @param {int} userId The requesting user\n * @param {int} blockedUserId Id of user to block\n * @return {object} jQuery promise\n */\n var blockUser = function(userId, blockedUserId) {\n var requests = [\n {\n methodname: 'core_message_block_user',\n args: {\n userid: userId,\n blockeduserid: blockedUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: userId,\n userids: [blockedUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Unblock a user.\n *\n * @param {int} userId The requesting user\n * @param {int} unblockedUserId Id of user to unblock\n * @return {object} jQuery promise\n */\n var unblockUser = function(userId, unblockedUserId) {\n var requests = [\n {\n methodname: 'core_message_unblock_user',\n args: {\n userid: userId,\n unblockeduserid: unblockedUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: userId,\n userids: [unblockedUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Create a request to add a user as a contact.\n *\n * @param {int} userId The requesting user\n * @param {int[]} requestUserIds List of user ids to add\n * @return {object} jQuery promise\n */\n var createContactRequest = function(userId, requestUserIds) {\n var request = {\n methodname: 'core_message_create_contact_request',\n args: {\n userid: userId,\n requesteduserid: requestUserIds\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Remove a list of users as contacts.\n *\n * @param {int} userId The requesting user\n * @param {int[]} contactUserIds List of user ids to add\n * @return {object} jQuery promise\n */\n var deleteContacts = function(userId, contactUserIds) {\n var requests = [\n {\n methodname: 'core_message_delete_contacts',\n args: {\n userid: userId,\n userids: contactUserIds\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: userId,\n userids: contactUserIds,\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n return $.when.apply(null, Ajax.call(requests)).then(function(response1, profiles) {\n // Return all of the profiles as an array.\n return profiles;\n });\n };\n\n /**\n * Get messages between two users.\n *\n * @param {int} currentUserId The requesting user\n * @param {int} conversationId Other user in the conversation\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @param {bool} newestFirst Order results by newest first\n * @param {int} timeFrom Only return messages after this timestamp\n * @return {object} jQuery promise\n */\n var getMessages = function(currentUserId, conversationId, limit, offset, newestFirst, timeFrom) {\n var args = {\n currentuserid: currentUserId,\n convid: conversationId,\n newest: newestFirst ? true : false\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n if (typeof timeFrom !== 'undefined') {\n args.timefrom = timeFrom;\n }\n\n var request = {\n methodname: 'core_message_get_conversation_messages',\n args: args\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Search for users.\n *\n * @param {int} userId The requesting user\n * @param {string} searchString Search string\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @return {object} jQuery promise\n */\n var searchUsers = function(userId, searchString, limit, offset) {\n var args = {\n userid: userId,\n search: searchString\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n var request = {\n methodname: 'core_message_message_search_users',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Search for messages.\n *\n * @param {int} userId The requesting user\n * @param {string} searchString Search string\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @return {object} jQuery promise\n */\n var searchMessages = function(userId, searchString, limit, offset) {\n var args = {\n userid: userId,\n search: searchString\n };\n\n if (typeof limit !== 'undefined') {\n args.limitnum = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.limitfrom = offset;\n }\n\n var request = {\n methodname: 'core_message_data_for_messagearea_search_messages',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Send a list of messages to a user.\n *\n * @param {int} toUserId The recipient user id\n * @param {string[]} messages List of messages to send\n * @return {object} jQuery promise\n */\n var sendMessagesToUser = function(toUserId, messages) {\n var formattedMessages = messages.map(function(message) {\n return {\n touserid: toUserId,\n text: message\n };\n });\n var request = {\n methodname: 'core_message_send_instant_messages',\n args: {\n messages: formattedMessages\n }\n };\n\n return Ajax.call([request])[0]\n .then(function(results) {\n // Error handling for the weird way the old function works.\n var errors = results.reduce(function(carry, result) {\n if (result.errormessage) {\n carry.push(result.errormessage);\n }\n\n return carry;\n }, []);\n if (errors.length) {\n throw new Error(errors.join(\"\\n\"));\n }\n\n return results;\n })\n .then(function(results) {\n // Format the results to match the other send message function.\n return results.map(function(result) {\n return {\n id: result.msgid,\n text: result.text,\n timecreated: result.timecreated,\n useridfrom: result.useridfrom,\n conversationid: result.conversationid,\n candeletemessagesforallusers: result.candeletemessagesforallusers\n };\n });\n });\n };\n\n /**\n * Send a single message to a user.\n *\n * @param {int} toUserId The recipient user id\n * @param {string} text The message text\n * @return {object} jQuery promise\n */\n var sendMessageToUser = function(toUserId, text) {\n return sendMessagesToUser(toUserId, [text])\n .then(function(results) {\n return results[0];\n });\n };\n\n /**\n * Send messages to a conversation.\n *\n * @param {int} conversationId The conversation id\n * @param {string[]} messages List of messages to send\n * @return {object} jQuery promise\n */\n var sendMessagesToConversation = function(conversationId, messages) {\n var formattedMessages = messages.map(function(message) {\n return {\n text: message\n };\n });\n var request = {\n methodname: 'core_message_send_messages_to_conversation',\n args: {\n conversationid: conversationId,\n messages: formattedMessages\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Send a message to a conversation.\n *\n * @param {int} conversationId The conversation id\n * @param {string} text The message text\n * @return {object} jQuery promise\n */\n var sendMessageToConversation = function(conversationId, text) {\n return sendMessagesToConversation(conversationId, [text])\n .then(function(result) {\n return result[0];\n });\n };\n\n /**\n * Save message preferences.\n *\n * @param {int} userId The owner of the preferences\n * @param {object[]} preferences New preferences values\n * @return {object} jQuery promise\n */\n var savePreferences = function(userId, preferences) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n userid: userId,\n preferences: preferences\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the user's preferences.\n *\n * @param {int} userId The target user\n * @return {object} jQuery promise\n */\n var getPreferences = function(userId) {\n var request = {\n methodname: 'core_user_get_user_preferences',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Delete a list of messages.\n *\n * @param {int} userId The user to delete messages for\n * @param {int[]} messageIds List of message ids to delete\n * @return {object} jQuery promise\n */\n var deleteMessages = function(userId, messageIds) {\n return $.when.apply(null, Ajax.call(messageIds.map(function(messageId) {\n return {\n methodname: 'core_message_delete_message',\n args: {\n messageid: messageId,\n userid: userId\n }\n };\n })));\n };\n\n /**\n * Delete a list of messages for all users.\n *\n * @param {int} userId The user to delete messages for\n * @param {int[]} messageIds List of message ids to delete\n * @return {object} jQuery promise\n */\n var deleteMessagesForAllUsers = function(userId, messageIds) {\n return $.when.apply(null, Ajax.call(messageIds.map(function(messageId) {\n return {\n methodname: 'core_message_delete_message_for_all_users',\n args: {\n messageid: messageId,\n userid: userId\n }\n };\n })));\n };\n\n /**\n * Delete a conversation between two users.\n *\n * @param {int} userId The user to delete messages for\n * @param {int} conversationId The id of the conversation\n * @return {object} jQuery promise\n */\n var deleteConversation = function(userId, conversationId) {\n var request = {\n methodname: 'core_message_delete_conversations_by_id',\n args: {\n userid: userId,\n conversationids: [conversationId]\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the list of contact requests for a user.\n *\n * @param {int} userId The user id\n * @return {object} jQuery promise\n */\n var getContactRequests = function(userId) {\n var request = {\n methodname: 'core_message_get_contact_requests',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Accept a contact request.\n *\n * @param {int} sendingUserId The user that sent the request\n * @param {int} recipientUserId The user that received the request\n * @return {object} jQuery promise\n */\n var acceptContactRequest = function(sendingUserId, recipientUserId) {\n var requests = [\n {\n methodname: 'core_message_confirm_contact_request',\n args: {\n userid: sendingUserId,\n requesteduserid: recipientUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: recipientUserId,\n userids: [sendingUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Decline a contact request.\n *\n * @param {int} sendingUserId The user that sent the request\n * @param {int} recipientUserId The user that received the request\n * @return {object} jQuery promise\n */\n var declineContactRequest = function(sendingUserId, recipientUserId) {\n var requests = [\n {\n methodname: 'core_message_decline_contact_request',\n args: {\n userid: sendingUserId,\n requesteduserid: recipientUserId\n }\n },\n {\n methodname: 'core_message_get_member_info',\n args: {\n referenceuserid: recipientUserId,\n userids: [sendingUserId],\n includecontactrequests: true,\n includeprivacyinfo: true\n }\n }\n ];\n\n // Wrap both requests in a single promise so that we can catch an error\n // from either request.\n return $.when.apply(null, Ajax.call(requests)).then(function(reponse1, profiles) {\n // Only return the profile.\n return profiles.length ? profiles[0] : {};\n });\n };\n\n /**\n * Get a conversation.\n *\n * @param {int} loggedInUserId The logged in user\n * @param {int} conversationId The conversation id\n * @param {bool} includeContactRequests Incldue contact requests between members\n * @param {bool} includePrivacyInfo Include privacy info for members\n * @param {int} memberLimit Limit for members\n * @param {int} memberOffset Offset for members\n * @param {int} messageLimit Limit for messages\n * @param {int} messageOffset Offset for messages\n * @param {bool} newestMessagesFirst Order the messages by newest first\n * @return {object} jQuery promise\n */\n var getConversation = function(\n loggedInUserId,\n conversationId,\n includeContactRequests,\n includePrivacyInfo,\n memberLimit,\n memberOffset,\n messageLimit,\n messageOffset,\n newestMessagesFirst\n ) {\n var args = {\n userid: loggedInUserId,\n conversationid: conversationId\n };\n\n if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {\n args.includecontactrequests = includeContactRequests;\n }\n\n if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {\n args.includeprivacyinfo = includePrivacyInfo;\n }\n\n if (typeof memberLimit != 'undefined' && memberLimit !== null) {\n args.memberlimit = memberLimit;\n }\n\n if (typeof memberOffset != 'undefined' && memberOffset !== null) {\n args.memberoffset = memberOffset;\n }\n\n if (typeof messageLimit != 'undefined' && messageLimit !== null) {\n args.messagelimit = messageLimit;\n }\n\n if (typeof messageOffset != 'undefined' && messageOffset !== null) {\n args.messageoffset = messageOffset;\n }\n\n if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {\n args.newestmessagesfirst = newestMessagesFirst;\n }\n\n var request = {\n methodname: 'core_message_get_conversation',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a conversation between users.\n *\n * @param {int} loggedInUserId The logged in user\n * @param {int} otherUserId The other user id\n * @param {bool} includeContactRequests Incldue contact requests between members\n * @param {bool} includePrivacyInfo Include privacy info for members\n * @param {int} memberLimit Limit for members\n * @param {int} memberOffset Offset for members\n * @param {int} messageLimit Limit for messages\n * @param {int} messageOffset Offset for messages\n * @param {bool} newestMessagesFirst Order the messages by newest first\n * @return {object} jQuery promise\n */\n var getConversationBetweenUsers = function(\n loggedInUserId,\n otherUserId,\n includeContactRequests,\n includePrivacyInfo,\n memberLimit,\n memberOffset,\n messageLimit,\n messageOffset,\n newestMessagesFirst\n ) {\n var args = {\n userid: loggedInUserId,\n otheruserid: otherUserId\n };\n\n if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {\n args.includecontactrequests = includeContactRequests;\n }\n\n if (typeof includePrivacyInfo != 'undefined' && includePrivacyInfo !== null) {\n args.includeprivacyinfo = includePrivacyInfo;\n }\n\n if (typeof memberLimit != 'undefined' && memberLimit !== null) {\n args.memberlimit = memberLimit;\n }\n\n if (typeof memberOffset != 'undefined' && memberOffset !== null) {\n args.memberoffset = memberOffset;\n }\n\n if (typeof messageLimit != 'undefined' && messageLimit !== null) {\n args.messagelimit = messageLimit;\n }\n\n if (typeof messageOffset != 'undefined' && messageOffset !== null) {\n args.messageoffset = messageOffset;\n }\n\n if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {\n args.newestmessagesfirst = newestMessagesFirst;\n }\n\n var request = {\n methodname: 'core_message_get_conversation_between_users',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a self-conversation.\n *\n * @param {int} loggedInUserId The logged in user\n * @param {int} messageLimit Limit for messages\n * @param {int} messageOffset Offset for messages\n * @param {bool} newestMessagesFirst Order the messages by newest first\n * @return {object} jQuery promise\n */\n var getSelfConversation = function(\n loggedInUserId,\n messageLimit,\n messageOffset,\n newestMessagesFirst\n ) {\n var args = {\n userid: loggedInUserId\n };\n\n if (typeof messageLimit != 'undefined' && messageLimit !== null) {\n args.messagelimit = messageLimit;\n }\n\n if (typeof messageOffset != 'undefined' && messageOffset !== null) {\n args.messageoffset = messageOffset;\n }\n\n if (typeof newestMessagesFirst != 'undefined' && newestMessagesFirst !== null) {\n args.newestmessagesfirst = newestMessagesFirst;\n }\n\n var request = {\n methodname: 'core_message_get_self_conversation',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the conversations for a user.\n *\n * @param {int} userId The logged in user\n * @param {int|null} type The type of conversation to get\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @param {bool|null} favourites If favourites should be included or not\n * @return {object} jQuery promise\n */\n var getConversations = function(\n userId,\n type,\n limit,\n offset,\n favourites,\n mergeself\n ) {\n var args = {\n userid: userId,\n type: type\n };\n\n if (typeof limit != 'undefined' && limit !== null) {\n args.limitnum = limit;\n }\n\n if (typeof offset != 'undefined' && offset !== null) {\n args.limitfrom = offset;\n }\n\n if (typeof favourites != 'undefined' && favourites !== null) {\n args.favourites = favourites;\n }\n\n if (typeof mergeself != 'undefined' && mergeself !== null) {\n args.mergeself = mergeself;\n }\n\n var request = {\n methodname: 'core_message_get_conversations',\n args: args\n };\n\n return Ajax.call([request])[0]\n .then(function(result) {\n if (result.conversations.length) {\n result.conversations = result.conversations.map(function(conversation) {\n if (conversation.type == CONVERSATION_TYPES.PRIVATE || conversation.type == CONVERSATION_TYPES.SELF) {\n var otherUser = conversation.members.length ? conversation.members[0] : null;\n\n if (otherUser) {\n conversation.name = conversation.name ? conversation.name : otherUser.fullname;\n conversation.imageurl = conversation.imageurl ? conversation.imageurl : otherUser.profileimageurl;\n }\n }\n\n return conversation;\n });\n }\n\n return result;\n });\n };\n\n /**\n * Get the conversations for a user.\n *\n * @param {int} conversationId The conversation id\n * @param {int} loggedInUserId The logged in user\n * @param {int} limit Limit for results\n * @param {int} offset Offset for results\n * @param {bool} includeContactRequests If contact requests should be included in result\n * @return {object} jQuery promise\n */\n var getConversationMembers = function(conversationId, loggedInUserId, limit, offset, includeContactRequests) {\n var args = {\n userid: loggedInUserId,\n conversationid: conversationId\n };\n\n if (typeof limit != 'undefined' && limit !== null) {\n args.limitnum = limit;\n }\n\n if (typeof offset != 'undefined' && offset !== null) {\n args.limitfrom = offset;\n }\n\n if (typeof includeContactRequests != 'undefined' && includeContactRequests !== null) {\n args.includecontactrequests = includeContactRequests;\n }\n\n var request = {\n methodname: 'core_message_get_conversation_members',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to set as favourites for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to set as favourite\n * @return {object} jQuery promise\n */\n var setFavouriteConversations = function(userId, conversationIds) {\n\n var request = {\n methodname: 'core_message_set_favourite_conversations',\n args: {\n userid: userId,\n conversations: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to unset as favourites for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to unset as favourite\n * @return {object} jQuery promise\n */\n var unsetFavouriteConversations = function(userId, conversationIds) {\n\n var request = {\n methodname: 'core_message_unset_favourite_conversations',\n args: {\n userid: userId,\n conversations: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to set as muted for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to set as favourite\n * @return {object} jQuery promise\n */\n var setMutedConversations = function(userId, conversationIds) {\n var request = {\n methodname: 'core_message_mute_conversations',\n args: {\n userid: userId,\n conversationids: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Set a list of conversations to unset as muted for the given user.\n *\n * @param {int} userId The user id\n * @param {array} conversationIds List of conversation ids to unset as favourite\n * @return {object} jQuery promise\n */\n var unsetMutedConversations = function(userId, conversationIds) {\n var request = {\n methodname: 'core_message_unmute_conversations',\n args: {\n userid: userId,\n conversationids: conversationIds\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a list of user's member info.\n *\n * @param {int} referenceUserId The user id\n * @param {array} userIds List of user ids to get\n * @param {bool} includeContactRequests Include contact requests between users in response\n * @param {bool} includePrivacyInfo Include privacy info for reference user in response\n * @return {object} jQuery promise\n */\n var getMemberInfo = function(referenceUserId, userIds, includeContactRequests, includePrivacyInfo) {\n var args = {\n referenceuserid: referenceUserId,\n userids: userIds\n };\n\n if (typeof includeContactRequests != 'undefined') {\n args.includecontactrequests = includeContactRequests;\n }\n\n if (typeof includePrivacyInfo != 'undefined') {\n args.includeprivacyinfo = includePrivacyInfo;\n }\n\n var request = {\n methodname: 'core_message_get_member_info',\n args: args\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a list of user's member info.\n *\n * @param {int} userId The user id to mark as read for\n * @param {int} conversationId The conversation to mark as read\n * @return {object} jQuery promise\n */\n var markAllConversationMessagesAsRead = function(userId, conversationId) {\n\n var request = {\n methodname: 'core_message_mark_all_conversation_messages_as_read',\n args: {\n userid: userId,\n conversationid: conversationId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the user's message preferences.\n *\n * @param {int} userId The user id to load preferences for\n * @return {object} jQuery promise\n */\n var getUserMessagePreferences = function(userId) {\n var request = {\n methodname: 'core_message_get_user_message_preferences',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * The the count of the user's conversations grouped by type.\n *\n * @param {Number} userId The user's id.\n * @return {Object} jQuery promise.\n */\n var getTotalConversationCounts = function(userId) {\n var request = {\n methodname: 'core_message_get_conversation_counts',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * The the count of the user's unread conversations grouped by type.\n *\n * @param {Number} userId The user's id.\n * @return {Object} jQuery promise.\n */\n var getUnreadConversationCounts = function(userId) {\n var request = {\n methodname: 'core_message_get_unread_conversation_counts',\n args: {\n userid: userId\n }\n };\n return Ajax.call([request])[0];\n };\n\n /**\n * Get both the unread and total conversation counts in a single request.\n *\n * @param {Number} userId The user's id.\n * @return {Object} jQuery promise.\n */\n var getAllConversationCounts = function(userId) {\n var requests = [\n {\n methodname: 'core_message_get_conversation_counts',\n args: {\n userid: userId\n }\n },\n {\n methodname: 'core_message_get_unread_conversation_counts',\n args: {\n userid: userId\n }\n },\n ];\n return $.when.apply(null, Ajax.call(requests)).then(function(total, unread) {\n return {\n total: total,\n unread: unread\n };\n });\n };\n\n return {\n countUnreadConversations: countUnreadConversations,\n getContacts: getContacts,\n blockUser: blockUser,\n unblockUser: unblockUser,\n createContactRequest: createContactRequest,\n deleteContacts: deleteContacts,\n getMessages: getMessages,\n searchUsers: searchUsers,\n searchMessages: searchMessages,\n sendMessagesToUser: sendMessagesToUser,\n sendMessageToUser: sendMessageToUser,\n sendMessagesToConversation: sendMessagesToConversation,\n sendMessageToConversation: sendMessageToConversation,\n savePreferences: savePreferences,\n getPreferences: getPreferences,\n deleteMessages: deleteMessages,\n deleteMessagesForAllUsers: deleteMessagesForAllUsers,\n deleteConversation: deleteConversation,\n getContactRequests: getContactRequests,\n acceptContactRequest: acceptContactRequest,\n declineContactRequest: declineContactRequest,\n getConversation: getConversation,\n getConversationBetweenUsers: getConversationBetweenUsers,\n getSelfConversation: getSelfConversation,\n getConversations: getConversations,\n getConversationMembers: getConversationMembers,\n setFavouriteConversations: setFavouriteConversations,\n setMutedConversations: setMutedConversations,\n unsetFavouriteConversations: unsetFavouriteConversations,\n unsetMutedConversations: unsetMutedConversations,\n getMemberInfo: getMemberInfo,\n markAllConversationMessagesAsRead: markAllConversationMessagesAsRead,\n getUserMessagePreferences: getUserMessagePreferences,\n getTotalConversationCounts: getTotalConversationCounts,\n getUnreadConversationCounts: getUnreadConversationCounts,\n getAllConversationCounts: getAllConversationCounts\n };\n});\n"],"file":"message_repository.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/notification_preference.min.js.map b/message/amd/build/notification_preference.min.js.map
index a99b7b9a596..e5f5b7e0b9a 100644
--- a/message/amd/build/notification_preference.min.js.map
+++ b/message/amd/build/notification_preference.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/notification_preference.js"],"names":["define","$","Ajax","Notification","NotificationProcessor","SELECTORS","PROCESSOR","STATE_INPUTS","NotificationPreference","element","userId","root","prototype","getPreferenceKey","attr","getLoggedInPreferenceKey","getLoggedOffPreferenceKey","getProcessors","find","map","index","startLoading","addClass","prop","stopLoading","removeClass","isLoading","hasClass","save","Deferred","resolve","loggedInValue","loggedOffValue","each","processor","isLoggedInEnabled","getName","isLoggedOffEnabled","args","userid","preferences","type","value","call","methodname","fail","exception","always","bind"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the preference for an individual notification type on the\n * message preference page.\n *\n * @module core_message/notification_preference\n * @class notification_preference\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification', 'core_message/notification_processor'],\n function($, Ajax, Notification, NotificationProcessor) {\n\n var SELECTORS = {\n PROCESSOR: '[data-processor-name]',\n STATE_INPUTS: '[data-state] input',\n };\n\n /**\n * Constructor for the Preference.\n *\n * @param {object} element jQuery object root element of the preference\n * @param {int} userId The current user id\n */\n var NotificationPreference = function(element, userId) {\n this.root = $(element);\n this.userId = userId;\n };\n\n /**\n * Get the unique prefix key that identifies this user preference.\n *\n * @method getPreferenceKey\n * @return {string}\n */\n NotificationPreference.prototype.getPreferenceKey = function() {\n return this.root.attr('data-preference-key');\n };\n\n /**\n * Get the unique key for the logged in preference.\n *\n * @method getLoggedInPreferenceKey\n * @return {string}\n */\n NotificationPreference.prototype.getLoggedInPreferenceKey = function() {\n return this.getPreferenceKey() + '_loggedin';\n };\n\n /**\n * Get the unique key for the logged off preference.\n *\n * @method getLoggedOffPreferenceKey\n * @return {string}\n */\n NotificationPreference.prototype.getLoggedOffPreferenceKey = function() {\n return this.getPreferenceKey() + '_loggedoff';\n };\n\n /**\n * Get the list of Processors available for this preference.\n *\n * @method getProcessors\n * @return {array}\n */\n NotificationPreference.prototype.getProcessors = function() {\n return this.root.find(SELECTORS.PROCESSOR).map(function(index, element) {\n return new NotificationProcessor($(element));\n });\n };\n\n /**\n * Flag the preference as loading.\n *\n * @method startLoading\n */\n NotificationPreference.prototype.startLoading = function() {\n this.root.addClass('loading');\n this.root.find(SELECTORS.STATE_INPUTS).prop('disabled', true);\n };\n\n /**\n * Remove the loading flag for this preference.\n *\n * @method stopLoading\n */\n NotificationPreference.prototype.stopLoading = function() {\n this.root.removeClass('loading');\n this.root.find(SELECTORS.STATE_INPUTS).prop('disabled', false);\n };\n\n /**\n * Check if the preference is loading.\n *\n * @method isLoading\n * @return {Boolean}\n */\n NotificationPreference.prototype.isLoading = function() {\n return this.root.hasClass('loading');\n };\n\n /**\n * Persist the current state of the processors for this preference.\n *\n * @method save\n * @return {object} jQuery promise\n */\n NotificationPreference.prototype.save = function() {\n if (this.isLoading()) {\n return $.Deferred().resolve();\n }\n\n this.startLoading();\n\n var loggedInValue = '';\n var loggedOffValue = '';\n\n this.getProcessors().each(function(index, processor) {\n if (processor.isLoggedInEnabled()) {\n if (loggedInValue === '') {\n loggedInValue = processor.getName();\n } else {\n loggedInValue += ',' + processor.getName();\n }\n }\n\n if (processor.isLoggedOffEnabled()) {\n if (loggedOffValue === '') {\n loggedOffValue = processor.getName();\n } else {\n loggedOffValue += ',' + processor.getName();\n }\n }\n });\n\n if (loggedInValue === '') {\n loggedInValue = 'none';\n }\n\n if (loggedOffValue === '') {\n loggedOffValue = 'none';\n }\n\n var args = {\n userid: this.userId,\n preferences: [\n {\n type: this.getLoggedInPreferenceKey(),\n value: loggedInValue,\n },\n {\n type: this.getLoggedOffPreferenceKey(),\n value: loggedOffValue,\n },\n ],\n };\n\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: args,\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n this.stopLoading();\n }.bind(this));\n };\n\n return NotificationPreference;\n});\n"],"file":"notification_preference.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/notification_preference.js"],"names":["define","$","Ajax","Notification","NotificationProcessor","SELECTORS","PROCESSOR","STATE_INPUTS","NotificationPreference","element","userId","root","prototype","getPreferenceKey","attr","getLoggedInPreferenceKey","getLoggedOffPreferenceKey","getProcessors","find","map","index","startLoading","addClass","prop","stopLoading","removeClass","isLoading","hasClass","save","Deferred","resolve","loggedInValue","loggedOffValue","each","processor","isLoggedInEnabled","getName","isLoggedOffEnabled","args","userid","preferences","type","value","call","methodname","fail","exception","always","bind"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the preference for an individual notification type on the\n * message preference page.\n *\n * @module core_message/notification_preference\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification', 'core_message/notification_processor'],\n function($, Ajax, Notification, NotificationProcessor) {\n\n var SELECTORS = {\n PROCESSOR: '[data-processor-name]',\n STATE_INPUTS: '[data-state] input',\n };\n\n /**\n * Constructor for the Preference.\n *\n * @class\n * @param {object} element jQuery object root element of the preference\n * @param {int} userId The current user id\n */\n var NotificationPreference = function(element, userId) {\n this.root = $(element);\n this.userId = userId;\n };\n\n /**\n * Get the unique prefix key that identifies this user preference.\n *\n * @method getPreferenceKey\n * @return {string}\n */\n NotificationPreference.prototype.getPreferenceKey = function() {\n return this.root.attr('data-preference-key');\n };\n\n /**\n * Get the unique key for the logged in preference.\n *\n * @method getLoggedInPreferenceKey\n * @return {string}\n */\n NotificationPreference.prototype.getLoggedInPreferenceKey = function() {\n return this.getPreferenceKey() + '_loggedin';\n };\n\n /**\n * Get the unique key for the logged off preference.\n *\n * @method getLoggedOffPreferenceKey\n * @return {string}\n */\n NotificationPreference.prototype.getLoggedOffPreferenceKey = function() {\n return this.getPreferenceKey() + '_loggedoff';\n };\n\n /**\n * Get the list of Processors available for this preference.\n *\n * @method getProcessors\n * @return {array}\n */\n NotificationPreference.prototype.getProcessors = function() {\n return this.root.find(SELECTORS.PROCESSOR).map(function(index, element) {\n return new NotificationProcessor($(element));\n });\n };\n\n /**\n * Flag the preference as loading.\n *\n * @method startLoading\n */\n NotificationPreference.prototype.startLoading = function() {\n this.root.addClass('loading');\n this.root.find(SELECTORS.STATE_INPUTS).prop('disabled', true);\n };\n\n /**\n * Remove the loading flag for this preference.\n *\n * @method stopLoading\n */\n NotificationPreference.prototype.stopLoading = function() {\n this.root.removeClass('loading');\n this.root.find(SELECTORS.STATE_INPUTS).prop('disabled', false);\n };\n\n /**\n * Check if the preference is loading.\n *\n * @method isLoading\n * @return {Boolean}\n */\n NotificationPreference.prototype.isLoading = function() {\n return this.root.hasClass('loading');\n };\n\n /**\n * Persist the current state of the processors for this preference.\n *\n * @method save\n * @return {object} jQuery promise\n */\n NotificationPreference.prototype.save = function() {\n if (this.isLoading()) {\n return $.Deferred().resolve();\n }\n\n this.startLoading();\n\n var loggedInValue = '';\n var loggedOffValue = '';\n\n this.getProcessors().each(function(index, processor) {\n if (processor.isLoggedInEnabled()) {\n if (loggedInValue === '') {\n loggedInValue = processor.getName();\n } else {\n loggedInValue += ',' + processor.getName();\n }\n }\n\n if (processor.isLoggedOffEnabled()) {\n if (loggedOffValue === '') {\n loggedOffValue = processor.getName();\n } else {\n loggedOffValue += ',' + processor.getName();\n }\n }\n });\n\n if (loggedInValue === '') {\n loggedInValue = 'none';\n }\n\n if (loggedOffValue === '') {\n loggedOffValue = 'none';\n }\n\n var args = {\n userid: this.userId,\n preferences: [\n {\n type: this.getLoggedInPreferenceKey(),\n value: loggedInValue,\n },\n {\n type: this.getLoggedOffPreferenceKey(),\n value: loggedOffValue,\n },\n ],\n };\n\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: args,\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n this.stopLoading();\n }.bind(this));\n };\n\n return NotificationPreference;\n});\n"],"file":"notification_preference.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/notification_processor.min.js.map b/message/amd/build/notification_processor.min.js.map
index 925bc7cf271..174c134670f 100644
--- a/message/amd/build/notification_processor.min.js.map
+++ b/message/amd/build/notification_processor.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/notification_processor.js"],"names":["define","$","SELECTORS","STATE_NONE","STATE_BOTH","STATE_LOGGED_IN","STATE_LOGGED_OFF","NotificationProcessor","element","root","prototype","getName","attr","isLoggedInEnabled","none","find","prop","both","loggedIn","isLoggedOffEnabled","loggedOff"],"mappings":"AAuBAA,OAAM,uCAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,IACvBC,CAAAA,CAAS,CAAG,CACZC,UAAU,CAAE,uBADA,CAEZC,UAAU,CAAE,uBAFA,CAGZC,eAAe,CAAE,2BAHL,CAIZC,gBAAgB,CAAE,4BAJN,CADW,CAavBC,CAAqB,CAAG,SAASC,CAAT,CAAkB,CAC1C,KAAKC,IAAL,CAAYR,CAAC,CAACO,CAAD,CAChB,CAf0B,CAuB3BD,CAAqB,CAACG,SAAtB,CAAgCC,OAAhC,CAA0C,UAAW,CACjD,MAAO,MAAKF,IAAL,CAAUG,IAAV,CAAe,qBAAf,CACV,CAFD,CAUAL,CAAqB,CAACG,SAAtB,CAAgCG,iBAAhC,CAAoD,UAAW,CAC3D,GAAIC,CAAAA,CAAI,CAAG,KAAKL,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACC,UAAzB,EAAqCY,IAArC,CAA0C,OAA1C,CAAX,CAEA,GAAID,CAAI,CAACE,IAAL,CAAU,SAAV,CAAJ,CAA0B,CACtB,QACH,CAL0D,GAOvDC,CAAAA,CAAI,CAAG,KAAKR,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACE,UAAzB,EAAqCW,IAArC,CAA0C,OAA1C,CAPgD,CAQvDG,CAAQ,CAAG,KAAKT,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACG,eAAzB,EAA0CU,IAA1C,CAA+C,OAA/C,CAR4C,CAU3D,MAAOG,CAAAA,CAAQ,CAACF,IAAT,CAAc,SAAd,GAA4BC,CAAI,CAACD,IAAL,CAAU,SAAV,CACtC,CAXD,CAmBAT,CAAqB,CAACG,SAAtB,CAAgCS,kBAAhC,CAAqD,UAAW,CAC5D,GAAIL,CAAAA,CAAI,CAAG,KAAKL,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACC,UAAzB,EAAqCY,IAArC,CAA0C,OAA1C,CAAX,CAEA,GAAID,CAAI,CAACE,IAAL,CAAU,SAAV,CAAJ,CAA0B,CACtB,QACH,CAL2D,GAOxDC,CAAAA,CAAI,CAAG,KAAKR,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACE,UAAzB,EAAqCW,IAArC,CAA0C,OAA1C,CAPiD,CAQxDK,CAAS,CAAG,KAAKX,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACI,gBAAzB,EAA2CS,IAA3C,CAAgD,OAAhD,CAR4C,CAU5D,MAAOK,CAAAA,CAAS,CAACJ,IAAV,CAAe,SAAf,GAA6BC,CAAI,CAACD,IAAL,CAAU,SAAV,CACvC,CAXD,CAaA,MAAOT,CAAAA,CACV,CAlEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Represents the notification processor (e.g. email, popup, jabber)\n *\n * @module core_message/notification_processor\n * @class notification_processor\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n var SELECTORS = {\n STATE_NONE: '[data-state=\"none\"]',\n STATE_BOTH: '[data-state=\"both\"]',\n STATE_LOGGED_IN: '[data-state=\"loggedin\"]',\n STATE_LOGGED_OFF: '[data-state=\"loggedoff\"]',\n };\n\n /**\n * Constructor for the notification processor.\n *\n * @param {object} element jQuery object root element of the processor\n */\n var NotificationProcessor = function(element) {\n this.root = $(element);\n };\n\n /**\n * Get the processor name.\n *\n * @method getName\n * @return {string}\n */\n NotificationProcessor.prototype.getName = function() {\n return this.root.attr('data-processor-name');\n };\n\n /**\n * Check if the processor is enabled when the user is logged in.\n *\n * @method isLoggedInEnabled\n * @return {bool}\n */\n NotificationProcessor.prototype.isLoggedInEnabled = function() {\n var none = this.root.find(SELECTORS.STATE_NONE).find('input');\n\n if (none.prop('checked')) {\n return false;\n }\n\n var both = this.root.find(SELECTORS.STATE_BOTH).find('input');\n var loggedIn = this.root.find(SELECTORS.STATE_LOGGED_IN).find('input');\n\n return loggedIn.prop('checked') || both.prop('checked');\n };\n\n /**\n * Check if the processor is enabled when the user is logged out.\n *\n * @method isLoggedOffEnabled\n * @return {bool}\n */\n NotificationProcessor.prototype.isLoggedOffEnabled = function() {\n var none = this.root.find(SELECTORS.STATE_NONE).find('input');\n\n if (none.prop('checked')) {\n return false;\n }\n\n var both = this.root.find(SELECTORS.STATE_BOTH).find('input');\n var loggedOff = this.root.find(SELECTORS.STATE_LOGGED_OFF).find('input');\n\n return loggedOff.prop('checked') || both.prop('checked');\n };\n\n return NotificationProcessor;\n});\n"],"file":"notification_processor.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/notification_processor.js"],"names":["define","$","SELECTORS","STATE_NONE","STATE_BOTH","STATE_LOGGED_IN","STATE_LOGGED_OFF","NotificationProcessor","element","root","prototype","getName","attr","isLoggedInEnabled","none","find","prop","both","loggedIn","isLoggedOffEnabled","loggedOff"],"mappings":"AAsBAA,OAAM,uCAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,IACvBC,CAAAA,CAAS,CAAG,CACZC,UAAU,CAAE,uBADA,CAEZC,UAAU,CAAE,uBAFA,CAGZC,eAAe,CAAE,2BAHL,CAIZC,gBAAgB,CAAE,4BAJN,CADW,CAcvBC,CAAqB,CAAG,SAASC,CAAT,CAAkB,CAC1C,KAAKC,IAAL,CAAYR,CAAC,CAACO,CAAD,CAChB,CAhB0B,CAwB3BD,CAAqB,CAACG,SAAtB,CAAgCC,OAAhC,CAA0C,UAAW,CACjD,MAAO,MAAKF,IAAL,CAAUG,IAAV,CAAe,qBAAf,CACV,CAFD,CAUAL,CAAqB,CAACG,SAAtB,CAAgCG,iBAAhC,CAAoD,UAAW,CAC3D,GAAIC,CAAAA,CAAI,CAAG,KAAKL,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACC,UAAzB,EAAqCY,IAArC,CAA0C,OAA1C,CAAX,CAEA,GAAID,CAAI,CAACE,IAAL,CAAU,SAAV,CAAJ,CAA0B,CACtB,QACH,CAL0D,GAOvDC,CAAAA,CAAI,CAAG,KAAKR,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACE,UAAzB,EAAqCW,IAArC,CAA0C,OAA1C,CAPgD,CAQvDG,CAAQ,CAAG,KAAKT,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACG,eAAzB,EAA0CU,IAA1C,CAA+C,OAA/C,CAR4C,CAU3D,MAAOG,CAAAA,CAAQ,CAACF,IAAT,CAAc,SAAd,GAA4BC,CAAI,CAACD,IAAL,CAAU,SAAV,CACtC,CAXD,CAmBAT,CAAqB,CAACG,SAAtB,CAAgCS,kBAAhC,CAAqD,UAAW,CAC5D,GAAIL,CAAAA,CAAI,CAAG,KAAKL,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACC,UAAzB,EAAqCY,IAArC,CAA0C,OAA1C,CAAX,CAEA,GAAID,CAAI,CAACE,IAAL,CAAU,SAAV,CAAJ,CAA0B,CACtB,QACH,CAL2D,GAOxDC,CAAAA,CAAI,CAAG,KAAKR,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACE,UAAzB,EAAqCW,IAArC,CAA0C,OAA1C,CAPiD,CAQxDK,CAAS,CAAG,KAAKX,IAAL,CAAUM,IAAV,CAAeb,CAAS,CAACI,gBAAzB,EAA2CS,IAA3C,CAAgD,OAAhD,CAR4C,CAU5D,MAAOK,CAAAA,CAAS,CAACJ,IAAV,CAAe,SAAf,GAA6BC,CAAI,CAACD,IAAL,CAAU,SAAV,CACvC,CAXD,CAaA,MAAOT,CAAAA,CACV,CAnEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Represents the notification processor (e.g. email, popup, jabber)\n *\n * @module core_message/notification_processor\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n var SELECTORS = {\n STATE_NONE: '[data-state=\"none\"]',\n STATE_BOTH: '[data-state=\"both\"]',\n STATE_LOGGED_IN: '[data-state=\"loggedin\"]',\n STATE_LOGGED_OFF: '[data-state=\"loggedoff\"]',\n };\n\n /**\n * Constructor for the notification processor.\n *\n * @class\n * @param {object} element jQuery object root element of the processor\n */\n var NotificationProcessor = function(element) {\n this.root = $(element);\n };\n\n /**\n * Get the processor name.\n *\n * @method getName\n * @return {string}\n */\n NotificationProcessor.prototype.getName = function() {\n return this.root.attr('data-processor-name');\n };\n\n /**\n * Check if the processor is enabled when the user is logged in.\n *\n * @method isLoggedInEnabled\n * @return {bool}\n */\n NotificationProcessor.prototype.isLoggedInEnabled = function() {\n var none = this.root.find(SELECTORS.STATE_NONE).find('input');\n\n if (none.prop('checked')) {\n return false;\n }\n\n var both = this.root.find(SELECTORS.STATE_BOTH).find('input');\n var loggedIn = this.root.find(SELECTORS.STATE_LOGGED_IN).find('input');\n\n return loggedIn.prop('checked') || both.prop('checked');\n };\n\n /**\n * Check if the processor is enabled when the user is logged out.\n *\n * @method isLoggedOffEnabled\n * @return {bool}\n */\n NotificationProcessor.prototype.isLoggedOffEnabled = function() {\n var none = this.root.find(SELECTORS.STATE_NONE).find('input');\n\n if (none.prop('checked')) {\n return false;\n }\n\n var both = this.root.find(SELECTORS.STATE_BOTH).find('input');\n var loggedOff = this.root.find(SELECTORS.STATE_LOGGED_OFF).find('input');\n\n return loggedOff.prop('checked') || both.prop('checked');\n };\n\n return NotificationProcessor;\n});\n"],"file":"notification_processor.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/notification_processor_settings.min.js.map b/message/amd/build/notification_processor_settings.min.js.map
index a9df440f830..1b7ae94f25b 100644
--- a/message/amd/build/notification_processor_settings.min.js.map
+++ b/message/amd/build/notification_processor_settings.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/notification_processor_settings.js"],"names":["define","$","Ajax","Str","Notification","CustomEvents","Modal","ModalRegistry","Fragment","registered","SELECTORS","SAVE_BUTTON","CANCEL_BUTTON","PROCESSOR","PREFERENCE_ROW","NotificationProcessorSettings","root","call","name","userId","contextId","element","saveButton","getFooter","find","cancelButton","TYPE","prototype","Object","create","constructor","setUserId","id","getUserId","setElement","getElement","setName","getName","setContextId","getContextId","getForm","getBody","disableButtons","prop","enableButtons","loadTitleContent","titlePromise","get_string","setTitle","loadBodyContent","args","userid","type","bodyPromise","loadFragment","setBody","then","bind","fail","exception","loadAllContent","when","show","hide","updateConfiguredStatus","processorHeader","closest","hasClass","processorName","attr","request","methodname","done","result","userconfigured","notifications","removeClass","registerEventListeners","getModal","on","events","activate","e","data","submit","originalEvent","preventDefault","stopPropagation","register"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Load the settings for a message processor.\n *\n * @module core_message/notification_processor_settings\n * @class notification_processor_settings\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/fragment',\n ],\n function(\n $,\n Ajax,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n Fragment\n ) {\n\n var registered = false;\n var SELECTORS = {\n SAVE_BUTTON: '[data-action=\"save\"]',\n CANCEL_BUTTON: '[data-action=\"cancel\"]',\n PROCESSOR: '[data-processor-name]',\n PREFERENCE_ROW: '[data-region=\"preference-row\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal.\n */\n var NotificationProcessorSettings = function(root) {\n Modal.call(this, root);\n this.name = null;\n this.userId = null;\n this.contextId = null;\n this.element = null;\n this.saveButton = this.getFooter().find(SELECTORS.SAVE_BUTTON);\n this.cancelButton = this.getFooter().find(SELECTORS.CANCEL_BUTTON);\n };\n\n NotificationProcessorSettings.TYPE = 'core_message-notification_processor_settings';\n NotificationProcessorSettings.prototype = Object.create(Modal.prototype);\n NotificationProcessorSettings.prototype.constructor = NotificationProcessorSettings;\n\n /**\n * Set the userid to the given value.\n *\n * @method setUserId\n * @param {int} id The notification userid\n */\n NotificationProcessorSettings.prototype.setUserId = function(id) {\n this.userId = id;\n };\n\n /**\n * Retrieve the current userid, if any.\n *\n * @method getUserId\n * @return {int|null} The notification userid\n */\n NotificationProcessorSettings.prototype.getUserId = function() {\n return this.userId;\n };\n\n /**\n * Set the object to the given value.\n *\n * @method setElement\n * @param {object} element The notification node element.\n */\n NotificationProcessorSettings.prototype.setElement = function(element) {\n this.element = element;\n };\n\n /**\n * Retrieve the current element, if any.\n *\n * @method getElement\n * @return {object|null} The notification node element.\n */\n NotificationProcessorSettings.prototype.getElement = function() {\n return this.element;\n };\n\n /**\n * Set the name to the given value.\n *\n * @method setName\n * @param {string} name The notification name.\n */\n NotificationProcessorSettings.prototype.setName = function(name) {\n this.name = name;\n };\n\n /**\n * Retrieve the current name, if any.\n *\n * @method getName\n * @return {string|null} The notification name.\n */\n NotificationProcessorSettings.prototype.getName = function() {\n return this.name;\n };\n /**\n * Set the context id to the given value.\n *\n * @method setContextId\n * @param {Number} id The notification context id\n */\n NotificationProcessorSettings.prototype.setContextId = function(id) {\n this.contextId = id;\n };\n\n /**\n * Retrieve the current context id, if any.\n *\n * @method getContextId\n * @return {Number|null} The notification context id\n */\n NotificationProcessorSettings.prototype.getContextId = function() {\n return this.contextId;\n };\n\n /**\n * Get the form element from the modal.\n *\n * @method getForm\n * @return {object}\n */\n NotificationProcessorSettings.prototype.getForm = function() {\n return this.getBody().find('form');\n };\n\n /**\n * Disable the buttons in the footer.\n *\n * @method disableButtons\n */\n NotificationProcessorSettings.prototype.disableButtons = function() {\n this.saveButton.prop('disabled', true);\n this.cancelButton.prop('disabled', true);\n };\n\n /**\n * Enable the buttons in the footer.\n *\n * @method enableButtons\n */\n NotificationProcessorSettings.prototype.enableButtons = function() {\n this.saveButton.prop('disabled', false);\n this.cancelButton.prop('disabled', false);\n };\n\n /**\n * Load the title for the modal to the appropriate value\n * depending on message outputs.\n *\n * @method loadTitleContent\n * @return {object} A promise resolved with the new title text.\n */\n NotificationProcessorSettings.prototype.loadTitleContent = function() {\n this.titlePromise = Str.get_string('processorsettings', 'message');\n this.setTitle(this.titlePromise);\n\n return this.titlePromise;\n };\n\n /**\n * Load the body for the modal to the appropriate value\n * depending on message outputs.\n *\n * @method loadBodyContent\n * @return {object} A promise resolved with the fragment html and js from\n */\n NotificationProcessorSettings.prototype.loadBodyContent = function() {\n this.disableButtons();\n\n var args = {\n userid: this.getUserId(),\n type: this.getName(),\n };\n\n this.bodyPromise = Fragment.loadFragment('message', 'processor_settings', this.getContextId(), args);\n this.setBody(this.bodyPromise);\n\n this.bodyPromise.then(function() {\n this.enableButtons();\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.bodyPromise;\n };\n\n /**\n * Load both the title and body content.\n *\n * @method loadAllContent\n * @return {object} promise\n */\n NotificationProcessorSettings.prototype.loadAllContent = function() {\n return $.when(this.loadTitleContent(), this.loadBodyContent());\n };\n\n /**\n * Load the modal content before showing it. This\n * is to allow us to re-use the same modal for creating and\n * editing different message outputs within the page.\n *\n * @method show\n */\n NotificationProcessorSettings.prototype.show = function() {\n this.loadAllContent();\n Modal.prototype.show.call(this);\n };\n\n /**\n * Clear the notification from the modal when it's closed so\n * that it is loaded fresh next time it's displayed.\n *\n * @method hide\n */\n NotificationProcessorSettings.prototype.hide = function() {\n Modal.prototype.hide.call(this);\n this.setContextId(null);\n this.setName(null);\n this.setUserId(null);\n };\n\n /**\n * Checks if the processor has been configured. If so then remove the unconfigured\n * status from the interface.\n *\n * @method updateConfiguredStatus\n * @return {Promise|boolean}\n */\n NotificationProcessorSettings.prototype.updateConfiguredStatus = function() {\n var processorHeader = $(this.getElement()).closest(SELECTORS.PROCESSOR);\n\n if (!processorHeader.hasClass('unconfigured')) {\n return false;\n }\n\n var processorName = processorHeader.attr('data-processor-name');\n var request = {\n methodname: 'core_message_get_message_processor',\n args: {\n name: processorName,\n userid: this.userId,\n },\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .done(function(result) {\n // Check if the user has figured configuring the processor.\n if (result.userconfigured) {\n // If they have then we can enable the settings.\n var notifications = $(SELECTORS.PREFERENCE_ROW + ' [data-processor-name=\"' + processorName + '\"]');\n processorHeader.removeClass('unconfigured');\n notifications.removeClass('disabled');\n }\n });\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n NotificationProcessorSettings.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // When the user clicks the save button we trigger the form submission.\n this.getModal().on(CustomEvents.events.activate, SELECTORS.SAVE_BUTTON, function(e, data) {\n this.getForm().submit();\n data.originalEvent.preventDefault();\n }.bind(this));\n\n this.getModal().on('mpp:formsubmitted', function(e) {\n this.hide();\n this.updateConfiguredStatus();\n e.stopPropagation();\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.CANCEL_BUTTON, function(e, data) {\n this.hide();\n data.originalEvent.preventDefault();\n e.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported\n // so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(\n NotificationProcessorSettings.TYPE,\n NotificationProcessorSettings,\n 'core/modal_save_cancel');\n registered = true;\n }\n\n return NotificationProcessorSettings;\n});\n"],"file":"notification_processor_settings.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/notification_processor_settings.js"],"names":["define","$","Ajax","Str","Notification","CustomEvents","Modal","ModalRegistry","Fragment","registered","SELECTORS","SAVE_BUTTON","CANCEL_BUTTON","PROCESSOR","PREFERENCE_ROW","NotificationProcessorSettings","root","call","name","userId","contextId","element","saveButton","getFooter","find","cancelButton","TYPE","prototype","Object","create","constructor","setUserId","id","getUserId","setElement","getElement","setName","getName","setContextId","getContextId","getForm","getBody","disableButtons","prop","enableButtons","loadTitleContent","titlePromise","get_string","setTitle","loadBodyContent","args","userid","type","bodyPromise","loadFragment","setBody","then","bind","fail","exception","loadAllContent","when","show","hide","updateConfiguredStatus","processorHeader","closest","hasClass","processorName","attr","request","methodname","done","result","userconfigured","notifications","removeClass","registerEventListeners","getModal","on","events","activate","e","data","submit","originalEvent","preventDefault","stopPropagation","register"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Load the settings for a message processor.\n *\n * @module core_message/notification_processor_settings\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/fragment',\n ],\n function(\n $,\n Ajax,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n Fragment\n ) {\n\n var registered = false;\n var SELECTORS = {\n SAVE_BUTTON: '[data-action=\"save\"]',\n CANCEL_BUTTON: '[data-action=\"cancel\"]',\n PROCESSOR: '[data-processor-name]',\n PREFERENCE_ROW: '[data-region=\"preference-row\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @class\n * @param {object} root The root jQuery element for the modal.\n */\n var NotificationProcessorSettings = function(root) {\n Modal.call(this, root);\n this.name = null;\n this.userId = null;\n this.contextId = null;\n this.element = null;\n this.saveButton = this.getFooter().find(SELECTORS.SAVE_BUTTON);\n this.cancelButton = this.getFooter().find(SELECTORS.CANCEL_BUTTON);\n };\n\n NotificationProcessorSettings.TYPE = 'core_message-notification_processor_settings';\n NotificationProcessorSettings.prototype = Object.create(Modal.prototype);\n NotificationProcessorSettings.prototype.constructor = NotificationProcessorSettings;\n\n /**\n * Set the userid to the given value.\n *\n * @method setUserId\n * @param {int} id The notification userid\n */\n NotificationProcessorSettings.prototype.setUserId = function(id) {\n this.userId = id;\n };\n\n /**\n * Retrieve the current userid, if any.\n *\n * @method getUserId\n * @return {int|null} The notification userid\n */\n NotificationProcessorSettings.prototype.getUserId = function() {\n return this.userId;\n };\n\n /**\n * Set the object to the given value.\n *\n * @method setElement\n * @param {object} element The notification node element.\n */\n NotificationProcessorSettings.prototype.setElement = function(element) {\n this.element = element;\n };\n\n /**\n * Retrieve the current element, if any.\n *\n * @method getElement\n * @return {object|null} The notification node element.\n */\n NotificationProcessorSettings.prototype.getElement = function() {\n return this.element;\n };\n\n /**\n * Set the name to the given value.\n *\n * @method setName\n * @param {string} name The notification name.\n */\n NotificationProcessorSettings.prototype.setName = function(name) {\n this.name = name;\n };\n\n /**\n * Retrieve the current name, if any.\n *\n * @method getName\n * @return {string|null} The notification name.\n */\n NotificationProcessorSettings.prototype.getName = function() {\n return this.name;\n };\n /**\n * Set the context id to the given value.\n *\n * @method setContextId\n * @param {Number} id The notification context id\n */\n NotificationProcessorSettings.prototype.setContextId = function(id) {\n this.contextId = id;\n };\n\n /**\n * Retrieve the current context id, if any.\n *\n * @method getContextId\n * @return {Number|null} The notification context id\n */\n NotificationProcessorSettings.prototype.getContextId = function() {\n return this.contextId;\n };\n\n /**\n * Get the form element from the modal.\n *\n * @method getForm\n * @return {object}\n */\n NotificationProcessorSettings.prototype.getForm = function() {\n return this.getBody().find('form');\n };\n\n /**\n * Disable the buttons in the footer.\n *\n * @method disableButtons\n */\n NotificationProcessorSettings.prototype.disableButtons = function() {\n this.saveButton.prop('disabled', true);\n this.cancelButton.prop('disabled', true);\n };\n\n /**\n * Enable the buttons in the footer.\n *\n * @method enableButtons\n */\n NotificationProcessorSettings.prototype.enableButtons = function() {\n this.saveButton.prop('disabled', false);\n this.cancelButton.prop('disabled', false);\n };\n\n /**\n * Load the title for the modal to the appropriate value\n * depending on message outputs.\n *\n * @method loadTitleContent\n * @return {object} A promise resolved with the new title text.\n */\n NotificationProcessorSettings.prototype.loadTitleContent = function() {\n this.titlePromise = Str.get_string('processorsettings', 'message');\n this.setTitle(this.titlePromise);\n\n return this.titlePromise;\n };\n\n /**\n * Load the body for the modal to the appropriate value\n * depending on message outputs.\n *\n * @method loadBodyContent\n * @return {object} A promise resolved with the fragment html and js from\n */\n NotificationProcessorSettings.prototype.loadBodyContent = function() {\n this.disableButtons();\n\n var args = {\n userid: this.getUserId(),\n type: this.getName(),\n };\n\n this.bodyPromise = Fragment.loadFragment('message', 'processor_settings', this.getContextId(), args);\n this.setBody(this.bodyPromise);\n\n this.bodyPromise.then(function() {\n this.enableButtons();\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.bodyPromise;\n };\n\n /**\n * Load both the title and body content.\n *\n * @method loadAllContent\n * @return {object} promise\n */\n NotificationProcessorSettings.prototype.loadAllContent = function() {\n return $.when(this.loadTitleContent(), this.loadBodyContent());\n };\n\n /**\n * Load the modal content before showing it. This\n * is to allow us to re-use the same modal for creating and\n * editing different message outputs within the page.\n *\n * @method show\n */\n NotificationProcessorSettings.prototype.show = function() {\n this.loadAllContent();\n Modal.prototype.show.call(this);\n };\n\n /**\n * Clear the notification from the modal when it's closed so\n * that it is loaded fresh next time it's displayed.\n *\n * @method hide\n */\n NotificationProcessorSettings.prototype.hide = function() {\n Modal.prototype.hide.call(this);\n this.setContextId(null);\n this.setName(null);\n this.setUserId(null);\n };\n\n /**\n * Checks if the processor has been configured. If so then remove the unconfigured\n * status from the interface.\n *\n * @method updateConfiguredStatus\n * @return {Promise|boolean}\n */\n NotificationProcessorSettings.prototype.updateConfiguredStatus = function() {\n var processorHeader = $(this.getElement()).closest(SELECTORS.PROCESSOR);\n\n if (!processorHeader.hasClass('unconfigured')) {\n return false;\n }\n\n var processorName = processorHeader.attr('data-processor-name');\n var request = {\n methodname: 'core_message_get_message_processor',\n args: {\n name: processorName,\n userid: this.userId,\n },\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .done(function(result) {\n // Check if the user has figured configuring the processor.\n if (result.userconfigured) {\n // If they have then we can enable the settings.\n var notifications = $(SELECTORS.PREFERENCE_ROW + ' [data-processor-name=\"' + processorName + '\"]');\n processorHeader.removeClass('unconfigured');\n notifications.removeClass('disabled');\n }\n });\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n NotificationProcessorSettings.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // When the user clicks the save button we trigger the form submission.\n this.getModal().on(CustomEvents.events.activate, SELECTORS.SAVE_BUTTON, function(e, data) {\n this.getForm().submit();\n data.originalEvent.preventDefault();\n }.bind(this));\n\n this.getModal().on('mpp:formsubmitted', function(e) {\n this.hide();\n this.updateConfiguredStatus();\n e.stopPropagation();\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.CANCEL_BUTTON, function(e, data) {\n this.hide();\n data.originalEvent.preventDefault();\n e.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported\n // so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(\n NotificationProcessorSettings.TYPE,\n NotificationProcessorSettings,\n 'core/modal_save_cancel');\n registered = true;\n }\n\n return NotificationProcessorSettings;\n});\n"],"file":"notification_processor_settings.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/preferences_notifications_list_controller.min.js.map b/message/amd/build/preferences_notifications_list_controller.min.js.map
index 82d050e1afd..700274e16e6 100644
--- a/message/amd/build/preferences_notifications_list_controller.min.js.map
+++ b/message/amd/build/preferences_notifications_list_controller.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/preferences_notifications_list_controller.js"],"names":["define","$","Ajax","Notification","CustomEvents","NotificationPreference","NotificationProcessorSettings","ModalFactory","SELECTORS","DISABLE_NOTIFICATIONS","DISABLE_NOTIFICATIONS_CONTAINER","PREFERENCE","PREFERENCE_ROW","PREFERENCE_INPUT","PROCESSOR_SETTING","PreferencesController","element","root","userId","attr","registerEventListeners","prototype","isDisabled","hasClass","setDisabled","addClass","find","prop","setEnabled","removeClass","toggleDisableAllStatus","checkbox","container","ischecked","Deferred","resolve","request","methodname","args","userid","emailstop","call","done","bind","always","fail","exception","disabledNotificationsElement","events","activate","on","e","preferenceElement","target","closest","preferenceRow","preference","save","eventFormPromise","create","type","TYPE","preventDefault","then","modal","setUserId","setName","setContextId","setElement","show","stopImmediatePropagation"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the preferences for the list of notification types on the\n * message preference page\n *\n * @module core_message/preferences_notifications_list_controller\n * @class preferences_notifications_list_controller\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/ajax',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core_message/notification_preference',\n 'core_message/notification_processor_settings',\n 'core/modal_factory',\n ],\n function(\n $,\n Ajax,\n Notification,\n CustomEvents,\n NotificationPreference,\n NotificationProcessorSettings,\n ModalFactory\n ) {\n\n var SELECTORS = {\n DISABLE_NOTIFICATIONS: '[data-region=\"disable-notification-container\"] [data-disable-notifications]',\n DISABLE_NOTIFICATIONS_CONTAINER: '[data-region=\"disable-notification-container\"]',\n PREFERENCE: '[data-state]',\n PREFERENCE_ROW: '[data-region=\"preference-row\"]',\n PREFERENCE_INPUT: '[data-state] input',\n PROCESSOR_SETTING: '[data-processor-setting]',\n };\n\n /**\n * Constructor for the PreferencesController.\n *\n * @param {object} element jQuery object root element of the preference\n */\n var PreferencesController = function(element) {\n this.root = $(element);\n this.userId = this.root.attr('data-user-id');\n\n this.registerEventListeners();\n };\n\n /**\n * Check if the preferences are all disabled.\n *\n * @method isDisabled\n * @return {bool}\n */\n PreferencesController.prototype.isDisabled = function() {\n return this.root.hasClass('disabled');\n };\n\n /**\n * Disable all of the preferences.\n *\n * @method setDisabled\n */\n PreferencesController.prototype.setDisabled = function() {\n this.root.addClass('disabled');\n this.root.find(SELECTORS.PREFERENCE_INPUT).prop('disabled', true);\n };\n\n /**\n * Enable all of the preferences.\n *\n * @method setEnabled\n */\n PreferencesController.prototype.setEnabled = function() {\n this.root.removeClass('disabled');\n this.root.find(SELECTORS.PREFERENCE_INPUT).prop('disabled', false);\n };\n\n /**\n * Update the disable all notifications user property in the DOM and\n * send a request to update on the server.\n *\n * @method toggleDisableAllStatus\n * @return {Promise}\n */\n PreferencesController.prototype.toggleDisableAllStatus = function() {\n var checkbox = $(SELECTORS.DISABLE_NOTIFICATIONS);\n var container = $(SELECTORS.DISABLE_NOTIFICATIONS_CONTAINER);\n var ischecked = checkbox.prop('checked');\n\n if (container.hasClass('loading')) {\n return $.Deferred().resolve();\n }\n\n container.addClass('loading');\n\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n userid: this.userId,\n emailstop: ischecked ? 1 : 0,\n }\n };\n\n return Ajax.call([request])[0]\n .done(function() {\n if (ischecked) {\n this.setDisabled();\n } else {\n this.setEnabled();\n }\n }.bind(this))\n .always(function() {\n container.removeClass('loading');\n })\n .fail(Notification.exception);\n };\n\n /**\n * Set up all of the event listeners for the PreferencesController.\n *\n * @method registerEventListeners\n */\n PreferencesController.prototype.registerEventListeners = function() {\n var disabledNotificationsElement = $(SELECTORS.DISABLE_NOTIFICATIONS);\n\n CustomEvents.define(this.root, [\n CustomEvents.events.activate,\n ]);\n\n this.root.on('change', function(e) {\n if (!this.isDisabled()) {\n var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE);\n var preferenceRow = $(e.target).closest(SELECTORS.PREFERENCE_ROW);\n var preference = new NotificationPreference(preferenceRow, this.userId);\n\n preferenceElement.addClass('loading');\n preference.save().always(function() {\n preferenceElement.removeClass('loading');\n });\n }\n }.bind(this));\n\n var eventFormPromise = ModalFactory.create({\n type: NotificationProcessorSettings.TYPE,\n });\n\n this.root.on(CustomEvents.events.activate, SELECTORS.PROCESSOR_SETTING, function(e) {\n var element = $(e.target).closest(SELECTORS.PROCESSOR_SETTING);\n\n e.preventDefault();\n eventFormPromise.then(function(modal) {\n // Configure modal with element settings.\n modal.setUserId($(element).attr('data-user-id'));\n modal.setName($(element).attr('data-name'));\n modal.setContextId($(element).attr('data-context-id'));\n modal.setElement(element);\n modal.show();\n\n e.stopImmediatePropagation();\n return;\n }).fail(Notification.exception);\n });\n\n CustomEvents.define(disabledNotificationsElement, [\n CustomEvents.events.activate\n ]);\n\n disabledNotificationsElement.on(CustomEvents.events.activate, function() {\n this.toggleDisableAllStatus();\n }.bind(this));\n };\n\n return PreferencesController;\n});\n"],"file":"preferences_notifications_list_controller.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/preferences_notifications_list_controller.js"],"names":["define","$","Ajax","Notification","CustomEvents","NotificationPreference","NotificationProcessorSettings","ModalFactory","SELECTORS","DISABLE_NOTIFICATIONS","DISABLE_NOTIFICATIONS_CONTAINER","PREFERENCE","PREFERENCE_ROW","PREFERENCE_INPUT","PROCESSOR_SETTING","PreferencesController","element","root","userId","attr","registerEventListeners","prototype","isDisabled","hasClass","setDisabled","addClass","find","prop","setEnabled","removeClass","toggleDisableAllStatus","checkbox","container","ischecked","Deferred","resolve","request","methodname","args","userid","emailstop","call","done","bind","always","fail","exception","disabledNotificationsElement","events","activate","on","e","preferenceElement","target","closest","preferenceRow","preference","save","eventFormPromise","create","type","TYPE","preventDefault","then","modal","setUserId","setName","setContextId","setElement","show","stopImmediatePropagation"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the preferences for the list of notification types on the\n * message preference page\n *\n * @module core_message/preferences_notifications_list_controller\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/ajax',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core_message/notification_preference',\n 'core_message/notification_processor_settings',\n 'core/modal_factory',\n ],\n function(\n $,\n Ajax,\n Notification,\n CustomEvents,\n NotificationPreference,\n NotificationProcessorSettings,\n ModalFactory\n ) {\n\n var SELECTORS = {\n DISABLE_NOTIFICATIONS: '[data-region=\"disable-notification-container\"] [data-disable-notifications]',\n DISABLE_NOTIFICATIONS_CONTAINER: '[data-region=\"disable-notification-container\"]',\n PREFERENCE: '[data-state]',\n PREFERENCE_ROW: '[data-region=\"preference-row\"]',\n PREFERENCE_INPUT: '[data-state] input',\n PROCESSOR_SETTING: '[data-processor-setting]',\n };\n\n /**\n * Constructor for the PreferencesController.\n *\n * @class\n * @param {object} element jQuery object root element of the preference\n */\n var PreferencesController = function(element) {\n this.root = $(element);\n this.userId = this.root.attr('data-user-id');\n\n this.registerEventListeners();\n };\n\n /**\n * Check if the preferences are all disabled.\n *\n * @method isDisabled\n * @return {bool}\n */\n PreferencesController.prototype.isDisabled = function() {\n return this.root.hasClass('disabled');\n };\n\n /**\n * Disable all of the preferences.\n *\n * @method setDisabled\n */\n PreferencesController.prototype.setDisabled = function() {\n this.root.addClass('disabled');\n this.root.find(SELECTORS.PREFERENCE_INPUT).prop('disabled', true);\n };\n\n /**\n * Enable all of the preferences.\n *\n * @method setEnabled\n */\n PreferencesController.prototype.setEnabled = function() {\n this.root.removeClass('disabled');\n this.root.find(SELECTORS.PREFERENCE_INPUT).prop('disabled', false);\n };\n\n /**\n * Update the disable all notifications user property in the DOM and\n * send a request to update on the server.\n *\n * @method toggleDisableAllStatus\n * @return {Promise}\n */\n PreferencesController.prototype.toggleDisableAllStatus = function() {\n var checkbox = $(SELECTORS.DISABLE_NOTIFICATIONS);\n var container = $(SELECTORS.DISABLE_NOTIFICATIONS_CONTAINER);\n var ischecked = checkbox.prop('checked');\n\n if (container.hasClass('loading')) {\n return $.Deferred().resolve();\n }\n\n container.addClass('loading');\n\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n userid: this.userId,\n emailstop: ischecked ? 1 : 0,\n }\n };\n\n return Ajax.call([request])[0]\n .done(function() {\n if (ischecked) {\n this.setDisabled();\n } else {\n this.setEnabled();\n }\n }.bind(this))\n .always(function() {\n container.removeClass('loading');\n })\n .fail(Notification.exception);\n };\n\n /**\n * Set up all of the event listeners for the PreferencesController.\n *\n * @method registerEventListeners\n */\n PreferencesController.prototype.registerEventListeners = function() {\n var disabledNotificationsElement = $(SELECTORS.DISABLE_NOTIFICATIONS);\n\n CustomEvents.define(this.root, [\n CustomEvents.events.activate,\n ]);\n\n this.root.on('change', function(e) {\n if (!this.isDisabled()) {\n var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE);\n var preferenceRow = $(e.target).closest(SELECTORS.PREFERENCE_ROW);\n var preference = new NotificationPreference(preferenceRow, this.userId);\n\n preferenceElement.addClass('loading');\n preference.save().always(function() {\n preferenceElement.removeClass('loading');\n });\n }\n }.bind(this));\n\n var eventFormPromise = ModalFactory.create({\n type: NotificationProcessorSettings.TYPE,\n });\n\n this.root.on(CustomEvents.events.activate, SELECTORS.PROCESSOR_SETTING, function(e) {\n var element = $(e.target).closest(SELECTORS.PROCESSOR_SETTING);\n\n e.preventDefault();\n eventFormPromise.then(function(modal) {\n // Configure modal with element settings.\n modal.setUserId($(element).attr('data-user-id'));\n modal.setName($(element).attr('data-name'));\n modal.setContextId($(element).attr('data-context-id'));\n modal.setElement(element);\n modal.show();\n\n e.stopImmediatePropagation();\n return;\n }).fail(Notification.exception);\n });\n\n CustomEvents.define(disabledNotificationsElement, [\n CustomEvents.events.activate\n ]);\n\n disabledNotificationsElement.on(CustomEvents.events.activate, function() {\n this.toggleDisableAllStatus();\n }.bind(this));\n };\n\n return PreferencesController;\n});\n"],"file":"preferences_notifications_list_controller.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/preferences_processor_form.min.js.map b/message/amd/build/preferences_processor_form.min.js.map
index 4cd0653d959..48b5d9a387d 100644
--- a/message/amd/build/preferences_processor_form.min.js.map
+++ b/message/amd/build/preferences_processor_form.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/preferences_processor_form.js"],"names":["define","$","Ajax","Notification","ProcessorForm","element","root","userId","attr","name","find","on","e","preventDefault","save","done","trigger","bind","prototype","startLoading","addClass","stopLoading","removeClass","isLoading","hasClass","Deferred","data","serializeArray","request","methodname","args","userid","formvalues","call","fail","exception","always"],"mappings":"AAuBAA,OAAM,2CAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,mBAAxB,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgC,CAMpC,GAAIC,CAAAA,CAAa,CAAG,SAASC,CAAT,CAAkB,CAClC,KAAKC,IAAL,CAAYL,CAAC,CAACI,CAAD,CAAb,CACA,KAAKE,MAAL,CAAc,KAAKD,IAAL,CAAUE,IAAV,CAAe,cAAf,CAAd,CACA,KAAKC,IAAL,CAAY,KAAKH,IAAL,CAAUE,IAAV,CAAe,qBAAf,CAAZ,CAEA,KAAKF,IAAL,CAAUI,IAAV,CAAe,MAAf,EAAuBC,EAAvB,CAA0B,QAA1B,CAAoC,SAASC,CAAT,CAAY,CAC5CA,CAAC,CAACC,cAAF,GACA,KAAKC,IAAL,GAAYC,IAAZ,CAAiB,UAAW,CACxBd,CAAC,CAACI,CAAD,CAAD,CAAWW,OAAX,CAAmB,mBAAnB,CACH,CAFD,CAGH,CALmC,CAKlCC,IALkC,CAK7B,IAL6B,CAApC,CAMH,CAXD,CAkBAb,CAAa,CAACc,SAAd,CAAwBC,YAAxB,CAAuC,UAAW,CAC9C,KAAKb,IAAL,CAAUc,QAAV,CAAmB,SAAnB,CACH,CAFD,CASAhB,CAAa,CAACc,SAAd,CAAwBG,WAAxB,CAAsC,UAAW,CAC7C,KAAKf,IAAL,CAAUgB,WAAV,CAAsB,SAAtB,CACH,CAFD,CAUAlB,CAAa,CAACc,SAAd,CAAwBK,SAAxB,CAAoC,UAAW,CAC3C,MAAO,MAAKjB,IAAL,CAAUkB,QAAV,CAAmB,SAAnB,CACV,CAFD,CAUApB,CAAa,CAACc,SAAd,CAAwBJ,IAAxB,CAA+B,UAAW,CACtC,GAAI,KAAKS,SAAL,EAAJ,CAAsB,CAClB,MAAOtB,CAAAA,CAAC,CAACwB,QAAF,EACV,CAED,KAAKN,YAAL,GALsC,GAOlCO,CAAAA,CAAI,CAAG,KAAKpB,IAAL,CAAUI,IAAV,CAAe,MAAf,EAAuBiB,cAAvB,EAP2B,CAQlCC,CAAO,CAAG,CACVC,UAAU,CAAE,4CADF,CAEVC,IAAI,CAAE,CACFC,MAAM,CAAE,KAAKxB,MADX,CAEFE,IAAI,CAAE,KAAKA,IAFT,CAGFuB,UAAU,CAAEN,CAHV,CAFI,CARwB,CAiBtC,MAAOxB,CAAAA,CAAI,CAAC+B,IAAL,CAAU,CAACL,CAAD,CAAV,EAAqB,CAArB,EACFM,IADE,CACG/B,CAAY,CAACgC,SADhB,EAEFC,MAFE,CAEK,UAAW,CACf,KAAKf,WAAL,EACH,CAFO,CAENJ,IAFM,CAED,IAFC,CAFL,CAKV,CAtBD,CAwBA,MAAOb,CAAAA,CACV,CA/EK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Manages the processor form on the message preferences page.\n *\n * @module core_message/preferences_processor_form\n * @class preferences_processor_form\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'],\n function($, Ajax, Notification) {\n /**\n * Constructor for the ProcessorForm.\n *\n * @param {object} element jQuery object root element of the preference\n */\n var ProcessorForm = function(element) {\n this.root = $(element);\n this.userId = this.root.attr('data-user-id');\n this.name = this.root.attr('data-processor-name');\n\n this.root.find('form').on('submit', function(e) {\n e.preventDefault();\n this.save().done(function() {\n $(element).trigger('mpp:formsubmitted');\n });\n }.bind(this));\n };\n\n /**\n * Flag the processor as loading.\n *\n * @method startLoading\n */\n ProcessorForm.prototype.startLoading = function() {\n this.root.addClass('loading');\n };\n\n /**\n * Remove the loading flag for this processor.\n *\n * @method stopLoading\n */\n ProcessorForm.prototype.stopLoading = function() {\n this.root.removeClass('loading');\n };\n\n /**\n * Check if this processor is loading.\n *\n * @method isLoading\n * @return {bool}\n */\n ProcessorForm.prototype.isLoading = function() {\n return this.root.hasClass('loading');\n };\n\n /**\n * Persist the processor configuration.\n *\n * @method save\n * @return {object} jQuery promise\n */\n ProcessorForm.prototype.save = function() {\n if (this.isLoading()) {\n return $.Deferred();\n }\n\n this.startLoading();\n\n var data = this.root.find('form').serializeArray();\n var request = {\n methodname: 'core_message_message_processor_config_form',\n args: {\n userid: this.userId,\n name: this.name,\n formvalues: data,\n }\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n this.stopLoading();\n }.bind(this));\n };\n\n return ProcessorForm;\n});\n"],"file":"preferences_processor_form.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/preferences_processor_form.js"],"names":["define","$","Ajax","Notification","ProcessorForm","element","root","userId","attr","name","find","on","e","preventDefault","save","done","trigger","bind","prototype","startLoading","addClass","stopLoading","removeClass","isLoading","hasClass","Deferred","data","serializeArray","request","methodname","args","userid","formvalues","call","fail","exception","always"],"mappings":"AAsBAA,OAAM,2CAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,mBAAxB,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgC,CAOpC,GAAIC,CAAAA,CAAa,CAAG,SAASC,CAAT,CAAkB,CAClC,KAAKC,IAAL,CAAYL,CAAC,CAACI,CAAD,CAAb,CACA,KAAKE,MAAL,CAAc,KAAKD,IAAL,CAAUE,IAAV,CAAe,cAAf,CAAd,CACA,KAAKC,IAAL,CAAY,KAAKH,IAAL,CAAUE,IAAV,CAAe,qBAAf,CAAZ,CAEA,KAAKF,IAAL,CAAUI,IAAV,CAAe,MAAf,EAAuBC,EAAvB,CAA0B,QAA1B,CAAoC,SAASC,CAAT,CAAY,CAC5CA,CAAC,CAACC,cAAF,GACA,KAAKC,IAAL,GAAYC,IAAZ,CAAiB,UAAW,CACxBd,CAAC,CAACI,CAAD,CAAD,CAAWW,OAAX,CAAmB,mBAAnB,CACH,CAFD,CAGH,CALmC,CAKlCC,IALkC,CAK7B,IAL6B,CAApC,CAMH,CAXD,CAkBAb,CAAa,CAACc,SAAd,CAAwBC,YAAxB,CAAuC,UAAW,CAC9C,KAAKb,IAAL,CAAUc,QAAV,CAAmB,SAAnB,CACH,CAFD,CASAhB,CAAa,CAACc,SAAd,CAAwBG,WAAxB,CAAsC,UAAW,CAC7C,KAAKf,IAAL,CAAUgB,WAAV,CAAsB,SAAtB,CACH,CAFD,CAUAlB,CAAa,CAACc,SAAd,CAAwBK,SAAxB,CAAoC,UAAW,CAC3C,MAAO,MAAKjB,IAAL,CAAUkB,QAAV,CAAmB,SAAnB,CACV,CAFD,CAUApB,CAAa,CAACc,SAAd,CAAwBJ,IAAxB,CAA+B,UAAW,CACtC,GAAI,KAAKS,SAAL,EAAJ,CAAsB,CAClB,MAAOtB,CAAAA,CAAC,CAACwB,QAAF,EACV,CAED,KAAKN,YAAL,GALsC,GAOlCO,CAAAA,CAAI,CAAG,KAAKpB,IAAL,CAAUI,IAAV,CAAe,MAAf,EAAuBiB,cAAvB,EAP2B,CAQlCC,CAAO,CAAG,CACVC,UAAU,CAAE,4CADF,CAEVC,IAAI,CAAE,CACFC,MAAM,CAAE,KAAKxB,MADX,CAEFE,IAAI,CAAE,KAAKA,IAFT,CAGFuB,UAAU,CAAEN,CAHV,CAFI,CARwB,CAiBtC,MAAOxB,CAAAA,CAAI,CAAC+B,IAAL,CAAU,CAACL,CAAD,CAAV,EAAqB,CAArB,EACFM,IADE,CACG/B,CAAY,CAACgC,SADhB,EAEFC,MAFE,CAEK,UAAW,CACf,KAAKf,WAAL,EACH,CAFO,CAENJ,IAFM,CAED,IAFC,CAFL,CAKV,CAtBD,CAwBA,MAAOb,CAAAA,CACV,CAhFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Manages the processor form on the message preferences page.\n *\n * @module core_message/preferences_processor_form\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'],\n function($, Ajax, Notification) {\n /**\n * Constructor for the ProcessorForm.\n *\n * @class\n * @param {object} element jQuery object root element of the preference\n */\n var ProcessorForm = function(element) {\n this.root = $(element);\n this.userId = this.root.attr('data-user-id');\n this.name = this.root.attr('data-processor-name');\n\n this.root.find('form').on('submit', function(e) {\n e.preventDefault();\n this.save().done(function() {\n $(element).trigger('mpp:formsubmitted');\n });\n }.bind(this));\n };\n\n /**\n * Flag the processor as loading.\n *\n * @method startLoading\n */\n ProcessorForm.prototype.startLoading = function() {\n this.root.addClass('loading');\n };\n\n /**\n * Remove the loading flag for this processor.\n *\n * @method stopLoading\n */\n ProcessorForm.prototype.stopLoading = function() {\n this.root.removeClass('loading');\n };\n\n /**\n * Check if this processor is loading.\n *\n * @method isLoading\n * @return {bool}\n */\n ProcessorForm.prototype.isLoading = function() {\n return this.root.hasClass('loading');\n };\n\n /**\n * Persist the processor configuration.\n *\n * @method save\n * @return {object} jQuery promise\n */\n ProcessorForm.prototype.save = function() {\n if (this.isLoading()) {\n return $.Deferred();\n }\n\n this.startLoading();\n\n var data = this.root.find('form').serializeArray();\n var request = {\n methodname: 'core_message_message_processor_config_form',\n args: {\n userid: this.userId,\n name: this.name,\n formvalues: data,\n }\n };\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n this.stopLoading();\n }.bind(this));\n };\n\n return ProcessorForm;\n});\n"],"file":"preferences_processor_form.min.js"}
\ No newline at end of file
diff --git a/message/amd/build/toggle_contact_button.min.js.map b/message/amd/build/toggle_contact_button.min.js.map
index 7c22e88a194..6fdea0e95f2 100644
--- a/message/amd/build/toggle_contact_button.min.js.map
+++ b/message/amd/build/toggle_contact_button.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/toggle_contact_button.js"],"names":["define","$","Ajax","Templates","Notification","CustomEvents","isContact","element","attr","setContact","setNotContact","getUserId","getCurrentUserId","isLoading","hasClass","sendRequest","request","Deferred","addClass","call","fail","exception","always","removeClass","removeAttr","addContact","methodname","args","userid","requesteduserid","done","render","html","js","replaceNodeContents","removeContact","userids","enhance","children","length","append","events","activate","on","e","data","preventDefault","originalEvent"],"mappings":"AAuBAA,OAAM,sCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,gBAAxB,CAA0C,mBAA1C,CAA+D,gCAA/D,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA6BC,CAA7B,CAA2CC,CAA3C,CAAyD,IASzDC,CAAAA,CAAS,CAAG,SAASC,CAAT,CAAkB,CAC9B,MAA0C,GAAnC,EAAAA,CAAO,CAACC,IAAR,CAAa,iBAAb,CACV,CAX4D,CAmBzDC,CAAU,CAAG,SAASF,CAAT,CAAkB,CAC/BA,CAAO,CAACC,IAAR,CAAa,iBAAb,CAAgC,GAAhC,CACH,CArB4D,CA6BzDE,CAAa,CAAG,SAASH,CAAT,CAAkB,CAClCA,CAAO,CAACC,IAAR,CAAa,iBAAb,CAAgC,GAAhC,CACH,CA/B4D,CAwCzDG,CAAS,CAAG,SAASJ,CAAT,CAAkB,CAC9B,MAAOA,CAAAA,CAAO,CAACC,IAAR,CAAa,aAAb,CACV,CA1C4D,CAmDzDI,CAAgB,CAAG,SAASL,CAAT,CAAkB,CACrC,MAAOA,CAAAA,CAAO,CAACC,IAAR,CAAa,oBAAb,CACV,CArD4D,CA8DzDK,CAAS,CAAG,SAASN,CAAT,CAAkB,CAC9B,MAAOA,CAAAA,CAAO,CAACO,QAAR,CAAiB,SAAjB,GAA+BP,CAAO,CAACC,IAAR,CAAa,UAAb,CACzC,CAhE4D,CA2EzDO,CAAW,CAAG,SAASR,CAAT,CAAkBS,CAAlB,CAA2B,CACzC,GAAIH,CAAS,CAACN,CAAD,CAAb,CAAwB,CACpB,MAAON,CAAAA,CAAC,CAACgB,QAAF,EACV,CAEDV,CAAO,CAACW,QAAR,CAAiB,SAAjB,EACAX,CAAO,CAACC,IAAR,CAAa,UAAb,CAAyB,UAAzB,EAEA,MAAON,CAAAA,CAAI,CAACiB,IAAL,CAAU,CAACH,CAAD,CAAV,EAAqB,CAArB,EACFI,IADE,CACGhB,CAAY,CAACiB,SADhB,EAEFC,MAFE,CAEK,UAAW,CACff,CAAO,CAACgB,WAAR,CAAoB,SAApB,EACAhB,CAAO,CAACiB,UAAR,CAAmB,UAAnB,CACH,CALE,CAMV,CAzF4D,CAmGzDC,CAAU,CAAG,SAASlB,CAAT,CAAkB,CAC/B,GAAIM,CAAS,CAACN,CAAD,CAAb,CAAwB,CACpB,MACH,CAED,GAAIS,CAAAA,CAAO,CAAG,CACVU,UAAU,CAAE,qCADF,CAEVC,IAAI,CAAE,CACFC,MAAM,CAAEhB,CAAgB,CAACL,CAAD,CADtB,CAEFsB,eAAe,CAAElB,CAAS,CAACJ,CAAD,CAFxB,CAFI,CAAd,CAOAQ,CAAW,CAACR,CAAD,CAAUS,CAAV,CAAX,CAA8Bc,IAA9B,CAAmC,UAAW,CAC1CrB,CAAU,CAACF,CAAD,CAAV,CACAJ,CAAS,CAAC4B,MAAV,CAAiB,+BAAjB,CAAkD,EAAlD,EAAsDD,IAAtD,CAA2D,SAASE,CAAT,CAAeC,CAAf,CAAmB,CAC1E9B,CAAS,CAAC+B,mBAAV,CAA8B3B,CAA9B,CAAuCyB,CAAvC,CAA6CC,CAA7C,CACH,CAFD,CAGH,CALD,CAMH,CArH4D,CA+HzDE,CAAa,CAAG,SAAS5B,CAAT,CAAkB,CAClC,GAAIM,CAAS,CAACN,CAAD,CAAb,CAAwB,CACpB,MACH,CAED,GAAIS,CAAAA,CAAO,CAAG,CACVU,UAAU,CAAE,8BADF,CAEVC,IAAI,CAAE,CACFS,OAAO,CAAE,CAACzB,CAAS,CAACJ,CAAD,CAAV,CADP,CAFI,CAAd,CAOAQ,CAAW,CAACR,CAAD,CAAUS,CAAV,CAAX,CAA8Bc,IAA9B,CAAmC,UAAW,CAC1CpB,CAAa,CAACH,CAAD,CAAb,CACAJ,CAAS,CAAC4B,MAAV,CAAiB,4BAAjB,CAA+C,EAA/C,EAAmDD,IAAnD,CAAwD,SAASE,CAAT,CAAeC,CAAf,CAAmB,CACvE9B,CAAS,CAAC+B,mBAAV,CAA8B3B,CAA9B,CAAuCyB,CAAvC,CAA6CC,CAA7C,CACH,CAFD,CAGH,CALD,CAMH,CAjJ4D,CAiL7D,MAA0D,CACtDI,OAAO,CAxBG,QAAVA,CAAAA,OAAU,CAAS9B,CAAT,CAAkB,CAC5BA,CAAO,CAAGN,CAAC,CAACM,CAAD,CAAX,CAEA,GAAI,CAACA,CAAO,CAAC+B,QAAR,CAAiB,eAAjB,EAAkCC,MAAvC,CAA+C,CAE3CpC,CAAS,CAAC4B,MAAV,CAAiB,cAAjB,CAAiC,EAAjC,EAAqCD,IAArC,CAA0C,SAASE,CAAT,CAAeC,CAAf,CAAmB,CACzD1B,CAAO,CAACiC,MAAR,CAAeR,CAAf,CAAqBC,CAArB,CACH,CAFD,CAGH,CAED5B,CAAY,CAACL,MAAb,CAAoBO,CAApB,CAA6B,CAACF,CAAY,CAACoC,MAAb,CAAoBC,QAArB,CAA7B,EAEAnC,CAAO,CAACoC,EAAR,CAAWtC,CAAY,CAACoC,MAAb,CAAoBC,QAA/B,CAAyC,SAASE,CAAT,CAAYC,CAAZ,CAAkB,CACvD,GAAIvC,CAAS,CAACC,CAAD,CAAb,CAAwB,CACpB4B,CAAa,CAAC5B,CAAD,CAChB,CAFD,IAEO,CACHkB,CAAU,CAAClB,CAAD,CACb,CACDqC,CAAC,CAACE,cAAF,GACAD,CAAI,CAACE,aAAL,CAAmBD,cAAnB,EACH,CARD,CASH,CAEyD,CAG7D,CArLK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Module to add/remove contact using ajax.\n *\n * @module core_message/toggle_contact_button\n * @class toggle_contact_button\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/custom_interaction_events'],\n function($, Ajax, Templates, Notification, CustomEvents) {\n\n /**\n * Check the state of the element, if the current user is a contact or not.\n *\n * @method isContact\n * @param {object} element jQuery object for the button\n * @return {bool}\n */\n var isContact = function(element) {\n return element.attr('data-is-contact') == '1';\n };\n\n /**\n * Record that the user is a contact.\n *\n * @method setContact\n * @param {object} element jQuery object for the button\n */\n var setContact = function(element) {\n element.attr('data-is-contact', '1');\n };\n\n /**\n * Record that the user is not a contact.\n *\n * @method setNotContact\n * @param {object} element jQuery object for the button\n */\n var setNotContact = function(element) {\n element.attr('data-is-contact', '0');\n };\n\n /**\n * Get the id for the user being viewed.\n *\n * @method getUserId\n * @param {object} element jQuery object for the button\n * @return {int}\n */\n var getUserId = function(element) {\n return element.attr('data-userid');\n };\n\n /**\n * Get the id for the logged in user.\n *\n * @method getUserId\n * @param {object} element jQuery object for the button\n * @return {int}\n */\n var getCurrentUserId = function(element) {\n return element.attr('data-currentuserid');\n };\n\n /**\n * Check if this element is currently loading.\n *\n * @method isLoading\n * @param {object} element jQuery object for the button\n * @return {bool}\n */\n var isLoading = function(element) {\n return element.hasClass('loading') || element.attr('disabled');\n };\n\n /**\n * Sends an ajax request to the server and handles the element state\n * while the request is being performed.\n *\n * @method sendRequest\n * @param {object} element jQuery object for the button\n * @param {object} request Request hash to send\n * @return {object} jQuery promise\n */\n var sendRequest = function(element, request) {\n if (isLoading(element)) {\n return $.Deferred();\n }\n\n element.addClass('loading');\n element.attr('disabled', 'disabled');\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n element.removeClass('loading');\n element.removeAttr('disabled');\n });\n };\n\n /**\n * Send a request to the server to add the current user as\n * a contact. The contents of the button are changed to the\n * remove contact button upon success.\n *\n * @method addContact\n * @param {object} element jQuery object for the button\n */\n var addContact = function(element) {\n if (isLoading(element)) {\n return;\n }\n\n var request = {\n methodname: 'core_message_create_contact_request',\n args: {\n userid: getCurrentUserId(element),\n requesteduserid: getUserId(element),\n }\n };\n sendRequest(element, request).done(function() {\n setContact(element);\n Templates.render('message/remove_contact_button', {}).done(function(html, js) {\n Templates.replaceNodeContents(element, html, js);\n });\n });\n };\n\n /**\n * Send a request to the server to remove the current user as\n * a contact. The contents of the button are changed to the\n * add contact button upon success.\n *\n * @method removeContact\n * @param {object} element jQuery object for the button\n */\n var removeContact = function(element) {\n if (isLoading(element)) {\n return;\n }\n\n var request = {\n methodname: 'core_message_delete_contacts',\n args: {\n userids: [getUserId(element)],\n }\n };\n\n sendRequest(element, request).done(function() {\n setNotContact(element);\n Templates.render('message/add_contact_button', {}).done(function(html, js) {\n Templates.replaceNodeContents(element, html, js);\n });\n });\n };\n\n /**\n * Enhances the given element with a loading gif and event handles to make\n * ajax requests to add or remove a contact where appropriate.\n *\n * @method enhance\n * @param {object} element jQuery object for the button\n */\n var enhance = function(element) {\n element = $(element);\n\n if (!element.children('.loading-icon').length) {\n // Add the loading gif if it isn't already there.\n Templates.render('core/loading', {}).done(function(html, js) {\n element.append(html, js);\n });\n }\n\n CustomEvents.define(element, [CustomEvents.events.activate]);\n\n element.on(CustomEvents.events.activate, function(e, data) {\n if (isContact(element)) {\n removeContact(element);\n } else {\n addContact(element);\n }\n e.preventDefault();\n data.originalEvent.preventDefault();\n });\n };\n\n return /** @alias module:message/toggle_contact_button */ {\n enhance: enhance\n };\n});\n"],"file":"toggle_contact_button.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/toggle_contact_button.js"],"names":["define","$","Ajax","Templates","Notification","CustomEvents","isContact","element","attr","setContact","setNotContact","getUserId","getCurrentUserId","isLoading","hasClass","sendRequest","request","Deferred","addClass","call","fail","exception","always","removeClass","removeAttr","addContact","methodname","args","userid","requesteduserid","done","render","html","js","replaceNodeContents","removeContact","userids","enhance","children","length","append","events","activate","on","e","data","preventDefault","originalEvent"],"mappings":"AAsBAA,OAAM,sCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,gBAAxB,CAA0C,mBAA1C,CAA+D,gCAA/D,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA6BC,CAA7B,CAA2CC,CAA3C,CAAyD,IASzDC,CAAAA,CAAS,CAAG,SAASC,CAAT,CAAkB,CAC9B,MAA0C,GAAnC,EAAAA,CAAO,CAACC,IAAR,CAAa,iBAAb,CACV,CAX4D,CAmBzDC,CAAU,CAAG,SAASF,CAAT,CAAkB,CAC/BA,CAAO,CAACC,IAAR,CAAa,iBAAb,CAAgC,GAAhC,CACH,CArB4D,CA6BzDE,CAAa,CAAG,SAASH,CAAT,CAAkB,CAClCA,CAAO,CAACC,IAAR,CAAa,iBAAb,CAAgC,GAAhC,CACH,CA/B4D,CAwCzDG,CAAS,CAAG,SAASJ,CAAT,CAAkB,CAC9B,MAAOA,CAAAA,CAAO,CAACC,IAAR,CAAa,aAAb,CACV,CA1C4D,CAmDzDI,CAAgB,CAAG,SAASL,CAAT,CAAkB,CACrC,MAAOA,CAAAA,CAAO,CAACC,IAAR,CAAa,oBAAb,CACV,CArD4D,CA8DzDK,CAAS,CAAG,SAASN,CAAT,CAAkB,CAC9B,MAAOA,CAAAA,CAAO,CAACO,QAAR,CAAiB,SAAjB,GAA+BP,CAAO,CAACC,IAAR,CAAa,UAAb,CACzC,CAhE4D,CA2EzDO,CAAW,CAAG,SAASR,CAAT,CAAkBS,CAAlB,CAA2B,CACzC,GAAIH,CAAS,CAACN,CAAD,CAAb,CAAwB,CACpB,MAAON,CAAAA,CAAC,CAACgB,QAAF,EACV,CAEDV,CAAO,CAACW,QAAR,CAAiB,SAAjB,EACAX,CAAO,CAACC,IAAR,CAAa,UAAb,CAAyB,UAAzB,EAEA,MAAON,CAAAA,CAAI,CAACiB,IAAL,CAAU,CAACH,CAAD,CAAV,EAAqB,CAArB,EACFI,IADE,CACGhB,CAAY,CAACiB,SADhB,EAEFC,MAFE,CAEK,UAAW,CACff,CAAO,CAACgB,WAAR,CAAoB,SAApB,EACAhB,CAAO,CAACiB,UAAR,CAAmB,UAAnB,CACH,CALE,CAMV,CAzF4D,CAmGzDC,CAAU,CAAG,SAASlB,CAAT,CAAkB,CAC/B,GAAIM,CAAS,CAACN,CAAD,CAAb,CAAwB,CACpB,MACH,CAED,GAAIS,CAAAA,CAAO,CAAG,CACVU,UAAU,CAAE,qCADF,CAEVC,IAAI,CAAE,CACFC,MAAM,CAAEhB,CAAgB,CAACL,CAAD,CADtB,CAEFsB,eAAe,CAAElB,CAAS,CAACJ,CAAD,CAFxB,CAFI,CAAd,CAOAQ,CAAW,CAACR,CAAD,CAAUS,CAAV,CAAX,CAA8Bc,IAA9B,CAAmC,UAAW,CAC1CrB,CAAU,CAACF,CAAD,CAAV,CACAJ,CAAS,CAAC4B,MAAV,CAAiB,+BAAjB,CAAkD,EAAlD,EAAsDD,IAAtD,CAA2D,SAASE,CAAT,CAAeC,CAAf,CAAmB,CAC1E9B,CAAS,CAAC+B,mBAAV,CAA8B3B,CAA9B,CAAuCyB,CAAvC,CAA6CC,CAA7C,CACH,CAFD,CAGH,CALD,CAMH,CArH4D,CA+HzDE,CAAa,CAAG,SAAS5B,CAAT,CAAkB,CAClC,GAAIM,CAAS,CAACN,CAAD,CAAb,CAAwB,CACpB,MACH,CAED,GAAIS,CAAAA,CAAO,CAAG,CACVU,UAAU,CAAE,8BADF,CAEVC,IAAI,CAAE,CACFS,OAAO,CAAE,CAACzB,CAAS,CAACJ,CAAD,CAAV,CADP,CAFI,CAAd,CAOAQ,CAAW,CAACR,CAAD,CAAUS,CAAV,CAAX,CAA8Bc,IAA9B,CAAmC,UAAW,CAC1CpB,CAAa,CAACH,CAAD,CAAb,CACAJ,CAAS,CAAC4B,MAAV,CAAiB,4BAAjB,CAA+C,EAA/C,EAAmDD,IAAnD,CAAwD,SAASE,CAAT,CAAeC,CAAf,CAAmB,CACvE9B,CAAS,CAAC+B,mBAAV,CAA8B3B,CAA9B,CAAuCyB,CAAvC,CAA6CC,CAA7C,CACH,CAFD,CAGH,CALD,CAMH,CAjJ4D,CAkL7D,MAAO,CACHI,OAAO,CAxBG,QAAVA,CAAAA,OAAU,CAAS9B,CAAT,CAAkB,CAC5BA,CAAO,CAAGN,CAAC,CAACM,CAAD,CAAX,CAEA,GAAI,CAACA,CAAO,CAAC+B,QAAR,CAAiB,eAAjB,EAAkCC,MAAvC,CAA+C,CAE3CpC,CAAS,CAAC4B,MAAV,CAAiB,cAAjB,CAAiC,EAAjC,EAAqCD,IAArC,CAA0C,SAASE,CAAT,CAAeC,CAAf,CAAmB,CACzD1B,CAAO,CAACiC,MAAR,CAAeR,CAAf,CAAqBC,CAArB,CACH,CAFD,CAGH,CAED5B,CAAY,CAACL,MAAb,CAAoBO,CAApB,CAA6B,CAACF,CAAY,CAACoC,MAAb,CAAoBC,QAArB,CAA7B,EAEAnC,CAAO,CAACoC,EAAR,CAAWtC,CAAY,CAACoC,MAAb,CAAoBC,QAA/B,CAAyC,SAASE,CAAT,CAAYC,CAAZ,CAAkB,CACvD,GAAIvC,CAAS,CAACC,CAAD,CAAb,CAAwB,CACpB4B,CAAa,CAAC5B,CAAD,CAChB,CAFD,IAEO,CACHkB,CAAU,CAAClB,CAAD,CACb,CACDqC,CAAC,CAACE,cAAF,GACAD,CAAI,CAACE,aAAL,CAAmBD,cAAnB,EACH,CARD,CASH,CAEM,CAGV,CAtLK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Module to add/remove contact using ajax.\n *\n * @module core_message/toggle_contact_button\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/custom_interaction_events'],\n function($, Ajax, Templates, Notification, CustomEvents) {\n\n /**\n * Check the state of the element, if the current user is a contact or not.\n *\n * @method isContact\n * @param {object} element jQuery object for the button\n * @return {bool}\n */\n var isContact = function(element) {\n return element.attr('data-is-contact') == '1';\n };\n\n /**\n * Record that the user is a contact.\n *\n * @method setContact\n * @param {object} element jQuery object for the button\n */\n var setContact = function(element) {\n element.attr('data-is-contact', '1');\n };\n\n /**\n * Record that the user is not a contact.\n *\n * @method setNotContact\n * @param {object} element jQuery object for the button\n */\n var setNotContact = function(element) {\n element.attr('data-is-contact', '0');\n };\n\n /**\n * Get the id for the user being viewed.\n *\n * @method getUserId\n * @param {object} element jQuery object for the button\n * @return {int}\n */\n var getUserId = function(element) {\n return element.attr('data-userid');\n };\n\n /**\n * Get the id for the logged in user.\n *\n * @method getUserId\n * @param {object} element jQuery object for the button\n * @return {int}\n */\n var getCurrentUserId = function(element) {\n return element.attr('data-currentuserid');\n };\n\n /**\n * Check if this element is currently loading.\n *\n * @method isLoading\n * @param {object} element jQuery object for the button\n * @return {bool}\n */\n var isLoading = function(element) {\n return element.hasClass('loading') || element.attr('disabled');\n };\n\n /**\n * Sends an ajax request to the server and handles the element state\n * while the request is being performed.\n *\n * @method sendRequest\n * @param {object} element jQuery object for the button\n * @param {object} request Request hash to send\n * @return {object} jQuery promise\n */\n var sendRequest = function(element, request) {\n if (isLoading(element)) {\n return $.Deferred();\n }\n\n element.addClass('loading');\n element.attr('disabled', 'disabled');\n\n return Ajax.call([request])[0]\n .fail(Notification.exception)\n .always(function() {\n element.removeClass('loading');\n element.removeAttr('disabled');\n });\n };\n\n /**\n * Send a request to the server to add the current user as\n * a contact. The contents of the button are changed to the\n * remove contact button upon success.\n *\n * @method addContact\n * @param {object} element jQuery object for the button\n */\n var addContact = function(element) {\n if (isLoading(element)) {\n return;\n }\n\n var request = {\n methodname: 'core_message_create_contact_request',\n args: {\n userid: getCurrentUserId(element),\n requesteduserid: getUserId(element),\n }\n };\n sendRequest(element, request).done(function() {\n setContact(element);\n Templates.render('message/remove_contact_button', {}).done(function(html, js) {\n Templates.replaceNodeContents(element, html, js);\n });\n });\n };\n\n /**\n * Send a request to the server to remove the current user as\n * a contact. The contents of the button are changed to the\n * add contact button upon success.\n *\n * @method removeContact\n * @param {object} element jQuery object for the button\n */\n var removeContact = function(element) {\n if (isLoading(element)) {\n return;\n }\n\n var request = {\n methodname: 'core_message_delete_contacts',\n args: {\n userids: [getUserId(element)],\n }\n };\n\n sendRequest(element, request).done(function() {\n setNotContact(element);\n Templates.render('message/add_contact_button', {}).done(function(html, js) {\n Templates.replaceNodeContents(element, html, js);\n });\n });\n };\n\n /**\n * Enhances the given element with a loading gif and event handles to make\n * ajax requests to add or remove a contact where appropriate.\n *\n * @public\n * @method enhance\n * @param {object} element jQuery object for the button\n */\n var enhance = function(element) {\n element = $(element);\n\n if (!element.children('.loading-icon').length) {\n // Add the loading gif if it isn't already there.\n Templates.render('core/loading', {}).done(function(html, js) {\n element.append(html, js);\n });\n }\n\n CustomEvents.define(element, [CustomEvents.events.activate]);\n\n element.on(CustomEvents.events.activate, function(e, data) {\n if (isContact(element)) {\n removeContact(element);\n } else {\n addContact(element);\n }\n e.preventDefault();\n data.originalEvent.preventDefault();\n });\n };\n\n return {\n enhance: enhance\n };\n});\n"],"file":"toggle_contact_button.min.js"}
\ No newline at end of file
diff --git a/message/amd/src/message_notification_preference.js b/message/amd/src/message_notification_preference.js
index e6c5b68600c..2ee01836ce1 100644
--- a/message/amd/src/message_notification_preference.js
+++ b/message/amd/src/message_notification_preference.js
@@ -18,7 +18,6 @@
* message preference page.
*
* @module core_message/message_notification_preference
- * @class message_notification_preference
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -32,6 +31,7 @@ define(['jquery', 'core_message/notification_preference'],
/**
* Constructor for the Preference.
*
+ * @class
* @param {object} element jQuery object root element of the preference
* @param {int} userId The current user id
*/
diff --git a/message/amd/src/message_preferences.js b/message/amd/src/message_preferences.js
index effc62987f5..a966f5ebae0 100644
--- a/message/amd/src/message_preferences.js
+++ b/message/amd/src/message_preferences.js
@@ -17,7 +17,6 @@
* Controls the message preference page.
*
* @module core_message/message_preferences
- * @class message_preferences
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -34,6 +33,7 @@ define(['jquery', 'core/ajax', 'core/notification',
/**
* Constructor for the MessagePreferences.
*
+ * @class
* @param {object} element The root element for the message preferences
*/
var MessagePreferences = function(element) {
diff --git a/message/amd/src/message_repository.js b/message/amd/src/message_repository.js
index 49f2939823c..907009c2336 100644
--- a/message/amd/src/message_repository.js
+++ b/message/amd/src/message_repository.js
@@ -17,7 +17,6 @@
* Retrieves messages from the server.
*
* @module core_message/message_repository
- * @class message_repository
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
diff --git a/message/amd/src/notification_preference.js b/message/amd/src/notification_preference.js
index 8b857b6bf7b..ae52eecf8b2 100644
--- a/message/amd/src/notification_preference.js
+++ b/message/amd/src/notification_preference.js
@@ -18,7 +18,6 @@
* message preference page.
*
* @module core_message/notification_preference
- * @class notification_preference
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -33,6 +32,7 @@ define(['jquery', 'core/ajax', 'core/notification', 'core_message/notification_p
/**
* Constructor for the Preference.
*
+ * @class
* @param {object} element jQuery object root element of the preference
* @param {int} userId The current user id
*/
diff --git a/message/amd/src/notification_processor.js b/message/amd/src/notification_processor.js
index 16f779b885c..338dd24d443 100644
--- a/message/amd/src/notification_processor.js
+++ b/message/amd/src/notification_processor.js
@@ -17,7 +17,6 @@
* Represents the notification processor (e.g. email, popup, jabber)
*
* @module core_message/notification_processor
- * @class notification_processor
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -32,6 +31,7 @@ define(['jquery'], function($) {
/**
* Constructor for the notification processor.
*
+ * @class
* @param {object} element jQuery object root element of the processor
*/
var NotificationProcessor = function(element) {
diff --git a/message/amd/src/notification_processor_settings.js b/message/amd/src/notification_processor_settings.js
index 1fce77e238d..4295750591f 100644
--- a/message/amd/src/notification_processor_settings.js
+++ b/message/amd/src/notification_processor_settings.js
@@ -17,7 +17,6 @@
* Load the settings for a message processor.
*
* @module core_message/notification_processor_settings
- * @class notification_processor_settings
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -53,6 +52,7 @@ define([
/**
* Constructor for the Modal.
*
+ * @class
* @param {object} root The root jQuery element for the modal.
*/
var NotificationProcessorSettings = function(root) {
diff --git a/message/amd/src/preferences_notifications_list_controller.js b/message/amd/src/preferences_notifications_list_controller.js
index 47e16422aac..daad95353d4 100644
--- a/message/amd/src/preferences_notifications_list_controller.js
+++ b/message/amd/src/preferences_notifications_list_controller.js
@@ -18,7 +18,6 @@
* message preference page
*
* @module core_message/preferences_notifications_list_controller
- * @class preferences_notifications_list_controller
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -52,6 +51,7 @@ define(['jquery',
/**
* Constructor for the PreferencesController.
*
+ * @class
* @param {object} element jQuery object root element of the preference
*/
var PreferencesController = function(element) {
diff --git a/message/amd/src/preferences_processor_form.js b/message/amd/src/preferences_processor_form.js
index 677b190c549..67ba1c9ffb5 100644
--- a/message/amd/src/preferences_processor_form.js
+++ b/message/amd/src/preferences_processor_form.js
@@ -17,7 +17,6 @@
* Manages the processor form on the message preferences page.
*
* @module core_message/preferences_processor_form
- * @class preferences_processor_form
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -26,6 +25,7 @@ define(['jquery', 'core/ajax', 'core/notification'],
/**
* Constructor for the ProcessorForm.
*
+ * @class
* @param {object} element jQuery object root element of the preference
*/
var ProcessorForm = function(element) {
diff --git a/message/amd/src/toggle_contact_button.js b/message/amd/src/toggle_contact_button.js
index ad477492232..4490494c0cc 100644
--- a/message/amd/src/toggle_contact_button.js
+++ b/message/amd/src/toggle_contact_button.js
@@ -17,7 +17,6 @@
* Module to add/remove contact using ajax.
*
* @module core_message/toggle_contact_button
- * @class toggle_contact_button
* @copyright 2016 Ryan Wyllie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -173,6 +172,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/cust
* Enhances the given element with a loading gif and event handles to make
* ajax requests to add or remove a contact where appropriate.
*
+ * @public
* @method enhance
* @param {object} element jQuery object for the button
*/
@@ -199,7 +199,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/cust
});
};
- return /** @alias module:message/toggle_contact_button */ {
+ return {
enhance: enhance
};
});
diff --git a/message/output/popup/amd/build/notification_area_content_area.min.js.map b/message/output/popup/amd/build/notification_area_content_area.min.js.map
index dbcbfcc4c7e..f284f2420cc 100644
--- a/message/output/popup/amd/build/notification_area_content_area.min.js.map
+++ b/message/output/popup/amd/build/notification_area_content_area.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/notification_area_content_area.js"],"names":["define","$","Templates","DebugNotification","CustomEvents","NotificationRepo","NotificationAreaEvents","SELECTORS","CONTAINER","CONTENT","HEADER","FOOTER","TOGGLE_MODE","TEMPLATES","ContentArea","root","userId","container","closest","header","find","content","footer","registerEventListeners","prototype","getRoot","getContainer","getUserId","getHeader","getContent","getFooter","show","addClass","hide","removeClass","setHeaderHTML","html","empty","setContentHTML","setFooterHTML","showNotification","notification","headerPromise","render","done","bind","contentPromise","footerPromise","when","trigger","notificationShown","events","activate","on","VIEW_TOGGLE","e"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the content area of the notification area on the\n * notification page.\n *\n * @module message_popup/notification_area_content_area\n * @class notification_area_content_area\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/custom_interaction_events',\n 'message_popup/notification_repository', 'message_popup/notification_area_events'],\n function($, Templates, DebugNotification, CustomEvents, NotificationRepo, NotificationAreaEvents) {\n\n var SELECTORS = {\n CONTAINER: '[data-region=\"notification-area\"]',\n CONTENT: '[data-region=\"content\"]',\n HEADER: '[data-region=\"header\"]',\n FOOTER: '[data-region=\"footer\"]',\n TOGGLE_MODE: '[data-action=\"toggle-mode\"]',\n };\n\n var TEMPLATES = {\n HEADER: 'message_popup/notification_area_content_area_header',\n CONTENT: 'message_popup/notification_area_content_area_content',\n FOOTER: 'message_popup/notification_area_content_area_footer',\n };\n\n /**\n * Constructor for the ContentArea\n *\n * @param {object} root The root element for the content area\n * @param {int} userId The user id of the current user\n */\n var ContentArea = function(root, userId) {\n this.root = $(root);\n this.container = this.root.closest(SELECTORS.CONTAINER);\n this.userId = userId;\n this.header = this.root.find(SELECTORS.HEADER);\n this.content = this.root.find(SELECTORS.CONTENT);\n this.footer = this.root.find(SELECTORS.FOOTER);\n\n this.registerEventListeners();\n };\n\n /**\n * Get the root element.\n *\n * @method getRoot\n * @return {object} jQuery element\n */\n ContentArea.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Get the container element (which the content area is within).\n *\n * @method getContainer\n * @return {object} jQuery element\n */\n ContentArea.prototype.getContainer = function() {\n return this.container;\n };\n\n /**\n * Get the user id.\n *\n * @method getUserId\n * @return {int}\n */\n ContentArea.prototype.getUserId = function() {\n return this.userId;\n };\n\n /**\n * Get the content area header element.\n *\n * @method getHeader\n * @return {object} jQuery element\n */\n ContentArea.prototype.getHeader = function() {\n return this.header;\n };\n\n /**\n * Get the content area content element.\n *\n * @method getContent\n * @return {object} jQuery element\n */\n ContentArea.prototype.getContent = function() {\n return this.content;\n };\n\n /**\n * Get the content area footer element.\n *\n * @method getFooter\n * @return {object} jQuery element\n */\n ContentArea.prototype.getFooter = function() {\n return this.footer;\n };\n\n /**\n * Display the content area. Typically used with responsive\n * styling on smaller screens.\n *\n * @method show\n */\n ContentArea.prototype.show = function() {\n this.getContainer().addClass('show-content-area');\n };\n\n /**\n * Hide the content area. Typically used with responsive\n * styling on smaller screens.\n *\n * @method hide\n */\n ContentArea.prototype.hide = function() {\n this.getContainer().removeClass('show-content-area');\n };\n\n /**\n * Change the HTML in the content area header element.\n *\n * @method setHeaderHTML\n * @param {string} html The HTML to be set\n */\n ContentArea.prototype.setHeaderHTML = function(html) {\n this.getHeader().empty().html(html);\n };\n\n /**\n * Change the HTML in the content area content element.\n *\n * @method setContentHMTL\n * @param {string} html The HTML to be set.\n */\n ContentArea.prototype.setContentHTML = function(html) {\n this.getContent().empty().html(html);\n };\n\n /**\n * Change the HTML in the content area footer element.\n *\n * @method setFooterHTML\n * @param {string} html The HTML to be set.\n */\n ContentArea.prototype.setFooterHTML = function(html) {\n this.getFooter().empty().html(html);\n };\n\n /**\n * Render the given notification context in the content area.\n *\n * @method showNotification\n * @param {object} notification The notification context (from a webservice)\n * @return {object} jQuery promise\n */\n ContentArea.prototype.showNotification = function(notification) {\n var headerPromise = Templates.render(TEMPLATES.HEADER, notification).done(function(html) {\n this.setHeaderHTML(html);\n }.bind(this));\n\n var contentPromise = Templates.render(TEMPLATES.CONTENT, notification).done(function(html) {\n this.setContentHTML(html);\n }.bind(this));\n\n var footerPromise = Templates.render(TEMPLATES.FOOTER, notification).done(function(html) {\n this.setFooterHTML(html);\n }.bind(this));\n\n return $.when(headerPromise, contentPromise, footerPromise).done(function() {\n this.show();\n this.getContainer().trigger(NotificationAreaEvents.notificationShown, [notification]);\n }.bind(this));\n };\n\n /**\n * Create the event listeners for the content area.\n *\n * @method registerEventListeners\n */\n ContentArea.prototype.registerEventListeners = function() {\n CustomEvents.define(this.getRoot(), [\n CustomEvents.events.activate\n ]);\n\n this.getRoot().on(CustomEvents.events.activate, SELECTORS.VIEW_TOGGLE, function() {\n this.hide();\n }.bind(this));\n\n this.getContainer().on(NotificationAreaEvents.showNotification, function(e, notification) {\n this.showNotification(notification);\n }.bind(this));\n };\n\n return ContentArea;\n});\n"],"file":"notification_area_content_area.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/notification_area_content_area.js"],"names":["define","$","Templates","DebugNotification","CustomEvents","NotificationRepo","NotificationAreaEvents","SELECTORS","CONTAINER","CONTENT","HEADER","FOOTER","TOGGLE_MODE","TEMPLATES","ContentArea","root","userId","container","closest","header","find","content","footer","registerEventListeners","prototype","getRoot","getContainer","getUserId","getHeader","getContent","getFooter","show","addClass","hide","removeClass","setHeaderHTML","html","empty","setContentHTML","setFooterHTML","showNotification","notification","headerPromise","render","done","bind","contentPromise","footerPromise","when","trigger","notificationShown","events","activate","on","VIEW_TOGGLE","e"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the content area of the notification area on the\n * notification page.\n *\n * @module message_popup/notification_area_content_area\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/custom_interaction_events',\n 'message_popup/notification_repository', 'message_popup/notification_area_events'],\n function($, Templates, DebugNotification, CustomEvents, NotificationRepo, NotificationAreaEvents) {\n\n var SELECTORS = {\n CONTAINER: '[data-region=\"notification-area\"]',\n CONTENT: '[data-region=\"content\"]',\n HEADER: '[data-region=\"header\"]',\n FOOTER: '[data-region=\"footer\"]',\n TOGGLE_MODE: '[data-action=\"toggle-mode\"]',\n };\n\n var TEMPLATES = {\n HEADER: 'message_popup/notification_area_content_area_header',\n CONTENT: 'message_popup/notification_area_content_area_content',\n FOOTER: 'message_popup/notification_area_content_area_footer',\n };\n\n /**\n * Constructor for the ContentArea\n *\n * @class\n * @param {object} root The root element for the content area\n * @param {int} userId The user id of the current user\n */\n var ContentArea = function(root, userId) {\n this.root = $(root);\n this.container = this.root.closest(SELECTORS.CONTAINER);\n this.userId = userId;\n this.header = this.root.find(SELECTORS.HEADER);\n this.content = this.root.find(SELECTORS.CONTENT);\n this.footer = this.root.find(SELECTORS.FOOTER);\n\n this.registerEventListeners();\n };\n\n /**\n * Get the root element.\n *\n * @method getRoot\n * @return {object} jQuery element\n */\n ContentArea.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Get the container element (which the content area is within).\n *\n * @method getContainer\n * @return {object} jQuery element\n */\n ContentArea.prototype.getContainer = function() {\n return this.container;\n };\n\n /**\n * Get the user id.\n *\n * @method getUserId\n * @return {int}\n */\n ContentArea.prototype.getUserId = function() {\n return this.userId;\n };\n\n /**\n * Get the content area header element.\n *\n * @method getHeader\n * @return {object} jQuery element\n */\n ContentArea.prototype.getHeader = function() {\n return this.header;\n };\n\n /**\n * Get the content area content element.\n *\n * @method getContent\n * @return {object} jQuery element\n */\n ContentArea.prototype.getContent = function() {\n return this.content;\n };\n\n /**\n * Get the content area footer element.\n *\n * @method getFooter\n * @return {object} jQuery element\n */\n ContentArea.prototype.getFooter = function() {\n return this.footer;\n };\n\n /**\n * Display the content area. Typically used with responsive\n * styling on smaller screens.\n *\n * @method show\n */\n ContentArea.prototype.show = function() {\n this.getContainer().addClass('show-content-area');\n };\n\n /**\n * Hide the content area. Typically used with responsive\n * styling on smaller screens.\n *\n * @method hide\n */\n ContentArea.prototype.hide = function() {\n this.getContainer().removeClass('show-content-area');\n };\n\n /**\n * Change the HTML in the content area header element.\n *\n * @method setHeaderHTML\n * @param {string} html The HTML to be set\n */\n ContentArea.prototype.setHeaderHTML = function(html) {\n this.getHeader().empty().html(html);\n };\n\n /**\n * Change the HTML in the content area content element.\n *\n * @method setContentHMTL\n * @param {string} html The HTML to be set.\n */\n ContentArea.prototype.setContentHTML = function(html) {\n this.getContent().empty().html(html);\n };\n\n /**\n * Change the HTML in the content area footer element.\n *\n * @method setFooterHTML\n * @param {string} html The HTML to be set.\n */\n ContentArea.prototype.setFooterHTML = function(html) {\n this.getFooter().empty().html(html);\n };\n\n /**\n * Render the given notification context in the content area.\n *\n * @method showNotification\n * @param {object} notification The notification context (from a webservice)\n * @return {object} jQuery promise\n */\n ContentArea.prototype.showNotification = function(notification) {\n var headerPromise = Templates.render(TEMPLATES.HEADER, notification).done(function(html) {\n this.setHeaderHTML(html);\n }.bind(this));\n\n var contentPromise = Templates.render(TEMPLATES.CONTENT, notification).done(function(html) {\n this.setContentHTML(html);\n }.bind(this));\n\n var footerPromise = Templates.render(TEMPLATES.FOOTER, notification).done(function(html) {\n this.setFooterHTML(html);\n }.bind(this));\n\n return $.when(headerPromise, contentPromise, footerPromise).done(function() {\n this.show();\n this.getContainer().trigger(NotificationAreaEvents.notificationShown, [notification]);\n }.bind(this));\n };\n\n /**\n * Create the event listeners for the content area.\n *\n * @method registerEventListeners\n */\n ContentArea.prototype.registerEventListeners = function() {\n CustomEvents.define(this.getRoot(), [\n CustomEvents.events.activate\n ]);\n\n this.getRoot().on(CustomEvents.events.activate, SELECTORS.VIEW_TOGGLE, function() {\n this.hide();\n }.bind(this));\n\n this.getContainer().on(NotificationAreaEvents.showNotification, function(e, notification) {\n this.showNotification(notification);\n }.bind(this));\n };\n\n return ContentArea;\n});\n"],"file":"notification_area_content_area.min.js"}
\ No newline at end of file
diff --git a/message/output/popup/amd/build/notification_area_control_area.min.js.map b/message/output/popup/amd/build/notification_area_control_area.min.js.map
index d0f35d85f47..b762fae1cfe 100644
--- a/message/output/popup/amd/build/notification_area_control_area.min.js.map
+++ b/message/output/popup/amd/build/notification_area_control_area.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/notification_area_control_area.js"],"names":["define","$","Templates","DebugNotification","CustomEvents","NotificationRepo","NotificationAreaEvents","SELECTORS","CONTAINER","CONTENT","NOTIFICATION","CAN_RECEIVE_FOCUS","TEMPLATES","ControlArea","root","userId","container","closest","content","find","offset","limit","initialLoad","isLoading","loadedAll","notifications","registerEventListeners","prototype","getRoot","getContainer","getUserId","getContent","getOffset","getLimit","setOffset","value","setLimit","incrementOffset","startLoading","addClass","stopLoading","removeClass","hasDoneInitialLoad","hasLoadedAllContent","setLoadedAllContent","val","setCacheNotification","notification","id","getCacheNotification","getNotificationElement","element","length","scrollNotificationIntoView","notificationElement","position","relativeTop","top","scrollTop","innerHeight","height","outerHeight","scrollTo","showNotification","focus","notificationId","attr","trigger","extend","markNotificationAsRead","markAsRead","done","renderNotifications","promises","each","index","contextUrl","contexturl","promise","render","then","html","js","bind","push","when","apply","arguments","argument","append","runTemplateJS","loadMoreNotifications","Deferred","resolve","request","useridto","query","result","unreadCount","unreadcount","always","events","activate","scrollBottom","scrollLock","up","down","on","e","target","data","prev","originalEvent","preventDefault","next","notificationShown","read","cachedNotification"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the notification area on the notification page.\n *\n * @module message_popup/notification_area_control_area\n * @class notification_area_control_area\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/custom_interaction_events',\n 'message_popup/notification_repository', 'message_popup/notification_area_events'],\n function($, Templates, DebugNotification, CustomEvents, NotificationRepo, NotificationAreaEvents) {\n\n var SELECTORS = {\n CONTAINER: '[data-region=\"notification-area\"]',\n CONTENT: '[data-region=\"content\"]',\n NOTIFICATION: '[data-region=\"notification-content-item-container\"]',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n };\n\n var TEMPLATES = {\n NOTIFICATION: 'message_popup/notification_content_item',\n };\n\n /**\n * Constructor for ControlArea\n *\n * @param {object} root The root element for the content area\n * @param {int} userId The user id of the current user\n */\n var ControlArea = function(root, userId) {\n this.root = $(root);\n this.container = this.root.closest(SELECTORS.CONTAINER);\n this.userId = userId;\n this.content = this.root.find(SELECTORS.CONTENT);\n this.offset = 0;\n this.limit = 20;\n this.initialLoad = false;\n this.isLoading = false;\n this.loadedAll = false;\n this.notifications = {};\n\n this.registerEventListeners();\n };\n\n /**\n * Get the root element.\n *\n * @method getRoot\n * @return {object} jQuery element\n */\n ControlArea.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Get the container element (which the control area is within).\n *\n * @method getContainer\n * @return {object} jQuery element\n */\n ControlArea.prototype.getContainer = function() {\n return this.container;\n };\n\n /**\n * Get the user id.\n *\n * @method getUserId\n * @return {int}\n */\n ControlArea.prototype.getUserId = function() {\n return this.userId;\n };\n\n /**\n * Get the control area content element.\n *\n * @method getContent\n * @return {object} jQuery element\n */\n ControlArea.prototype.getContent = function() {\n return this.content;\n };\n\n /**\n * Get the offset value for paginated loading of the\n * notifications.\n *\n * @method getOffset\n * @return {int}\n */\n ControlArea.prototype.getOffset = function() {\n return this.offset;\n };\n\n /**\n * Get the limit value for the paginated loading of the\n * notifications.\n *\n * @method getLimit\n * @return {int}\n */\n ControlArea.prototype.getLimit = function() {\n return this.limit;\n };\n\n /**\n * Set the offset value for the paginated loading of the\n * notifications.\n *\n * @method setOffset\n * @param {int} value The new offset value\n */\n ControlArea.prototype.setOffset = function(value) {\n this.offset = value;\n };\n\n /**\n * Set the limit value for the paginated loading of the\n * notifications.\n *\n * @method setLimit\n * @param {int} value The new limit value\n */\n ControlArea.prototype.setLimit = function(value) {\n this.limit = value;\n };\n\n /**\n * Increment the offset by the limit amount.\n *\n * @method incrementOffset\n */\n ControlArea.prototype.incrementOffset = function() {\n this.offset += this.limit;\n };\n\n /**\n * Flag the control area as loading.\n *\n * @method startLoading\n */\n ControlArea.prototype.startLoading = function() {\n this.isLoading = true;\n this.getRoot().addClass('loading');\n };\n\n /**\n * Remove the loading flag from the control area.\n *\n * @method stopLoading\n */\n ControlArea.prototype.stopLoading = function() {\n this.isLoading = false;\n this.getRoot().removeClass('loading');\n };\n\n /**\n * Check if the first load of notifications has been triggered.\n *\n * @method hasDoneInitialLoad\n * @return {bool} true if first notification loaded, false otherwise\n */\n ControlArea.prototype.hasDoneInitialLoad = function() {\n return this.initialLoad;\n };\n\n /**\n * Check if all of the notifications have been loaded.\n *\n * @method hasLoadedAllContent\n * @return {bool}\n */\n ControlArea.prototype.hasLoadedAllContent = function() {\n return this.loadedAll;\n };\n\n /**\n * Set the state of the loaded all content property.\n *\n * @method setLoadedAllContent\n * @param {bool} val True if all content is loaded, false otherwise\n */\n ControlArea.prototype.setLoadedAllContent = function(val) {\n this.loadedAll = val;\n };\n\n /**\n * Save a notification in the cache.\n *\n * @method setCacheNotification\n * @param {object} notification A notification returned by a webservice\n */\n ControlArea.prototype.setCacheNotification = function(notification) {\n this.notifications[notification.id] = notification;\n };\n\n /**\n * Retrieve a notification from the cache.\n *\n * @method getCacheNotification\n * @param {int} id The id for the notification you wish to retrieve\n * @return {object} A notification (as returned by a webservice)\n */\n ControlArea.prototype.getCacheNotification = function(id) {\n return this.notifications[id];\n };\n\n /**\n * Find the notification element in the control area for the given id.\n *\n * @method getNotificationElement\n * @param {int} id The notification id\n * @return {(object|null)} jQuery element or null\n */\n ControlArea.prototype.getNotificationElement = function(id) {\n var element = this.getRoot().find(SELECTORS.NOTIFICATION + '[data-id=\"' + id + '\"]');\n return element.length == 1 ? element : null;\n };\n\n /**\n * Scroll the notification element into view within the control area, if it\n * isn't already visible.\n *\n * @method scrollNotificationIntoView\n * @param {object} notificationElement The jQuery notification element\n */\n ControlArea.prototype.scrollNotificationIntoView = function(notificationElement) {\n var position = notificationElement.position();\n var container = this.getRoot();\n var relativeTop = position.top - container.scrollTop();\n\n // If the element isn't in the view window.\n if (relativeTop > container.innerHeight()) {\n var height = notificationElement.outerHeight();\n // Offset enough to make sure the notification will be in view.\n height = height * 4;\n var scrollTo = position.top - height;\n container.scrollTop(scrollTo);\n }\n };\n\n /**\n * Show the full notification for the given notification element. The notification\n * context is retrieved from the cache and send as data with an event to be\n * rendered in the content area.\n *\n * @method showNotification\n * @param {(int|object)} notificationElement The notification id or jQuery notification element\n */\n ControlArea.prototype.showNotification = function(notificationElement) {\n if (typeof notificationElement !== 'object') {\n // Assume it's an ID if it's not an object.\n notificationElement = this.getNotificationElement(notificationElement);\n }\n\n if (notificationElement && notificationElement.length) {\n this.getRoot().find(SELECTORS.NOTIFICATION).removeClass('selected');\n notificationElement.addClass('selected').find(SELECTORS.CAN_RECEIVE_FOCUS).focus();\n var notificationId = notificationElement.attr('data-id');\n var notification = this.getCacheNotification(notificationId);\n this.scrollNotificationIntoView(notificationElement);\n // Create a new version of the notification to send with the notification so\n // this copy isn't modified.\n this.getContainer().trigger(NotificationAreaEvents.showNotification, [$.extend({}, notification)]);\n }\n };\n\n /**\n * Send a request to mark the notification as read in the server and remove the unread\n * status from the element.\n *\n * @method markNotificationAsRead\n * @param {object} notificationElement The jQuery notification element\n * @return {object} jQuery promise\n */\n ControlArea.prototype.markNotificationAsRead = function(notificationElement) {\n return NotificationRepo.markAsRead(notificationElement.attr('data-id')).done(function() {\n notificationElement.removeClass('unread');\n });\n };\n\n\n /**\n * Render the notification data with the appropriate template and add it to the DOM.\n *\n * @method renderNotifications\n * @param {array} notifications Array of notification data\n * @return {object} jQuery promise that is resolved when all notifications have been\n * rendered and added to the DOM\n */\n ControlArea.prototype.renderNotifications = function(notifications) {\n var promises = [];\n var container = this.getContent();\n\n $.each(notifications, function(index, notification) {\n // Need to remove the contexturl so the item isn't rendered\n // as a link.\n var contextUrl = notification.contexturl;\n delete notification.contexturl;\n\n var promise = Templates.render(TEMPLATES.NOTIFICATION, notification)\n .then(function(html, js) {\n // Restore it for the cache.\n notification.contexturl = contextUrl;\n this.setCacheNotification(notification);\n // Pass the Rendered content out.\n return {html: html, js: js};\n }.bind(this));\n promises.push(promise);\n }.bind(this));\n\n return $.when.apply($, promises).then(function() {\n // Each of the promises in the when will pass its results as an argument to the function.\n // The order of the arguments will be the order that the promises are passed to when()\n // i.e. the first promise's results will be in the first argument.\n $.each(arguments, function(index, argument) {\n container.append(argument.html);\n Templates.runTemplateJS(argument.js);\n });\n return;\n });\n };\n\n /**\n * Load notifications from the server and render them.\n *\n * @method loadMoreNotifications\n * @return {object} jQuery promise\n */\n ControlArea.prototype.loadMoreNotifications = function() {\n if (this.isLoading || this.hasLoadedAllContent()) {\n return $.Deferred().resolve();\n }\n\n this.startLoading();\n var request = {\n limit: this.getLimit(),\n offset: this.getOffset(),\n useridto: this.getUserId(),\n };\n\n if (!this.initialLoad) {\n // If this is the first load we may have been given a non-zero offset,\n // in which case we need to load all notifications preceeding that offset\n // to make sure the full list is rendered.\n request.limit = this.getOffset() + this.getLimit();\n request.offset = 0;\n }\n\n var promise = NotificationRepo.query(request).then(function(result) {\n var notifications = result.notifications;\n this.unreadCount = result.unreadcount;\n this.setLoadedAllContent(!notifications.length || notifications.length < this.getLimit());\n this.initialLoad = true;\n\n if (notifications.length) {\n this.incrementOffset();\n return this.renderNotifications(notifications);\n }\n\n return false;\n }.bind(this))\n .always(function() {\n this.stopLoading();\n }.bind(this));\n\n return promise;\n };\n\n /**\n * Create the event listeners for the control area.\n *\n * @method registerEventListeners\n */\n ControlArea.prototype.registerEventListeners = function() {\n CustomEvents.define(this.getRoot(), [\n CustomEvents.events.activate,\n CustomEvents.events.scrollBottom,\n CustomEvents.events.scrollLock,\n CustomEvents.events.up,\n CustomEvents.events.down,\n ]);\n\n this.getRoot().on(CustomEvents.events.scrollBottom, function() {\n this.loadMoreNotifications();\n }.bind(this));\n\n this.getRoot().on(CustomEvents.events.activate, SELECTORS.NOTIFICATION, function(e) {\n var notificationElement = $(e.target).closest(SELECTORS.NOTIFICATION);\n this.showNotification(notificationElement);\n }.bind(this));\n\n // Show the previous notification in the list.\n this.getRoot().on(CustomEvents.events.up, SELECTORS.NOTIFICATION, function(e, data) {\n var notificationElement = $(e.target).closest(SELECTORS.NOTIFICATION);\n this.showNotification(notificationElement.prev());\n\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Show the next notification in the list.\n this.getRoot().on(CustomEvents.events.down, SELECTORS.NOTIFICATION, function(e, data) {\n var notificationElement = $(e.target).closest(SELECTORS.NOTIFICATION);\n this.showNotification(notificationElement.next());\n\n data.originalEvent.preventDefault();\n }.bind(this));\n\n this.getContainer().on(NotificationAreaEvents.notificationShown, function(e, notification) {\n if (!notification.read) {\n var element = this.getNotificationElement(notification.id);\n\n if (element) {\n this.markNotificationAsRead(element);\n }\n\n var cachedNotification = this.getCacheNotification(notification.id);\n\n if (cachedNotification) {\n cachedNotification.read = true;\n }\n }\n }.bind(this));\n };\n\n return ControlArea;\n});\n"],"file":"notification_area_control_area.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/notification_area_control_area.js"],"names":["define","$","Templates","DebugNotification","CustomEvents","NotificationRepo","NotificationAreaEvents","SELECTORS","CONTAINER","CONTENT","NOTIFICATION","CAN_RECEIVE_FOCUS","TEMPLATES","ControlArea","root","userId","container","closest","content","find","offset","limit","initialLoad","isLoading","loadedAll","notifications","registerEventListeners","prototype","getRoot","getContainer","getUserId","getContent","getOffset","getLimit","setOffset","value","setLimit","incrementOffset","startLoading","addClass","stopLoading","removeClass","hasDoneInitialLoad","hasLoadedAllContent","setLoadedAllContent","val","setCacheNotification","notification","id","getCacheNotification","getNotificationElement","element","length","scrollNotificationIntoView","notificationElement","position","relativeTop","top","scrollTop","innerHeight","height","outerHeight","scrollTo","showNotification","focus","notificationId","attr","trigger","extend","markNotificationAsRead","markAsRead","done","renderNotifications","promises","each","index","contextUrl","contexturl","promise","render","then","html","js","bind","push","when","apply","arguments","argument","append","runTemplateJS","loadMoreNotifications","Deferred","resolve","request","useridto","query","result","unreadCount","unreadcount","always","events","activate","scrollBottom","scrollLock","up","down","on","e","target","data","prev","originalEvent","preventDefault","next","notificationShown","read","cachedNotification"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see .\n\n/**\n * Controls the notification area on the notification page.\n *\n * @module message_popup/notification_area_control_area\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/custom_interaction_events',\n 'message_popup/notification_repository', 'message_popup/notification_area_events'],\n function($, Templates, DebugNotification, CustomEvents, NotificationRepo, NotificationAreaEvents) {\n\n var SELECTORS = {\n CONTAINER: '[data-region=\"notification-area\"]',\n CONTENT: '[data-region=\"content\"]',\n NOTIFICATION: '[data-region=\"notification-content-item-container\"]',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n };\n\n var TEMPLATES = {\n NOTIFICATION: 'message_popup/notification_content_item',\n };\n\n /**\n * Constructor for ControlArea\n *\n * @class\n * @param {object} root The root element for the content area\n * @param {int} userId The user id of the current user\n */\n var ControlArea = function(root, userId) {\n this.root = $(root);\n this.container = this.root.closest(SELECTORS.CONTAINER);\n this.userId = userId;\n this.content = this.root.find(SELECTORS.CONTENT);\n this.offset = 0;\n this.limit = 20;\n this.initialLoad = false;\n this.isLoading = false;\n this.loadedAll = false;\n this.notifications = {};\n\n this.registerEventListeners();\n };\n\n /**\n * Get the root element.\n *\n * @method getRoot\n * @return {object} jQuery element\n */\n ControlArea.prototype.getRoot = function() {\n return this.root;\n };\n\n /**\n * Get the container element (which the control area is within).\n *\n * @method getContainer\n * @return {object} jQuery element\n */\n ControlArea.prototype.getContainer = function() {\n return this.container;\n };\n\n /**\n * Get the user id.\n *\n * @method getUserId\n * @return {int}\n */\n ControlArea.prototype.getUserId = function() {\n return this.userId;\n };\n\n /**\n * Get the control area content element.\n *\n * @method getContent\n * @return {object} jQuery element\n */\n ControlArea.prototype.getContent = function() {\n return this.content;\n };\n\n /**\n * Get the offset value for paginated loading of the\n * notifications.\n *\n * @method getOffset\n * @return {int}\n */\n ControlArea.prototype.getOffset = function() {\n return this.offset;\n };\n\n /**\n * Get the limit value for the paginated loading of the\n * notifications.\n *\n * @method getLimit\n * @return {int}\n */\n ControlArea.prototype.getLimit = function() {\n return this.limit;\n };\n\n /**\n * Set the offset value for the paginated loading of the\n * notifications.\n *\n * @method setOffset\n * @param {int} value The new offset value\n */\n ControlArea.prototype.setOffset = function(value) {\n this.offset = value;\n };\n\n /**\n * Set the limit value for the paginated loading of the\n * notifications.\n *\n * @method setLimit\n * @param {int} value The new limit value\n */\n ControlArea.prototype.setLimit = function(value) {\n this.limit = value;\n };\n\n /**\n * Increment the offset by the limit amount.\n *\n * @method incrementOffset\n */\n ControlArea.prototype.incrementOffset = function() {\n this.offset += this.limit;\n };\n\n /**\n * Flag the control area as loading.\n *\n * @method startLoading\n */\n ControlArea.prototype.startLoading = function() {\n this.isLoading = true;\n this.getRoot().addClass('loading');\n };\n\n /**\n * Remove the loading flag from the control area.\n *\n * @method stopLoading\n */\n ControlArea.prototype.stopLoading = function() {\n this.isLoading = false;\n this.getRoot().removeClass('loading');\n };\n\n /**\n * Check if the first load of notifications has been triggered.\n *\n * @method hasDoneInitialLoad\n * @return {bool} true if first notification loaded, false otherwise\n */\n ControlArea.prototype.hasDoneInitialLoad = function() {\n return this.initialLoad;\n };\n\n /**\n * Check if all of the notifications have been loaded.\n *\n * @method hasLoadedAllContent\n * @return {bool}\n */\n ControlArea.prototype.hasLoadedAllContent = function() {\n return this.loadedAll;\n };\n\n /**\n * Set the state of the loaded all content property.\n *\n * @method setLoadedAllContent\n * @param {bool} val True if all content is loaded, false otherwise\n */\n ControlArea.prototype.setLoadedAllContent = function(val) {\n this.loadedAll = val;\n };\n\n /**\n * Save a notification in the cache.\n *\n * @method setCacheNotification\n * @param {object} notification A notification returned by a webservice\n */\n ControlArea.prototype.setCacheNotification = function(notification) {\n this.notifications[notification.id] = notification;\n };\n\n /**\n * Retrieve a notification from the cache.\n *\n * @method getCacheNotification\n * @param {int} id The id for the notification you wish to retrieve\n * @return {object} A notification (as returned by a webservice)\n */\n ControlArea.prototype.getCacheNotification = function(id) {\n return this.notifications[id];\n };\n\n /**\n * Find the notification element in the control area for the given id.\n *\n * @method getNotificationElement\n * @param {int} id The notification id\n * @return {(object|null)} jQuery element or null\n */\n ControlArea.prototype.getNotificationElement = function(id) {\n var element = this.getRoot().find(SELECTORS.NOTIFICATION + '[data-id=\"' + id + '\"]');\n return element.length == 1 ? element : null;\n };\n\n /**\n * Scroll the notification element into view within the control area, if it\n * isn't already visible.\n *\n * @method scrollNotificationIntoView\n * @param {object} notificationElement The jQuery notification element\n */\n ControlArea.prototype.scrollNotificationIntoView = function(notificationElement) {\n var position = notificationElement.position();\n var container = this.getRoot();\n var relativeTop = position.top - container.scrollTop();\n\n // If the element isn't in the view window.\n if (relativeTop > container.innerHeight()) {\n var height = notificationElement.outerHeight();\n // Offset enough to make sure the notification will be in view.\n height = height * 4;\n var scrollTo = position.top - height;\n container.scrollTop(scrollTo);\n }\n };\n\n /**\n * Show the full notification for the given notification element. The notification\n * context is retrieved from the cache and send as data with an event to be\n * rendered in the content area.\n *\n * @method showNotification\n * @param {(int|object)} notificationElement The notification id or jQuery notification element\n */\n ControlArea.prototype.showNotification = function(notificationElement) {\n if (typeof notificationElement !== 'object') {\n // Assume it's an ID if it's not an object.\n notificationElement = this.getNotificationElement(notificationElement);\n }\n\n if (notificationElement && notificationElement.length) {\n this.getRoot().find(SELECTORS.NOTIFICATION).removeClass('selected');\n notificationElement.addClass('selected').find(SELECTORS.CAN_RECEIVE_FOCUS).focus();\n var notificationId = notificationElement.attr('data-id');\n var notification = this.getCacheNotification(notificationId);\n this.scrollNotificationIntoView(notificationElement);\n // Create a new version of the notification to send with the notification so\n // this copy isn't modified.\n this.getContainer().trigger(NotificationAreaEvents.showNotification, [$.extend({}, notification)]);\n }\n };\n\n /**\n * Send a request to mark the notification as read in the server and remove the unread\n * status from the element.\n *\n * @method markNotificationAsRead\n * @param {object} notificationElement The jQuery notification element\n * @return {object} jQuery promise\n */\n ControlArea.prototype.markNotificationAsRead = function(notificationElement) {\n return NotificationRepo.markAsRead(notificationElement.attr('data-id')).done(function() {\n notificationElement.removeClass('unread');\n });\n };\n\n\n /**\n * Render the notification data with the appropriate template and add it to the DOM.\n *\n * @method renderNotifications\n * @param {array} notifications Array of notification data\n * @return {object} jQuery promise that is resolved when all notifications have been\n * rendered and added to the DOM\n */\n ControlArea.prototype.renderNotifications = function(notifications) {\n var promises = [];\n var container = this.getContent();\n\n $.each(notifications, function(index, notification) {\n // Need to remove the contexturl so the item isn't rendered\n // as a link.\n var contextUrl = notification.contexturl;\n delete notification.contexturl;\n\n var promise = Templates.render(TEMPLATES.NOTIFICATION, notification)\n .then(function(html, js) {\n // Restore it for the cache.\n notification.contexturl = contextUrl;\n this.setCacheNotification(notification);\n // Pass the Rendered content out.\n return {html: html, js: js};\n }.bind(this));\n promises.push(promise);\n }.bind(this));\n\n return $.when.apply($, promises).then(function() {\n // Each of the promises in the when will pass its results as an argument to the function.\n // The order of the arguments will be the order that the promises are passed to when()\n // i.e. the first promise's results will be in the first argument.\n $.each(arguments, function(index, argument) {\n container.append(argument.html);\n Templates.runTemplateJS(argument.js);\n });\n return;\n });\n };\n\n /**\n * Load notifications from the server and render them.\n *\n * @method loadMoreNotifications\n * @return {object} jQuery promise\n */\n ControlArea.prototype.loadMoreNotifications = function() {\n if (this.isLoading || this.hasLoadedAllContent()) {\n return $.Deferred().resolve();\n }\n\n this.startLoading();\n var request = {\n limit: this.getLimit(),\n offset: this.getOffset(),\n useridto: this.getUserId(),\n };\n\n if (!this.initialLoad) {\n // If this is the first load we may have been given a non-zero offset,\n // in which case we need to load all notifications preceeding that offset\n // to make sure the full list is rendered.\n request.limit = this.getOffset() + this.getLimit();\n request.offset = 0;\n }\n\n var promise = NotificationRepo.query(request).then(function(result) {\n var notifications = result.notifications;\n this.unreadCount = result.unreadcount;\n this.setLoadedAllContent(!notifications.length || notifications.length < this.getLimit());\n this.initialLoad = true;\n\n if (notifications.length) {\n this.incrementOffset();\n return this.renderNotifications(notifications);\n }\n\n return false;\n }.bind(this))\n .always(function() {\n this.stopLoading();\n }.bind(this));\n\n return promise;\n };\n\n /**\n * Create the event listeners for the control area.\n *\n * @method registerEventListeners\n */\n ControlArea.prototype.registerEventListeners = function() {\n CustomEvents.define(this.getRoot(), [\n CustomEvents.events.activate,\n CustomEvents.events.scrollBottom,\n CustomEvents.events.scrollLock,\n CustomEvents.events.up,\n CustomEvents.events.down,\n ]);\n\n this.getRoot().on(CustomEvents.events.scrollBottom, function() {\n this.loadMoreNotifications();\n }.bind(this));\n\n this.getRoot().on(CustomEvents.events.activate, SELECTORS.NOTIFICATION, function(e) {\n var notificationElement = $(e.target).closest(SELECTORS.NOTIFICATION);\n this.showNotification(notificationElement);\n }.bind(this));\n\n // Show the previous notification in the list.\n this.getRoot().on(CustomEvents.events.up, SELECTORS.NOTIFICATION, function(e, data) {\n var notificationElement = $(e.target).closest(SELECTORS.NOTIFICATION);\n this.showNotification(notificationElement.prev());\n\n data.originalEvent.preventDefault();\n }.bind(this));\n\n // Show the next notification in the list.\n this.getRoot().on(CustomEvents.events.down, SELECTORS.NOTIFICATION, function(e, data) {\n var notificationElement = $(e.target).closest(SELECTORS.NOTIFICATION);\n this.showNotification(notificationElement.next());\n\n data.originalEvent.preventDefault();\n }.bind(this));\n\n this.getContainer().on(NotificationAreaEvents.notificationShown, function(e, notification) {\n if (!notification.read) {\n var element = this.getNotificationElement(notification.id);\n\n if (element) {\n this.markNotificationAsRead(element);\n }\n\n var cachedNotification = this.getCacheNotification(notification.id);\n\n if (cachedNotification) {\n cachedNotification.read = true;\n }\n }\n }.bind(this));\n };\n\n return ControlArea;\n});\n"],"file":"notification_area_control_area.min.js"}
\ No newline at end of file
diff --git a/message/output/popup/amd/build/notification_area_events.min.js b/message/output/popup/amd/build/notification_area_events.min.js
index 5912b546a26..d977f2a6e4c 100644
--- a/message/output/popup/amd/build/notification_area_events.min.js
+++ b/message/output/popup/amd/build/notification_area_events.min.js
@@ -1,2 +1,2 @@
-define ("message_popup/notification_area_events",[],function(){return{showNotification:"notification-area-events:showNotification",notificationShown:"notification-area-events:notificationShown"}});
+define ("message_popup/notification_area_events",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;a.default={showNotification:"notification-area-events:showNotification",notificationShown:"notification-area-events:notificationShown"};return a.default});
//# sourceMappingURL=notification_area_events.min.js.map
diff --git a/message/output/popup/amd/build/notification_area_events.min.js.map b/message/output/popup/amd/build/notification_area_events.min.js.map
index cc4f11c4352..d8499517ad0 100644
--- a/message/output/popup/amd/build/notification_area_events.min.js.map
+++ b/message/output/popup/amd/build/notification_area_events.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/notification_area_events.js"],"names":["define","showNotification","notificationShown"],"mappings":"AAwBAA,OAAM,0CAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,gBAAgB,CAAE,2CADf,CAEHC,iBAAiB,CAAE,4CAFhB,CAIV,CALK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle 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// Moodle 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 Moodle. If not, see