{"version":3,"file":"ZeroClipboard.Core.min.js","sources":["ZeroClipboard.Core.js"],"names":["window","undefined","_zcSwfVersion","_currentElement","_copyTarget","_window","_document","document","_navigator","navigator","_setTimeout","setTimeout","_clearTimeout","clearTimeout","_setInterval","setInterval","_clearInterval","clearInterval","_getComputedStyle","getComputedStyle","_encodeURIComponent","encodeURIComponent","_ActiveXObject","ActiveXObject","_Error","Error","_parseInt","Number","parseInt","_parseFloat","parseFloat","_isNaN","isNaN","_now","Date","now","_keys","Object","keys","_defineProperty","defineProperty","_hasOwn","prototype","hasOwnProperty","_slice","Array","slice","_unwrap","unwrapper","el","wrap","unwrap","div","createElement","unwrappedDiv","nodeType","e","_args","argumentsObj","call","_extend","i","len","arg","prop","src","copy","args","arguments","target","length","_deepCopy","source","_pick","obj","newObj","_omit","indexOf","_deleteOwnProperties","_containedBy","ancestorEl","ownerDocument","parentNode","_getDirPathOfUrl","url","dir","split","lastIndexOf","_getCurrentScriptUrlFromErrorStack","stack","matches","match","_getCurrentScriptUrlFromError","err","sourceURL","fileName","_getCurrentScriptUrl","jsPath","scripts","currentScript","getElementsByTagName","readyState","_getUnanimousScriptParentDir","jsDir","_getDefaultSwfPath","_flashState","bridge","version","pluginType","disabled","outdated","unavailable","degraded","deactivated","overdue","ready","_minimumFlashVersion","_handlers","_clipData","_clipDataFormatMap","_flashCheckTimeout","_swfFallbackCheckInterval","_eventMessages","error","flash-disabled","flash-outdated","flash-unavailable","flash-degraded","flash-deactivated","flash-overdue","version-mismatch","clipboard-error","config-mismatch","swf-not-found","_globalConfig","swfPath","trustedDomains","location","host","cacheBust","forceEnhancedClipboard","flashLoadTimeout","autoActivate","bubbleEvents","containerId","containerClass","swfObjectId","hoverClass","activeClass","forceHandCursor","title","zIndex","_config","options","test","_isValidHtml4Id","_state","browser","flash","zeroclipboard","ZeroClipboard","config","_isFlashUnusable","_on","eventType","listener","events","added","toLowerCase","on","replace","push","emit","type","flashErrorTypes","name","jsVersion","swfVersion","_off","foundIndex","perEventHandlers","off","splice","_listeners","_emit","event","eventCopy","returnVal","tmp","_createEvent","_preprocessEvent","_dispatchCallbacks","this","_mapClipDataToFlash","data","formatMap","_create","isFlashUnusable","maxWait","_embedSwf","_destroy","clearData","blur","_unembedSwf","_setData","format","dataObj","dataFormat","_clearData","_getData","_focus","element","_removeClass","_addClass","newTitle","getAttribute","htmlBridge","_getHtmlBridge","setAttribute","useHandCursor","_getStyle","_setHandCursor","_reposition","_blur","removeAttribute","style","left","top","width","_activeElement","id","relatedTarget","currentTarget","timeStamp","msg","message","minimumVersion","clipboardData","setData","_mapClipResultsFromFlash","_getRelatedTarget","_addMouseData","targetEl","relatedTargetId","getElementById","srcElement","fromElement","toElement","pos","_getElementPosition","screenLeft","screenX","screenTop","screenY","scrollLeft","body","documentElement","scrollTop","pageX","_stageX","pageY","_stageY","clientX","clientY","moveX","movementX","moveY","movementY","x","y","offsetX","offsetY","layerX","layerY","_shouldPerformAsync","_dispatchCallback","func","context","async","apply","wildcardTypeHandlers","specificTypeHandlers","handlers","concat","originalContext","handleEvent","sourceIsSwf","_source","flashErrorNames","_clearTimeoutsAndPolling","wasDeactivated","textContent","htmlContent","value","outerHTML","innerHTML","innerText","_queueEmitClipboardErrors","_safeActiveElement","focus","_fireMouseEvent","bubbles","cancelable","aftercopyEvent","errors","errorEvent","success","doc","defaults","view","defaultView","canBubble","detail","button","which","createEvent","dispatchEvent","ctrlKey","altKey","shiftKey","metaKey","initMouseEvent","_watchForSwfFallbackContent","pollWait","Math","min","fallbackContentId","_isElementVisible","_createHtmlBridge","container","className","position","height","_getSafeZIndex","flashBridge","nodeName","allowScriptAccess","_determineScriptAccess","allowNetworking","flashvars","_vars","swfUrl","_cacheBust","divToBeReplaced","appendChild","tmpDiv","usingActiveX","firstChild","replaceChild","display","removeSwfFromIE","removeChild","clipData","newClipData","text","html","rtf","clipResults","newResults","tmpHash","path","domain","domains","str","trustedOriginsExpanded","_extractDomain","protocol","join","originOrUrl","protocolIndex","pathIndex","_extractAllDomains","origins","resultsArray","currentDomain","configOptions","swfDomain","activeElement","classList","contains","add","classNames","setClass","c","cl","remove","getPropertyValue","getBoundingClientRect","elRect","pageXOffset","pageYOffset","leftBorderWidth","clientLeft","topBorderWidth","clientTop","leftBodyOffset","topBodyOffset","bodyRect","htmlRect","right","bottom","styles","hasCssHeight","hasCssWidth","hasCssTop","hasCssLeft","cssKnows","rect","isVisible","visibility","enabled","setHandCursor","val","_detectFlashSupport","parseFlashVersion","desc","isPepperFlash","flashPlayerFileName","inspectPlugin","plugin","hasFlash","flashVersion","description","filename","isPPAPI","ax","mimeType","isActiveX","plugins","mimeTypes","enabledPlugin","GetVariable","e1","e2","e3","_createClient","writable","configurable","enumerable","state","create","destroy","getData","activate","deactivate","define","amd","module","exports"],"mappings":"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","sourcesContent":["/*!\n * ZeroClipboard\n * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.\n * Copyright (c) 2009-2014 Jon Rohan, James M. Greene\n * Licensed MIT\n * http://zeroclipboard.org/\n * v2.2.0-beta.3\n */\n(function(window, undefined) {\n  \"use strict\";\n  /**\n * Store references to critically important global functions that may be\n * overridden on certain web pages.\n */\n  var _window = window, _document = _window.document, _navigator = _window.navigator, _setTimeout = _window.setTimeout, _clearTimeout = _window.clearTimeout, _setInterval = _window.setInterval, _clearInterval = _window.clearInterval, _getComputedStyle = _window.getComputedStyle, _encodeURIComponent = _window.encodeURIComponent, _ActiveXObject = _window.ActiveXObject, _Error = _window.Error, _parseInt = _window.Number.parseInt || _window.parseInt, _parseFloat = _window.Number.parseFloat || _window.parseFloat, _isNaN = _window.Number.isNaN || _window.isNaN, _now = _window.Date.now, _keys = _window.Object.keys, _defineProperty = _window.Object.defineProperty, _hasOwn = _window.Object.prototype.hasOwnProperty, _slice = _window.Array.prototype.slice, _unwrap = function() {\n    var unwrapper = function(el) {\n      return el;\n    };\n    if (typeof _window.wrap === \"function\" && typeof _window.unwrap === \"function\") {\n      try {\n        var div = _document.createElement(\"div\");\n        var unwrappedDiv = _window.unwrap(div);\n        if (div.nodeType === 1 && unwrappedDiv && unwrappedDiv.nodeType === 1) {\n          unwrapper = _window.unwrap;\n        }\n      } catch (e) {}\n    }\n    return unwrapper;\n  }();\n  /**\n * Convert an `arguments` object into an Array.\n *\n * @returns The arguments as an Array\n * @private\n */\n  var _args = function(argumentsObj) {\n    return _slice.call(argumentsObj, 0);\n  };\n  /**\n * Shallow-copy the owned, enumerable properties of one object over to another, similar to jQuery's `$.extend`.\n *\n * @returns The target object, augmented\n * @private\n */\n  var _extend = function() {\n    var i, len, arg, prop, src, copy, args = _args(arguments), target = args[0] || {};\n    for (i = 1, len = args.length; i < len; i++) {\n      if ((arg = args[i]) != null) {\n        for (prop in arg) {\n          if (_hasOwn.call(arg, prop)) {\n            src = target[prop];\n            copy = arg[prop];\n            if (target !== copy && copy !== undefined) {\n              target[prop] = copy;\n            }\n          }\n        }\n      }\n    }\n    return target;\n  };\n  /**\n * Return a deep copy of the source object or array.\n *\n * @returns Object or Array\n * @private\n */\n  var _deepCopy = function(source) {\n    var copy, i, len, prop;\n    if (typeof source !== \"object\" || source == null || typeof source.nodeType === \"number\") {\n      copy = source;\n    } else if (typeof source.length === \"number\") {\n      copy = [];\n      for (i = 0, len = source.length; i < len; i++) {\n        if (_hasOwn.call(source, i)) {\n          copy[i] = _deepCopy(source[i]);\n        }\n      }\n    } else {\n      copy = {};\n      for (prop in source) {\n        if (_hasOwn.call(source, prop)) {\n          copy[prop] = _deepCopy(source[prop]);\n        }\n      }\n    }\n    return copy;\n  };\n  /**\n * Makes a shallow copy of `obj` (like `_extend`) but filters its properties based on a list of `keys` to keep.\n * The inverse of `_omit`, mostly. The big difference is that these properties do NOT need to be enumerable to\n * be kept.\n *\n * @returns A new filtered object.\n * @private\n */\n  var _pick = function(obj, keys) {\n    var newObj = {};\n    for (var i = 0, len = keys.length; i < len; i++) {\n      if (keys[i] in obj) {\n        newObj[keys[i]] = obj[keys[i]];\n      }\n    }\n    return newObj;\n  };\n  /**\n * Makes a shallow copy of `obj` (like `_extend`) but filters its properties based on a list of `keys` to omit.\n * The inverse of `_pick`.\n *\n * @returns A new filtered object.\n * @private\n */\n  var _omit = function(obj, keys) {\n    var newObj = {};\n    for (var prop in obj) {\n      if (keys.indexOf(prop) === -1) {\n        newObj[prop] = obj[prop];\n      }\n    }\n    return newObj;\n  };\n  /**\n * Remove all owned, enumerable properties from an object.\n *\n * @returns The original object without its owned, enumerable properties.\n * @private\n */\n  var _deleteOwnProperties = function(obj) {\n    if (obj) {\n      for (var prop in obj) {\n        if (_hasOwn.call(obj, prop)) {\n          delete obj[prop];\n        }\n      }\n    }\n    return obj;\n  };\n  /**\n * Determine if an element is contained within another element.\n *\n * @returns Boolean\n * @private\n */\n  var _containedBy = function(el, ancestorEl) {\n    if (el && el.nodeType === 1 && el.ownerDocument && ancestorEl && (ancestorEl.nodeType === 1 && ancestorEl.ownerDocument && ancestorEl.ownerDocument === el.ownerDocument || ancestorEl.nodeType === 9 && !ancestorEl.ownerDocument && ancestorEl === el.ownerDocument)) {\n      do {\n        if (el === ancestorEl) {\n          return true;\n        }\n        el = el.parentNode;\n      } while (el);\n    }\n    return false;\n  };\n  /**\n * Get the URL path's parent directory.\n *\n * @returns String or `undefined`\n * @private\n */\n  var _getDirPathOfUrl = function(url) {\n    var dir;\n    if (typeof url === \"string\" && url) {\n      dir = url.split(\"#\")[0].split(\"?\")[0];\n      dir = url.slice(0, url.lastIndexOf(\"/\") + 1);\n    }\n    return dir;\n  };\n  /**\n * Get the current script's URL by throwing an `Error` and analyzing it.\n *\n * @returns String or `undefined`\n * @private\n */\n  var _getCurrentScriptUrlFromErrorStack = function(stack) {\n    var url, matches;\n    if (typeof stack === \"string\" && stack) {\n      matches = stack.match(/^(?:|[^:@]*@|.+\\)@(?=http[s]?|file)|.+?\\s+(?: at |@)(?:[^:\\(]+ )*[\\(]?)((?:http[s]?|file):\\/\\/[\\/]?.+?\\/[^:\\)]*?)(?::\\d+)(?::\\d+)?/);\n      if (matches && matches[1]) {\n        url = matches[1];\n      } else {\n        matches = stack.match(/\\)@((?:http[s]?|file):\\/\\/[\\/]?.+?\\/[^:\\)]*?)(?::\\d+)(?::\\d+)?/);\n        if (matches && matches[1]) {\n          url = matches[1];\n        }\n      }\n    }\n    return url;\n  };\n  /**\n * Get the current script's URL by throwing an `Error` and analyzing it.\n *\n * @returns String or `undefined`\n * @private\n */\n  var _getCurrentScriptUrlFromError = function() {\n    var url, err;\n    try {\n      throw new _Error();\n    } catch (e) {\n      err = e;\n    }\n    if (err) {\n      url = err.sourceURL || err.fileName || _getCurrentScriptUrlFromErrorStack(err.stack);\n    }\n    return url;\n  };\n  /**\n * Get the current script's URL.\n *\n * @returns String or `undefined`\n * @private\n */\n  var _getCurrentScriptUrl = function() {\n    var jsPath, scripts, i;\n    if (_document.currentScript && (jsPath = _document.currentScript.src)) {\n      return jsPath;\n    }\n    scripts = _document.getElementsByTagName(\"script\");\n    if (scripts.length === 1) {\n      return scripts[0].src || undefined;\n    }\n    if (\"readyState\" in scripts[0]) {\n      for (i = scripts.length; i--; ) {\n        if (scripts[i].readyState === \"interactive\" && (jsPath = scripts[i].src)) {\n          return jsPath;\n        }\n      }\n    }\n    if (_document.readyState === \"loading\" && (jsPath = scripts[scripts.length - 1].src)) {\n      return jsPath;\n    }\n    if (jsPath = _getCurrentScriptUrlFromError()) {\n      return jsPath;\n    }\n    return undefined;\n  };\n  /**\n * Get the unanimous parent directory of ALL script tags.\n * If any script tags are either (a) inline or (b) from differing parent\n * directories, this method must return `undefined`.\n *\n * @returns String or `undefined`\n * @private\n */\n  var _getUnanimousScriptParentDir = function() {\n    var i, jsDir, jsPath, scripts = _document.getElementsByTagName(\"script\");\n    for (i = scripts.length; i--; ) {\n      if (!(jsPath = scripts[i].src)) {\n        jsDir = null;\n        break;\n      }\n      jsPath = _getDirPathOfUrl(jsPath);\n      if (jsDir == null) {\n        jsDir = jsPath;\n      } else if (jsDir !== jsPath) {\n        jsDir = null;\n        break;\n      }\n    }\n    return jsDir || undefined;\n  };\n  /**\n * Get the presumed location of the \"ZeroClipboard.swf\" file, based on the location\n * of the executing JavaScript file (e.g. \"ZeroClipboard.js\", etc.).\n *\n * @returns String\n * @private\n */\n  var _getDefaultSwfPath = function() {\n    var jsDir = _getDirPathOfUrl(_getCurrentScriptUrl()) || _getUnanimousScriptParentDir() || \"\";\n    return jsDir + \"ZeroClipboard.swf\";\n  };\n  /**\n * Keep track of the state of the Flash object.\n * @private\n */\n  var _flashState = {\n    bridge: null,\n    version: \"0.0.0\",\n    pluginType: \"unknown\",\n    disabled: null,\n    outdated: null,\n    unavailable: null,\n    degraded: null,\n    deactivated: null,\n    overdue: null,\n    ready: null\n  };\n  /**\n * The minimum Flash Player version required to use ZeroClipboard completely.\n * @readonly\n * @private\n */\n  var _minimumFlashVersion = \"11.0.0\";\n  /**\n * The ZeroClipboard library version number, as reported by Flash, at the time the SWF was compiled.\n */\n  var _zcSwfVersion;\n  /**\n * Keep track of all event listener registrations.\n * @private\n */\n  var _handlers = {};\n  /**\n * Keep track of the currently activated element.\n * @private\n */\n  var _currentElement;\n  /**\n * Keep track of the element that was activated when a `copy` process started.\n * @private\n */\n  var _copyTarget;\n  /**\n * Keep track of data for the pending clipboard transaction.\n * @private\n */\n  var _clipData = {};\n  /**\n * Keep track of data formats for the pending clipboard transaction.\n * @private\n */\n  var _clipDataFormatMap = null;\n  /**\n * Keep track of the Flash availability check timeout.\n * @private\n */\n  var _flashCheckTimeout = 0;\n  /**\n * Keep track of SWF network errors interval polling.\n * @private\n */\n  var _swfFallbackCheckInterval = 0;\n  /**\n * The `message` store for events\n * @private\n */\n  var _eventMessages = {\n    ready: \"Flash communication is established\",\n    error: {\n      \"flash-disabled\": \"Flash is disabled or not installed\",\n      \"flash-outdated\": \"Flash is too outdated to support ZeroClipboard\",\n      \"flash-unavailable\": \"Flash is unable to communicate bidirectionally with JavaScript\",\n      \"flash-degraded\": \"Flash is unable to preserve data fidelity when communicating with JavaScript\",\n      \"flash-deactivated\": \"Flash is too outdated for your browser and/or is configured as click-to-activate.\\nThis may also mean that the ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity.\",\n      \"flash-overdue\": \"Flash communication was established but NOT within the acceptable time limit\",\n      \"version-mismatch\": \"ZeroClipboard JS version number does not match ZeroClipboard SWF version number\",\n      \"clipboard-error\": \"At least one error was thrown while ZeroClipboard was attempting to inject your data into the clipboard\",\n      \"config-mismatch\": \"ZeroClipboard configuration does not match Flash's reality\",\n      \"swf-not-found\": \"The ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity\"\n    }\n  };\n  /**\n * ZeroClipboard configuration defaults for the Core module.\n * @private\n */\n  var _globalConfig = {\n    swfPath: _getDefaultSwfPath(),\n    trustedDomains: window.location.host ? [ window.location.host ] : [],\n    cacheBust: true,\n    forceEnhancedClipboard: false,\n    flashLoadTimeout: 3e4,\n    autoActivate: true,\n    bubbleEvents: true,\n    containerId: \"global-zeroclipboard-html-bridge\",\n    containerClass: \"global-zeroclipboard-container\",\n    swfObjectId: \"global-zeroclipboard-flash-bridge\",\n    hoverClass: \"zeroclipboard-is-hover\",\n    activeClass: \"zeroclipboard-is-active\",\n    forceHandCursor: false,\n    title: null,\n    zIndex: 999999999\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.config`.\n * @private\n */\n  var _config = function(options) {\n    if (typeof options === \"object\" && options !== null) {\n      for (var prop in options) {\n        if (_hasOwn.call(options, prop)) {\n          if (/^(?:forceHandCursor|title|zIndex|bubbleEvents)$/.test(prop)) {\n            _globalConfig[prop] = options[prop];\n          } else if (_flashState.bridge == null) {\n            if (prop === \"containerId\" || prop === \"swfObjectId\") {\n              if (_isValidHtml4Id(options[prop])) {\n                _globalConfig[prop] = options[prop];\n              } else {\n                throw new Error(\"The specified `\" + prop + \"` value is not valid as an HTML4 Element ID\");\n              }\n            } else {\n              _globalConfig[prop] = options[prop];\n            }\n          }\n        }\n      }\n    }\n    if (typeof options === \"string\" && options) {\n      if (_hasOwn.call(_globalConfig, options)) {\n        return _globalConfig[options];\n      }\n      return;\n    }\n    return _deepCopy(_globalConfig);\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.state`.\n * @private\n */\n  var _state = function() {\n    return {\n      browser: _pick(_navigator, [ \"userAgent\", \"platform\", \"appName\" ]),\n      flash: _omit(_flashState, [ \"bridge\" ]),\n      zeroclipboard: {\n        version: ZeroClipboard.version,\n        config: ZeroClipboard.config()\n      }\n    };\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.isFlashUnusable`.\n * @private\n */\n  var _isFlashUnusable = function() {\n    return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.degraded || _flashState.deactivated);\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.on`.\n * @private\n */\n  var _on = function(eventType, listener) {\n    var i, len, events, added = {};\n    if (typeof eventType === \"string\" && eventType) {\n      events = eventType.toLowerCase().split(/\\s+/);\n    } else if (typeof eventType === \"object\" && eventType && typeof listener === \"undefined\") {\n      for (i in eventType) {\n        if (_hasOwn.call(eventType, i) && typeof i === \"string\" && i && typeof eventType[i] === \"function\") {\n          ZeroClipboard.on(i, eventType[i]);\n        }\n      }\n    }\n    if (events && events.length) {\n      for (i = 0, len = events.length; i < len; i++) {\n        eventType = events[i].replace(/^on/, \"\");\n        added[eventType] = true;\n        if (!_handlers[eventType]) {\n          _handlers[eventType] = [];\n        }\n        _handlers[eventType].push(listener);\n      }\n      if (added.ready && _flashState.ready) {\n        ZeroClipboard.emit({\n          type: \"ready\"\n        });\n      }\n      if (added.error) {\n        var flashErrorTypes = [ \"disabled\", \"outdated\", \"unavailable\", \"degraded\", \"deactivated\", \"overdue\" ];\n        for (i = 0, len = flashErrorTypes.length; i < len; i++) {\n          if (_flashState[flashErrorTypes[i]] === true) {\n            ZeroClipboard.emit({\n              type: \"error\",\n              name: \"flash-\" + flashErrorTypes[i]\n            });\n            break;\n          }\n        }\n        if (_zcSwfVersion !== undefined && ZeroClipboard.version !== _zcSwfVersion) {\n          ZeroClipboard.emit({\n            type: \"error\",\n            name: \"version-mismatch\",\n            jsVersion: ZeroClipboard.version,\n            swfVersion: _zcSwfVersion\n          });\n        }\n      }\n    }\n    return ZeroClipboard;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.off`.\n * @private\n */\n  var _off = function(eventType, listener) {\n    var i, len, foundIndex, events, perEventHandlers;\n    if (arguments.length === 0) {\n      events = _keys(_handlers);\n    } else if (typeof eventType === \"string\" && eventType) {\n      events = eventType.split(/\\s+/);\n    } else if (typeof eventType === \"object\" && eventType && typeof listener === \"undefined\") {\n      for (i in eventType) {\n        if (_hasOwn.call(eventType, i) && typeof i === \"string\" && i && typeof eventType[i] === \"function\") {\n          ZeroClipboard.off(i, eventType[i]);\n        }\n      }\n    }\n    if (events && events.length) {\n      for (i = 0, len = events.length; i < len; i++) {\n        eventType = events[i].toLowerCase().replace(/^on/, \"\");\n        perEventHandlers = _handlers[eventType];\n        if (perEventHandlers && perEventHandlers.length) {\n          if (listener) {\n            foundIndex = perEventHandlers.indexOf(listener);\n            while (foundIndex !== -1) {\n              perEventHandlers.splice(foundIndex, 1);\n              foundIndex = perEventHandlers.indexOf(listener, foundIndex);\n            }\n          } else {\n            perEventHandlers.length = 0;\n          }\n        }\n      }\n    }\n    return ZeroClipboard;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.handlers`.\n * @private\n */\n  var _listeners = function(eventType) {\n    var copy;\n    if (typeof eventType === \"string\" && eventType) {\n      copy = _deepCopy(_handlers[eventType]) || null;\n    } else {\n      copy = _deepCopy(_handlers);\n    }\n    return copy;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.emit`.\n * @private\n */\n  var _emit = function(event) {\n    var eventCopy, returnVal, tmp;\n    event = _createEvent(event);\n    if (!event) {\n      return;\n    }\n    if (_preprocessEvent(event)) {\n      return;\n    }\n    if (event.type === \"ready\" && _flashState.overdue === true) {\n      return ZeroClipboard.emit({\n        type: \"error\",\n        name: \"flash-overdue\"\n      });\n    }\n    eventCopy = _extend({}, event);\n    _dispatchCallbacks.call(this, eventCopy);\n    if (event.type === \"copy\") {\n      tmp = _mapClipDataToFlash(_clipData);\n      returnVal = tmp.data;\n      _clipDataFormatMap = tmp.formatMap;\n    }\n    return returnVal;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.create`.\n * @private\n */\n  var _create = function() {\n    if (typeof _flashState.ready !== \"boolean\") {\n      _flashState.ready = false;\n    }\n    if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {\n      var maxWait = _globalConfig.flashLoadTimeout;\n      if (typeof maxWait === \"number\" && maxWait >= 0) {\n        _flashCheckTimeout = _setTimeout(function() {\n          if (typeof _flashState.deactivated !== \"boolean\") {\n            _flashState.deactivated = true;\n          }\n          if (_flashState.deactivated === true) {\n            ZeroClipboard.emit({\n              type: \"error\",\n              name: \"flash-deactivated\"\n            });\n          }\n        }, maxWait);\n      }\n      _flashState.overdue = false;\n      _embedSwf();\n    }\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.destroy`.\n * @private\n */\n  var _destroy = function() {\n    ZeroClipboard.clearData();\n    ZeroClipboard.blur();\n    ZeroClipboard.emit(\"destroy\");\n    _unembedSwf();\n    ZeroClipboard.off();\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.setData`.\n * @private\n */\n  var _setData = function(format, data) {\n    var dataObj;\n    if (typeof format === \"object\" && format && typeof data === \"undefined\") {\n      dataObj = format;\n      ZeroClipboard.clearData();\n    } else if (typeof format === \"string\" && format) {\n      dataObj = {};\n      dataObj[format] = data;\n    } else {\n      return;\n    }\n    for (var dataFormat in dataObj) {\n      if (typeof dataFormat === \"string\" && dataFormat && _hasOwn.call(dataObj, dataFormat) && typeof dataObj[dataFormat] === \"string\" && dataObj[dataFormat]) {\n        _clipData[dataFormat] = dataObj[dataFormat];\n      }\n    }\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.clearData`.\n * @private\n */\n  var _clearData = function(format) {\n    if (typeof format === \"undefined\") {\n      _deleteOwnProperties(_clipData);\n      _clipDataFormatMap = null;\n    } else if (typeof format === \"string\" && _hasOwn.call(_clipData, format)) {\n      delete _clipData[format];\n    }\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.getData`.\n * @private\n */\n  var _getData = function(format) {\n    if (typeof format === \"undefined\") {\n      return _deepCopy(_clipData);\n    } else if (typeof format === \"string\" && _hasOwn.call(_clipData, format)) {\n      return _clipData[format];\n    }\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.focus`/`ZeroClipboard.activate`.\n * @private\n */\n  var _focus = function(element) {\n    if (!(element && element.nodeType === 1)) {\n      return;\n    }\n    if (_currentElement) {\n      _removeClass(_currentElement, _globalConfig.activeClass);\n      if (_currentElement !== element) {\n        _removeClass(_currentElement, _globalConfig.hoverClass);\n      }\n    }\n    _currentElement = element;\n    _addClass(element, _globalConfig.hoverClass);\n    var newTitle = element.getAttribute(\"title\") || _globalConfig.title;\n    if (typeof newTitle === \"string\" && newTitle) {\n      var htmlBridge = _getHtmlBridge(_flashState.bridge);\n      if (htmlBridge) {\n        htmlBridge.setAttribute(\"title\", newTitle);\n      }\n    }\n    var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, \"cursor\") === \"pointer\";\n    _setHandCursor(useHandCursor);\n    _reposition();\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.blur`/`ZeroClipboard.deactivate`.\n * @private\n */\n  var _blur = function() {\n    var htmlBridge = _getHtmlBridge(_flashState.bridge);\n    if (htmlBridge) {\n      htmlBridge.removeAttribute(\"title\");\n      htmlBridge.style.left = \"0px\";\n      htmlBridge.style.top = \"-9999px\";\n      htmlBridge.style.width = \"1px\";\n      htmlBridge.style.top = \"1px\";\n    }\n    if (_currentElement) {\n      _removeClass(_currentElement, _globalConfig.hoverClass);\n      _removeClass(_currentElement, _globalConfig.activeClass);\n      _currentElement = null;\n    }\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.activeElement`.\n * @private\n */\n  var _activeElement = function() {\n    return _currentElement || null;\n  };\n  /**\n * Check if a value is a valid HTML4 `ID` or `Name` token.\n * @private\n */\n  var _isValidHtml4Id = function(id) {\n    return typeof id === \"string\" && id && /^[A-Za-z][A-Za-z0-9_:\\-\\.]*$/.test(id);\n  };\n  /**\n * Create or update an `event` object, based on the `eventType`.\n * @private\n */\n  var _createEvent = function(event) {\n    var eventType;\n    if (typeof event === \"string\" && event) {\n      eventType = event;\n      event = {};\n    } else if (typeof event === \"object\" && event && typeof event.type === \"string\" && event.type) {\n      eventType = event.type;\n    }\n    if (!eventType) {\n      return;\n    }\n    eventType = eventType.toLowerCase();\n    if (!event.target && (/^(copy|aftercopy|_click)$/.test(eventType) || eventType === \"error\" && event.name === \"clipboard-error\")) {\n      event.target = _copyTarget;\n    }\n    _extend(event, {\n      type: eventType,\n      target: event.target || _currentElement || null,\n      relatedTarget: event.relatedTarget || null,\n      currentTarget: _flashState && _flashState.bridge || null,\n      timeStamp: event.timeStamp || _now() || null\n    });\n    var msg = _eventMessages[event.type];\n    if (event.type === \"error\" && event.name && msg) {\n      msg = msg[event.name];\n    }\n    if (msg) {\n      event.message = msg;\n    }\n    if (event.type === \"ready\") {\n      _extend(event, {\n        target: null,\n        version: _flashState.version\n      });\n    }\n    if (event.type === \"error\") {\n      if (/^flash-(disabled|outdated|unavailable|degraded|deactivated|overdue)$/.test(event.name)) {\n        _extend(event, {\n          target: null,\n          minimumVersion: _minimumFlashVersion\n        });\n      }\n      if (/^flash-(outdated|unavailable|degraded|deactivated|overdue)$/.test(event.name)) {\n        _extend(event, {\n          version: _flashState.version\n        });\n      }\n    }\n    if (event.type === \"copy\") {\n      event.clipboardData = {\n        setData: ZeroClipboard.setData,\n        clearData: ZeroClipboard.clearData\n      };\n    }\n    if (event.type === \"aftercopy\") {\n      event = _mapClipResultsFromFlash(event, _clipDataFormatMap);\n    }\n    if (event.target && !event.relatedTarget) {\n      event.relatedTarget = _getRelatedTarget(event.target);\n    }\n    return _addMouseData(event);\n  };\n  /**\n * Get a relatedTarget from the target's `data-clipboard-target` attribute\n * @private\n */\n  var _getRelatedTarget = function(targetEl) {\n    var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute(\"data-clipboard-target\");\n    return relatedTargetId ? _document.getElementById(relatedTargetId) : null;\n  };\n  /**\n * Add element and position data to `MouseEvent` instances\n * @private\n */\n  var _addMouseData = function(event) {\n    if (event && /^_(?:click|mouse(?:over|out|down|up|move))$/.test(event.type)) {\n      var srcElement = event.target;\n      var fromElement = event.type === \"_mouseover\" && event.relatedTarget ? event.relatedTarget : undefined;\n      var toElement = event.type === \"_mouseout\" && event.relatedTarget ? event.relatedTarget : undefined;\n      var pos = _getElementPosition(srcElement);\n      var screenLeft = _window.screenLeft || _window.screenX || 0;\n      var screenTop = _window.screenTop || _window.screenY || 0;\n      var scrollLeft = _document.body.scrollLeft + _document.documentElement.scrollLeft;\n      var scrollTop = _document.body.scrollTop + _document.documentElement.scrollTop;\n      var pageX = pos.left + (typeof event._stageX === \"number\" ? event._stageX : 0);\n      var pageY = pos.top + (typeof event._stageY === \"number\" ? event._stageY : 0);\n      var clientX = pageX - scrollLeft;\n      var clientY = pageY - scrollTop;\n      var screenX = screenLeft + clientX;\n      var screenY = screenTop + clientY;\n      var moveX = typeof event.movementX === \"number\" ? event.movementX : 0;\n      var moveY = typeof event.movementY === \"number\" ? event.movementY : 0;\n      delete event._stageX;\n      delete event._stageY;\n      _extend(event, {\n        srcElement: srcElement,\n        fromElement: fromElement,\n        toElement: toElement,\n        screenX: screenX,\n        screenY: screenY,\n        pageX: pageX,\n        pageY: pageY,\n        clientX: clientX,\n        clientY: clientY,\n        x: clientX,\n        y: clientY,\n        movementX: moveX,\n        movementY: moveY,\n        offsetX: 0,\n        offsetY: 0,\n        layerX: 0,\n        layerY: 0\n      });\n    }\n    return event;\n  };\n  /**\n * Determine if an event's registered handlers should be execute synchronously or asynchronously.\n *\n * @returns {boolean}\n * @private\n */\n  var _shouldPerformAsync = function(event) {\n    var eventType = event && typeof event.type === \"string\" && event.type || \"\";\n    return !/^(?:(?:before)?copy|destroy)$/.test(eventType);\n  };\n  /**\n * Control if a callback should be executed asynchronously or not.\n *\n * @returns `undefined`\n * @private\n */\n  var _dispatchCallback = function(func, context, args, async) {\n    if (async) {\n      _setTimeout(function() {\n        func.apply(context, args);\n      }, 0);\n    } else {\n      func.apply(context, args);\n    }\n  };\n  /**\n * Handle the actual dispatching of events to client instances.\n *\n * @returns `undefined`\n * @private\n */\n  var _dispatchCallbacks = function(event) {\n    if (!(typeof event === \"object\" && event && event.type)) {\n      return;\n    }\n    var async = _shouldPerformAsync(event);\n    var wildcardTypeHandlers = _handlers[\"*\"] || [];\n    var specificTypeHandlers = _handlers[event.type] || [];\n    var handlers = wildcardTypeHandlers.concat(specificTypeHandlers);\n    if (handlers && handlers.length) {\n      var i, len, func, context, eventCopy, originalContext = this;\n      for (i = 0, len = handlers.length; i < len; i++) {\n        func = handlers[i];\n        context = originalContext;\n        if (typeof func === \"string\" && typeof _window[func] === \"function\") {\n          func = _window[func];\n        }\n        if (typeof func === \"object\" && func && typeof func.handleEvent === \"function\") {\n          context = func;\n          func = func.handleEvent;\n        }\n        if (typeof func === \"function\") {\n          eventCopy = _extend({}, event);\n          _dispatchCallback(func, context, [ eventCopy ], async);\n        }\n      }\n    }\n    return this;\n  };\n  /**\n * Preprocess any special behaviors, reactions, or state changes after receiving this event.\n * Executes only once per event emitted, NOT once per client.\n * @private\n */\n  var _preprocessEvent = function(event) {\n    var element = event.target || _currentElement || null;\n    var sourceIsSwf = event._source === \"swf\";\n    delete event._source;\n    var flashErrorNames = [ \"flash-disabled\", \"flash-outdated\", \"flash-unavailable\", \"flash-degraded\", \"flash-deactivated\", \"flash-overdue\" ];\n    switch (event.type) {\n     case \"error\":\n      if (flashErrorNames.indexOf(event.name) !== -1) {\n        _extend(_flashState, {\n          disabled: event.name === \"flash-disabled\",\n          outdated: event.name === \"flash-outdated\",\n          unavailable: event.name === \"flash-unavailable\",\n          degraded: event.name === \"flash-degraded\",\n          deactivated: event.name === \"flash-deactivated\",\n          overdue: event.name === \"flash-overdue\",\n          ready: false\n        });\n      } else if (event.name === \"version-mismatch\") {\n        _zcSwfVersion = event.swfVersion;\n        _extend(_flashState, {\n          disabled: false,\n          outdated: false,\n          unavailable: false,\n          degraded: false,\n          deactivated: false,\n          overdue: false,\n          ready: false\n        });\n      }\n      _clearTimeoutsAndPolling();\n      break;\n\n     case \"ready\":\n      _zcSwfVersion = event.swfVersion;\n      var wasDeactivated = _flashState.deactivated === true;\n      _extend(_flashState, {\n        disabled: false,\n        outdated: false,\n        unavailable: false,\n        degraded: false,\n        deactivated: false,\n        overdue: wasDeactivated,\n        ready: !wasDeactivated\n      });\n      _clearTimeoutsAndPolling();\n      break;\n\n     case \"beforecopy\":\n      _copyTarget = element;\n      break;\n\n     case \"copy\":\n      var textContent, htmlContent, targetEl = event.relatedTarget;\n      if (!(_clipData[\"text/html\"] || _clipData[\"text/plain\"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {\n        event.clipboardData.clearData();\n        event.clipboardData.setData(\"text/plain\", textContent);\n        if (htmlContent !== textContent) {\n          event.clipboardData.setData(\"text/html\", htmlContent);\n        }\n      } else if (!_clipData[\"text/plain\"] && event.target && (textContent = event.target.getAttribute(\"data-clipboard-text\"))) {\n        event.clipboardData.clearData();\n        event.clipboardData.setData(\"text/plain\", textContent);\n      }\n      break;\n\n     case \"aftercopy\":\n      _queueEmitClipboardErrors(event);\n      ZeroClipboard.clearData();\n      if (element && element !== _safeActiveElement() && element.focus) {\n        element.focus();\n      }\n      break;\n\n     case \"_mouseover\":\n      ZeroClipboard.focus(element);\n      if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n        if (element && element !== event.relatedTarget && !_containedBy(event.relatedTarget, element)) {\n          _fireMouseEvent(_extend({}, event, {\n            type: \"mouseenter\",\n            bubbles: false,\n            cancelable: false\n          }));\n        }\n        _fireMouseEvent(_extend({}, event, {\n          type: \"mouseover\"\n        }));\n      }\n      break;\n\n     case \"_mouseout\":\n      ZeroClipboard.blur();\n      if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n        if (element && element !== event.relatedTarget && !_containedBy(event.relatedTarget, element)) {\n          _fireMouseEvent(_extend({}, event, {\n            type: \"mouseleave\",\n            bubbles: false,\n            cancelable: false\n          }));\n        }\n        _fireMouseEvent(_extend({}, event, {\n          type: \"mouseout\"\n        }));\n      }\n      break;\n\n     case \"_mousedown\":\n      _addClass(element, _globalConfig.activeClass);\n      if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n        _fireMouseEvent(_extend({}, event, {\n          type: event.type.slice(1)\n        }));\n      }\n      break;\n\n     case \"_mouseup\":\n      _removeClass(element, _globalConfig.activeClass);\n      if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n        _fireMouseEvent(_extend({}, event, {\n          type: event.type.slice(1)\n        }));\n      }\n      break;\n\n     case \"_click\":\n      _copyTarget = null;\n      if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n        _fireMouseEvent(_extend({}, event, {\n          type: event.type.slice(1)\n        }));\n      }\n      break;\n\n     case \"_mousemove\":\n      if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n        _fireMouseEvent(_extend({}, event, {\n          type: event.type.slice(1)\n        }));\n      }\n      break;\n    }\n    if (/^_(?:click|mouse(?:over|out|down|up|move))$/.test(event.type)) {\n      return true;\n    }\n  };\n  /**\n * Check an \"aftercopy\" event for clipboard errors and emit a corresponding \"error\" event.\n * @private\n */\n  var _queueEmitClipboardErrors = function(aftercopyEvent) {\n    if (aftercopyEvent.errors && aftercopyEvent.errors.length > 0) {\n      var errorEvent = _deepCopy(aftercopyEvent);\n      _extend(errorEvent, {\n        type: \"error\",\n        name: \"clipboard-error\"\n      });\n      delete errorEvent.success;\n      _setTimeout(function() {\n        ZeroClipboard.emit(errorEvent);\n      }, 0);\n    }\n  };\n  /**\n * Dispatch a synthetic MouseEvent.\n *\n * @returns `undefined`\n * @private\n */\n  var _fireMouseEvent = function(event) {\n    if (!(event && typeof event.type === \"string\" && event)) {\n      return;\n    }\n    var e, target = event.target || null, doc = target && target.ownerDocument || _document, defaults = {\n      view: doc.defaultView || _window,\n      canBubble: true,\n      cancelable: true,\n      detail: event.type === \"click\" ? 1 : 0,\n      button: typeof event.which === \"number\" ? event.which - 1 : typeof event.button === \"number\" ? event.button : doc.createEvent ? 0 : 1\n    }, args = _extend(defaults, event);\n    if (!target) {\n      return;\n    }\n    if (doc.createEvent && target.dispatchEvent) {\n      args = [ args.type, args.canBubble, args.cancelable, args.view, args.detail, args.screenX, args.screenY, args.clientX, args.clientY, args.ctrlKey, args.altKey, args.shiftKey, args.metaKey, args.button, args.relatedTarget ];\n      e = doc.createEvent(\"MouseEvents\");\n      if (e.initMouseEvent) {\n        e.initMouseEvent.apply(e, args);\n        e._source = \"js\";\n        target.dispatchEvent(e);\n      }\n    }\n  };\n  /**\n * Continuously poll the DOM until either:\n *  (a) the fallback content becomes visible, or\n *  (b) we receive an event from SWF (handled elsewhere)\n *\n * IMPORTANT:\n * This is NOT a necessary check but it can result in significantly faster\n * detection of bad `swfPath` configuration and/or network/server issues [in\n * supported browsers] than waiting for the entire `flashLoadTimeout` duration\n * to elapse before detecting that the SWF cannot be loaded. The detection\n * duration can be anywhere from 10-30 times faster [in supported browsers] by\n * using this approach.\n *\n * @returns `undefined`\n * @private\n */\n  var _watchForSwfFallbackContent = function() {\n    var maxWait = _globalConfig.flashLoadTimeout;\n    if (typeof maxWait === \"number\" && maxWait >= 0) {\n      var pollWait = Math.min(1e3, maxWait / 10);\n      var fallbackContentId = _globalConfig.swfObjectId + \"_fallbackContent\";\n      _swfFallbackCheckInterval = _setInterval(function() {\n        var el = _document.getElementById(fallbackContentId);\n        if (_isElementVisible(el)) {\n          _clearTimeoutsAndPolling();\n          _flashState.deactivated = null;\n          ZeroClipboard.emit({\n            type: \"error\",\n            name: \"swf-not-found\"\n          });\n        }\n      }, pollWait);\n    }\n  };\n  /**\n * Create the HTML bridge element to embed the Flash object into.\n * @private\n */\n  var _createHtmlBridge = function() {\n    var container = _document.createElement(\"div\");\n    container.id = _globalConfig.containerId;\n    container.className = _globalConfig.containerClass;\n    container.style.position = \"absolute\";\n    container.style.left = \"0px\";\n    container.style.top = \"-9999px\";\n    container.style.width = \"1px\";\n    container.style.height = \"1px\";\n    container.style.zIndex = \"\" + _getSafeZIndex(_globalConfig.zIndex);\n    return container;\n  };\n  /**\n * Get the HTML element container that wraps the Flash bridge object/element.\n * @private\n */\n  var _getHtmlBridge = function(flashBridge) {\n    var htmlBridge = flashBridge && flashBridge.parentNode;\n    while (htmlBridge && htmlBridge.nodeName === \"OBJECT\" && htmlBridge.parentNode) {\n      htmlBridge = htmlBridge.parentNode;\n    }\n    return htmlBridge || null;\n  };\n  /**\n * Create the SWF object.\n *\n * @returns The SWF object reference.\n * @private\n */\n  var _embedSwf = function() {\n    var len, flashBridge = _flashState.bridge, container = _getHtmlBridge(flashBridge);\n    if (!flashBridge) {\n      var allowScriptAccess = _determineScriptAccess(_window.location.host, _globalConfig);\n      var allowNetworking = allowScriptAccess === \"never\" ? \"none\" : \"all\";\n      var flashvars = _vars(_extend({\n        jsVersion: ZeroClipboard.version\n      }, _globalConfig));\n      var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);\n      container = _createHtmlBridge();\n      var divToBeReplaced = _document.createElement(\"div\");\n      container.appendChild(divToBeReplaced);\n      _document.body.appendChild(container);\n      var tmpDiv = _document.createElement(\"div\");\n      var usingActiveX = _flashState.pluginType === \"activex\";\n      tmpDiv.innerHTML = '<object id=\"' + _globalConfig.swfObjectId + '\" name=\"' + _globalConfig.swfObjectId + '\" ' + 'width=\"100%\" height=\"100%\" ' + (usingActiveX ? 'classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\"' : 'type=\"application/x-shockwave-flash\" data=\"' + swfUrl + '\"') + \">\" + (usingActiveX ? '<param name=\"movie\" value=\"' + swfUrl + '\"/>' : \"\") + '<param name=\"allowScriptAccess\" value=\"' + allowScriptAccess + '\"/>' + '<param name=\"allowNetworking\" value=\"' + allowNetworking + '\"/>' + '<param name=\"menu\" value=\"false\"/>' + '<param name=\"wmode\" value=\"transparent\"/>' + '<param name=\"flashvars\" value=\"' + flashvars + '\"/>' + '<div id=\"' + _globalConfig.swfObjectId + '_fallbackContent\">&nbsp;</div>' + \"</object>\";\n      flashBridge = tmpDiv.firstChild;\n      tmpDiv = null;\n      _unwrap(flashBridge).ZeroClipboard = ZeroClipboard;\n      container.replaceChild(flashBridge, divToBeReplaced);\n      _watchForSwfFallbackContent();\n    }\n    if (!flashBridge) {\n      flashBridge = _document[_globalConfig.swfObjectId];\n      if (flashBridge && (len = flashBridge.length)) {\n        flashBridge = flashBridge[len - 1];\n      }\n      if (!flashBridge && container) {\n        flashBridge = container.firstChild;\n      }\n    }\n    _flashState.bridge = flashBridge || null;\n    return flashBridge;\n  };\n  /**\n * Destroy the SWF object.\n * @private\n */\n  var _unembedSwf = function() {\n    var flashBridge = _flashState.bridge;\n    if (flashBridge) {\n      var htmlBridge = _getHtmlBridge(flashBridge);\n      if (htmlBridge) {\n        if (_flashState.pluginType === \"activex\" && \"readyState\" in flashBridge) {\n          flashBridge.style.display = \"none\";\n          (function removeSwfFromIE() {\n            if (flashBridge.readyState === 4) {\n              for (var prop in flashBridge) {\n                if (typeof flashBridge[prop] === \"function\") {\n                  flashBridge[prop] = null;\n                }\n              }\n              if (flashBridge.parentNode) {\n                flashBridge.parentNode.removeChild(flashBridge);\n              }\n              if (htmlBridge.parentNode) {\n                htmlBridge.parentNode.removeChild(htmlBridge);\n              }\n            } else {\n              _setTimeout(removeSwfFromIE, 10);\n            }\n          })();\n        } else {\n          if (flashBridge.parentNode) {\n            flashBridge.parentNode.removeChild(flashBridge);\n          }\n          if (htmlBridge.parentNode) {\n            htmlBridge.parentNode.removeChild(htmlBridge);\n          }\n        }\n      }\n      _clearTimeoutsAndPolling();\n      _flashState.ready = null;\n      _flashState.bridge = null;\n      _flashState.deactivated = null;\n      _zcSwfVersion = undefined;\n    }\n  };\n  /**\n * Map the data format names of the \"clipData\" to Flash-friendly names.\n *\n * @returns A new transformed object.\n * @private\n */\n  var _mapClipDataToFlash = function(clipData) {\n    var newClipData = {}, formatMap = {};\n    if (!(typeof clipData === \"object\" && clipData)) {\n      return;\n    }\n    for (var dataFormat in clipData) {\n      if (dataFormat && _hasOwn.call(clipData, dataFormat) && typeof clipData[dataFormat] === \"string\" && clipData[dataFormat]) {\n        switch (dataFormat.toLowerCase()) {\n         case \"text/plain\":\n         case \"text\":\n         case \"air:text\":\n         case \"flash:text\":\n          newClipData.text = clipData[dataFormat];\n          formatMap.text = dataFormat;\n          break;\n\n         case \"text/html\":\n         case \"html\":\n         case \"air:html\":\n         case \"flash:html\":\n          newClipData.html = clipData[dataFormat];\n          formatMap.html = dataFormat;\n          break;\n\n         case \"application/rtf\":\n         case \"text/rtf\":\n         case \"rtf\":\n         case \"richtext\":\n         case \"air:rtf\":\n         case \"flash:rtf\":\n          newClipData.rtf = clipData[dataFormat];\n          formatMap.rtf = dataFormat;\n          break;\n\n         default:\n          break;\n        }\n      }\n    }\n    return {\n      data: newClipData,\n      formatMap: formatMap\n    };\n  };\n  /**\n * Map the data format names from Flash-friendly names back to their original \"clipData\" names (via a format mapping).\n *\n * @returns A new transformed object.\n * @private\n */\n  var _mapClipResultsFromFlash = function(clipResults, formatMap) {\n    if (!(typeof clipResults === \"object\" && clipResults && typeof formatMap === \"object\" && formatMap)) {\n      return clipResults;\n    }\n    var newResults = {};\n    for (var prop in clipResults) {\n      if (_hasOwn.call(clipResults, prop)) {\n        if (prop === \"errors\") {\n          newResults[prop] = clipResults[prop] ? clipResults[prop].slice() : [];\n          for (var i = 0, len = newResults[prop].length; i < len; i++) {\n            newResults[prop][i].format = formatMap[newResults[prop][i].format];\n          }\n        } else if (prop !== \"success\" && prop !== \"data\") {\n          newResults[prop] = clipResults[prop];\n        } else {\n          newResults[prop] = {};\n          var tmpHash = clipResults[prop];\n          for (var dataFormat in tmpHash) {\n            if (dataFormat && _hasOwn.call(tmpHash, dataFormat) && _hasOwn.call(formatMap, dataFormat)) {\n              newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];\n            }\n          }\n        }\n      }\n    }\n    return newResults;\n  };\n  /**\n * Will look at a path, and will create a \"?noCache={time}\" or \"&noCache={time}\"\n * query param string to return. Does NOT append that string to the original path.\n * This is useful because ExternalInterface often breaks when a Flash SWF is cached.\n *\n * @returns The `noCache` query param with necessary \"?\"/\"&\" prefix.\n * @private\n */\n  var _cacheBust = function(path, options) {\n    var cacheBust = options == null || options && options.cacheBust === true;\n    if (cacheBust) {\n      return (path.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"noCache=\" + _now();\n    } else {\n      return \"\";\n    }\n  };\n  /**\n * Creates a query string for the FlashVars param.\n * Does NOT include the cache-busting query param.\n *\n * @returns FlashVars query string\n * @private\n */\n  var _vars = function(options) {\n    var i, len, domain, domains, str = \"\", trustedOriginsExpanded = [];\n    if (options.trustedDomains) {\n      if (typeof options.trustedDomains === \"string\") {\n        domains = [ options.trustedDomains ];\n      } else if (typeof options.trustedDomains === \"object\" && \"length\" in options.trustedDomains) {\n        domains = options.trustedDomains;\n      }\n    }\n    if (domains && domains.length) {\n      for (i = 0, len = domains.length; i < len; i++) {\n        if (_hasOwn.call(domains, i) && domains[i] && typeof domains[i] === \"string\") {\n          domain = _extractDomain(domains[i]);\n          if (!domain) {\n            continue;\n          }\n          if (domain === \"*\") {\n            trustedOriginsExpanded.length = 0;\n            trustedOriginsExpanded.push(domain);\n            break;\n          }\n          trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, \"//\" + domain, _window.location.protocol + \"//\" + domain ]);\n        }\n      }\n    }\n    if (trustedOriginsExpanded.length) {\n      str += \"trustedOrigins=\" + _encodeURIComponent(trustedOriginsExpanded.join(\",\"));\n    }\n    if (options.forceEnhancedClipboard === true) {\n      str += (str ? \"&\" : \"\") + \"forceEnhancedClipboard=true\";\n    }\n    if (typeof options.swfObjectId === \"string\" && options.swfObjectId) {\n      str += (str ? \"&\" : \"\") + \"swfObjectId=\" + _encodeURIComponent(options.swfObjectId);\n    }\n    if (typeof options.jsVersion === \"string\" && options.jsVersion) {\n      str += (str ? \"&\" : \"\") + \"jsVersion=\" + _encodeURIComponent(options.jsVersion);\n    }\n    return str;\n  };\n  /**\n * Extract the domain (e.g. \"github.com\") from an origin (e.g. \"https://github.com\") or\n * URL (e.g. \"https://github.com/zeroclipboard/zeroclipboard/\").\n *\n * @returns the domain\n * @private\n */\n  var _extractDomain = function(originOrUrl) {\n    if (originOrUrl == null || originOrUrl === \"\") {\n      return null;\n    }\n    originOrUrl = originOrUrl.replace(/^\\s+|\\s+$/g, \"\");\n    if (originOrUrl === \"\") {\n      return null;\n    }\n    var protocolIndex = originOrUrl.indexOf(\"//\");\n    originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);\n    var pathIndex = originOrUrl.indexOf(\"/\");\n    originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);\n    if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === \".swf\") {\n      return null;\n    }\n    return originOrUrl || null;\n  };\n  /**\n * Set `allowScriptAccess` based on `trustedDomains` and `window.location.host` vs. `swfPath`.\n *\n * @returns The appropriate script access level.\n * @private\n */\n  var _determineScriptAccess = function() {\n    var _extractAllDomains = function(origins) {\n      var i, len, tmp, resultsArray = [];\n      if (typeof origins === \"string\") {\n        origins = [ origins ];\n      }\n      if (!(typeof origins === \"object\" && origins && typeof origins.length === \"number\")) {\n        return resultsArray;\n      }\n      for (i = 0, len = origins.length; i < len; i++) {\n        if (_hasOwn.call(origins, i) && (tmp = _extractDomain(origins[i]))) {\n          if (tmp === \"*\") {\n            resultsArray.length = 0;\n            resultsArray.push(\"*\");\n            break;\n          }\n          if (resultsArray.indexOf(tmp) === -1) {\n            resultsArray.push(tmp);\n          }\n        }\n      }\n      return resultsArray;\n    };\n    return function(currentDomain, configOptions) {\n      var swfDomain = _extractDomain(configOptions.swfPath);\n      if (swfDomain === null) {\n        swfDomain = currentDomain;\n      }\n      var trustedDomains = _extractAllDomains(configOptions.trustedDomains);\n      var len = trustedDomains.length;\n      if (len > 0) {\n        if (len === 1 && trustedDomains[0] === \"*\") {\n          return \"always\";\n        }\n        if (trustedDomains.indexOf(currentDomain) !== -1) {\n          if (len === 1 && currentDomain === swfDomain) {\n            return \"sameDomain\";\n          }\n          return \"always\";\n        }\n      }\n      return \"never\";\n    };\n  }();\n  /**\n * Get the currently active/focused DOM element.\n *\n * @returns the currently active/focused element, or `null`\n * @private\n */\n  var _safeActiveElement = function() {\n    try {\n      return _document.activeElement;\n    } catch (err) {\n      return null;\n    }\n  };\n  /**\n * Add a class to an element, if it doesn't already have it.\n *\n * @returns The element, with its new class added.\n * @private\n */\n  var _addClass = function(element, value) {\n    if (!element || element.nodeType !== 1) {\n      return element;\n    }\n    if (element.classList) {\n      if (!element.classList.contains(value)) {\n        element.classList.add(value);\n      }\n      return element;\n    }\n    if (value && typeof value === \"string\") {\n      var classNames = (value || \"\").split(/\\s+/);\n      if (element.nodeType === 1) {\n        if (!element.className) {\n          element.className = value;\n        } else {\n          var className = \" \" + element.className + \" \", setClass = element.className;\n          for (var c = 0, cl = classNames.length; c < cl; c++) {\n            if (className.indexOf(\" \" + classNames[c] + \" \") < 0) {\n              setClass += \" \" + classNames[c];\n            }\n          }\n          element.className = setClass.replace(/^\\s+|\\s+$/g, \"\");\n        }\n      }\n    }\n    return element;\n  };\n  /**\n * Remove a class from an element, if it has it.\n *\n * @returns The element, with its class removed.\n * @private\n */\n  var _removeClass = function(element, value) {\n    if (!element || element.nodeType !== 1) {\n      return element;\n    }\n    if (element.classList) {\n      if (element.classList.contains(value)) {\n        element.classList.remove(value);\n      }\n      return element;\n    }\n    if (typeof value === \"string\" && value) {\n      var classNames = value.split(/\\s+/);\n      if (element.nodeType === 1 && element.className) {\n        var className = (\" \" + element.className + \" \").replace(/[\\n\\t]/g, \" \");\n        for (var c = 0, cl = classNames.length; c < cl; c++) {\n          className = className.replace(\" \" + classNames[c] + \" \", \" \");\n        }\n        element.className = className.replace(/^\\s+|\\s+$/g, \"\");\n      }\n    }\n    return element;\n  };\n  /**\n * Attempt to interpret the element's CSS styling. If `prop` is `\"cursor\"`,\n * then we assume that it should be a hand (\"pointer\") cursor if the element\n * is an anchor element (\"a\" tag).\n *\n * @returns The computed style property.\n * @private\n */\n  var _getStyle = function(el, prop) {\n    var value = _getComputedStyle(el, null).getPropertyValue(prop);\n    if (prop === \"cursor\") {\n      if (!value || value === \"auto\") {\n        if (el.nodeName === \"A\") {\n          return \"pointer\";\n        }\n      }\n    }\n    return value;\n  };\n  /**\n * Get the absolutely positioned coordinates of a DOM element.\n *\n * @returns Object containing the element's position, width, and height.\n * @private\n */\n  var _getElementPosition = function(el) {\n    var pos = {\n      left: 0,\n      top: 0,\n      width: 0,\n      height: 0\n    };\n    if (el.getBoundingClientRect) {\n      var elRect = el.getBoundingClientRect();\n      var pageXOffset = _window.pageXOffset;\n      var pageYOffset = _window.pageYOffset;\n      var leftBorderWidth = _document.documentElement.clientLeft || 0;\n      var topBorderWidth = _document.documentElement.clientTop || 0;\n      var leftBodyOffset = 0;\n      var topBodyOffset = 0;\n      if (_getStyle(_document.body, \"position\") === \"relative\") {\n        var bodyRect = _document.body.getBoundingClientRect();\n        var htmlRect = _document.documentElement.getBoundingClientRect();\n        leftBodyOffset = bodyRect.left - htmlRect.left || 0;\n        topBodyOffset = bodyRect.top - htmlRect.top || 0;\n      }\n      pos.left = elRect.left + pageXOffset - leftBorderWidth - leftBodyOffset;\n      pos.top = elRect.top + pageYOffset - topBorderWidth - topBodyOffset;\n      pos.width = \"width\" in elRect ? elRect.width : elRect.right - elRect.left;\n      pos.height = \"height\" in elRect ? elRect.height : elRect.bottom - elRect.top;\n    }\n    return pos;\n  };\n  /**\n * Determine is an element is visible somewhere within the document (page).\n *\n * @returns Boolean\n * @private\n */\n  var _isElementVisible = function(el) {\n    if (!el) {\n      return false;\n    }\n    var styles = _getComputedStyle(el, null);\n    var hasCssHeight = _parseFloat(styles.height) > 0;\n    var hasCssWidth = _parseFloat(styles.width) > 0;\n    var hasCssTop = _parseFloat(styles.top) >= 0;\n    var hasCssLeft = _parseFloat(styles.left) >= 0;\n    var cssKnows = hasCssHeight && hasCssWidth && hasCssTop && hasCssLeft;\n    var rect = cssKnows ? null : _getElementPosition(el);\n    var isVisible = styles.display !== \"none\" && styles.visibility !== \"collapse\" && (cssKnows || !!rect && (hasCssHeight || rect.height > 0) && (hasCssWidth || rect.width > 0) && (hasCssTop || rect.top >= 0) && (hasCssLeft || rect.left >= 0));\n    return isVisible;\n  };\n  /**\n * Clear all existing timeouts and interval polling delegates.\n *\n * @returns `undefined`\n * @private\n */\n  var _clearTimeoutsAndPolling = function() {\n    _clearTimeout(_flashCheckTimeout);\n    _flashCheckTimeout = 0;\n    _clearInterval(_swfFallbackCheckInterval);\n    _swfFallbackCheckInterval = 0;\n  };\n  /**\n * Reposition the Flash object to cover the currently activated element.\n *\n * @returns `undefined`\n * @private\n */\n  var _reposition = function() {\n    var htmlBridge;\n    if (_currentElement && (htmlBridge = _getHtmlBridge(_flashState.bridge))) {\n      var pos = _getElementPosition(_currentElement);\n      _extend(htmlBridge.style, {\n        width: pos.width + \"px\",\n        height: pos.height + \"px\",\n        top: pos.top + \"px\",\n        left: pos.left + \"px\",\n        zIndex: \"\" + _getSafeZIndex(_globalConfig.zIndex)\n      });\n    }\n  };\n  /**\n * Sends a signal to the Flash object to display the hand cursor if `true`.\n *\n * @returns `undefined`\n * @private\n */\n  var _setHandCursor = function(enabled) {\n    if (_flashState.ready === true) {\n      if (_flashState.bridge && typeof _flashState.bridge.setHandCursor === \"function\") {\n        _flashState.bridge.setHandCursor(enabled);\n      } else {\n        _flashState.ready = false;\n      }\n    }\n  };\n  /**\n * Get a safe value for `zIndex`\n *\n * @returns an integer, or \"auto\"\n * @private\n */\n  var _getSafeZIndex = function(val) {\n    if (/^(?:auto|inherit)$/.test(val)) {\n      return val;\n    }\n    var zIndex;\n    if (typeof val === \"number\" && !_isNaN(val)) {\n      zIndex = val;\n    } else if (typeof val === \"string\") {\n      zIndex = _getSafeZIndex(_parseInt(val, 10));\n    }\n    return typeof zIndex === \"number\" ? zIndex : \"auto\";\n  };\n  /**\n * Detect the Flash Player status, version, and plugin type.\n *\n * @see {@link https://code.google.com/p/doctype-mirror/wiki/ArticleDetectFlash#The_code}\n * @see {@link http://stackoverflow.com/questions/12866060/detecting-pepper-ppapi-flash-with-javascript}\n *\n * @returns `undefined`\n * @private\n */\n  var _detectFlashSupport = function(ActiveXObject) {\n    var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = \"\";\n    /**\n   * Derived from Apple's suggested sniffer.\n   * @param {String} desc e.g. \"Shockwave Flash 7.0 r61\"\n   * @returns {String} \"7.0.61\"\n   * @private\n   */\n    function parseFlashVersion(desc) {\n      var matches = desc.match(/[\\d]+/g);\n      matches.length = 3;\n      return matches.join(\".\");\n    }\n    function isPepperFlash(flashPlayerFileName) {\n      return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\\.dll|libpepflashplayer\\.so|pepperflashplayer\\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === \"chrome.plugin\");\n    }\n    function inspectPlugin(plugin) {\n      if (plugin) {\n        hasFlash = true;\n        if (plugin.version) {\n          flashVersion = parseFlashVersion(plugin.version);\n        }\n        if (!flashVersion && plugin.description) {\n          flashVersion = parseFlashVersion(plugin.description);\n        }\n        if (plugin.filename) {\n          isPPAPI = isPepperFlash(plugin.filename);\n        }\n      }\n    }\n    if (_navigator.plugins && _navigator.plugins.length) {\n      plugin = _navigator.plugins[\"Shockwave Flash\"];\n      inspectPlugin(plugin);\n      if (_navigator.plugins[\"Shockwave Flash 2.0\"]) {\n        hasFlash = true;\n        flashVersion = \"2.0.0.11\";\n      }\n    } else if (_navigator.mimeTypes && _navigator.mimeTypes.length) {\n      mimeType = _navigator.mimeTypes[\"application/x-shockwave-flash\"];\n      plugin = mimeType && mimeType.enabledPlugin;\n      inspectPlugin(plugin);\n    } else if (typeof ActiveXObject !== \"undefined\") {\n      isActiveX = true;\n      try {\n        ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n        hasFlash = true;\n        flashVersion = parseFlashVersion(ax.GetVariable(\"$version\"));\n      } catch (e1) {\n        try {\n          ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n          hasFlash = true;\n          flashVersion = \"6.0.21\";\n        } catch (e2) {\n          try {\n            ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n            hasFlash = true;\n            flashVersion = parseFlashVersion(ax.GetVariable(\"$version\"));\n          } catch (e3) {\n            isActiveX = false;\n          }\n        }\n      }\n    }\n    _flashState.disabled = hasFlash !== true;\n    _flashState.outdated = flashVersion && _parseFloat(flashVersion) < _parseFloat(_minimumFlashVersion);\n    _flashState.version = flashVersion || \"0.0.0\";\n    _flashState.pluginType = isPPAPI ? \"pepper\" : isActiveX ? \"activex\" : hasFlash ? \"netscape\" : \"unknown\";\n  };\n  /**\n * Invoke the Flash detection algorithms immediately upon inclusion so we're not waiting later.\n */\n  _detectFlashSupport(_ActiveXObject);\n  /**\n * A shell constructor for `ZeroClipboard` client instances.\n *\n * @constructor\n */\n  var ZeroClipboard = function() {\n    if (!(this instanceof ZeroClipboard)) {\n      return new ZeroClipboard();\n    }\n    if (typeof ZeroClipboard._createClient === \"function\") {\n      ZeroClipboard._createClient.apply(this, _args(arguments));\n    }\n  };\n  /**\n * The ZeroClipboard library's version number.\n *\n * @static\n * @readonly\n * @property {string}\n */\n  _defineProperty(ZeroClipboard, \"version\", {\n    value: \"2.2.0-beta.3\",\n    writable: false,\n    configurable: true,\n    enumerable: true\n  });\n  /**\n * Update or get a copy of the ZeroClipboard global configuration.\n * Returns a copy of the current/updated configuration.\n *\n * @returns Object\n * @static\n */\n  ZeroClipboard.config = function() {\n    return _config.apply(this, _args(arguments));\n  };\n  /**\n * Diagnostic method that describes the state of the browser, Flash Player, and ZeroClipboard.\n *\n * @returns Object\n * @static\n */\n  ZeroClipboard.state = function() {\n    return _state.apply(this, _args(arguments));\n  };\n  /**\n * Check if Flash is unusable for any reason: disabled, outdated, deactivated, etc.\n *\n * @returns Boolean\n * @static\n */\n  ZeroClipboard.isFlashUnusable = function() {\n    return _isFlashUnusable.apply(this, _args(arguments));\n  };\n  /**\n * Register an event listener.\n *\n * @returns `ZeroClipboard`\n * @static\n */\n  ZeroClipboard.on = function() {\n    return _on.apply(this, _args(arguments));\n  };\n  /**\n * Unregister an event listener.\n * If no `listener` function/object is provided, it will unregister all listeners for the provided `eventType`.\n * If no `eventType` is provided, it will unregister all listeners for every event type.\n *\n * @returns `ZeroClipboard`\n * @static\n */\n  ZeroClipboard.off = function() {\n    return _off.apply(this, _args(arguments));\n  };\n  /**\n * Retrieve event listeners for an `eventType`.\n * If no `eventType` is provided, it will retrieve all listeners for every event type.\n *\n * @returns array of listeners for the `eventType`; if no `eventType`, then a map/hash object of listeners for all event types; or `null`\n */\n  ZeroClipboard.handlers = function() {\n    return _listeners.apply(this, _args(arguments));\n  };\n  /**\n * Event emission receiver from the Flash object, forwarding to any registered JavaScript event listeners.\n *\n * @returns For the \"copy\" event, returns the Flash-friendly \"clipData\" object; otherwise `undefined`.\n * @static\n */\n  ZeroClipboard.emit = function() {\n    return _emit.apply(this, _args(arguments));\n  };\n  /**\n * Create and embed the Flash object.\n *\n * @returns The Flash object\n * @static\n */\n  ZeroClipboard.create = function() {\n    return _create.apply(this, _args(arguments));\n  };\n  /**\n * Self-destruct and clean up everything, including the embedded Flash object.\n *\n * @returns `undefined`\n * @static\n */\n  ZeroClipboard.destroy = function() {\n    return _destroy.apply(this, _args(arguments));\n  };\n  /**\n * Set the pending data for clipboard injection.\n *\n * @returns `undefined`\n * @static\n */\n  ZeroClipboard.setData = function() {\n    return _setData.apply(this, _args(arguments));\n  };\n  /**\n * Clear the pending data for clipboard injection.\n * If no `format` is provided, all pending data formats will be cleared.\n *\n * @returns `undefined`\n * @static\n */\n  ZeroClipboard.clearData = function() {\n    return _clearData.apply(this, _args(arguments));\n  };\n  /**\n * Get a copy of the pending data for clipboard injection.\n * If no `format` is provided, a copy of ALL pending data formats will be returned.\n *\n * @returns `String` or `Object`\n * @static\n */\n  ZeroClipboard.getData = function() {\n    return _getData.apply(this, _args(arguments));\n  };\n  /**\n * Sets the current HTML object that the Flash object should overlay. This will put the global\n * Flash object on top of the current element; depending on the setup, this may also set the\n * pending clipboard text data as well as the Flash object's wrapping element's title attribute\n * based on the underlying HTML element and ZeroClipboard configuration.\n *\n * @returns `undefined`\n * @static\n */\n  ZeroClipboard.focus = ZeroClipboard.activate = function() {\n    return _focus.apply(this, _args(arguments));\n  };\n  /**\n * Un-overlays the Flash object. This will put the global Flash object off-screen; depending on\n * the setup, this may also unset the Flash object's wrapping element's title attribute based on\n * the underlying HTML element and ZeroClipboard configuration.\n *\n * @returns `undefined`\n * @static\n */\n  ZeroClipboard.blur = ZeroClipboard.deactivate = function() {\n    return _blur.apply(this, _args(arguments));\n  };\n  /**\n * Returns the currently focused/\"activated\" HTML element that the Flash object is wrapping.\n *\n * @returns `HTMLElement` or `null`\n * @static\n */\n  ZeroClipboard.activeElement = function() {\n    return _activeElement.apply(this, _args(arguments));\n  };\n  if (typeof define === \"function\" && define.amd) {\n    define(function() {\n      return ZeroClipboard;\n    });\n  } else if (typeof module === \"object\" && module && typeof module.exports === \"object\" && module.exports) {\n    module.exports = ZeroClipboard;\n  } else {\n    window.ZeroClipboard = ZeroClipboard;\n  }\n})(function() {\n  return this || window;\n}());"]}