{"version":3,"file":"ZeroClipboard.min.js","sources":["ZeroClipboard.js"],"names":["window","undefined","_currentElement","_window","_document","document","_navigator","navigator","_setTimeout","setTimeout","_parseInt","Number","parseInt","_parseFloat","parseFloat","_isNaN","isNaN","_encodeURIComponent","encodeURIComponent","_Math","Math","_Date","Date","_ActiveXObject","ActiveXObject","_slice","Array","prototype","slice","_keys","Object","keys","_hasOwn","hasOwnProperty","_defineProperty","defineProperty","x","value","y","e","_args","argumentsObj","call","_inArray","item","array","fromIndex","indexOf","i","len","length","_extend","arg","prop","src","copy","args","arguments","target","_deepCopy","source","_pick","obj","newObj","_omit","_objectKeys","push","_deleteOwnProperties","_makeReadOnly","writable","configurable","enumerable","_now","time","now","getTime","_containedBy","el","ancestorEl","nodeType","parentNode","_flashState","bridge","version","pluginType","disabled","outdated","unavailable","deactivated","overdue","ready","_minimumFlashVersion","_handlers","_clipData","_clipDataFormatMap","_eventMessages","error","flash-disabled","flash-outdated","flash-unavailable","flash-deactivated","flash-overdue","_swfPath","jsDir","tmpJsPath","jsPath","swfPath","currentScript","scripts","getElementsByTagName","readyState","split","lastIndexOf","_globalConfig","trustedDomains","location","host","cacheBust","forceEnhancedClipboard","flashLoadTimeout","autoActivate","bubbleEvents","containerId","containerClass","swfObjectId","hoverClass","activeClass","forceHandCursor","title","zIndex","_config","options","test","_isValidHtml4Id","Error","_state","browser","flash","zeroclipboard","ZeroClipboard","config","_isFlashUnusable","_on","eventType","listener","events","added","toLowerCase","on","replace","emit","type","errorTypes","name","_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","_getDOMObjectPosition","screenLeft","screenX","screenTop","screenY","scrollLeft","body","documentElement","scrollTop","pageX","_stageX","pageY","_stageY","clientX","clientY","moveX","movementX","moveY","movementY","offsetX","offsetY","layerX","layerY","_shouldPerformAsync","_dispatchCallback","func","context","async","apply","wildcardTypeHandlers","specificTypeHandlers","handlers","concat","originalContext","handleEvent","sourceIsSwf","_source","wasDeactivated","textContent","htmlContent","outerHTML","innerHTML","innerText","_safeActiveElement","focus","_fireMouseEvent","bubbles","cancelable","doc","ownerDocument","defaults","view","defaultView","canBubble","detail","button","which","createEvent","dispatchEvent","ctrlKey","altKey","shiftKey","metaKey","initMouseEvent","_createHtmlBridge","container","createElement","className","position","height","_getSafeZIndex","flashBridge","nodeName","allowScriptAccess","_determineScriptAccess","allowNetworking","flashvars","_vars","swfUrl","_cacheBust","divToBeReplaced","appendChild","tmpDiv","oldIE","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","trustedOrigins","activeElement","err","classList","contains","add","classNames","setClass","c","cl","remove","getComputedStyle","getPropertyValue","_getZoomFactor","rect","physicalWidth","logicalWidth","zoomFactor","getBoundingClientRect","right","offsetWidth","round","info","pageXOffset","pageYOffset","leftBorderWidth","clientLeft","topBorderWidth","clientTop","bottom","enabled","setHandCursor","val","_detectFlashSupport","parseFlashVersion","desc","matches","match","isPepperFlash","flashPlayerFileName","inspectPlugin","plugin","hasFlash","flashVersion","description","filename","isPPAPI","ax","mimeType","isActiveX","plugins","mimeTypes","enabledPlugin","GetVariable","e1","e2","e3","_createClient","state","create","destroy","getData","activate","deactivate","_clientIdCounter","_clientMeta","_elementIdCounter","_elementMeta","_mouseHandlers","_clientConstructor","elements","client","instance","clip","_clientOn","_clientOff","_clientListeners","_clientEmit","_clientShouldEmit","_clientDispatchCallbacks","_clientClip","_prepClip","zcClippingId","_addMouseHandlers","clippedElements","_clientUnclip","meta","arrayIndex","clientIds","_removeMouseHandlers","_clientElements","_clientDestroy","unclip","clippedEls","hasClippedEls","goodTarget","goodRelTarget","goodClient","_suppressMouseEvents","stopImmediatePropagation","preventDefault","_elementMouseOver","addEventListener","mouseover","mouseout","mouseenter","mouseleave","mousemove","mouseHandlers","key","mouseEvents","removeEventListener","setText","setHtml","setRichText","richText","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) 2014 Jon Rohan, James M. Greene\n * Licensed MIT\n * http://zeroclipboard.org/\n * v2.1.1\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, _parseInt = _window.Number.parseInt || _window.parseInt, _parseFloat = _window.Number.parseFloat || _window.parseFloat, _isNaN = _window.Number.isNaN || _window.isNaN, _encodeURIComponent = _window.encodeURIComponent, _Math = _window.Math, _Date = _window.Date, _ActiveXObject = _window.ActiveXObject, _slice = _window.Array.prototype.slice, _keys = _window.Object.keys, _hasOwn = _window.Object.prototype.hasOwnProperty, _defineProperty = function() {\n    if (typeof _window.Object.defineProperty === \"function\" && function() {\n      try {\n        var x = {};\n        _window.Object.defineProperty(x, \"y\", {\n          value: \"z\"\n        });\n        return x.y === \"z\";\n      } catch (e) {\n        return false;\n      }\n    }()) {\n      return _window.Object.defineProperty;\n    }\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 * Get the index of an item in an Array.\n *\n * @returns The index of an item in the Array, or `-1` if not found.\n * @private\n */\n  var _inArray = function(item, array, fromIndex) {\n    if (typeof array.indexOf === \"function\") {\n      return array.indexOf(item, fromIndex);\n    }\n    var i, len = array.length;\n    if (typeof fromIndex === \"undefined\") {\n      fromIndex = 0;\n    } else if (fromIndex < 0) {\n      fromIndex = len + fromIndex;\n    }\n    for (i = fromIndex; i < len; i++) {\n      if (_hasOwn.call(array, i) && array[i] === item) {\n        return i;\n      }\n    }\n    return -1;\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) {\n              continue;\n            }\n            if (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) {\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 (_inArray(prop, keys) === -1) {\n        newObj[prop] = obj[prop];\n      }\n    }\n    return newObj;\n  };\n  /**\n * Get all of an object's owned, enumerable property names. Does NOT include prototype properties.\n *\n * @returns An Array of property names.\n * @private\n */\n  var _objectKeys = function(obj) {\n    if (obj == null) {\n      return [];\n    }\n    if (_keys) {\n      return _keys(obj);\n    }\n    var keys = [];\n    for (var prop in obj) {\n      if (_hasOwn.call(obj, prop)) {\n        keys.push(prop);\n      }\n    }\n    return keys;\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 * Mark an existing property as read-only.\n * @private\n */\n  var _makeReadOnly = function(obj, prop) {\n    if (prop in obj && typeof _defineProperty === \"function\") {\n      _defineProperty(obj, prop, {\n        value: obj[prop],\n        writable: false,\n        configurable: true,\n        enumerable: true\n      });\n    }\n  };\n  /**\n * Get the current time in milliseconds since the epoch.\n *\n * @returns Number\n * @private\n */\n  var _now = function(Date) {\n    return function() {\n      var time;\n      if (Date.now) {\n        time = Date.now();\n      } else {\n        time = new Date().getTime();\n      }\n      return time;\n    };\n  }(_Date);\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 && ancestorEl && (ancestorEl.nodeType === 1 || ancestorEl.nodeType === 9)) {\n      do {\n        if (el === ancestorEl) {\n          return true;\n        }\n        el = el.parentNode;\n      } while (el);\n    }\n    return false;\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    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 * 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 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 * 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-deactivated\": \"Flash is too outdated for your browser and/or is configured as click-to-activate\",\n      \"flash-overdue\": \"Flash communication was established but NOT within the acceptable time limit\"\n    }\n  };\n  /**\n * The presumed location of the \"ZeroClipboard.swf\" file, based on the location\n * of the executing JavaScript file (e.g. \"ZeroClipboard.js\", etc.).\n * @private\n */\n  var _swfPath = function() {\n    var i, jsDir, tmpJsPath, jsPath, swfPath = \"ZeroClipboard.swf\";\n    if (!(_document.currentScript && (jsPath = _document.currentScript.src))) {\n      var scripts = _document.getElementsByTagName(\"script\");\n      if (\"readyState\" in scripts[0]) {\n        for (i = scripts.length; i--; ) {\n          if (scripts[i].readyState === \"interactive\" && (jsPath = scripts[i].src)) {\n            break;\n          }\n        }\n      } else if (_document.readyState === \"loading\") {\n        jsPath = scripts[scripts.length - 1].src;\n      } else {\n        for (i = scripts.length; i--; ) {\n          tmpJsPath = scripts[i].src;\n          if (!tmpJsPath) {\n            jsDir = null;\n            break;\n          }\n          tmpJsPath = tmpJsPath.split(\"#\")[0].split(\"?\")[0];\n          tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf(\"/\") + 1);\n          if (jsDir == null) {\n            jsDir = tmpJsPath;\n          } else if (jsDir !== tmpJsPath) {\n            jsDir = null;\n            break;\n          }\n        }\n        if (jsDir !== null) {\n          jsPath = jsDir;\n        }\n      }\n    }\n    if (jsPath) {\n      jsPath = jsPath.split(\"#\")[0].split(\"?\")[0];\n      swfPath = jsPath.slice(0, jsPath.lastIndexOf(\"/\") + 1) + swfPath;\n    }\n    return swfPath;\n  }();\n  /**\n * ZeroClipboard configuration defaults for the Core module.\n * @private\n */\n  var _globalConfig = {\n    swfPath: _swfPath,\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.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 errorTypes = [ \"disabled\", \"outdated\", \"unavailable\", \"deactivated\", \"overdue\" ];\n        for (i = 0, len = errorTypes.length; i < len; i++) {\n          if (_flashState[errorTypes[i]] === true) {\n            ZeroClipboard.emit({\n              type: \"error\",\n              name: \"flash-\" + errorTypes[i]\n            });\n            break;\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 = _objectKeys(_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 = _inArray(listener, perEventHandlers);\n            while (foundIndex !== -1) {\n              perEventHandlers.splice(foundIndex, 1);\n              foundIndex = _inArray(listener, perEventHandlers, 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        _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    _extend(event, {\n      type: eventType.toLowerCase(),\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|deactivated|overdue)$/.test(event.name)) {\n        _extend(event, {\n          target: null,\n          minimumVersion: _minimumFlashVersion\n        });\n      }\n      if (/^flash-(outdated|unavailable|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    event = _addMouseData(event);\n    return 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 = _getDOMObjectPosition(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    switch (event.type) {\n     case \"error\":\n      if (_inArray(event.name, [ \"flash-disabled\", \"flash-outdated\", \"flash-deactivated\", \"flash-overdue\" ])) {\n        _extend(_flashState, {\n          disabled: event.name === \"flash-disabled\",\n          outdated: event.name === \"flash-outdated\",\n          unavailable: event.name === \"flash-unavailable\",\n          deactivated: event.name === \"flash-deactivated\",\n          overdue: event.name === \"flash-overdue\",\n          ready: false\n        });\n      }\n      break;\n\n     case \"ready\":\n      var wasDeactivated = _flashState.deactivated === true;\n      _extend(_flashState, {\n        disabled: false,\n        outdated: false,\n        unavailable: false,\n        deactivated: false,\n        overdue: wasDeactivated,\n        ready: !wasDeactivated\n      });\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      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     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 * 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 * 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(_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 oldIE = _flashState.pluginType === \"activex\";\n      tmpDiv.innerHTML = '<object id=\"' + _globalConfig.swfObjectId + '\" name=\"' + _globalConfig.swfObjectId + '\" ' + 'width=\"100%\" height=\"100%\" ' + (oldIE ? 'classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\"' : 'type=\"application/x-shockwave-flash\" data=\"' + swfUrl + '\"') + \">\" + (oldIE ? '<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 + '\"/>' + \"</object>\";\n      flashBridge = tmpDiv.firstChild;\n      tmpDiv = null;\n      flashBridge.ZeroClipboard = ZeroClipboard;\n      container.replaceChild(flashBridge, divToBeReplaced);\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      _flashState.ready = null;\n      _flashState.bridge = null;\n      _flashState.deactivated = null;\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 !== \"success\" && prop !== \"data\") {\n          newResults[prop] = clipResults[prop];\n          continue;\n        }\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    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 = [ 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    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, resultsArray) {\n      var i, len, tmp;\n      if (origins == null || resultsArray[0] === \"*\") {\n        return;\n      }\n      if (typeof origins === \"string\") {\n        origins = [ origins ];\n      }\n      if (!(typeof origins === \"object\" && typeof origins.length === \"number\")) {\n        return;\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 (_inArray(tmp, resultsArray) === -1) {\n            resultsArray.push(tmp);\n          }\n        }\n      }\n    };\n    return function(currentDomain, configOptions) {\n      var swfDomain = _extractDomain(configOptions.swfPath);\n      if (swfDomain === null) {\n        swfDomain = currentDomain;\n      }\n      var trustedDomains = [];\n      _extractAllDomains(configOptions.trustedOrigins, trustedDomains);\n      _extractAllDomains(configOptions.trustedDomains, trustedDomains);\n      var len = trustedDomains.length;\n      if (len > 0) {\n        if (len === 1 && trustedDomains[0] === \"*\") {\n          return \"always\";\n        }\n        if (_inArray(currentDomain, trustedDomains) !== -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 = _window.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 zoom factor of the browser. Always returns `1.0`, except at\n * non-default zoom levels in IE<8 and some older versions of WebKit.\n *\n * @returns Floating unit percentage of the zoom factor (e.g. 150% = `1.5`).\n * @private\n */\n  var _getZoomFactor = function() {\n    var rect, physicalWidth, logicalWidth, zoomFactor = 1;\n    if (typeof _document.body.getBoundingClientRect === \"function\") {\n      rect = _document.body.getBoundingClientRect();\n      physicalWidth = rect.right - rect.left;\n      logicalWidth = _document.body.offsetWidth;\n      zoomFactor = _Math.round(physicalWidth / logicalWidth * 100) / 100;\n    }\n    return zoomFactor;\n  };\n  /**\n * Get the DOM positioning info of an element.\n *\n * @returns Object containing the element's position, width, and height.\n * @private\n */\n  var _getDOMObjectPosition = function(obj) {\n    var info = {\n      left: 0,\n      top: 0,\n      width: 0,\n      height: 0\n    };\n    if (obj.getBoundingClientRect) {\n      var rect = obj.getBoundingClientRect();\n      var pageXOffset, pageYOffset, zoomFactor;\n      if (\"pageXOffset\" in _window && \"pageYOffset\" in _window) {\n        pageXOffset = _window.pageXOffset;\n        pageYOffset = _window.pageYOffset;\n      } else {\n        zoomFactor = _getZoomFactor();\n        pageXOffset = _Math.round(_document.documentElement.scrollLeft / zoomFactor);\n        pageYOffset = _Math.round(_document.documentElement.scrollTop / zoomFactor);\n      }\n      var leftBorderWidth = _document.documentElement.clientLeft || 0;\n      var topBorderWidth = _document.documentElement.clientTop || 0;\n      info.left = rect.left + pageXOffset - leftBorderWidth;\n      info.top = rect.top + pageYOffset - topBorderWidth;\n      info.width = \"width\" in rect ? rect.width : rect.right - rect.left;\n      info.height = \"height\" in rect ? rect.height : rect.bottom - rect.top;\n    }\n    return info;\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 = _getDOMObjectPosition(_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  ZeroClipboard.version = \"2.1.1\";\n  _makeReadOnly(ZeroClipboard, \"version\");\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  /**\n * Keep track of the ZeroClipboard client instance counter.\n */\n  var _clientIdCounter = 0;\n  /**\n * Keep track of the state of the client instances.\n *\n * Entry structure:\n *   _clientMeta[client.id] = {\n *     instance: client,\n *     elements: [],\n *     handlers: {}\n *   };\n */\n  var _clientMeta = {};\n  /**\n * Keep track of the ZeroClipboard clipped elements counter.\n */\n  var _elementIdCounter = 0;\n  /**\n * Keep track of the state of the clipped element relationships to clients.\n *\n * Entry structure:\n *   _elementMeta[element.zcClippingId] = [client1.id, client2.id];\n */\n  var _elementMeta = {};\n  /**\n * Keep track of the state of the mouse event handlers for clipped elements.\n *\n * Entry structure:\n *   _mouseHandlers[element.zcClippingId] = {\n *     mouseover:  function(event) {},\n *     mouseout:   function(event) {},\n *     mouseenter: function(event) {},\n *     mouseleave: function(event) {},\n *     mousemove:  function(event) {}\n *   };\n */\n  var _mouseHandlers = {};\n  /**\n * Extending the ZeroClipboard configuration defaults for the Client module.\n */\n  _extend(_globalConfig, {\n    autoActivate: true\n  });\n  /**\n * The real constructor for `ZeroClipboard` client instances.\n * @private\n */\n  var _clientConstructor = function(elements) {\n    var client = this;\n    client.id = \"\" + _clientIdCounter++;\n    _clientMeta[client.id] = {\n      instance: client,\n      elements: [],\n      handlers: {}\n    };\n    if (elements) {\n      client.clip(elements);\n    }\n    ZeroClipboard.on(\"*\", function(event) {\n      return client.emit(event);\n    });\n    ZeroClipboard.on(\"destroy\", function() {\n      client.destroy();\n    });\n    ZeroClipboard.create();\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.on`.\n * @private\n */\n  var _clientOn = function(eventType, listener) {\n    var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\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          this.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        this.emit({\n          type: \"ready\",\n          client: this\n        });\n      }\n      if (added.error) {\n        var errorTypes = [ \"disabled\", \"outdated\", \"unavailable\", \"deactivated\", \"overdue\" ];\n        for (i = 0, len = errorTypes.length; i < len; i++) {\n          if (_flashState[errorTypes[i]]) {\n            this.emit({\n              type: \"error\",\n              name: \"flash-\" + errorTypes[i],\n              client: this\n            });\n            break;\n          }\n        }\n      }\n    }\n    return this;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.off`.\n * @private\n */\n  var _clientOff = function(eventType, listener) {\n    var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\n    if (arguments.length === 0) {\n      events = _objectKeys(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          this.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 = _inArray(listener, perEventHandlers);\n            while (foundIndex !== -1) {\n              perEventHandlers.splice(foundIndex, 1);\n              foundIndex = _inArray(listener, perEventHandlers, foundIndex);\n            }\n          } else {\n            perEventHandlers.length = 0;\n          }\n        }\n      }\n    }\n    return this;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.handlers`.\n * @private\n */\n  var _clientListeners = function(eventType) {\n    var copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\n    if (handlers) {\n      if (typeof eventType === \"string\" && eventType) {\n        copy = handlers[eventType] ? handlers[eventType].slice(0) : [];\n      } else {\n        copy = _deepCopy(handlers);\n      }\n    }\n    return copy;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.emit`.\n * @private\n */\n  var _clientEmit = function(event) {\n    if (_clientShouldEmit.call(this, event)) {\n      if (typeof event === \"object\" && event && typeof event.type === \"string\" && event.type) {\n        event = _extend({}, event);\n      }\n      var eventCopy = _extend({}, _createEvent(event), {\n        client: this\n      });\n      _clientDispatchCallbacks.call(this, eventCopy);\n    }\n    return this;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.clip`.\n * @private\n */\n  var _clientClip = function(elements) {\n    elements = _prepClip(elements);\n    for (var i = 0; i < elements.length; i++) {\n      if (_hasOwn.call(elements, i) && elements[i] && elements[i].nodeType === 1) {\n        if (!elements[i].zcClippingId) {\n          elements[i].zcClippingId = \"zcClippingId_\" + _elementIdCounter++;\n          _elementMeta[elements[i].zcClippingId] = [ this.id ];\n          if (_globalConfig.autoActivate === true) {\n            _addMouseHandlers(elements[i]);\n          }\n        } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {\n          _elementMeta[elements[i].zcClippingId].push(this.id);\n        }\n        var clippedElements = _clientMeta[this.id] && _clientMeta[this.id].elements;\n        if (_inArray(elements[i], clippedElements) === -1) {\n          clippedElements.push(elements[i]);\n        }\n      }\n    }\n    return this;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.unclip`.\n * @private\n */\n  var _clientUnclip = function(elements) {\n    var meta = _clientMeta[this.id];\n    if (!meta) {\n      return this;\n    }\n    var clippedElements = meta.elements;\n    var arrayIndex;\n    if (typeof elements === \"undefined\") {\n      elements = clippedElements.slice(0);\n    } else {\n      elements = _prepClip(elements);\n    }\n    for (var i = elements.length; i--; ) {\n      if (_hasOwn.call(elements, i) && elements[i] && elements[i].nodeType === 1) {\n        arrayIndex = 0;\n        while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {\n          clippedElements.splice(arrayIndex, 1);\n        }\n        var clientIds = _elementMeta[elements[i].zcClippingId];\n        if (clientIds) {\n          arrayIndex = 0;\n          while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {\n            clientIds.splice(arrayIndex, 1);\n          }\n          if (clientIds.length === 0) {\n            if (_globalConfig.autoActivate === true) {\n              _removeMouseHandlers(elements[i]);\n            }\n            delete elements[i].zcClippingId;\n          }\n        }\n      }\n    }\n    return this;\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.elements`.\n * @private\n */\n  var _clientElements = function() {\n    var meta = _clientMeta[this.id];\n    return meta && meta.elements ? meta.elements.slice(0) : [];\n  };\n  /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.destroy`.\n * @private\n */\n  var _clientDestroy = function() {\n    this.unclip();\n    this.off();\n    delete _clientMeta[this.id];\n  };\n  /**\n * Inspect an Event to see if the Client (`this`) should honor it for emission.\n * @private\n */\n  var _clientShouldEmit = function(event) {\n    if (!(event && event.type)) {\n      return false;\n    }\n    if (event.client && event.client !== this) {\n      return false;\n    }\n    var clippedEls = _clientMeta[this.id] && _clientMeta[this.id].elements;\n    var hasClippedEls = !!clippedEls && clippedEls.length > 0;\n    var goodTarget = !event.target || hasClippedEls && _inArray(event.target, clippedEls) !== -1;\n    var goodRelTarget = event.relatedTarget && hasClippedEls && _inArray(event.relatedTarget, clippedEls) !== -1;\n    var goodClient = event.client && event.client === this;\n    if (!(goodTarget || goodRelTarget || goodClient)) {\n      return false;\n    }\n    return true;\n  };\n  /**\n * Handle the actual dispatching of events to a client instance.\n *\n * @returns `this`\n * @private\n */\n  var _clientDispatchCallbacks = function(event) {\n    if (!(typeof event === \"object\" && event && event.type)) {\n      return;\n    }\n    var async = _shouldPerformAsync(event);\n    var wildcardTypeHandlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[\"*\"] || [];\n    var specificTypeHandlers = _clientMeta[this.id] && _clientMeta[this.id].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 * Prepares the elements for clipping/unclipping.\n *\n * @returns An Array of elements.\n * @private\n */\n  var _prepClip = function(elements) {\n    if (typeof elements === \"string\") {\n      elements = [];\n    }\n    return typeof elements.length !== \"number\" ? [ elements ] : elements;\n  };\n  /**\n * Add a `mouseover` handler function for a clipped element.\n *\n * @returns `undefined`\n * @private\n */\n  var _addMouseHandlers = function(element) {\n    if (!(element && element.nodeType === 1)) {\n      return;\n    }\n    var _suppressMouseEvents = function(event) {\n      if (!(event || (event = _window.event))) {\n        return;\n      }\n      if (event._source !== \"js\") {\n        event.stopImmediatePropagation();\n        event.preventDefault();\n      }\n      delete event._source;\n    };\n    var _elementMouseOver = function(event) {\n      if (!(event || (event = _window.event))) {\n        return;\n      }\n      _suppressMouseEvents(event);\n      ZeroClipboard.focus(element);\n    };\n    element.addEventListener(\"mouseover\", _elementMouseOver, false);\n    element.addEventListener(\"mouseout\", _suppressMouseEvents, false);\n    element.addEventListener(\"mouseenter\", _suppressMouseEvents, false);\n    element.addEventListener(\"mouseleave\", _suppressMouseEvents, false);\n    element.addEventListener(\"mousemove\", _suppressMouseEvents, false);\n    _mouseHandlers[element.zcClippingId] = {\n      mouseover: _elementMouseOver,\n      mouseout: _suppressMouseEvents,\n      mouseenter: _suppressMouseEvents,\n      mouseleave: _suppressMouseEvents,\n      mousemove: _suppressMouseEvents\n    };\n  };\n  /**\n * Remove a `mouseover` handler function for a clipped element.\n *\n * @returns `undefined`\n * @private\n */\n  var _removeMouseHandlers = function(element) {\n    if (!(element && element.nodeType === 1)) {\n      return;\n    }\n    var mouseHandlers = _mouseHandlers[element.zcClippingId];\n    if (!(typeof mouseHandlers === \"object\" && mouseHandlers)) {\n      return;\n    }\n    var key, val, mouseEvents = [ \"move\", \"leave\", \"enter\", \"out\", \"over\" ];\n    for (var i = 0, len = mouseEvents.length; i < len; i++) {\n      key = \"mouse\" + mouseEvents[i];\n      val = mouseHandlers[key];\n      if (typeof val === \"function\") {\n        element.removeEventListener(key, val, false);\n      }\n    }\n    delete _mouseHandlers[element.zcClippingId];\n  };\n  /**\n * Creates a new ZeroClipboard client instance.\n * Optionally, auto-`clip` an element or collection of elements.\n *\n * @constructor\n */\n  ZeroClipboard._createClient = function() {\n    _clientConstructor.apply(this, _args(arguments));\n  };\n  /**\n * Register an event listener to the client.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.on = function() {\n    return _clientOn.apply(this, _args(arguments));\n  };\n  /**\n * Unregister an event handler from the client.\n * If no `listener` function/object is provided, it will unregister all handlers for the provided `eventType`.\n * If no `eventType` is provided, it will unregister all handlers for every event type.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.off = function() {\n    return _clientOff.apply(this, _args(arguments));\n  };\n  /**\n * Retrieve event listeners for an `eventType` from the client.\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.prototype.handlers = function() {\n    return _clientListeners.apply(this, _args(arguments));\n  };\n  /**\n * Event emission receiver from the Flash object for this client's registered JavaScript event listeners.\n *\n * @returns For the \"copy\" event, returns the Flash-friendly \"clipData\" object; otherwise `undefined`.\n */\n  ZeroClipboard.prototype.emit = function() {\n    return _clientEmit.apply(this, _args(arguments));\n  };\n  /**\n * Register clipboard actions for new element(s) to the client.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.clip = function() {\n    return _clientClip.apply(this, _args(arguments));\n  };\n  /**\n * Unregister the clipboard actions of previously registered element(s) on the page.\n * If no elements are provided, ALL registered elements will be unregistered.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.unclip = function() {\n    return _clientUnclip.apply(this, _args(arguments));\n  };\n  /**\n * Get all of the elements to which this client is clipped.\n *\n * @returns array of clipped elements\n */\n  ZeroClipboard.prototype.elements = function() {\n    return _clientElements.apply(this, _args(arguments));\n  };\n  /**\n * Self-destruct and clean up everything for a single client.\n * This will NOT destroy the embedded Flash object.\n *\n * @returns `undefined`\n */\n  ZeroClipboard.prototype.destroy = function() {\n    return _clientDestroy.apply(this, _args(arguments));\n  };\n  /**\n * Stores the pending plain text to inject into the clipboard.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.setText = function(text) {\n    ZeroClipboard.setData(\"text/plain\", text);\n    return this;\n  };\n  /**\n * Stores the pending HTML text to inject into the clipboard.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.setHtml = function(html) {\n    ZeroClipboard.setData(\"text/html\", html);\n    return this;\n  };\n  /**\n * Stores the pending rich text (RTF) to inject into the clipboard.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.setRichText = function(richText) {\n    ZeroClipboard.setData(\"application/rtf\", richText);\n    return this;\n  };\n  /**\n * Stores the pending data to inject into the clipboard.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.setData = function() {\n    ZeroClipboard.setData.apply(this, _args(arguments));\n    return this;\n  };\n  /**\n * Clears the pending data to inject into the clipboard.\n * If no `format` is provided, all pending data formats will be cleared.\n *\n * @returns `this`\n */\n  ZeroClipboard.prototype.clearData = function() {\n    ZeroClipboard.clearData.apply(this, _args(arguments));\n    return this;\n  };\n  /**\n * Gets a copy of the pending data to inject into the clipboard.\n * If no `format` is provided, a copy of ALL pending data formats will be returned.\n *\n * @returns `String` or `Object`\n */\n  ZeroClipboard.prototype.getData = function() {\n    return ZeroClipboard.getData.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;\n}());"]}