/
jquery.terminal.min.js.map
1 lines (1 loc) · 780 KB
/
jquery.terminal.min.js.map
1
{"version":3,"sources":["jquery.terminal.js"],"sourcesContent":["/**@license\n * __ _____ ________ __\n * / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /\n * __ / // // // // // _ // _// // / / // _ // _// // // \\/ // _ \\/ /\n * / / // // // // // ___// / / // / / // ___// / / / / // // /\\ // // / /__\n * \\___//____ \\\\___//____//_/ _\\_ / /_//____//_/ /_/ /_//_//_/ /_/ \\__\\_\\___/\n * \\/ /____/ version 2.39.3\n *\n * This file is part of jQuery Terminal. https://terminal.jcubic.pl\n *\n * Copyright (c) 2010-2023 Jakub T. Jankiewicz <https://jcubic.pl/me>\n * Released under the MIT license\n *\n * Contains:\n *\n * Storage plugin Distributed under the MIT License\n * modified to work from Data URIs that block storage and cookies in Chrome\n * Copyright (c) 2010 Dave Schindler\n *\n * jQuery Timers licenced with the WTFPL\n * <http://jquery.offput.ca/timers/>\n *\n * Cross-Browser Split 1.1.1\n * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>\n * Available under the MIT License\n *\n * jQuery Caret\n * Copyright (c) 2009, Gideon Sireling\n * 3 clause BSD License\n *\n * sprintf.js\n * Copyright (c) 2007-2013 Alexandru Marasteanu <hello at alexei dot ro>\n * licensed under 3 clause BSD license\n *\n * debounce function from Lodash\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * The MIT License\n *\n * emoji regex v9.0.0 by Mathias Bynens\n * MIT license\n *\n * broken image by Sophia Bai from the Noun Project (CC-BY)\n *\n * Date: Sun, 21 Apr 2024 10:23:57 +0000\n */\n/* global define, Map, BigInt */\n/* eslint-disable */\n/* istanbul ignore next */\n(function(ctx) {\n var sprintf = function() {\n if (!sprintf.cache.hasOwnProperty(arguments[0])) {\n sprintf.cache[arguments[0]] = sprintf.parse(arguments[0]);\n }\n return sprintf.format.call(null, sprintf.cache[arguments[0]], arguments);\n };\n sprintf.format = function(parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;\n for (i = 0; i < tree_length; i++) {\n node_type = get_type(parse_tree[i]);\n if (node_type === 'string') {\n output.push(parse_tree[i]);\n }\n else if (node_type === 'array') {\n match = parse_tree[i]; // convenience purposes only\n if (match[2]) { // keyword argument\n arg = argv[cursor];\n for (k = 0; k < match[2].length; k++) {\n if (!arg.hasOwnProperty(match[2][k])) {\n throw(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]));\n }\n arg = arg[match[2][k]];\n }\n }\n else if (match[1]) { // positional argument (explicit)\n arg = argv[match[1]];\n }\n else { // positional argument (implicit)\n arg = argv[cursor++];\n }\n\n if (/[^s]/.test(match[8]) && (get_type(arg) !== 'number')) {\n throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));\n }\n switch (match[8]) {\n case 'b': arg = arg.toString(2); break;\n case 'c': arg = String.fromCharCode(arg); break;\n case 'd': arg = parseInt(arg, 10); break;\n case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;\n case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;\n case 'o': arg = arg.toString(8); break;\n case 's': arg = ((arg = String(arg)) && match[7] ? arg.slice(0, match[7]) : arg); break;\n case 'u': arg = arg >>> 0; break;\n case 'x': arg = arg.toString(16); break;\n case 'X': arg = arg.toString(16).toUpperCase(); break;\n }\n arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? ' +' + arg : arg);\n pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' ';\n pad_length = match[6] - String(arg).length;\n pad = match[6] ? str_repeat(pad_character, pad_length) : '';\n output.push(match[5] ? arg + pad : pad + arg);\n }\n }\n return output.join('');\n };\n\n sprintf.cache = {};\n\n sprintf.parse = function(fmt) {\n var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;\n while (_fmt) {\n if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n parse_tree.push(match[0]);\n }\n else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n parse_tree.push('%');\n }\n else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1;\n var field_list = [], replacement_field = match[2], field_match = [];\n if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1]);\n while ((replacement_field = replacement_field.slice(field_match[0].length)) !== '') {\n if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1]);\n }\n else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n field_list.push(field_match[1]);\n }\n else {\n throw('[sprintf] huh?');\n }\n }\n }\n else {\n throw('[sprintf] huh?');\n }\n match[2] = field_list;\n }\n else {\n arg_names |= 2;\n }\n if (arg_names === 3) {\n throw('[sprintf] mixing positional and named placeholders is not (yet) supported');\n }\n parse_tree.push(match);\n }\n else {\n throw('[sprintf] huh?');\n }\n _fmt = _fmt.slice(match[0].length);\n }\n return parse_tree;\n };\n\n var vsprintf = function(fmt, argv, _argv) {\n _argv = argv.slice(0);\n _argv.splice(0, 0, fmt);\n return sprintf.apply(null, _argv);\n };\n\n /**\n * helpers\n */\n function get_type(variable) {\n return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();\n }\n\n function str_repeat(input, multiplier) {\n for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}\n return output.join('');\n }\n\n /**\n * export to either browser or node.js\n */\n ctx.sprintf = sprintf;\n ctx.vsprintf = vsprintf;\n})(typeof global !== \"undefined\" ? global : self || window);\n// -----------------------------------------------------------------------\n/* eslint-enable */\n// UMD taken from https://github.com/umdjs/umd\n(function(factory, undefined) {\n var root;\n if (typeof window !== 'undefined') {\n root = window;\n } else if (typeof self !== 'undefined') {\n root = self;\n } else if (typeof global !== 'undefined') {\n root = global;\n } else {\n throw new Error('Unknow context');\n }\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n // istanbul ignore next\n define(['jquery', 'wcwidth'], function(jquery, wcwidth) {\n factory(jquery, wcwidth, root);\n return jquery;\n });\n } else if (typeof module === 'object' && module.exports) {\n // Node/CommonJS\n module.exports = function(root, jQuery, wcwidth) {\n if (jQuery === undefined) {\n // require('jQuery') returns a factory that requires window to\n // build a jQuery instance, we normalize how we use modules\n // that require this pattern but the window provided is a noop\n // if it's defined (how jquery works)\n if (typeof window !== 'undefined') {\n jQuery = require('jquery');\n } else {\n jQuery = require('jquery')(root);\n }\n }\n if (wcwidth === undefined) {\n wcwidth = require('wcwidth');\n }\n factory(jQuery, wcwidth, root);\n return jQuery;\n };\n } else {\n // Browser\n // istanbul ignore next\n if (!root.jQuery) {\n root.$ = root.cash;\n }\n factory(root.jQuery || root.cash, root.wcwidth, root);\n }\n})(function($, wcwidth, root, undefined) {\n 'use strict';\n // -----------------------------------------------------------------------\n // :: debug functions\n // -----------------------------------------------------------------------\n /* eslint-disable */\n /* istanbul ignore next */\n function debug(str) {\n if (false) {\n console.log(str);\n //$.terminal.active().echo(str);\n }\n }\n /* eslint-enable */\n // -----------------------------------------------------------------------\n // :: Replacemenet for jQuery 2 deferred objects\n // -----------------------------------------------------------------------\n function DelayQueue() {\n var callbacks = $.Callbacks();\n var resolved = false;\n var self = this;\n this.resolve = function() {\n callbacks.fire();\n self.resolved = resolved = true;\n };\n this.add = function(fn) {\n if (resolved) {\n fn();\n } else {\n callbacks.add(fn);\n }\n };\n }\n // -----------------------------------------------------------------------\n // :: map object to object\n // -----------------------------------------------------------------------\n $.omap = function(o, fn) {\n var result = {};\n $.each(o, function(k, v) {\n result[k] = fn.call(o, k, v);\n });\n return result;\n };\n $.fn.text_length = function() {\n return this.map(function() {\n return $(this).text().length;\n }).get().reduce(function(a, b) {\n return a + b;\n }, 0);\n };\n // -----------------------------------------------------------------------\n // :: Deep clone of objects and arrays\n // -----------------------------------------------------------------------\n var Clone = {\n clone_object: function(object) {\n var tmp = {};\n if (typeof object === 'object') {\n if (Array.isArray(object)) {\n return this.clone_array(object);\n } else if (object === null) {\n return object;\n } else {\n for (var key in object) {\n if (Array.isArray(object[key])) {\n tmp[key] = this.clone_array(object[key]);\n } else if (typeof object[key] === 'object') {\n tmp[key] = this.clone_object(object[key]);\n } else {\n tmp[key] = object[key];\n }\n }\n }\n }\n return tmp;\n },\n clone_array: function(array) {\n if (!is_function(Array.prototype.map)) {\n throw new Error(\"Your browser don't support ES5 array map \" +\n 'use es5-shim');\n }\n return array.slice(0).map(function(item) {\n if (typeof item === 'object') {\n return this.clone_object(item);\n } else {\n return item;\n }\n }.bind(this));\n }\n };\n var clone = function(object) {\n return Clone.clone_object(object);\n };\n // -----------------------------------------------------------------------\n // IE11 polyfill\n // -----------------------------------------------------------------------\n /* eslint-disable */\n if ('Map' in root && !('clear' in Map.prototype)) {\n Map.prototype.clear = function() {\n this.forEach(function(value, key, map) {\n map.delete(key);\n });\n };\n }\n // -----------------------------------------------------------------------\n // :: Storage plugin\n // -----------------------------------------------------------------------\n var localStorage;\n /* istanbul ignore next */\n (function() {\n var hasLS = function() {\n try {\n var testKey = 'test', storage = window.localStorage;\n storage.setItem(testKey, '1');\n storage.removeItem(testKey);\n return true;\n } catch (error) {\n return false;\n }\n };\n var hasCookies = function() {\n try {\n document.cookie.split(';');\n return true;\n } catch (e) {\n return false;\n }\n };\n // Private data\n var isLS = hasLS();\n // Private functions\n function wls(n, v) {\n var c;\n if (typeof n === 'string' && typeof v === 'string') {\n localStorage[n] = v;\n return true;\n } else if (typeof n === 'object' && typeof v === 'undefined') {\n for (c in n) {\n if (n.hasOwnProperty(c)) {\n localStorage[c] = n[c];\n }\n }\n return true;\n }\n return false;\n }\n function wc(n, v) {\n var dt, e, c;\n dt = new Date();\n dt.setTime(dt.getTime() + 31536000000);\n e = '; expires=' + dt.toGMTString();\n if (typeof n === 'string' && typeof v === 'string') {\n document.cookie = n + '=' + v + e + '; path=/';\n return true;\n } else if (typeof n === 'object' && typeof v === 'undefined') {\n for (c in n) {\n if (n.hasOwnProperty(c)) {\n document.cookie = c + '=' + n[c] + e + '; path=/';\n }\n }\n return true;\n }\n return false;\n }\n function rls(n) {\n return localStorage[n];\n }\n function rc(n) {\n var nn, ca, i, c;\n nn = n + '=';\n ca = document.cookie.split(';');\n for (i = 0; i < ca.length; i++) {\n c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.slice(1, c.length);\n }\n if (c.indexOf(nn) === 0) {\n return c.slice(nn.length, c.length);\n }\n }\n return null;\n }\n function dls(n) {\n return delete localStorage[n];\n }\n function dc(n) {\n return wc(n, '', -1);\n }\n /**\n * Public API\n * $.Storage.set(\"name\", \"value\")\n * $.Storage.set({\"name1\":\"value1\", \"name2\":\"value2\", etc})\n * $.Storage.get(\"name\")\n * $.Storage.remove(\"name\")\n */\n if (!hasCookies() && !isLS) {\n localStorage = {};\n $.extend({\n Storage: {\n set: wls,\n get: rls,\n remove: dls\n }\n });\n } else {\n if (isLS) {\n localStorage = window.localStorage;\n }\n $.extend({\n Storage: {\n set: isLS ? wls : wc,\n get: isLS ? rls : rc,\n remove: isLS ? dls : dc\n }\n });\n }\n })();\n // -----------------------------------------------------------------------\n // :: Debounce from Lodash\n // -----------------------------------------------------------------------\n /* istanbul ignore next */\n var debounce = (function() {\n var FUNC_ERROR_TEXT = 'Expected a function';\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n function now() {\n return Date.now();\n }\n return function debounce(func, wait, options) {\n var nativeMax = Math.max,\n nativeMin = Math.min;\n\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = wait || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(options.maxWait || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n };\n })();\n // -----------------------------------------------------------------------\n // :: jQuery Timers\n // -----------------------------------------------------------------------\n var jQuery = $;\n /* istanbul ignore next */\n (function($) {\n jQuery.fn.extend({\n everyTime: function(interval, label, fn, times, belay) {\n return this.each(function() {\n jQuery.timer.add(this, interval, label, fn, times, belay);\n });\n },\n oneTime: function(interval, label, fn) {\n return this.each(function() {\n jQuery.timer.add(this, interval, label, fn, 1);\n });\n },\n stopTime: function(label, fn) {\n return this.each(function() {\n jQuery.timer.remove(this, label, fn);\n });\n }\n });\n\n jQuery.extend({\n timer: {\n guid: 1,\n global: {},\n regex: /^([0-9]+)\\s*(.*s)?$/,\n powers: {\n // Yeah this is major overkill...\n 'ms': 1,\n 'cs': 10,\n 'ds': 100,\n 's': 1000,\n 'das': 10000,\n 'hs': 100000,\n 'ks': 1000000\n },\n timeParse: function(value) {\n if (value === undefined || value === null) {\n return null;\n }\n var result = this.regex.exec(value.toString().trim());\n if (result[2]) {\n var num = parseInt(result[1], 10);\n var mult = this.powers[result[2]] || 1;\n return num * mult;\n } else {\n return value;\n }\n },\n add: function(element, interval, label, fn, times, belay) {\n var counter = 0;\n\n if (typeof label === 'function') {\n if (!times) {\n times = fn;\n }\n fn = label;\n label = interval;\n }\n\n interval = jQuery.timer.timeParse(interval);\n\n if (typeof interval !== 'number' ||\n isNaN(interval) ||\n interval <= 0) {\n return;\n }\n if (times && times.constructor !== Number) {\n belay = !!times;\n times = 0;\n }\n\n times = times || 0;\n belay = belay || false;\n\n if (!element.$timers) {\n element.$timers = {};\n }\n if (!element.$timers[label]) {\n element.$timers[label] = {};\n }\n fn.$timerID = fn.$timerID || this.guid++;\n\n var handler = function() {\n if (belay && handler.inProgress) {\n return;\n }\n handler.inProgress = true;\n if ((++counter > times && times !== 0) ||\n fn.call(element, counter) === false) {\n jQuery.timer.remove(element, label, fn);\n }\n handler.inProgress = false;\n };\n\n handler.$timerID = fn.$timerID;\n\n if (!element.$timers[label][fn.$timerID]) {\n element.$timers[label][fn.$timerID] = setInterval(handler, interval);\n }\n\n if (!this.global[label]) {\n this.global[label] = [];\n }\n this.global[label].push(element);\n\n },\n remove: function(element, label, fn) {\n var timers = element.$timers, ret;\n\n if (timers) {\n\n if (!label) {\n for (var lab in timers) {\n if (timers.hasOwnProperty(lab)) {\n this.remove(element, lab, fn);\n }\n }\n } else if (timers[label]) {\n if (fn) {\n if (fn.$timerID) {\n clearInterval(timers[label][fn.$timerID]);\n delete timers[label][fn.$timerID];\n }\n } else {\n for (var _fn in timers[label]) {\n if (timers[label].hasOwnProperty(_fn)) {\n clearInterval(timers[label][_fn]);\n delete timers[label][_fn];\n }\n }\n }\n\n for (ret in timers[label]) {\n if (timers[label].hasOwnProperty(ret)) {\n break;\n }\n }\n if (!ret) {\n ret = null;\n delete timers[label];\n }\n }\n\n for (ret in timers) {\n if (timers.hasOwnProperty(ret)) {\n break;\n }\n }\n if (!ret) {\n element.$timers = null;\n }\n }\n }\n }\n });\n if (/(msie) ([\\w.]+)/.exec(navigator.userAgent.toLowerCase())) {\n $(window).one('unload', function() {\n var global = jQuery.timer.global;\n for (var label in global) {\n if (global.hasOwnProperty(label)) {\n var els = global[label], i = els.length;\n while (--i) {\n jQuery.timer.remove(els[i], label);\n }\n }\n }\n });\n }\n })(jQuery);\n // -----------------------------------------------------------------------\n // :: CROSS BROWSER SPLIT\n // -----------------------------------------------------------------------\n /* istanbul ignore next */\n (function(undef) {\n // prevent double include\n\n if (!String.prototype.split.toString().match(/\\[native/)) {\n return;\n }\n\n var nativeSplit = String.prototype.split,\n compliantExecNpcg = /()??/.exec(\"\")[1] === undef, // NPCG: nonparticipating capturing group\n self;\n\n self = function(str, separator, limit) {\n // If `separator` is not a regex, use `nativeSplit`\n if (Object.prototype.toString.call(separator) !== \"[object RegExp]\") {\n return nativeSplit.call(str, separator, limit);\n }\n var output = [],\n flags = (separator.ignoreCase ? \"i\" : \"\") +\n (separator.multiline ? \"m\" : \"\") +\n (separator.extended ? \"x\" : \"\") + // Proposed for ES6\n (separator.sticky ? \"y\" : \"\"), // Firefox 3+\n lastLastIndex = 0,\n // Make `global` and avoid `lastIndex` issues by working with a copy\n separator2, match, lastIndex, lastLength;\n separator = new RegExp(separator.source, flags + \"g\");\n str += \"\"; // Type-convert\n if (!compliantExecNpcg) {\n // Doesn't need flags gy, but they don't hurt\n separator2 = new RegExp(\"^\" + separator.source + \"$(?!\\\\s)\", flags);\n }\n /* Values for `limit`, per the spec:\n * If undefined: 4294967295 // Math.pow(2, 32) - 1\n * If 0, Infinity, or NaN: 0\n * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;\n * If negative number: 4294967296 - Math.floor(Math.abs(limit))\n * If other: Type-convert, then use the above rules\n */\n // ? Math.pow(2, 32) - 1 : ToUint32(limit)\n limit = limit === undef ? -1 >>> 0 : limit >>> 0;\n while (match = separator.exec(str)) {\n // `separator.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0].length;\n if (lastIndex > lastLastIndex) {\n output.push(str.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for\n // nonparticipating capturing groups\n if (!compliantExecNpcg && match.length > 1) {\n match[0].replace(separator2, function() {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undef) {\n match[i] = undef;\n }\n }\n });\n }\n if (match.length > 1 && match.index < str.length) {\n Array.prototype.push.apply(output, match.slice(1));\n }\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= limit) {\n break;\n }\n }\n if (separator.lastIndex === match.index) {\n separator.lastIndex++; // Avoid an infinite loop\n }\n }\n if (lastLastIndex === str.length) {\n if (lastLength || !separator.test(\"\")) {\n output.push(\"\");\n }\n } else {\n output.push(str.slice(lastLastIndex));\n }\n return output.length > limit ? output.slice(0, limit) : output;\n };\n\n // For convenience\n String.prototype.split = function(separator, limit) {\n return self(this, separator, limit);\n };\n\n return self;\n\n })();\n // -----------------------------------------------------------------------\n // :: jQuery Caret\n // -----------------------------------------------------------------------\n /* istanbul ignore next */\n $.fn.caret = function(pos) {\n var target = this[0];\n var isContentEditable = target.contentEditable === 'true';\n //get\n if (arguments.length === 0) {\n //HTML5\n if (window.getSelection) {\n //contenteditable\n if (isContentEditable) {\n if (!this.is(':focus')) {\n target.focus();\n }\n var range1 = window.getSelection().getRangeAt(0),\n range2 = range1.cloneRange();\n range2.selectNodeContents(target);\n range2.setEnd(range1.endContainer, range1.endOffset);\n return range2.toString().length;\n }\n //textarea\n return target.selectionStart;\n }\n //IE<9\n if (document.selection) {\n target.focus();\n //contenteditable\n if (isContentEditable) {\n var range1 = document.selection.createRange(),\n range2 = document.body.createTextRange();\n range2.moveToElementText(target);\n range2.setEndPoint('EndToEnd', range1);\n return range2.text.length;\n }\n //textarea\n var pos = 0,\n range = target.createTextRange(),\n range2 = document.selection.createRange().duplicate(),\n bookmark = range2.getBookmark();\n range.moveToBookmark(bookmark);\n while (range.moveStart('character', -1) !== 0) pos++;\n return pos;\n }\n //not supported\n return 0;\n }\n //set\n if (pos === -1)\n pos = this[isContentEditable? 'text' : 'val']().length;\n //HTML5\n if (window.getSelection) {\n //contenteditable\n if (isContentEditable) {\n if (!this.is(':focus')) {\n target.focus();\n }\n var selection = window.getSelection();\n selection.collapse(selection.focusNode, pos);\n }\n //textarea\n else\n target.setSelectionRange(pos, pos);\n }\n //IE<9\n else if (document.body.createTextRange) {\n var range = document.body.createTextRange();\n range.moveToElementText(target);\n range.moveStart('character', pos);\n range.collapse(true);\n range.select();\n }\n if (!isContentEditable && !this.is(':focus')) {\n target.focus();\n }\n return pos;\n };\n /* eslint-enable */\n // -----------------------------------------------------------------------\n // :: callback based event handler plugin generator\n // -----------------------------------------------------------------------\n function make_callback_plugin(options) {\n var factory_settings = $.extend({\n init: $.noop,\n destroy: $.noop,\n name: 'event'\n }, options);\n return function(callback, options) {\n var trigger = arguments.length === 0;\n var unbind = arguments[0] === \"unbind\";\n if (!trigger && !unbind && !is_function(callback)) {\n throw new Error('Invalid argument, it need to a function or string ' +\n '\"unbind\" or no arguments.');\n }\n if (unbind) {\n callback = is_function(arguments[1]) ? arguments[1] : null;\n }\n var data_name = 'callbacks_' + factory_settings.name;\n return this.each(function() {\n var $this = $(this);\n var callbacks;\n function handler(arg) {\n callbacks.fireWith($this, [arg]);\n }\n if (trigger || unbind) {\n callbacks = $this.data(data_name);\n if (trigger) {\n callbacks && callbacks.fire();\n } else {\n if (callback && callbacks) {\n callbacks.remove(callback);\n if (!callbacks.has()) {\n callbacks = null;\n }\n } else {\n callbacks = null;\n }\n if (!callbacks) {\n $this.removeData(data_name);\n factory_settings.destroy.call(this, handler, options);\n }\n }\n } else if ($this.data(data_name)) {\n $(this).data(data_name).add(callback);\n } else {\n callbacks = $.Callbacks();\n callbacks.add(callback);\n $this.data(data_name, callbacks);\n factory_settings.init.call(this, handler, options);\n }\n });\n };\n }\n // -----------------------------------------------------------------------\n // :: Cross-browser resize element plugin using sentinel iframe or\n // :: resizeObserver\n // -----------------------------------------------------------------------\n $.fn.resizer = make_callback_plugin({\n name: 'resize',\n init: function(handler, options) {\n var settings = $.extend({\n prefix: ''\n }, options);\n var $this = $(this);\n var resizer;\n var first = true;\n if ($this.is('body')) {\n $(window).on('resize.resizer', handler);\n } else if (window.ResizeObserver) {\n resizer = new ResizeObserver(function() {\n if (!first) {\n setTimeout(handler, 0);\n }\n first = false;\n });\n resizer.observe(this);\n $this.data('observer', resizer);\n } else {\n var iframe = $('<iframe/>').addClass(settings.prefix + 'resizer')\n .appendTo(this)[0];\n $(iframe.contentWindow).on('resize', handler);\n }\n },\n destroy: function() {\n var $this = $(this);\n if (window.ResizeObserver) {\n var observer = $this.data('observer');\n if (observer) {\n observer.unobserve(this);\n $this.removeData('observer');\n }\n } else {\n var iframe = $this.find('> iframe[class$=\"resizer\"]');\n if (iframe.length) {\n // just in case of memory leaks in IE\n $(iframe[0].contentWindow).off('resize').remove();\n iframe.remove();\n } else if ($this.is('body')) {\n $(window).off('resize.resizer');\n }\n }\n }\n });\n // -----------------------------------------------------------------------\n // :: Mobile friendly scroll that work without scrollbar (for less)\n // -----------------------------------------------------------------------\n $.fn.touch_scroll = make_callback_plugin({\n name: 'touch',\n init: function(handler) {\n var origin;\n var previous;\n $(this).on('touchstart.scroll', function(e) {\n e = e.originalEvent;\n if (e.target.tagName.toLowerCase() !== 'a' && e.touches.length === 1) {\n previous = origin = e.touches[0];\n }\n }).on('touchmove.scroll', function(e) {\n e = e.originalEvent;\n if (origin && e.touches.length === 1) {\n var current = e.touches[0];\n var ret = handler({\n origin: origin,\n previous: previous,\n current: current\n });\n if (ret === false) {\n e.preventDefault();\n }\n previous = current;\n }\n }).on('touchend.scroll', function() {\n if (origin || previous) {\n origin = previous = null;\n }\n });\n },\n destroy: function() {\n $(this).off('touchstart.scroll touchmove.scroll touchend.scroll');\n }\n });\n // -----------------------------------------------------------------------\n // :: This plugin is used to pause terminal when images and iframes\n // :: are loading\n // -----------------------------------------------------------------------\n $.fn.on_load = function(options) {\n var settings = $.extend({\n error: $.noop,\n load: $.noop,\n done: $.noop\n }, options);\n var defers = [];\n this.find('img,iframe').each(function() {\n var self = $(this);\n var defer = new $.Deferred();\n self.on('load', defer.resolve)\n .on('error', function() {\n settings.error(self);\n defer.reject();\n });\n defers.push(defer);\n });\n settings.load(!!defers.length);\n if (defers.length) {\n $.when.apply($, defers).then(function() {\n settings.done(true);\n });\n } else {\n settings.done(false);\n }\n return this;\n };\n // -----------------------------------------------------------------------\n function jquery_resolve(value) {\n var defer = jQuery.Deferred();\n defer.resolve(value);\n return defer.promise();\n }\n // -----------------------------------------------------------------------\n function unpromise(value, callback, error) {\n if (value !== undefined) {\n if (is_promise(value)) {\n if (is_function(value.catch) && is_function(error)) {\n value.catch(error);\n }\n if (is_function(value.done)) {\n return value.done(callback);\n } else if (is_function(value.then)) {\n return value.then(callback);\n }\n } else if (value instanceof Array) {\n var promises = value.filter(function(value) {\n return value && (is_function(value.done) || is_function(value.then));\n });\n if (promises.length) {\n var result = $.when.apply($, value).then(function() {\n return callback([].slice.call(arguments));\n });\n if (is_function(result.catch)) {\n result = result.catch(error);\n }\n return result;\n }\n }\n // TODO: investigate why it break when called\n // when value is undefined\n // when moving this line outside if\n // it breaks all completion unit tests\n return callback(value);\n }\n }\n // -----------------------------------------------------------------------\n // :: helper to allow to execute unpromise with undefined\n // :: this is workaround on the problem above\n // -----------------------------------------------------------------------\n function always(value) {\n return value === undefined ? true : value;\n }\n // -----------------------------------------------------------------------\n // :: based on https://github.com/zeusdeux/isInViewport\n // :: work only vertically and on dom elements\n // -----------------------------------------------------------------------\n $.fn.is_fully_in_viewport = (function() {\n function is_visible(node, container) {\n var box = node.getBoundingClientRect();\n var viewport = container[0].getBoundingClientRect();\n var top = box.top - viewport.top;\n var bottom = box.bottom - viewport.top;\n var height = container.height();\n return bottom > 0 && top <= height;\n }\n if (root.IntersectionObserver) {\n return function(container) {\n var node = this[0];\n var defer = jQuery.Deferred();\n var item_observer = new root.IntersectionObserver(function(entries) {\n defer.resolve(entries[0].isIntersecting && entries[0].ratio === 1);\n item_observer.unobserve(node);\n }, {\n root: container[0]\n });\n item_observer.observe(node);\n return defer.promise();\n };\n } else {\n return function(container) {\n return jquery_resolve(is_visible(this[0], container));\n };\n }\n })();\n // -------------------------------------------------------------------------\n /* eslint-disable */\n var entity_re = /(&(?:[a-z\\d]+|#\\d+|#x[a-f\\d]+);)/i;\n var space_re = /\\s/;\n // regex that match single character at begining and folowing combine character\n // https://en.wikipedia.org/wiki/Combining_character\n var combine_chr_re = /(.(?:[\\u0300-\\u036F]|[\\u1AB0-\\u1abE]|[\\u1DC0-\\u1DF9]|[\\u1DFB-\\u1DFF]|[\\u20D0-\\u20F0]|[\\uFE20-\\uFE2F])+)/;\n // source: https://mathiasbynens.be/notes/javascript-unicode\n var astral_symbols_re = /([\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/;\n // source: https://github.com/mathiasbynens/emoji-regex\n var emoji_re = /(\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67)\\uDB40\\uDC7F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC68(?:\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])|\\uD83E\\uDDD1(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69])(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69])(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69])(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69])(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69])(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|\\uD83C\\uDFF3\\uFE0F\\u200D\\u26A7|\\uD83E\\uDDD1(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|\\uD83D\\uDC3B\\u200D\\u2744|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uFE0F\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E-\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDF])\\u200D[\\u2640\\u2642])\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF6\\uD83C\\uDDE6|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83D\\uDC08\\u200D\\u2B1B|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|[#\\*0-9]\\uFE0F\\u20E3|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26A7\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5-\\uDED7\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])\\uFE0F?|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDD77\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD]))/;\n // https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser\n var mobile_re = /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i;\n var tablet_re = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i;\n var format_split_re = /(\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\](?:[^\\]\\\\]*(?:\\\\\\\\)*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]?)/i;\n var format_parts_re = /\\[\\[((?:-?[@!gbiuso])*);([^;]*);([^;\\]]*);?([^;\\]]*);?([^\\]]*)\\]([^\\]\\\\]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]+)\\]?/gi;\n var format_re = /\\[\\[((?:-?[@!gbiuso])*;[^;\\]]*;[^;\\]]*(?:;|[^\\]()]*);?[^\\]]*)\\]([^\\]]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]?/gi;\n var format_exist_re = /\\[\\[((?:-?[@!gbiuso])*;[^;\\]]*;[^;\\]]*(?:;|[^\\]()]*);?[^\\]]*)\\]([^\\]]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]/gi;\n var format_full_re = /^(\\[\\[(?:(?:-?[@!gbiuso])*;[^;\\]]*;[^;\\]]*(?:;|[^\\]()]*);?[^\\]]*)\\])([^\\]]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)(\\])$/i;\n var format_begin_re = /(\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\])/i;\n var format_start_re = /^(\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\])/i;\n var format_end_re = /\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\]?$/i;\n var self_closing_re = /^(?:\\[\\[)?[^;]*@[^;]*;/;\n var color_re = /^(?:#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})|rgba?\\([^)]+\\)|hsla?\\([^)]+\\))$/i;\n var url_re = /(\\b(?:file|ftp|https?):\\/\\/(?:(?:(?!&[^;]+;)|(?=&))[^\\s\"'\\\\<>\\][)])+)/gi;\n var url_nf_re = /\\b(?![^\"\\s[\\]]*])(https?:\\/\\/(?:(?:(?!&[^;]+;)|(?=&))[^\\s\"'\\\\<>\\][)])+)/gi;\n var email_re = /((([^<>('\")[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,})))/g;\n var url_full_re = /^(https?:\\/\\/(?:(?:(?!&[^;]+;)|(?=&))[^\\s\"'<>\\\\\\][)])+)$/gi;\n var email_full_re = /^((([^<>('\")[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,})))$/g;\n var command_re = /((?:\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[\\S\\s][^'\\\\]*)*'|`[^`\\\\]*(?:\\\\[\\S\\s][^`\\\\]*)*`|\\/[^\\/\\\\]*(?:\\\\[\\S\\s][^\\/\\\\]*)*\\/[gimsuy]*(?=\\s|$)|(?:\\\\\\s|\\S))+)(?=\\s|$)/gi;\n var extended_command_re = /^\\s*((terminal|cmd)::([a-z_]+)\\(([\\s\\S]*)\\))\\s*$/;\n var format_exec_split_re = /(\\[\\[(?:-?[@!gbiuso])*;[^\\]]+\\](?:\\\\[[\\]]|[^\\]])*\\]|\\[\\[[\\s\\S]+?\\]\\])/;\n var format_exec_re = /(\\[\\[[\\s\\S]+?\\]\\])/;\n var float_re = /^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$/;\n var re_re = /^\\/((?:\\\\\\/|[^/]|\\[[^\\]]*\\/[^\\]]*\\])+)\\/([gimsuy]*)$/;\n var string_re = /(\"(?:[^\"\\\\]|\\\\(?:\\\\\\\\)*\"|\\\\\\\\)*\"|'(?:[^'\\\\]|\\\\(?:\\\\\\\\)*'|\\\\\\\\)*'|`(?:[^`\\\\]|\\\\(?:\\\\\\\\)*`|\\\\\\\\)*`)/;\n var unclosed_strings_re = /^(?=((?:[^\"']+|\"[^\"\\\\]*(?:\\\\[^][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[^][^'\\\\]*)*')*))\\1./;\n var broken_image = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 14\"><title id=\"title2\">rounded</title><path id=\"terminal-broken-image\" d=\"m 14,10 h 2 v 1 a 3,3 0 0 1 -3,3 H 3 A 3,3 0 0 1 0,11 H 4.5 A 1.00012,1.00012 0 0 0 5.207,10.707 L 6.5,9.414 7.793,10.707 a 0.99963,0.99963 0 0 0 1.41406,0 l 2.36719,-2.36719 1.80127,1.44092 A 0.99807,0.99807 0 0 0 14,10 Z M 16,3 V 8 H 14.35059 L 12.12451,6.21924 A 0.99846,0.99846 0 0 0 10.793,6.293 L 8.5,8.586 7.207,7.293 a 0.99962,0.99962 0 0 0 -1.41406,0 L 4.08594,9 H 0 V 3 A 3,3 0 0 1 3,0 h 10 a 3,3 0 0 1 3,3 z M 6,4.5 A 1.5,1.5 0 1 0 4.5,6 1.5,1.5 0 0 0 6,4.5 Z\" /></svg>';\n var use_broken_image = '<svg class=\"terminal-broken-image\" role=\"presentation\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 14\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><use xlink:href=\"#terminal-broken-image\"/></svg>';\n /* eslint-enable */\n // -------------------------------------------------------------------------\n // :: features flags\n // -------------------------------------------------------------------------\n // taken from https://hacks.mozilla.org/2011/09/detecting-and-generating-\n // css-animations-in-javascript/\n var animation_supported = (function() {\n if (typeof document === 'undefined') {\n return false;\n }\n var animation = false,\n domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),\n elm = document.createElement('div');\n if (elm.style.animationName) {\n animation = true;\n }\n if (animation === false) {\n for (var i = 0; i < domPrefixes.length; i++) {\n var name = domPrefixes[i] + 'AnimationName';\n if (elm.style[name] !== undefined) {\n animation = true;\n break;\n }\n }\n }\n elm = null;\n return animation;\n })();\n // -------------------------------------------------------------------------\n var agent = (root.navigator || window.navigator).userAgent;\n var is_IE = /MSIE|Trident/.test(agent) || /rv:11.0/i.test(agent);\n var is_IEMobile = /IEMobile/.test(agent);\n // -------------------------------------------------------------------------\n var is_ch_unit_supported = (function() {\n if (is_IE && !is_IEMobile) {\n return false;\n }\n if (typeof document === 'undefined') {\n return true; // run without browser context\n }\n var div = document.createElement('div');\n div.style.width = '1ch';\n return div.style.width === '1ch';\n })();\n // -------------------------------------------------------------------------\n var is_css_variables_supported = root.CSS && root.CSS.supports &&\n root.CSS.supports('(--fake-var: 0)');\n // -------------------------------------------------------------------------\n var is_android = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\n // -------------------------------------------------------------------------\n var is_key_native = (function is_key_native() {\n if (!('KeyboardEvent' in root && 'key' in root.KeyboardEvent.prototype)) {\n return false;\n }\n var proto = root.KeyboardEvent.prototype;\n var get = Object.getOwnPropertyDescriptor(proto, 'key').get;\n return !!get.toString().match(/\\[native code\\]/);\n })();\n // -------------------------------------------------------------------------\n var is_browser = (function() {\n try {\n return this === window;\n } catch (e) {\n return false;\n }\n })();\n // -------------------------------------------------------------------------\n var is_mobile = (function(a) {\n var check = false;\n if (mobile_re.test(a) || tablet_re.test(a.substr(0, 4))) {\n check = true;\n }\n // detect iPad 13\n // ref: https://stackoverflow.com/a/57924983/387194s\n if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) {\n return true;\n }\n return check;\n })(navigator.userAgent || navigator.vendor || root.opera);\n // -------------------------------------------------------------------------\n // IE ch unit bug detection - better that UserAgent that can be changed\n // -------------------------------------------------------------------------\n var ch_unit_bug = false;\n if (is_browser) {\n $(function() {\n function width(e) {\n return e[0].getBoundingClientRect().width;\n }\n var base = '<span style=\"font-family: monospace;visibility:hidden;';\n var ch = $(base + 'width:1ch;overflow: hidden\"> </span>');\n ch.appendTo('body');\n var space = $(base + '\"> </span>').appendTo('body');\n // in FireFox the size of space is fraction larger #579\n ch_unit_bug = Math.abs(width(ch) - width(space)) > 0.0001;\n ch.remove();\n space.remove();\n });\n }\n // -----------------------------------------------------------------------\n // :: css helper that work with css variables\n // :: jQuery css method from 3.4 support them by default\n // -----------------------------------------------------------------------\n function css(node, obj, value) {\n if (node instanceof $.fn.init) {\n node.each(function() {\n css(this, obj, value);\n });\n } else if ($.isPlainObject(obj)) {\n Object.keys(obj).forEach(function(key) {\n node.style.setProperty(key, obj[key]);\n });\n } else if (typeof value === 'undefined') {\n return node.style.getPropertyValue(obj);\n } else {\n node.style.setProperty(obj, value);\n }\n }\n // -----------------------------------------------------------------------\n // :: return CSS property with pixel size & proper\n // -----------------------------------------------------------------------\n function style_prop(name, value, important) {\n var props = [\n name + ':' + value + 'px',\n name + ':' + 'calc(' + value + 'px / var(--pixel-density, 1))'\n ];\n if (important) {\n props = props.map(function(prop) {\n return prop + ' !important';\n });\n }\n return props.join(';');\n }\n // -----------------------------------------------------------------------\n // :: hide elements from screen readers\n // -----------------------------------------------------------------------\n function a11y_hide(element) {\n element.attr({\n role: 'presentation',\n 'aria-hidden': 'true'\n });\n }\n // ---------------------------------------------------------------------\n // :: alert only first exception of type\n // ---------------------------------------------------------------------\n var excepctions = [];\n function alert_exception(label, e) {\n if (arguments[0] instanceof $.terminal.Exception) {\n label = arguments[0].type;\n e = arguments[0];\n }\n var message = (label ? label + ': ' : '') + exception_message(e);\n if (excepctions.indexOf(message) === -1) {\n excepctions.push(message);\n setTimeout(function() {\n throw e;\n }, 0);\n //alert(message + (e.stack ? '\\n' + e.stack : ''));\n }\n }\n // ---------------------------------------------------------------------\n // ref: https://stackoverflow.com/a/6248722/387194\n function generate_id() {\n // I generate the UID from two parts here\n // to ensure the random number provide enough bits.\n var firstPart = (Math.random() * 46656) | 0;\n var secondPart = (Math.random() * 46656) | 0;\n firstPart = (\"000\" + firstPart.toString(36)).slice(-3);\n secondPart = (\"000\" + secondPart.toString(36)).slice(-3);\n return firstPart + secondPart;\n }\n // ---------------------------------------------------------------------\n // :; detect if mouse event happen on scrollbar\n // ---------------------------------------------------------------------\n function scrollbar_event(e, node, pixel_density) {\n pixel_density = pixel_density || 1;\n var left = node.offset().left;\n var max_width = node.outerWidth() * pixel_density;\n return max_width <= e.clientX - left;\n }\n // ---------------------------------------------------------------------\n // :: Return exception message as string\n // ---------------------------------------------------------------------\n function exception_message(e) {\n if (typeof e === 'string') {\n return e;\n } else if (typeof e.fileName === 'string') {\n return e.fileName + ': ' + e.message;\n } else {\n return e.message;\n }\n }\n // -----------------------------------------------------------------------\n // :: CYCLE DATA STRUCTURE\n // -----------------------------------------------------------------------\n function Cycle() {\n var data = [].slice.call(arguments);\n var pos = 0;\n $.extend(this, {\n get: function() {\n return data;\n },\n index: function() {\n return pos;\n },\n rotate: function(skip, init) {\n if (init === undefined) {\n init = pos;\n } else if (init === pos) {\n return;\n }\n if (!skip) {\n var defined = data.filter(function(item) {\n return typeof item !== 'undefined';\n });\n if (!defined.length) {\n return;\n }\n }\n if (!data.length) {\n return;\n }\n if (data.length === 1) {\n return data[0];\n } else {\n if (pos === data.length - 1) {\n pos = 0;\n } else {\n ++pos;\n }\n if (typeof data[pos] !== 'undefined') {\n return data[pos];\n } else {\n return this.rotate(true, init);\n }\n }\n },\n length: function() {\n return data.length;\n },\n remove: function(index) {\n delete data[index];\n },\n set: function(item) {\n for (var i = data.length; i--;) {\n if (data[i] === item) {\n pos = i;\n return;\n }\n }\n this.append(item);\n pos = data.length - 1;\n },\n front: function() {\n if (data.length) {\n var index = pos;\n var restart = false;\n while (!data[index]) {\n index++;\n if (index > data.length) {\n if (restart) {\n break;\n }\n index = 0;\n restart = true;\n }\n }\n return data[index];\n }\n },\n map: function(fn) {\n return data.map(function(item, i) {\n if (typeof item !== 'undefined') {\n return fn(item, i);\n }\n return null;\n }).filter(Boolean);\n },\n forEach: function(fn) {\n return data.forEach(function(item, i) {\n if (typeof item !== 'undefined') {\n fn(item, i);\n }\n });\n },\n append: function(item) {\n data.push(item);\n }\n });\n }\n /*\n function time() {\n // performance.now almost equal Date.now()- performance.timing.navigationStart\n // the difference check should be almost the same\n return performance ? performance.now() : Date.now();\n }\n */\n // -----------------------------------------------------------------------\n // :: STACK DATA STRUCTURE\n // -----------------------------------------------------------------------\n function Stack(init) {\n var data = is_array(init) ? init : init ? [init] : [];\n $.extend(this, {\n data: function() {\n return data;\n },\n map: function(fn) {\n return $.map(data, fn);\n },\n size: function() {\n return data.length;\n },\n pop: function() {\n if (data.length === 0) {\n return null;\n } else {\n var value = data[data.length - 1];\n data = data.slice(0, data.length - 1);\n return value;\n }\n },\n push: function(value) {\n data = data.concat([value]);\n return value;\n },\n top: function() {\n return data.length > 0 ? data[data.length - 1] : null;\n },\n clone: function() {\n return new Stack(data.slice(0));\n }\n });\n }\n // -------------------------------------------------------------------------\n // :: Class for Worker that do some computation when needed\n // :: if validation function return false it mean that condition changed\n // :: and cache need to be cleared. If value was not processed it will run\n // :: the action\n // -------------------------------------------------------------------------\n function WorkerCache(options) {\n var settings = $.extend({\n validation: $.noop,\n action: $.noop,\n onCache: $.noop\n }, options);\n this._onCache = settings.onCache.bind(this);\n this._action = settings.action.bind(this);\n this._validation = settings.validation.bind(this);\n if ('Map' in root) {\n this._cache = new Map();\n }\n }\n // -------------------------------------------------------------------------\n WorkerCache.prototype.validate = function(key) {\n var valid = this._validation(key);\n var test = valid === undefined || valid === true;\n if (!test) {\n this._cache.clear();\n }\n return test;\n };\n // -------------------------------------------------------------------------\n WorkerCache.prototype.clear = function() {\n this._cache.clear();\n };\n // -------------------------------------------------------------------------\n WorkerCache.prototype.get = function(key) {\n if (!this._cache) {\n return this._action(key);\n }\n var value;\n if (this.validate(key) && this._cache.has(key)) {\n value = this._cache.get(key);\n this._onCache({cache: value});\n return value;\n }\n value = this._action(key);\n this._cache.set(key, value);\n return value;\n };\n // -------------------------------------------------------------------------\n // :: HISTORY CLASS\n // -------------------------------------------------------------------------\n function History(name, size, memory) {\n var enabled = true;\n var storage_key = '';\n if (typeof name === 'string' && name !== '') {\n storage_key = name + '_';\n }\n storage_key += 'commands';\n var data;\n if (memory) {\n data = [];\n } else {\n data = $.Storage.get(storage_key);\n data = data ? JSON.parse(data) : [];\n }\n var pos = data.length - 1;\n $.extend(this, {\n append: function(item) {\n if (enabled) {\n if (data[data.length - 1] !== item) {\n data.push(item);\n if (size && data.length > size) {\n data = data.slice(-size);\n }\n pos = data.length - 1;\n if (!memory) {\n $.Storage.set(storage_key, JSON.stringify(data));\n }\n }\n }\n },\n set: function(new_data) {\n if (is_array(new_data)) {\n data = new_data;\n if (!memory) {\n $.Storage.set(storage_key, JSON.stringify(data));\n }\n }\n },\n data: function() {\n return data;\n },\n reset: function() {\n pos = data.length - 1;\n },\n last: function() {\n return data[data.length - 1];\n },\n end: function() {\n return pos === data.length - 1;\n },\n position: function() {\n return pos;\n },\n current: function() {\n return data[pos];\n },\n next: function() {\n var old = pos;\n if (pos < data.length - 1) {\n ++pos;\n }\n if (old !== pos) {\n return data[pos];\n }\n },\n previous: function() {\n var old = pos;\n if (pos > 0) {\n --pos;\n }\n if (old !== pos) {\n return data[pos];\n }\n },\n clear: function() {\n data = [];\n this.purge();\n },\n enabled: function() {\n return enabled;\n },\n enable: function() {\n enabled = true;\n },\n purge: function() {\n if (!memory) {\n $.Storage.remove(storage_key);\n }\n },\n disable: function() {\n enabled = false;\n },\n toggle: function(value) {\n if (typeof value === 'undefined') {\n enabled = !enabled;\n } else {\n enabled = value;\n }\n }\n });\n }\n // -------------------------------------------------------------------------\n function OutputLines(settings) {\n this._settings = settings;\n this._lines = [];\n this._snapshot = [];\n }\n // -------------------------------------------------------------------------\n OutputLines.prototype.make_snapshot = function(snapshot) {\n this._snapshot.push(snapshot);\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.get_partial = function() {\n if (!this._snapshot.length) {\n return [];\n }\n var last = this._snapshot[this._snapshot.length - 1];\n return last;\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.update_snapshot = function(index, snapshot) {\n this._snapshot[index] = snapshot;\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.limit_snapshot = function(limit) {\n this._snapshot = this._snapshot.slice(limit);\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.clear_snapshot = function() {\n this._snapshot = [];\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.get_snapshot = function() {\n return this._snapshot.reduce(function(acc, arr) {\n if (!arr) {\n return acc;\n }\n return acc.concat(arr);\n }, []).join('\\n');\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.join = function() {\n var args = [].slice.call(arguments);\n if (args.some(is_function)) {\n return function() {\n return args.reduce(function(acc, arg) {\n if (is_function(acc)) {\n acc = acc();\n }\n if (is_function(arg)) {\n arg = arg();\n }\n if (is_promise(acc) || is_promise(arg)) {\n return $.when(acc, arg).then(function(acc, arg) {\n return acc + arg;\n });\n }\n return arg;\n });\n };\n } else if (args.some(is_promise)) {\n return args.reduce(function(acc, arg) {\n return $.when(acc, arg).then(function(acc, arg) {\n return acc + arg;\n });\n });\n }\n return args.join('');\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.import = function(data) {\n this._lines = data;\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.push = function(data) {\n var value = data[0];\n var options = data[1];\n if (this.has_newline()) {\n this._lines.push(data);\n } else {\n var last_line = this.last_line();\n last_line[0] = this.join(last_line[0], value);\n last_line[1].newline = options.newline;\n }\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.clear = function(fn) {\n this._lines.forEach(function(line, i) {\n var options = line[1];\n if (is_function(options.onClear)) {\n options.onClear.call(self, fn(i));\n }\n });\n this._lines = [];\n this._snapshot = [];\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.data = function() {\n return this._lines.filter(Boolean);\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.has_newline = function() {\n if (this._lines.length === 0) {\n return true;\n }\n return this.last_line()[1].newline;\n };\n // -------------------------------------------------------------------------\n // :: call when line is out of view when outputLimit is used\n // :: NOTE: it's not called when less plugin is used onClear is called\n // :: instead because less call term::clear() after export old view\n // -------------------------------------------------------------------------\n OutputLines.prototype.unmount = function(node) {\n var index = node.data('index');\n var line = this._lines[index];\n if (line) {\n var options = line[1];\n if (is_function(options.unmount)) {\n options.unmount.call(self, node);\n }\n }\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.last_line = function() {\n var lines = this.data();\n var len = lines.length;\n return lines[len - 1];\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.update = function(index, value, options) {\n if (value === null) {\n delete this._lines[index];\n delete this._snapshot[index];\n } else {\n this._lines[index][0] = value;\n if (options) {\n this._lines[index][1] = $.extend(this._lines[index][1], options);\n }\n return this._lines[index][1];\n }\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.length = function() {\n return this._lines.length;\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.valid_index = function(index) {\n return !!this._lines[index];\n };\n // -------------------------------------------------------------------------\n OutputLines.prototype.render = function(cols, fn) {\n var settings = this._settings();\n var lines_to_show = [];\n this._snapshot = [];\n if (settings.outputLimit >= 0) {\n // flush will limit lines but if there is lot of\n // lines we don't need to show them and then remove\n // them from terminal\n var limit;\n if (settings.outputLimit === 0) {\n limit = cols;\n } else {\n limit = settings.outputLimit;\n }\n this._lines.forEach(function(line, index) {\n var value = line[0];\n var options = line[1];\n lines_to_show.push({\n value: value,\n index: index,\n options: options\n });\n });\n var pivot = lines_to_show.length - limit - 1;\n lines_to_show = lines_to_show.slice(pivot);\n } else {\n lines_to_show = this._lines.map(function(line, index) {\n return {\n value: line[0],\n index: index,\n options: line[1]\n };\n });\n }\n return fn(lines_to_show);\n };\n // -------------------------------------------------------------------------\n // :: FormatBuffer is a class that buffer line printed on terminal\n // :: with optional format of the text, the class also use cache\n // :: the options in the constructor is a function that should returns\n // :: settings for given format, the settings may change while the terminal\n // :: is running, that's why they are dynamic in form of a function\n // -------------------------------------------------------------------------\n function FormatBuffer(options) {\n this._options = options;\n if ('Map' in root) {\n this._format_cache = new Map();\n }\n this._output_buffer = [];\n }\n // -------------------------------------------------------------------------\n FormatBuffer.NEW_LINE = 1;\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.format = function format(arg, newline, raw) {\n var use_cache = this._format_cache && this._settings.useCache;\n\n if (use_cache) {\n var args = JSON.stringify([arg, this._settings]);\n if (this._format_cache.has(args)) {\n return this._format_cache.get(args);\n }\n }\n var data = {\n line: $.terminal.format(\n arg,\n this._settings\n ),\n raw: raw,\n newline: newline\n };\n if (use_cache) {\n this._format_cache.set(args, data);\n }\n return data;\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.empty = function() {\n return !this._output_buffer.length;\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.append = function(arg, index, options, raw) {\n this._settings = $.extend({\n useCache: true\n }, this._options(options));\n\n this._output_buffer.push(FormatBuffer.NEW_LINE);\n\n if (arg instanceof Array) {\n var raw_lines = raw.split('\\n');\n for (var i = 0, len = arg.length; i < len; ++i) {\n if (arg[i] === '' || arg[i] === '\\r') {\n this._output_buffer.push({line: '', raw: ''});\n } else {\n var formatted = this.format(arg[i], i === len - 1, raw_lines[i]);\n this._output_buffer.push(formatted);\n }\n }\n } else if (options.raw) {\n this._output_buffer.push({line: arg, raw: raw});\n } else {\n this._output_buffer.push(this.format(arg, false, raw));\n }\n this._output_buffer.push({\n finalize: options.finalize,\n index: index,\n raw: options.raw,\n newline: options.newline\n });\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.clear_cache = function() {\n if (this._format_cache) {\n this._format_cache.clear();\n }\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.output = function() {\n return this._output_buffer.slice();\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.is_empty = function() {\n return !this._output_buffer.length;\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.clear = function() {\n this._output_buffer = [];\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.forEach = function(fn) {\n var i = 0;\n while (i < this._output_buffer.length) {\n var data = this._output_buffer[i++];\n if (data === FormatBuffer.NEW_LINE) {\n fn();\n } else {\n fn(data);\n }\n }\n };\n // -------------------------------------------------------------------------\n FormatBuffer.prototype.flush = function(render) {\n this.forEach(render);\n this.clear();\n };\n // -------------------------------------------------------------------------\n // :: function that handle all cases of prompt and call the function set\n // :: with a string\n // -------------------------------------------------------------------------\n function with_prompt(prompt, set, context) {\n function error(e) {\n var prompt = $.terminal.escape_brackets('[ERR]> ');\n set('[[;red;]' + prompt + ']');\n alert_exception('Prompt', e);\n }\n function done(prompt) {\n set(prompt);\n deferred.resolve();\n }\n var deferred = new $.Deferred();\n switch (typeof prompt) {\n case 'string':\n done(prompt);\n break;\n case 'function':\n try {\n var ret = prompt.call(context, function(string) {\n done(string);\n });\n if (typeof ret === 'string') {\n done(ret);\n }\n if (ret && ret.then) {\n ret.then(done).catch(error);\n }\n } catch (e) {\n error(e);\n }\n break;\n }\n return deferred.promise();\n }\n // -------------------------------------------------------------------------\n // :: COMMAND LINE PLUGIN\n // -------------------------------------------------------------------------\n var cmd_index = 0;\n $.cmd = {\n defaults: {\n mask: false,\n caseSensitiveSearch: true,\n historySize: 60,\n prompt: '> ',\n enabled: true,\n history: true,\n onPositionChange: $.noop,\n onCommandChange: $.noop,\n inputStyle: 'textarea',\n mobileDelete: is_mobile,\n onPaste: $.noop,\n clickTimeout: 200,\n holdTimeout: 400,\n holdRepeatTimeout: 200,\n mobileIngoreAutoSpace: [],\n repeatTimeoutKeys: [],\n tabindex: 1,\n tabs: 4\n }\n };\n $.fn.cmd = function(options) {\n var settings = $.extend({}, $.cmd.defaults, options);\n function mobile_ignore_key(key) {\n return settings.mobileIngoreAutoSpace.length &&\n settings.mobileIngoreAutoSpace.indexOf(key) !== -1 && is_android;\n }\n var self = this;\n var maybe_data = self.data('cmd');\n if (maybe_data) {\n return maybe_data;\n }\n var id = cmd_index++;\n self.addClass('cmd');\n var wrapper = $('<div class=\"cmd-wrapper\"/>').appendTo(self);\n wrapper.append('<span class=\"cmd-prompt\"></span>');\n wrapper.append('<div class=\"cmd-cursor-line\">' +\n '<span></span>' +\n '<span class=\"cmd-cursor\">' +\n '<span data-text class=\"end\"><span> </span></span>' +\n '</span>' +\n '<span></span>' +\n '</div>');\n var cursor_line = wrapper.find('.cmd-cursor-line');\n // a11y: don't read command it's in textarea that's in focus\n a11y_hide(cursor_line);\n // on mobile the only way to hide textarea on desktop it's needed because\n // textarea show up after focus\n //self.append('<span class=\"mask\"></mask>');\n var clip;\n if (is_mobile) {\n clip = (function() {\n var $node = $('<div class=\"cmd-editable\" contenteditable/>').attr({\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n tabindex: settings.tabindex\n }).insertAfter(self);\n $node.on('focus', function() {\n self.enable();\n }).on('blur', function() {\n self.disable();\n });\n var timer;\n var clip = {\n $node: $node,\n val: function(value) {\n if (typeof value === 'undefined') {\n return $node.text();\n } else {\n $node.html(value);\n }\n },\n reset: function() {\n clearTimeout(timer);\n timer = setTimeout(function() {\n $node.css({\n top: '',\n bottom: ''\n });\n }, 100);\n },\n focus: function() {\n css($node[0], {\n top: 'calc(var(--terminal-scroll, 0) * 1px)'\n });\n clip.reset();\n },\n blur: function() {\n $node.css({\n top: '100%',\n bottom: 0\n }).blur();\n // just in case of Webkit bug\n window.getSelection().removeAllRanges();\n clip.reset();\n }\n };\n return clip;\n })();\n self.addClass('cmd-mobile');\n } else {\n clip = (function() {\n var id = generate_id();\n var $node = $('<textarea>').attr({\n autocapitalize: 'off',\n spellcheck: 'false',\n id: id,\n tabindex: settings.tabindex\n }).addClass('cmd-clipboard').appendTo(self);\n // some a11y to make lighthouse happy\n $node.before('<label class=\"visually-hidden\" for=\"' + id + '\">' +\n 'Clipboard textarea for jQuery Terminal</label>');\n return {\n $node: $node,\n val: function(value) {\n // even if value is undeifned\n // when calling val(value) it return jQuery object\n if (typeof value === 'undefined') {\n return $node.val();\n } else {\n return $node.val(value);\n }\n }\n };\n })();\n clip.val(' ');\n }\n if (settings.width) {\n self.width(settings.width);\n }\n var num_chars; // calculated by resize\n var char_width;\n var last_rendered_prompt;\n var prompt_last_line;\n var just_prompt_len;\n var prompt_offset = 0;\n var prompt_len;\n var prompt_node = self.find('.cmd-prompt');\n var reverse_search = false;\n var rev_search_str = '';\n var reverse_search_position = null;\n var backup_prompt;\n var command = '';\n var last_command;\n // text from selection using CTRL+SHIFT+C (as in Xterm)\n var kill_text = ''; // text from command that kill part of the command\n var position = 0;\n var prompt;\n var enabled;\n var formatted_position = 0;\n var name, history;\n var cursor = self.find('.cmd-cursor');\n var animation;\n var restart_animation;\n var paste_count = 0;\n // use \\uFFFF to mark newline extra character\n // so we can hide it by css when using text selection\n var line_marker = '\\uFFFF';\n var line_marker_re = /\\uFFFF$/;\n var empty_marker_re = /^\\uFFFF$/;\n function get_char_pos(e) {\n var node = $(e.target);\n if (node.is('span,img,a')) {\n node = node.closest('[data-text]');\n return node.index() +\n node.parent('span').prevAll().find('[data-text]').length +\n node.closest('[role=\"presentation\"]')\n .prevUntil('.cmd-prompt').find('[data-text]').length;\n } else if (node.is('div[role=\"presentation\"]')) {\n var last = !node.next().length;\n return node.find('[data-text]').length +\n node.prevUntil('.cmd-prompt').find('[data-text]').length -\n (last ? 0 : 1);\n }\n }\n // IE mapping\n var key_mapping = {\n 'SPACEBAR': ' ',\n 'UP': 'ArrowUP',\n 'DOWN': 'ArrowDown',\n 'LEFT': 'ArrowLeft',\n 'RIGHT': 'ArrowRight',\n 'DEL': 'Delete',\n 'MULTIPLY': '*',\n 'DIVIDE': '/',\n 'SUBTRACT': '-',\n 'ADD': '+'\n };\n function ie_key_fix(e) {\n var key = e.key.toUpperCase();\n if (key_mapping[key]) {\n return key_mapping[key];\n }\n return key;\n }\n function get_key(e) {\n if (e.key) {\n var key = ie_key_fix(e).toUpperCase();\n if (key === 'CONTROL') {\n return 'CTRL';\n } else {\n var combo = [];\n if (e.ctrlKey) {\n combo.push('CTRL');\n }\n if (e.metaKey && key !== 'META') {\n combo.push('META');\n }\n if (e.shiftKey && key !== 'SHIFT') {\n combo.push('SHIFT');\n }\n if (e.altKey && key !== 'ALT') {\n combo.push('ALT');\n }\n if (combo.length && key === ' ') {\n key = 'SPACEBAR';\n }\n if (e.key) {\n combo.push(key);\n }\n return combo.join('+');\n }\n }\n }\n // -----------------------------------------------------------------\n // for invoking shortcuts using terminal::keydown\n // taken from https://github.com/cvan/keyboardevent-key-polyfill/\n var keycodes = {\n 3: 'Cancel',\n 6: 'Help',\n 8: 'Backspace',\n 9: 'Tab',\n 12: 'Clear',\n 13: 'Enter',\n 16: 'Shift',\n 17: 'Control',\n 18: 'Alt',\n 19: 'Pause',\n 20: 'CapsLock',\n 27: 'Escape',\n 28: 'Convert',\n 29: 'NonConvert',\n 30: 'Accept',\n 31: 'ModeChange',\n 32: ' ',\n 33: 'PageUp',\n 34: 'PageDown',\n 35: 'End',\n 36: 'Home',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown',\n 41: 'Select',\n 42: 'Print',\n 43: 'Execute',\n 44: 'PrintScreen',\n 45: 'Insert',\n 46: 'Delete',\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n 91: 'OS',\n 93: 'ContextMenu',\n 144: 'NumLock',\n 145: 'ScrollLock',\n 181: 'VolumeMute',\n 182: 'VolumeDown',\n 183: 'VolumeUp',\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: [\"'\", '\"'],\n 224: 'Meta',\n 225: 'AltGraph',\n 246: 'Attn',\n 247: 'CrSel',\n 248: 'ExSel',\n 249: 'EraseEof',\n 250: 'Play',\n 251: 'ZoomOut'\n };\n var i;\n // Function keys (F1-24).\n for (i = 1; i < 25; i++) {\n keycodes[111 + i] = 'F' + i;\n }\n // Printable ASCII characters.\n var letter = '';\n for (i = 65; i < 91; i++) {\n letter = String.fromCharCode(i);\n keycodes[i] = [letter.toLowerCase(), letter.toUpperCase()];\n }\n var reversed_keycodes = {};\n Object.keys(keycodes).forEach(function(which) {\n if (is_array(keycodes[which])) {\n keycodes[which].forEach(function(key) {\n reversed_keycodes[key.toUpperCase()] = which;\n });\n } else {\n reversed_keycodes[keycodes[which].toUpperCase()] = which;\n }\n });\n // -----------------------------------------------------------------\n var keymap;\n var default_keymap = {\n 'ALT+D': delete_forward({clipboard: true}),\n 'HOLD+ALT+D': delete_forward({clipboard: true, hold: true}),\n 'HOLD+DELETE': delete_forward({clipboard: false, hold: true}),\n 'HOLD+SHIFT+DELETE': delete_forward({clipboard: false, hold: true}),\n 'ENTER': function() {\n if (history && command && !settings.mask &&\n ((is_function(settings.historyFilter) &&\n settings.historyFilter(command)) ||\n (settings.historyFilter instanceof RegExp &&\n command.match(settings.historyFilter)) ||\n !settings.historyFilter)) {\n history.append(command);\n }\n var tmp = command;\n // fix scroll the page where there is no scrollbar\n if (!is_mobile) {\n clip.$node.blur();\n }\n history.reset();\n\n // for next input event on firefox/android with google keyboard\n prev_command = '';\n no_keydown = true;\n\n var promise;\n if (settings.commands) {\n promise = settings.commands.call(self, tmp);\n }\n if (is_function(prompt)) {\n if (promise && is_function(promise.then)) {\n promise.then(draw_prompt);\n } else {\n draw_prompt();\n }\n }\n self.set('');\n clip.val('');\n if (!is_mobile) {\n clip.$node.focus();\n }\n return false;\n },\n 'SHIFT+ENTER': function() {\n self.insert('\\n');\n return true;\n },\n 'BACKSPACE': backspace_key,\n 'SHIFT+BACKSPACE': backspace_key,\n 'TAB': function() {\n self.insert('\\t');\n },\n 'CTRL+D': function() {\n self['delete'](1);\n return false;\n },\n 'DELETE': function() {\n self['delete'](1);\n return true;\n },\n 'HOLD+ARROWUP': up_arrow,\n 'ARROWUP': up_arrow,\n 'CTRL+ARROWUP': prev_history,\n 'CTRL+P': prev_history,\n 'ARROWDOWN': down_arrow,\n 'HOLD+ARROWDOWN': down_arrow,\n 'CTRL+N': next_history,\n 'CTRL+ARROWDOWN': next_history,\n 'ARROWLEFT': left,\n 'HOLD+ARROWLEFT': debounce(left, 10),\n 'CTRL+B': left,\n 'CTRL+ARROWLEFT': function() {\n // jump to one character after last space before prevoius word\n var len = position - 1;\n var pos = 0;\n if (command[len] === ' ') {\n --len;\n }\n for (var i = len; i > 0; --i) {\n if (command[i] === ' ' && command[i + 1] !== ' ') {\n pos = i + 1;\n break;\n } else if (command[i] === '\\n' &&\n command[i + 1] !== '\\n') {\n pos = i;\n break;\n }\n }\n self.position(pos);\n },\n 'CTRL+R': function() {\n if (reverse_search) {\n reverse_history_search(true);\n } else {\n backup_prompt = prompt;\n draw_reverse_prompt();\n last_command = command;\n self.set('');\n redraw();\n reverse_search = true;\n }\n return false;\n },\n 'CTRL+G': function() {\n if (reverse_search) {\n prompt = backup_prompt;\n draw_prompt();\n self.set(last_command);\n redraw();\n reverse_search = false;\n rev_search_str = '';\n return false;\n }\n },\n 'ARROWRIGHT': right,\n 'HOLD+ARROWRIGHT': debounce(right, 10),\n 'CTRL+F': right,\n 'CTRL+ARROWRIGHT': function() {\n // jump to beginning or end of the word\n if (command[position] === ' ') {\n ++position;\n }\n var re = /\\S[\\n\\s]{2,}|[\\n\\s]+\\S?/;\n var match = command.slice(position).match(re);\n if (!match || match[0].match(/^\\s+$/)) {\n self.position(bare_text(command).length);\n } else if (match[0][0] !== ' ') {\n position += match.index + 1;\n } else {\n position += match.index + match[0].length - 1;\n if (match[0][match[0].length - 1] !== ' ') {\n --position;\n }\n }\n redraw();\n },\n 'F12': return_true, // Allow Firebug\n 'END': end(true),\n 'CTRL+END': end(),\n 'CTRL+E': end(),\n 'HOME': home(true),\n 'CTRL+HOME': home(),\n 'CTRL+A': home(),\n 'SHIFT+INSERT': paste_event,\n 'CTRL+SHIFT+T': return_true, // open closed tab\n 'CTRL+W': delete_backward({clipboard: true, hold: false}),\n 'CTRL+BACKSPACE': delete_backward({clipboard: true, hold: false}),\n 'HOLD+BACKSPACE': delete_backward({clipboard: false, hold: true}),\n 'HOLD+SHIFT+BACKSPACE': delete_backward({clipboard: false, hold: true}),\n 'CTRL+H': function() {\n if (command !== '' && position > 0) {\n self['delete'](-1);\n }\n return false;\n },\n 'CTRL+X': return_true,\n 'CTRL+C': function() {\n return get_selected_html() === '';\n },\n 'CTRL+T': return_true,\n 'CTRL+Y': function() {\n if (kill_text !== '') {\n self.insert(kill_text);\n }\n },\n 'CTRL+V': paste_event,\n 'META+V': paste_event,\n 'CTRL+K': function() {\n var len = text(command).length;\n if (len > position) {\n kill_text = self['delete'](len - position);\n text_to_clipboard(clip.$node, kill_text);\n }\n return false;\n },\n 'CTRL+U': function() {\n if (command !== '' && position !== 0) {\n kill_text = self['delete'](-position);\n text_to_clipboard(clip.$node, kill_text);\n }\n return false;\n },\n 'CTRL+TAB': function() {\n return false;\n },\n 'META+`': return_true, // CMD+` switch browser window on Mac\n 'META+R': return_true, // CMD+R page reload in Chrome Mac\n 'META+L': return_true // CLD+L jump into Ominbox on Chrome Mac\n };\n // -------------------------------------------------------------------------------\n function delete_forward(options) {\n options = options || {};\n if (options.hold && !settings.mobileDelete) {\n return function delete_character_forward() {\n self['delete'](1);\n return false;\n };\n }\n return function delete_word_forward() {\n var re = / *[^ ]+ *(?= )|[^ ]+$/;\n var substring = command.slice(position);\n var m = substring.match(re);\n if (m) {\n kill_text = m[0];\n if (options.clipboard) {\n text_to_clipboard(clip.$node, kill_text);\n }\n }\n self.set(\n command.slice(0, position) +\n command.slice(position).replace(re, ''),\n true\n );\n // chrome jump to address bar\n return false;\n };\n }\n // -------------------------------------------------------------------------------\n function delete_backward(options) {\n options = options || {};\n if (options.hold && !settings.mobileDelete) {\n return function delete_character_backward() {\n self['delete'](-1);\n };\n }\n return function delete_word_backward() {\n // don't work in Chromium (can't prevent close tab)\n if (command !== '' && position !== 0) {\n var m = command.slice(0, position).match(/([^ ]* *$)/);\n if (m[0].length) {\n kill_text = self['delete'](-m[0].length);\n if (options.clipboard) {\n text_to_clipboard(clip.$node, kill_text);\n }\n }\n }\n return false;\n };\n }\n // -------------------------------------------------------------------------------\n function return_true() {\n return true;\n }\n // -------------------------------------------------------------------------------\n function paste_event() {\n clip.val('');\n paste_count = 0;\n if (self.isenabled() && !clip.$node.is(':focus')) {\n clip.$node.trigger('focus', [true]);\n }\n clip.$node.one('input', paste);\n return true;\n }\n // ---------------------------------------------------------------------\n // :: Paste content to terminal using hidden textarea\n // ---------------------------------------------------------------------\n function paste() {\n if (paste_count++ > 0) {\n return;\n }\n function set() {\n clip.val(command);\n fix_textarea();\n }\n function insert(text) {\n self.insert(text);\n set();\n }\n if (self.isenabled()) {\n //wait until Browser insert text to textarea\n self.oneTime(100, function() {\n var value = clip.val().replace(/\\r/g, '');\n if (is_function(settings.onPaste)) {\n var ret = settings.onPaste.call(self, {\n target: self,\n text: value\n });\n if (ret !== undefined) {\n if (ret && is_function(ret.then || ret.done)) {\n (ret.then || ret.done).call(ret, insert);\n } else if (typeof ret === 'string') {\n insert(ret);\n } else if (ret === false) {\n set();\n }\n return;\n }\n }\n insert(value);\n });\n }\n }\n // -------------------------------------------------------------------------------\n function prev_history() {\n if (first_up_history) {\n last_command = command;\n self.set(history.current());\n } else {\n self.set(history.previous());\n }\n first_up_history = false;\n return false;\n }\n // -------------------------------------------------------------------------------\n function next_history() {\n if (history.end()) {\n first_up_history = true;\n self.set(last_command);\n } else {\n self.set(history.next());\n }\n return false;\n }\n // -------------------------------------------------------------------------------\n function have_newlines(string) {\n return string.match(/\\n/);\n }\n // -------------------------------------------------------------------------------\n function have_wrapping(string, prompt_len) {\n var lengths = string.split('\\n').map(function(line) {\n return $.terminal.length(line);\n });\n if (prompt_len) {\n lengths[0] += prompt_len;\n }\n var wrap = lengths.filter(function(len) {\n return len >= num_chars;\n });\n return !!wrap.length;\n }\n // -------------------------------------------------------------------------------\n function simple_split_command_line(formatted) {\n var prompt = last_rendered_prompt;\n var lines = $.terminal.split_equal(prompt + formatted, num_chars);\n var re = new RegExp('^' + $.terminal.escape_regex(prompt));\n lines = lines.map($.terminal.unescape_brackets);\n lines[0] = lines[0].replace(re, '');\n return lines;\n }\n // -------------------------------------------------------------------------------\n function up_arrow() {\n var before = $.terminal.substring(command, 0, position);\n var col = self.column();\n var cursor_line = self.find('.cmd-cursor-line');\n var line = cursor_line.prevUntil('span').length;\n // case when line is wrapped and we are below prompt\n if (line === 1 && col <= prompt_len) {\n self.position(0);\n return false;\n }\n if (line === 0) {\n return prev_history();\n }\n if (have_newlines(before) || have_wrapping(before, prompt_len)) {\n var prev = cursor_line.prev();\n var is_splitted = prev.is('.cmd-end-line');\n var lines = simple_split_command_line(command);\n prev = lines[line - 1];\n var left_over = lines[line].substring(col).length;\n var diff;\n if (left_over > 0) {\n diff = col;\n if (line - 1 === 0) {\n diff -= prompt_len;\n }\n diff = col + prev.substring(diff).length;\n if (is_splitted) {\n ++diff;\n }\n } else {\n diff = col + 1;\n }\n self.position(-diff, true);\n return false;\n } else {\n return prev_history();\n }\n }\n // -------------------------------------------------------------------------------\n function down_arrow() {\n // use format and strip so we get visual strings (formatting can change text)\n var after = $.terminal.substring(command, position);\n if (have_newlines(after) || have_wrapping(after)) {\n var lines = simple_split_command_line(command);\n var col = self.column();\n var cursor_line = self.find('.cmd-cursor-line');\n var $line = cursor_line.prevUntil('span');\n var line = $line.length;\n var is_ending = cursor_line.is('.cmd-end-line');\n var is_next_broken = cursor_line.next().is('.cmd-end-line');\n var next = lines[line + 1];\n if (!next) {\n return next_history();\n }\n var left_over = lines[line].substring(col).length;\n var diff;\n // move to next line if at the end move to end of next line\n if (left_over === 0) {\n diff = next.length;\n if (is_next_broken) {\n diff++;\n }\n } else {\n diff = Math.min(col, next.length) + left_over;\n if (line === 0) {\n diff += prompt_len;\n }\n if (is_ending) {\n // correction for splitted line that don't have extra space\n diff += 1;\n }\n }\n self.position(diff, true);\n return false;\n } else {\n return next_history();\n }\n }\n // -------------------------------------------------------------------------------\n function backspace_key() {\n if (reverse_search) {\n rev_search_str = rev_search_str.slice(0, -1);\n draw_reverse_prompt();\n } else if (command !== '' && position > 0) {\n self['delete'](-1);\n }\n // for next input after naitve backspace\n // we need timeout because we don't want it to trigger\n // for current input but next one\n self.oneTime(1, function() {\n no_keydown = true;\n });\n }\n // -------------------------------------------------------------------------------\n function left() {\n if (position > 0) {\n self.position(-1, true);\n }\n }\n // -------------------------------------------------------------------------------\n function right() {\n if (position < bare_text(command).length) {\n self.position(1, true);\n }\n return false;\n }\n // -------------------------------------------------------------------------------\n function home(line) {\n function home() {\n self.position(0);\n }\n if (line) {\n return function() {\n if (command.match(/\\n/)) {\n var string = command.substring(0, self.position());\n self.position(string.lastIndexOf('\\n') + 1);\n } else {\n home();\n }\n };\n } else {\n return home;\n }\n }\n // -------------------------------------------------------------------------------\n function end(line) {\n function end() {\n self.position(text(command).length);\n }\n if (line) {\n return function() {\n if (command.match(/\\n/)) {\n var lines = command.split('\\n');\n var pos = self.position();\n var sum = 0;\n for (var i = 0; i < lines.length; ++i) {\n sum += lines[i].length;\n if (sum > pos) {\n self.position(sum + i);\n return;\n }\n }\n }\n end();\n };\n } else {\n return end;\n }\n }\n // -------------------------------------------------------------------------------\n function mobile_focus() {\n //if (is_touch) {\n var $clip = clip.$node;\n var focus = $clip.is(':focus');\n if (enabled) {\n if (!focus) {\n //clip.trigger('focus', [true]);\n }\n self.oneTime(10, function() {\n if (!$clip.is(':focus') && enabled) {\n $clip.trigger('focus', [true]);\n }\n });\n } else if (focus && !enabled) {\n $clip.trigger('blur', [true]);\n }\n }\n // -------------------------------------------------------------------------------\n // fix for .cursor span animation that should only be applied when\n // animation is equal to terminal-blink\n // -------------------------------------------------------------------------------\n function fix_cursor() {\n if (animation_supported) {\n var style = window.getComputedStyle(cursor[0]);\n var animationName = style.getPropertyValue('--animation');\n animationName = animationName.replace(/^\\s*|\\s*$/g, '');\n var _class = self.attr('class');\n if (_class.match(/-animation/)) {\n _class = _class.replace(/[a-z]+-animation/g, '');\n }\n if (animationName && !animationName.match(/blink/)) {\n var className = animationName.replace(/terminal-/, '') + '-animation';\n if (!_class.match(className)) {\n _class += ' ' + className;\n }\n }\n _class = _class.replace(/\\s+/g, ' ');\n if (_class !== self.attr('class').replace(/\\s+/g, ' ')) {\n self.attr('class', _class);\n }\n }\n }\n // -------------------------------------------------------------------------------\n // on mobile you can't delete character if input is empty (event\n // will not fire) so we fake text entry, we could just put dummy\n // data but we put real command and position\n // -------------------------------------------------------------------------------\n function fix_textarea(position_only) {\n if (!self.isenabled()) {\n return;\n }\n // delay worked while experimenting\n self.oneTime(10, function() {\n // we use space before command to show select all context menu\n // idea taken from CodeMirror\n if (!is_mobile && clip.val() !== command && !position_only) {\n clip.val(' ' + command);\n }\n if (enabled) {\n self.oneTime(10, function() {\n try {\n var pos = !is_mobile ? position + 1 : position;\n // we check first to improve performance\n if (clip.$node.caret() !== pos) {\n clip.$node.caret(pos);\n }\n } catch (e) {\n // firefox throw NS_ERROR_FAILURE ignore\n }\n });\n }\n });\n }\n // -------------------------------------------------------------------------------\n // terminal animation don't work on android because they animate\n // 2 properties\n // -------------------------------------------------------------------------------\n if (animation_supported && !is_android) {\n animation = function(toggle) {\n if (toggle) {\n cursor.addClass('cmd-blink');\n } else {\n cursor.removeClass('cmd-blink');\n }\n };\n restart_animation = function() {\n var new_cursor = cursor.clone();\n new_cursor.insertBefore(cursor);\n cursor.remove();\n cursor = new_cursor;\n };\n } else {\n var animating = false;\n animation = function(toggle) {\n if (toggle && !animating) {\n animating = true;\n cursor.addClass('cmd-inverted cmd-blink');\n self.everyTime(500, 'blink', blink);\n } else if (animating && !toggle) {\n animating = false;\n self.stopTime('blink', blink);\n cursor.removeClass('cmd-inverted cmd-blink');\n }\n };\n restart_animation = function() {\n animation(false);\n animation(true);\n };\n }\n // ---------------------------------------------------------------------\n // :: Blinking cursor function\n // ---------------------------------------------------------------------\n function blink() {\n cursor.toggleClass('cmd-inverted');\n }\n // ---------------------------------------------------------------------\n // :: Set prompt for reverse search\n // ---------------------------------------------------------------------\n function draw_reverse_prompt() {\n prompt = '(reverse-i-search)`' + rev_search_str + \"': \";\n draw_prompt();\n }\n // ---------------------------------------------------------------------\n // :: Disable reverse search\n // ---------------------------------------------------------------------\n function clear_reverse_state() {\n prompt = backup_prompt;\n reverse_search = false;\n reverse_search_position = null;\n rev_search_str = '';\n }\n // ---------------------------------------------------------------------\n // :: Search through command line history. If next is not defined or\n // :: false it searches for the first item from the end. If true it\n // :: search for the next item\n // ---------------------------------------------------------------------\n function reverse_history_search(next) {\n var history_data = history.data();\n var regex, save_string;\n var len = history_data.length;\n if (next && reverse_search_position > 0) {\n len -= reverse_search_position;\n }\n if (rev_search_str.length > 0) {\n for (var j = rev_search_str.length; j > 0; j--) {\n save_string = $.terminal.escape_regex(rev_search_str.slice(0, j));\n if (settings.caseSensitiveSearch) {\n regex = new RegExp(save_string);\n } else {\n regex = new RegExp(save_string, 'i');\n }\n for (var i = len; i--;) {\n if (regex.test(history_data[i])) {\n reverse_search_position = history_data.length - i;\n self.position(history_data[i].indexOf(save_string));\n self.set(history_data[i], true);\n redraw();\n if (rev_search_str.length !== j) {\n rev_search_str = rev_search_str.slice(0, j);\n draw_reverse_prompt();\n }\n return;\n }\n }\n }\n }\n rev_search_str = ''; // clear if not found any\n }\n // ---------------------------------------------------------------------\n // :: calculate width of hte character\n // ---------------------------------------------------------------------\n function get_char_width() {\n var $prompt = self.find('.cmd-prompt');\n var html = $prompt.html();\n $prompt.html('<span> </span>');\n var width = $prompt.find('span').get(0).getBoundingClientRect().width;\n $prompt.html(html);\n return width;\n }\n // ---------------------------------------------------------------------\n // :: return number of characters in command line\n // ---------------------------------------------------------------------\n function get_num_chars(char_width) {\n var width = self.width();\n return Math.floor(width / char_width);\n }\n // ---------------------------------------------------------------------\n // :: Split String that fit into command line where first line need to\n // :: fit next to prompt (need to have less characters)\n // ---------------------------------------------------------------------\n function process_cmd_line(string) {\n function split(string) {\n return $.terminal.split_equal(string, num_chars);\n }\n // -----------------------------------------------------------------\n function skip_empty(array) {\n // we remove lines that are leftovers after adding space at the end\n var result = [];\n array.forEach(function(line, i) {\n if ($.terminal.strip(line).match(empty_marker_re)) {\n result[i] = false;\n // lines that will get removed need line ending on previos\n // line so code that check that marker works correctly\n if (i > 0) {\n result[i - 1] += line_marker;\n }\n } else {\n result[i] = array[i];\n }\n });\n return result.filter(function(line) {\n return line !== false;\n });\n }\n // -----------------------------------------------------------------\n var line = prompt_node.find('.cmd-line');\n var prompt;\n if (line.length) {\n prompt = line.nextUntil('.cmd-line').text();\n } else {\n prompt = prompt_node.text();\n }\n prompt = prompt.replace('\\u200b', '');\n prompt = $.terminal.escape_brackets(prompt);\n var prompt_marker = get_prompt_marker();\n var re = new RegExp('^' + prompt_marker + $.terminal.escape_regex(prompt));\n var array;\n if (string.match(/\\n/)) {\n var tmp = string.split('\\n');\n var first_len = num_chars - prompt_len - 1;\n for (var i = 0; i < tmp.length - 1; ++i) {\n tmp[i] += line_marker;\n }\n // split first line\n if (strlen(tmp[0]) > first_len) {\n array = split(prompt + tmp[0]);\n array[0] = array[0].replace(re, '');\n array = skip_empty(array);\n } else {\n array = [tmp[0]];\n }\n // process rest of the lines\n for (i = 1; i < tmp.length; ++i) {\n if (strlen(tmp[i]) > num_chars) {\n var splitted = split(tmp[i]);\n if (i < tmp.length - 1) {\n splitted = skip_empty(splitted);\n }\n array = array.concat(splitted);\n } else {\n array.push(tmp[i]);\n }\n }\n } else {\n array = split(prompt_marker + prompt + string, num_chars);\n array[0] = array[0].replace(re, '');\n }\n // fix issue with cursor that was cut off #379\n if (array.length > 1) {\n var len = $.terminal.length(array[array.length - 1]);\n if (len === num_chars) {\n array.push('');\n }\n }\n return array;\n }\n // ---------------------------------------------------------------------\n var cmd_line_worker = new WorkerCache({\n validation: function(key) {\n var result = false;\n if ((!this._previous_value || this._previous_value === key) &&\n (!this._cols || this._cols === num_chars)) {\n result = true;\n }\n this._previous_value = key;\n this._cols = num_chars;\n return result;\n },\n action: process_cmd_line\n });\n // ---------------------------------------------------------------------\n function split_command_line(string) {\n return cmd_line_worker.get(string);\n }\n // ---------------------------------------------------------------------\n // :: use custom formatting\n // ---------------------------------------------------------------------\n function formatting(string, skip_formatted_position) {\n // we don't want to format command when user type formatting in\n try {\n string = $.terminal.escape_formatting(string);\n var format_options = $.extend({}, settings, {\n unixFormattingEscapeBrackets: true,\n position: position,\n command: true\n });\n var formatted = $.terminal.apply_formatters(string, format_options);\n var output = $.terminal.normalize(formatted[0]);\n var max = $.terminal.length(output);\n if (!skip_formatted_position) {\n formatted_position = formatted[1];\n // fix issue with nested formatting where max length\n // is checked before nested_formatting flatten formatting\n if (formatted_position > max) {\n formatted_position = max;\n }\n }\n return output;\n } catch (e) {\n alert_exception('[Formatting]', e.stack);\n return string;\n }\n }\n // ---------------------------------------------------------------------\n // :: format and encode the string\n // ---------------------------------------------------------------------\n function format(string, before) {\n //string = $.terminal.normalize(string);\n var encoded = $.terminal.encode(wrap(string), {\n tabs: settings.tabs,\n before: before\n });\n return $.terminal.format(encoded, {\n charWidth: settings.charWidth,\n allowedAttributes: settings.allowedAttributes || []\n });\n }\n // ---------------------------------------------------------------------\n // :: function create new string with all characters in it's own\n // :: formatting - it will only have style if the input is formatting\n // :: this function is not very usefull so it's not in $.terminal\n // ---------------------------------------------------------------------\n function wrap(string) {\n return $.terminal.partition(string).join('');\n }\n // ---------------------------------------------------------------------\n // :: shortcut helpers\n // ---------------------------------------------------------------------\n function length(str, raw) {\n return $.terminal.length(str, raw);\n }\n // ---------------------------------------------------------------------\n function is_multiline(str) {\n var len = strlen(text(str));\n return len > 0 && len > num_chars - prompt_len - 1 ||\n str.match(/\\n/);\n }\n // ---------------------------------------------------------------------\n function substring(str, start, end) {\n return $.terminal.substring(str, start, end);\n }\n // ---------------------------------------------------------------------\n // :: helper function that check if string is valid emoji formatting\n // ---------------------------------------------------------------------\n function is_emoji_formatting(str) {\n if ($.terminal.is_formatting(str)) {\n return str.replace(format_parts_re, '$4').match(/^emoji /);\n }\n return false;\n }\n // ---------------------------------------------------------------------\n // :: Function that displays the command line. Split long lines and\n // :: place cursor in the right place\n // ---------------------------------------------------------------------\n var redraw = (function() {\n var before = cursor.prev();\n var after = cursor.next();\n var cursor_line = cursor.parent();\n // -----------------------------------------------------------------\n // :: Draw line with the cursor\n // -----------------------------------------------------------------\n function draw_cursor_line(string, options) {\n var end_line = string.match(line_marker_re);\n if (end_line) {\n string = string.replace(line_marker_re, ' ');\n }\n cursor_line.toggleClass('cmd-end-line', !!end_line);\n var cursor_end_line = false;\n var settings = $.extend({\n prompt: '',\n last: false\n }, options);\n var position = settings.position;\n var len = length(string);\n var prompt = settings.prompt;\n var c;\n if (position === len) {\n before.html(format(string));\n c = ' ';\n empty_cursor();\n after.html('');\n } else if (position === 0) {\n before.html('');\n c = substring(string, 0, 1);\n cursor.html(format(c));\n after.html(format(substring(string, 1), prompt + c));\n } else {\n var before_str = $.terminal.substring(string, 0, position);\n before.html(format(before_str, prompt));\n c = substring(string, position, position + 1);\n var c_before = (prompt + before_str).replace(/^.*\\t/, '');\n cursor.html(format(c, c_before));\n if (position === len - 1) {\n cursor_end_line = true;\n after.html('');\n } else {\n if (c.match(/\\t/)) {\n c_before = '';\n } else {\n c_before += c;\n }\n after.html(format(substring(string, position + 1), c_before));\n }\n }\n if (ch_unit_bug) {\n if (typeof wcwidth !== 'undefined') {\n // handle emoji and wide characters in IE or\n // other possible browsers that don't have valid ch unit\n var size = strlen(text(c));\n if (size === 1 && is_emoji_formatting(c)) {\n size = 2;\n }\n cursor.width(char_width * size);\n } else {\n cursor.width(char_width);\n }\n }\n cursor.toggleClass('cmd-end-line', cursor_end_line);\n // fix for animation when changing --animation dynamically\n fix_cursor();\n var cursor_len = $.terminal.length(cursor.text());\n if (cursor_len > 1) {\n var node = cursor.find('[data-text]')[0];\n node.style.setProperty('--length', cursor_len);\n }\n // synchronize css animations (it's not that important because if user\n // will change animation she should disable animation on span, but it\n // looks nicer until she disable that inner animation)\n restart_animation();\n }\n // -----------------------------------------------------------------\n function div(string, before) {\n var end_line = string.match(line_marker_re);\n var result = '<div role=\"presentation\" aria-hidden=\"true\"';\n if (end_line) {\n string = string.replace(line_marker_re, ' ');\n result += ' class=\"cmd-end-line\"';\n }\n result += '>' + format(string, before || '') + '</div>';\n return result;\n }\n // -----------------------------------------------------------------\n function empty_cursor() {\n // data-text is for consistency in CSS and end class is for unit tests\n cursor.html('<span data-text class=\"end\"><span> <span></span>');\n }\n // -----------------------------------------------------------------\n // :: Display lines after the cursor\n // -----------------------------------------------------------------\n function lines_after(lines) {\n var last_ins = cursor_line;\n $.each(lines, function(i, line) {\n last_ins = $(div(line)).insertAfter(last_ins);\n });\n }\n // -----------------------------------------------------------------\n // :: Display lines before the cursor\n // -----------------------------------------------------------------\n function lines_before(lines) {\n $.each(lines, function(i, line) {\n cursor_line.before(div(line, i === 0 ? prompt_last_line : ''));\n });\n }\n // -----------------------------------------------------------------\n // :: Redraw function\n // -----------------------------------------------------------------\n return function() {\n var string;\n switch (typeof settings.mask) {\n case 'boolean':\n string = settings.mask ? command.replace(/./g, '*') : command;\n break;\n case 'string':\n string = command.replace(/./g, settings.mask);\n break;\n }\n var formatted = formatting(string);\n var pos;\n if (length(formatted) === text(string).length) {\n pos = position;\n } else {\n pos = formatted_position;\n }\n var i;\n wrapper.css({\n display: 'none'\n });\n wrapper.find('div:not(.cmd-cursor-line)').remove();\n before.html('');\n if (is_multiline(formatted)) {\n var tabs = formatted.match(/\\t/g);\n var original_string = formatted;\n //quick tabulation hack\n if (tabs) {\n formatted = formatted.replace(/\\t/g, '\\x00\\x00\\x00\\x00');\n }\n var array = split_command_line(formatted);\n if (tabs) {\n array = $.map(array, function(line) {\n return line.replace(/\\x00\\x00\\x00\\x00/g, '\\t');\n });\n }\n var first_len = length(array[0]);\n //cursor in first line\n if (first_len === 0 && array.length === 1) {\n // skip empty line\n } else if (pos < first_len) {\n draw_cursor_line(array[0], {\n length: array.length,\n position: pos,\n prompt: prompt_last_line\n });\n lines_after(array.slice(1));\n } else if (pos === first_len) {\n // first char acter of second line\n cursor_line.before(div(array[0], prompt_last_line));\n draw_cursor_line(array[1] || '', {\n length: array.length,\n position: 0,\n last: array.length <= 2\n });\n if (array.length > 2) {\n lines_after(array.slice(2));\n }\n } else {\n var last = array.slice(-1)[0];\n var len = length(original_string);\n var from_last = len - pos;\n var last_len = length(last);\n var new_pos = 0;\n if (from_last === -1) {\n from_last = 0;\n }\n if (from_last <= last_len) { // in last line\n lines_before(array.slice(0, -1));\n if (last_len === from_last) {\n new_pos = 0;\n } else {\n new_pos = last_len - from_last;\n }\n draw_cursor_line(last, {\n length: array.length,\n position: new_pos,\n last: true\n });\n } else {\n // more lines, cursor in the middle\n var line_index;\n var current;\n new_pos = pos;\n for (i = 0; i < array.length; ++i) {\n var current_len = $.terminal.length(array[i]);\n if (new_pos > current_len) {\n new_pos -= current_len;\n } else {\n break;\n }\n }\n current = array[i];\n line_index = i;\n // cursor on first character in line\n if (new_pos === length(current)) {\n new_pos = 0;\n current = array[++line_index];\n if (current === undefined) {\n //should never happen\n var msg = $.terminal.defaults.strings.redrawError;\n throw new Error(msg);\n }\n }\n draw_cursor_line(current, {\n length: array.length,\n position: new_pos\n });\n lines_before(array.slice(0, line_index));\n lines_after(array.slice(line_index + 1));\n }\n }\n self.find('.cmd-cursor-line ~ div:last-of-type')\n .append('<span></span>');\n } else if (formatted === '') {\n before.html('');\n empty_cursor();\n after.html('');\n } else {\n draw_cursor_line(formatted, {\n length: 1,\n position: pos\n });\n }\n var in_line = cursor_line.prevUntil('.cmd-prompt').length;\n if (is_css_variables_supported) {\n self[0].style.setProperty('--cursor-line', in_line);\n } else {\n clip.$node.css('top', in_line * 14 + 'px');\n }\n wrapper.css({\n display: ''\n });\n };\n })();\n // ---------------------------------------------------------------------\n // :: find position that match display position for commands that\n // :: change length by formatters\n // ---------------------------------------------------------------------\n var find_position = (function() {\n function make_guess(string, position) {\n var opts = $.extend({}, settings, {\n position: position,\n command: true\n });\n return $.terminal.apply_formatters(string, opts)[1];\n }\n function cmp(search_pos, pos, string) {\n var guess = make_guess(string, pos);\n if (guess === search_pos) {\n var next_guess = make_guess(string, pos + 1);\n if (next_guess > search_pos) {\n return 0;\n }\n return 1;\n } else if (guess < search_pos) {\n return 1;\n } else {\n return -1;\n }\n }\n return function(string, formatted_position) {\n if (formatted_position === 0) {\n return 0;\n }\n string = bare_text(string);\n var codepoint_len = string.length;\n var str = $.terminal.escape_brackets(command);\n var pos = binary_search(0, codepoint_len, formatted_position, cmp, [str]);\n var chars = $.terminal.split_characters(string);\n if (codepoint_len > chars.length) {\n var len = 0;\n for (var i = 0; i < chars.length; ++i) {\n len += chars[i].length;\n if (len >= pos) {\n return len;\n }\n }\n }\n return pos;\n };\n })();\n // ---------------------------------------------------------------------\n // :: return prompt filler for the margin set in terminal when using\n // :: newline: false\n // ---------------------------------------------------------------------\n function get_prompt_marker() {\n if (prompt_offset) {\n return new Array(prompt_offset + 1).join('\\uFFFF');\n }\n return '';\n }\n // ---------------------------------------------------------------------\n // :: Draw prompt that can be a function or a string\n // ---------------------------------------------------------------------\n var prev_prompt_data;\n var draw_prompt = (function() {\n function format_prompt(prompt) {\n if (!prompt) {\n just_prompt_len = 0;\n prompt_len = prompt_offset;\n return prompt;\n }\n var prompt_marker = get_prompt_marker();\n var tmp_prompt = prompt_marker + prompt;\n var lines = $.terminal.split_equal(tmp_prompt, num_chars);\n lines = lines.map(function(line) {\n return line.replace(/^\\uFFFF+/, '');\n });\n lines = lines.map(function(line) {\n if (!$.terminal.have_formatting(line)) {\n return '[[;;]' + $.terminal.escape_brackets(line) + ']';\n }\n return $.terminal.format_split(line).map(function(str) {\n if ($.terminal.is_formatting(str)) {\n return str;\n }\n return '[[;;]' + $.terminal.escape_brackets(str) + ']';\n }).join('');\n });\n var options = {\n charWidth: settings.charWidth\n };\n prompt_last_line = lines[lines.length - 1];\n var encoded_last_line = $.terminal.encode(lines[lines.length - 1], {\n tabs: settings.tabs\n });\n var last_line = $.terminal.format(encoded_last_line, options);\n just_prompt_len = strlen(text(encoded_last_line));\n prompt_len = just_prompt_len + prompt_offset;\n return lines.slice(0, -1).map(function(line) {\n line = $.terminal.encode(line, {\n tabs: settings.tabs\n });\n return '<span class=\"cmd-line\">' +\n $.terminal.format(line, options) +\n '</span>';\n }).concat([last_line]).join('\\n');\n }\n function set(prompt, options) {\n if (prompt) {\n if (options && options.formatters || !options) {\n prompt = $.terminal.apply_formatters(prompt, {prompt: true});\n prompt = $.terminal.normalize(prompt);\n }\n prompt = crlf(prompt);\n }\n var formatted = format_prompt(prompt);\n last_rendered_prompt = prompt;\n // zero width space to make sure prompt margin takes up space,\n // so that echo with newline: false works when prompt is empty\n formatted = formatted || $.terminal.format('[[;;]\\u200b]');\n // update prompt if changed\n if (prompt_node.html() !== formatted) {\n prompt_node.html(formatted);\n // fix for Chrome bug width selection\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1087787\n var spans = prompt_node.find('> span span');\n clip.$node.attr('data-cmd-prompt', prompt_node.text());\n if (is_ch_unit_supported) {\n prompt_node.hide();\n spans.each(function() {\n var self = $(this);\n var len = strlen(self.text());\n if (len === 0) {\n self.css('width', 1);\n } else {\n self.css('width', len + 'ch');\n }\n });\n prompt_node.show();\n }\n }\n }\n return function(options) {\n // the data is used as cancelable reference because we have ref\n // data object that is hold in closure and we remove `set` function\n // so previous call to function prompt will be ignored\n if (prev_prompt_data && prev_prompt_data.set) {\n prev_prompt_data.set = $.noop;\n // remove reference for garbage collector\n prev_prompt_data = null;\n }\n var data = prev_prompt_data = {\n set: set\n };\n with_prompt(prompt, function(prompt) {\n data.set(prompt, options);\n }, self);\n };\n })();\n // ---------------------------------------------------------------------\n function fire_change_command() {\n if (is_function(settings.onCommandChange)) {\n settings.onCommandChange.call(self, command);\n }\n }\n // ---------------------------------------------------------------------\n // :: used for display_position and postition\n // ---------------------------------------------------------------------\n function column(command, position, include_prompt) {\n var before = command.substring(0, position);\n if (position === 0 || !command.length) {\n return 0;\n }\n var re = /\\n?([^\\n]*)$/;\n var match = before.match(re);\n var col = match[1].length;\n if (!have_newlines(before) &&\n (include_prompt || have_wrapping(before, prompt_len))) {\n col += prompt_len;\n }\n if (col === 0) {\n return col;\n }\n col %= num_chars;\n if (col === 0) {\n return num_chars;\n }\n return col;\n }\n // ---------------------------------------------------------------------\n // :: Command Line Methods\n // ---------------------------------------------------------------------\n $.extend(self, {\n option: function(name, value) {\n if (typeof value === 'undefined') {\n return settings[name];\n } else {\n settings[name] = value;\n }\n return self;\n },\n name: function(string) {\n if (string !== undefined) {\n name = string;\n var enabled = history && history.enabled() || !history;\n history = new History(\n name,\n settings.historySize,\n settings.history === 'memory'\n );\n // disable new history if old was disabled\n if (!enabled) {\n history.disable();\n }\n return self;\n } else {\n return name;\n }\n },\n purge: function() {\n history.clear();\n return self;\n },\n history: function() {\n return history;\n },\n 'delete': function(n, stay) {\n var removed, string;\n if (n === 0) {\n return \"\";\n } else if (n < 0) {\n if (position > 0) {\n // this may look weird but if n is negative we need\n // to use +\n removed = command.slice(0, position).slice(n);\n string = bare_text(command);\n string = string.slice(0, position + n) +\n string.slice(position, string.length);\n if (!stay) {\n self.position(position + n);\n }\n }\n } else if (command !== '') {\n string = text(command);\n if (position < string.length) {\n removed = string.slice(position).slice(0, n);\n string = string.slice(0, position) +\n string.slice(position + n, string.length);\n }\n }\n if (removed) {\n command = string;\n }\n redraw();\n fix_textarea();\n fire_change_command();\n return removed;\n },\n set: function(string, stay, silent) {\n if (string !== undefined) {\n var command_changed = string !== command;\n command = string;\n if (!stay) {\n self.position(bare_text(command).length);\n }\n redraw();\n fix_textarea();\n if (!silent && command_changed) {\n fire_change_command();\n }\n }\n return self;\n },\n keymap: function(new_keymap, value) {\n function wrap(key, fn) {\n var original = default_keymap[key];\n if (is_function(original)) {\n original = original.bind(self);\n }\n return function(e) {\n // new keymap function will get default as 2nd argument\n return fn.call(self, e, original);\n };\n }\n if (new_keymap === null) {\n keymap = default_keymap;\n return self;\n } else if (typeof new_keymap === 'undefined') {\n return keymap;\n } else if (typeof new_keymap === 'string') {\n if (typeof value === 'undefined') {\n if (keymap[new_keymap]) {\n return keymap[new_keymap];\n } else if (default_keymap[new_keymap]) {\n return default_keymap[new_keymap];\n }\n } else {\n keymap[new_keymap] = wrap(new_keymap, value);\n }\n } else {\n keymap = $.extend(\n {},\n keymap ? keymap : default_keymap,\n $.omap(new_keymap || {}, wrap)\n );\n return self;\n }\n },\n insert: function(string, stay) {\n var bare_command = bare_text(command);\n var len = bare_text(string).length;\n if (position === bare_command.length) {\n string = bare_command + string;\n } else if (position === 0) {\n string = string + bare_command;\n } else {\n string = bare_command.slice(0, position) +\n string + bare_command.slice(position);\n }\n command = string;\n if (!stay) {\n self.position(len, true, true);\n }\n fix_textarea();\n redraw();\n fire_change_command();\n return self;\n },\n get: function() {\n return command;\n },\n commands: function(commands) {\n if (commands) {\n settings.commands = commands;\n return self;\n } else {\n return commands;\n }\n },\n destroy: function() {\n doc.unbind('keypress.cmd', keypress_event);\n doc.unbind('keydown.cmd', keydown_event);\n doc.unbind('input.cmd', input_event);\n self.stopTime('blink', blink);\n self.find('.cmd-wrapper').remove();\n self.find('.cmd-prompt, .cmd-clipboard, .cmd-editable').remove();\n self.removeClass('cmd').removeData('cmd').off('.cmd');\n return self;\n },\n display_column: function(include_prompt) {\n var formatted = formatting(command);\n formatted = $.terminal.strip(formatted);\n return column(formatted, formatted_position, include_prompt);\n },\n column: function(include_prompt) {\n return column(command, position, include_prompt);\n },\n line: function() {\n var before = command.substring(0, position);\n if (position === 0 || !command.length) {\n return 0;\n }\n return before.split(/\\n/).length - 1;\n },\n // inform cursor about size of partial output line\n __set_prompt_margin: function(len) {\n prompt_offset = len;\n prompt_len = just_prompt_len + prompt_offset;\n },\n prompt: function(user_prompt, options) {\n if (user_prompt === true) {\n return last_rendered_prompt;\n } else if (user_prompt === undefined) {\n return prompt;\n } else {\n var should_redraw = user_prompt !== prompt;\n if (typeof user_prompt === 'string' ||\n typeof user_prompt === 'function') {\n prompt = user_prompt;\n } else {\n throw new Error('prompt must be a function or string');\n }\n if (should_redraw) {\n draw_prompt(options);\n // we could check if command is longer then numchars-new\n // prompt\n redraw();\n }\n return self;\n }\n },\n kill_text: function() {\n return kill_text;\n },\n position: function(n, relative, silent) {\n if (typeof n === 'number') {\n var pos = position;\n var len = bare_text(command).length;\n if (relative) {\n position += n;\n } else if (n < 0) {\n position = 0;\n } else if (n > len) {\n position = len;\n } else {\n position = n;\n }\n if (pos !== position) {\n redraw();\n if (!silent && is_function(settings.onPositionChange)) {\n settings.onPositionChange(position, formatted_position);\n }\n fix_textarea(true);\n }\n return self;\n } else {\n return position;\n }\n },\n refresh: function() {\n draw_prompt();\n redraw();\n fix_textarea(true);\n return self;\n },\n // if formatter change length of the strings (like emoji demo) we need to keep\n // track of two different positions one for command and one for display\n display_position: function(n, relative) {\n if (n === undefined) {\n return formatted_position;\n } else {\n // double escape\n var string = formatting($.terminal.escape_formatting(command), true);\n var len = length(string);\n var command_len = bare_text(command).length;\n var new_formatted_pos;\n if (relative) {\n new_formatted_pos = formatted_position + n;\n } else if (n > len) {\n new_formatted_pos = len;\n } else {\n new_formatted_pos = n;\n }\n if (len === command_len) {\n formatted_position = new_formatted_pos;\n return self.position(new_formatted_pos);\n }\n if (len === new_formatted_pos) {\n formatted_position = new_formatted_pos;\n return self.position(command_len);\n }\n var pos = find_position(command, new_formatted_pos);\n if (pos !== -1) {\n formatted_position = new_formatted_pos;\n self.position(pos);\n }\n return self;\n }\n },\n visible: (function() {\n var visible = self.visible;\n return function() {\n visible.apply(self, []);\n redraw();\n draw_prompt();\n return self;\n };\n })(),\n show: (function() {\n var show = self.show;\n return function() {\n show.apply(self, []);\n redraw();\n draw_prompt();\n return self;\n };\n })(),\n resize: function(num) {\n char_width = get_char_width();\n var new_num_chars;\n if (typeof num === 'number') {\n new_num_chars = num;\n } else {\n new_num_chars = get_num_chars(char_width);\n }\n if (num_chars !== new_num_chars || arguments[0] === true) {\n num_chars = new_num_chars;\n draw_prompt();\n redraw();\n }\n return self;\n },\n clear_cache: 'Map' in root ? function() {\n cmd_line_worker.clear();\n } : function() {\n return self;\n },\n invoke_key: function(shortcut) {\n if (!enabled) {\n warn('invoke_key(\"' + shortcut + '\") called on disabled terminal');\n }\n var keys = shortcut.toUpperCase().split('+');\n var key = keys.pop();\n var ctrl = keys.indexOf('CTRL') !== -1;\n var shift = keys.indexOf('SHIFT') !== -1;\n var alt = keys.indexOf('ALT') !== -1;\n var meta = keys.indexOf('META') !== -1;\n var e = $.Event(\"keydown\", {\n ctrlKey: ctrl,\n shiftKey: shift,\n altKey: alt,\n metaKey: meta,\n which: reversed_keycodes[key],\n key: key\n });\n var doc = $(document.documentElement || window);\n doc.trigger(e);\n e = $.Event(\"keypress\");\n e.key = key;\n e.which = e.keyCode = 0;\n doc.trigger(e);\n return self;\n },\n clip: function() {\n return clip;\n },\n enable: function(silent) {\n if (!enabled) {\n enabled = true;\n self.addClass('enabled');\n try {\n if (!clip.$node.is(':focus')) {\n clip.$node.focus();\n }\n clip.$node.caret(position);\n } catch (e) {\n // firefox throw NS_ERROR_FAILURE - ignore\n }\n animation(true);\n if (!silent && is_function(prompt)) {\n draw_prompt();\n }\n fix_cursor();\n fix_textarea();\n }\n mobile_focus();\n return self;\n },\n isenabled: function() {\n return enabled;\n },\n disable: function(focus) {\n enabled = false;\n self.removeClass('enabled');\n animation(false);\n if (!focus) {\n mobile_focus();\n }\n return self;\n },\n mask: function(new_mask) {\n if (typeof new_mask === 'undefined') {\n return settings.mask;\n } else {\n settings.mask = new_mask;\n redraw();\n return self;\n }\n }\n });\n // ---------------------------------------------------------------------\n // :: INIT\n // ---------------------------------------------------------------------\n self.name(settings.name || settings.prompt || '');\n char_width = get_char_width();\n num_chars = get_num_chars(char_width);\n if (settings.prompt !== false) {\n prompt = settings.prompt;\n draw_prompt();\n }\n if (settings.enabled === true) {\n self.enable();\n }\n if (!settings.history) {\n history.disable();\n }\n var first_up_history = true;\n // skip_keypress - hack for Android that was inserting characters on\n // backspace\n var skip_keypress = false;\n var dead_key = false;\n var single_key = false;\n var no_keypress = false;\n var no_key = false;\n var no_keydown = true;\n var backspace = false;\n var process = false;\n var hold = false;\n var hold_pause = false;\n var skip_insert;\n // we hold text before keydown to fix backspace for Android/Chrome/SwiftKey\n // keyboard that generate keycode 229 for all keys #296\n var prev_command = '';\n var prev_key;\n // ---------------------------------------------------------------------\n // :: Keydown Event Handler\n // ---------------------------------------------------------------------\n function is_backspace(e) {\n return e.key.toUpperCase() === 'BACKSPACE' || e.which === 8;\n }\n // ---------------------------------------------------------------------\n function is_single(e) {\n return e.key && e.key.length === 1 && !e.ctrlKey;\n }\n // ---------------------------------------------------------------------\n function is_delay_key(key) {\n var specials = ['HOLD+SHIFT+BACKSPACE', 'HOLD+BACKSPACE'];\n return specials.indexOf(key) !== -1 && settings.mobileDelete ||\n settings.repeatTimeoutKeys.indexOf(key) !== -1;\n }\n // ---------------------------------------------------------------------\n function clear_reverse_search_key(e) {\n // arrows / Home / End / ENTER\n return e.which === 35 || e.which === 36 ||\n e.which === 37 || e.which === 38 ||\n e.which === 39 || e.which === 40 ||\n e.which === 13 || e.which === 27;\n }\n var skip_keydown = false;\n // ---------------------------------------------------------------------\n // function complexicity is 35 when adding this exception\n // eslint-disable-next-line complexity\n function keydown_event(e) {\n debug('keydown \"' + e.key + '\" ' + e.fake + ' ' + e.which);\n var result;\n process = (e.key || '').toLowerCase() === 'process' || e.which === 0;\n dead_key = no_keypress && single_key && !is_backspace(e);\n // special keys don't trigger keypress fix #293\n try {\n if (!e.fake) {\n single_key = is_single(e);\n // chrome on android support key property but it's \"Unidentified\"\n no_key = String(e.key).toLowerCase() === 'unidentified';\n backspace = is_backspace(e);\n }\n } catch (exception) {}\n // keydown created in input will have text already inserted and we\n // want text before input\n if (e.key === \"Unidentified\") {\n no_keydown = true;\n // android swift keyboard have always which == 229 we will triger proper\n // event in input with e.fake == true\n return;\n }\n // meta and os are special keydown triggered by Emoji picker on Windows 10\n // meta is in Google Chrome is is in Firefox\n if (!e.fake && ['meta', 'os'].indexOf(e.key.toLowerCase()) === -1) {\n no_keydown = false;\n }\n no_keypress = true;\n // Meta+V did bind input but it didin't happen because terminal paste\n // prevent native insert action\n clip.$node.off('input', paste);\n var key = get_key(e);\n if (is_function(settings.keydown)) {\n e.key = ie_key_fix(e);\n result = settings.keydown.call(self, e);\n if (result !== undefined) {\n //skip_keypress = true;\n if (!result) {\n skip_insert = true;\n }\n return result;\n }\n }\n if (key !== prev_key) {\n clear_hold();\n }\n // CTRL+C hanlding is only exception of cmd aware terminal logic\n // cmd need to call CTRL+C keymap when terminal is not enabled\n if (enabled || (key === 'CTRL+C' && is_terminal_selected(self))) {\n if (hold) {\n prev_key = key;\n key = 'HOLD+' + key;\n if (hold_pause) {\n return;\n }\n if (settings.holdRepeatTimeout > 0 && is_delay_key(key)) {\n hold_pause = true;\n self.oneTime(settings.holdRepeatTimeout, 'delay', function() {\n hold_pause = false;\n });\n }\n } else {\n self.oneTime(settings.holdTimeout, 'hold', function() {\n hold = true;\n });\n prev_key = key;\n }\n // if e.fake ignore of space is handled in input and next keydown\n // is not triggered this is just in case code since on Android\n // keydown is not triggered only input so event is always fake on Android\n if (!e.fake && is_android) {\n if (skip_keydown) {\n clear_hold();\n skip_keydown = false;\n return false;\n }\n if (mobile_ignore_key(key)) {\n skip_keydown = true;\n } else if (mobile_ignore_key(prev_key)) {\n // just in case next key is different then space\n skip_keydown = false;\n }\n }\n restart_animation();\n // CTRL+V don't fire keypress in IE11\n skip_insert = ['CTRL+V', 'META+V'].indexOf(key) !== -1;\n // only enter will reset history (and down arrow on last command)\n if (key.toLowerCase() === 'enter') {\n first_up_history = true;\n }\n if (reverse_search && clear_reverse_search_key(e)) {\n clear_reverse_state();\n draw_prompt();\n if (e.which === 27) { // ESC\n self.set('');\n }\n redraw();\n if (e.which === 13) {\n keydown_event.call(this, e);\n }\n } else if (is_function(keymap[key])) {\n result = keymap[key](e);\n if (result === true) {\n return;\n }\n if (result !== undefined) {\n return result;\n }\n } else if (e.altKey) {\n return;\n } else {\n skip_keypress = false;\n return;\n }\n // this will prevent for instance backspace to go back one page\n //skip_keypress = true;\n //e.preventDefault();\n }\n }\n function clear_hold() {\n self.stopTime('hold');\n self.stopTime('delay');\n hold_pause = hold = false;\n }\n var doc = $(document.documentElement || window);\n self.keymap(settings.keymap || {});\n function keypress_event(e) {\n debug('keypress \"' + e.key + '\" ' + e.fake);\n clear_hold();\n var result;\n if (!e.fake) {\n no_keypress = false;\n }\n if ((e.ctrlKey || e.metaKey) && !e.altKey) {\n return;\n }\n if (skip_keypress) {\n return;\n }\n if (is_function(settings.keypress)) {\n result = settings.keypress.call(self, e);\n if (result !== undefined) {\n if (!result) {\n skip_insert = true;\n }\n return result;\n }\n }\n if (enabled) {\n if (e.fake) {\n // event created in input, we prevent inserting text\n // in different interpreter when keydown called pop\n return;\n }\n // key polyfill is not correct for keypress\n // https://github.com/cvan/keyboardevent-key-polyfill/issues/15\n var key;\n if (is_key_native) {\n key = e.key;\n // fixing IE inconsistency #362\n var normalized = key.toUpperCase();\n if (key_mapping[normalized]) {\n key = key_mapping[normalized];\n }\n }\n if (!key || no_key) {\n key = String.fromCharCode(e.which);\n }\n if ($.inArray(e.which, [13, 0, 8]) > -1) {\n if (e.keyCode === 123) { // for F12 which === 0\n return;\n }\n return false;\n // which === 100 - d\n } else if (key && (!e.ctrlKey || (e.ctrlKey && e.ctrlKey)) &&\n (!(e.altKey && e.which === 100) || e.altKey) &&\n !dead_key) {\n // dead_key are handled by input event\n if (reverse_search) {\n rev_search_str += key;\n reverse_history_search();\n draw_reverse_prompt();\n } else if (key.length === 1) {\n self.insert(key);\n }\n }\n }\n }\n function event(type, chr, which) {\n var event = $.Event(type);\n event.which = which;\n event.key = chr;\n event.fake = true;\n doc.trigger(event);\n }\n var skip_input = false;\n function finalize_input_event() {\n prev_command = command;\n skip_insert = false;\n no_keydown = true;\n }\n function input_event() {\n debug('input ' + no_keydown + ' || ' + process + ' ((' + no_keypress +\n ' || ' + dead_key + ') && !' + skip_insert + ' && (' + single_key +\n ' || ' + no_key + ') && !' + backspace + ')');\n // correct for fake space used for select all context menu hack\n var val = clip.val();\n if (!is_mobile) {\n val = val.replace(/^ /, '');\n }\n // Some Androids don't fire keypress - #39\n // if there is dead_key we also need to grab real character #158\n // Firefox/Android with google keyboard don't fire keydown and keyup #319\n if (no_keydown || process || ((no_keypress || dead_key) &&\n !skip_insert &&\n (single_key || no_key) && !backspace)) {\n if (val && val === command) {\n if (is_android) {\n // ignore autocomplete on GBoard keyboard #693\n if (no_keydown) {\n event('keydown', 'Enter', 13);\n }\n }\n finalize_input_event();\n return;\n }\n var pos = position;\n // backspace is set in keydown if no keydown we need to get new one\n if (no_keydown) {\n var cmd = prev_command;\n backspace = cmd.slice(0, cmd.length - 1).length === val.length;\n }\n if (skip_input) {\n skip_input = false;\n clip.val(command);\n return;\n }\n if (reverse_search) {\n rev_search_str = val;\n reverse_history_search();\n draw_reverse_prompt();\n } else {\n var str = val.slice(position);\n if (str.length === 1 || backspace) {\n // original not optimized function called once\n var chr = get_next_character(str);\n if (mobile_ignore_key(chr)) {\n skip_input = true;\n }\n // we trigger events so keypress and keydown callback work\n if (no_keydown) {\n var keycode;\n if (backspace) {\n keycode = 8;\n } else {\n keycode = str.toUpperCase().charCodeAt(0);\n }\n event('keydown', backspace ? 'Backspace' : str, keycode);\n }\n if (no_keypress && !backspace) {\n event('keypress', chr, str.charCodeAt(0));\n }\n }\n if (backspace) {\n prev_command = command;\n return;\n }\n // if user return false in keydown we don't want to insert text\n if (skip_insert) {\n skip_insert = false;\n return;\n }\n self.set(val);\n }\n if (backspace) {\n self.position(pos - 1);\n } else {\n // user enter more then one character if click on complete word\n // on android\n self.position(pos + Math.abs(val.length - prev_command.length));\n }\n }\n finalize_input_event();\n }\n doc.bind('keypress.cmd', keypress_event);\n doc.bind('keydown.cmd', keydown_event);\n doc.bind('keyup.cmd', clear_hold);\n doc.bind('input.cmd', input_event);\n (function() {\n if (is_mobile) {\n $(self[0]).add(clip.$node).on('touchstart.cmd', function() {\n if (!self.isenabled()) {\n clip.focus();\n } else {\n clip.blur();\n }\n });\n self.disable();\n return;\n }\n var was_down = false;\n var count = 0;\n self.on('mousedown.cmd', function() {\n was_down = true;\n }).on('mouseup.cmd', function(e) {\n function trigger() {\n var $target = $(e.target);\n var is_prompt = $target.is('.cmd-prompt');\n if (!is_prompt && down && get_selected_html() === '') {\n if (enabled) {\n if ($target.is('.cmd')) {\n self.position(text(command).length);\n } else {\n self.display_position(get_char_pos(e));\n }\n }\n }\n count = 0;\n }\n // we get button from event for testing normally it's on originalEvent\n var button;\n if (e.originalEvent === undefined) {\n button = e.button;\n } else {\n button = e.originalEvent.button;\n }\n if (button === 0 && get_selected_html() === '') {\n var name = 'click_' + id;\n if (++count === 1) {\n var down = was_down;\n if (enabled) {\n if (settings.clickTimeout === 0) {\n trigger();\n } else {\n self.oneTime(settings.clickTimeout, name, trigger);\n }\n } else {\n count = 0;\n }\n } else {\n self.stopTime(name);\n count = 0;\n }\n }\n was_down = false;\n });\n })();\n self.data('cmd', self);\n if (!('KeyboardEvent' in window && 'key' in window.KeyboardEvent.prototype)) {\n setTimeout(function() {\n throw new Error('key event property not supported try https://github.' +\n 'com/inexorabletash/polyfill/blob/master/keyboard.js');\n }, 0);\n }\n return self;\n }; // cmd plugin\n // -------------------------------------------------------------------------\n var strlen = (function() {\n if (typeof wcwidth === 'undefined') {\n return function(string) {\n // fix empty prompt that use 0 width space\n string = string.replace(/\\u200B/g, '');\n return $.terminal.length(string);\n };\n } else {\n return wcwidth;\n }\n })();\n // -------------------------------------------------------------------------\n function count_selfclosing_formatting(string) {\n var count = 0;\n if ($.terminal.have_formatting(string)) {\n var re = new RegExp(format_parts_re.source, 'i'); // without g flag\n $.terminal.format_split(string).forEach(function(str) {\n if ($.terminal.is_formatting(str)) {\n var m = str.match(re);\n if (m && m[1].match(/@/) && m[6] === '') {\n count++;\n }\n }\n });\n }\n return count;\n }\n // -------------------------------------------------------------------------\n // entiteis are case sensitive\n // generated from https://www.freeformatter.com/html-entities.html\n // -------------------------------------------------------------------------\n var entities = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \"À\": \"À\",\n \"Á\": \"Á\",\n \"Â\": \"Â\",\n \"Ã\": \"Ã\",\n \"Ä\": \"Ä\",\n \"Å\": \"Å\",\n \"Æ\": \"Æ\",\n \"Ç\": \"Ç\",\n \"È\": \"È\",\n \"É\": \"É\",\n \"Ê\": \"Ê\",\n \"Ë\": \"Ë\",\n \"Ì\": \"Ì\",\n \"Í\": \"Í\",\n \"Î\": \"Î\",\n \"Ï\": \"Ï\",\n \"Ð\": \"Ð\",\n \"Ñ\": \"Ñ\",\n \"Ò\": \"Ò\",\n \"Ó\": \"Ó\",\n \"Ô\": \"Ô\",\n \"Õ\": \"Õ\",\n \"Ö\": \"Ö\",\n \"Ø\": \"Ø\",\n \"Ù\": \"Ù\",\n \"Ú\": \"Ú\",\n \"Û\": \"Û\",\n \"Ü\": \"Ü\",\n \"Ý\": \"Ý\",\n \"Þ\": \"Þ\",\n \"ß\": \"ß\",\n \"à\": \"à\",\n \"á\": \"á\",\n \"â\": \"â\",\n \"ã\": \"ã\",\n \"ä\": \"ä\",\n \"å\": \"å\",\n \"æ\": \"æ\",\n \"ç\": \"ç\",\n \"è\": \"è\",\n \"é\": \"é\",\n \"ê\": \"ê\",\n \"ë\": \"ë\",\n \"ì\": \"ì\",\n \"í\": \"í\",\n \"î\": \"î\",\n \"ï\": \"ï\",\n \"ð\": \"ð\",\n \"ñ\": \"ñ\",\n \"ò\": \"ò\",\n \"ó\": \"ó\",\n \"ô\": \"ô\",\n \"õ\": \"õ\",\n \"ö\": \"ö\",\n \"ø\": \"ø\",\n \"ù\": \"ù\",\n \"ú\": \"ú\",\n \"û\": \"û\",\n \"ü\": \"ü\",\n \"ý\": \"ý\",\n \"þ\": \"þ\",\n \"ÿ\": \"ÿ\",\n \" \": \" \",\n \"¡\": \"¡\",\n \"¢\": \"¢\",\n \"£\": \"£\",\n \"¤\": \"¤\",\n \"¥\": \"¥\",\n \"¦\": \"¦\",\n \"§\": \"§\",\n \"¨\": \"¨\",\n \"©\": \"©\",\n \"ª\": \"ª\",\n \"«\": \"«\",\n \"¬\": \"¬\",\n \"­\": \"\",\n \"®\": \"®\",\n \"¯\": \"¯\",\n \"°\": \"°\",\n \"±\": \"±\",\n \"²\": \"²\",\n \"³\": \"³\",\n \"´\": \"´\",\n \"µ\": \"µ\",\n \"¶\": \"¶\",\n \"¸\": \"¸\",\n \"¹\": \"¹\",\n \"º\": \"º\",\n \"»\": \"»\",\n \"¼\": \"¼\",\n \"½\": \"½\",\n \"¾\": \"¾\",\n \"¿\": \"¿\",\n \"×\": \"×\",\n \"÷\": \"÷\",\n \"∀\": \"∀\",\n \"∂\": \"∂\",\n \"∃\": \"∃\",\n \"∅\": \"∅\",\n \"∇\": \"∇\",\n \"∈\": \"∈\",\n \"∉\": \"∉\",\n \"∋\": \"∋\",\n \"∏\": \"∏\",\n \"∑\": \"∑\",\n \"−\": \"−\",\n \"∗\": \"∗\",\n \"√\": \"√\",\n \"∝\": \"∝\",\n \"∞\": \"∞\",\n \"∠\": \"∠\",\n \"∧\": \"∧\",\n \"∨\": \"∨\",\n \"∩\": \"∩\",\n \"∪\": \"∪\",\n \"∫\": \"∫\",\n \"∴\": \"∴\",\n \"∼\": \"∼\",\n \"≅\": \"≅\",\n \"≈\": \"≈\",\n \"≠\": \"≠\",\n \"≡\": \"≡\",\n \"≤\": \"≤\",\n \"≥\": \"≥\",\n \"⊂\": \"⊂\",\n \"⊃\": \"⊃\",\n \"⊄\": \"⊄\",\n \"⊆\": \"⊆\",\n \"⊇\": \"⊇\",\n \"⊕\": \"⊕\",\n \"⊗\": \"⊗\",\n \"⊥\": \"⊥\",\n \"⋅\": \"⋅\",\n \"Α\": \"Α\",\n \"Β\": \"Β\",\n \"Γ\": \"Γ\",\n \"Δ\": \"Δ\",\n \"Ε\": \"Ε\",\n \"Ζ\": \"Ζ\",\n \"Η\": \"Η\",\n \"Θ\": \"Θ\",\n \"Ι\": \"Ι\",\n \"Κ\": \"Κ\",\n \"Λ\": \"Λ\",\n \"Μ\": \"Μ\",\n \"Ν\": \"Ν\",\n \"Ξ\": \"Ξ\",\n \"Ο\": \"Ο\",\n \"Π\": \"Π\",\n \"Ρ\": \"Ρ\",\n \"Σ\": \"Σ\",\n \"Τ\": \"Τ\",\n \"Υ\": \"Υ\",\n \"Φ\": \"Φ\",\n \"Χ\": \"Χ\",\n \"Ψ\": \"Ψ\",\n \"Ω\": \"Ω\",\n \"α\": \"α\",\n \"β\": \"β\",\n \"γ\": \"γ\",\n \"δ\": \"δ\",\n \"ε\": \"ε\",\n \"ζ\": \"ζ\",\n \"η\": \"η\",\n \"θ\": \"θ\",\n \"ι\": \"ι\",\n \"κ\": \"κ\",\n \"λ\": \"λ\",\n \"μ\": \"μ\",\n \"ν\": \"ν\",\n \"ξ\": \"ξ\",\n \"ο\": \"ο\",\n \"π\": \"π\",\n \"ρ\": \"ρ\",\n \"ς\": \"ς\",\n \"σ\": \"σ\",\n \"τ\": \"τ\",\n \"υ\": \"υ\",\n \"φ\": \"φ\",\n \"χ\": \"χ\",\n \"ψ\": \"ψ\",\n \"ω\": \"ω\",\n \"ϑ\": \"ϑ\",\n \"ϒ\": \"ϒ\",\n \"ϖ\": \"ϖ\",\n \"Œ\": \"Œ\",\n \"œ\": \"œ\",\n \"Š\": \"Š\",\n \"š\": \"š\",\n \"Ÿ\": \"Ÿ\",\n \"ƒ\": \"ƒ\",\n \"ˆ\": \"ˆ\",\n \"˜\": \"˜\",\n \" \": \" \",\n \" \": \" \",\n \" \": \" \",\n \"‌\": \"\",\n \"‍\": \"\",\n \"‎\": \"\\u200e\",\n \"‏\": \"\\u200f\",\n \"–\": \"–\",\n \"—\": \"—\",\n \"‘\": \"‘\",\n \"’\": \"’\",\n \"‚\": \"‚\",\n \"“\": \"“\",\n \"”\": \"”\",\n \"„\": \"„\",\n \"†\": \"†\",\n \"‡\": \"‡\",\n \"•\": \"•\",\n \"…\": \"…\",\n \"‰\": \"‰\",\n \"′\": \"′\",\n \"″\": \"″\",\n \"‹\": \"‹\",\n \"›\": \"›\",\n \"‾\": \"‾\",\n \"€\": \"€\",\n \"™\": \"™\",\n \"←\": \"←\",\n \"↑\": \"↑\",\n \"→\": \"→\",\n \"↓\": \"↓\",\n \"↔\": \"↔\",\n \"↵\": \"↵\",\n \"⌈\": \"⌈\",\n \"⌉\": \"⌉\",\n \"⌊\": \"⌊\",\n \"⌋\": \"⌋\",\n \"◊\": \"◊\",\n \"♠\": \"♠\",\n \"♣\": \"♣\",\n \"♥\": \"♥\",\n \"♦\": \"♦\"\n };\n // -------------------------------------------------------------------------\n function render_entities(str) {\n return str.replace(/&#(x?)([0-9]+);/g, function(_, hex, code) {\n code = parseInt(code, hex ? 16 : 10);\n return String.fromCharCode(code);\n }).replace(/(&[^;]+;)/g, function(_, entity) {\n return entities[entity] || entity;\n });\n }\n // -------------------------------------------------------------------------\n function bare_text(string) {\n if (!string.match(/&/)) {\n return string;\n }\n return render_entities(safe(string));\n }\n // -------------------------------------------------------------------------\n function text(string) {\n return bare_text($.terminal.strip(string));\n }\n // -------------------------------------------------------------------------\n function safe(string) {\n if (!string.match(/[<>&]/)) {\n return string;\n }\n return string.replace(/&(?![^;]+;)/g, '&')\n .replace(/>/g, '>').replace(/</g, '<');\n }\n // -------------------------------------------------------------------------\n function crlf(string) {\n return string.replace(/\\r/g, '');\n }\n // -------------------------------------------------------------------------\n function char_len(chr) {\n return entity_re.test(chr) ? 1 : chr.length;\n }\n // -------------------------------------------------------------------------\n function make_re_fn(re) {\n return function test_re(string) {\n var m = string.match(re);\n if (starts_with(m)) {\n return m[1];\n }\n };\n }\n // -------------------------------------------------------------------------\n function starts_with(match) {\n return match && match.index === 0;\n }\n // -------------------------------------------------------------------------\n function is_simple_text(string) {\n var re = [\n entity_re,\n emoji_re,\n combine_chr_re,\n astral_symbols_re\n ];\n for (var i = 0; i < re.length; ++i) {\n if (re[i].test(string)) {\n return false;\n }\n }\n return true;\n }\n // -------------------------------------------------------------------------\n // :: optimized higher order function that it check complex regexes\n // :: only when bigger string match those regexes, function is always\n // :: used in loop when you process whole string, it's used to create local\n // :: get_next_character function only cmd in input use original\n // :: not optimized function\n // -------------------------------------------------------------------------\n function make_next_char_fun(string) {\n var tests = [];\n [\n entity_re,\n emoji_re,\n combine_chr_re\n ].forEach(function(re) {\n if (re.test(string)) {\n tests.push(make_re_fn(re));\n }\n });\n if (astral_symbols_re.test(string)) {\n tests.push(function test_astral(string) {\n var m1 = string.match(astral_symbols_re);\n if (starts_with(m1)) {\n var m2 = string.match(combine_chr_re);\n if (m2 && m2.index === 1) {\n return string.slice(0, 3);\n }\n return m1[1];\n }\n });\n }\n return function next_char(string) {\n for (var i = 0; i < tests.length; ++i) {\n var test = tests[i];\n var ret = test(string);\n if (ret) {\n return ret;\n }\n }\n return string[0];\n };\n }\n // -------------------------------------------------------------------------\n // :: function that return character from beginning of the string\n // :: counting emoji, suroggate pairs and combine characters\n // -------------------------------------------------------------------------\n function get_next_character(string) {\n var match_entity = string.match(entity_re);\n if (starts_with(match_entity)) {\n return match_entity[1];\n }\n var match_combo = string.match(combine_chr_re);\n if (starts_with(match_combo)) {\n return match_combo[1];\n }\n var match_emoji = string.match(emoji_re);\n if (starts_with(match_emoji)) {\n return match_emoji[1];\n } else if (string.charCodeAt(0) < 255) {\n return string[0];\n } else {\n var astral_match = string.match(astral_symbols_re);\n if (starts_with(astral_match)) {\n match_combo = string.match(combine_chr_re);\n if (match_combo && match_combo.index === 1) {\n return string.slice(0, 3);\n }\n return string.slice(0, 2);\n } else {\n return string[0];\n }\n }\n }\n // -------------------------------------------------------------------------\n // normalize position for counting emoji and extra chars\n // -------------------------------------------------------------------------\n function normalize_position(string, position) {\n if (position === 0) {\n return position;\n }\n string = $.terminal.strip(string);\n var result = $.terminal.split_characters(string).reduce(function(acc, chr) {\n if (typeof acc === 'number') {\n return acc;\n }\n var length = acc.length + char_len(chr);\n if (length >= position) {\n return acc.position + 1;\n }\n return {\n position: acc.position + 1,\n length: length\n };\n }, {position: 0, length: 0});\n if (typeof result === 'number') {\n return result;\n } else {\n return result.position;\n }\n }\n // -----------------------------------------------------------------\n function style_to_string(styles) {\n return Object.keys(styles).map(function(prop) {\n return prop + ':' + styles[prop];\n }).join(';');\n }\n // -------------------------------------------------------------------------\n function escape_html_attr(value) {\n return value.replace(/\"/g, '"');\n }\n // -------------------------------------------------------------------------\n function char_width_object(len, options) {\n var result = {};\n if (len === 0) {\n result['width'] = '1px';\n } else if (is_ch_unit_supported) {\n result['width'] = len + 'ch';\n } else if (!is_css_variables_supported) {\n if (options.charWidth) {\n result['width'] = (options.charWidth * len) + 'px';\n }\n } else {\n result['--length'] = len;\n }\n return result;\n }\n // -------------------------------------------------------------------------\n // :: options {charWidth}\n // -------------------------------------------------------------------------\n function char_width_prop(len, options) {\n return style_to_string(char_width_object(len, options));\n }\n // -------------------------------------------------------------------------\n function extra_css(text, options) {\n if (typeof wcwidth !== 'undefined') {\n var bare = bare_text(text);\n var len = strlen(bare);\n if (len > 1 && len !== $.terminal.length(bare)) {\n return char_width_object(len, options);\n }\n }\n }\n // -------------------------------------------------------------------------\n function wide_characters(text, options) {\n if (typeof wcwidth !== 'undefined') {\n var bare = bare_text(text);\n var chars = $.terminal.split_characters(bare);\n if (chars.length === 1) {\n return text;\n }\n var specs = chars.map(function(chr) {\n return {\n len: strlen(chr),\n chr: chr\n };\n }).reduce(function(arr, spec) {\n var last = arr[arr.length - 1];\n if (last) {\n if (last.len !== spec.len) {\n return arr.concat([{\n sum: spec.len,\n len: spec.len,\n specs: [spec]\n }]);\n } else {\n arr.pop();\n return arr.concat([{\n sum: last.sum + spec.len,\n len: last.len,\n specs: last.specs.concat(spec)\n }]);\n }\n }\n return [{\n sum: spec.len,\n specs: [spec],\n len: spec.len\n }];\n }, []);\n return specs.map(function(spec) {\n if (spec.len === 1) {\n return make_string(spec);\n }\n var style = char_width_prop(spec.sum, options);\n if (spec.sum === chars.length || !style.length) {\n return '<span>' + make_string(spec) + '</span>';\n } else if (spec.specs.length > 1) {\n return wrap(style, spec.specs.map(function(spec) {\n return wrap(char_width_prop(spec.len), spec.chr);\n }).join(''));\n } else {\n return wrap(style, make_string(spec));\n }\n }).join('');\n }\n function make_string(spec) {\n return spec.specs.map(function(spec) {\n return spec.chr;\n }).join('');\n }\n function wrap(style, str) {\n return '<span style=\"' + style + '\">' + str + '</span>';\n }\n return text;\n }\n // ---------------------------------------------------------------------\n // :: Binary search utility\n // ---------------------------------------------------------------------\n function binary_search(start, end, search_pos, compare_fn, more_args) {\n var len = end - start;\n var mid = start + Math.floor(len / 2);\n var args = [search_pos, mid].concat(more_args);\n var cmp = compare_fn.apply(null, args);\n if (cmp === 0) {\n return mid;\n } else if (cmp > 0 && len > 1) {\n return binary_search(\n mid,\n end,\n search_pos,\n compare_fn,\n more_args\n );\n } else if (cmp < 0 && len > 1) {\n return binary_search(\n start,\n mid,\n search_pos,\n compare_fn,\n more_args\n );\n } else {\n return -1;\n }\n }\n // -----------------------------------------------------------------\n // :: selection utilities - should work in modern browser including IE9\n // -----------------------------------------------------------------\n function is_terminal_selected(cmd) {\n if (is_function(window.getSelection)) {\n var selection = window.getSelection();\n if (selection.toString()) {\n var node = selection.getRangeAt(0).startContainer.parentNode;\n var term = $(node).closest('.terminal');\n return term.length && (cmd && term.find('.cmd').is(cmd) || !cmd);\n }\n }\n }\n // -----------------------------------------------------------------\n function get_selected_html() {\n var html = '';\n if (is_function(window.getSelection)) {\n var sel = window.getSelection();\n if (sel.rangeCount) {\n var container = document.createElement('div');\n for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n container.appendChild(sel.getRangeAt(i).cloneContents());\n }\n html = container.innerHTML;\n }\n }\n return html;\n }\n // -----------------------------------------------------------------\n function with_selection(fn) {\n var html = '';\n var ranges = [];\n if (is_function(window.getSelection)) {\n var selection = window.getSelection();\n if (selection.rangeCount) {\n var container = document.createElement(\"div\");\n for (var i = 0, len = selection.rangeCount; i < len; ++i) {\n var range = selection.getRangeAt(i).cloneRange();\n ranges.push(range);\n container.appendChild(range.cloneContents());\n }\n html = container.innerHTML;\n }\n }\n fn(html);\n if (ranges.length) {\n selection.removeAllRanges();\n ranges.forEach(function(range) {\n selection.addRange(range);\n });\n }\n return html !== '';\n }\n // -----------------------------------------------------------------\n function process_selected_line() {\n var $self = $(this);\n var result = $self.text();\n if ($self.hasClass('cmd-end-line')) {\n result += '\\n';\n }\n return result;\n }\n // -----------------------------------------------------------------\n function process_div(element) {\n // span is empty line, div is default case with text\n return $(element).find('> div, > span')\n .map(process_selected_line).get().join('\\n').replace(/\\n$/, '');\n }\n // -----------------------------------------------------------------\n function process_selected_html(html) {\n var stdout;\n var text = '';\n var $html = $('<div>' + html + '</div>');\n if (html.match(/<\\/div>/)) {\n // match multiple echo output\n stdout = $html.find('div[data-index]').map(function() {\n return process_div(this);\n }).get().join('\\n');\n // match inside single echo output\n if (!stdout && html.match(/style=\"width: 100%;?\"/)) {\n stdout = process_div($html);\n }\n text = stdout;\n }\n var $prompt = $html.find('.cmd-prompt');\n if ($prompt.length) {\n if (text.length) {\n text += '\\n';\n }\n text += $prompt.text();\n }\n var $cmd_lines = $html.find('[role=\"presentation\"]');\n if ($cmd_lines.length) {\n text += $cmd_lines.map(process_selected_line).get().join('');\n }\n if (!text.length && html) {\n text = $html.text();\n }\n return text.replace(/\\xA0/g, ' '); // fix space\n }\n // ---------------------------------------------------------------------\n // :: copy given DOM element text to clipboard\n // ---------------------------------------------------------------------\n var support_copy = (function() {\n if (typeof document === 'undefined') {\n return false;\n }\n if (!is_function(document.queryCommandSupported)) {\n return false;\n }\n return document.queryCommandSupported('copy');\n })();\n // ---------------------------------------------------------------------\n var text_to_clipboard;\n if (support_copy) {\n text_to_clipboard = function text_to_clipboard($textarea, text) {\n var val = $textarea.val();\n var had_focus = $textarea.is(':focus');\n var pos = $textarea.caret();\n if (window.navigator && window.navigator.clipboard) {\n navigator.clipboard.writeText(text);\n } else if (had_focus) {\n $textarea.val(text).focus();\n $textarea[0].select();\n document.execCommand('copy');\n $textarea.val(val);\n $textarea.caret(pos);\n } else {\n var $text = $('<textarea/>').css({\n position: 'fixed',\n top: 0,\n left: 0\n }).appendTo('body');\n $text.val(text).focus();\n $text[0].select();\n document.execCommand('copy');\n $text.blur();\n $text.remove();\n }\n return true;\n };\n } else {\n text_to_clipboard = $.noop;\n }\n // ---------------------------------------------------------------------\n var get_textarea_selection = (function() {\n function noop() {\n return '';\n }\n if (typeof document === 'undefined') {\n return noop;\n }\n var textarea = document.createElement('textarea');\n var selectionStart = 'selectionStart' in textarea;\n textarea = null;\n if (selectionStart) {\n return function(textarea) {\n var length = textarea.selectionEnd - textarea.selectionStart;\n return textarea.value.substr(textarea.selectionStart, length);\n };\n } else if (document.selection) {\n return function() {\n var range = document.selection.createRange();\n return range.text();\n };\n } else {\n return noop;\n }\n })();\n // ---------------------------------------------------------------------\n function clear_textarea_selection(textarea) {\n textarea.selectionStart = textarea.selectionEnd = 0;\n }\n // ---------------------------------------------------------------------\n // :: return string that are common in all elements of the array\n // ---------------------------------------------------------------------\n function common_string(string, array, matchCase) {\n if (!array.length) {\n return '';\n }\n var type = string_case(string);\n var result = [];\n for (var j = string.length; j < array[0].length; ++j) {\n var push = false;\n var candidate = array[0].charAt(j),\n candidateLower = candidate.toLowerCase();\n for (var i = 1; i < array.length; ++i) {\n push = true;\n var current = array[i].charAt(j),\n currentLower = current.toLowerCase();\n if (candidate !== current) {\n if (matchCase || type === 'mixed') {\n push = false;\n break;\n } else if (candidateLower === currentLower) {\n if (type === 'lower') {\n candidate = candidate.toLowerCase();\n } else if (type === 'upper') {\n candidate = candidate.toUpperCase();\n } else {\n push = false;\n break;\n }\n } else {\n push = false;\n break;\n }\n }\n }\n if (push) {\n result.push(candidate);\n } else {\n break;\n }\n }\n return string + result.join('');\n }\n // ---------------------------------------------------------------------\n function trigger_terminal_change(next) {\n terminals.forEach(function(term) {\n term.settings().onTerminalChange.call(term, next);\n });\n }\n // ---------------------------------------------------------------------\n var select = (function() {\n if (root.getSelection) {\n var selection = root.getSelection();\n if (selection.setBaseAndExtent) {\n return function(start, end) {\n var selection = root.getSelection();\n selection.setBaseAndExtent(start, 0, end, 1);\n };\n } else {\n return function(start, end) {\n var selection = root.getSelection();\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, end.childNodes.length);\n selection.removeAllRanges();\n selection.addRange(range);\n };\n }\n } else {\n return $.noop;\n }\n })();\n // -------------------------------------------------------------------------\n function process_command(original, fn) {\n var string = original.trim();\n var array = string.match(command_re) || [];\n if (array.length) {\n var name = array.shift();\n var args = $.map(array, function(arg) {\n if (arg.match(/^[\"']/)) {\n arg = arg.replace(/\\n/g, '\\\\u0000\\\\u0000\\\\u0000\\\\u0000');\n arg = fn(arg);\n return arg.replace(/\\x00\\x00\\x00\\x00/g, '\\n');\n }\n return fn(arg);\n });\n var quotes = $.map(array, function(arg) {\n var m = arg.match(/^(['\"`]).*\\1$/);\n return m && m[1] || '';\n });\n var rest = string.slice(name.length).trim();\n return {\n command: original,\n name: name,\n args: args,\n args_quotes: quotes,\n rest: rest\n };\n } else {\n return {\n command: original,\n name: '',\n args: [],\n args_quotes: [],\n rest: ''\n };\n }\n }\n // -------------------------------------------------------------------------\n // :: handler to trigger when window change size. The most important\n // :: is that it's triggers when virtual keyboard is toggled\n // -------------------------------------------------------------------------\n function on_height_change(callback) {\n var height = window.visualViewport.height;\n callback(height);\n window.visualViewport.addEventListener('resize', function() {\n var newHeight = window.visualViewport.height;\n if (height !== newHeight) {\n height = newHeight;\n callback(height);\n }\n });\n }\n // -------------------------------------------------------------------------\n $.terminal = {\n version: '2.39.3',\n date: 'Sun, 21 Apr 2024 10:23:57 +0000',\n // colors from https://www.w3.org/wiki/CSS/Properties/color/keywords\n color_names: [\n 'transparent', 'currentcolor', 'black', 'silver', 'gray', 'white',\n 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive',\n 'yellow', 'navy', 'blue', 'teal', 'aqua', 'aliceblue',\n 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque',\n 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown',\n 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral',\n 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue',\n 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey',\n 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange',\n 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen',\n 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise',\n 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey',\n 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia',\n 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green',\n 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo',\n 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen',\n 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',\n 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey',\n 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue',\n 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow',\n 'lime', 'limegreen', 'linen', 'magenta', 'maroon',\n 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple',\n 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen',\n 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream',\n 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive',\n 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod',\n 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip',\n 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'red',\n 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown',\n 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue',\n 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan',\n 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat',\n 'white', 'whitesmoke', 'yellow', 'yellowgreen', 'rebeccapurple'],\n // for unit tests\n Cycle: Cycle,\n History: History,\n Stack: Stack,\n // ---------------------------------------------------------------------\n // :: Validate html color (it can be name or hex)\n // ---------------------------------------------------------------------\n valid_color: function valid_color(color) {\n if (color.match(color_re)) {\n return true;\n } else {\n return $.inArray(color.toLowerCase(), $.terminal.color_names) !== -1;\n }\n },\n // ---------------------------------------------------------------------\n // :: function check if given string contain invalid strings\n // ---------------------------------------------------------------------\n unclosed_strings: function unclosed_strings(string) {\n return !!string.match(unclosed_strings_re);\n },\n // ---------------------------------------------------------------------\n // :: Escape all special regex characters, so it can be use as regex to\n // :: match exact string that contain those characters\n // ---------------------------------------------------------------------\n escape_regex: function escape_regex(str) {\n if (typeof str === 'string') {\n var special = /([-\\\\^$[\\]()+{}?*.|])/g;\n return str.replace(special, '\\\\$1');\n }\n },\n // ---------------------------------------------------------------------\n // :: test if string contain formatting\n // ---------------------------------------------------------------------\n have_formatting: function have_formatting(str) {\n return typeof str === 'string' && !!str.match(format_exist_re);\n },\n // ---------------------------------------------------------------------\n is_formatting: function is_formatting(str) {\n return typeof str === 'string' && !!str.match(format_full_re);\n },\n // ---------------------------------------------------------------------\n is_extended_command: function is_extended_command(str) {\n return typeof str === 'string' &&\n str.match(format_exec_re) &&\n !$.terminal.is_formatting(str);\n },\n // ---------------------------------------------------------------------\n each_extended_command: function(string, fn) {\n var parts = string.split(format_exec_split_re);\n return $.map(parts, function(string) {\n if ($.terminal.is_extended_command(string)) {\n var command = string.replace(/^\\[\\[|\\]\\]$/g, '');\n return fn(command) || '';\n }\n return string;\n }).join('');\n },\n // ---------------------------------------------------------------------\n // :: return array of formatting and text between them\n // ---------------------------------------------------------------------\n format_split: function format_split(str) {\n return str.split(format_split_re).filter(Boolean);\n },\n // ---------------------------------------------------------------------\n // :: replace that return position after replace for working with\n // :: replacement that change length of the string\n // :: source https://stackoverflow.com/a/46756077/387194\n // ---------------------------------------------------------------------\n tracking_replace: function tracking_replace(string, rex, replacement, position) {\n if (!(rex instanceof RegExp)) {\n throw new Error('tracking_replace: Second argument need to be RegExp');\n }\n function substring(string, start, end) {\n return string.slice(start, end);\n }\n function length(string) {\n return $.terminal.strip(string).length;\n }\n var new_string = \"\";\n var match;\n var index = 0;\n var rep_string;\n var new_position = position;\n var start;\n rex.lastIndex = 0; // Just to be sure\n while ((match = rex.exec(string))) {\n // if regex don't have g flag lastIndex will not work\n if (rex.global) {\n // Add any of the original string we just skipped\n var last_index = length(substring(string, 0, rex.lastIndex));\n start = last_index - length(match[0]);\n } else {\n start = match.index;\n last_index = start + length(match[0]);\n }\n if (index < start) {\n new_string += substring(string, index, start);\n }\n index = last_index;\n // Build the replacement string. This just handles $$ and $n,\n // you may want to add handling for $`, $', and $&.\n if (typeof replacement === 'function') {\n rep_string = replacement.apply(null, match);\n } else {\n rep_string = replacement.replace(/\\$(\\$|\\d)/g, function(m, c0) {\n if (c0 === \"$\") {\n return \"$\";\n }\n return match[c0];\n });\n }\n // Add on the replacement\n new_string += rep_string;\n // If the position is affected...\n if (start < position) {\n // ... update it:\n var rep_len = length(rep_string);\n rep_len += count_selfclosing_formatting(rep_string);\n if (last_index < position) {\n // It's after the replacement, move it\n new_position = Math.max(\n 0,\n new_position +\n rep_len -\n length(match[0])\n );\n } else {\n // It's *in* the replacement, put it just after\n new_position += rep_len - (position - start);\n }\n }\n // If the regular expression doesn't have the g flag, break here so\n // we do just one replacement (and so we don't have an endless loop!)\n if (!rex.global) {\n break;\n }\n }\n // Add on any trailing text in the string\n if (index < length(string)) {\n new_string += substring(string, index);\n }\n // Return the string and the updated position\n if (string === new_string) {\n return [string, position];\n }\n return [new_string, new_position];\n },\n // ---------------------------------------------------------------------\n // :: helper function used by substring and split_equal it loop over\n // :: string and execute callback with text count and other data\n // ---------------------------------------------------------------------\n iterate_formatting: function iterate_formatting(string, callback) {\n function is_any_space(str) {\n return str === ' ' || str === '\\t' || str === '\\n';\n }\n // ----------------------------------------------------------------\n function is_space(i) {\n if (!have_entities) {\n return is_any_space(string[i - 1]);\n }\n return string.slice(i - 6, i) === ' ' ||\n is_any_space(string[i - 1]);\n }\n // ----------------------------------------------------------------\n function match_entity(index) {\n if (!have_entities) {\n return null;\n }\n return string.slice(index).match(entity_re);\n }\n // ----------------------------------------------------------------\n function is_open_formatting(i) {\n return string[i] === '[' && string[i + 1] === '[';\n }\n // ----------------------------------------------------------------\n function is_escape_bracket(i) {\n return string[i - 1] !== '\\\\' && string[i] === '\\\\' &&\n string[i + 1] === ']';\n }\n // ----------------------------------------------------------------\n function is_bracket(i) {\n return string[i] === ']' || string[i] === '[';\n }\n // ----------------------------------------------------------------\n function is_text(i) {\n return (not_formatting && !opening &&\n ((string[i] !== ']' && !closing_formatting) ||\n !have_formatting)) || (in_text && !formatting);\n }\n // ----------------------------------------------------------------\n // :: function will skip to next character in main loop\n // :: TODO: improve performance of emoji regex and check whole\n // :: string it's complex string if not use simple function\n // ----------------------------------------------------------------\n var get_next_character = make_next_char_fun(string);\n function next_iteration() {\n var char = get_next_character(substring);\n if (char.length > 1 && $.terminal.length(substring) > 1) {\n return char.length - 1;\n }\n return 0;\n }\n // ----------------------------------------------------------------\n function is_next_space() {\n return (is_space(i) && (not_formatting || opening)) &&\n (space === -1 && prev_space !== i || space !== -1);\n }\n // ----------------------------------------------------------------\n // :: last iteration or one before closing formatting\n // ----------------------------------------------------------------\n var last = false;\n function is_last() {\n if (i === string.length - 1 && !last) {\n last = true;\n } else {\n last = formatting && !!substring.match(/^.]$/);\n }\n return last;\n }\n // ----------------------------------------------------------------\n var have_formatting = $.terminal.have_formatting(string);\n var have_entities = entity_re.test(string);\n var formatting = '';\n var in_text = false;\n var count = 0;\n var match;\n var space = -1;\n var space_count = -1;\n var prev_space;\n var length = 0;\n var offset = 0;\n var re_ent = /(&[^;]+);$/;\n for (var i = 0; i < string.length; i++) {\n var substring = string.slice(i);\n var closing_formatting = false;\n match = substring.match(format_start_re);\n if (match) {\n formatting = match[1];\n in_text = false;\n } else if (formatting) {\n if (string[i] === ']') {\n closing_formatting = in_text;\n if (in_text) {\n formatting = '';\n in_text = false;\n } else {\n in_text = true;\n }\n }\n } else {\n in_text = true;\n }\n var not_formatting = (formatting && in_text) || !formatting;\n var opening = is_open_formatting(i);\n if (is_next_space()) {\n space = i;\n space_count = count;\n }\n var braket = is_bracket(i);\n offset = 0;\n if (not_formatting) {\n // treat entity as one character\n if (string[i] === '&') {\n match = match_entity(i);\n if (match) {\n i += match[1].length - 2; // 2 because continue adds 1 to i\n continue;\n }\n ++count;\n ++length;\n } else if (is_escape_bracket(i)) {\n // escape \\] and \\\\ counts as one character\n ++count;\n ++length;\n offset = 1;\n i += 1;\n } else if (!braket || !have_formatting || (in_text && !formatting)) {\n ++count;\n ++length;\n }\n }\n if (is_text(i)) {\n if (strlen(string[i]) === 2) {\n length++;\n }\n var char = get_next_character(substring);\n var size = char.length;\n // begining of enity that we've skipped, we are at the end\n if (char === ';') {\n match = string.slice(0, i + 1).match(re_ent);\n if (match) {\n offset = match[1].length;\n size = offset + 1;\n }\n }\n var data = {\n last: is_last(),\n count: count,\n index: i - offset,\n formatting: formatting,\n length: length,\n text: in_text,\n size: size,\n space: space,\n space_count: space_count\n };\n var ret = callback(data);\n if (ret === false) {\n break;\n } else if (ret) {\n if (ret.count !== undefined) {\n count = ret.count;\n }\n if (ret.length !== undefined) {\n length = ret.length;\n }\n if (ret.space !== undefined) {\n prev_space = space;\n space = ret.space;\n }\n if (ret.index !== undefined) {\n i = ret.index;\n continue;\n }\n }\n } else if (i === string.length - 1 && !last) {\n // last iteration, if formatting have last bracket,\n // from formatting, then last iteration\n // was already called (in if) #550\n callback({\n last: true,\n count: count + 1,\n index: i,\n formatting: formatting,\n length: 0,\n text: in_text,\n space: space\n });\n }\n // handle emoji, suroggate pairs and combine characters\n if (in_text) {\n i += next_iteration();\n }\n }\n },\n // ---------------------------------------------------------------------\n // :: function return string splitted into single characters\n // :: each character is wrapped into formatting from input string\n // :: or empty formatting so it will create span when using with ::format\n // ---------------------------------------------------------------------\n partition: function partition(string, options) {\n var settings = $.extend({\n wrap: true\n }, options);\n if (!$.terminal.have_formatting(string)) {\n var chars = $.terminal.split_characters(string);\n return chars.map(wrap);\n }\n var result = [];\n function wrap(string) {\n if (string.match(/\\\\$/)) {\n string += '\\\\';\n }\n return '[[;;]' + string + ']';\n }\n function formatting(string) {\n if ($.terminal.is_formatting(string)) {\n if (string.match(/\\\\]$/)) {\n string = string.replace(/\\\\]/g, '\\\\\\\\]');\n }\n } else if (settings.wrap) {\n string = wrap(string);\n }\n return string;\n }\n $.terminal.iterate_formatting(string, function callback(data) {\n if (data.text) {\n var text = [];\n if (data.formatting) {\n text.push(data.formatting);\n }\n text.push(string.substring(data.index, data.index + data.size));\n if (data.formatting) {\n text.push(']');\n }\n result.push(formatting(text.join('')));\n }\n });\n return result;\n },\n // ---------------------------------------------------------------------\n // :: formatting aware substring function\n // ---------------------------------------------------------------------\n substring: function substring(string, start_index, end_index) {\n var chars = $.terminal.split_characters(string);\n if (!chars.slice(start_index, end_index).length) {\n return '';\n }\n if (!$.terminal.have_formatting(string)) {\n return chars.slice(start_index, end_index).join('');\n }\n var start = 0;\n var end;\n var start_formatting = '';\n var end_formatting = '';\n var prev_index;\n var offset = 1;\n $.terminal.iterate_formatting(string, function callback(data) {\n if (start_index && data.count === start_index + 1) {\n start = data.index;\n if (data.formatting) {\n start_formatting = data.formatting;\n }\n }\n if (end_index && data.count === end_index) {\n end_formatting = data.formatting;\n prev_index = data.index;\n offset = data.size;\n }\n if (data.count === end_index + 1) {\n end = data.index;\n if (data.formatting) {\n end = prev_index + offset;\n }\n }\n });\n if (start_index && !start) {\n return '';\n }\n if (end === undefined) {\n end = string.length;\n }\n string = start_formatting + string.slice(start, end);\n if (end_formatting) {\n string = string.replace(/(\\[\\[^\\]]+)?\\]$/, '');\n string += ']';\n }\n return string;\n },\n // ---------------------------------------------------------------------\n // :: add format text as 5th paramter to formatting it's used for\n // :: data attribute in format function - and fix unclosed &\n // ---------------------------------------------------------------------\n normalize: function normalize(string) {\n string = string.replace(format_re, function callback(_, format, text) {\n if (format.match(self_closing_re) && text === '') {\n return '[[' + format + '] ]';\n }\n if (text === '') {\n return '';\n }\n function safe(string) {\n return string.replace(/\\\\\\]/g, ']').replace(/\\n/g, '\\\\n')\n .replace(/ /g, ' ');\n }\n format = safe(format);\n var semicolons = format.match(/;/g).length;\n // missing semicolons\n if (semicolons >= 4) {\n var args = format.split(/;/);\n var start = args.slice(0, 4).join(';');\n var arg = args.slice(4).join(';');\n return '[[' + start + ';' + (arg || text) + ']' + text + ']';\n } else if (semicolons === 2) {\n semicolons = ';;';\n } else if (semicolons === 3) {\n semicolons = ';';\n }\n // return '[[' + format + ']' + text + ']';\n // closing braket will break formatting so we need to escape\n // those using html entity equvalent\n // space is hack for images that break iterate_formatting\n format += semicolons + safe(text);\n return '[[' + format + ']' + text + ']';\n });\n return $.terminal.amp(string);\n },\n // ---------------------------------------------------------------------\n // :: split text into lines with equal length so each line can be\n // :: rendered separately (text formatting can be longer then a line).\n // ---------------------------------------------------------------------\n split_equal: function split_equal(str, length, options) {\n if (typeof options === 'boolean') {\n options = {\n keepWords: options\n };\n }\n var settings = $.extend({\n trim: false,\n keepWords: false\n }, options);\n var prev_format = '';\n var result = [];\n var array = $.terminal.normalize(str).split(/\\n/g);\n var have_formatting = $.terminal.have_formatting(str);\n for (var i = 0, len = array.length; i < len; ++i) {\n if (array[i] === '') {\n result.push('');\n continue;\n }\n var line = array[i];\n var get_next_character = make_next_char_fun(line);\n var first_index = 0;\n var output;\n var line_length = line.length;\n var last_bracket = /\\[\\[[^\\]]+\\](?:[^\\][]|\\\\\\])+\\]$/.test(line);\n var leading_spaces = /^( |\\s)/.test(line);\n if (!have_formatting && line_length < length) {\n result.push(line);\n continue;\n }\n $.terminal.iterate_formatting(line, function callback(data) {\n var chr, substring;\n if (data.length >= length || data.last ||\n (data.length === length - 1 &&\n strlen(line[data.index + 1]) === 2)) {\n var can_break = false;\n // TODO: this need work\n if (settings.keepWords && data.space !== -1) {\n // replace html entities with characters\n var stripped = text(line).substring(data.space_count);\n // real length, not counting formatting\n stripped = stripped.slice(0, length).replace(/\\s+$/, '');\n var text_len = strlen(stripped);\n if (space_re.test(stripped) || text_len < length) {\n can_break = true;\n }\n }\n // if words is true we split at last space and make next loop\n // continue where the space where located\n var after_index = data.index + data.size;\n if (last_bracket) {\n after_index += 1;\n }\n var new_index;\n if (settings.keepWords && data.space !== -1 &&\n after_index !== line_length && can_break) {\n output = line.slice(first_index, data.space);\n new_index = data.space - 1;\n } else {\n substring = line.slice(data.index);\n chr = get_next_character(substring);\n output = line.slice(first_index, data.index) + chr;\n if (data.last && last_bracket && chr !== ']') {\n output += ']';\n }\n new_index = data.index + chr.length - 1;\n }\n if (settings.trim || settings.keepWords) {\n output = output.replace(/( |\\s)+$/g, '');\n }\n if (!leading_spaces && !prev_format) {\n output = output.replace(/^( |\\s)+/g, '');\n }\n first_index = (new_index || data.index) + 1;\n if (prev_format) {\n var closed_formatting = /^[^\\]]*\\]/.test(output);\n output = prev_format + output;\n if (closed_formatting) {\n prev_format = '';\n }\n }\n var matched = output.match(format_re);\n if (matched) {\n var last = matched[matched.length - 1];\n if (last[last.length - 1] !== ']') {\n prev_format = last.match(format_begin_re)[1];\n output += ']';\n } else if (format_end_re.test(output)) {\n output = output.replace(format_end_re, '');\n prev_format = last.match(format_begin_re)[1];\n }\n }\n result.push(output);\n // modify loop by returing new data\n return {index: new_index, length: 0, space: -1};\n }\n });\n }\n return result;\n },\n // ---------------------------------------------------------------------\n // :: Escape & that's not part of entity\n // ---------------------------------------------------------------------\n amp: function amp(str) {\n return str.replace(/&(?!#[0-9]+;|#x[0-9a-f]+;|[a-z]+;)/gi, '&');\n },\n // ---------------------------------------------------------------------\n // :: Encode formating as html for insertion into DOM\n // ---------------------------------------------------------------------\n encode: function encode(str, options) {\n var settings = $.extend({\n tabs: 4,\n before: ''\n }, options);\n return $.terminal.amp(str).replace(/</g, '<').replace(/>/g, '>')\n .replace(/ /g, ' ').split('\\n').map(function(line) {\n var splitted = line.split(/((?:\\[\\[[^\\]]+\\])?\\t(?:\\])?)/);\n splitted = splitted.filter(Boolean);\n return splitted.map(function(str, i) {\n if (str.match(/\\t/)) {\n return str.replace(/\\t([^\\t]*)$/, function(_, end) {\n if (i !== 0 && splitted[i - 1].match(/\\t\\]?$/)) {\n var sp = new Array(settings.tabs + 1).join(' ');\n return sp + end;\n } else {\n var before = splitted.slice(i - 1, i).join('');\n if (settings.before && i <= 1) {\n before = settings.before + before;\n }\n var len = $.terminal.length(before);\n var chars = settings.tabs - (len % settings.tabs);\n if (chars === 0) {\n chars = 4;\n }\n return new Array(chars + 1).join(' ') + end;\n }\n });\n }\n return str;\n }).join('');\n }).join('\\n');\n },\n // -----------------------------------------------------------------------\n // :: Default formatter that allow for nested formatting, example:\n // :: [[;;#000]hello [[;#f00;]red] world]\n // -----------------------------------------------------------------------\n nested_formatting: function nested_formatting(string) {\n if (!$.terminal.have_formatting(string)) {\n return string;\n }\n var stack = [];\n var re = /((?:\\[\\[(?:[^\\][]|\\\\\\])+\\])?(?:[^\\][]|\\\\\\])*\\]?)/;\n var format_re = /\\[\\[([^\\][]+)\\][\\s\\S]*/;\n var format_split_re = /^\\[\\[([^;]*);([^;]*);([^\\]]*)\\]/;\n var class_i = 3; // index of the class in formatting\n var attrs_i = 5; // index of attributes in formatting\n // ---------------------------------------------------------------------------\n function unique(value, index, self) {\n return self.indexOf(value) === index;\n }\n // ---------------------------------------------------------------------------\n function update_style(new_style, old_style) {\n new_style = parse_style(new_style);\n if (!old_style) {\n return new_style;\n }\n return $.extend(old_style, new_style);\n }\n // ---------------------------------------------------------------------------\n function parse_style(string) {\n var style = {};\n string.split(/\\s*;\\s*/).forEach(function(string) {\n var parts = string.split(':').map(function(string) {\n return string.trim();\n });\n var prop = parts[0];\n var value = parts[1];\n style[prop] = value;\n });\n return style;\n }\n // ---------------------------------------------------------------------------\n function stringify_formatting(input) {\n var result = input.slice();\n if (input[attrs_i]) {\n result[attrs_i] = stringify_attrs(input[attrs_i]);\n }\n if (input[class_i]) {\n result[class_i] = stringify_class(input[class_i]);\n }\n result[0] = stringify_styles(input[0]);\n return result.join(';');\n }\n // ---------------------------------------------------------------------------\n function stringify_styles(input) {\n var ignore = input.filter(function(s) {\n return s[0] === '-';\n }).map(function(s) {\n return s[1];\n });\n return input.filter(function(s) {\n return ignore.indexOf(s) === -1 && ignore.indexOf(s[1]) === -1;\n }).join('');\n }\n // ---------------------------------------------------------------------------\n function stringify_attrs(attrs) {\n return JSON.stringify(attrs, function(key, value) {\n if (key === 'style') {\n return stringify_style(value);\n }\n return value;\n });\n }\n // ---------------------------------------------------------------------------\n function stringify_class(klass) {\n return klass.filter(unique).join(' ');\n }\n // ---------------------------------------------------------------------------\n function stringify_style(style) {\n return Object.keys(style).map(function(prop) {\n return prop + ':' + style[prop];\n }).join(';');\n }\n // ---------------------------------------------------------------------------\n function get_inherit_style(stack) {\n function update_attrs(value) {\n if (!output[attrs_i]) {\n output[attrs_i] = {};\n }\n try {\n var new_attrs = JSON.parse(value);\n if (new_attrs.style) {\n var new_style = new_attrs.style;\n var old_style = output[attrs_i].style;\n new_attrs.style = update_style(new_style, old_style);\n output[attrs_i] = $.extend(\n new_attrs,\n output[attrs_i],\n {\n style: update_style(new_style, old_style)\n }\n );\n } else {\n output[attrs_i] = $.extend(\n new_attrs,\n output[attrs_i]\n );\n }\n } catch (e) {\n warn('Invalid JSON ' + value);\n }\n }\n var output = [[], '', ''];\n if (!stack.length) {\n return output;\n }\n for (var i = stack.length; i--;) {\n var formatting = $.terminal.parse_formatting(stack[i]);\n if (formatting.length > 5) {\n var last = formatting.slice(5).join(';');\n formatting = formatting.slice(0, 5).concat(last);\n }\n var style = formatting[0].split(/(-?[@!gbiuso])/g).filter(Boolean);\n style.forEach(function(s) {\n if (output[0].indexOf(s) === -1) {\n output[0].push(s);\n }\n });\n for (var j = 1; j < formatting.length; ++j) {\n var value = formatting[j].trim();\n if (value) {\n if (j === class_i) {\n if (!output[class_i]) {\n output[class_i] = [];\n }\n var classes = value.split(/\\s+/);\n output[class_i] = output[class_i].concat(classes);\n } else if (j === attrs_i) {\n update_attrs(value);\n } else if (!output[j]) {\n output[j] = value;\n }\n }\n }\n }\n return stringify_formatting(output);\n }\n return string.split(re).filter(Boolean).map(function(string) {\n var style;\n if (string.match(/^\\[\\[/) && !$.terminal.is_extended_command(string)) {\n var formatting = string.replace(format_re, '$1');\n var is_formatting = $.terminal.is_formatting(string);\n string = string.replace(format_split_re, '');\n stack.push(formatting);\n if ($.terminal.nested_formatting.__inherit__) {\n style = get_inherit_style(stack);\n } else {\n style = formatting;\n }\n if (!is_formatting) {\n string += ']';\n } else {\n stack.pop();\n }\n string = '[[' + style + ']' + string;\n } else {\n var pop = false;\n if (string.match(/\\]/)) {\n pop = true;\n }\n if (stack.length) {\n if ($.terminal.nested_formatting.__inherit__) {\n style = get_inherit_style(stack);\n } else {\n style = stack[stack.length - 1];\n }\n string = '[[' + style + ']' + string;\n }\n if (pop) {\n stack.pop();\n } else if (stack.length) {\n string += ']';\n }\n }\n return string;\n }).join('');\n },\n // ---------------------------------------------------------------------\n // :: safe function that will render text as it is\n // ---------------------------------------------------------------------\n escape_formatting: function escape_formatting(string) {\n return $.terminal.escape_brackets(string);\n },\n // ---------------------------------------------------------------------\n // :: apply custom formatters only to text\n // ---------------------------------------------------------------------\n apply_formatters: function apply_formatters(string, settings) {\n if (string === \"\") {\n if (settings && typeof settings.position === 'number') {\n return [\"\", settings.position];\n } else {\n return \"\";\n }\n }\n function test_lengths(formatter, index, ret, string) {\n if (!formatter.__no_warn__ &&\n $.terminal.length(ret) !== $.terminal.length(string)) {\n warn('Your formatter[' + index + '] change length of the string, ' +\n 'you should use [regex, replacement] formatter or function ' +\n ' that return [replacement, position] instead');\n }\n }\n function should_format(options) {\n if (!settings || !options) {\n return true;\n }\n var props = ['echo', 'command', 'prompt'];\n var have_any = props.some(function(name) {\n return options[name] === true;\n });\n if (!have_any) {\n return true;\n }\n for (var i = props.length; i--;) {\n var prop = props[i];\n if (options[prop] === true && settings[prop] === true) {\n return true;\n }\n }\n return false;\n }\n settings = settings || {};\n var formatters = settings.formatters || $.terminal.defaults.formatters;\n var i = 0;\n function apply_function_formatter(formatter, input) {\n var options = $.extend({}, settings, {\n position: input[1]\n });\n var ret = formatter(input[0], options);\n if (typeof ret === 'string') {\n test_lengths(formatter, i - 1, ret, input[0]);\n if (typeof ret === 'string') {\n return [ret, options.position];\n }\n return input;\n } else if (is_array(ret) && ret.length === 2) {\n return ret;\n } else {\n return input;\n }\n }\n var input;\n if (typeof settings.position === 'number') {\n input = [string, settings.position];\n } else {\n input = [string, 0];\n }\n try {\n var result = formatters.reduce(function(input, formatter) {\n i++;\n // __meta__ is for safe formatter that can handle formatters\n // inside formatters. for other usage we use format_split so one\n // formatter don't mess with formatter that was previous\n // on the list\n if (typeof formatter === 'function' && formatter.__meta__) {\n return apply_function_formatter(formatter, input);\n } else {\n var length = 0;\n var found_position = false;\n var splitted = $.terminal.format_split(input[0]);\n var partials = splitted.map(function(string) {\n var position;\n var this_len = text(string).length;\n // first position that match is used for this partial\n if (input[1] < length + this_len && !found_position) {\n position = input[1] - length;\n found_position = true;\n } else if (found_position) {\n // -1 indicate that we will not track position because it\n // was in one of the previous parial strings\n position = -1;\n } else {\n // initial position for replacers\n position = input[1];\n }\n // length is used to correct position after replace\n var length_before = length;\n var result;\n length += this_len;\n if ($.terminal.is_formatting(string)) {\n if (found_position) {\n return [string, position];\n }\n return [string, -1];\n } else {\n if (is_array(formatter)) {\n var options = formatter[2] || {};\n result = [string, position < 0 ? 0 : position];\n if (result[0].match(formatter[0]) &&\n should_format(formatter[2])) {\n if (options.loop) {\n while (result[0].match(formatter[0])) {\n result = $.terminal.tracking_replace(\n result[0],\n formatter[0],\n formatter[1],\n result[1]\n );\n }\n } else {\n result = $.terminal.tracking_replace(\n result[0],\n formatter[0],\n formatter[1],\n result[1]\n );\n }\n }\n if (position < 0) {\n return [result[0], -1];\n }\n } else if (typeof formatter === 'function') {\n result = apply_function_formatter(formatter, [\n string, position\n ]);\n }\n if (typeof result !== 'undefined') {\n // correct position becuase it's relative\n // to partial and we need global for whole string\n if (result[1] !== -1) {\n result[1] += length_before;\n }\n var after_len = text(result[0]).length;\n if (after_len !== this_len) {\n }\n return result;\n }\n return [string, -1];\n }\n });\n var position_partial = partials.filter(function(partial) {\n return partial[1] !== -1;\n })[0];\n var string = partials.map(function(partial) {\n return partial[0];\n }).join('');\n var position;\n if (typeof position_partial === 'undefined') {\n position = input[1];\n } else {\n position = position_partial[1];\n }\n // to make sure that output position is not outside the string\n var max = text(string).length;\n max += count_selfclosing_formatting(string);\n if (position > max) {\n position = max;\n }\n if (string === input[0]) {\n return input;\n }\n var before = $.terminal.strip(input[0]);\n var after = $.terminal.strip(string);\n if (before === after) {\n return [string, input[1]];\n }\n return [string, position];\n }\n }, input);\n if (typeof settings.position === 'number') {\n var codepoint_len = $.terminal.strip(result[0]).length;\n if ($.terminal.length(result[0]) < codepoint_len) {\n var position = result[1];\n position = normalize_position(result[0], position);\n var max = $.terminal.length(result[0]);\n if (position > max) {\n position = max;\n }\n result[1] = position;\n }\n return result;\n } else {\n return result[0];\n }\n } catch (e) {\n var msg = 'Error in formatter [' + (i - 1) + ']';\n formatters.splice(i - 1);\n throw new $.terminal.Exception('formatting', msg, e.stack);\n }\n },\n // ---------------------------------------------------------------------\n // :: Replace brackets with html entities\n // ---------------------------------------------------------------------\n escape_brackets: function escape_brackets(string) {\n return string.replace(/\\[/g, '[')\n .replace(/\\]/g, ']')\n .replace(/\\\\/g, '\');\n },\n // ---------------------------------------------------------------------\n // :: complmentary function\n // ---------------------------------------------------------------------\n unescape_brackets: function unescape_brackets(string) {\n return string.replace(/[/g, '[')\n .replace(/]/g, ']')\n .replace(/\/g, '\\\\');\n },\n // ---------------------------------------------------------------------\n // :: return number of characters without formatting\n // ---------------------------------------------------------------------\n length: function length(string, raw) {\n if (!string) {\n return 0;\n }\n return $.terminal.split_characters(raw ? string : text(string)).length;\n },\n // ---------------------------------------------------------------------\n // :: split characters handling emoji, surogate pairs and combine chars\n // ---------------------------------------------------------------------\n split_characters: function split_characters(string) {\n if (is_simple_text(string)) {\n return string.split('');\n }\n var result = [];\n var get_next_character = make_next_char_fun(string);\n while (string.length) {\n var chr = get_next_character(string);\n string = string.slice(chr.length);\n result.push(chr);\n }\n return result;\n },\n // ---------------------------------------------------------------------\n // :: return string where array items are in columns padded spaces\n // :: after adding align tabs arr.join('\\t\\t') looks much better\n // ---------------------------------------------------------------------\n columns: function columns(array, cols, space) {\n array = array.map(function(value) {\n if (typeof value !== 'string') {\n return String(value);\n }\n return value;\n });\n var no_formatting = array.map(function(value) {\n return $.terminal.strip(value);\n });\n var lengths = no_formatting.map(function(string) {\n return strlen(string);\n });\n if (typeof space === 'undefined') {\n space = 4;\n }\n var length = Math.max.apply(null, lengths) + space;\n // we need value - 1 because index starts from 0\n var column_limit = Math.floor(cols / length) - 1;\n if (column_limit < 1) {\n return array.join('\\n');\n }\n var lines = [];\n for (var i = 0, len = array.length; i < len; i += column_limit) {\n var line = array.slice(i, i + column_limit);\n var last = line.pop();\n lines.push(line.reduce(function(acc, string) {\n var stripped = $.terminal.strip(string);\n var pad = new Array(length - stripped.length + 1).join(' ');\n acc.push(string + pad);\n return acc;\n }, []).join('') + last);\n }\n return lines.join('\\n');\n },\n // ---------------------------------------------------------------------\n // :: Remove formatting from text\n // ---------------------------------------------------------------------\n strip: function strip(str) {\n if (!$.terminal.have_formatting(str)) {\n return str;\n }\n return $.terminal.format_split(str).map(function(str) {\n if ($.terminal.is_formatting(str)) {\n str = str.replace(format_parts_re, '$6');\n return str.replace(/\\\\([[\\]])/g, function(whole, bracket) {\n return bracket;\n });\n }\n return str;\n }).join('');\n },\n // ---------------------------------------------------------------------\n // :: Return active terminal\n // ---------------------------------------------------------------------\n active: function active() {\n return terminals.front();\n },\n // ---------------------------------------------------------------------\n // :: Implmentation detail id is always length of terminals Cycle\n // ---------------------------------------------------------------------\n last_id: function last_id() {\n var len = terminals.length();\n return len - 1;\n },\n // ---------------------------------------------------------------------\n // :: Function that works with strings like 'asd' 'asd\\' asd' \"asd asd\"\n // :: asd\\ 123 -n -b / [^ ]+ / /\\s+/ asd\\ a it creates a regex and\n // :: numbers and replaces escape characters in double quotes\n // :: if strict is set to false it only strips single and double quotes\n // :: and escapes spaces\n // ---------------------------------------------------------------------\n parse_argument: function parse_argument(arg, strict) {\n function parse_string(string) {\n // split string to string literals and non-strings\n return string.split(string_re).map(function(string) {\n // remove quotes if before are even number of slashes\n // we don't remove slases becuase they are handled by JSON.parse\n if (string.match(/^['\"`]/)) {\n // fixing regex to match empty string is not worth it\n if (string === '\"\"' || string === \"''\" || string === \"``\") {\n return '';\n }\n var quote = string[0];\n var re = new RegExp(\"(\\\\\\\\\\\\\\\\(?:\\\\\\\\\\\\\\\\)*)\" + quote, \"g\");\n string = string.replace(re, '$1').replace(/^[`'\"]|[`'\"]$/g, '');\n if (quote === \"'\") {\n string = string.replace(/\"/g, '\\\\\"');\n }\n }\n string = '\"' + string + '\"';\n // use build in function to parse rest of escaped characters\n return JSON.parse(string);\n }).join('');\n }\n if (strict === false) {\n if (arg[0] === \"'\" && arg[arg.length - 1] === \"'\") {\n return arg.replace(/^'|'$/g, '');\n } else if (arg[0] === \"`\" && arg[arg.length - 1] === \"`\") {\n return arg.replace(/^`|`$/g, '');\n } else if (arg[0] === '\"' && arg[arg.length - 1] === '\"') {\n return arg.replace(/^\"|\"$/g, '').replace(/\\\\([\" ])/g, '$1');\n } else if (arg.match(/\\/.*\\/[gimy]*$/)) {\n return arg;\n } else if (arg.match(/['\"`]]/)) {\n // part of arg is in quote\n return parse_string(arg);\n } else {\n return arg.replace(/\\\\ /g, ' ');\n }\n }\n if (arg === 'true') {\n return true;\n } else if (arg === 'false') {\n return false;\n }\n var regex = arg.match(re_re);\n if (regex) {\n return new RegExp(regex[1], regex[2]);\n } else if (arg.match(/['\"`]/)) {\n return parse_string(arg);\n } else if (arg.match(/^-?[0-9]+n?$/)) {\n if (arg.match(/n$/)) {\n return BigInt(arg.replace(/n$/, ''));\n }\n return parseInt(arg, 10);\n } else if (arg.match(float_re)) {\n return parseFloat(arg);\n } else {\n return arg.replace(/\\\\(['\"() ])/g, '$1');\n }\n },\n // ---------------------------------------------------------------------\n // :: function split and parse arguments\n // ---------------------------------------------------------------------\n parse_arguments: function parse_arguments(string) {\n return $.map(string.match(command_re) || [], $.terminal.parse_argument);\n },\n // ---------------------------------------------------------------------\n // :: Function split and strips single and double quotes\n // :: and escapes spaces\n // ---------------------------------------------------------------------\n split_arguments: function split_arguments(string) {\n return $.map(string.match(command_re) || [], function(arg) {\n return $.terminal.parse_argument(arg, false);\n });\n },\n // ---------------------------------------------------------------------\n // :: Function that returns an object {name,args}. Arguments are parsed\n // :: using the function parse_arguments\n // ---------------------------------------------------------------------\n parse_command: function parse_command(string) {\n return process_command(string, $.terminal.parse_argument);\n },\n // ---------------------------------------------------------------------\n // :: Same as parse_command but arguments are parsed using split_arguments\n // ---------------------------------------------------------------------\n split_command: function split_command(string) {\n return process_command(string, function(arg) {\n return $.terminal.parse_argument(arg, false);\n });\n },\n // ---------------------------------------------------------------------\n // :; function that parse arguments like yargs library\n // ---------------------------------------------------------------------\n parse_options: function parse_options(arg, options) {\n var settings = $.extend({}, {\n boolean: []\n }, options);\n if (typeof arg === 'string') {\n return parse_options($.terminal.split_arguments(arg), options);\n }\n var result = {\n _: []\n };\n function token(value) {\n this.value = value;\n }\n var rest = arg.reduce(function(acc, arg) {\n var str = typeof arg === 'string' ? arg : '';\n if (str.match(/^--?[^-]/) && acc instanceof token) {\n result[acc.value] = true;\n }\n if (str.match(/^--[^-]/)) {\n var name = str.replace(/^--/, '');\n if (settings.boolean.indexOf(name) === -1) {\n return new token(name);\n } else {\n result[name] = true;\n }\n } else if (str.match(/^-[^-]/)) {\n var single = str.replace(/^-/, '').split('');\n if (settings.boolean.indexOf(single.slice(-1)[0]) === -1) {\n var last = single.pop();\n }\n single.forEach(function(single) {\n result[single] = true;\n });\n if (last) {\n return new token(last);\n }\n } else if (acc instanceof token) {\n result[acc.value] = arg;\n } else if (arg) {\n result._.push(arg);\n }\n return null;\n }, null);\n if (rest instanceof token) {\n result[rest.value] = true;\n }\n return result;\n },\n // ---------------------------------------------------------------------\n // :: helper function that return array of formatting\n // :: it handles html entites inside text #735\n // ---------------------------------------------------------------------\n parse_formatting: function(string) {\n var formatting = $.terminal.unescape_brackets(string).split(';');\n var text_part = 4;\n if (formatting.length >= 5) {\n var escaped = $.terminal.escape_brackets(formatting[text_part]);\n formatting[text_part] = escaped;\n }\n return formatting;\n },\n // ---------------------------------------------------------------------\n // :: function executed for each text inside [[ .... ]] in echo\n // ---------------------------------------------------------------------\n extended_command: function extended_command(term, string, options) {\n var settings = $.extend({\n invokeMethods: false\n }, options);\n var deferred = new $.Deferred();\n try {\n change_hash = false;\n var m = string.match(extended_command_re);\n if (m) {\n if (!settings.invokeMethods) {\n warn('To invoke terminal or cmd methods you need to enable ' +\n 'invokeMethods option');\n deferred.reject();\n } else {\n string = m[1];\n var obj = m[2] === 'terminal' ? term : term.cmd();\n var fn = m[3];\n try {\n var args = eval('[' + m[4] + ']');\n if (!obj[fn]) {\n term.error('Unknow function ' + fn);\n } else {\n var ret = obj[fn].apply(term, args);\n if (ret && ret.then) {\n return ret;\n }\n }\n deferred.resolve();\n } catch (e) {\n term.error('Invalid invocation in ' +\n $.terminal.escape_brackets(string));\n deferred.reject();\n }\n }\n } else {\n return term.exec(string, true).done(function() {\n change_hash = true;\n });\n }\n } catch (e) {\n // error is process in exec\n deferred.reject();\n }\n return deferred.promise();\n },\n // ---------------------------------------------------------------------\n // :: ES6 iterator for a given string that handle emoji and formatting\n // ---------------------------------------------------------------------\n iterator: function(string) {\n function formatting(string) {\n if ($.terminal.is_formatting(string)) {\n if (string.match(/\\]\\\\\\]/)) {\n string = string.replace(/\\]\\\\\\]/g, ']\\\\\\\\]');\n }\n }\n return string;\n }\n if (typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol') {\n var len = $.terminal.length(string);\n var i = 0;\n var obj = {};\n obj[Symbol.iterator] = function() {\n return {\n next: function() {\n if (i < len) {\n var text = $.terminal.substring(string, i, i + 1);\n i++;\n return {\n value: formatting(text)\n };\n } else {\n return {\n done: true\n };\n }\n }\n };\n };\n return obj;\n }\n },\n // ---------------------------------------------------------------------\n // :: object that can be used in string methods intead of regex\n // ---------------------------------------------------------------------\n formatter: new (function() {\n try {\n this[Symbol.split] = function(string) {\n return $.terminal.format_split(string);\n };\n this[Symbol.match] = function(string) {\n return string.match(format_re);\n };\n this[Symbol.replace] = function(string, replacer) {\n return string.replace(format_parts_re, replacer);\n };\n this[Symbol.search] = function(string) {\n return string.search(format_re);\n };\n } catch (e) {\n }\n })(),\n // ---------------------------------------------------------------------\n // :: Function return array of pre processed formatting\n // :: each item is array of style, color, background, and text\n // :: if the element is not present or if it's normal text\n // :: the element is empty string\n // ---------------------------------------------------------------------\n process_formatting: function(string) {\n return $.terminal.format_split(string).map(function(string) {\n if ($.terminal.is_formatting(string)) {\n var parts = string.match(new RegExp(format_parts_re, 'i'));\n var text = parts.pop();\n for (var i = 1; i <= 2; ++i) {\n if (!$.terminal.valid_color(parts[i])) {\n parts[i] = '';\n }\n }\n return parts.slice(1, 4).concat(text);\n } else {\n return ['', '', '', string];\n }\n });\n },\n // ---------------------------------------------------------------------\n // :: helper function that add formatter before nested_formatting\n // ---------------------------------------------------------------------\n new_formatter: function(formatter) {\n var formatters = $.terminal.defaults.formatters;\n for (var i = 0; i < formatters.length; ++i) {\n if (formatters[i] === $.terminal.nested_formatting) {\n formatters.splice(i, 0, formatter);\n return;\n }\n }\n formatters.push(formatter);\n }\n };\n (function() {\n // ---------------------------------------------------------------------\n function clean_data(data, text) {\n if (data === '') {\n return text;\n } else {\n return data.replace(/]/g, ']')\n .replace(/>/g, '>')\n .replace(/</g, '<')\n .replace(/\"/g, '"');\n }\n }\n // ---------------------------------------------------------------------\n // test if this is valid Path\n // ---------------------------------------------------------------------\n function is_path(url) {\n return url.match(/^\\.{1,2}\\//) ||\n url.match(/^\\//) ||\n !(url.match(/\\//) || url.match(/^[^:]+:/));\n }\n // ---------------------------------------------------------------------\n function with_url_validation(fn, settings) {\n return function(url) {\n if (settings.anyLinks) {\n return true;\n }\n var test = fn(url);\n if (!test) {\n warn('Invalid URL ' + url + ' only http(s) ftp and path ' +\n 'are allowed');\n }\n return test;\n };\n }\n // ---------------------------------------------------------------------\n // :: Replace terminal formatting with html\n // ---------------------------------------------------------------------\n $.terminal.format = function format(str, options) {\n var settings = $.extend({}, {\n linksNoReferrer: false,\n linksNoFollow: false,\n allowedAttributes: [],\n charWidth: undefined,\n escape: true,\n anyLinks: false\n }, options || {});\n // -----------------------------------------------------------------\n var valid_href = with_url_validation(function(url) {\n return url.match(/^((https?|file|ftp):\\/\\/|\\.{0,2}\\/)/) || is_path(url);\n }, settings);\n // -----------------------------------------------------------------\n var valid_src = with_url_validation(function(url) {\n return url.match(/^(https?:|file:|blob:|data:)/) || is_path(url);\n }, settings);\n // -----------------------------------------------------------------\n function filter_attr_names(names) {\n if (names.length && settings.allowedAttributes.length) {\n return names.filter(function(name) {\n if (name === 'data-text') {\n return false;\n }\n var allowed = false;\n var filters = settings.allowedAttributes;\n for (var i = 0; i < filters.length; ++i) {\n if (filters[i] instanceof RegExp) {\n if (filters[i].test(name)) {\n allowed = true;\n break;\n }\n } else if (filters[i] === name) {\n allowed = true;\n break;\n }\n }\n return allowed;\n });\n }\n return [];\n }\n // -----------------------------------------------------------------\n function attrs_to_string(style, attrs, valid_attrs) {\n if (attrs) {\n if (valid_attrs.length) {\n var style_attrs;\n var result = valid_attrs.map(function(name) {\n if (attrs[name] === null) {\n return '';\n }\n if (attrs[name] === true) {\n return name;\n }\n var value = escape_html_attr(attrs[name]);\n if (name === 'style') {\n // merge style attr and colors #617\n value = value ? style + ';' + value : style;\n style_attrs = true;\n }\n return name + '=\"' + value + '\"';\n }).filter(Boolean);\n if (!result.length) {\n return '';\n }\n if (!style_attrs && style) {\n // if there are not style attr we need to add style\n result.push('style=\"' + style + '\"');\n }\n return result.join(' ');\n }\n }\n if (!style) {\n return '';\n }\n return 'style=\"' + style + '\"';\n }\n // -----------------------------------------------------------------\n function rel_attr() {\n var rel = [\"noopener\"];\n if (settings.linksNoReferrer) {\n rel.unshift(\"noreferrer\");\n }\n if (settings.linksNoFollow) {\n rel.unshift(\"nofollow\");\n }\n return rel;\n }\n // -----------------------------------------------------------------\n var default_rel = rel_attr().join(' ');\n // -----------------------------------------------------------------\n function pre_process_link(data, attrs, valid_attrs) {\n if (data.match(email_re)) {\n return '<a href=\"mailto:' + data + '\"';\n } else {\n // only http and ftp links (prevent javascript)\n // unless user force it with anyLinks option\n var result = ['<a'];\n if (data && valid_href(data)) {\n result.push('href=\"' + data + '\"');\n }\n if (attrs) {\n if (valid_attrs.includes('target') &&\n attrs.target === undefined) {\n attrs.target = '_blank';\n }\n if (valid_attrs.includes('rel') &&\n attrs.rel === undefined) {\n attrs.rel = default_rel;\n }\n } else {\n result.push('rel=\"' + default_rel + '\"');\n result.push('target=\"_blank\"');\n }\n return result.join(' ');\n }\n }\n // -----------------------------------------------------------------\n function pre_process_image(data) {\n var result = '<img';\n if (valid_src(data)) {\n result += ' src=\"' + data + '\"';\n if (text) {\n result += ' alt=\"' + text + '\"';\n }\n }\n return result;\n }\n // -----------------------------------------------------------------\n function format(s, style, color, background, _class, data_text, text) {\n var attrs;\n var valid_attrs = [];\n if (data_text.match(/;/)) {\n try {\n var splitted = data_text.split(';');\n var str = splitted.slice(1).join(';')\n .replace(/ /g, ' ')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n if (str.match(/^\\s*\\{[^}]*\\}\\s*$/)) {\n attrs = JSON.parse(str);\n valid_attrs = filter_attr_names(Object.keys(attrs));\n data_text = splitted[0];\n }\n } catch (e) {\n }\n }\n if (text === '' && !style.match(/@/)) {\n return ''; //'<span> </span>';\n }\n text = safe(text);\n text = text.replace(/\\\\\\]/g, ']');\n if (settings.escape) {\n // inside formatting we need to unescape escaped slashes\n // but this escape is not needed when echo - don't know why\n text = text.replace(/\\\\\\\\/g, '\\\\');\n }\n var styles = {};\n if (style.indexOf('b') !== -1) {\n styles['font-weight'] = 'bold';\n }\n var text_decoration = [];\n if (style.indexOf('u') !== -1) {\n text_decoration.push('underline');\n }\n if (style.indexOf('s') !== -1) {\n text_decoration.push('line-through');\n }\n if (style.indexOf('o') !== -1) {\n text_decoration.push('overline');\n }\n if (text_decoration.length) {\n styles['text-decoration'] = text_decoration.join(' ');\n }\n if (style.indexOf('i') !== -1) {\n styles['font-style'] = 'italic';\n }\n if ($.terminal.valid_color(color)) {\n $.extend(styles, {\n 'color': color,\n '--color': color,\n '--original-color': color\n });\n if (style.indexOf('!') !== -1) {\n styles['--link-color'] = color;\n }\n if (style.indexOf('g') !== -1) {\n styles['text-shadow'] = '0 0 5px ' + color;\n }\n }\n if ($.terminal.valid_color(background)) {\n $.extend(styles, {\n 'background-color': background,\n '--background': background\n });\n }\n var data = clean_data(data_text, text);\n var extra = extra_css(text, settings);\n if (extra) {\n text = wide_characters(text, settings);\n $.extend(styles, extra);\n }\n var result;\n var style_str = style_to_string(styles);\n if (style.indexOf('!') !== -1) {\n result = pre_process_link(data, attrs, valid_attrs);\n } else if (style.indexOf('@') !== -1) {\n result = pre_process_image(data);\n } else {\n result = '<span';\n }\n var output_attrs = attrs_to_string(style_str, attrs, valid_attrs);\n if (output_attrs) {\n result += ' ' + output_attrs;\n }\n if (_class !== '') {\n result += ' class=\"' + _class + '\"';\n }\n // links and image need data-text attribute cmd click behavior\n // formatter can return links.\n if (style.indexOf('!') !== -1) {\n result += ' data-text>' + text + '</a>';\n } else if (style.indexOf('@') !== -1) {\n result += ' data-text/>';\n } else {\n result += ' data-text=\"' + data + '\">' +\n '<span>' + text + '</span></span>';\n }\n return result;\n }\n if (typeof str === 'string') {\n // support for formating foo[[u;;]bar]baz[[b;#fff;]quux]zzz\n var splitted = $.terminal.format_split(str);\n str = $.map(splitted, function(text) {\n if (text === '') {\n return text;\n } else if ($.terminal.is_formatting(text)) {\n // fix inside formatting because encode is called\n // before format\n text = text.replace(/\\[\\[[^\\]]+\\]/, function(text) {\n return text.replace(/ /g, ' ');\n });\n return text.replace(format_parts_re, format);\n } else {\n text = safe(text);\n text = text.replace(/\\\\\\]/, ']');\n var data = clean_data(text);\n var extra = extra_css(text, settings);\n var prefix;\n if (extra) {\n text = wide_characters(text, settings);\n prefix = '<span style=\"' + style_to_string(extra) + '\"';\n } else {\n prefix = '<span';\n }\n return prefix + ' data-text=\"' + data + '\">' + text + '</span>';\n }\n }).join('');\n return str.replace(/<span><br\\s*\\/?><\\/span>/gi, '<br/>');\n } else {\n return '';\n }\n };\n })();\n // -------------------------------------------------------------------------\n $.terminal.Exception = function Terminal_Exception(type, message, stack) {\n if (arguments.length === 1) {\n this.message = arguments[0];\n this.type = 'TERMINAL';\n } else {\n this.type = type;\n this.message = message;\n if (stack) {\n this.stack = stack;\n }\n }\n };\n $.terminal.Exception.prototype = new Error();\n $.terminal.Exception.prototype.toString = function() {\n return this.message + '\\n' + this.stack;\n };\n // -----------------------------------------------------------------------\n // Helper plugins and functions\n // -----------------------------------------------------------------------\n $.fn.visible = function() {\n return this.css('visibility', 'visible');\n };\n $.fn.hidden = function() {\n return this.css('visibility', 'hidden');\n };\n // -----------------------------------------------------------------------\n var warnings = [];\n function warn(msg) {\n msg = '[jQuery Terminal] ' + msg;\n if (warnings.indexOf(msg) === -1) {\n warnings.push(msg);\n /* eslint-disable */\n if (console) {\n if (console.warn) {\n console.warn(msg);\n } else if (console.log) {\n console.log(msg);\n }\n /* eslint-enable */\n } else {\n // prevent catching in outer try..catch\n setTimeout(function() {\n throw new Error('WARN: ' + msg);\n }, 0);\n }\n }\n }\n // -----------------------------------------------------------------------\n // JSON-RPC CALL\n // -----------------------------------------------------------------------\n var ids = {}; // list of url based ids of JSON-RPC\n $.jrpc = function(url, method, params, success, error) {\n var deferred = new $.Deferred();\n var options;\n if ($.isPlainObject(url)) {\n options = url;\n } else {\n options = {\n url: url,\n method: method,\n params: params,\n success: success,\n error: error\n };\n }\n function validJSONRPC(response) {\n return typeof response.id === 'number' &&\n (typeof response.result !== 'undefined' ||\n typeof response.error !== 'undefined');\n }\n ids[options.url] = ids[options.url] || 0;\n var request = {\n 'jsonrpc': '2.0',\n 'method': options.method,\n 'params': options.params,\n 'id': ++ids[options.url]\n };\n function finalize(json, response, status, jqXHR) {\n if (validJSONRPC(json) || options.method === 'system.describe') {\n // don't catch errors in success callback\n if (options.success) {\n options.success(json, status, jqXHR);\n }\n deferred.resolve(json);\n } else {\n if (options.error) {\n options.error(jqXHR, 'Invalid JSON-RPC');\n }\n deferred.reject({message: 'Invalid JSON-RPC', response: response});\n }\n }\n $.ajax({\n url: options.url,\n beforeSend: function beforeSend(jxhr, settings) {\n if (is_function(options.request)) {\n options.request(jxhr, request);\n }\n settings.data = JSON.stringify(request);\n },\n success: function success(response, status, jqXHR) {\n var content_type = jqXHR.getResponseHeader('Content-Type');\n if (!content_type.match(/(application|text)\\/json/)) {\n warn('Response Content-Type is neither application/json' +\n ' nor text/json');\n }\n var json;\n try {\n json = JSON.parse(response);\n } catch (e) {\n if (options.error) {\n options.error(jqXHR, 'Invalid JSON', e);\n } else {\n throw new $.terminal.Exception('JSON', 'Invalid JSON', e.stack);\n }\n deferred.reject({message: 'Invalid JSON', response: response});\n return;\n }\n if (is_function(options.response)) {\n options.response(jqXHR, json);\n }\n if (is_function(options.intercept)) {\n var ret = options.intercept(request, json);\n if (ret) {\n return unpromise(ret, function(json) {\n var response = JSON.stringify(json);\n finalize(json, response, status, jqXHR);\n });\n }\n }\n finalize(json, response, status, jqXHR);\n },\n error: options.error,\n contentType: 'application/json',\n dataType: 'text',\n async: true,\n cache: false,\n // timeout: 1,\n type: 'POST'\n });\n return deferred.promise();\n };\n // -----------------------------------------------------------------------\n $.rpc = function(url, method, params) {\n var deferred = new $.Deferred();\n function success(res) {\n if (res.error) {\n deferred.reject(res.error);\n } else {\n deferred.resolve(res.result);\n }\n }\n function error(jqXHR, status, message) {\n deferred.reject({message: message});\n }\n $.jrpc(url, method, params, success, error);\n return deferred.promise();\n };\n // -----------------------------------------------------------------------\n function terminal_ready(term) {\n return !!(term.closest('body').length &&\n term.is(':visible') &&\n term.find('.cmd-prompt').length);\n }\n // -----------------------------------------------------------------------\n function format_stack_trace(stack) {\n stack = $.terminal.escape_brackets(stack);\n return stack.split(/\\n/g).map(function(trace) {\n // nested formatting will handle urls but that formatting\n // can be removed - this code was created before\n // that formatting existed (see commit ce01c3f5)\n return '[[;;;terminal-error]' +\n trace.replace(url_re, function(url) {\n return ']' + url + '[[;;;terminal-error]';\n }) + ']';\n }).join('\\n');\n }\n // -----------------------------------------------------------------------\n // :: Create fake terminal to calcualte the dimention of one character\n // :: this will make terminal work if terminal div is not added to the\n // :: DOM at init like with:\n // :: $('<div/>').terminal().echo('foo bar').appendTo('body');\n // -----------------------------------------------------------------------\n function get_char_size(term) {\n var result;\n if (terminal_ready(term)) {\n var $prompt = term.find('.cmd-prompt').clone().css({\n visiblity: 'hidden',\n position: 'absolute'\n });\n $prompt.appendTo(term.find('.cmd'))\n .html(' ')\n .wrap('<div class=\"cmd-wrapper\"/>');\n result = {\n width: $prompt.width(),\n height: $prompt.height()\n };\n $prompt.parent().remove();\n } else {\n var temp = $('<div class=\"terminal terminal-temp\"><div class=\"terminal-' +\n 'wrapper\"><div class=\"terminal-output\"><div><div class=\"te' +\n 'rminal-line\" style=\"float: left\"><span> </span></div' +\n '></div></div><div class=\"terminal-pixel\"></div></div>')\n .appendTo('body');\n temp.addClass(term.attr('class')).attr('id', term.attr('id'));\n if (term) {\n var style = term.attr('style');\n if (style) {\n style = style.split(/\\s*;\\s*/).filter(function(s) {\n return !s.match(/display\\s*:\\s*none/i);\n }).join(';');\n temp.attr('style', style);\n }\n }\n var node = temp.find('.terminal-line');\n result = {\n width: node.width(),\n height: node.height()\n };\n temp.remove();\n }\n return result;\n }\n // -----------------------------------------------------------------------\n // :: calculate numbers of characters\n // -----------------------------------------------------------------------\n function get_num_chars(terminal, char_size) {\n var width = terminal.find('.terminal-fill').width();\n var result = Math.floor(width / char_size.width);\n // random number to not get NaN in node.js but big enough to\n // not wrap exception\n return result || 1000;\n }\n // -----------------------------------------------------------------------\n // :: Calculate number of lines that fit without scroll\n // -----------------------------------------------------------------------\n function get_num_rows(terminal, char_size) {\n var filler = terminal.find('.terminal-fill');\n var height = filler.height();\n return Math.floor(height / char_size.height);\n }\n // -----------------------------------------------------------------------\n function all(array, fn) {\n var same = array.filter(function(item) {\n return item[fn]() === item;\n });\n return same.length === array.length;\n }\n // -----------------------------------------------------------------------\n function string_case(string) {\n var array = string.split('');\n if (all(array, 'toLowerCase')) {\n return 'lower';\n } else if (all(array, 'toUpperCase')) {\n return 'upper';\n } else {\n return 'mixed';\n }\n }\n // -----------------------------------------------------------------------\n function same_case(string) {\n return string_case(string) !== 'mixed';\n }\n // -----------------------------------------------------------------------\n // fix for jQuery bug\n function is_function(object) {\n return get_type(object) === 'function';\n }\n // -----------------------------------------------------------------------\n function is_object(object) {\n return object && typeof object === 'object';\n }\n // -----------------------------------------------------------------------\n function is_promise(object) {\n return is_object(object) && is_function(object.then || object.done);\n }\n // -----------------------------------------------------------------------\n function is_big_int(object) {\n return typeof object === 'bigint';\n }\n // -----------------------------------------------------------------------\n function is_deferred(object) {\n return is_promise(object) && is_function(object.promise);\n }\n // -----------------------------------------------------------------------\n if (!Array.isArray) {\n Array.isArray = function(arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n };\n }\n // -----------------------------------------------------------------------\n function is_array(object) {\n return Array.isArray(object);\n }\n // -----------------------------------------------------------------------\n function have_custom_font(term) {\n var custom_font = $(term).css('--font');\n if (!custom_font) {\n return false;\n }\n var fonts = Array.from(document.fonts.keys());\n var font = fonts.find(function(face) {\n return face.family === custom_font;\n });\n return !!font;\n }\n // -----------------------------------------------------------------------\n function get_type(object) {\n if (typeof object === 'function') {\n return 'function';\n }\n if (object === null) {\n return object + '';\n }\n if (Array.isArray(object)) {\n return 'array';\n }\n if (typeof object === 'object') {\n return 'object';\n }\n return typeof object;\n }\n // -----------------------------------------------------------------------\n // :: TERMINAL PLUGIN CODE\n // -----------------------------------------------------------------------\n var version_set = !$.terminal.version.match(/^\\{\\{/);\n var copyright = 'Copyright (c) 2011-2023 Jakub T. Jankiewicz ' +\n '<https://jcubic.pl/me>';\n var version_string = version_set ? ' v. ' + $.terminal.version : ' ';\n // regex is for placing version string aligned to the right\n var reg = new RegExp(' {' + version_string.length + '}$');\n var name_ver = 'jQuery Terminal Emulator' +\n (version_set ? version_string : '');\n // -----------------------------------------------------------------------\n // :: Terminal Signatures\n // -----------------------------------------------------------------------\n var signatures = [\n ['jQuery Terminal', '(c) 2011-2023 jcubic'],\n [name_ver, copyright.replace(/^Copyright | *<.*>/g, '')],\n [name_ver, copyright.replace(/^Copyright /, '')],\n [\n ' _______ ________ __',\n ' / / _ /_ ____________ _/__ ___/______________ _____ / /',\n ' __ / / // / // / _ / _/ // / / / _ / _/ / / \\\\/ / _ \\\\/ /',\n '/ / / // / // / ___/ // // / / / ___/ // / / / / /\\\\ / // / /__',\n '\\\\___/____ \\\\\\\\__/____/_/ \\\\__ / /_/____/_//_/_/_/_/_/ \\\\/\\\\__\\\\_\\\\___/',\n ' \\\\/ /____/ '\n .replace(reg, ' ') + version_string,\n copyright\n ],\n [\n ' __ _____ ________ ' +\n ' __',\n ' / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ ' +\n ' / /',\n ' __ / // // // // // _ // _// // / / // _ // _// // // \\\\/ // _ ' +\n '\\\\/ /',\n '/ / // // // // // ___// / / // / / // ___// / / / / // // /\\\\ // // ' +\n '/ /__',\n '\\\\___//____ \\\\\\\\___//____//_/ _\\\\_ / /_//____//_/ /_/ /_//_//_/ /_/ \\\\' +\n '__\\\\_\\\\___/',\n (' \\\\/ /____/ ' +\n ' ').replace(reg, '') + version_string,\n copyright\n ]\n ];\n // -----------------------------------------------------------------------\n // :: Default options\n // -----------------------------------------------------------------------\n // if set to false nested formatting will not process formatting, only text\n // between formatting, we need this option because we're flattening the formatting\n $.terminal.nested_formatting.__meta__ = true;\n // if set to false nested formatting will not inherit styles colors and attribues\n $.terminal.nested_formatting.__inherit__ = true;\n // nested formatting will always return different length so we silent the warning\n $.terminal.nested_formatting.__no_warn__ = true;\n $.terminal.defaults = {\n prompt: '> ',\n history: true,\n exit: true,\n clear: true,\n enabled: true,\n maskChar: '*',\n wrap: true,\n checkArity: true,\n raw: false,\n tabindex: 1,\n invokeMethods: false,\n exceptionHandler: null,\n pauseEvents: true,\n softPause: false,\n mousewheel: null,\n touchscroll: null,\n memory: false,\n cancelableAjax: true,\n processArguments: true,\n execAnimation: false,\n execAnimationDelay: 100,\n linksNoReferrer: false,\n externalPause: true,\n useCache: true,\n anyLinks: false,\n linksNoFollow: false,\n processRPCResponse: null,\n completionEscape: true,\n mobileDelete: is_mobile,\n convertLinks: true,\n extra: {},\n tabs: 4,\n historySize: 60,\n scrollObject: null,\n historyState: false,\n importHistory: false,\n historyFilter: null,\n echoCommand: true,\n scrollOnEcho: true,\n login: null,\n outputLimit: -1,\n formatters: [$.terminal.nested_formatting],\n unixFormatting: {\n escapeBrackets: false,\n ansiParser: {},\n ansiArt: false\n },\n onAjaxError: null,\n pasteImage: true,\n scrollBottomOffset: 20,\n wordAutocomplete: true,\n caseSensitiveAutocomplete: true,\n caseSensitiveSearch: true,\n clickTimeout: 200,\n holdTimeout: 400,\n holdRepeatTimeout: 200,\n repeatTimeoutKeys: [],\n mobileIngoreAutoSpace: [],\n request: $.noop,\n response: $.noop,\n describe: 'procs',\n onRPCError: null,\n keymap: null,\n doubleTab: null,\n doubleTabEchoCommand: false,\n completion: false,\n onInit: $.noop,\n onClear: $.noop,\n onBlur: $.noop,\n onFocus: $.noop,\n onTerminalChange: $.noop,\n onExit: $.noop,\n onPush: $.noop,\n onPop: $.noop,\n keypress: $.noop,\n keydown: $.noop,\n renderHandler: null,\n onAfterRedraw: $.noop,\n onEchoCommand: $.noop,\n onPaste: $.noop,\n onFlush: $.noop,\n onBeforeCommand: null,\n onAfterCommand: null,\n onBeforeEcho: null,\n onAfterEcho: null,\n onBeforeLogin: null,\n onAfterLogout: null,\n onBeforeLogout: null,\n onCommandChange: null,\n onPositionChange: null,\n allowedAttributes: ['title', 'target', 'rel', /^aria-/, 'id', /^data-/],\n strings: {\n comletionParameters: 'From version 1.0.0 completion function need to' +\n ' have two arguments',\n wrongPasswordTryAgain: 'Wrong username or password try again!',\n wrongPassword: 'Wrong username or password!',\n ajaxAbortError: 'Error while aborting ajax call!',\n wrongArity: \"Wrong number of arguments. Function '%s' expects %s got\" +\n ' %s!',\n commandNotFound: \"Command '%s' Not Found!\",\n oneRPCWithIgnore: 'You can use only one rpc with describe == false ' +\n 'or rpc without system.describe',\n oneInterpreterFunction: \"You can't use more than one function (rpc \" +\n 'without system.describe or with option describe == false count' +\n 's as one)',\n loginFunctionMissing: \"You didn't specify a login function\",\n noTokenError: 'Access denied (no token)',\n serverResponse: 'Server responded',\n wrongGreetings: 'Wrong value of greetings parameter',\n notWhileLogin: \"You can't call `%s' function while in login\",\n loginIsNotAFunction: 'Authenticate must be a function',\n canExitError: \"You can't exit from main interpreter\",\n invalidCompletion: 'Invalid completion',\n invalidSelector: 'Sorry, but terminal said that you use invalid ' +\n 'selector!',\n invalidTerminalId: 'Invalid Terminal ID',\n login: 'login',\n password: 'password',\n recursiveLoop: 'Recursive loop in echo detected, skip',\n notAString: '%s function: argument is not a string',\n redrawError: 'Internal error, wrong position in cmd redraw',\n invalidStrings: 'Command %s have unclosed strings',\n invalidMask: 'Invalid mask used only string or boolean allowed',\n defunctTerminal: \"You can't call method on terminal that was destroyed\"\n }\n };\n // -------------------------------------------------------------------------\n // :: All terminal globals\n // -------------------------------------------------------------------------\n var requests = []; // for canceling on CTRL+D\n var terminals = new Cycle(); // list of terminals global in this scope\n // state for all terminals, terminals can't have own array fo state because\n // there is only one popstate event\n var save_state = []; // hold objects returned by export_view by history API\n var hash_commands;\n var change_hash = false; // don't change hash on Init\n var fire_hash_change = true;\n var first_instance = true; // used by history state\n $.fn.terminal = function(init_interpreter, options) {\n function StorageHelper(memory) {\n if (memory) {\n this.storage = {};\n }\n this.set = function(key, value) {\n if (memory) {\n this.storage[key] = value;\n } else {\n $.Storage.set(key, value);\n }\n };\n this.get = function(key) {\n if (memory) {\n return this.storage[key];\n } else {\n return $.Storage.get(key);\n }\n };\n this.remove = function(key) {\n if (memory) {\n delete this.storage[key];\n } else {\n $.Storage.remove(key);\n }\n };\n }\n // ---------------------------------------------------------------------\n // :: helper function\n // ---------------------------------------------------------------------\n function get_processed_command(command) {\n if ($.terminal.unclosed_strings(command)) {\n var string = $.terminal.escape_brackets(command);\n var message = sprintf(strings().invalidStrings, \"`\" + string + \"`\");\n throw new $.terminal.Exception(message);\n } else if (is_function(settings.processArguments)) {\n return process_command(command, settings.processArguments);\n } else if (settings.processArguments) {\n return $.terminal.parse_command(command);\n } else {\n return $.terminal.split_command(command);\n }\n }\n // ---------------------------------------------------------------------\n // :: helper function that use option to render objects\n // ---------------------------------------------------------------------\n function preprocess_value(value, options) {\n options = options || {};\n if ($.terminal.Animation && value instanceof $.terminal.Animation) {\n value.start(self);\n return false;\n }\n if (is_function(settings.renderHandler)) {\n return unpromise(value, function(value) {\n try {\n var ret = settings.renderHandler.call(self, value, options, self);\n if (ret === false) {\n return false;\n }\n if (typeof ret === 'string' || is_node(ret) || is_promise(ret)) {\n return ret;\n } else {\n return value;\n }\n } catch (e) {\n return [\n '[[;red;]' + e.message + ']',\n format_stack_trace(e.stack)\n ].join('\\n');\n }\n });\n }\n return value;\n }\n // ---------------------------------------------------------------------\n // :: helper function used in render and in update\n // ---------------------------------------------------------------------\n function prepare_render(value, options) {\n if (is_node(value)) {\n var settings = $.extend({}, options, {\n raw: true,\n finalize: function(div) {\n div.find('.terminal-render-item').replaceWith(value);\n if (options && is_function(options.finalize)) {\n options.finalize(div, self);\n }\n }\n });\n return ['<div class=\"terminal-render-item\"/>', settings];\n }\n }\n // ---------------------------------------------------------------------\n // :: helper function that renders DOM nodes and jQuery objects\n // ---------------------------------------------------------------------\n function render(value, options) {\n var ret = prepare_render(value, options);\n if (ret) {\n self.echo.apply(self, ret);\n return true;\n }\n }\n // ---------------------------------------------------------------------\n function get_node(index) {\n return output.find('[data-index=' + index + ']');\n }\n // ---------------------------------------------------------------------\n // :: test if object can be rendered\n // ---------------------------------------------------------------------\n function is_node(object) {\n return object instanceof $.fn.init || object instanceof Element;\n }\n // ---------------------------------------------------------------------\n // :: Display object on terminal\n // ---------------------------------------------------------------------\n function display_object(object) {\n object = preprocess_value(object);\n if (object === false) {\n return;\n }\n if (render(object)) {\n return;\n }\n if (typeof object === 'string') {\n self.echo(object);\n } else if (is_array(object)) {\n self.echo($.map(object, function(object) {\n return JSON.stringify(object);\n }).join(' '));\n } else if (typeof object === 'object') {\n self.echo(JSON.stringify(object));\n } else {\n self.echo(object);\n }\n }\n // ---------------------------------------------------------------------\n // :: Display line code in the file if line numbers are present\n // ---------------------------------------------------------------------\n function print_line(url_spec, cols) {\n var re = /(.*):([0-9]+):([0-9]+)$/;\n // google chrome have line and column after filename\n var m = url_spec.match(re);\n if (m) {\n // TODO: do we need to call pause/resume or return promise?\n self.pause(settings.softPause);\n $.get(m[1], function(response) {\n var file = m[1];\n var code = response.split('\\n');\n var n = +m[2] - 1;\n var start = n > 2 ? n - 2 : 0;\n var lines = code.slice(start, n + 3).map(function(line, i) {\n var prefix = '[' + (n + i - 1) + ']: ';\n var limit = cols - prefix.length - 4;\n if (line.length > limit) {\n line = line.substring(0, limit) + '...';\n }\n if (n > 2 ? i === 2 : i === n) {\n line = '[[;#f00;]' +\n $.terminal.escape_brackets(line) + ']';\n }\n return prefix + line;\n }).filter(Boolean).join('\\n');\n if (lines.length) {\n self.echo('[[b;white;]' + file + ']');\n self.echo(lines).resume();\n }\n }, 'text');\n }\n }\n // ---------------------------------------------------------------------\n // :: Helper function\n // ---------------------------------------------------------------------\n function display_json_rpc_error(error) {\n if (is_function(settings.onRPCError)) {\n settings.onRPCError.call(self, error);\n } else {\n self.error('[RPC] ' + error.message);\n if (error.error && error.error.message) {\n error = error.error;\n // more detailed error message\n var msg = '\\t' + error.message;\n if (error.file) {\n msg += ' in file \"' + error.file.replace(/.*\\//, '') + '\"';\n }\n if (error.at) {\n msg += ' at line ' + error.at;\n }\n self.error(msg);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Create interpreter function from url string\n // ---------------------------------------------------------------------\n function make_basic_json_rpc(url, auth) {\n var rpc_interceptor;\n if (settings.rpc) {\n rpc_interceptor = function() {\n return settings.rpc.apply(self, arguments);\n };\n }\n var interpreter = function(method, params) {\n self.pause(settings.softPause);\n $.jrpc({\n url: url,\n method: method,\n params: params,\n request: function(jxhr, request) {\n try {\n settings.request.call(self, jxhr, request, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n intercept: rpc_interceptor,\n response: function(jxhr, response) {\n try {\n settings.response.call(self, jxhr, response, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n success: function success(json) {\n if (json.error) {\n display_json_rpc_error(json.error);\n } else if (is_function(settings.processRPCResponse)) {\n settings.processRPCResponse.call(self, json.result, self);\n } else if (json.result !== null) {\n display_object(json.result);\n }\n self.resume();\n },\n error: ajax_error\n });\n };\n // this is the interpreter function\n return function(command, terminal) {\n if (command === '') {\n return;\n }\n try {\n command = get_processed_command(command);\n } catch (e) {\n // exception can be thrown on invalid regex\n display_exception(e, 'TERMINAL (get_processed_command)');\n return;\n // throw e; // this will show stack in other try..catch\n }\n if (!auth || command.name === 'help') {\n // allows to call help without a token\n interpreter(command.name, command.args);\n } else {\n var token = terminal.token(true);\n if (token) {\n interpreter(command.name, [token].concat(command.args));\n } else {\n // should never happen\n terminal.error('[AUTH] ' + strings().noTokenError);\n }\n }\n };\n }\n // ---------------------------------------------------------------------\n // :: Create interpreter function from Object. If the value is object\n // :: it will create nested interpreters\n // ---------------------------------------------------------------------\n function make_object_interpreter(object, arity, login, fallback) {\n // function that maps commands to object methods\n // it keeps terminal context\n return function(user_command, terminal) {\n if (user_command === '') {\n return;\n }\n var command;\n try {\n command = get_processed_command(user_command);\n } catch (e) {\n // exception can be thrown on invalid regex\n if (is_function(settings.exception)) {\n settings.exception(e, self);\n } else {\n self.error('Error: ' + (e.message || e));\n }\n return;\n // throw e; // this will show stack in other try..catch\n }\n var val = object[command.name];\n var type = get_type(val);\n if (type === 'function') {\n if (arity && val.length !== command.args.length) {\n self.error(\n '[Arity] ' +\n sprintf(\n strings().wrongArity,\n command.name,\n val.length,\n command.args.length\n )\n );\n } else {\n return val.apply(self, command.args);\n }\n } else if (type === 'object' || type === 'string') {\n var commands = [];\n if (type === 'object') {\n commands = Object.keys(val);\n val = make_object_interpreter(\n val,\n arity,\n login\n );\n }\n terminal.push(val, {\n prompt: command.name + '> ',\n name: command.name,\n completion: type === 'object' ? commands : undefined\n });\n } else if (is_function(fallback)) {\n fallback(user_command, self);\n } else if (is_function(settings.onCommandNotFound)) {\n settings.onCommandNotFound.call(self, user_command, self);\n } else {\n terminal.error(sprintf(strings().commandNotFound, command.name));\n }\n };\n }\n // ---------------------------------------------------------------------\n function ajax_error(xhr, status, error) {\n self.resume(); // onAjaxError can use pause/resume call it first\n if (is_function(settings.onAjaxError)) {\n settings.onAjaxError.call(self, xhr, status, error);\n } else if (status !== 'abort') {\n self.error('[AJAX] ' + status + ' - ' +\n strings().serverResponse + ':\\n' +\n $.terminal.escape_brackets(xhr.responseText));\n }\n }\n // ---------------------------------------------------------------------\n // :: function create interpreter object based on JSON-RPC meta data\n // ---------------------------------------------------------------------\n function make_json_rpc_object(url, auth, success) {\n function jrpc_success(json) {\n if (json.error) {\n display_json_rpc_error(json.error);\n } else if (is_function(settings.processRPCResponse)) {\n settings.processRPCResponse.call(self, json.result, self);\n } else {\n display_object(json.result);\n }\n self.resume();\n }\n function jrpc_request(jxhr, request) {\n try {\n settings.request.call(self, jxhr, request, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n }\n function jrpc_response(jxhr, response) {\n try {\n settings.response.call(self, jxhr, response, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n }\n function response(response) {\n var procs = response;\n // we check if it's false before we call this function but\n // it don't hurt to be explicit here\n if (settings.describe !== false && settings.describe !== '') {\n settings.describe.split('.').forEach(function(field) {\n procs = procs[field];\n });\n }\n if (procs && procs.length) {\n var interpreter_object = {};\n $.each(procs, function(_, proc) {\n if ($.isPlainObject(proc) && typeof proc.name === 'string') {\n interpreter_object[proc.name] = function() {\n var append = auth && proc.name !== 'help';\n var args = Array.prototype.slice.call(arguments);\n var args_len = args.length + (append ? 1 : 0);\n if (settings.checkArity && proc.params &&\n proc.params.length !== args_len) {\n self.error(\n '[Arity] ' +\n sprintf(\n strings().wrongArity,\n proc.name,\n proc.params.length,\n args_len\n )\n );\n } else {\n self.pause(settings.softPause);\n if (append) {\n var token = self.token(true);\n if (token) {\n args = [token].concat(args);\n } else {\n self.error('[AUTH] ' +\n strings().noTokenError);\n }\n }\n $.jrpc({\n url: url,\n method: proc.name,\n params: args,\n request: jrpc_request,\n response: jrpc_response,\n success: jrpc_success,\n error: ajax_error\n });\n }\n };\n }\n });\n var login = typeof auth === 'string' ? auth : 'login';\n interpreter_object.help = interpreter_object.help || function(fn) {\n if (typeof fn === 'undefined') {\n var names = procs.map(function(proc) {\n return proc.name;\n }).join(', ') + ', help';\n self.echo('Available commands: ' + names);\n } else {\n var found = false;\n $.each(procs, function(_, proc) {\n if (proc.name === fn) {\n found = true;\n var msg = '';\n msg += '[[bu;;]' + proc.name + ']';\n if (proc.params) {\n var params = proc.params;\n if (auth && proc.name !== login) {\n params = params.slice(1);\n }\n msg += ' ' + params.join(' ');\n }\n if (proc.help) {\n msg += '\\n' + proc.help;\n }\n self.echo(msg);\n return false;\n }\n });\n if (!found) {\n if (fn === 'help') {\n self.echo('[[bu;;]help] [method]\\ndisplay help ' +\n 'for the method or list of methods if not' +\n ' specified');\n } else {\n var msg = 'Method `' + fn + \"' not found \";\n self.error(msg);\n }\n }\n }\n };\n success(interpreter_object);\n } else {\n success(null);\n }\n }\n return $.jrpc({\n url: url,\n method: 'system.describe',\n params: [],\n success: response,\n request: jrpc_request,\n response: jrpc_response,\n error: function error() {\n success(null);\n }\n });\n }\n // ---------------------------------------------------------------------\n // :: function create interpeter function and call finalize with\n // :: interpreter and optional completion\n // ---------------------------------------------------------------------\n function make_interpreter(user_intrp, login, finalize) {\n finalize = finalize || $.noop;\n var type = get_type(user_intrp);\n var object;\n var result = {};\n var rpc_count = 0; // only one rpc can be use for array\n var fn_interpreter;\n if (type === 'array') {\n object = {};\n // recur will be called when previous acync call is finished\n (function recur(interpreters, success) {\n if (interpreters.length) {\n var first = interpreters[0];\n var rest = interpreters.slice(1);\n var type = get_type(first);\n if (type === 'string') {\n if (settings.describe === false) {\n if (++rpc_count === 1) {\n fn_interpreter = make_basic_json_rpc(first, login);\n } else {\n self.error(strings().oneRPCWithIgnore);\n }\n recur(rest, success);\n } else {\n self.pause(settings.softPause);\n make_json_rpc_object(first, login, function(new_obj) {\n if (new_obj) {\n $.extend(object, new_obj);\n } else if (++rpc_count === 1) {\n fn_interpreter = make_basic_json_rpc(\n first,\n login\n );\n } else {\n self.error(strings().oneRPCWithIgnore);\n }\n self.resume();\n recur(rest, success);\n });\n }\n } else if (type === 'function') {\n if (fn_interpreter) {\n self.error(strings().oneInterpreterFunction);\n } else {\n fn_interpreter = first;\n }\n recur(rest, success);\n } else if (type === 'object') {\n $.extend(object, first);\n recur(rest, success);\n }\n } else {\n success();\n }\n })(user_intrp, function() {\n finalize({\n interpreter: make_object_interpreter(\n object,\n false,\n login,\n fn_interpreter && fn_interpreter.bind(self)\n ),\n completion: Object.keys(object)\n });\n });\n } else if (type === 'string') {\n if (settings.describe === false) {\n object = {\n interpreter: make_basic_json_rpc(user_intrp, login)\n };\n if (Array.isArray(settings.completion)) {\n object.completion = settings.completion;\n }\n finalize(object);\n } else {\n self.pause(settings.softPause);\n make_json_rpc_object(user_intrp, login, function(object) {\n if (object) {\n result.interpreter = make_object_interpreter(\n object,\n false,\n login\n );\n result.completion = Object.keys(object);\n } else {\n // no procs in system.describe\n result.interpreter = make_basic_json_rpc(user_intrp, login);\n }\n finalize(result);\n self.resume();\n });\n }\n } else if (type === 'object') {\n finalize({\n interpreter: make_object_interpreter(\n user_intrp,\n settings.checkArity,\n login\n ),\n completion: Object.keys(user_intrp)\n });\n } else {\n // allow $('<div/>').terminal();\n if (type === 'undefined') {\n user_intrp = $.noop;\n } else if (type !== 'function') {\n var msg = type + ' is invalid interpreter value';\n throw new $.terminal.Exception(msg);\n }\n // single function don't need bind\n finalize({\n interpreter: user_intrp,\n completion: settings.completion\n });\n }\n }\n // ---------------------------------------------------------------------\n // :: Create JSON-RPC authentication function\n // ---------------------------------------------------------------------\n function make_json_rpc_login(url, login) {\n var method = get_type(login) === 'boolean' ? 'login' : login;\n return function(user, passwd, callback) {\n self.pause(settings.softPause);\n $.jrpc({\n url: url,\n method: method,\n params: [user, passwd],\n request: function(jxhr, request) {\n try {\n settings.request.call(self, jxhr, request, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n response: function(jxhr, response) {\n try {\n settings.response.call(self, jxhr, response, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n success: function success(response) {\n if (!response.error && response.result) {\n callback(response.result);\n } else {\n // null will trigger message that login fail\n callback(null);\n }\n self.resume();\n },\n error: ajax_error\n });\n };\n // default name is login so you can pass true\n }\n // ---------------------------------------------------------------------\n // :: display Exception on terminal\n // ---------------------------------------------------------------------\n function display_exception(e, label, silent) {\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, label);\n } else {\n self.exception(e, label);\n if (!silent) {\n setTimeout(function() {\n throw e;\n }, 0);\n }\n }\n }\n // ---------------------------------------------------------------------\n function links(string) {\n function format(_, style, color, background, _class, data, text) {\n function formatting(s, text) {\n return '[[' + [\n style + (s || ''),\n color,\n background,\n _class,\n text || data\n ].join(';') + ']';\n }\n function escaped(_) {\n return ']' + formatting('!', _) + _ + ']' + formatting();\n }\n if (!style.match(/!/)) {\n var m = text.match(email_full_re) || text.match(url_full_re);\n if (m) {\n return formatting('!', m[1]) + text + ']';\n } else if (text.match(email_re) || text.match(url_nf_re)) {\n var output = text.replace(email_re, escaped)\n .replace(url_nf_re, escaped);\n return formatting('', data) + output + ']';\n }\n }\n return _;\n }\n function linkify(string) {\n return string.replace(email_re, '[[!;;]$1]').\n replace(url_nf_re, '[[!;;]$1]');\n }\n if (!$.terminal.have_formatting(string)) {\n return linkify(string);\n }\n return $.terminal.format_split(string).map(function(str) {\n if ($.terminal.is_formatting(str)) {\n return str.replace(format_parts_re, format);\n } else {\n return linkify(str);\n }\n }).join('');\n }\n // ---------------------------------------------------------------------\n function should_wrap(string, options) {\n return (strlen(text(string)) > options.cols ||\n string.match(/\\n/)) &&\n ((settings.wrap === true &&\n options.wrap === undefined) ||\n settings.wrap === false &&\n options.wrap === true);\n }\n // ---------------------------------------------------------------------\n var line_cache;\n if ('Map' in root) {\n line_cache = new Map();\n }\n // ---------------------------------------------------------------------\n function process_extended_commands(string, line, line_settings) {\n if (line_settings.exec || line.options.clear_exec) {\n return $.terminal.each_extended_command(string, function(command) {\n // redraw should not execute commands and it have\n // and lines variable have all extended commands\n if (line_settings.exec) {\n line.options.exec = false;\n line.options.clear_exec = true;\n var trim = command.trim();\n if (prev_exec_cmd && prev_exec_cmd === trim) {\n prev_exec_cmd = '';\n self.error(strings().recursiveLoop);\n } else {\n prev_exec_cmd = trim;\n $.terminal.extended_command(self, command, {\n invokeMethods: line_settings.invokeMethods\n }).then(function() {\n prev_exec_cmd = '';\n });\n }\n }\n });\n }\n return string;\n }\n // ---------------------------------------------------------------------\n function process_line(line) {\n // prevent exception in display exception\n try {\n var use_cache = !is_function(line.value);\n var line_settings = $.extend({\n exec: true,\n raw: false,\n finalize: $.noop,\n useCache: use_cache,\n invokeMethods: false,\n formatters: true,\n convertLinks: settings.convertLinks\n }, line.options || {});\n var string = stringify_value(line.value);\n if (string && is_function(string.then)) {\n // handle function that return a promise #629\n return string.then(function(string) {\n process_line($.extend(line, {\n value: string,\n options: line_settings\n }));\n });\n }\n if (string !== '') {\n if (!line_settings.raw) {\n if (settings.useCache && line_settings.useCache) {\n var key = string;\n if (line_cache && line_cache.has(key)) {\n var data = line_cache.get(key);\n buffer.append(\n data.input,\n line.index,\n line_settings,\n data.raw\n );\n return true;\n }\n }\n if (line_settings.formatters) {\n try {\n string = $.terminal.apply_formatters(\n string,\n $.extend(settings, {echo: true})\n );\n } catch (e) {\n display_exception(e, 'FORMATTING');\n }\n }\n string = process_extended_commands(string, line, line_settings);\n if (string === '') {\n return;\n }\n if (line_settings.convertLinks) {\n string = links(string);\n }\n var raw_string = string;\n string = crlf($.terminal.normalize(string));\n string = $.terminal.encode(string, {\n tabs: settings.tabs\n });\n //string = $.terminal.normalize(string);\n var array;\n var cols = line_settings.cols = self.cols();\n if (should_wrap(string, line_settings)) {\n array = $.terminal.split_equal(string, cols, {\n keepWords: line_settings.keepWords,\n trim: true\n });\n } else if (string.match(/\\n/)) {\n array = string.split(/\\n/);\n }\n }\n } else {\n raw_string = '';\n }\n var arg = array || string;\n if (line_cache && key && use_cache) {\n line_cache.set(key, {input: arg, raw: raw_string});\n }\n buffer.append(arg, line.index, line_settings, raw_string);\n } catch (e) {\n buffer.clear();\n // don't display exception if exception throw in terminal\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, 'TERMINAL');\n } else {\n alert_exception('[Internal Exception(process_line)]', e);\n }\n }\n // is it work with unpromise that ignore undefined\n return true;\n }\n // ---------------------------------------------------------------------\n // :: Update terminal lines\n // ---------------------------------------------------------------------\n function redraw(options) {\n options = $.extend({}, {\n // should be used when single line is updated\n update: false,\n // should be used if you want to scroll to bottom after redraw\n scroll: true\n }, options || {});\n if (!options.update) {\n command_line.resize(num_chars);\n // we don't want reflow while processing lines\n var detached_output = output.empty().detach();\n }\n try {\n buffer.clear();\n unpromise(lines.render(self.rows(), function(lines_to_show) {\n return lines_to_show.map(process_line);\n }), function() {\n self.flush(options);\n if (!options.update) {\n command_line.before(detached_output); // reinsert output\n }\n fire_event('onAfterRedraw');\n });\n } catch (e) {\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, 'TERMINAL (redraw)');\n } else {\n alert_exception('[redraw]', e);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Function limit output lines based on outputLimit option\n // ---------------------------------------------------------------------\n function limit_lines() {\n if (settings.outputLimit >= 0) {\n var limit;\n if (settings.outputLimit === 0) {\n limit = self.rows();\n } else {\n limit = settings.outputLimit;\n }\n var $lines = output.find('> div > div');\n if ($lines.length + 1 > limit) {\n var max = $lines.length - limit + 1;\n var for_remove = $lines.slice(0, max);\n // you can't get parent if you remove the\n // element so we first get the parent\n var parents = for_remove.parent();\n for_remove.remove();\n parents.each(function() {\n var $self = $(this);\n if ($self.is(':empty')) {\n lines.unmount($self);\n // there can be divs inside parent that\n // was not removed\n $self.remove();\n }\n });\n lines.limit_snapshot(max);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Display user greetings or terminal signature\n // ---------------------------------------------------------------------\n function show_greetings() {\n if (settings.greetings === undefined) {\n // signature have ascii art so it's not suite for screen readers\n self.echo(self.signature, {finalize: a11y_hide, formatters: false});\n } else if (settings.greetings) {\n var type = typeof settings.greetings;\n if (type === 'string') {\n self.echo(settings.greetings);\n } else if (type === 'function') {\n self.echo(function() {\n try {\n var defer = new $.Deferred();\n var ret = settings.greetings.call(self, defer.resolve);\n if (ret) {\n defer.resolve(ret);\n }\n return defer.promise();\n } catch (e) {\n settings.greetings = null;\n display_exception(e, 'greetings');\n }\n });\n } else {\n self.error(strings().wrongGreetings);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: apply command mask to command\n // ---------------------------------------------------------------------\n function mask_command(command) {\n var mask = command_line.mask();\n switch (typeof mask) {\n case 'string':\n return command.replace(/./g, mask);\n case 'boolean':\n if (mask) {\n return command.replace(/./g, settings.maskChar);\n } else {\n return $.terminal.escape_formatting(command);\n }\n }\n throw new $.terminal.Exception(strings().invalidMask);\n }\n // ---------------------------------------------------------------------\n // :: Display prompt and last command\n // ---------------------------------------------------------------------\n function echo_command(command) {\n if (typeof command === 'undefined') {\n command = self.get_command();\n }\n // true will return last rendered string\n var prompt = command_line.prompt(true);\n command = mask_command(command);\n var options = {\n exec: false,\n formatters: false,\n convertLinks: false,\n finalize: function finalize(div) {\n a11y_hide(div.addClass('terminal-command'));\n fire_event('onEchoCommand', [div, command]);\n }\n };\n command = $.terminal.apply_formatters(command, {command: true});\n self.echo(prompt + command, options);\n }\n // ---------------------------------------------------------------------\n function have_scrollbar() {\n return filler.outerWidth() !== self.outerWidth();\n }\n // ---------------------------------------------------------------------\n // :: Helper function that restore state. Call import_view or exec\n // ---------------------------------------------------------------------\n function restore_state(spec) {\n // spec [terminal_id, state_index, command]\n var terminal = terminals.get()[spec[0]];\n if (!terminal) {\n throw new $.terminal.Exception(strings().invalidTerminalId);\n }\n var command_idx = spec[1];\n if (save_state[command_idx]) { // state exists\n terminal.import_view(save_state[command_idx]);\n } else {\n // restore state\n change_hash = false;\n var command = spec[2];\n if (command) {\n terminal.exec(command).done(function() {\n change_hash = true;\n save_state[command_idx] = terminal.export_view();\n });\n }\n }\n /*if (spec[3].length) {\n restore_state(spec[3]);\n }*/\n }\n // ---------------------------------------------------------------------\n function make_label_error(label) {\n return function(e) {\n self.error('[' + label + '] ' + (e.message || e)).resume();\n };\n }\n // ---------------------------------------------------------------------\n // :: Helper function\n // ---------------------------------------------------------------------\n function maybe_update_hash() {\n if (change_hash) {\n fire_hash_change = false;\n location.hash = '#' + JSON.stringify(hash_commands);\n setTimeout(function() {\n fire_hash_change = true;\n }, 100);\n }\n }\n // ---------------------------------------------------------------------\n // :: Wrapper over interpreter, it implements exit and catches all\n // :: exeptions from user code and displays them on the terminal\n // ---------------------------------------------------------------------\n var first_command = true;\n var resume_callbacks = [];\n function commands(command, silent, exec) {\n function init_state() {\n // execHash need first empty command too\n if (settings.historyState || settings.execHash && exec) {\n if (!save_state.length) {\n // first command in first terminal don't have hash\n self.save_state();\n } else {\n self.save_state(null);\n }\n }\n }\n // -----------------------------------------------------------------\n function before_async_exec() {\n // variables defined later in commands\n if (!exec) {\n change_hash = true;\n if (settings.historyState) {\n self.save_state(command, false);\n }\n change_hash = saved_change_hash;\n }\n }\n // -----------------------------------------------------------------\n function after_exec() {\n deferred.resolve();\n fire_event('onAfterCommand', [command]);\n }\n // -----------------------------------------------------------------\n function show(result, promise) {\n if (typeof result !== 'undefined') {\n display_object(result);\n }\n after_exec();\n if (promise) {\n self.resume();\n }\n }\n // -----------------------------------------------------------------\n function is_animation_promise(ret) {\n return is_function(ret.done || ret.then) && animating;\n }\n // -----------------------------------------------------------------\n function invoke() {\n // Call user interpreter function\n var result = interpreter.interpreter.call(self, command, self);\n before_async_exec();\n if (result) {\n // auto pause/resume when user return promises\n // it should not pause when user return promise from read()\n if (!force_awake) {\n if (is_animation_promise(result)) {\n paused = true;\n } else if (is_promise(result)) {\n self.pause(settings.softPause);\n }\n }\n force_awake = false;\n var error = make_label_error('Command');\n // when for native Promise object work only in jQuery 3.x\n if (is_function(result.done || result.then)) {\n return unpromise(result, function(value) {\n show(value, true);\n }, error);\n } else {\n return $.when(result).done(show).catch(error);\n }\n } else {\n if (exec) {\n command_line.refresh();\n }\n if (paused) {\n resume_callbacks.push(function() {\n // exec with resume/pause in user code\n after_exec();\n });\n } else {\n after_exec();\n }\n return deferred.promise();\n }\n }\n // -----------------------------------------------------------------\n // first command store state of the terminal before the command get\n // executed\n if (first_command) {\n first_command = false;\n init_state();\n }\n try {\n // this callback can disable commands\n if (fire_event('onBeforeCommand', [command]) === false) {\n return;\n }\n if (exec) {\n prev_exec_cmd = command.trim();\n prev_command = $.terminal.split_command(prev_exec_cmd);\n } else {\n prev_command = $.terminal.split_command(command);\n }\n if (!ghost()) {\n // exec execute this function wihout the help of cmd plugin\n // that add command to history on enter\n if (exec && (is_function(settings.historyFilter) &&\n settings.historyFilter(command) ||\n command.match(settings.historyFilter))) {\n command_line.history().append(command);\n }\n }\n var interpreter = interpreters.top();\n if (!silent && settings.echoCommand) {\n echo_command(command);\n }\n // new promise will be returned to exec that will resolve his\n // returned promise\n var deferred = new $.Deferred();\n // we need to save sate before commands is deleyd because\n // execute_extended_command disable it and it can be executed\n // after delay\n var saved_change_hash = change_hash;\n if (command.match(/^\\s*login\\s*$/) && self.token(true)) {\n before_async_exec();\n if (self.level() > 1) {\n self.logout(true);\n } else {\n self.logout();\n }\n after_exec();\n } else if (settings.exit && command.match(/^\\s*exit\\s*$/) &&\n !in_login) {\n before_async_exec();\n var level = self.level();\n if (level === 1 && self.get_token() || level > 1) {\n if (self.get_token(true)) {\n self.set_token(undefined, true);\n }\n self.pop();\n }\n after_exec();\n } else if (settings.clear && command.match(/^\\s*clear\\s*$/) &&\n !in_login) {\n before_async_exec();\n self.clear();\n after_exec();\n } else {\n var ret = invoke();\n if (ret) {\n return ret;\n }\n }\n return deferred.promise();\n } catch (e) {\n display_exception(e, 'USER', exec);\n self.resume();\n if (exec) {\n throw e;\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: The logout function removes Storage, disables history and runs\n // :: the login function. This function is called only when options.login\n // :: function is defined. The check for this is in the self.pop method\n // ---------------------------------------------------------------------\n function global_logout() {\n if (fire_event('onBeforeLogout', [], true) === false) {\n return;\n }\n clear_loging_storage();\n fire_event('onAfterlogout', [], true);\n self.login(global_login_fn, true, start);\n }\n // ---------------------------------------------------------------------\n function clear_loging_storage() {\n var name = self.prefix_name(true) + '_';\n storage.remove(name + 'token');\n storage.remove(name + 'login');\n }\n // ---------------------------------------------------------------------\n // :: Save the interpreter name for use with purge\n // ---------------------------------------------------------------------\n function maybe_append_name(interpreter_name) {\n var storage_key = self.prefix_name() + '_interpreters';\n var names = storage.get(storage_key);\n if (names) {\n names = JSON.parse(names);\n } else {\n names = [];\n }\n if ($.inArray(interpreter_name, names) === -1) {\n names.push(interpreter_name);\n storage.set(storage_key, JSON.stringify(names));\n }\n }\n // ---------------------------------------------------------------------\n // :: Function enables history, sets prompt, runs interpreter function\n // ---------------------------------------------------------------------\n function prepare_top_interpreter(silent) {\n var interpreter = interpreters.top();\n var name = self.prefix_name(true);\n if (!ghost()) {\n maybe_append_name(name);\n }\n var login = self.login_name(true);\n // name change history\n command_line.name(name + (login ? '_' + login : ''));\n var prompt = interpreter.prompt;\n if (is_function(prompt)) {\n prompt = context_callback_proxy(prompt);\n }\n var is_dynamic_prompt = is_function(interpreter.prompt);\n if (is_dynamic_prompt || prompt !== command_line.prompt()) {\n if (is_dynamic_prompt) {\n // prevent flicker of old prompt until async prompt finishes\n command_line.prompt('');\n }\n command_line.prompt(interpreter.prompt);\n }\n if (typeof interpreter.history !== 'undefined') {\n self.history().toggle(interpreter.history);\n }\n if ($.isPlainObject(interpreter.keymap)) {\n command_line.keymap(null).keymap($.extend(\n {},\n terminal_init_keymap,\n $.omap(interpreter.keymap, function(name, fun) {\n return function() {\n var args = [].slice.call(arguments);\n try {\n return fun.apply(self, args);\n } catch (e) {\n display_exception(e, 'USER KEYMAP');\n }\n };\n })\n ));\n }\n command_line.set('');\n if (!silent && is_function(interpreter.onStart)) {\n interpreter.onStart.call(self, self);\n }\n }\n // ---------------------------------------------------------------------\n function fire_event(name, args, skip_local) {\n args = (args || []).concat([self]); // create new array\n // event can be fired before interpreters are created\n var top = interpreters && interpreters.top();\n if (top && is_function(top[name]) && !skip_local) {\n try {\n return top[name].apply(self, args);\n } catch (e) {\n delete top[name];\n display_exception(e, name);\n }\n } else if (is_function(settings[name])) {\n try {\n return settings[name].apply(self, args);\n } catch (e) {\n settings[name] = null;\n display_exception(e, name);\n }\n }\n }\n var scroll_to_view = (function() {\n function scroll_to_view(visible) {\n if (!visible) {\n // try catch for Node.js unit tests\n try {\n self.scroll_to(self.find('.cmd-cursor-line'));\n return true;\n } catch (e) {\n return true;\n }\n }\n }\n // we don't want debounce in Unit Tests\n if (typeof global !== 'undefined' && typeof global.it === 'function') {\n return scroll_to_view;\n }\n return debounce(scroll_to_view, 100, {\n leading: true,\n trailing: false\n });\n })();\n // ---------------------------------------------------------------------\n function make_cursor_visible() {\n var cursor = self.find('.cmd-cursor-line');\n return cursor.is_fully_in_viewport(self).then(scroll_to_view);\n }\n // ---------------------------------------------------------------------\n function replace_hash(state) {\n if (typeof history !== 'undefined' && history.replaceState) {\n var new_hash = '#' + JSON.stringify(state);\n var url = location.href.replace(/#.*$/, new_hash);\n history.replaceState(null, '', url);\n }\n }\n // ---------------------------------------------------------------------\n function hashchange() {\n if (fire_hash_change && settings.execHash) {\n try {\n if (location.hash) {\n var hash = location.hash.replace(/^#/, '');\n hash_commands = JSON.parse(decodeURIComponent(hash));\n } else {\n hash_commands = [];\n }\n if (hash_commands.length) {\n restore_state(hash_commands[hash_commands.length - 1]);\n } else if (save_state[0]) {\n self.import_view(save_state[0]);\n }\n } catch (e) {\n display_exception(e, 'TERMINAL');\n }\n }\n }\n // ---------------------------------------------------------------------\n function start() {\n prepare_top_interpreter();\n init_queue.resolve();\n show_greetings();\n }\n // ---------------------------------------------------------------------\n function initialize() {\n if (lines.length) {\n // for case when showing long error before init\n if (echo_delay.length) {\n // for case when greetting is async function\n $.when.apply($, echo_delay);\n }\n }\n function next() {\n onPause = $.noop;\n if (!was_paused && self.enabled()) {\n // resume login if user didn't call pause in onInit\n // if user pause in onInit wait with exec until it\n // resume\n self.resume(true);\n }\n }\n // was_paused flag is workaround for case when user call exec before\n // login and pause in onInit, 3rd exec will have proper timing (will\n // execute after onInit resume)\n var was_paused = false;\n if (is_function(settings.onInit)) {\n onPause = function() { // local in terminal\n was_paused = true;\n };\n var ret;\n try {\n ret = settings.onInit.call(self, self);\n } catch (e) {\n display_exception(e, 'OnInit');\n } finally {\n if (!is_promise(ret)) {\n next();\n } else {\n ret.then(next).catch(function(e) {\n display_exception(e, 'OnInit');\n next();\n });\n }\n }\n }\n if (first_instance) {\n first_instance = false;\n $(window).on('hashchange', hashchange);\n }\n }\n // ---------------------------------------------------------------------\n // :: If Ghost don't store anything in localstorage\n // ---------------------------------------------------------------------\n function ghost() {\n return in_login || command_line.mask() !== false;\n }\n // ---------------------------------------------------------------------\n // :: Keydown event handler\n // ---------------------------------------------------------------------\n function user_key_down(e) {\n var result, top = interpreters.top();\n if (is_function(top.keydown)) {\n result = top.keydown.call(self, e, self);\n if (result !== undefined) {\n return result;\n }\n } else if (is_function(settings.keydown)) {\n result = settings.keydown.call(self, e, self);\n if (result !== undefined) {\n return result;\n }\n }\n }\n var keymap = {\n 'CTRL+D': function(e, original) {\n if (!in_login) {\n if (command_line.get() === '') {\n if (interpreters.size() > 1 ||\n is_function(global_login_fn)) {\n self.pop('');\n } else {\n self.resume();\n }\n } else {\n original();\n }\n }\n return false;\n },\n 'CTRL+C': function() {\n with_selection(function(html) {\n if (html === '') {\n var command = self.get_command();\n var position = self.get_position();\n command = command.slice(0, position) + '^C' +\n command.slice(position + 2);\n echo_command(command);\n self.set_command('');\n } else {\n var clip = self.find('textarea');\n text_to_clipboard(clip, process_selected_html(html));\n }\n });\n return false;\n },\n 'CTRL+L': function() {\n self.clear();\n return false;\n },\n 'TAB': function(e, orignal) {\n // TODO: move this to cmd plugin\n // add completion = array | function\n // !!! Problem complete more then one key need terminal\n var top = interpreters.top(), completion, caseSensitive;\n if (typeof top.caseSensitiveAutocomplete !== 'undefined') {\n caseSensitive = top.caseSensitiveAutocomplete;\n } else {\n caseSensitive = settings.caseSensitiveAutocomplete;\n }\n if (settings.completion &&\n get_type(settings.completion) !== 'boolean' &&\n top.completion === undefined) {\n completion = settings.completion;\n } else {\n completion = top.completion;\n }\n if (completion === 'settings') {\n completion = settings.completion;\n }\n function resolve(commands) {\n // local copy\n commands = commands.slice();\n // default commands should not match for arguments\n if (!self.before_cursor(false).match(/\\s/)) {\n if (settings.clear && $.inArray('clear', commands) === -1) {\n commands.push('clear');\n }\n if (settings.exit && $.inArray('exit', commands) === -1) {\n commands.push('exit');\n }\n }\n self.complete(commands, {\n echo: true,\n word: settings.wordAutocomplete,\n escape: settings.completionEscape,\n caseSensitive: caseSensitive,\n echoCommand: settings.doubleTabEchoCommand,\n doubleTab: settings.doubleTab\n });\n }\n if (completion) {\n switch (get_type(completion)) {\n case 'function':\n var string = self.before_cursor(settings.wordAutocomplete);\n if (completion.length === 3) {\n var error = new Error(strings().comletionParameters);\n display_exception(error, 'USER');\n return false;\n }\n var result = completion.call(self, string, resolve);\n unpromise(result, resolve, make_label_error('Completion'));\n break;\n case 'array':\n resolve(completion);\n break;\n default:\n throw new $.terminal.Exception(strings().invalidCompletion);\n }\n } else {\n orignal();\n }\n return false;\n },\n 'CTRL+V': function(e, original) {\n original(e);\n self.oneTime(200, function() {\n self.scroll_to_bottom();\n });\n return true;\n },\n 'CTRL+TAB': function() {\n if (terminals.length() > 1) {\n self.focus(false);\n return false;\n }\n },\n 'PAGEDOWN': function() {\n self.scroll(self.height());\n },\n 'PAGEUP': function() {\n self.scroll(-self.height());\n }\n };\n // ---------------------------------------------------------------------\n function key_down(e) {\n // Prevent to be executed by cmd: CTRL+D, TAB, CTRL+TAB (if more\n // then one terminal)\n var result, i;\n if (animating) {\n return false;\n }\n if (self.enabled()) {\n if (!self.paused()) {\n result = user_key_down(e);\n if (result !== undefined) {\n return result;\n }\n if (e.which !== 9) { // not a TAB\n tab_count = 0;\n }\n } else {\n if (!settings.pauseEvents) {\n result = user_key_down(e);\n if (result !== undefined) {\n return result;\n }\n }\n if (e.which === 68 && e.ctrlKey) { // CTRL+D (if paused)\n if (settings.pauseEvents) {\n result = user_key_down(e);\n if (result !== undefined) {\n return result;\n }\n }\n if (requests.length) {\n for (i = requests.length; i--;) {\n var r = requests[i];\n if (r.readyState !== 4) {\n try {\n r.abort();\n } catch (error) {\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(\n self,\n e,\n 'AJAX ABORT'\n );\n } else {\n self.error(strings().ajaxAbortError);\n }\n }\n }\n }\n requests = [];\n }\n self.resume();\n }\n return false;\n }\n }\n }\n // ---------------------------------------------------------------------\n function key_press(e) {\n var top = interpreters.top();\n if (enabled && (!paused || !settings.pauseEvents)) {\n if (is_function(top.keypress)) {\n return top.keypress.call(self, e, self);\n } else if (is_function(settings.keypress)) {\n return settings.keypress.call(self, e, self);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Typing animation generator\n // ---------------------------------------------------------------------\n function typed(finish_typing_fn, optimized) {\n return function typing_animation(message, options) {\n var formatted = $.terminal.apply_formatters(message, {\n animation: true\n });\n formatted = $.terminal.normalize(formatted);\n var keepWords = false;\n if (options && typeof options.keepWords !== 'undefined') {\n keepWords = options.keepWords;\n }\n if (optimized) {\n var formatted_lines = $.terminal.split_equal(formatted, self.cols(), {\n keepWords: keepWords\n });\n }\n animating = true;\n var prompt = self.get_prompt();\n var char_i = 0;\n var len = $.terminal.length(formatted);\n if (len > 0) {\n var new_prompt = '';\n if (options.prompt) {\n new_prompt = options.prompt;\n } else {\n self.set_prompt('');\n }\n var bottom = self.is_bottom();\n var line = 0;\n if (optimized) {\n var anim_lines = formatted_lines.map(function(formatted) {\n return {\n formatted: formatted,\n chars: $.terminal.partition(formatted, {wrap: false}),\n len: $.terminal.length(formatted)\n };\n });\n } else {\n var chars = $.terminal.partition(formatted, {wrap: false});\n }\n var stop;\n var interval = setInterval(function() {\n var formatted_line, input_chars, input_len;\n if (!skip) {\n if (optimized) {\n formatted_line = anim_lines[line].formatted;\n input_chars = anim_lines[line].chars;\n input_len = anim_lines[line].len;\n } else {\n formatted_line = formatted;\n input_chars = chars;\n input_len = len;\n }\n var chr = input_chars[char_i];\n if (options.mask) {\n var mask = command_line.mask();\n if (typeof mask === 'string') {\n chr = mask;\n } else if (mask) {\n chr = settings.maskChar;\n }\n }\n new_prompt += chr;\n command_line.prompt(new_prompt, {formatters: false});\n if (bottom && (chr === '\\n' || !self.is_bottom())) {\n self.scroll_to_bottom();\n }\n char_i++;\n if (char_i === input_len && optimized) {\n // swap prompt with line\n var index = self.last_index();\n self.set_prompt(prompt);\n var is_partial = !!lines.get_partial().length;\n self.echo(formatted_line, $.extend({}, options, {\n formatters: false,\n finalize: null,\n typing: false\n }));\n anim_lines[line].index = index + 1;\n new_prompt = '';\n ++line;\n char_i = 0;\n }\n } else {\n self.skip_stop();\n var chr_rest = $.terminal.substring(formatted, char_i, len);\n new_prompt += chr_rest;\n command_line.prompt(new_prompt, {formatters: false});\n stop = true;\n }\n if (optimized) {\n stop = line === anim_lines.length;\n } else {\n stop = char_i === len;\n }\n if (stop) {\n clearInterval(interval);\n setTimeout(function() {\n if (is_partial || options.newline === false) {\n // HACK: fix sequance of animations #930\n var idx = self.last_index();\n var node = output.find('[data-index=\"' + idx + '\"]');\n options.finalize(node);\n } else {\n if (optimized) {\n // clear old lines and make one full line\n // so it can wrap when you resize\n anim_lines.forEach(function(line) {\n self.remove_line(line.index);\n });\n }\n finish_typing_fn(message, prompt, options);\n }\n animating = false;\n }, options.delay);\n }\n }, options.delay);\n }\n };\n }\n // ---------------------------------------------------------------------\n var typed_prompt = typed(function(message, _, options) {\n self.set_prompt(message);\n options.finalize();\n }, true);\n // ---------------------------------------------------------------------\n var typed_insert = (function() {\n var helper = typed(function(message, prompt, options) {\n self.set_prompt(prompt);\n self.insert(message);\n options.finalize();\n });\n return function(prompt, command, options) {\n return helper(command, $.extend({}, options, {\n prompt: prompt + self.get_command()\n }));\n };\n })();\n // ---------------------------------------------------------------------\n var typed_message = typed(function(message, prompt, options) {\n self.set_prompt(prompt);\n self.echo(message, $.extend({}, options, {typing: false}));\n }, true);\n // ---------------------------------------------------------------------\n var typed_enter = (function() {\n var helper = typed(function(message, prompt, options) {\n self.set_prompt(prompt);\n with_prompt(prompt, function(prompt) {\n var command = mask_command(message);\n command = $.terminal.apply_formatters(command, {command: true});\n var output = prompt + command;\n options = $.extend({}, options, {\n typing: false,\n formatters: false,\n convertLinks: false\n });\n self.echo(output, options);\n }, self);\n });\n return function(prompt, message, options) {\n return helper(message, $.extend({}, options, {\n prompt: prompt, mask: true\n }));\n };\n })();\n // ---------------------------------------------------------------------\n function with_typing(kind, else_fn, finalize_fn) {\n return function with_typing_fn(string, options) {\n var d = new $.Deferred();\n when_ready(function ready() {\n var locals = $.extend({\n typing: false,\n delay: settings.execAnimationDelay\n }, options);\n if (locals.typing) {\n if (typeof string !== 'string') {\n return d.reject(kind + ': Typing animation require string');\n }\n if (typeof locals.delay !== 'number' || isNaN(locals.delay)) {\n return d.reject(kind + ': Invalid argument, delay need to' +\n ' be a number');\n }\n var p = self.typing(kind, locals.delay, string, locals);\n p.then(function() {\n d.resolve();\n });\n } else {\n else_fn(string, locals);\n }\n if (is_function(finalize_fn)) {\n finalize_fn(string, locals);\n }\n });\n if (options && options.typing) {\n return d.promise();\n }\n return self;\n };\n }\n // ---------------------------------------------------------------------\n // :: this even can be used to valid if user and password is valid\n // :: this is additional protection when using automatic authentication\n // ---------------------------------------------------------------------\n function validate_login(user, token_or_password, callback) {\n var ret = fire_event('onBeforeLogin', [user, token_or_password]);\n return unpromise(always(ret), callback, 'validate_login');\n }\n // ---------------------------------------------------------------------\n // :: Function changes the prompt of the command line to login\n // :: with a password and calls the user login function with\n // :: the callback that expects a token. The login is successful\n // :: if the user calls it with value that is truthy\n // ---------------------------------------------------------------------\n function authentication(auth_callback, infinite, success, error) {\n // don't store login data in history\n if (settings.history) {\n command_line.history().disable();\n }\n // so we know how many times call pop\n var level = self.level();\n // when autologin and onBeforeLogin return false\n clear_token();\n function pop_user_pass() {\n while (self.level() > level) {\n self.pop(undefined, true);\n }\n if (settings.history) {\n command_line.history().enable();\n }\n }\n function set_token(user, token) {\n var name = self.prefix_name(true) + '_';\n storage.set(name + 'token', token);\n storage.set(name + 'login', user);\n }\n function clear_token() {\n var name = self.prefix_name(true) + '_';\n storage.remove(name + 'token');\n storage.remove(name + 'login');\n }\n function login_callback(user, token, silent) {\n var next;\n if (token) {\n pop_user_pass();\n set_token(user, token);\n in_login = false;\n fire_event('onAfterLogin', [user, token]);\n next = success;\n } else {\n if (infinite) {\n if (!silent) {\n self.error(strings().wrongPasswordTryAgain);\n }\n self.pop(undefined, true).set_mask(false);\n } else {\n in_login = false;\n if (!silent) {\n self.error(strings().wrongPassword);\n }\n self.pop(undefined, true).pop(undefined, true);\n }\n // used only to call pop in push\n next = error;\n }\n if (self.paused()) {\n self.resume();\n }\n // will be used internaly since users know\n // when login success (they decide when\n // it happen by calling the callback -\n // this function)\n if (is_function(next)) {\n next();\n }\n self.off('terminal.autologin');\n }\n self.on('terminal.autologin', function(event, user, token, silent) {\n validate_login(user, token, function(valid) {\n if (valid !== false) {\n login_callback(user, token, silent);\n }\n });\n });\n self.push(function(user) {\n self.set_mask(settings.maskChar).push(function(pass) {\n try {\n validate_login(user, pass, function(valid) {\n if (valid === false) {\n pop_user_pass();\n return;\n }\n self.pause();\n try {\n var args = [user, pass, function(token, silent) {\n login_callback(user, token, silent);\n }];\n var ret = auth_callback.apply(self, args);\n unpromise(ret, function(token) {\n login_callback(user, token);\n }, function(err) {\n self.pop(undefined, true).pop(undefined, true);\n self.error(err.message);\n if (is_function(error)) {\n error();\n }\n if (self.paused()) {\n self.resume();\n }\n self.off('terminal.autologin');\n });\n } catch (e) {\n display_exception(e, 'AUTH');\n }\n });\n } catch (e) {\n display_exception(e, 'AUTH');\n }\n }, {\n prompt: strings().password + ': ',\n name: 'password'\n });\n }, {\n prompt: strings().login + ': ',\n name: 'login'\n });\n }\n // ---------------------------------------------------------------------\n function ready(queue) {\n return function(fun) {\n queue.add(fun);\n };\n }\n // ---------------------------------------------------------------------\n function strings() {\n return $.extend(\n {},\n $.terminal.defaults.strings,\n settings && settings.strings || {}\n );\n }\n // ---------------------------------------------------------------------\n // :: 3 functions used to calculate visible padding on the terminal\n // :: they are in fact not on .terminal object only on scroller\n // :: and on cmd plugin margin-bottom, but they are all reflected\n // :: on filler object\n // ---------------------------------------------------------------------\n function get_prop_number(style, prop) {\n return parseInt(style.getPropertyValue(prop), 10) || 0;\n }\n // ---------------------------------------------------------------------\n function get_padding() {\n var style = window.getComputedStyle(filler[0]);\n function padding(name) {\n return get_prop_number(style, 'padding-' + name);\n }\n var left = padding('left');\n var right = padding('right');\n var top = padding('top');\n var bottom = padding('bottom');\n return {\n top: top,\n left: left,\n right: right,\n bottom: bottom\n };\n }\n // ---------------------------------------------------------------------\n var self = this;\n if (this.length > 1) {\n return this.each(function() {\n $.fn.terminal.call(\n $(this),\n init_interpreter,\n $.extend({name: self.selector}, options)\n );\n });\n }\n var body_terminal;\n if (self.is('body,html')) {\n // terminal already exists on body\n if (self.hasClass('full-screen-terminal')) {\n var data = self.find('> .terminal').data('terminal');\n if (data) {\n return data;\n }\n }\n body_terminal = self;\n self = $('<div/>').appendTo('body');\n $('body').addClass('full-screen-terminal');\n } else if (self.data('terminal')) {\n // terminal already exists\n return self.data('terminal');\n }\n // -----------------------------------------------------------------\n // TERMINAL METHODS\n // -----------------------------------------------------------------\n var public_api = $.omap({\n id: function() {\n return terminal_id;\n },\n // -------------------------------------------------------------\n // :: Clear the output\n // -------------------------------------------------------------\n clear: function() {\n if (fire_event('onClear') !== false) {\n buffer.clear();\n lines.clear(function(i) {\n return get_node(i);\n });\n output[0].innerHTML = '';\n self.prop({scrollTop: 0});\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Return an object that can be used with import_view to\n // :: restore the state\n // -------------------------------------------------------------\n export_view: function() {\n var user_export = fire_event('onExport');\n user_export = user_export || {};\n return $.extend({}, {\n focus: enabled,\n mask: command_line.mask(),\n prompt: self.get_prompt(),\n command: self.get_command(),\n position: command_line.position(),\n lines: clone(lines.data()),\n interpreters: interpreters.clone(),\n history: command_line.history().data\n }, user_export);\n },\n // -------------------------------------------------------------\n // :: Restore the state of the previous exported view\n // -------------------------------------------------------------\n import_view: function(view) {\n if (in_login) {\n throw new Error(sprintf(strings().notWhileLogin, 'import_view'));\n }\n fire_event('onImport', [view]);\n when_ready(function ready() {\n self.set_prompt(view.prompt);\n self.set_command(view.command);\n command_line.position(view.position);\n command_line.mask(view.mask);\n if (view.focus) {\n self.focus();\n }\n lines.import(clone(view.lines).filter(function(line) {\n return line[0];\n }));\n if (view.interpreters instanceof Stack) {\n interpreters = view.interpreters;\n }\n if (settings.importHistory) {\n command_line.history().set(view.history);\n }\n redraw();\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Store current terminal state\n // -------------------------------------------------------------\n save_state: function(command, ignore_hash, index) {\n // save_state.push({view:self.export_view(), join:[]});\n if (typeof index !== 'undefined') {\n save_state[index] = self.export_view();\n } else {\n save_state.push(self.export_view());\n }\n if (!Array.isArray(hash_commands)) {\n hash_commands = [];\n }\n if (command !== undefined && !ignore_hash) {\n var state = [\n terminal_id,\n save_state.length - 1,\n command\n ];\n hash_commands.push(state);\n maybe_update_hash();\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Execute a command, it will handle commands that do AJAX\n // :: calls and have delays, if the second argument is set to\n // :: true it will not echo executed command\n // :: if second argument is object is used as options\n // -------------------------------------------------------------\n exec: function(command, silent, options) {\n function invoke(silent) {\n // commands may return promise from user code\n // it will resolve exec promise when user promise\n // is resolved\n var ret = commands(command, silent, true);\n unpromise(ret, function() {\n // reset prev command for push called after exec\n // so push didn't get name/prompt from exec command\n prev_command = null;\n d.resolve();\n }, function() {\n prev_command = null;\n d.reject();\n });\n }\n if (silent && typeof silent === 'object') {\n options = silent;\n silent = null;\n }\n var exec_settings = $.extend({\n deferred: null,\n silent: false,\n typing: false,\n delay: settings.execAnimationDelay\n }, options);\n if (silent === null) {\n silent = exec_settings.silent;\n }\n if (!is_deferred(exec_settings.deferred)) {\n exec_settings.deferred = new $.Deferred();\n }\n var d = exec_settings.deferred;\n cmd_ready(function ready() {\n if (Array.isArray(command)) {\n (function recur() {\n var cmd = command.shift();\n if (cmd) {\n self.exec(cmd, silent, options).done(recur);\n } else {\n d.resolve();\n }\n })();\n } else if (paused) {\n // both commands executed here (resume will call Term::exec)\n // delay command multiple time\n delayed_commands.push([command, silent, exec_settings]);\n } else if (exec_settings.typing && !silent) {\n var delay = exec_settings.delay;\n paused = true;\n var ret = self.typing('enter', delay, command, {\n delay: delay\n });\n ret.then(function() {\n paused = false;\n invoke(true);\n });\n d.then(function() {\n paused = false;\n });\n } else {\n invoke(silent);\n }\n });\n // while testing it didn't executed last exec when using this\n // for resolved deferred\n return d.promise();\n },\n // -------------------------------------------------------------\n // :: bypass login function that wait untill you type user/pass\n // :: it hide implementation detail\n // -------------------------------------------------------------\n autologin: function(user, token, silent) {\n self.trigger('terminal.autologin', [user, token, silent]);\n return self;\n },\n // -------------------------------------------------------------\n // :: main user authentication mechanism\n // -------------------------------------------------------------\n login: function(auth_callback, infinite, success, error) {\n logins.push([].slice.call(arguments));\n if (in_login) {\n throw new Error(sprintf(strings().notWhileLogin, 'login'));\n }\n if (!is_function(auth_callback)) {\n throw new Error(strings().loginIsNotAFunction);\n }\n in_login = true;\n if (self.token() && self.level() === 1 && !autologin) {\n in_login = false; // logout will call login\n self.logout(true);\n } else {\n var token = self.token(true);\n var login = self.login_name(true);\n if (token && login) {\n in_login = false;\n self.pause();\n validate_login(login, token, function(valid) {\n if (valid !== false) {\n if (is_function(success)) {\n success();\n }\n } else {\n self.resume();\n authentication(auth_callback, infinite, success, error);\n }\n });\n } else {\n authentication(auth_callback, infinite, success, error);\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: User defined settings and defaults as well\n // -------------------------------------------------------------\n settings: function() {\n return settings;\n },\n // -------------------------------------------------------------\n // :: Get string before cursor\n // -------------------------------------------------------------\n before_cursor: function(word) {\n var pos = command_line.position();\n var command = command_line.get().slice(0, pos);\n var cmd_strings = command.split(/\\s/);\n var string; // string before cursor that will be completed\n if (word) {\n if (cmd_strings.length === 1) {\n string = cmd_strings[0];\n } else {\n var m = command.match(/(\\\\?\")/g);\n var double_quotes = m ? m.filter(function(chr) {\n return !chr.match(/^\\\\/);\n }).length : 0;\n m = command.match(/'/g);\n var single_quote = m ? m.length : 0;\n if (single_quote % 2 === 1) {\n string = command.match(/('[^']*)$/)[0];\n } else if (double_quotes % 2 === 1) {\n string = command.match(/(\"(?:[^\"]|\\\\\")*)$/)[0];\n } else {\n string = cmd_strings[cmd_strings.length - 1];\n for (i = cmd_strings.length - 1; i > 0; i--) {\n // treat escape space as part of the string\n var prev_string = cmd_strings[i - 1];\n if (prev_string[prev_string.length - 1] === '\\\\') {\n string = cmd_strings[i - 1] + ' ' + string;\n } else {\n break;\n }\n }\n }\n }\n } else {\n string = command;\n }\n return string;\n },\n // -------------------------------------------------------------\n // :: complete word or command based on array of words\n // -------------------------------------------------------------\n complete: function(commands, options) {\n options = $.extend({\n word: true,\n echo: false,\n escape: true,\n echoCommand: false,\n caseSensitive: true,\n doubleTab: null\n }, options || {});\n var sensitive = options.caseSensitive;\n // cursor can be in the middle of the command\n // so we need to get the text before the cursor\n var string = self.before_cursor(options.word).replace(/\\\\\"/g, '\"');\n var quote = false;\n if (options.word) {\n if (string.match(/^\"/)) {\n quote = '\"';\n } else if (string.match(/^'/)) {\n quote = \"'\";\n }\n if (quote) {\n string = string.replace(/^[\"']/, '');\n }\n }\n if (tab_count % 2 === 0) {\n command = self.before_cursor(options.word);\n } else {\n var test = self.before_cursor(options.word);\n if (test !== command) {\n // command line changed between TABS - ignore\n return;\n }\n }\n var safe = $.terminal.escape_regex(string);\n if (options.escape) {\n safe = safe.replace(/(\\\\+)([\"'() ])/g, function(_, slash, chr) {\n if (chr.match(/[()]/)) {\n return slash + '\\\\?\\\\' + chr;\n } else {\n return slash + '?' + chr;\n }\n });\n }\n function escape(string) {\n if (quote === '\"') {\n string = string.replace(/\"/g, '\\\\\"');\n }\n if (!quote && options.escape) {\n string = string.replace(/([\"'() ])/g, '\\\\$1');\n }\n return string;\n }\n function matched_strings() {\n var matched = [];\n for (var i = commands.length; i--;) {\n if (commands[i].match(/\\n/) && options.word) {\n warn('If you use commands with newlines you ' +\n 'should use word option for complete or' +\n ' wordAutocomplete terminal option');\n }\n if (regex.test(commands[i])) {\n var match = escape(commands[i]);\n if (!sensitive && same_case(match)) {\n if (string.toLowerCase() === string) {\n match = match.toLowerCase();\n } else if (string.toUpperCase() === string) {\n match = match.toUpperCase();\n }\n }\n matched.push(match);\n }\n }\n return matched;\n }\n var flags = sensitive ? '' : 'i';\n var regex = new RegExp('^' + safe, flags);\n var matched = matched_strings();\n function replace(input, replacement) {\n var text = self.get_command();\n var pos = self.get_position();\n var re = new RegExp('^' + input, 'i');\n var pre = text.slice(0, pos);\n var post = text.slice(pos);\n var to_insert = replacement.replace(re, '') + (quote || '');\n self.set_command(pre + to_insert + post);\n self.set_position((pre + to_insert).length);\n }\n if (matched.length === 1) {\n if (options.escape) {\n replace(safe, matched[0]);\n } else {\n self.insert(matched[0].replace(regex, '') + (quote || ''));\n }\n command = self.before_cursor(options.word);\n return true;\n } else if (matched.length > 1) {\n if (++tab_count >= 2) {\n tab_count = 0;\n if (options.echo) {\n if (is_function(options.doubleTab)) {\n // new API old is keep for backward compatibility\n if (options.echoCommand) {\n echo_command();\n }\n var ret = options.doubleTab.call(\n self,\n string,\n matched,\n echo_command\n );\n if (typeof ret === 'undefined') {\n return true;\n } else {\n return ret;\n }\n } else if (options.doubleTab !== false) {\n echo_command();\n var text = matched.slice().reverse().join('\\t\\t');\n self.echo($.terminal.escape_brackets(text), {\n keepWords: true,\n formatters: false\n });\n }\n return true;\n }\n } else {\n var common = common_string(escape(string), matched, sensitive);\n if (common) {\n replace(safe, common);\n command = self.before_cursor(options.word);\n return true;\n }\n }\n }\n },\n // -------------------------------------------------------------\n // :: Return commands function from top interpreter\n // -------------------------------------------------------------\n commands: function() {\n return interpreters.top().interpreter;\n },\n // -------------------------------------------------------------\n // :: Low Level method that overwrites interpreter\n // -------------------------------------------------------------\n set_interpreter: function(user_intrp, login) {\n var defer = $.Deferred();\n function overwrite_interpreter() {\n self.pause(settings.softPause);\n make_interpreter(user_intrp, login, function(result) {\n self.resume();\n var top = interpreters.top();\n $.extend(top, result);\n prepare_top_interpreter(true);\n defer.resolve();\n });\n }\n if (is_function(login)) {\n self.login(login, true, overwrite_interpreter);\n } else if (get_type(user_intrp) === 'string' && login) {\n self.login(\n make_json_rpc_login(user_intrp, login),\n true,\n overwrite_interpreter\n );\n } else {\n overwrite_interpreter();\n }\n return defer.promise();\n },\n // -------------------------------------------------------------\n // :: Show user greetings or terminal signature\n // -------------------------------------------------------------\n greetings: function() {\n show_greetings();\n return self;\n },\n // -------------------------------------------------------------\n // :: Return true if terminal is paused false otherwise\n // -------------------------------------------------------------\n paused: function() {\n return paused;\n },\n // -------------------------------------------------------------\n // :: Pause the terminal, it should be used for ajax calls\n // -------------------------------------------------------------\n pause: function(visible) {\n cmd_ready(function ready() {\n onPause();\n paused = true;\n command_line.disable(visible || is_android);\n if (!visible) {\n command_line.find('.cmd-prompt').hidden();\n }\n fire_event('onPause');\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Resume the previously paused terminal\n // -------------------------------------------------------------\n resume: function(silent) {\n cmd_ready(function ready() {\n paused = false;\n if (enabled && terminals.front() === self) {\n command_line.enable(silent);\n }\n command_line.find('.cmd-prompt').visible();\n var original = delayed_commands;\n delayed_commands = [];\n for (var i = 0; i < original.length; ++i) {\n self.exec.apply(self, original[i]);\n }\n self.trigger('resume');\n var fn = resume_callbacks.shift();\n if (fn) {\n fn();\n }\n if (fire_event('onResume') !== false) {\n self.scroll_to_bottom();\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Skip the next terminal animations\n // -------------------------------------------------------------\n skip: function() {\n skip = true;\n },\n // -------------------------------------------------------------\n // :: Stop skipping the next terminal animations\n // -------------------------------------------------------------\n skip_stop: function() {\n skip = false;\n },\n // -------------------------------------------------------------\n // :: Return if key animation is running\n // -------------------------------------------------------------\n animating: function() {\n return animating;\n },\n // -------------------------------------------------------------\n // :: Return the number of characters that fit into the width of\n // :: the terminal\n // -------------------------------------------------------------\n cols: function() {\n if (settings.numChars) {\n return settings.numChars;\n }\n if (!num_chars || num_chars === 1000) {\n num_chars = get_num_chars(self, char_size);\n }\n return num_chars;\n },\n // -------------------------------------------------------------\n // :: Return the number of lines that fit into the height of the\n // :: terminal\n // -------------------------------------------------------------\n rows: function() {\n if (settings.numRows) {\n return settings.numRows;\n }\n if (!num_rows) {\n num_rows = get_num_rows(self, char_size);\n }\n return num_rows;\n },\n // -------------------------------------------------------------\n // :: Return the History object\n // -------------------------------------------------------------\n history: function() {\n return command_line.history();\n },\n // -------------------------------------------------------------\n // :: Return size of the terminal instance\n // -------------------------------------------------------------\n geometry: function() {\n var padding = get_padding();\n return {\n terminal: {\n padding: {\n left: padding.left,\n right: padding.right,\n top: padding.top,\n bottom: padding.bottom\n },\n width: old_width + padding.left + padding.right,\n height: old_height + padding.top + padding.bottom\n },\n density: pixel_density,\n char: char_size,\n cols: this.cols(),\n rows: this.rows()\n };\n },\n // -------------------------------------------------------------\n // :: toggle recording of history state\n // -------------------------------------------------------------\n history_state: function(toggle) {\n function run() {\n settings.historyState = true;\n if (!save_state.length) {\n self.save_state();\n } else if (terminals.length() > 1) {\n self.save_state(null);\n }\n }\n if (toggle) {\n // if set to true and if set from user command we need\n // not to include the command\n if (typeof window.setImmediate === 'undefined') {\n setTimeout(run, 0);\n } else {\n setImmediate(run);\n }\n } else {\n settings.historyState = false;\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: clear the history state\n // -------------------------------------------------------------\n clear_history_state: function() {\n hash_commands = [];\n save_state = [];\n return self;\n },\n // -------------------------------------------------------------\n // :: Switch to the next terminal\n // -------------------------------------------------------------\n next: function() {\n if (terminals.length() === 1) {\n return self;\n } else {\n terminals.front().disable();\n var next = terminals.rotate().enable();\n // 50 provides buffer in viewport\n var x = next.offset().top - 50;\n $('html,body').animate({scrollTop: x}, 500);\n try {\n trigger_terminal_change(next);\n } catch (e) {\n display_exception(e, 'onTerminalChange');\n }\n return next;\n }\n },\n // -------------------------------------------------------------\n // :: Make the terminal in focus or blur depending on the first\n // :: argument. If there is more then one terminal it will\n // :: switch to next one, if the second argument is set to true\n // :: the events will be not fired. Used on init\n // -------------------------------------------------------------\n focus: function(toggle, silent) {\n cmd_ready(function ready() {\n if (terminals.length() === 1) {\n if (toggle === false) {\n self.disable(silent);\n } else {\n self.enable(silent);\n }\n } else if (toggle === false) {\n self.next();\n } else {\n var front = terminals.front();\n if (front !== self) {\n // there should be only from terminal enabled but tests\n // sometime fail because there where more them one\n // where cursor have blink class\n terminals.forEach(function(terminal) {\n if (terminal !== self && terminal.enabled()) {\n terminal.disable(silent);\n }\n });\n if (!silent) {\n try {\n trigger_terminal_change(self);\n } catch (e) {\n display_exception(e, 'onTerminalChange');\n }\n }\n }\n terminals.set(self);\n self.enable(silent);\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Convenient alias\n // -------------------------------------------------------------\n blur: function(silent) {\n return this.focus(false, silent);\n },\n // -------------------------------------------------------------\n // :: Disable/Enable terminal that can be enabled by click\n // -------------------------------------------------------------\n freeze: function(freeze) {\n when_ready(function ready() {\n if (freeze) {\n self.disable();\n frozen = true;\n } else {\n frozen = false;\n self.enable();\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: check if terminal is frozen\n // -------------------------------------------------------------\n frozen: function() {\n return frozen;\n },\n // -------------------------------------------------------------\n // :: Enable the terminal\n // -------------------------------------------------------------\n enable: function(silent) {\n if (!enabled && !frozen) {\n if (num_chars === undefined) {\n // enabling first time\n self.resize();\n }\n cmd_ready(function ready() {\n var ret;\n if (!silent && !enabled) {\n fire_event('onFocus');\n }\n if (!silent && ret === undefined || silent) {\n enabled = true;\n if (!self.paused()) {\n command_line.enable(true);\n }\n }\n });\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: function clear formatting cache if you don't longer need it\n // :: cache is used if option useCache is set to true\n // -------------------------------------------------------------\n clear_cache: 'Map' in root ? function() {\n buffer.clear_cache();\n line_cache.clear();\n command_line.clear_cache();\n return self;\n } : function() {\n return self;\n },\n // -------------------------------------------------------------\n // :: Disable the terminal\n // -------------------------------------------------------------\n disable: function(silent) {\n cmd_ready(function ready() {\n var ret;\n if (!silent && enabled) {\n ret = fire_event('onBlur');\n }\n if (!silent && ret === undefined || silent) {\n enabled = false;\n command_line.disable();\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: return true if the terminal is enabled\n // -------------------------------------------------------------\n enabled: function() {\n return enabled;\n },\n // -------------------------------------------------------------\n // :: Return the terminal signature depending on the size of the terminal\n // -------------------------------------------------------------\n signature: function() {\n var cols = self.cols();\n for (var i = signatures.length; i--;) {\n var lengths = signatures[i].map(function(line) {\n return line.length;\n });\n if (Math.max.apply(null, lengths) <= cols) {\n return signatures[i].join('\\n').replace(/\\s+$/m, '') + '\\n';\n }\n }\n return '';\n },\n // -------------------------------------------------------------\n // :: Return the version number\n // -------------------------------------------------------------\n version: function() {\n return $.terminal.version;\n },\n // -------------------------------------------------------------\n // :: Return actual command line object (jquery object with cmd\n // :: methods)\n // -------------------------------------------------------------\n cmd: function() {\n return command_line;\n },\n // -------------------------------------------------------------\n // :: Return the current command entered by terminal\n // -------------------------------------------------------------\n get_command: function() {\n return command_line.get();\n },\n // -------------------------------------------------------------\n // :: better API than echo_command that supports animation\n // -------------------------------------------------------------\n enter: with_typing('enter', echo_command),\n // -------------------------------------------------------------\n // :: Change the command line to the new one\n // -------------------------------------------------------------\n set_command: function(command, silent) {\n when_ready(function ready() {\n // TODO: refactor to use options - breaking change\n if (typeof command !== 'string') {\n command = JSON.stringify(command);\n }\n command_line.set(command, undefined, silent);\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Change position of the command line\n // -------------------------------------------------------------\n set_position: function(position, relative) {\n when_ready(function ready() {\n command_line.position(position, relative);\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Return position of the command line\n // -------------------------------------------------------------\n get_position: function() {\n return command_line.position();\n },\n // -------------------------------------------------------------\n // :: Insert text into the command line after the cursor\n // -------------------------------------------------------------\n insert: function(string, options) {\n if (typeof string === 'string') {\n var locals;\n var defaults = {\n stay: false,\n typing: false,\n delay: 100\n };\n if (!is_object(options)) {\n options = {\n stay: options\n };\n }\n locals = $.extend(defaults, options);\n var d = new $.Deferred();\n when_ready(function ready() {\n function done() {\n if (settings.scrollOnEcho || bottom) {\n self.scroll_to_bottom();\n }\n }\n var bottom = self.is_bottom();\n if (locals.typing) {\n var delay = locals.delay;\n var p = self.typing('insert', delay, string, settings);\n p.then(function() {\n done();\n d.resolve();\n });\n } else {\n command_line.insert(string, settings.stay);\n done();\n }\n });\n if (locals.typing) {\n return d.promise();\n }\n return self;\n } else {\n throw new Error(sprintf(strings().notAString, 'insert'));\n }\n },\n // -------------------------------------------------------------\n // :: Set the prompt of the command line\n // -------------------------------------------------------------\n set_prompt: with_typing('prompt', function(prompt) {\n if (is_function(prompt)) {\n command_line.prompt(function(callback) {\n return prompt.call(self, callback, self);\n });\n } else {\n command_line.prompt(prompt);\n }\n }, function(prompt) {\n interpreters.top().prompt = prompt;\n }),\n // -------------------------------------------------------------\n // :: Return the prompt used by the terminal\n // -------------------------------------------------------------\n get_prompt: function() {\n return interpreters.top().prompt;\n // command_line.prompt(); - can be a wrapper\n //return command_line.prompt();\n },\n // -------------------------------------------------------------\n // :: Enable or Disable mask depedning on the passed argument\n // :: the mask can also be character (in fact it will work with\n // :: strings longer then one)\n // -------------------------------------------------------------\n set_mask: function(mask) {\n when_ready(function ready() {\n command_line.mask(mask === true ? settings.maskChar : mask);\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Return current mask value\n // -------------------------------------------------------------\n get_mask: function() {\n return command_line.mask();\n },\n // -------------------------------------------------------------\n // :: Return the ouput of the terminal as text\n // :: the output may contain user terminal formatting\n // -------------------------------------------------------------\n get_output: function(raw) {\n if (raw) {\n return lines.data();\n } else {\n return lines.get_snapshot();\n }\n },\n // -------------------------------------------------------------\n // :: Recalculate and redraw everything\n // -------------------------------------------------------------\n resize: function(width, height) {\n if (!self.is(':visible')) {\n // delay resize if terminal not visible\n self.stopTime('resize');\n self.oneTime(500, 'resize', function() {\n self.resize(width, height);\n });\n } else {\n if (width && height) {\n self.width(width);\n self.height(height);\n }\n width = self.width();\n height = self.height();\n if (typeof settings.numChars !== 'undefined' ||\n typeof settings.numRows !== 'undefined') {\n if (typeof settings.numChars !== 'undefined') {\n command_line.resize(settings.numChars);\n self.refresh();\n }\n fire_event('onResize');\n return;\n }\n var new_num_chars = get_num_chars(self, char_size);\n var new_num_rows = get_num_rows(self, char_size);\n // only if number of chars changed\n if (new_num_chars !== num_chars ||\n new_num_rows !== num_rows) {\n self.clear_cache();\n var changed = new_num_chars !== num_chars;\n num_chars = new_num_chars;\n num_rows = new_num_rows;\n if (changed) {\n command_line.resize(num_chars);\n self.refresh();\n }\n fire_event('onResize');\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: redraw the terminal and invalidate cache\n // -------------------------------------------------------------\n refresh: function() {\n if (char_size.width !== 0) {\n css(self[0], {\n '--char-width': char_size.width,\n '--pixel-density': pixel_density\n });\n }\n self.clear_cache();\n if (command) {\n command_line.resize();\n }\n redraw({\n scroll: false,\n update: true\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Flush the output to the terminal\n // -------------------------------------------------------------\n flush: function(options) {\n options = $.extend({}, {\n update: false,\n scroll: true\n }, options || {});\n when_ready(function ready() {\n try {\n if (buffer.is_empty()) {\n return self;\n }\n var bottom = self.is_bottom();\n var scroll = (settings.scrollOnEcho && options.scroll) || bottom;\n var wrapper;\n // print all lines\n var first = true;\n var appending_to_partial = false;\n var partial = $();\n var snapshot;\n var finalizations = [];\n if (!options.update) {\n partial = self.find('.partial');\n snapshot = lines.get_partial();\n }\n // TODO: refactor buffer.flush(), there is way\n // to many levels of abstractions in one place\n buffer.flush(function(data) {\n if (!data) {\n if (!partial.length) {\n wrapper = $('<div/>');\n snapshot = [];\n } else if (first) {\n first = false;\n appending_to_partial = true;\n wrapper = partial;\n }\n } else if (is_function(data.finalize)) {\n if (options.update && data.raw === true && data.newline) {\n // don't re-render html and jQuery/DOM nodes #759\n return;\n }\n if (scroll) {\n wrapper.find('img').on('load', function() {\n self.scroll_to_bottom();\n });\n }\n // this is finalize function from echo\n if (options.update) {\n lines.update_snapshot(data.index, snapshot);\n var node = get_node(data.index);\n if (node.html() !== wrapper.html()) {\n node.replaceWith(wrapper);\n }\n } else {\n wrapper.appendTo(output);\n if (!partial.length) {\n lines.make_snapshot(snapshot);\n }\n }\n wrapper.attr('data-index', data.index);\n appending_to_partial = !data.newline;\n wrapper.toggleClass('partial', appending_to_partial);\n finalizations.push({\n node: wrapper,\n finalize: data.finalize\n });\n if (appending_to_partial) {\n partial = wrapper;\n } else if (data.newline && partial.length) {\n wrapper = $('<div/>');\n partial = $();\n }\n } else {\n var line = data.line;\n var div;\n if (typeof data.raw === 'string') {\n if (appending_to_partial) {\n snapshot[snapshot.length - 1] += data.raw;\n } else {\n snapshot.push(data.raw);\n }\n }\n if (appending_to_partial) {\n div = wrapper.children().last().append(line);\n appending_to_partial = false;\n } else {\n div = $('<div/>').html(line);\n if (data.newline) {\n div.addClass('cmd-end-line');\n }\n wrapper.append(div);\n }\n // width = '100%' does some weird extra magic\n // that makes the height correct. Any other\n // value doesn't work.\n div.css('width', '100%');\n }\n });\n partial = self.find('.partial');\n finalizations.forEach(function(data) {\n data.finalize(data.node);\n });\n var last_row;\n if (partial.length === 0) {\n css(command_line[0], {\n '--prompt-offset': '',\n top: ''\n });\n command_line.__set_prompt_margin(0);\n last_row = self.find('.terminal-output div:last-child' +\n ' div:last-child');\n // check if the div is parital fix #695\n if (last_row.css('display') === 'inline-block') {\n last_row.css({\n width: '100%',\n display: ''\n });\n }\n } else if (snapshot.length && snapshot[snapshot.length - 1]) {\n var len = $.terminal.length(snapshot[snapshot.length - 1]);\n len %= self.cols();\n last_row = partial.children().last();\n var last_row_rect = last_row[0].getBoundingClientRect();\n // Shift command prompt up one line and to the right\n // enough so that it appears directly next to the\n // partially constructed output line\n var size = is_ch_unit_supported ? len + 'ch' : len + 'px';\n css(command_line[0], {\n 'top': (-last_row_rect.height / pixel_density) + 'px',\n '--prompt-offset': size\n });\n command_line.__set_prompt_margin(len);\n }\n limit_lines();\n fire_event('onFlush');\n var cmd_cursor = self.find('.cmd-cursor');\n var offset = self.find('.cmd').offset();\n var self_offset = self.offset();\n self.stopTime('flush').oneTime(10, 'flush', function() {\n var top = output.height();\n var height = command_line.height();\n css(self[0], {\n '--terminal-height': self.height(),\n '--terminal-x': offset.left - self_offset.left,\n '--terminal-y': offset.top - self_offset.top,\n '--terminal-scroll': scroller.prop('scrollTop'),\n '--cmd-top': top,\n '--cmd-height': height\n });\n if (enabled && !is_mobile) {\n // Firefox won't reflow the cursor automatically, so\n // hide it briefly then reshow it\n cmd_cursor.hide();\n self.oneTime(1, 'flush', function() {\n cmd_cursor.show();\n });\n }\n });\n wrapper.on_load({\n done: function() {\n if (scroll) {\n self.scroll_to_bottom();\n }\n }\n });\n } catch (e1) {\n if (is_function(settings.exceptionHandler)) {\n try {\n settings.exceptionHandler.call(\n self,\n e1,\n 'TERMINAL (Flush)'\n );\n } catch (e2) {\n settings.exceptionHandler = $.noop;\n alert_exception('[exceptionHandler]', e2);\n }\n } else {\n alert_exception('[Flush]', e1);\n }\n } finally {\n buffer.clear();\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Update the output line - line number can be negative\n // -------------------------------------------------------------\n update: function(line, value, options) {\n when_ready(function ready() {\n if (line < 0) {\n line = lines.length() + line; // yes +\n }\n if (!lines.valid_index(line)) {\n self.error('Invalid line number ' + line);\n } else if (value === null) {\n lines.update(line, null);\n get_node(line).remove();\n } else {\n value = preprocess_value(value, {\n update: true,\n line: line\n });\n if (value === false) {\n return self;\n }\n unpromise(value, function(value) {\n var ret = prepare_render(value, options);\n if (ret) {\n value = ret[0];\n options = ret[1];\n }\n options = lines.update(line, value, options);\n var next = process_line({\n value: value,\n index: line,\n options: options\n });\n // process_line can return a promise\n // value is function that resolve to promise\n unpromise(next, function() {\n // trigger flush even if next is undefined\n self.flush({\n scroll: false,\n update: true\n });\n });\n });\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: convenience method for removing selected line\n // -------------------------------------------------------------\n remove_line: function(line) {\n return self.update(line, null);\n },\n // -------------------------------------------------------------\n // :: return index of last line in case when you need to update\n // :: after something is echo on the terminal\n // -------------------------------------------------------------\n last_index: function() {\n return lines.length() - 1;\n },\n // -------------------------------------------------------------\n // :: Print data to the terminal output. It can have options\n // :: * flush - indicate that arg should be send to DOM\n // :: * raw - indicate if it should handle input as html\n // :: * finalize - function call with container div\n // :: * keepWords - inform how to wrap text\n // :: * formatters - inform function if it should use formatters\n // :: on input string - good to prevent XSS when you want\n // :: advanced server side controling of terminal\n // :: you can echo: promise, function, strings array or string\n // -------------------------------------------------------------\n echo: function(arg, options, deferred) {\n var arg_defined = arguments.length > 0;\n var d = deferred || new $.Deferred();\n function cont() {\n echo_promise = false;\n var original = echo_delay;\n echo_delay = [];\n for (var i = 0; i < original.length; ++i) {\n self.echo.apply(self, original[i]);\n }\n }\n function error(e) {\n cont();\n display_exception(e, 'ECHO', true);\n }\n function echo(arg) {\n try {\n var locals = $.extend({\n flush: true,\n exec: true,\n raw: settings.raw,\n finalize: $.noop,\n unmount: $.noop,\n delay: settings.execAnimationDelay,\n ansi: false,\n typing: false,\n externalPause: true,\n keepWords: false,\n invokeMethods: settings.invokeMethods,\n onClear: null,\n formatters: true,\n allowedAttributes: settings.allowedAttributes,\n newline: true\n }, options || {});\n var should_pause = settings.externalPause && locals.externalPause;\n // finalize function is passed around and invoked\n // in terminal::flush after content is added to DOM\n (function(finalize) {\n if (is_node(arg)) {\n return;\n }\n locals.finalize = function(node) {\n if (locals.raw) {\n node.addClass('raw');\n }\n if (locals.ansi) {\n node.addClass('ansi');\n }\n try {\n if (is_function(finalize)) {\n finalize.call(self, node);\n }\n node.on_load({\n error: function(element) {\n element.replaceWith(use_broken_image);\n },\n done: function(has_elements) {\n if (has_elements && should_pause) {\n self.resume();\n }\n },\n load: function(has_elements) {\n if (has_elements && should_pause) {\n self.pause();\n }\n }\n });\n } catch (e) {\n display_exception(e, 'USER:echo(finalize)');\n finalize = null;\n }\n };\n })(locals.finalize);\n if (locals.flush) {\n // flush buffer if there was no flush after previous echo\n if (!buffer.empty()) {\n self.flush();\n }\n }\n if (fire_event('onBeforeEcho', [arg]) === false) {\n return;\n }\n if (locals.typing) {\n if (typeof arg !== 'string') {\n return d.reject('echo: Typing animation require string' +\n ' or promise that resolve to string');\n }\n if (typeof locals.delay !== 'number' || isNaN(locals.delay)) {\n return d.reject('echo: Invalid argument, delay need to' +\n ' be a number');\n }\n var p = self.typing('echo', locals.delay, arg, locals);\n p.then(function() {\n d.resolve();\n });\n return;\n }\n var value;\n if (typeof arg === 'function') {\n value = arg.bind(self);\n } else if (typeof arg === 'undefined') {\n if (arg_defined) {\n value = String(arg);\n } else {\n value = '';\n }\n } else {\n var ret = preprocess_value(arg);\n if (ret === false) {\n return self;\n }\n value = ret;\n }\n if (is_promise(value)) {\n echo_promise = true;\n }\n unpromise(value, function(value) {\n if (is_promise(ret) && value === false) {\n return;\n }\n if (render(value, locals)) {\n return self;\n }\n var index = lines.length();\n var last_newline = lines.has_newline();\n if (!last_newline) {\n index--;\n }\n if (!locals.newline && value[value.length - 1] === '\\n') {\n // This adjusts the value, so that when it updates or\n // refresh the lines list it does the right thing.\n value = value.slice(0, -1);\n locals.newline = true;\n }\n var next = process_line({\n value: value,\n options: locals,\n index: index\n });\n // queue async functions in echo\n if (is_promise(next)) {\n echo_promise = true;\n }\n lines.push([value, locals]);\n unpromise(next, function() {\n // extended commands should be processed only\n // once in echo and not on redraw\n if (locals.flush) {\n self.flush();\n fire_event('onAfterEcho', [arg]);\n }\n cont();\n }, error);\n }, error);\n } catch (e) {\n // if echo throw exception we can't use error to\n // display that exception\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, 'TERMINAL (echo)');\n } else {\n alert_exception('[Terminal.echo]', e);\n }\n }\n }\n var is_animation = options && options.typing;\n if (echo_promise) {\n var args = [arg, options];\n if (is_animation) {\n args.push(d);\n }\n echo_delay.push(args);\n } else {\n echo(arg);\n }\n if (is_animation) {\n return d.promise();\n }\n return self;\n },\n // -------------------------------------------------------------\n typing: function(type, delay, string, options) {\n var d = new $.Deferred();\n var settings;\n var finish;\n if (typeof options === 'object') {\n finish = options.finalize || $.noop;\n settings = $.extend({}, options, {\n delay: delay,\n finalize: done\n });\n } else {\n finish = options || $.noop;\n settings = {\n delay: delay,\n finalize: done\n };\n }\n function done() {\n d.resolve();\n if (is_function(finish)) {\n finish.apply(self, arguments);\n }\n }\n var animations = ['prompt', 'echo', 'enter', 'insert'];\n function valid_animation() {\n return animations.indexOf(type) >= 0;\n }\n when_ready(function ready() {\n if (valid_animation()) {\n if (type === 'prompt') {\n typed_prompt(string, settings);\n } else if (type === 'echo') {\n typed_message(string, settings);\n } else if (type === 'enter') {\n with_prompt(self.get_prompt(), function(prompt) {\n typed_enter(prompt, string, settings);\n }, self);\n } else if (type === 'insert') {\n with_prompt(self.get_prompt(), function(prompt) {\n typed_insert(prompt, string, settings);\n }, self);\n }\n } else {\n d.reject('Invalid type only `echo` and `prompt` are supported');\n }\n });\n return d.promise();\n },\n // -------------------------------------------------------------\n // :: echo red text\n // -------------------------------------------------------------\n error: function(message, options) {\n options = $.extend({}, options, {raw: false, formatters: false});\n function format(string) {\n if (typeof string !== 'string') {\n string = String(string);\n }\n // quick hack to fix trailing backslash\n var str = $.terminal.escape_brackets(string).\n replace(/\\\\$/, '\').\n replace(url_re, ']$1[[;;;terminal-error]');\n return '[[;;;terminal-error]' + str + ']';\n }\n if (typeof message === 'function') {\n return self.echo(function() {\n return format(message.call(self));\n }, options);\n }\n if (message && message.then) {\n message.then(function(string) {\n self.echo(format(string));\n }).catch(make_label_error('Echo Error'));\n return self;\n }\n return self.echo(format(message), options);\n },\n // -------------------------------------------------------------\n // :: Display Exception on terminal\n // -------------------------------------------------------------\n exception: function(e, label) {\n var message = exception_message(e);\n if (label) {\n message = '[' + label + ']: ' + message;\n }\n if (message) {\n self.error(message, {\n finalize: function(div) {\n div.addClass('terminal-exception terminal-message');\n },\n keepWords: true\n });\n }\n if (typeof e.fileName === 'string') {\n // display filename and line which throw exeption\n var was_pased = self.paused();\n if (!was_pased) {\n self.pause(settings.softPause);\n }\n $.get(e.fileName, function(file) {\n var num = e.lineNumber - 1;\n var line = file.split('\\n')[num];\n if (line) {\n self.error('[' + e.lineNumber + ']: ' + line);\n }\n if (!was_pased) {\n self.resume();\n }\n }, 'text');\n }\n if (e.stack) {\n self.echo(format_stack_trace(e.stack), {\n finalize: function(div) {\n div.addClass('terminal-exception terminal-stack-trace');\n },\n formatters: false\n });\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Scroll Div that holds the terminal\n // -------------------------------------------------------------\n scroll: function(amount) {\n var pos;\n amount = Math.round(amount);\n if (self.prop) { // work with jQuery > 1.6\n if (amount > scroller.prop('scrollTop') && amount > 0) {\n scroller.prop('scrollTop', 0);\n }\n pos = scroller.prop('scrollTop');\n scroller.scrollTop(pos + amount);\n } else {\n if (amount > scroller.prop('scrollTop') && amount > 0) {\n scroller.prop('scrollTop', 0);\n }\n pos = scroller.prop('scrollTop');\n scroller.scrollTop(pos + amount);\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Exit all interpreters and logout. The function will throw\n // :: exception if there is no login provided\n // -------------------------------------------------------------\n logout: function(local) {\n if (in_login) {\n throw new Error(sprintf(strings().notWhileLogin, 'logout'));\n }\n when_ready(function ready() {\n if (local) {\n var login = logins.pop();\n self.set_token(undefined, true);\n self.login.apply(self, login);\n } else if (interpreters.size() === 1 && self.token()) {\n self.logout(true);\n } else {\n while (interpreters.size() > 1) {\n // pop will call global_logout that will call login\n // and size will be > 0; this is workaround the problem\n if (self.token()) {\n self.logout(true).pop().pop();\n } else {\n self.pop();\n }\n }\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Function returns the token returned by callback function\n // :: in login function. It does nothing (return undefined) if\n // :: there is no login\n // -------------------------------------------------------------\n token: function(local) {\n return storage.get(self.prefix_name(local) + '_token');\n },\n // -------------------------------------------------------------\n // :: Function sets the token to the supplied value. This function\n // :: works regardless of wherer settings.login is supplied\n // -------------------------------------------------------------\n set_token: function(token, local) {\n var name = self.prefix_name(local) + '_token';\n if (typeof token === 'undefined') {\n storage.remove(name);\n } else {\n storage.set(name, token);\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Function get the token either set by the login method or\n // :: by the set_token method.\n // -------------------------------------------------------------\n get_token: function(local) {\n return self.token(local);\n },\n // -------------------------------------------------------------\n // :: Function return Login name entered by the user\n // -------------------------------------------------------------\n login_name: function(local) {\n return storage.get(self.prefix_name(local) + '_login');\n },\n // -------------------------------------------------------------\n // :: Function returns the name of current interpreter\n // -------------------------------------------------------------\n name: function() {\n return interpreters.top().name;\n },\n // -------------------------------------------------------------\n // :: Function return prefix name for login/token\n // -------------------------------------------------------------\n prefix_name: function(local, max_size) {\n var name = (settings.name ? settings.name + '_' : '') +\n terminal_id;\n if (local && interpreters.size() > 1) {\n var local_name = interpreters.map(function(intrp) {\n return intrp.name || '';\n }).slice(1, max_size).join('_');\n if (local_name) {\n name += '_' + local_name;\n }\n }\n return name;\n },\n // -------------------------------------------------------------\n // :: wrapper for common use case\n // -------------------------------------------------------------\n read: function(message, success, cancel) {\n var options;\n if (typeof arguments[1] === 'object') {\n options = $.extend({\n typing: false,\n delay: settings.execAnimationDelay,\n success: $.noop,\n cancel: $.noop\n }, arguments[1]);\n } else {\n options = {\n typing: false,\n success: success || $.noop,\n cancel: cancel || $.noop\n };\n }\n if (options.typing) {\n var prompt = self.get_prompt();\n options.typing = false;\n return self.typing('prompt', options.delay, message).then(function() {\n return self.set_prompt(prompt).read(message, options);\n });\n }\n // return from read() should not pause terminal\n force_awake = true;\n var defer = jQuery.Deferred();\n var read = false;\n self.push(function(string) {\n read = true;\n defer.resolve(string);\n if (is_function(options.success)) {\n options.success(string);\n }\n self.pop();\n if (settings.history) {\n command_line.history().enable();\n }\n }, {\n name: 'read',\n history: false,\n prompt: message || '',\n onExit: function() {\n if (!read) {\n defer.reject();\n if (is_function(options.cancel)) {\n options.cancel();\n }\n }\n }\n });\n if (settings.history) {\n command_line.history().disable();\n }\n if (is_function(options.onReady)) {\n options.onReady.call(self);\n }\n return defer.promise();\n },\n // -------------------------------------------------------------\n // :: Push a new interenter on the Stack\n // -------------------------------------------------------------\n push: function(interpreter, options) {\n cmd_ready(function ready() {\n options = options || {};\n var defaults = {\n infiniteLogin: false\n };\n var push_settings = $.extend({}, defaults, options);\n if (!push_settings.name && prev_command) {\n // name the interpreter from last command\n push_settings.name = prev_command.name;\n }\n if (push_settings.prompt === undefined) {\n push_settings.prompt = (push_settings.name || '>') + ' ';\n }\n // names.push(options.name);\n var top = interpreters.top();\n if (top) {\n top.mask = command_line.mask();\n }\n var was_paused = paused;\n function init() {\n fire_event('onPush', [top, interpreters.top()]);\n prepare_top_interpreter();\n }\n make_interpreter(interpreter, options.login, function(ret) {\n // result is object with interpreter and completion properties\n interpreters.push($.extend({}, ret, push_settings));\n if (push_settings.completion === true) {\n if (Array.isArray(ret.completion)) {\n interpreters.top().completion = ret.completion;\n } else if (!ret.completion) {\n interpreters.top().completion = false;\n }\n }\n if (push_settings.login) {\n var error;\n var type = get_type(push_settings.login);\n if (type === 'function') {\n error = push_settings.infiniteLogin ? $.noop : self.pop;\n self.login(\n push_settings.login,\n push_settings.infiniteLogin,\n init,\n error\n );\n } else if (get_type(interpreter) === 'string' &&\n type === 'string' || type === 'boolean') {\n error = push_settings.infiniteLogin ? $.noop : self.pop;\n self.login(\n make_json_rpc_login(\n interpreter,\n push_settings.login\n ),\n push_settings.infiniteLogin,\n init,\n error\n );\n }\n } else {\n init();\n }\n if (!was_paused && self.enabled()) {\n self.resume();\n }\n });\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Remove the last interpreter from the Stack\n // -------------------------------------------------------------\n pop: function(string, silent) {\n if (string !== undefined) {\n echo_command(string);\n }\n var token = self.token(true);\n var top;\n if (interpreters.size() === 1) {\n top = interpreters.top();\n if (settings.login) {\n if (!silent) {\n fire_event('onPop', [top, null]);\n }\n global_logout();\n fire_event('onExit');\n } else {\n self.error(strings().canExitError);\n }\n } else {\n if (token) {\n clear_loging_storage();\n }\n var current = interpreters.pop();\n top = interpreters.top();\n prepare_top_interpreter();\n // restore mask\n self.set_mask(top.mask);\n if (!silent) {\n fire_event('onPop', [current, top]);\n }\n // we check in case if you don't pop from password interpreter\n if (in_login && self.get_prompt() !== strings().login + ': ') {\n in_login = false;\n }\n if (is_function(current.onExit)) {\n try {\n current.onExit.call(self, self);\n } catch (e) {\n current.onExit = $.noop;\n display_exception(e, 'onExit');\n }\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Change terminal option(s) at runtime\n // -------------------------------------------------------------\n option: function(object_or_name, value) {\n if (typeof value === 'undefined') {\n if (typeof object_or_name === 'string') {\n return settings[object_or_name];\n } else if (typeof object_or_name === 'object') {\n $.each(object_or_name, function(key, value) {\n settings[key] = value;\n });\n }\n } else {\n settings[object_or_name] = value;\n if (object_or_name.match(/^num(Chars|Rows)$/)) {\n redraw();\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: invoke keydown shorcut\n // -------------------------------------------------------------\n invoke_key: function(shortcut) {\n command_line.invoke_key(shortcut);\n return self;\n },\n // -------------------------------------------------------------\n // :: change terminal keymap at runtime\n // -------------------------------------------------------------\n keymap: function(keymap, fn) {\n if (arguments.length === 0) {\n return command_line.keymap();\n }\n if (typeof fn === 'undefined') {\n if (typeof keymap === 'string') {\n return command_line.keymap(keymap);\n } else if ($.isPlainObject(keymap)) {\n // argument is an object\n keymap = $.extend(\n {},\n terminal_init_keymap,\n $.omap(keymap || {}, function(key, fn) {\n if (!terminal_init_keymap[key]) {\n return fn.bind(self);\n }\n return function(e, original) {\n // new keymap function will get default as 2nd arg\n return fn.call(self, e, function() {\n return terminal_init_keymap[key](e, original);\n });\n };\n })\n );\n command_line.keymap(null).keymap(keymap);\n }\n } else if (typeof fn === 'function') {\n var key = keymap;\n if (!terminal_init_keymap[key]) {\n command_line.keymap(key, fn.bind(self));\n } else {\n command_line.keymap(key, function(e, original) {\n return fn.call(self, e, function() {\n return terminal_init_keymap[key](e, original);\n });\n });\n }\n }\n },\n // -------------------------------------------------------------\n // :: Return how deep you are in nested interpreters\n // -------------------------------------------------------------\n level: function() {\n return interpreters.size();\n },\n // -------------------------------------------------------------\n // :: Reinitialize the terminal\n // -------------------------------------------------------------\n reset: function() {\n when_ready(function ready() {\n self.clear();\n while (interpreters.size() > 1) {\n interpreters.pop();\n }\n prepare_top_interpreter();\n show_greetings();\n initialize();\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Remove all local storage left by terminal, it will not\n // :: logout you until you refresh the browser\n // -------------------------------------------------------------\n purge: function() {\n when_ready(function ready() {\n var prefix = self.prefix_name() + '_';\n var names = storage.get(prefix + 'interpreters');\n if (names) {\n $.each(JSON.parse(names), function(_, name) {\n storage.remove(name + '_commands');\n storage.remove(name + '_token');\n storage.remove(name + '_login');\n });\n }\n command_line.purge();\n storage.remove(prefix + 'interpreters');\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Remove all events and DOM nodes left by terminal, it will\n // :: not purge the terminal so you will have the same state\n // :: when you refresh the browser\n // -------------------------------------------------------------\n destroy: function() {\n when_ready(function ready() {\n command_line.destroy().remove();\n self.resizer('unbind');\n self.touch_scroll('unbind');\n font_resizer.resizer('unbind').remove();\n pixel_resizer.resizer('unbind').remove();\n $(document).unbind('.terminal_' + self.id());\n $(window).unbind('.terminal_' + self.id());\n self.unbind('click mousedown mouseup');\n self.removeData('terminal').removeClass('terminal').\n unbind('.terminal');\n if (settings.width) {\n self.css('width', '');\n }\n if (settings.height) {\n self.css('height', '');\n }\n $(window).off('blur', blur_terminal).\n off('focus', focus_terminal);\n self.find('.terminal-fill, .terminal-font, .terminal-font-forcer')\n .remove();\n self.stopTime();\n terminals.remove(terminal_id);\n if (visibility_observer) {\n if (visibility_observer.unobserve) {\n visibility_observer.unobserve(self[0]);\n } else {\n clearInterval(visibility_observer);\n }\n }\n var scroll_marker = self.find('.terminal-scroll-marker');\n if (is_bottom_observer) {\n is_bottom_observer.unobserve(scroll_marker[0]);\n }\n scroll_marker.remove();\n if (mutation_observer) {\n mutation_observer.disconnect();\n }\n if (!terminals.length()) {\n $(window).off('hashchange');\n }\n if (is_mobile) {\n self.off([\n 'touchstart.terminal',\n 'touchmove.terminal',\n 'touchend.terminal'\n ].join(' '));\n }\n output.remove();\n scroller.remove();\n if (body_terminal) {\n var $body = $(body_terminal);\n if ($body.attr('class') === 'full-screen-terminal') {\n $body.removeAttr('class');\n } else {\n $body.removeClass('full-screen-terminal');\n }\n self.remove();\n }\n defunct = true;\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: ref: https://stackoverflow.com/a/18927969/387194\n // -------------------------------------------------------------\n scroll_to: function(elem) {\n var scroll = scroller.scrollTop() - self.offset().top +\n $(elem).offset().top;\n scroller.scrollTop(scroll);\n return self;\n },\n // -------------------------------------------------------------\n scroll_to_bottom: function() {\n var scrollHeight;\n if (self.prop) {\n scrollHeight = scroller.prop('scrollHeight');\n } else {\n scrollHeight = scroller.attr('scrollHeight');\n }\n scroller.scrollTop(scrollHeight);\n return self;\n },\n // -------------------------------------------------------------\n // :: return true if terminal div or body is at the bottom\n // :: is use scrollBottomOffset option as margin for the check\n // -------------------------------------------------------------\n is_bottom: function() {\n if (settings.scrollBottomOffset === -1) {\n return false;\n } else if (typeof is_bottom_detected === 'boolean') {\n return is_bottom_detected;\n } else {\n var scroll_height, scroll_top, height;\n scroll_height = scroller[0].scrollHeight;\n scroll_top = scroller[0].scrollTop;\n height = scroller[0].offsetHeight;\n var limit = scroll_height - settings.scrollBottomOffset;\n return scroll_top + height > limit;\n }\n },\n // -------------------------------------------------------------\n // :: create terminal object clone, used by pipe\n // -------------------------------------------------------------\n duplicate: function() {\n var copy = $(self);\n return $.extend(copy, public_api);\n },\n // -------------------------------------------------------------\n // :: return output flush buffer\n // -------------------------------------------------------------\n get_output_buffer: function(options) {\n var settings = $.extend({\n html: false\n }, options);\n var result = [];\n var append = false;\n buffer.forEach(function(data) {\n if (data) {\n if (is_function(data.finalize)) {\n append = !data.newline;\n } else {\n var output;\n if (settings.html) {\n output = data.line;\n } else {\n output = data.raw;\n }\n if (append) {\n var last = result.length - 1;\n result[last] += output;\n } else {\n result.push(output);\n }\n }\n }\n });\n if (settings.html) {\n return result.map(function(line) {\n return '<div>' + line + '</div>';\n }).join('\\n');\n }\n return result.join('\\n');\n },\n // -------------------------------------------------------------\n // :: clear flush buffer\n // -------------------------------------------------------------\n clear_buffer: function() {\n buffer.clear();\n return self;\n }\n }, function(name, fun) {\n // wrap all functions and display execptions\n return function() {\n if (defunct) {\n if (!settings.exceptionHandler) {\n throw new $.terminal.Exception(strings().defunctTerminal);\n }\n }\n try {\n return fun.apply(self, [].slice.apply(arguments));\n } catch (e) {\n // exec catch by command (resume call exec)\n if (name !== 'exec' && name !== 'resume') {\n display_exception(e, e.type || 'TERMINAL', true);\n }\n if (!settings.exceptionHandler) {\n throw e;\n }\n }\n };\n });\n $.extend(self, public_api);\n // -----------------------------------------------------------------\n // :: INIT CODE\n // -----------------------------------------------------------------\n if (self.length === 0) {\n var msg = sprintf(strings().invalidSelector);\n throw new $.terminal.Exception(msg);\n }\n self.data('terminal', self);\n // synchronize the echo calls (used for async functions) that need\n // to be called in order\n var echo_delay = [];\n var echo_promise = false;\n // var names = []; // stack if interpreter names\n var prev_command; // used for name on the terminal if not defined\n var prev_exec_cmd;\n var tab_count = 0; // for tab completion\n var output; // .terminal-output jquery object\n var terminal_id = terminals.length();\n var force_awake = false; // flag used to don't pause when user return read() call\n var num_chars; // numer of chars in line\n var num_rows; // number of lines that fit without scrollbar\n var command; // for tab completion\n var logins = new Stack(); // stack of logins\n var command_queue = new DelayQueue();\n var animating = false; // true on typing animation\n var skip = false; // true if skipping currently\n var init_queue = new DelayQueue();\n var when_ready = ready(init_queue);\n var cmd_ready = ready(command_queue);\n var is_bottom_detected;\n var is_bottom_observer;\n var in_login = false;// some Methods should not be called when login\n // TODO: Try to use mutex like counter for pause/resume\n var onPause = $.noop;// used to indicate that user call pause onInit\n var old_width, old_height, old_pixel_density;\n var delayed_commands = []; // used when exec commands while paused\n var settings = $.extend(\n {},\n $.terminal.defaults,\n {\n name: self.selector,\n exit: !!(options && options.login || !options)\n },\n options || {}\n );\n if (typeof settings.width === 'number') {\n self.width(settings.width);\n }\n if (typeof settings.height === 'number') {\n self.height(settings.height);\n }\n // so it's the same as in TypeScript definition for options\n delete settings.formatters;\n // used to throw error when calling methods on destroyed terminal\n var defunct = false;\n // ---------------------------------------------------------------------\n // :: FormatBuffer is used to to buffer the lines that echoed\n // :: it have append function that have 2 options raw and finalize\n // :: raw - will not encode the string and finalize if a function that\n // :: will have div container of the line as first argument\n // :: actuall echo to the terminal happen when calling flush\n // ---------------------------------------------------------------------\n var buffer = new FormatBuffer(function(options) {\n return {\n linksNoReferrer: settings.linksNoReferrer,\n linksNoFollow: settings.linksNoFollow,\n anyLinks: settings.anyLinks,\n charWidth: char_size.width,\n useCache: settings.useCache,\n escape: false,\n allowedAttributes: options.allowedAttributes || []\n };\n });\n var lines = new OutputLines(function() {\n return settings;\n });\n var storage = new StorageHelper(settings.memory);\n var enabled = settings.enabled;\n var frozen = false;\n var paused = false;\n var autologin = true; // set to false if onBeforeLogin return false\n var interpreters;\n var command_line;\n var old_enabled;\n var visibility_observer;\n var mutation_observer;\n // backward compatibility\n if (settings.ignoreSystemDescribe === true) {\n settings.describe = false;\n }\n // register ajaxSend for cancel requests on CTRL+D\n $(document).bind('ajaxSend.terminal_' + self.id(), function(e, xhr) {\n requests.push(xhr);\n });\n var scroller = $('<div class=\"terminal-scroller\"/>').appendTo(self);\n var wrapper = $('<div class=\"terminal-wrapper\"/>').appendTo(scroller);\n $(broken_image).hide().appendTo(wrapper);\n var font_resizer = $('<div class=\"terminal-font\"> </div>').appendTo(self);\n var pixel_resizer = $('<div class=\"terminal-pixel\"/>').appendTo(self);\n var filler = $('<div class=\"terminal-fill\"/>').appendTo(scroller);\n output = $('<div>').addClass('terminal-output').attr('role', 'log')\n .appendTo(wrapper);\n self.addClass('terminal');\n var pixel_density = get_pixel_size();\n var char_size = get_char_size(self);\n // this is needed when terminal have selector with --size that is not\n // bare .terminal so fake terminal will not get the proper size #602\n var need_char_size_recalculate = !terminal_ready(self);\n // before login event\n if (settings.login && fire_event('onBeforeLogin') === false) {\n autologin = false;\n }\n // create json-rpc authentication function\n var base_interpreter;\n if (typeof init_interpreter === 'string') {\n base_interpreter = init_interpreter;\n } else if (is_array(init_interpreter)) {\n // first JSON-RPC\n for (var i = 0, len = init_interpreter.length; i < len; ++i) {\n if (typeof init_interpreter[i] === 'string') {\n base_interpreter = init_interpreter[i];\n break;\n }\n }\n }\n var global_login_fn;\n if (is_function(settings.login)) {\n global_login_fn = settings.login;\n } else if (base_interpreter &&\n (typeof settings.login === 'string' || settings.login === true)) {\n global_login_fn = make_json_rpc_login(base_interpreter, settings.login);\n }\n terminals.append(self);\n function focus_terminal() {\n if (old_enabled) {\n self.focus();\n self.scroll_to_bottom();\n }\n }\n // -------------------------------------------------------------------------------\n function get_pixel_size() {\n var rect = pixel_resizer[0].getBoundingClientRect();\n return rect.width || 1;\n }\n // -------------------------------------------------------------------------------\n function blur_terminal() {\n old_enabled = enabled;\n self.disable().find('.cmd textarea').trigger('blur', [true]);\n }\n // -------------------------------------------------------------------------------\n function stringify_value(value) {\n if (is_function(value)) {\n value = value();\n }\n if (value && is_function(value.then)) {\n return value.then(stringify_value);\n }\n if (get_type(value) !== 'string') {\n if (is_function(settings.parseObject)) {\n var ret = settings.parseObject(value);\n if (get_type(ret) === 'string') {\n value = ret;\n }\n } else if (is_array(value)) {\n value = $.terminal.columns(value, self.cols(), settings.tabs);\n } else {\n var need_suffix = is_big_int(value);\n value = String(value);\n if (need_suffix) {\n value += 'n';\n }\n }\n }\n return value;\n }\n // -------------------------------------------------------------------------------\n function context_callback_proxy(fn) {\n if (fn.proxy) {\n return fn;\n }\n var wrapper = function(callback) {\n return fn.call(self, callback, self);\n };\n wrapper.proxy = true;\n return wrapper;\n }\n // -------------------------------------------------------------------------------\n // paste event is not testable in node\n // istanbul ignore next\n function paste_event(e) {\n e = e.originalEvent;\n // we don't care about browser that don't support clipboard data\n // those browser simple will not have this feature normal paste\n // is cross-browser and it's handled by cmd plugin\n function is_type(item, type) {\n return item.type.indexOf(type) !== -1;\n }\n function echo_image(image) {\n self.echo('<img src=\"' + image + '\"/>', {raw: true});\n }\n function data_uri(blob) {\n var URL = window.URL || window.webkitURL;\n return URL.createObjectURL(blob);\n }\n function echo(object, ignoreEvents) {\n if (!ignoreEvents) {\n var event = {\n target: self\n };\n if (typeof object === 'string') {\n event.text = object;\n } else if (object instanceof Blob) {\n event.image = data_uri(object);\n }\n var ret = fire_event('onPaste', [event]);\n if (ret) {\n if (is_function(ret.then || ret.done)) {\n return (ret.then || ret.done).call(ret, function(ret) {\n echo(ret, true);\n });\n } else {\n echo(ret, true);\n }\n } else if (ret !== false) {\n echo(event.image || event.text, true);\n }\n } else if (object instanceof Blob) {\n echo_image(data_uri(object));\n } else if (typeof object === 'string') {\n if (object.match(/^(data:|blob:)/)) {\n echo_image(object);\n } else {\n self.insert(object);\n }\n }\n }\n if (e.clipboardData) {\n if (self.enabled()) {\n var items = e.clipboardData.items;\n if (items) {\n for (var i = 0; i < items.length; i++) {\n if (is_type(items[i], 'image') && settings.pasteImage) {\n var blob = items[i].getAsFile();\n echo(blob);\n } else if (is_type(items[i], 'text/plain')) {\n items[i].getAsString(function(text) {\n echo(text.replace(/\\r/g, ''));\n });\n }\n }\n } else if (e.clipboardData.getData) {\n var text = e.clipboardData.getData('text/plain');\n echo(text.replace(/\\r/g, ''));\n }\n return false;\n }\n }\n }\n $(document).on('paste.terminal_' + self.id(), paste_event);\n var terminal_init_keymap = $.extend(\n {},\n keymap,\n $.omap(settings.keymap || {}, function(key, fn) {\n if (!keymap[key]) {\n return fn.bind(self);\n }\n return function(e, original) {\n // new keymap function will get default as 2nd argument\n return fn.call(self, e, function() {\n return keymap[key](e, original);\n });\n };\n })\n );\n make_interpreter(init_interpreter, settings.login, function(interpreter) {\n if (settings.completion && typeof settings.completion !== 'boolean' ||\n !settings.completion) {\n // overwrite interpreter completion by global setting #224\n // we use string to indicate that it need to be taken from settings\n // so we are able to change it using option API method\n interpreter.completion = 'settings';\n }\n var prompt = settings.prompt;\n if (is_function(prompt)) {\n prompt = context_callback_proxy(prompt);\n }\n interpreters = new Stack($.extend({}, settings.extra, {\n name: settings.name,\n prompt: prompt,\n keypress: settings.keypress,\n keydown: settings.keydown,\n resize: settings.onResize,\n greetings: settings.greetings,\n mousewheel: settings.mousewheel,\n history: settings.history,\n keymap: terminal_init_keymap\n }, interpreter));\n // CREATE COMMAND LINE\n command_line = $('<div/>').appendTo(wrapper).cmd({\n tabindex: settings.tabindex,\n mobileDelete: settings.mobileDelete,\n mobileIngoreAutoSpace: settings.mobileIngoreAutoSpace,\n prompt: global_login_fn ? false : prompt,\n history: settings.memory ? 'memory' : settings.history,\n historyFilter: settings.historyFilter,\n historySize: settings.historySize,\n caseSensitiveSearch: settings.caseSensitiveSearch,\n onPaste: settings.onPaste,\n width: '100%',\n enabled: false,\n charWidth: char_size.width,\n keydown: key_down,\n keymap: terminal_init_keymap,\n clickTimeout: settings.clickTimeout,\n holdTimeout: settings.holdTimeout,\n holdRepeatTimeout: settings.holdRepeatTimeout,\n repeatTimeoutKeys: settings.repeatTimeoutKeys,\n allowedAttributes: settings.allowedAttributes,\n keypress: key_press,\n tabs: settings.tabs,\n onPositionChange: function() {\n var args = [].slice.call(arguments);\n make_cursor_visible();\n fire_event('onPositionChange', args);\n },\n onCommandChange: function(command) {\n // resize is not triggered when insert called just after init\n // and scrollbar appear\n if (old_width !== filler.width()) {\n // resizer handler will update old_width\n self.resizer();\n }\n fire_event('onCommandChange', [command]);\n make_cursor_visible();\n },\n commands: commands\n });\n function disable(e) {\n if (is_mobile) {\n return;\n }\n e = e.originalEvent;\n if (e) {\n // e.terget is body when click outside of context menu to close it\n // even if you click on terminal\n var node = document.elementFromPoint(e.clientX, e.clientY);\n if (!$(node).closest('.terminal').length && self.enabled()) {\n // we only need to disable when click outside of terminal\n // click on other terminal is handled by focus event\n self.disable();\n }\n }\n }\n self.oneTime(100, function() {\n $(document).bind('click.terminal_' + self.id(), disable).\n bind('contextmenu.terminal_' + self.id(), disable);\n });\n var $win = $(window);\n // cordova application, if keyboard was open and we resume, it will be\n // closed so we need to disable terminal so you can enable it with tap\n document.addEventListener(\"resume\", function() {\n self.disable();\n });\n // istanbul ignore next\n if (is_mobile) {\n (function() {\n self.addClass('terminal-mobile');\n var start;\n var move;\n var enabled;\n var SENSITIVITY = 3;\n var clip = command_line.clip();\n var HOLD_TIME = 200;\n var timer;\n clip.$node.off('touchstart.cmd');\n self.on('touchstart.terminal', function(e) {\n e = e.originalEvent;\n window.touch_event = e;\n if (e.target.tagName.toLowerCase() === 'a') {\n return;\n }\n if (!frozen && e.touches.length === 1) {\n enabled = self.enabled();\n var point = e.touches[0];\n start = {\n x: point.clientX,\n y: point.clientY\n };\n timer = setTimeout(function() {\n start = null;\n }, HOLD_TIME);\n }\n }).on('touchmove.terminal', function(e) {\n if (e.touches.length === 1 && start) {\n var point = e.touches[0];\n var diff_x = Math.abs(point.clientX - start.x);\n var diff_y = Math.abs(point.clientY - start.y);\n if (diff_x > SENSITIVITY || diff_y > SENSITIVITY) {\n move = true;\n }\n }\n }).on('touchend.terminal', function() {\n if (start) {\n clearTimeout(timer);\n if (!move) {\n if (!enabled) {\n clip.focus();\n self.focus();\n setTimeout(function() {\n self.scroll_to_bottom();\n }, 100);\n } else {\n clip.blur();\n self.disable();\n }\n }\n }\n move = false;\n start = null;\n });\n })();\n if ('visualViewport' in window) {\n on_height_change(function(height) {\n css(document.documentElement, {\n '--terminal-force-height': height + 'px'\n });\n });\n }\n } else {\n // work weird on mobile\n $win.on('focus.terminal_' + self.id(), focus_terminal).\n on('blur.terminal_' + self.id(), blur_terminal);\n // context is used to check if terminal should not scroll to bottom\n // after right click on e.g. img, canvas, a and then click to hide\n // the menu. The problem is that right click on those elements don't\n // move the textarea to show proper context menu like save as on images\n // or open on links. See #644 bug\n var was_ctx_event;\n // detect mouse drag\n (function() {\n var count = 0;\n var $target;\n var name = 'click_' + self.id();\n var textarea = self.find('.cmd textarea');\n function click() {\n if ($target.is('.terminal') ||\n $target.is('.terminal-scroller') ||\n $target.is('.terminal-wrapper')) {\n var len = self.get_command().length;\n self.set_position(len);\n } else if ($target.closest('.cmd-prompt').length) {\n self.set_position(0);\n }\n if (!textarea.is(':focus')) {\n textarea.focus();\n }\n reset();\n }\n function reset() {\n count = 0;\n $target = null;\n }\n var ignore_elements = '.terminal-output textarea,' +\n '.terminal-output input';\n self.mousedown(function(e) {\n if (!scrollbar_event(e, filler, pixel_density)) {\n $target = $(e.target);\n }\n }).mouseup(function() {\n if (was_ctx_event) {\n was_ctx_event = false;\n return;\n }\n if ($target && $target.closest(ignore_elements).length) {\n if (enabled) {\n self.disable();\n }\n } else if (get_selected_html() === '' && $target) {\n if (++count === 1) {\n if (!frozen) {\n if (!enabled) {\n self.focus();\n self.scroll_to_bottom();\n } else {\n var timeout = settings.clickTimeout;\n self.oneTime(timeout, name, click);\n return;\n }\n }\n } else {\n self.stopTime(name);\n }\n }\n reset();\n }).dblclick(function() {\n reset();\n self.stopTime(name);\n });\n })();\n (function() {\n var $clip = command_line.clip().$node;\n function is_context_event(e) {\n return e.type === 'mousedown' && e.buttons === 2 ||\n e.type === 'contextmenu';\n }\n var event_name;\n if ('oncontextmenu' in window) {\n event_name = 'contextmenu.terminal';\n } else {\n event_name = 'mousedown.terminal';\n }\n self.on(event_name, function(e) {\n was_ctx_event = get_selected_html() === '' &&\n is_context_event(e) &&\n !e.ctrlKey;\n if (was_ctx_event) {\n var $target = $(e.target);\n if ($target.is('img,value,audio,object,canvas,a')) {\n return;\n }\n if (!self.enabled()) {\n self.enable();\n }\n var cmd_offset = command_line.offset();\n var cmd_rect = command_line[0].getBoundingClientRect();\n var self_offset = self.offset();\n var top_limit = self_offset.top - cmd_offset.top;\n var top = Math.max(e.pageY - cmd_offset.top - 20, top_limit);\n var left = e.pageX - cmd_offset.left - 20;\n var height = 4 * 14;\n var width = 5 * 14;\n var rect = self[0].getBoundingClientRect();\n // we need width without scrollbar\n var content_width = filler.outerWidth() * pixel_density;\n // fix jumping when click near bottom or left edge #592\n var diff_h = (top + cmd_rect.top + height);\n diff_h = diff_h - rect.height - rect.top;\n var diff_w = (left + cmd_rect.left + width);\n // in Chrome scrollbar is added even when width\n // of textarea is smaller, adding 1px solved the issue\n diff_w = diff_w - content_width - rect.left;\n if (diff_h > 0) {\n height -= Math.ceil(diff_h);\n }\n if (diff_w > 0) {\n width -= Math.ceil(diff_w);\n }\n $clip.attr('style', [\n style_prop('left', left, true),\n style_prop('top', top, true),\n style_prop('width', width, true),\n style_prop('height', height, true)\n ].join(';'));\n if (!$clip.is(':focus')) {\n $clip.focus();\n }\n self.stopTime('textarea');\n self.oneTime(100, 'textarea', function() {\n var props = {\n left: '',\n top: '',\n width: '',\n height: ''\n };\n if (!is_css_variables_supported) {\n var in_line = self.find('.cmd .cmd-cursor-line')\n .prevUntil('.cmd-prompt').length;\n props.top = in_line * 14 + 'px';\n }\n $clip.css(props);\n });\n self.stopTime('selection');\n self.everyTime(20, 'selection', function() {\n if ($clip[0].selection !== $clip[0].value) {\n if (get_textarea_selection($clip[0])) {\n clear_textarea_selection($clip[0]);\n select(\n self.find('.terminal-output')[0],\n self.find('.cmd div:last-of-type')[0]\n );\n self.stopTime('selection');\n }\n }\n });\n }\n });\n })();\n self.on('scroll', function() {\n var $textarea = self.find('textarea');\n var rect = self[0].getBoundingClientRect();\n var height = self[0].scrollHeight;\n var scrollTop = scroller.scrollTop();\n var diff = height - (scrollTop + rect.height);\n // if scrolled to bottom top need to be aligned with cursor line\n // done by CSS file using css variables\n if (diff === 0) {\n $textarea.css('top', '');\n } else {\n $textarea.css('top', -diff);\n }\n });\n }\n self.on('click', 'a', function(e) {\n var $this = $(this);\n if ($this.closest('.terminal-exception').length) {\n var href = $this.attr('href');\n if (href.match(/:[0-9]+$/)) { // display line if specified\n e.preventDefault();\n print_line(href, self.cols());\n }\n }\n // refocus because links have tabindex in case where user want\n // tab change urls, we can ignore this function on click\n if (enabled) {\n self.find('.cmd textarea').focus();\n }\n });\n function calculate_char_size() {\n var width = char_size.width;\n char_size = get_char_size(self);\n if (width !== char_size.width) {\n command_line.option('charWidth', char_size.width).refresh();\n }\n }\n resize();\n function resize() {\n if (self.is(':visible')) {\n var width = scroller.width();\n var height = filler.height();\n pixel_density = get_pixel_size();\n css(self[0], {\n '--pixel-density': pixel_density\n });\n if (need_char_size_recalculate) {\n need_char_size_recalculate = !terminal_ready(self);\n if (!need_char_size_recalculate) {\n char_size = get_char_size(self);\n calculate_char_size();\n }\n }\n // prevent too many calculations in IE\n if (old_height !== height ||\n old_width !== width ||\n pixel_density !== old_pixel_density) {\n self.resize();\n }\n old_height = height;\n old_width = width;\n old_pixel_density = pixel_density;\n }\n }\n function create_resizers() {\n var options = {\n prefix: 'terminal-'\n };\n self.resizer('unbind').resizer(resize, options);\n font_resizer.resizer('unbind').resizer(function() {\n calculate_char_size();\n self.resize();\n }, options);\n pixel_resizer.resizer('unbind').resizer(function() {\n pixel_density = get_pixel_size();\n self.refresh();\n }, options);\n $('<div class=\"terminal-font-forcer terminal-hidden\">x<div>')\n .appendTo(self);\n }\n function bottom_detect(intersections) {\n is_bottom_detected = intersections[0].intersectionRatio >= 0.9;\n }\n function create_bottom_detect() {\n if (window.IntersectionObserver) {\n var top = $('<div class=\"terminal-scroll-marker\"/>')\n .appendTo(scroller);\n var marker = top;\n if (settings.scrollBottomOffset !== -1) {\n var style = style_prop('height', settings.scrollBottomOffset);\n marker = $('<div style=\"' + style + '\"/>').appendTo(top);\n }\n is_bottom_observer = new IntersectionObserver(bottom_detect, {\n root: scroller[0],\n rootMargin: '0px',\n threshold: 1.0\n });\n is_bottom_observer.observe(marker[0]);\n }\n }\n // this observer can be added imedietely even if terminal is not in the DOM\n // because both of the elements (root and target) are in same fragment\n create_bottom_detect();\n if (self.is(':visible')) {\n create_resizers();\n }\n function observe_visibility() {\n if (visibility_observer) {\n if (visibility_observer.unobserve) {\n visibility_observer.unobserve(self[0]);\n } else {\n clearInterval(visibility_observer);\n }\n }\n var was_enabled = self.enabled();\n var visible = self.is(':visible');\n if (was_enabled && !visible) {\n self.disable();\n }\n if (visible) {\n create_resizers();\n } else {\n // hide terminal content until it's resized (and num chars calculated)\n wrapper.css('visibility', 'hidden');\n }\n function visibility_checker() {\n if (self.is(':visible') && !visible) {\n visible = true;\n create_resizers();\n calculate_char_size();\n resize();\n if (was_enabled) {\n self.enable();\n }\n wrapper.css('visibility', '');\n } else if (visible && !self.is(':visible')) {\n visible = false;\n was_enabled = $.terminal.active() === self && self.enabled();\n self.disable();\n wrapper.css('visibility', 'hidden');\n }\n }\n if (window.IntersectionObserver && self.css('position') !== 'fixed') {\n visibility_observer = new IntersectionObserver(visibility_checker, {\n root: null\n });\n visibility_observer.observe(self[0]);\n } else {\n visibility_observer = setInterval(visibility_checker, 100);\n }\n }\n var in_dom = !!self.closest('body').length;\n var MutationObsrv = window.MutationObserver || window.WebKitMutationObserver;\n if (MutationObsrv) {\n mutation_observer = new MutationObsrv(function() {\n if (self.closest('body').length) {\n if (!in_dom) {\n self.scroll_to_bottom();\n // this observer need to be added when terminal is in the DOM\n observe_visibility();\n resize();\n }\n in_dom = true;\n } else if (in_dom) {\n in_dom = false;\n }\n });\n mutation_observer.observe(document.body, {childList: true});\n }\n if (in_dom) {\n // check if element is in the DOM if not running IntersectionObserver\n // don't make sense\n observe_visibility();\n }\n // wait for custom font to load #892\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(function() {\n if (have_custom_font(self)) {\n calculate_char_size();\n self.resize();\n }\n command_queue.resolve();\n });\n } else {\n command_queue.resolve();\n }\n // touch devices need touch event to get virtual keyboard\n if (enabled && self.is(':visible') && !is_mobile) {\n self.focus(undefined, true);\n } else {\n self.disable();\n }\n // -------------------------------------------------------------\n // initialization\n // -------------------------------------------------------------\n if (is_function(global_login_fn)) {\n self.login(global_login_fn, true, start);\n init_queue.resolve();\n initialize();\n } else {\n start();\n initialize();\n }\n // -------------------------------------------------------------\n // :: helper\n function exec_spec(spec, options) {\n var terminal = terminals.get()[spec[0]];\n // execute if belong to this terminal\n var defer = $.Deferred();\n if (terminal && terminal_id === terminal.id()) {\n if (!spec[2]) {\n defer.resolve();\n return defer.promise();\n } else if (paused) {\n resume_callbacks.push(function() {\n return terminal.exec(spec[2], options).done(function() {\n terminal.save_state(spec[2], true, spec[1]);\n defer.resolve();\n });\n });\n return defer.promise();\n } else {\n return terminal.exec(spec[2], options).done(function() {\n terminal.save_state(spec[2], true, spec[1]);\n });\n }\n }\n }\n // exec from hash called in each terminal instance\n if (settings.execHash) {\n if (location.hash) {\n // wait until login is initialized\n setTimeout(function() {\n try {\n var hash = location.hash.replace(/^#/, '');\n // yes no var - local inside terminal\n hash_commands = JSON.parse(decodeURIComponent(hash));\n if (!hash.match(/\\[/)) {\n // fix the hash to look like array if it's not\n replace_hash(hash_commands);\n }\n var i = 0;\n var options = {\n typing: settings.execAnimation,\n delay: settings.execAnimationDelay\n };\n (function recur() {\n var spec = hash_commands[i++];\n if (spec) {\n exec_spec(spec, options).done(recur);\n } else {\n change_hash = true;\n }\n })();// */\n } catch (e) {\n // invalid json - ignore\n }\n });\n } else {\n change_hash = true;\n }\n } else {\n change_hash = true; // if enabled later\n }\n // change_hash = true; // exec can now change hash\n // -------------------------------------------------------------\n /* istanbul ignore next */\n (function() {\n var shift = false;\n $(document).bind('keydown.terminal_' + self.id(), function(e) {\n if (e.shiftKey) {\n shift = true;\n }\n }).bind('keyup.terminal_' + self.id(), function(e) {\n // in Google Chromium/Linux shiftKey is false\n if (e.shiftKey || e.which === 16) {\n shift = false;\n }\n });\n // this could work without calling scroll on wheel event but we\n // need it for cases where you have mouse wheel work differently\n // like with less command that scroll text\n function mousewheel(event, delta) {\n if (!shift) {\n var interpreter = interpreters.top();\n var ret;\n if (is_function(interpreter.mousewheel)) {\n ret = interpreter.mousewheel(event, delta, self);\n } else if (is_function(settings.mousewheel)) {\n ret = settings.mousewheel(event, delta, self);\n }\n if (ret === true) {\n return;\n }\n if ((have_scrollbar() || ret === false) && !event.ctrlKey) {\n event.stopPropagation();\n event.preventDefault();\n }\n if (ret === false) {\n return false;\n }\n if (delta > 0) {\n self.scroll(-40);\n } else {\n self.scroll(40);\n }\n }\n }\n if ($.event.special.mousewheel) {\n // we keep mousewheel plugin just in case\n scroller.on('mousewheel', mousewheel);\n } else {\n // detection take from:\n // https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n var event;\n var div = document.createElement(\"div\");\n if (\"onwheel\" in div) {\n event = \"wheel\"; // Modern browsers support \"wheel\"\n } else if (document.onmousewheel !== undefined) {\n // Webkit and IE support at least \"mousewheel\"\n event = \"mousewheel\";\n } else {\n // let's assume that remaining browsers are older Firefox\n event = \"DOMMouseScroll\";\n }\n div = null;\n self.on(event, function(e) {\n var delta;\n if (event === 'mousewheel') {\n delta = - 1 / 40 * e.originalEvent.wheelDelta;\n } else {\n delta = e.originalEvent.deltaY || e.originalEvent.detail;\n }\n mousewheel(e, -delta);\n });\n }\n scroller.touch_scroll(function(event) {\n var delta = event.current.clientY - event.previous.clientY;\n var ret;\n var interpreter = interpreters.top();\n if (is_function(interpreter.touchscroll)) {\n ret = interpreter.touchscroll(event, delta, self);\n } else if (is_function(settings.touchscroll)) {\n ret = settings.touchscroll(event, delta, self);\n }\n css(self[0], {\n '--terminal-scroll': scroller.prop('scrollTop')\n });\n if (ret === true) {\n return;\n }\n return false;\n });\n })();\n }); // make_interpreter\n return self;\n }; // terminal plugin\n});\n"],"names":["ctx","sprintf","cache","hasOwnProperty","arguments","parse","format","call","parse_tree","argv","cursor","tree_length","length","node_type","arg","output","i","k","match","pad","pad_character","pad_length","get_type","push","test","toString","String","fromCharCode","parseInt","toExponential","parseFloat","toFixed","slice","toUpperCase","charAt","str_repeat","join","fmt","_fmt","arg_names","exec","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","variable","Object","prototype","toLowerCase","input","multiplier","global","self","window","factory","undefined","root","Error","define","amd","jquery","wcwidth","module","exports","jQuery","require","$","cash","debug","str","console","log","DelayQueue","callbacks","Callbacks","resolved","this","resolve","fire","add","fn","omap","o","result","each","v","text_length","map","text","get","reduce","a","b","Clone","clone_object","object","tmp","Array","isArray","clone_array","key","array","is_function","item","bind","clone","Map","clear","forEach","value","delete","localStorage","hasLS","testKey","storage","setItem","removeItem","error","hasCookies","document","cookie","split","e","isLS","wls","n","c","wc","dt","Date","setTime","getTime","toGMTString","rls","rc","nn","ca","indexOf","dls","dc","extend","Storage","set","remove","debounce","FUNC_ERROR_TEXT","isObject","type","now","func","wait","options","nativeMax","Math","max","nativeMin","min","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","leadingEdge","setTimeout","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","everyTime","interval","label","times","belay","timer","oneTime","stopTime","guid","regex","powers","ms","cs","ds","s","das","hs","ks","timeParse","trim","num","mult","element","counter","isNaN","constructor","Number","$timers","$timerID","handler","inProgress","setInterval","timers","ret","lab","clearInterval","_fn","navigator","userAgent","one","els","undef","nativeSplit","compliantExecNpcg","separator","limit","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","separator2","lastIndex","lastLength","RegExp","source","index","replace","caret","pos","target","isContentEditable","contentEditable","getSelection","is","focus","range1","getRangeAt","range2","cloneRange","selectNodeContents","setEnd","endContainer","endOffset","selectionStart","selection","createRange","body","createTextRange","moveToElementText","setEndPoint","range","duplicate","bookmark","getBookmark","moveToBookmark","moveStart","collapse","focusNode","setSelectionRange","select","make_callback_plugin","factory_settings","init","noop","destroy","name","callback","trigger","unbind","data_name","$this","fireWith","data","has","removeData","resizer","settings","prefix","first","on","ResizeObserver","observe","iframe","addClass","appendTo","contentWindow","observer","unobserve","find","off","touch_scroll","origin","previous","originalEvent","tagName","touches","current","preventDefault","on_load","load","done","defers","defer","Deferred","reject","when","then","jquery_resolve","promise","unpromise","is_promise","catch","promises","filter","always","is_fully_in_viewport","is_visible","node","container","box","getBoundingClientRect","viewport","top","bottom","height","IntersectionObserver","item_observer","entries","isIntersecting","ratio","entity_re","space_re","combine_chr_re","astral_symbols_re","emoji_re","mobile_re","tablet_re","format_split_re","format_parts_re","format_re","format_exist_re","format_full_re","format_begin_re","format_start_re","format_end_re","self_closing_re","color_re","url_re","url_nf_re","email_re","url_full_re","email_full_re","command_re","extended_command_re","format_exec_split_re","format_exec_re","float_re","re_re","string_re","unclosed_strings_re","broken_image","use_broken_image","animation_supported","animation","domPrefixes","elm","createElement","style","animationName","agent","is_IE","is_IEMobile","is_ch_unit_supported","div","width","is_css_variables_supported","CSS","supports","is_android","is_key_native","KeyboardEvent","proto","getOwnPropertyDescriptor","is_browser","is_mobile","check","substr","platform","maxTouchPoints","vendor","opera","ch_unit_bug","base","ch","space","abs","css","obj","isPlainObject","keys","setProperty","getPropertyValue","style_prop","important","props","prop","a11y_hide","attr","role","aria-hidden","excepctions","alert_exception","terminal","Exception","message","exception_message","generate_id","firstPart","random","secondPart","scrollbar_event","pixel_density","left","offset","max_width","outerWidth","clientX","fileName","Cycle","rotate","skip","defined","append","front","restart","Boolean","Stack","is_array","size","pop","concat","WorkerCache","validation","action","onCache","_onCache","_action","_validation","_cache","validate","valid","History","memory","enabled","storage_key","JSON","stringify","new_data","reset","last","end","position","next","old","purge","enable","disable","toggle","OutputLines","_settings","_lines","_snapshot","make_snapshot","snapshot","get_partial","update_snapshot","limit_snapshot","clear_snapshot","get_snapshot","acc","arr","some","import","has_newline","last_line","newline","line","onClear","unmount","lines","len","update","valid_index","render","cols","lines_to_show","outputLimit","pivot","FormatBuffer","_options","_format_cache","_output_buffer","NEW_LINE","raw","use_cache","useCache","empty","raw_lines","formatted","finalize","clear_cache","is_empty","with_prompt","prompt","context","escape_brackets","deferred","string","cmd_index","cmd","defaults","mask","caseSensitiveSearch","historySize","history","onPositionChange","onCommandChange","inputStyle","mobileDelete","onPaste","clickTimeout","holdTimeout","holdRepeatTimeout","mobileIngoreAutoSpace","repeatTimeoutKeys","tabindex","tabs","mobile_ignore_key","maybe_data","id","wrapper","cursor_line","clip","$node","autocapitalize","autocorrect","spellcheck","insertAfter","val","html","blur","removeAllRanges","before","num_chars","char_width","last_rendered_prompt","prompt_last_line","just_prompt_len","prompt_offset","prompt_len","prompt_node","reverse_search","rev_search_str","reverse_search_position","backup_prompt","command","last_command","kill_text","formatted_position","restart_animation","paste_count","line_marker","line_marker_re","empty_marker_re","get_char_pos","closest","parent","prevAll","prevUntil","key_mapping","SPACEBAR","UP","DOWN","LEFT","RIGHT","DEL","MULTIPLY","DIVIDE","SUBTRACT","ADD","ie_key_fix","get_key","combo","ctrlKey","metaKey","shiftKey","altKey","keycodes","3","6","8","9","12","13","16","17","18","19","20","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","48","49","50","51","52","53","54","55","56","57","91","93","144","145","181","182","183","186","187","188","189","190","191","192","219","220","221","222","224","225","246","247","248","249","250","251","letter","reversed_keycodes","which","keymap","default_keymap","ALT+D","delete_forward","clipboard","HOLD+ALT+D","hold","HOLD+DELETE","HOLD+SHIFT+DELETE","ENTER","historyFilter","prev_command","no_keydown","commands","draw_prompt","SHIFT+ENTER","insert","BACKSPACE","backspace_key","SHIFT+BACKSPACE","TAB","CTRL+D","DELETE","HOLD+ARROWUP","up_arrow","ARROWUP","CTRL+ARROWUP","prev_history","CTRL+P","ARROWDOWN","down_arrow","HOLD+ARROWDOWN","CTRL+N","next_history","CTRL+ARROWDOWN","ARROWLEFT","HOLD+ARROWLEFT","CTRL+B","CTRL+ARROWLEFT","CTRL+R","reverse_history_search","draw_reverse_prompt","redraw","CTRL+G","ARROWRIGHT","right","HOLD+ARROWRIGHT","CTRL+F","CTRL+ARROWRIGHT","re","bare_text","F12","return_true","END","CTRL+END","CTRL+E","HOME","home","CTRL+HOME","CTRL+A","SHIFT+INSERT","paste_event","CTRL+SHIFT+T","CTRL+W","delete_backward","CTRL+BACKSPACE","HOLD+BACKSPACE","HOLD+SHIFT+BACKSPACE","CTRL+H","CTRL+X","CTRL+C","get_selected_html","CTRL+T","CTRL+Y","CTRL+V","META+V","CTRL+K","text_to_clipboard","CTRL+U","CTRL+TAB","META+`","META+R","META+L","delete_character_forward","delete_word_forward","substring","m","delete_character_backward","delete_word_backward","isenabled","paste","fix_textarea","first_up_history","have_newlines","have_wrapping","lengths","wrap","simple_split_command_line","split_equal","escape_regex","unescape_brackets","col","column","prev","is_splitted","left_over","diff","after","$line","is_ending","is_next_broken","lastIndexOf","sum","mobile_focus","$clip","fix_cursor","getComputedStyle","_class","className","position_only","removeClass","new_cursor","insertBefore","animating","blink","toggleClass","clear_reverse_state","history_data","save_string","j","get_char_width","$prompt","get_num_chars","floor","process_cmd_line","skip_empty","strip","nextUntil","prompt_marker","get_prompt_marker","first_len","strlen","splitted","cmd_line_worker","_previous_value","_cols","split_command_line","formatting","skip_formatted_position","escape_formatting","format_options","unixFormattingEscapeBrackets","apply_formatters","normalize","stack","encoded","encode","charWidth","allowedAttributes","partition","is_multiline","start","is_emoji_formatting","is_formatting","draw_cursor_line","end_line","cursor_end_line","empty_cursor","before_str","c_before","cursor_len","lines_after","last_ins","lines_before","display","original_string","from_last","last_len","new_pos","line_index","current_len","msg","strings","redrawError","in_line","find_position","make_guess","opts","cmp","search_pos","guess","next_guess","codepoint_len","binary_search","chars","split_characters","prev_prompt_data","format_prompt","tmp_prompt","have_formatting","format_split","encoded_last_line","formatters","crlf","spans","hide","show","fire_change_command","include_prompt","option","stay","removed","silent","command_changed","new_keymap","original","bare_command","doc","keypress_event","keydown_event","input_event","display_column","__set_prompt_margin","user_prompt","should_redraw","relative","refresh","display_position","command_len","new_formatted_pos","visible","resize","new_num_chars","invoke_key","shortcut","warn","ctrl","shift","alt","meta","Event","documentElement","keyCode","new_mask","skip_keypress","dead_key","single_key","no_keypress","no_key","backspace","process","hold_pause","skip_insert","prev_key","is_backspace","is_single","is_delay_key","specials","clear_reverse_search_key","skip_keydown","fake","exception","keydown","clear_hold","is_terminal_selected","keypress","normalized","inArray","event","chr","skip_input","finalize_input_event","get_next_character","keycode","charCodeAt","was_down","count","$target","is_prompt","down","button","count_selfclosing_formatting","entities","&","<",">","À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","Ø","Ù","Ú","Û","Ü","Ý","Þ","ß","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï","ð","ñ","ò","ó","ô","õ","ö","ø","ù","ú","û","ü","ý","þ","ÿ"," ","¡","¢","£","¤","¥","¦","§","¨","©","ª","«","¬","­","®","¯","°","±","²","³","´","µ","¶","¸","¹","º","»","¼","½","¾","¿","×","÷","∀","∂","∃","∅","∇","∈","∉","∋","∏","∑","−","∗","√","∝","∞","∠","∧","∨","∩","∪","∫","∴","∼","≅","≈","≠","≡","≤","≥","⊂","⊃","⊄","⊆","⊇","⊕","⊗","⊥","⋅","Α","Β","Γ","Δ","Ε","Ζ","Η","Θ","Ι","Κ","Λ","Μ","Ν","Ξ","Ο","Π","Ρ","Σ","Τ","Υ","Φ","Χ","Ψ","Ω","α","β","γ","δ","ε","ζ","η","θ","ι","κ","λ","μ","ν","ξ","ο","π","ρ","ς","σ","τ","υ","φ","χ","ψ","ω","ϑ","ϒ","ϖ","Œ","œ","Š","š","Ÿ","ƒ","ˆ","˜"," "," "," ","‌","‍","‎","‏","–","—","‘","’","‚","“","”","„","†","‡","•","…","‰","′","″","‹","›","‾","€","™","←","↑","→","↓","↔","↵","⌈","⌉","⌊","⌋","◊","♠","♣","♥","♦","render_entities","_","hex","code","entity","safe","char_len","make_re_fn","test_re","starts_with","is_simple_text","make_next_char_fun","tests","test_astral","m1","m2","next_char","match_entity","match_combo","match_emoji","astral_match","normalize_position","style_to_string","styles","escape_html_attr","char_width_object","char_width_prop","extra_css","bare","wide_characters","specs","spec","make_string","compare_fn","more_args","mid","startContainer","parentNode","term","sel","rangeCount","appendChild","cloneContents","innerHTML","with_selection","ranges","addRange","process_selected_line","$self","hasClass","process_div","process_selected_html","stdout","$html","$cmd_lines","support_copy","queryCommandSupported","$textarea","had_focus","writeText","execCommand","$text","get_textarea_selection","textarea","selectionEnd","clear_textarea_selection","common_string","matchCase","string_case","candidate","candidateLower","currentLower","trigger_terminal_change","terminals","onTerminalChange","setBaseAndExtent","setStart","childNodes","process_command","quotes","rest","args_quotes","on_height_change","visualViewport","addEventListener","newHeight","version","date","color_names","valid_color","color","unclosed_strings","special","is_extended_command","each_extended_command","parts","tracking_replace","rex","replacement","new_string","rep_string","new_position","last_index","c0","rep_len","iterate_formatting","is_any_space","is_space","have_entities","is_open_formatting","is_escape_bracket","is_bracket","is_text","not_formatting","opening","closing_formatting","in_text","next_iteration","char","is_next_space","prev_space","is_last","space_count","re_ent","braket","start_index","end_index","start_formatting","end_formatting","prev_index","semicolons","amp","keepWords","prev_format","first_index","line_length","last_bracket","leading_spaces","can_break","stripped","text_len","after_index","new_index","closed_formatting","matched","sp","nested_formatting","class_i","attrs_i","unique","update_style","new_style","old_style","parse_style","stringify_formatting","stringify_attrs","stringify_class","stringify_styles","ignore","attrs","stringify_style","klass","get_inherit_style","update_attrs","new_attrs","parse_formatting","classes","__inherit__","test_lengths","formatter","__no_warn__","should_format","have_any","apply_function_formatter","__meta__","found_position","partials","this_len","length_before","loop","after_len","position_partial","partial","columns","no_formatting","column_limit","whole","bracket","active","last_id","parse_argument","strict","parse_string","quote","BigInt","parse_arguments","split_arguments","parse_command","split_command","parse_options","boolean","token","single","text_part","escaped","extended_command","invokeMethods","change_hash","eval","iterator","Symbol","replacer","search","process_formatting","new_formatter","clean_data","is_path","url","with_url_validation","anyLinks","linksNoReferrer","linksNoFollow","escape","valid_href","valid_src","filter_attr_names","names","allowed","filters","attrs_to_string","valid_attrs","style_attrs","rel_attr","rel","unshift","default_rel","pre_process_link","includes","pre_process_image","background","data_text","text_decoration","--color","--original-color","background-color","--background","extra","style_str","output_attrs","Terminal_Exception","hidden","warnings","ids","jrpc","method","params","success","validJSONRPC","response","request","jsonrpc","json","status","jqXHR","ajax","beforeSend","jxhr","content_type","getResponseHeader","intercept","contentType","dataType","async","rpc","res","terminal_ready","format_stack_trace","trace","get_char_size","visiblity","temp","char_size","get_num_rows","filler","all","same","same_case","is_object","is_big_int","is_deferred","have_custom_font","custom_font","fonts","from","font","face","family","version_set","copyright","version_string","reg","name_ver","signatures","exit","maskChar","checkArity","exceptionHandler","pauseEvents","softPause","mousewheel","touchscroll","cancelableAjax","processArguments","execAnimation","execAnimationDelay","externalPause","processRPCResponse","completionEscape","convertLinks","scrollObject","historyState","importHistory","echoCommand","scrollOnEcho","login","unixFormatting","escapeBrackets","ansiParser","ansiArt","onAjaxError","pasteImage","scrollBottomOffset","wordAutocomplete","caseSensitiveAutocomplete","describe","onRPCError","doubleTab","doubleTabEchoCommand","completion","onInit","onBlur","onFocus","onExit","onPush","onPop","renderHandler","onAfterRedraw","onEchoCommand","onFlush","onBeforeCommand","onAfterCommand","onBeforeEcho","onAfterEcho","onBeforeLogin","onAfterLogout","onBeforeLogout","comletionParameters","wrongPasswordTryAgain","wrongPassword","ajaxAbortError","wrongArity","commandNotFound","oneRPCWithIgnore","oneInterpreterFunction","loginFunctionMissing","noTokenError","serverResponse","wrongGreetings","notWhileLogin","loginIsNotAFunction","canExitError","invalidCompletion","invalidSelector","invalidTerminalId","password","recursiveLoop","notAString","invalidStrings","invalidMask","defunctTerminal","requests","save_state","hash_commands","fire_hash_change","first_instance","init_interpreter","StorageHelper","get_processed_command","preprocess_value","Animation","is_node","prepare_render","replaceWith","echo","get_node","Element","display_object","print_line","url_spec","pause","file","resume","display_json_rpc_error","at","make_basic_json_rpc","auth","rpc_interceptor","interpreter","display_exception","ajax_error","make_object_interpreter","arity","fallback","user_command","onCommandNotFound","xhr","responseText","make_json_rpc_object","jrpc_success","jrpc_request","jrpc_response","procs","field","interpreter_object","proc","args_len","help","found","make_interpreter","user_intrp","rpc_count","fn_interpreter","recur","interpreters","new_obj","make_json_rpc_login","user","passwd","links","linkify","should_wrap","line_cache","process_extended_commands","line_settings","clear_exec","prev_exec_cmd","process_line","stringify_value","buffer","raw_string","scroll","command_line","detached_output","detach","rows","fire_event","limit_lines","$lines","for_remove","parents","show_greetings","greetings","signature","mask_command","echo_command","get_command","have_scrollbar","restore_state","command_idx","import_view","export_view","make_label_error","maybe_update_hash","location","hash","first_command","resume_callbacks","init_state","execHash","before_async_exec","saved_change_hash","after_exec","is_animation_promise","invoke","force_awake","paused","ghost","level","logout","in_login","get_token","set_token","global_logout","clear_loging_storage","global_login_fn","prefix_name","maybe_append_name","interpreter_name","prepare_top_interpreter","login_name","context_callback_proxy","is_dynamic_prompt","terminal_init_keymap","fun","onStart","skip_local","scroll_to_view","scroll_to","it","make_cursor_visible","replace_hash","state","replaceState","new_hash","href","hashchange","decodeURIComponent","init_queue","initialize","echo_delay","onPause","was_paused","user_key_down","get_position","set_command","CTRL+L","orignal","caseSensitive","before_cursor","complete","word","scroll_to_bottom","PAGEDOWN","PAGEUP","key_down","tab_count","r","readyState","abort","key_press","typed","finish_typing_fn","optimized","typing_animation","formatted_lines","get_prompt","char_i","new_prompt","set_prompt","is_bottom","anim_lines","stop","formatted_line","input_chars","input_len","is_partial","typing","skip_stop","chr_rest","idx","remove_line","delay","typed_prompt","typed_insert","helper","typed_message","typed_enter","with_typing","kind","else_fn","finalize_fn","with_typing_fn","d","when_ready","ready","locals","p","validate_login","token_or_password","authentication","auth_callback","infinite","clear_token","pop_user_pass","login_callback","set_mask","pass","err","queue","get_prop_number","get_padding","padding","selector","body_terminal","public_api","terminal_id","scrollTop","user_export","view","ignore_hash","exec_settings","cmd_ready","delayed_commands","autologin","logins","cmd_strings","double_quotes","single_quote","prev_string","sensitive","slash","matched_strings","pre","post","to_insert","set_position","reverse","common","set_interpreter","overwrite_interpreter","numChars","numRows","num_rows","geometry","old_width","old_height","density","history_state","run","setImmediate","clear_history_state","x","animate","freeze","frozen","enter","get_mask","get_output","new_num_rows","changed","--char-width","--pixel-density","appending_to_partial","finalizations","children","last_row","--prompt-offset","last_row_rect","cmd_cursor","self_offset","--terminal-height","--terminal-x","--terminal-y","--terminal-scroll","scroller","--cmd-top","--cmd-height","e1","e2","arg_defined","cont","echo_promise","ansi","should_pause","has_elements","last_newline","is_animation","finish","animations","valid_animation","was_pased","lineNumber","amount","round","local","max_size","local_name","intrp","read","onReady","infiniteLogin","push_settings","object_or_name","font_resizer","pixel_resizer","blur_terminal","focus_terminal","visibility_observer","scroll_marker","is_bottom_observer","mutation_observer","disconnect","$body","removeAttr","defunct","elem","scrollHeight","is_bottom_detected","scroll_height","scroll_top","offsetHeight","copy","get_output_buffer","clear_buffer","command_queue","old_pixel_density","old_enabled","ignoreSystemDescribe","get_pixel_size","need_char_size_recalculate","base_interpreter","rect","parseObject","need_suffix","proxy","is_type","echo_image","image","data_uri","blob","URL","webkitURL","createObjectURL","ignoreEvents","Blob","clipboardData","items","getAsFile","getAsString","getData","onResize","elementFromPoint","clientY","$win","move","SENSITIVITY","HOLD_TIME","touch_event","point","y","diff_x","diff_y","--terminal-force-height","was_ctx_event","click","ignore_elements","mousedown","mouseup","timeout","dblclick","is_context_event","buttons","event_name","cmd_offset","cmd_rect","top_limit","pageY","pageX","content_width","diff_h","diff_w","ceil","calculate_char_size","create_resizers","bottom_detect","intersections","intersectionRatio","create_bottom_detect","marker","rootMargin","threshold","observe_visibility","was_enabled","visibility_checker","in_dom","MutationObsrv","MutationObserver","WebKitMutationObserver","childList","exec_spec","delta","stopPropagation","onmousewheel","wheelDelta","deltaY","detail"],"mappings":"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"}