@livingdocs/editable.js 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"dist/editable.js","mappings":"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","sources":["webpack://Editable/webpack/universalModuleDefinition","webpack://Editable/./node_modules/bowser/es5.js","webpack://Editable/./node_modules/rangy/lib/rangy-core.js","webpack://Editable/./node_modules/rangy/lib/rangy-textrange.js","webpack://Editable/webpack/bootstrap","webpack://Editable/webpack/runtime/compat get default export","webpack://Editable/webpack/runtime/define property getters","webpack://Editable/webpack/runtime/global","webpack://Editable/webpack/runtime/hasOwnProperty shorthand","webpack://Editable/webpack/runtime/make namespace object","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://Editable/./src/config.js","webpack://Editable/./src/util/error.js","webpack://Editable/./src/util/string.js","webpack://Editable/./src/node-type.js","webpack://Editable/./src/util/dom.js","webpack://Editable/./src/parser.js","webpack://Editable/./src/range-save-restore.js","webpack://Editable/./src/content.js","webpack://Editable/./src/block.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://Editable/./src/quotes.js","webpack://Editable/./src/clipboard.js","webpack://Editable/./src/feature-detection.js","webpack://Editable/./src/eventable.js","webpack://Editable/./src/util/viewport.js","webpack://Editable/./src/cursor.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://Editable/./src/node-iterator.js","webpack://Editable/./src/highlight-text.js","webpack://Editable/./src/plugins/highlighting/text-highlighting.js","webpack://Editable/./src/highlight-support.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://Editable/./src/selection.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://Editable/./src/range-container.js","webpack://Editable/./src/selection-watcher.js","webpack://Editable/./src/keyboard.js","webpack://Editable/./src/dispatcher.js","webpack://Editable/./node_modules/lodash-es/_listCacheClear.js","webpack://Editable/./node_modules/lodash-es/eq.js","webpack://Editable/./node_modules/lodash-es/_assocIndexOf.js","webpack://Editable/./node_modules/lodash-es/_listCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_ListCache.js","webpack://Editable/./node_modules/lodash-es/_listCacheGet.js","webpack://Editable/./node_modules/lodash-es/_listCacheHas.js","webpack://Editable/./node_modules/lodash-es/_listCacheSet.js","webpack://Editable/./node_modules/lodash-es/_freeGlobal.js","webpack://Editable/./node_modules/lodash-es/_root.js","webpack://Editable/./node_modules/lodash-es/_Symbol.js","webpack://Editable/./node_modules/lodash-es/_getRawTag.js","webpack://Editable/./node_modules/lodash-es/_objectToString.js","webpack://Editable/./node_modules/lodash-es/_baseGetTag.js","webpack://Editable/./node_modules/lodash-es/isObject.js","webpack://Editable/./node_modules/lodash-es/isFunction.js","webpack://Editable/./node_modules/lodash-es/_coreJsData.js","webpack://Editable/./node_modules/lodash-es/_isMasked.js","webpack://Editable/./node_modules/lodash-es/_toSource.js","webpack://Editable/./node_modules/lodash-es/_baseIsNative.js","webpack://Editable/./node_modules/lodash-es/_getNative.js","webpack://Editable/./node_modules/lodash-es/_getValue.js","webpack://Editable/./node_modules/lodash-es/_Map.js","webpack://Editable/./node_modules/lodash-es/_nativeCreate.js","webpack://Editable/./node_modules/lodash-es/_hashGet.js","webpack://Editable/./node_modules/lodash-es/_hashHas.js","webpack://Editable/./node_modules/lodash-es/_Hash.js","webpack://Editable/./node_modules/lodash-es/_hashClear.js","webpack://Editable/./node_modules/lodash-es/_hashDelete.js","webpack://Editable/./node_modules/lodash-es/_hashSet.js","webpack://Editable/./node_modules/lodash-es/_getMapData.js","webpack://Editable/./node_modules/lodash-es/_isKeyable.js","webpack://Editable/./node_modules/lodash-es/_MapCache.js","webpack://Editable/./node_modules/lodash-es/_mapCacheClear.js","webpack://Editable/./node_modules/lodash-es/_mapCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_mapCacheGet.js","webpack://Editable/./node_modules/lodash-es/_mapCacheHas.js","webpack://Editable/./node_modules/lodash-es/_mapCacheSet.js","webpack://Editable/./node_modules/lodash-es/_Stack.js","webpack://Editable/./node_modules/lodash-es/_stackClear.js","webpack://Editable/./node_modules/lodash-es/_stackDelete.js","webpack://Editable/./node_modules/lodash-es/_stackGet.js","webpack://Editable/./node_modules/lodash-es/_stackHas.js","webpack://Editable/./node_modules/lodash-es/_stackSet.js","webpack://Editable/./node_modules/lodash-es/_defineProperty.js","webpack://Editable/./node_modules/lodash-es/_baseAssignValue.js","webpack://Editable/./node_modules/lodash-es/_assignMergeValue.js","webpack://Editable/./node_modules/lodash-es/_baseFor.js","webpack://Editable/./node_modules/lodash-es/_createBaseFor.js","webpack://Editable/./node_modules/lodash-es/_cloneBuffer.js","webpack://Editable/./node_modules/lodash-es/_Uint8Array.js","webpack://Editable/./node_modules/lodash-es/_cloneTypedArray.js","webpack://Editable/./node_modules/lodash-es/_cloneArrayBuffer.js","webpack://Editable/./node_modules/lodash-es/_baseCreate.js","webpack://Editable/./node_modules/lodash-es/_getPrototype.js","webpack://Editable/./node_modules/lodash-es/_overArg.js","webpack://Editable/./node_modules/lodash-es/_isPrototype.js","webpack://Editable/./node_modules/lodash-es/isObjectLike.js","webpack://Editable/./node_modules/lodash-es/_baseIsArguments.js","webpack://Editable/./node_modules/lodash-es/isArguments.js","webpack://Editable/./node_modules/lodash-es/isArray.js","webpack://Editable/./node_modules/lodash-es/isLength.js","webpack://Editable/./node_modules/lodash-es/isArrayLike.js","webpack://Editable/./node_modules/lodash-es/isBuffer.js","webpack://Editable/./node_modules/lodash-es/stubFalse.js","webpack://Editable/./node_modules/lodash-es/isPlainObject.js","webpack://Editable/./node_modules/lodash-es/_baseIsTypedArray.js","webpack://Editable/./node_modules/lodash-es/_nodeUtil.js","webpack://Editable/./node_modules/lodash-es/isTypedArray.js","webpack://Editable/./node_modules/lodash-es/_baseUnary.js","webpack://Editable/./node_modules/lodash-es/_safeGet.js","webpack://Editable/./node_modules/lodash-es/_assignValue.js","webpack://Editable/./node_modules/lodash-es/_isIndex.js","webpack://Editable/./node_modules/lodash-es/_arrayLikeKeys.js","webpack://Editable/./node_modules/lodash-es/_baseTimes.js","webpack://Editable/./node_modules/lodash-es/_baseKeysIn.js","webpack://Editable/./node_modules/lodash-es/_nativeKeysIn.js","webpack://Editable/./node_modules/lodash-es/keysIn.js","webpack://Editable/./node_modules/lodash-es/toPlainObject.js","webpack://Editable/./node_modules/lodash-es/_copyObject.js","webpack://Editable/./node_modules/lodash-es/_baseMergeDeep.js","webpack://Editable/./node_modules/lodash-es/isArrayLikeObject.js","webpack://Editable/./node_modules/lodash-es/_copyArray.js","webpack://Editable/./node_modules/lodash-es/_initCloneObject.js","webpack://Editable/./node_modules/lodash-es/_baseMerge.js","webpack://Editable/./node_modules/lodash-es/identity.js","webpack://Editable/./node_modules/lodash-es/_overRest.js","webpack://Editable/./node_modules/lodash-es/_baseSetToString.js","webpack://Editable/./node_modules/lodash-es/constant.js","webpack://Editable/./node_modules/lodash-es/_shortOut.js","webpack://Editable/./node_modules/lodash-es/_setToString.js","webpack://Editable/./node_modules/lodash-es/_baseRest.js","webpack://Editable/./node_modules/lodash-es/_apply.js","webpack://Editable/./node_modules/lodash-es/merge.js","webpack://Editable/./node_modules/lodash-es/_createAssigner.js","webpack://Editable/./node_modules/lodash-es/_isIterateeCall.js","webpack://Editable/./src/plugins/highlighting/spellcheck-service.js","webpack://Editable/./src/plugins/highlighting/whitespace-highlighting.js","webpack://Editable/./src/plugins/highlighting/match-collection.js","webpack://Editable/./src/highlighting.js","webpack://Editable/./src/util/log.js","webpack://Editable/./src/util/element.js","webpack://Editable/./src/util/binary_search.js","webpack://Editable/./src/core.js","webpack://Editable/./src/create-default-events.js","webpack://Editable/./src/create-default-behavior.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Editable\"] = factory();\n\telse\n\t\troot[\"Editable\"] = factory();\n})(self, () => {\nreturn ","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.bowser=t():e.bowser=t()}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"\",r(r.s=90)}({17:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||\"\"},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||\"\"},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},e.getMacOSVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},e.getAndroidVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?\"Cupcake\":1===t[0]&&t[1]>=6?\"Donut\":2===t[0]&&t[1]<2?\"Eclair\":2===t[0]&&2===t[1]?\"Froyo\":2===t[0]&&t[1]>2?\"Gingerbread\":3===t[0]?\"Honeycomb\":4===t[0]&&t[1]<1?\"Ice Cream Sandwich\":4===t[0]&&t[1]<4?\"Jelly Bean\":4===t[0]&&t[1]>=4?\"KitKat\":5===t[0]?\"Lollipop\":6===t[0]?\"Marshmallow\":7===t[0]?\"Nougat\":8===t[0]?\"Oreo\":9===t[0]?\"Pie\":void 0},e.getVersionPrecision=function(e){return e.split(\".\").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],(function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(\".0\");return e.map(n.split(\".\"),(function(e){return new Array(20-e.length).join(\"0\")+e})).reverse()}));for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1}else if(u[0][a]<u[1][a])return-1}},e.map=function(e,t){var r,n=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)n.push(t(e[r]));return n},e.find=function(e,t){var r,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,n=e.length;r<n;r+=1){var i=e[r];if(t(i,r))return i}},e.assign=function(e){for(var t,r,n=e,i=arguments.length,s=new Array(i>1?i-1:0),a=1;a<i;a++)s[a-1]=arguments[a];if(Object.assign)return Object.assign.apply(Object,[e].concat(s));var o=function(){var e=s[t];\"object\"==typeof e&&null!==e&&Object.keys(e).forEach((function(t){n[t]=e[t]}))};for(t=0,r=s.length;t<r;t+=1)o();return e},e.getBrowserAlias=function(e){return n.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return n.BROWSER_MAP[e]||\"\"},e}();t.default=i,e.exports=t.default},18:function(e,t,r){\"use strict\";t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0;t.BROWSER_ALIASES_MAP={\"Amazon Silk\":\"amazon_silk\",\"Android Browser\":\"android\",Bada:\"bada\",BlackBerry:\"blackberry\",Chrome:\"chrome\",Chromium:\"chromium\",Electron:\"electron\",Epiphany:\"epiphany\",Firefox:\"firefox\",Focus:\"focus\",Generic:\"generic\",\"Google Search\":\"google_search\",Googlebot:\"googlebot\",\"Internet Explorer\":\"ie\",\"K-Meleon\":\"k_meleon\",Maxthon:\"maxthon\",\"Microsoft Edge\":\"edge\",\"MZ Browser\":\"mz\",\"NAVER Whale Browser\":\"naver\",Opera:\"opera\",\"Opera Coast\":\"opera_coast\",PhantomJS:\"phantomjs\",Puffin:\"puffin\",QupZilla:\"qupzilla\",QQ:\"qq\",QQLite:\"qqlite\",Safari:\"safari\",Sailfish:\"sailfish\",\"Samsung Internet for Android\":\"samsung_internet\",SeaMonkey:\"seamonkey\",Sleipnir:\"sleipnir\",Swing:\"swing\",Tizen:\"tizen\",\"UC Browser\":\"uc\",Vivaldi:\"vivaldi\",\"WebOS Browser\":\"webos\",WeChat:\"wechat\",\"Yandex Browser\":\"yandex\",Roku:\"roku\"};t.BROWSER_MAP={amazon_silk:\"Amazon Silk\",android:\"Android Browser\",bada:\"Bada\",blackberry:\"BlackBerry\",chrome:\"Chrome\",chromium:\"Chromium\",electron:\"Electron\",epiphany:\"Epiphany\",firefox:\"Firefox\",focus:\"Focus\",generic:\"Generic\",googlebot:\"Googlebot\",google_search:\"Google Search\",ie:\"Internet Explorer\",k_meleon:\"K-Meleon\",maxthon:\"Maxthon\",edge:\"Microsoft Edge\",mz:\"MZ Browser\",naver:\"NAVER Whale Browser\",opera:\"Opera\",opera_coast:\"Opera Coast\",phantomjs:\"PhantomJS\",puffin:\"Puffin\",qupzilla:\"QupZilla\",qq:\"QQ Browser\",qqlite:\"QQ Browser Lite\",safari:\"Safari\",sailfish:\"Sailfish\",samsung_internet:\"Samsung Internet for Android\",seamonkey:\"SeaMonkey\",sleipnir:\"Sleipnir\",swing:\"Swing\",tizen:\"Tizen\",uc:\"UC Browser\",vivaldi:\"Vivaldi\",webos:\"WebOS Browser\",wechat:\"WeChat\",yandex:\"Yandex Browser\"};t.PLATFORMS_MAP={tablet:\"tablet\",mobile:\"mobile\",desktop:\"desktop\",tv:\"tv\"};t.OS_MAP={WindowsPhone:\"Windows Phone\",Windows:\"Windows\",MacOS:\"macOS\",iOS:\"iOS\",Android:\"Android\",WebOS:\"WebOS\",BlackBerry:\"BlackBerry\",Bada:\"Bada\",Tizen:\"Tizen\",Linux:\"Linux\",ChromeOS:\"Chrome OS\",PlayStation4:\"PlayStation 4\",Roku:\"Roku\"};t.ENGINE_MAP={EdgeHTML:\"EdgeHTML\",Blink:\"Blink\",Trident:\"Trident\",Presto:\"Presto\",Gecko:\"Gecko\",WebKit:\"WebKit\"}},90:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(91))&&n.__esModule?n:{default:n},s=r(18);function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var o=function(){function e(){}var t,r,n;return e.getParser=function(e,t){if(void 0===t&&(t=!1),\"string\"!=typeof e)throw new Error(\"UserAgent should be a string\");return new i.default(e,t)},e.parse=function(e){return new i.default(e).getResult()},t=e,n=[{key:\"BROWSER_MAP\",get:function(){return s.BROWSER_MAP}},{key:\"ENGINE_MAP\",get:function(){return s.ENGINE_MAP}},{key:\"OS_MAP\",get:function(){return s.OS_MAP}},{key:\"PLATFORMS_MAP\",get:function(){return s.PLATFORMS_MAP}}],(r=null)&&a(t.prototype,r),n&&a(t,n),e}();t.default=o,e.exports=t.default},91:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n=u(r(92)),i=u(r(93)),s=u(r(94)),a=u(r(95)),o=u(r(17));function u(e){return e&&e.__esModule?e:{default:e}}var d=function(){function e(e,t){if(void 0===t&&(t=!1),null==e||\"\"===e)throw new Error(\"UserAgent parameter can't be empty\");this._ua=e,this.parsedResult={},!0!==t&&this.parse()}var t=e.prototype;return t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=o.default.find(n.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||\"\":this.getBrowser().name||\"\"},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=o.default.find(i.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||\"\":t||\"\"},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||\"\":t||\"\"},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=o.default.find(s.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||\"\":this.getEngine().name||\"\"},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=o.default.find(a.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return o.default.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,r={},n=0,i={},s=0;if(Object.keys(e).forEach((function(t){var a=e[t];\"string\"==typeof a?(i[t]=a,s+=1):\"object\"==typeof a&&(r[t]=a,n+=1)})),n>0){var a=Object.keys(r),u=o.default.find(a,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=o.default.find(a,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=o.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===e[0]||\"<\"===e[0]?(r=e.substr(1),\"=\"===e[1]?(n=!0,r=e.substr(2)):t=[],\">\"===e[0]?t.push(1):t.push(-1)):\"=\"===e[0]?r=e.substr(1):\"~\"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\\/(\\d+(\\.?_?\\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:\"Googlebot\"},r=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\\/|opios/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:\"Samsung Internet for Android\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:\"NAVER Whale Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:\"MZ Browser\"},r=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:\"Focus\"},r=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:\"Swing\"},r=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:\"Opera Coast\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\\/\\d+(?:.?_?\\d+)+/i],describe:function(e){var t={name:\"Opera Touch\"},r=i.default.getFirstMatch(/(?:opt)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:\"Yandex Browser\"},r=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:\"UC Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:\"Maxthon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:\"Epiphany\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:\"Puffin\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:\"Sleipnir\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:\"K-Meleon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:\"WeChat\"},r=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?\"QQ Browser Lite\":\"QQ Browser\"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:\"Internet Explorer\"},r=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\\sedg\\//i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:\"Vivaldi\"},r=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:\"SeaMonkey\"},r=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:\"Sailfish\"},r=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:\"Amazon Silk\"},r=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:\"PhantomJS\"},r=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:\"SlimerJS\"},r=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t={name:\"BlackBerry\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:\"WebOS Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:\"Bada\"},r=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:\"Tizen\"},r=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:\"QupZilla\"},r=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:\"Firefox\"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:\"Electron\"},r=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:\"Miui\"},r=i.default.getFirstMatch(/(?:MiuiBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:\"Chromium\"},r=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:\"Chrome\"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:\"Google Search\"},r=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:\"Android Browser\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:\"PlayStation 4\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:\"Safari\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default},93:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(e){var t={name:s.OS_MAP.iOS},r=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,e).replace(/[_\\s]/g,\".\"),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,e).replace(/[_\\s]/g,\".\");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,e)||i.default.getFirstMatch(/\\bbb(\\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default},94:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&\"Nova\",r={type:s.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return t&&(r.model=t),r}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:t}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"blackberry\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(e){return\"bada\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"windows phone\"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(\".\")[0]);return\"android\"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return\"android\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"macos\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(e){return\"windows\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"linux\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"playstation 4\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return\"roku\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default},95:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return\"microsoft edge\"===e.getBrowserName(!0)},describe:function(e){if(/\\sedg\\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default}})}));","/**\n * Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Copyright 2022, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.1\n * Build date: 17 August 2022\n */\n\n(function(factory, root) {\n if (typeof define == \"function\" && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n // Node/CommonJS style\n module.exports = factory();\n } else {\n // No AMD or CommonJS support so we place Rangy in (probably) the global variable\n root.rangy = factory();\n }\n})(function() {\n\n var OBJECT = \"object\", FUNCTION = \"function\", UNDEFINED = \"undefined\";\n\n // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START\n // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.\n var domRangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n // Minimal set of methods required for DOM Level 2 Range compliance\n var domRangeMethods = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\",\n \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\",\n \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"];\n\n var textRangeProperties = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"];\n\n // Subset of TextRange's full set of methods that we're interested in\n var textRangeMethods = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\",\n \"setEndPoint\", \"getBoundingClientRect\"];\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Trio of functions taken from Peter Michaux's article:\n // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting\n function isHostMethod(o, p) {\n var t = typeof o[p];\n return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == \"unknown\";\n }\n\n function isHostObject(o, p) {\n return !!(typeof o[p] == OBJECT && o[p]);\n }\n\n function isHostProperty(o, p) {\n return typeof o[p] != UNDEFINED;\n }\n\n // Creates a convenience function to save verbose repeated calls to tests functions\n function createMultiplePropertyTest(testFunc) {\n return function(o, props) {\n var i = props.length;\n while (i--) {\n if (!testFunc(o, props[i])) {\n return false;\n }\n }\n return true;\n };\n }\n\n // Next trio of functions are a convenience to save verbose repeated calls to previous two functions\n var areHostMethods = createMultiplePropertyTest(isHostMethod);\n var areHostObjects = createMultiplePropertyTest(isHostObject);\n var areHostProperties = createMultiplePropertyTest(isHostProperty);\n\n function isTextRange(range) {\n return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);\n }\n\n function getBody(doc) {\n return isHostObject(doc, \"body\") ? doc.body : doc.getElementsByTagName(\"body\")[0];\n }\n\n var forEach = [].forEach ?\n function(arr, func) {\n arr.forEach(func);\n } :\n function(arr, func) {\n for (var i = 0, len = arr.length; i < len; ++i) {\n func(arr[i], i);\n }\n };\n\n var modules = {};\n\n var isBrowser = (typeof window != UNDEFINED && typeof document != UNDEFINED);\n\n var util = {\n isHostMethod: isHostMethod,\n isHostObject: isHostObject,\n isHostProperty: isHostProperty,\n areHostMethods: areHostMethods,\n areHostObjects: areHostObjects,\n areHostProperties: areHostProperties,\n isTextRange: isTextRange,\n getBody: getBody,\n forEach: forEach\n };\n\n var api = {\n version: \"1.3.1\",\n initialized: false,\n isBrowser: isBrowser,\n supported: true,\n util: util,\n features: {},\n modules: modules,\n config: {\n alertOnFail: false,\n alertOnWarn: false,\n preferTextRange: false,\n autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize\n }\n };\n\n function consoleLog(msg) {\n if (typeof console != UNDEFINED && isHostMethod(console, \"log\")) {\n console.log(msg);\n }\n }\n\n function alertOrLog(msg, shouldAlert) {\n if (isBrowser && shouldAlert) {\n alert(msg);\n } else {\n consoleLog(msg);\n }\n }\n\n function fail(reason) {\n api.initialized = true;\n api.supported = false;\n alertOrLog(\"Rangy is not supported in this environment. Reason: \" + reason, api.config.alertOnFail);\n }\n\n api.fail = fail;\n\n function warn(msg) {\n alertOrLog(\"Rangy warning: \" + msg, api.config.alertOnWarn);\n }\n\n api.warn = warn;\n\n // Add utility extend() method\n var extend;\n if ({}.hasOwnProperty) {\n util.extend = extend = function(obj, props, deep) {\n var o, p;\n for (var i in props) {\n if (props.hasOwnProperty(i)) {\n o = obj[i];\n p = props[i];\n if (deep && o !== null && typeof o == \"object\" && p !== null && typeof p == \"object\") {\n extend(o, p, true);\n }\n obj[i] = p;\n }\n }\n // Special case for toString, which does not show up in for...in loops in IE <= 8\n if (props.hasOwnProperty(\"toString\")) {\n obj.toString = props.toString;\n }\n return obj;\n };\n\n util.createOptions = function(optionsParam, defaults) {\n var options = {};\n extend(options, defaults);\n if (optionsParam) {\n extend(options, optionsParam);\n }\n return options;\n };\n } else {\n fail(\"hasOwnProperty not supported\");\n }\n\n // Test whether we're in a browser and bail out if not\n if (!isBrowser) {\n fail(\"Rangy can only run in a browser\");\n }\n\n // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not\n (function() {\n var toArray;\n\n if (isBrowser) {\n var el = document.createElement(\"div\");\n el.appendChild(document.createElement(\"span\"));\n var slice = [].slice;\n try {\n if (slice.call(el.childNodes, 0)[0].nodeType == 1) {\n toArray = function(arrayLike) {\n return slice.call(arrayLike, 0);\n };\n }\n } catch (e) {}\n }\n\n if (!toArray) {\n toArray = function(arrayLike) {\n var arr = [];\n for (var i = 0, len = arrayLike.length; i < len; ++i) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n util.toArray = toArray;\n })();\n\n // Very simple event handler wrapper function that doesn't attempt to solve issues such as \"this\" handling or\n // normalization of event properties because we don't need this.\n var addListener;\n if (isBrowser) {\n if (isHostMethod(document, \"addEventListener\")) {\n addListener = function(obj, eventType, listener) {\n obj.addEventListener(eventType, listener, false);\n };\n } else if (isHostMethod(document, \"attachEvent\")) {\n addListener = function(obj, eventType, listener) {\n obj.attachEvent(\"on\" + eventType, listener);\n };\n } else {\n fail(\"Document does not have required addEventListener or attachEvent method\");\n }\n\n util.addListener = addListener;\n }\n\n var initListeners = [];\n\n function getErrorDesc(ex) {\n return ex.message || ex.description || String(ex);\n }\n\n // Initialization\n function init() {\n if (!isBrowser || api.initialized) {\n return;\n }\n var testRange;\n var implementsDomRange = false, implementsTextRange = false;\n\n // First, perform basic feature tests\n\n if (isHostMethod(document, \"createRange\")) {\n testRange = document.createRange();\n if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {\n implementsDomRange = true;\n }\n }\n\n var body = getBody(document);\n if (!body || body.nodeName.toLowerCase() != \"body\") {\n fail(\"No body element found\");\n return;\n }\n\n if (body && isHostMethod(body, \"createTextRange\")) {\n testRange = body.createTextRange();\n if (isTextRange(testRange)) {\n implementsTextRange = true;\n }\n }\n\n if (!implementsDomRange && !implementsTextRange) {\n fail(\"Neither Range nor TextRange are available\");\n return;\n }\n\n api.initialized = true;\n api.features = {\n implementsDomRange: implementsDomRange,\n implementsTextRange: implementsTextRange\n };\n\n // Initialize modules\n var module, errorMessage;\n for (var moduleName in modules) {\n if ( (module = modules[moduleName]) instanceof Module ) {\n module.init(module, api);\n }\n }\n\n // Call init listeners\n for (var i = 0, len = initListeners.length; i < len; ++i) {\n try {\n initListeners[i](api);\n } catch (ex) {\n errorMessage = \"Rangy init listener threw an exception. Continuing. Detail: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n }\n }\n }\n\n function deprecationNotice(deprecated, replacement, module) {\n if (module) {\n deprecated += \" in module \" + module.name;\n }\n api.warn(\"DEPRECATED: \" + deprecated + \" is deprecated. Please use \" +\n replacement + \" instead.\");\n }\n\n function createAliasForDeprecatedMethod(owner, deprecated, replacement, module) {\n owner[deprecated] = function() {\n deprecationNotice(deprecated, replacement, module);\n return owner[replacement].apply(owner, util.toArray(arguments));\n };\n }\n\n util.deprecationNotice = deprecationNotice;\n util.createAliasForDeprecatedMethod = createAliasForDeprecatedMethod;\n\n // Allow external scripts to initialize this library in case it's loaded after the document has loaded\n api.init = init;\n\n // Execute listener immediately if already initialized\n api.addInitListener = function(listener) {\n if (api.initialized) {\n listener(api);\n } else {\n initListeners.push(listener);\n }\n };\n\n var shimListeners = [];\n\n api.addShimListener = function(listener) {\n shimListeners.push(listener);\n };\n\n function shim(win) {\n win = win || window;\n init();\n\n // Notify listeners\n for (var i = 0, len = shimListeners.length; i < len; ++i) {\n shimListeners[i](win);\n }\n }\n\n if (isBrowser) {\n api.shim = api.createMissingNativeApi = shim;\n createAliasForDeprecatedMethod(api, \"createMissingNativeApi\", \"shim\");\n }\n\n function Module(name, dependencies, initializer) {\n this.name = name;\n this.dependencies = dependencies;\n this.initialized = false;\n this.supported = false;\n this.initializer = initializer;\n }\n\n Module.prototype = {\n init: function() {\n var requiredModuleNames = this.dependencies || [];\n for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {\n moduleName = requiredModuleNames[i];\n\n requiredModule = modules[moduleName];\n if (!requiredModule || !(requiredModule instanceof Module)) {\n throw new Error(\"required module '\" + moduleName + \"' not found\");\n }\n\n requiredModule.init();\n\n if (!requiredModule.supported) {\n throw new Error(\"required module '\" + moduleName + \"' not supported\");\n }\n }\n\n // Now run initializer\n this.initializer(this);\n },\n\n fail: function(reason) {\n this.initialized = true;\n this.supported = false;\n throw new Error(reason);\n },\n\n warn: function(msg) {\n api.warn(\"Module \" + this.name + \": \" + msg);\n },\n\n deprecationNotice: function(deprecated, replacement) {\n api.warn(\"DEPRECATED: \" + deprecated + \" in module \" + this.name + \" is deprecated. Please use \" +\n replacement + \" instead\");\n },\n\n createError: function(msg) {\n return new Error(\"Error in Rangy \" + this.name + \" module: \" + msg);\n }\n };\n\n function createModule(name, dependencies, initFunc) {\n var newModule = new Module(name, dependencies, function(module) {\n if (!module.initialized) {\n module.initialized = true;\n try {\n initFunc(api, module);\n module.supported = true;\n } catch (ex) {\n var errorMessage = \"Module '\" + name + \"' failed to load: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n if (ex.stack) {\n consoleLog(ex.stack);\n }\n }\n }\n });\n modules[name] = newModule;\n return newModule;\n }\n\n api.createModule = function(name) {\n // Allow 2 or 3 arguments (second argument is an optional array of dependencies)\n var initFunc, dependencies;\n if (arguments.length == 2) {\n initFunc = arguments[1];\n dependencies = [];\n } else {\n initFunc = arguments[2];\n dependencies = arguments[1];\n }\n\n var module = createModule(name, dependencies, initFunc);\n\n // Initialize the module immediately if the core is already initialized\n if (api.initialized && api.supported) {\n module.init();\n }\n };\n\n api.createCoreModule = function(name, dependencies, initFunc) {\n createModule(name, dependencies, initFunc);\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately\n\n function RangePrototype() {}\n api.RangePrototype = RangePrototype;\n api.rangePrototype = new RangePrototype();\n\n function SelectionPrototype() {}\n api.selectionPrototype = new SelectionPrototype();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // DOM utility methods used by Rangy\n api.createCoreModule(\"DomUtil\", [], function(api, module) {\n var UNDEF = \"undefined\";\n var util = api.util;\n var getBody = util.getBody;\n\n // Perform feature tests\n if (!util.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"])) {\n module.fail(\"document missing a Node creation method\");\n }\n\n if (!util.isHostMethod(document, \"getElementsByTagName\")) {\n module.fail(\"document missing getElementsByTagName method\");\n }\n\n var el = document.createElement(\"div\");\n if (!util.areHostMethods(el, [\"insertBefore\", \"appendChild\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]))) {\n module.fail(\"Incomplete Element implementation\");\n }\n\n // innerHTML is required for Range's createContextualFragment method\n if (!util.isHostProperty(el, \"innerHTML\")) {\n module.fail(\"Element is missing innerHTML property\");\n }\n\n var textNode = document.createTextNode(\"test\");\n if (!util.areHostMethods(textNode, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) ||\n !util.areHostProperties(textNode, [\"data\"]))) {\n module.fail(\"Incomplete Text Node implementation\");\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been\n // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that\n // contains just the document as a single element and the value searched for is the document.\n var arrayContains = /*Array.prototype.indexOf ?\n function(arr, val) {\n return arr.indexOf(val) > -1;\n }:*/\n\n function(arr, val) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === val) {\n return true;\n }\n }\n return false;\n };\n\n // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI\n function isHtmlNamespace(node) {\n var ns;\n return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == \"http://www.w3.org/1999/xhtml\");\n }\n\n function parentElement(node) {\n var parent = node.parentNode;\n return (parent.nodeType == 1) ? parent : null;\n }\n\n function getNodeIndex(node) {\n var i = 0;\n while( (node = node.previousSibling) ) {\n ++i;\n }\n return i;\n }\n\n function getNodeLength(node) {\n switch (node.nodeType) {\n case 7:\n case 10:\n return 0;\n case 3:\n case 8:\n return node.length;\n default:\n return node.childNodes.length;\n }\n }\n\n function getCommonAncestor(node1, node2) {\n var ancestors = [], n;\n for (n = node1; n; n = n.parentNode) {\n ancestors.push(n);\n }\n\n for (n = node2; n; n = n.parentNode) {\n if (arrayContains(ancestors, n)) {\n return n;\n }\n }\n\n return null;\n }\n\n function isAncestorOf(ancestor, descendant, selfIsAncestor) {\n var n = selfIsAncestor ? descendant : descendant.parentNode;\n while (n) {\n if (n === ancestor) {\n return true;\n } else {\n n = n.parentNode;\n }\n }\n return false;\n }\n\n function isOrIsAncestorOf(ancestor, descendant) {\n return isAncestorOf(ancestor, descendant, true);\n }\n\n function getClosestAncestorIn(node, ancestor, selfIsAncestor) {\n var p, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n p = n.parentNode;\n if (p === ancestor) {\n return n;\n }\n n = p;\n }\n return null;\n }\n\n function isCharacterDataNode(node) {\n var t = node.nodeType;\n return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment\n }\n\n function isTextOrCommentNode(node) {\n if (!node) {\n return false;\n }\n var t = node.nodeType;\n return t == 3 || t == 8 ; // Text or Comment\n }\n\n function insertAfter(node, precedingNode) {\n var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;\n if (nextNode) {\n parent.insertBefore(node, nextNode);\n } else {\n parent.appendChild(node);\n }\n return node;\n }\n\n // Note that we cannot use splitText() because it is bugridden in IE 9.\n function splitDataNode(node, index, positionsToPreserve) {\n var newNode = node.cloneNode(false);\n newNode.deleteData(0, index);\n node.deleteData(index, node.length - index);\n insertAfter(newNode, node);\n\n // Preserve positions\n if (positionsToPreserve) {\n for (var i = 0, position; position = positionsToPreserve[i++]; ) {\n // Handle case where position was inside the portion of node after the split point\n if (position.node == node && position.offset > index) {\n position.node = newNode;\n position.offset -= index;\n }\n // Handle the case where the position is a node offset within node's parent\n else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {\n ++position.offset;\n }\n }\n }\n return newNode;\n }\n\n function getDocument(node) {\n if (node.nodeType == 9) {\n return node;\n } else if (typeof node.ownerDocument != UNDEF) {\n return node.ownerDocument;\n } else if (typeof node.document != UNDEF) {\n return node.document;\n } else if (node.parentNode) {\n return getDocument(node.parentNode);\n } else {\n throw module.createError(\"getDocument: no document found for node\");\n }\n }\n\n function getWindow(node) {\n var doc = getDocument(node);\n if (typeof doc.defaultView != UNDEF) {\n return doc.defaultView;\n } else if (typeof doc.parentWindow != UNDEF) {\n return doc.parentWindow;\n } else {\n throw module.createError(\"Cannot get a window object for node\");\n }\n }\n\n function getIframeDocument(iframeEl) {\n if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument;\n } else if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow.document;\n } else {\n throw module.createError(\"getIframeDocument: No Document object found for iframe element\");\n }\n }\n\n function getIframeWindow(iframeEl) {\n if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow;\n } else if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument.defaultView;\n } else {\n throw module.createError(\"getIframeWindow: No Window object found for iframe element\");\n }\n }\n\n // This looks bad. Is it worth it?\n function isWindow(obj) {\n return obj && util.isHostMethod(obj, \"setTimeout\") && util.isHostObject(obj, \"document\");\n }\n\n function getContentDocument(obj, module, methodName) {\n var doc;\n\n if (!obj) {\n doc = document;\n }\n\n // Test if a DOM node has been passed and obtain a document object for it if so\n else if (util.isHostProperty(obj, \"nodeType\")) {\n doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == \"iframe\") ?\n getIframeDocument(obj) : getDocument(obj);\n }\n\n // Test if the doc parameter appears to be a Window object\n else if (isWindow(obj)) {\n doc = obj.document;\n }\n\n if (!doc) {\n throw module.createError(methodName + \"(): Parameter must be a Window object or DOM node\");\n }\n\n return doc;\n }\n\n function getRootContainer(node) {\n var parent;\n while ( (parent = node.parentNode) ) {\n node = parent;\n }\n return node;\n }\n\n function comparePoints(nodeA, offsetA, nodeB, offsetB) {\n // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing\n var nodeC, root, childA, childB, n;\n if (nodeA == nodeB) {\n // Case 1: nodes are the same\n return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {\n // Case 2: node C (container B or an ancestor) is a child node of A\n return offsetA <= getNodeIndex(nodeC) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {\n // Case 3: node C (container A or an ancestor) is a child node of B\n return getNodeIndex(nodeC) < offsetB ? -1 : 1;\n } else {\n root = getCommonAncestor(nodeA, nodeB);\n if (!root) {\n throw new Error(\"comparePoints error: nodes have no common ancestor\");\n }\n\n // Case 4: containers are siblings or descendants of siblings\n childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);\n childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);\n\n if (childA === childB) {\n // This shouldn't be possible\n throw module.createError(\"comparePoints got to case 4 and childA and childB are the same!\");\n } else {\n n = root.firstChild;\n while (n) {\n if (n === childA) {\n return -1;\n } else if (n === childB) {\n return 1;\n }\n n = n.nextSibling;\n }\n }\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried\n var crashyTextNodes = false;\n\n function isBrokenNode(node) {\n var n;\n try {\n n = node.parentNode;\n return false;\n } catch (e) {\n return true;\n }\n }\n\n (function() {\n var el = document.createElement(\"b\");\n el.innerHTML = \"1\";\n var textNode = el.firstChild;\n el.innerHTML = \"<br />\";\n crashyTextNodes = isBrokenNode(textNode);\n\n api.features.crashyTextNodes = crashyTextNodes;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function inspectNode(node) {\n if (!node) {\n return \"[No node]\";\n }\n if (crashyTextNodes && isBrokenNode(node)) {\n return \"[Broken node]\";\n }\n if (isCharacterDataNode(node)) {\n return '\"' + node.data + '\"';\n }\n if (node.nodeType == 1) {\n var idAttr = node.id ? ' id=\"' + node.id + '\"' : \"\";\n return \"<\" + node.nodeName + idAttr + \">[index:\" + getNodeIndex(node) + \",length:\" + node.childNodes.length + \"][\" + (node.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n }\n return node.nodeName;\n }\n\n function fragmentFromNodeChildren(node) {\n var fragment = getDocument(node).createDocumentFragment(), child;\n while ( (child = node.firstChild) ) {\n fragment.appendChild(child);\n }\n return fragment;\n }\n\n var getComputedStyleProperty;\n if (typeof window.getComputedStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return getWindow(el).getComputedStyle(el, null)[propName];\n };\n } else if (typeof document.documentElement.currentStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return el.currentStyle ? el.currentStyle[propName] : \"\";\n };\n } else {\n module.fail(\"No means of obtaining computed style properties found\");\n }\n\n function createTestElement(doc, html, contentEditable) {\n var body = getBody(doc);\n var el = doc.createElement(\"div\");\n el.contentEditable = \"\" + !!contentEditable;\n if (html) {\n el.innerHTML = html;\n }\n\n // Insert the test element at the start of the body to prevent scrolling to the bottom in iOS (issue #292)\n var bodyFirstChild = body.firstChild;\n if (bodyFirstChild) {\n body.insertBefore(el, bodyFirstChild);\n } else {\n body.appendChild(el);\n }\n\n return el;\n }\n\n function removeNode(node) {\n return node.parentNode.removeChild(node);\n }\n\n function NodeIterator(root) {\n this.root = root;\n this._next = root;\n }\n\n NodeIterator.prototype = {\n _current: null,\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n var n = this._current = this._next;\n var child, next;\n if (this._current) {\n child = n.firstChild;\n if (child) {\n this._next = child;\n } else {\n next = null;\n while ((n !== this.root) && !(next = n.nextSibling)) {\n n = n.parentNode;\n }\n this._next = next;\n }\n }\n return this._current;\n },\n\n detach: function() {\n this._current = this._next = this.root = null;\n }\n };\n\n function createIterator(root) {\n return new NodeIterator(root);\n }\n\n function DomPosition(node, offset) {\n this.node = node;\n this.offset = offset;\n }\n\n DomPosition.prototype = {\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset == pos.offset;\n },\n\n inspect: function() {\n return \"[DomPosition(\" + inspectNode(this.node) + \":\" + this.offset + \")]\";\n },\n\n toString: function() {\n return this.inspect();\n }\n };\n\n function DOMException(codeName) {\n this.code = this[codeName];\n this.codeName = codeName;\n this.message = \"DOMException: \" + this.codeName;\n }\n\n DOMException.prototype = {\n INDEX_SIZE_ERR: 1,\n HIERARCHY_REQUEST_ERR: 3,\n WRONG_DOCUMENT_ERR: 4,\n NO_MODIFICATION_ALLOWED_ERR: 7,\n NOT_FOUND_ERR: 8,\n NOT_SUPPORTED_ERR: 9,\n INVALID_STATE_ERR: 11,\n INVALID_NODE_TYPE_ERR: 24\n };\n\n DOMException.prototype.toString = function() {\n return this.message;\n };\n\n api.dom = {\n arrayContains: arrayContains,\n isHtmlNamespace: isHtmlNamespace,\n parentElement: parentElement,\n getNodeIndex: getNodeIndex,\n getNodeLength: getNodeLength,\n getCommonAncestor: getCommonAncestor,\n isAncestorOf: isAncestorOf,\n isOrIsAncestorOf: isOrIsAncestorOf,\n getClosestAncestorIn: getClosestAncestorIn,\n isCharacterDataNode: isCharacterDataNode,\n isTextOrCommentNode: isTextOrCommentNode,\n insertAfter: insertAfter,\n splitDataNode: splitDataNode,\n getDocument: getDocument,\n getWindow: getWindow,\n getIframeWindow: getIframeWindow,\n getIframeDocument: getIframeDocument,\n getBody: getBody,\n isWindow: isWindow,\n getContentDocument: getContentDocument,\n getRootContainer: getRootContainer,\n comparePoints: comparePoints,\n isBrokenNode: isBrokenNode,\n inspectNode: inspectNode,\n getComputedStyleProperty: getComputedStyleProperty,\n createTestElement: createTestElement,\n removeNode: removeNode,\n fragmentFromNodeChildren: fragmentFromNodeChildren,\n createIterator: createIterator,\n DomPosition: DomPosition\n };\n\n api.DOMException = DOMException;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Pure JavaScript implementation of DOM Range\n api.createCoreModule(\"DomRange\", [\"DomUtil\"], function(api, module) {\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DOMException = api.DOMException;\n\n var isCharacterDataNode = dom.isCharacterDataNode;\n var getNodeIndex = dom.getNodeIndex;\n var isOrIsAncestorOf = dom.isOrIsAncestorOf;\n var getDocument = dom.getDocument;\n var comparePoints = dom.comparePoints;\n var splitDataNode = dom.splitDataNode;\n var getClosestAncestorIn = dom.getClosestAncestorIn;\n var getNodeLength = dom.getNodeLength;\n var arrayContains = dom.arrayContains;\n var getRootContainer = dom.getRootContainer;\n var crashyTextNodes = api.features.crashyTextNodes;\n\n var removeNode = dom.removeNode;\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Utility functions\n\n function isNonTextPartiallySelected(node, range) {\n return (node.nodeType != 3) &&\n (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));\n }\n\n function getRangeDocument(range) {\n return range.document || getDocument(range.startContainer);\n }\n\n function getRangeRoot(range) {\n return getRootContainer(range.startContainer);\n }\n\n function getBoundaryBeforeNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node));\n }\n\n function getBoundaryAfterNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node) + 1);\n }\n\n function insertNodeAtPosition(node, n, o) {\n var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;\n if (isCharacterDataNode(n)) {\n if (o == n.length) {\n dom.insertAfter(node, n);\n } else {\n n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));\n }\n } else if (o >= n.childNodes.length) {\n n.appendChild(node);\n } else {\n n.insertBefore(node, n.childNodes[o]);\n }\n return firstNodeInserted;\n }\n\n function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {\n assertRangeValid(rangeA);\n assertRangeValid(rangeB);\n\n if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n\n var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),\n endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n }\n\n function cloneSubtree(iterator) {\n var partiallySelected;\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n partiallySelected = iterator.isPartiallySelectedSubtree();\n node = node.cloneNode(!partiallySelected);\n if (partiallySelected) {\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(cloneSubtree(subIterator));\n subIterator.detach();\n }\n\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function iterateSubtree(rangeIterator, func, iteratorState) {\n var it, n;\n iteratorState = iteratorState || { stop: false };\n for (var node, subRangeIterator; node = rangeIterator.next(); ) {\n if (rangeIterator.isPartiallySelectedSubtree()) {\n if (func(node) === false) {\n iteratorState.stop = true;\n return;\n } else {\n // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of\n // the node selected by the Range.\n subRangeIterator = rangeIterator.getSubtreeIterator();\n iterateSubtree(subRangeIterator, func, iteratorState);\n subRangeIterator.detach();\n if (iteratorState.stop) {\n return;\n }\n }\n } else {\n // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its\n // descendants\n it = dom.createIterator(node);\n while ( (n = it.next()) ) {\n if (func(n) === false) {\n iteratorState.stop = true;\n return;\n }\n }\n }\n }\n }\n\n function deleteSubtree(iterator) {\n var subIterator;\n while (iterator.next()) {\n if (iterator.isPartiallySelectedSubtree()) {\n subIterator = iterator.getSubtreeIterator();\n deleteSubtree(subIterator);\n subIterator.detach();\n } else {\n iterator.remove();\n }\n }\n }\n\n function extractSubtree(iterator) {\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n\n if (iterator.isPartiallySelectedSubtree()) {\n node = node.cloneNode(false);\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(extractSubtree(subIterator));\n subIterator.detach();\n } else {\n iterator.remove();\n }\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function getNodesInRange(range, nodeTypes, filter) {\n var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;\n var filterExists = !!filter;\n if (filterNodeTypes) {\n regex = new RegExp(\"^(\" + nodeTypes.join(\"|\") + \")$\");\n }\n\n var nodes = [];\n iterateSubtree(new RangeIterator(range, false), function(node) {\n if (filterNodeTypes && !regex.test(node.nodeType)) {\n return;\n }\n if (filterExists && !filter(node)) {\n return;\n }\n // Don't include a boundary container if it is a character data node and the range does not contain any\n // of its character data. See issue 190.\n var sc = range.startContainer;\n if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {\n return;\n }\n\n var ec = range.endContainer;\n if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {\n return;\n }\n\n nodes.push(node);\n });\n return nodes;\n }\n\n function inspect(range) {\n var name = (typeof range.getName == \"undefined\") ? \"Range\" : range.getName();\n return \"[\" + name + \"(\" + dom.inspectNode(range.startContainer) + \":\" + range.startOffset + \", \" +\n dom.inspectNode(range.endContainer) + \":\" + range.endOffset + \")]\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)\n\n function RangeIterator(range, clonePartiallySelectedTextNodes) {\n this.range = range;\n this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;\n\n\n if (!range.collapsed) {\n this.sc = range.startContainer;\n this.so = range.startOffset;\n this.ec = range.endContainer;\n this.eo = range.endOffset;\n var root = range.commonAncestorContainer;\n\n if (this.sc === this.ec && isCharacterDataNode(this.sc)) {\n this.isSingleCharacterDataNode = true;\n this._first = this._last = this._next = this.sc;\n } else {\n this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?\n this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);\n this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?\n this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);\n }\n }\n }\n\n RangeIterator.prototype = {\n _current: null,\n _next: null,\n _first: null,\n _last: null,\n isSingleCharacterDataNode: false,\n\n reset: function() {\n this._current = null;\n this._next = this._first;\n },\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n // Move to next node\n var current = this._current = this._next;\n if (current) {\n this._next = (current !== this._last) ? current.nextSibling : null;\n\n // Check for partially selected text nodes\n if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {\n if (current === this.ec) {\n (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);\n }\n if (this._current === this.sc) {\n (current = current.cloneNode(true)).deleteData(0, this.so);\n }\n }\n }\n\n return current;\n },\n\n remove: function() {\n var current = this._current, start, end;\n\n if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {\n start = (current === this.sc) ? this.so : 0;\n end = (current === this.ec) ? this.eo : current.length;\n if (start != end) {\n current.deleteData(start, end - start);\n }\n } else {\n if (current.parentNode) {\n removeNode(current);\n } else {\n }\n }\n },\n\n // Checks if the current node is partially selected\n isPartiallySelectedSubtree: function() {\n var current = this._current;\n return isNonTextPartiallySelected(current, this.range);\n },\n\n getSubtreeIterator: function() {\n var subRange;\n if (this.isSingleCharacterDataNode) {\n subRange = this.range.cloneRange();\n subRange.collapse(false);\n } else {\n subRange = new Range(getRangeDocument(this.range));\n var current = this._current;\n var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);\n\n if (isOrIsAncestorOf(current, this.sc)) {\n startContainer = this.sc;\n startOffset = this.so;\n }\n if (isOrIsAncestorOf(current, this.ec)) {\n endContainer = this.ec;\n endOffset = this.eo;\n }\n\n updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);\n }\n return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);\n },\n\n detach: function() {\n this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n }\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];\n var rootContainerNodeTypes = [2, 9, 11];\n var readonlyNodeTypes = [5, 6, 10, 12];\n var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];\n var surroundNodeTypes = [1, 3, 4, 5, 7, 8];\n\n function createAncestorFinder(nodeTypes) {\n return function(node, selfIsAncestor) {\n var t, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n t = n.nodeType;\n if (arrayContains(nodeTypes, t)) {\n return n;\n }\n n = n.parentNode;\n }\n return null;\n };\n }\n\n var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );\n var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);\n var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );\n var getElementAncestor = createAncestorFinder( [1] );\n\n function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {\n if (getDocTypeNotationEntityAncestor(node, allowSelf)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidNodeType(node, invalidTypes) {\n if (!arrayContains(invalidTypes, node.nodeType)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n function assertSameDocumentOrFragment(node1, node2) {\n if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertNodeNotReadOnly(node) {\n if (getReadonlyAncestor(node, true)) {\n throw new DOMException(\"NO_MODIFICATION_ALLOWED_ERR\");\n }\n }\n\n function assertNode(node, codeName) {\n if (!node) {\n throw new DOMException(codeName);\n }\n }\n\n function isValidOffset(node, offset) {\n return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);\n }\n\n function isRangeValid(range) {\n return (!!range.startContainer && !!range.endContainer &&\n !(crashyTextNodes && (dom.isBrokenNode(range.startContainer) || dom.isBrokenNode(range.endContainer))) &&\n getRootContainer(range.startContainer) == getRootContainer(range.endContainer) &&\n isValidOffset(range.startContainer, range.startOffset) &&\n isValidOffset(range.endContainer, range.endOffset));\n }\n\n function assertRangeValid(range) {\n if (!isRangeValid(range)) {\n throw new Error(\"Range error: Range is not valid. This usually happens after DOM mutation. Range: (\" + range.inspect() + \")\");\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test the browser's innerHTML support to decide how to implement createContextualFragment\n var styleEl = document.createElement(\"style\");\n var htmlParsingConforms = false;\n try {\n styleEl.innerHTML = \"<b>x</b>\";\n htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Pre-Blink Opera incorrectly creates an element node\n } catch (e) {\n // IE 6 and 7 throw\n }\n\n api.features.htmlParsingConforms = htmlParsingConforms;\n\n var createContextualFragment = htmlParsingConforms ?\n\n // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See\n // discussion and base code for this implementation at issue 67.\n // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface\n // Thanks to Aleks Williams.\n function(fragmentStr) {\n // \"Let node the context object's start's node.\"\n var node = this.startContainer;\n var doc = getDocument(node);\n\n // \"If the context object's start's node is null, raise an INVALID_STATE_ERR\n // exception and abort these steps.\"\n if (!node) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // \"Let element be as follows, depending on node's interface:\"\n // Document, Document Fragment: null\n var el = null;\n\n // \"Element: node\"\n if (node.nodeType == 1) {\n el = node;\n\n // \"Text, Comment: node's parentElement\"\n } else if (isCharacterDataNode(node)) {\n el = dom.parentElement(node);\n }\n\n // \"If either element is null or element's ownerDocument is an HTML document\n // and element's local name is \"html\" and element's namespace is the HTML\n // namespace\"\n if (el === null || (\n el.nodeName == \"HTML\" &&\n dom.isHtmlNamespace(getDocument(el).documentElement) &&\n dom.isHtmlNamespace(el)\n )) {\n\n // \"let element be a new Element with \"body\" as its local name and the HTML\n // namespace as its namespace.\"\"\n el = doc.createElement(\"body\");\n } else {\n el = el.cloneNode(false);\n }\n\n // \"If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm.\"\n // \"If the node's document is an XML document: Invoke the XML fragment parsing algorithm.\"\n // \"In either case, the algorithm must be invoked with fragment as the input\n // and element as the context element.\"\n el.innerHTML = fragmentStr;\n\n // \"If this raises an exception, then abort these steps. Otherwise, let new\n // children be the nodes returned.\"\n\n // \"Let fragment be a new DocumentFragment.\"\n // \"Append all new children to fragment.\"\n // \"Return fragment.\"\n return dom.fragmentFromNodeChildren(el);\n } :\n\n // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that\n // previous versions of Rangy used (with the exception of using a body element rather than a div)\n function(fragmentStr) {\n var doc = getRangeDocument(this);\n var el = doc.createElement(\"body\");\n el.innerHTML = fragmentStr;\n\n return dom.fragmentFromNodeChildren(el);\n };\n\n function splitRangeBoundaries(range, positionsToPreserve) {\n assertRangeValid(range);\n\n var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;\n var startEndSame = (sc === ec);\n\n if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {\n splitDataNode(ec, eo, positionsToPreserve);\n }\n\n if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {\n sc = splitDataNode(sc, so, positionsToPreserve);\n if (startEndSame) {\n eo -= so;\n ec = sc;\n } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {\n eo++;\n }\n so = 0;\n }\n range.setStartAndEnd(sc, so, ec, eo);\n }\n\n function rangeToHtml(range) {\n assertRangeValid(range);\n var container = range.commonAncestorContainer.parentNode.cloneNode(false);\n container.appendChild( range.cloneContents() );\n return container.innerHTML;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var rangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n var s2s = 0, s2e = 1, e2e = 2, e2s = 3;\n var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;\n\n util.extend(api.rangePrototype, {\n compareBoundaryPoints: function(how, range) {\n assertRangeValid(this);\n assertSameDocumentOrFragment(this.startContainer, range.startContainer);\n\n var nodeA, offsetA, nodeB, offsetB;\n var prefixA = (how == e2s || how == s2s) ? \"start\" : \"end\";\n var prefixB = (how == s2e || how == s2s) ? \"start\" : \"end\";\n nodeA = this[prefixA + \"Container\"];\n offsetA = this[prefixA + \"Offset\"];\n nodeB = range[prefixB + \"Container\"];\n offsetB = range[prefixB + \"Offset\"];\n return comparePoints(nodeA, offsetA, nodeB, offsetB);\n },\n\n insertNode: function(node) {\n assertRangeValid(this);\n assertValidNodeType(node, insertableNodeTypes);\n assertNodeNotReadOnly(this.startContainer);\n\n if (isOrIsAncestorOf(node, this.startContainer)) {\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n\n // No check for whether the container of the start of the Range is of a type that does not allow\n // children of the type of node: the browser's DOM implementation should do this for us when we attempt\n // to add the node\n\n var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);\n this.setStartBefore(firstNodeInserted);\n },\n\n cloneContents: function() {\n assertRangeValid(this);\n\n var clone, frag;\n if (this.collapsed) {\n return getRangeDocument(this).createDocumentFragment();\n } else {\n if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {\n clone = this.startContainer.cloneNode(true);\n clone.data = clone.data.slice(this.startOffset, this.endOffset);\n frag = getRangeDocument(this).createDocumentFragment();\n frag.appendChild(clone);\n return frag;\n } else {\n var iterator = new RangeIterator(this, true);\n clone = cloneSubtree(iterator);\n iterator.detach();\n }\n return clone;\n }\n },\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n surroundContents: function(node) {\n assertValidNodeType(node, surroundNodeTypes);\n\n if (!this.canSurroundContents()) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // Extract the contents\n var content = this.extractContents();\n\n // Clear the children of the node\n if (node.hasChildNodes()) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n }\n\n // Insert the new node and add the extracted contents\n insertNodeAtPosition(node, this.startContainer, this.startOffset);\n node.appendChild(content);\n\n this.selectNode(node);\n },\n\n cloneRange: function() {\n assertRangeValid(this);\n var range = new Range(getRangeDocument(this));\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = this[prop];\n }\n return range;\n },\n\n toString: function() {\n assertRangeValid(this);\n var sc = this.startContainer;\n if (sc === this.endContainer && isCharacterDataNode(sc)) {\n return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : \"\";\n } else {\n var textParts = [], iterator = new RangeIterator(this, true);\n iterateSubtree(iterator, function(node) {\n // Accept only text or CDATA nodes, not comments\n if (node.nodeType == 3 || node.nodeType == 4) {\n textParts.push(node.data);\n }\n });\n iterator.detach();\n return textParts.join(\"\");\n }\n },\n\n // The methods below are all non-standard. The following batch were introduced by Mozilla but have since\n // been removed from Mozilla.\n\n compareNode: function(node) {\n assertRangeValid(this);\n\n var parent = node.parentNode;\n var nodeIndex = getNodeIndex(node);\n\n if (!parent) {\n throw new DOMException(\"NOT_FOUND_ERR\");\n }\n\n var startComparison = this.comparePoint(parent, nodeIndex),\n endComparison = this.comparePoint(parent, nodeIndex + 1);\n\n if (startComparison < 0) { // Node starts before\n return (endComparison > 0) ? n_b_a : n_b;\n } else {\n return (endComparison > 0) ? n_a : n_i;\n }\n },\n\n comparePoint: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {\n return -1;\n } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {\n return 1;\n }\n return 0;\n },\n\n createContextualFragment: createContextualFragment,\n\n toHtml: function() {\n return rangeToHtml(this);\n },\n\n // touchingIsIntersecting determines whether this method considers a node that borders a range intersects\n // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)\n intersectsNode: function(node, touchingIsIntersecting) {\n assertRangeValid(this);\n if (getRootContainer(node) != getRangeRoot(this)) {\n return false;\n }\n\n var parent = node.parentNode, offset = getNodeIndex(node);\n if (!parent) {\n return true;\n }\n\n var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),\n endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n },\n\n isPointInRange: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&\n (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);\n },\n\n // The methods below are non-standard and invented by me.\n\n // Sharing a boundary start-to-end or end-to-start does not count as intersection.\n intersectsRange: function(range) {\n return rangesIntersect(this, range, false);\n },\n\n // Sharing a boundary start-to-end or end-to-start does count as intersection.\n intersectsOrTouchesRange: function(range) {\n return rangesIntersect(this, range, true);\n },\n\n intersection: function(range) {\n if (this.intersectsRange(range)) {\n var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),\n endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);\n\n var intersectionRange = this.cloneRange();\n if (startComparison == -1) {\n intersectionRange.setStart(range.startContainer, range.startOffset);\n }\n if (endComparison == 1) {\n intersectionRange.setEnd(range.endContainer, range.endOffset);\n }\n return intersectionRange;\n }\n return null;\n },\n\n union: function(range) {\n if (this.intersectsOrTouchesRange(range)) {\n var unionRange = this.cloneRange();\n if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {\n unionRange.setStart(range.startContainer, range.startOffset);\n }\n if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {\n unionRange.setEnd(range.endContainer, range.endOffset);\n }\n return unionRange;\n } else {\n throw new DOMException(\"Ranges do not intersect\");\n }\n },\n\n containsNode: function(node, allowPartial) {\n if (allowPartial) {\n return this.intersectsNode(node, false);\n } else {\n return this.compareNode(node) == n_i;\n }\n },\n\n containsNodeContents: function(node) {\n return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;\n },\n\n containsRange: function(range) {\n var intersection = this.intersection(range);\n return intersection !== null && range.equals(intersection);\n },\n\n containsNodeText: function(node) {\n var nodeRange = this.cloneRange();\n nodeRange.selectNode(node);\n var textNodes = nodeRange.getNodes([3]);\n if (textNodes.length > 0) {\n nodeRange.setStart(textNodes[0], 0);\n var lastTextNode = textNodes.pop();\n nodeRange.setEnd(lastTextNode, lastTextNode.length);\n return this.containsRange(nodeRange);\n } else {\n return this.containsNodeContents(node);\n }\n },\n\n getNodes: function(nodeTypes, filter) {\n assertRangeValid(this);\n return getNodesInRange(this, nodeTypes, filter);\n },\n\n getDocument: function() {\n return getRangeDocument(this);\n },\n\n collapseBefore: function(node) {\n this.setEndBefore(node);\n this.collapse(false);\n },\n\n collapseAfter: function(node) {\n this.setStartAfter(node);\n this.collapse(true);\n },\n\n getBookmark: function(containerNode) {\n var doc = getRangeDocument(this);\n var preSelectionRange = api.createRange(doc);\n containerNode = containerNode || dom.getBody(doc);\n preSelectionRange.selectNodeContents(containerNode);\n var range = this.intersection(preSelectionRange);\n var start = 0, end = 0;\n if (range) {\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n start = preSelectionRange.toString().length;\n end = start + range.toString().length;\n }\n\n return {\n start: start,\n end: end,\n containerNode: containerNode\n };\n },\n\n moveToBookmark: function(bookmark) {\n var containerNode = bookmark.containerNode;\n var charIndex = 0;\n this.setStart(containerNode, 0);\n this.collapse(true);\n var nodeStack = [containerNode], node, foundStart = false, stop = false;\n var nextCharIndex, i, childNodes;\n\n while (!stop && (node = nodeStack.pop())) {\n if (node.nodeType == 3) {\n nextCharIndex = charIndex + node.length;\n if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {\n this.setStart(node, bookmark.start - charIndex);\n foundStart = true;\n }\n if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {\n this.setEnd(node, bookmark.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n childNodes = node.childNodes;\n i = childNodes.length;\n while (i--) {\n nodeStack.push(childNodes[i]);\n }\n }\n }\n },\n\n getName: function() {\n return \"DomRange\";\n },\n\n equals: function(range) {\n return Range.rangesEqual(this, range);\n },\n\n isValid: function() {\n return isRangeValid(this);\n },\n\n inspect: function() {\n return inspect(this);\n },\n\n detach: function() {\n // In DOM4, detach() is now a no-op.\n }\n });\n\n function copyComparisonConstantsToObject(obj) {\n obj.START_TO_START = s2s;\n obj.START_TO_END = s2e;\n obj.END_TO_END = e2e;\n obj.END_TO_START = e2s;\n\n obj.NODE_BEFORE = n_b;\n obj.NODE_AFTER = n_a;\n obj.NODE_BEFORE_AND_AFTER = n_b_a;\n obj.NODE_INSIDE = n_i;\n }\n\n function copyComparisonConstants(constructor) {\n copyComparisonConstantsToObject(constructor);\n copyComparisonConstantsToObject(constructor.prototype);\n }\n\n function createRangeContentRemover(remover, boundaryUpdater) {\n return function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;\n\n var iterator = new RangeIterator(this, true);\n\n // Work out where to position the range after content removal\n var node, boundary;\n if (sc !== root) {\n node = getClosestAncestorIn(sc, root, true);\n boundary = getBoundaryAfterNode(node);\n sc = boundary.node;\n so = boundary.offset;\n }\n\n // Check none of the range is read-only\n iterateSubtree(iterator, assertNodeNotReadOnly);\n\n iterator.reset();\n\n // Remove the content\n var returnValue = remover(iterator);\n iterator.detach();\n\n // Move to the new position\n boundaryUpdater(this, sc, so, sc, so);\n\n return returnValue;\n };\n }\n\n function createPrototypeRange(constructor, boundaryUpdater) {\n function createBeforeAfterNodeSetter(isBefore, isStart) {\n return function(node) {\n assertValidNodeType(node, beforeAfterNodeTypes);\n assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);\n\n var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);\n (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);\n };\n }\n\n function setRangeStart(range, node, offset) {\n var ec = range.endContainer, eo = range.endOffset;\n if (node !== range.startContainer || offset !== range.startOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {\n ec = node;\n eo = offset;\n }\n boundaryUpdater(range, node, offset, ec, eo);\n }\n }\n\n function setRangeEnd(range, node, offset) {\n var sc = range.startContainer, so = range.startOffset;\n if (node !== range.endContainer || offset !== range.endOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {\n sc = node;\n so = offset;\n }\n boundaryUpdater(range, sc, so, node, offset);\n }\n }\n\n // Set up inheritance\n var F = function() {};\n F.prototype = api.rangePrototype;\n constructor.prototype = new F();\n\n util.extend(constructor.prototype, {\n setStart: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeStart(this, node, offset);\n },\n\n setEnd: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeEnd(this, node, offset);\n },\n\n /**\n * Convenience method to set a range's start and end boundaries. Overloaded as follows:\n * - Two parameters (node, offset) creates a collapsed range at that position\n * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at\n * startOffset and ending at endOffset\n * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in\n * startNode and ending at endOffset in endNode\n */\n setStartAndEnd: function() {\n var args = arguments;\n var sc = args[0], so = args[1], ec = sc, eo = so;\n\n switch (args.length) {\n case 3:\n eo = args[2];\n break;\n case 4:\n ec = args[2];\n eo = args[3];\n break;\n }\n\n assertNoDocTypeNotationEntityAncestor(sc, true);\n assertValidOffset(sc, so);\n\n assertNoDocTypeNotationEntityAncestor(ec, true);\n assertValidOffset(ec, eo);\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n setBoundary: function(node, offset, isStart) {\n this[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n },\n\n setStartBefore: createBeforeAfterNodeSetter(true, true),\n setStartAfter: createBeforeAfterNodeSetter(false, true),\n setEndBefore: createBeforeAfterNodeSetter(true, false),\n setEndAfter: createBeforeAfterNodeSetter(false, false),\n\n collapse: function(isStart) {\n assertRangeValid(this);\n if (isStart) {\n boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);\n } else {\n boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n }\n },\n\n selectNodeContents: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n\n boundaryUpdater(this, node, 0, node, getNodeLength(node));\n },\n\n selectNode: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, false);\n assertValidNodeType(node, beforeAfterNodeTypes);\n\n var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);\n boundaryUpdater(this, start.node, start.offset, end.node, end.offset);\n },\n\n extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),\n\n deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n splitBoundaries: function() {\n splitRangeBoundaries(this);\n },\n\n splitBoundariesPreservingPositions: function(positionsToPreserve) {\n splitRangeBoundaries(this, positionsToPreserve);\n },\n\n normalizeBoundaries: function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;\n\n var mergeForward = function(node) {\n var sibling = node.nextSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n ec = node;\n eo = node.length;\n node.appendData(sibling.data);\n removeNode(sibling);\n }\n };\n\n var mergeBackward = function(node) {\n var sibling = node.previousSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n sc = node;\n var nodeLength = node.length;\n so = sibling.length;\n node.insertData(0, sibling.data);\n removeNode(sibling);\n if (sc == ec) {\n eo += so;\n ec = sc;\n } else if (ec == node.parentNode) {\n var nodeIndex = getNodeIndex(node);\n if (eo == nodeIndex) {\n ec = node;\n eo = nodeLength;\n } else if (eo > nodeIndex) {\n eo--;\n }\n }\n }\n };\n\n var normalizeStart = true;\n var sibling;\n\n if (isCharacterDataNode(ec)) {\n if (eo == ec.length) {\n mergeForward(ec);\n } else if (eo == 0) {\n sibling = ec.previousSibling;\n if (sibling && sibling.nodeType == ec.nodeType) {\n eo = sibling.length;\n if (sc == ec) {\n normalizeStart = false;\n }\n sibling.appendData(ec.data);\n removeNode(ec);\n ec = sibling;\n }\n }\n } else {\n if (eo > 0) {\n var endNode = ec.childNodes[eo - 1];\n if (endNode && isCharacterDataNode(endNode)) {\n mergeForward(endNode);\n }\n }\n normalizeStart = !this.collapsed;\n }\n\n if (normalizeStart) {\n if (isCharacterDataNode(sc)) {\n if (so == 0) {\n mergeBackward(sc);\n } else if (so == sc.length) {\n sibling = sc.nextSibling;\n if (sibling && sibling.nodeType == sc.nodeType) {\n if (ec == sibling) {\n ec = sc;\n eo += sc.length;\n }\n sc.appendData(sibling.data);\n removeNode(sibling);\n }\n }\n } else {\n if (so < sc.childNodes.length) {\n var startNode = sc.childNodes[so];\n if (startNode && isCharacterDataNode(startNode)) {\n mergeBackward(startNode);\n }\n }\n }\n } else {\n sc = ec;\n so = eo;\n }\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n collapseToPoint: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n this.setStartAndEnd(node, offset);\n },\n\n parentElement: function() {\n assertRangeValid(this);\n var parentNode = this.commonAncestorContainer;\n return parentNode ? getElementAncestor(this.commonAncestorContainer, true) : null;\n }\n });\n\n copyComparisonConstants(constructor);\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Updates commonAncestorContainer and collapsed after boundary change\n function updateCollapsedAndCommonAncestor(range) {\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n range.commonAncestorContainer = range.collapsed ?\n range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);\n }\n\n function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {\n range.startContainer = startContainer;\n range.startOffset = startOffset;\n range.endContainer = endContainer;\n range.endOffset = endOffset;\n range.document = dom.getDocument(startContainer);\n updateCollapsedAndCommonAncestor(range);\n }\n\n function Range(doc) {\n updateBoundaries(this, doc, 0, doc, 0);\n }\n\n createPrototypeRange(Range, updateBoundaries);\n\n util.extend(Range, {\n rangeProperties: rangeProperties,\n RangeIterator: RangeIterator,\n copyComparisonConstants: copyComparisonConstants,\n createPrototypeRange: createPrototypeRange,\n inspect: inspect,\n toHtml: rangeToHtml,\n getRangeDocument: getRangeDocument,\n rangesEqual: function(r1, r2) {\n return r1.startContainer === r2.startContainer &&\n r1.startOffset === r2.startOffset &&\n r1.endContainer === r2.endContainer &&\n r1.endOffset === r2.endOffset;\n }\n });\n\n api.DomRange = Range;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wrappers for the browser's native DOM Range and/or TextRange implementation\n api.createCoreModule(\"WrappedRange\", [\"DomRange\"], function(api, module) {\n var WrappedRange, WrappedTextRange;\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DomRange = api.DomRange;\n var getBody = dom.getBody;\n var getContentDocument = dom.getContentDocument;\n var isCharacterDataNode = dom.isCharacterDataNode;\n\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n if (api.features.implementsDomRange) {\n // This is a wrapper around the browser's native DOM Range. It has two aims:\n // - Provide workarounds for specific browser bugs\n // - provide convenient extensions, which are inherited from Rangy's DomRange\n\n (function() {\n var rangeProto;\n var rangeProperties = DomRange.rangeProperties;\n\n function updateRangeProperties(range) {\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = range.nativeRange[prop];\n }\n // Fix for broken collapsed property in IE 9.\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n }\n\n function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {\n var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);\n var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);\n var nativeRangeDifferent = !range.equals(range.nativeRange);\n\n // Always set both boundaries for the benefit of IE9 (see issue 35)\n if (startMoved || endMoved || nativeRangeDifferent) {\n range.setEnd(endContainer, endOffset);\n range.setStart(startContainer, startOffset);\n }\n }\n\n var createBeforeAfterNodeSetter;\n\n WrappedRange = function(range) {\n if (!range) {\n throw module.createError(\"WrappedRange: Range must be specified\");\n }\n this.nativeRange = range;\n updateRangeProperties(this);\n };\n\n DomRange.createPrototypeRange(WrappedRange, updateNativeRange);\n\n rangeProto = WrappedRange.prototype;\n\n rangeProto.selectNode = function(node) {\n this.nativeRange.selectNode(node);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneContents = function() {\n return this.nativeRange.cloneContents();\n };\n\n // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,\n // insertNode() is never delegated to the native range.\n\n rangeProto.surroundContents = function(node) {\n this.nativeRange.surroundContents(node);\n updateRangeProperties(this);\n };\n\n rangeProto.collapse = function(isStart) {\n this.nativeRange.collapse(isStart);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneRange = function() {\n return new WrappedRange(this.nativeRange.cloneRange());\n };\n\n rangeProto.refresh = function() {\n updateRangeProperties(this);\n };\n\n rangeProto.toString = function() {\n return this.nativeRange.toString();\n };\n\n // Create test range and node for feature detection\n\n var testTextNode = document.createTextNode(\"test\");\n getBody(document).appendChild(testTextNode);\n var range = document.createRange();\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and\n // correct for it\n\n range.setStart(testTextNode, 0);\n range.setEnd(testTextNode, 0);\n\n try {\n range.setStart(testTextNode, 1);\n\n rangeProto.setStart = function(node, offset) {\n this.nativeRange.setStart(node, offset);\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n this.nativeRange.setEnd(node, offset);\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name) {\n return function(node) {\n this.nativeRange[name](node);\n updateRangeProperties(this);\n };\n };\n\n } catch(ex) {\n\n rangeProto.setStart = function(node, offset) {\n try {\n this.nativeRange.setStart(node, offset);\n } catch (ex) {\n this.nativeRange.setEnd(node, offset);\n this.nativeRange.setStart(node, offset);\n }\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n try {\n this.nativeRange.setEnd(node, offset);\n } catch (ex) {\n this.nativeRange.setStart(node, offset);\n this.nativeRange.setEnd(node, offset);\n }\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name, oppositeName) {\n return function(node) {\n try {\n this.nativeRange[name](node);\n } catch (ex) {\n this.nativeRange[oppositeName](node);\n this.nativeRange[name](node);\n }\n updateRangeProperties(this);\n };\n };\n }\n\n rangeProto.setStartBefore = createBeforeAfterNodeSetter(\"setStartBefore\", \"setEndBefore\");\n rangeProto.setStartAfter = createBeforeAfterNodeSetter(\"setStartAfter\", \"setEndAfter\");\n rangeProto.setEndBefore = createBeforeAfterNodeSetter(\"setEndBefore\", \"setStartBefore\");\n rangeProto.setEndAfter = createBeforeAfterNodeSetter(\"setEndAfter\", \"setStartAfter\");\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing\n // whether the native implementation can be trusted\n rangeProto.selectNodeContents = function(node) {\n this.setStartAndEnd(node, 0, dom.getNodeLength(node));\n };\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for\n // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738\n\n range.selectNodeContents(testTextNode);\n range.setEnd(testTextNode, 3);\n\n var range2 = document.createRange();\n range2.selectNodeContents(testTextNode);\n range2.setEnd(testTextNode, 4);\n range2.setStart(testTextNode, 2);\n\n if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&\n range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {\n // This is the wrong way round, so correct for it\n\n rangeProto.compareBoundaryPoints = function(type, range) {\n range = range.nativeRange || range;\n if (type == range.START_TO_END) {\n type = range.END_TO_START;\n } else if (type == range.END_TO_START) {\n type = range.START_TO_END;\n }\n return this.nativeRange.compareBoundaryPoints(type, range);\n };\n } else {\n rangeProto.compareBoundaryPoints = function(type, range) {\n return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for IE deleteContents() and extractContents() bug and correct it. See issue 107.\n\n var el = document.createElement(\"div\");\n el.innerHTML = \"123\";\n var textNode = el.firstChild;\n var body = getBody(document);\n body.appendChild(el);\n\n range.setStart(textNode, 1);\n range.setEnd(textNode, 2);\n range.deleteContents();\n\n if (textNode.data == \"13\") {\n // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and\n // extractContents()\n rangeProto.deleteContents = function() {\n this.nativeRange.deleteContents();\n updateRangeProperties(this);\n };\n\n rangeProto.extractContents = function() {\n var frag = this.nativeRange.extractContents();\n updateRangeProperties(this);\n return frag;\n };\n } else {\n }\n\n body.removeChild(el);\n body = null;\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for existence of createContextualFragment and delegate to it if it exists\n if (util.isHostMethod(range, \"createContextualFragment\")) {\n rangeProto.createContextualFragment = function(fragmentStr) {\n return this.nativeRange.createContextualFragment(fragmentStr);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Clean up\n getBody(document).removeChild(testTextNode);\n\n rangeProto.getName = function() {\n return \"WrappedRange\";\n };\n\n api.WrappedRange = WrappedRange;\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return doc.createRange();\n };\n })();\n }\n\n if (api.features.implementsTextRange) {\n /*\n This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()\n method. For example, in the following (where pipes denote the selection boundaries):\n\n <ul id=\"ul\"><li id=\"a\">| a </li><li id=\"b\"> b |</li></ul>\n\n var range = document.selection.createRange();\n alert(range.parentElement().id); // Should alert \"ul\" but alerts \"b\"\n\n This method returns the common ancestor node of the following:\n - the parentElement() of the textRange\n - the parentElement() of the textRange after calling collapse(true)\n - the parentElement() of the textRange after calling collapse(false)\n */\n var getTextRangeContainerElement = function(textRange) {\n var parentEl = textRange.parentElement();\n var range = textRange.duplicate();\n range.collapse(true);\n var startEl = range.parentElement();\n range = textRange.duplicate();\n range.collapse(false);\n var endEl = range.parentElement();\n var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);\n\n return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);\n };\n\n var textRangeIsCollapsed = function(textRange) {\n return textRange.compareEndPoints(\"StartToEnd\", textRange) == 0;\n };\n\n // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started\n // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)\n // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange\n // bugs, handling for inputs and images, plus optimizations.\n var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {\n var workingRange = textRange.duplicate();\n workingRange.collapse(isStart);\n var containerElement = workingRange.parentElement();\n\n // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so\n // check for that\n if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {\n containerElement = wholeRangeContainerElement;\n }\n\n\n // Deal with nodes that cannot \"contain rich HTML markup\". In practice, this means form inputs, images and\n // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx\n if (!containerElement.canHaveHTML) {\n var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));\n return {\n boundaryPosition: pos,\n nodeInfo: {\n nodeIndex: pos.offset,\n containerElement: pos.node\n }\n };\n }\n\n var workingNode = dom.getDocument(containerElement).createElement(\"span\");\n\n // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5\n // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64\n if (workingNode.parentNode) {\n dom.removeNode(workingNode);\n }\n\n var comparison, workingComparisonType = isStart ? \"StartToStart\" : \"StartToEnd\";\n var previousNode, nextNode, boundaryPosition, boundaryNode;\n var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;\n var childNodeCount = containerElement.childNodes.length;\n var end = childNodeCount;\n\n // Check end first. Code within the loop assumes that the endth child node of the container is definitely\n // after the range boundary.\n var nodeIndex = end;\n\n while (true) {\n if (nodeIndex == childNodeCount) {\n containerElement.appendChild(workingNode);\n } else {\n containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);\n }\n workingRange.moveToElementText(workingNode);\n comparison = workingRange.compareEndPoints(workingComparisonType, textRange);\n if (comparison == 0 || start == end) {\n break;\n } else if (comparison == -1) {\n if (end == start + 1) {\n // We know the endth child node is after the range boundary, so we must be done.\n break;\n } else {\n start = nodeIndex;\n }\n } else {\n end = (end == start + 1) ? start : nodeIndex;\n }\n nodeIndex = Math.floor((start + end) / 2);\n containerElement.removeChild(workingNode);\n }\n\n\n // We've now reached or gone past the boundary of the text range we're interested in\n // so have identified the node we want\n boundaryNode = workingNode.nextSibling;\n\n if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {\n // This is a character data node (text, comment, cdata). The working range is collapsed at the start of\n // the node containing the text range's boundary, so we move the end of the working range to the\n // boundary point and measure the length of its text to get the boundary's offset within the node.\n workingRange.setEndPoint(isStart ? \"EndToStart\" : \"EndToEnd\", textRange);\n\n var offset;\n\n if (/[\\r\\n]/.test(boundaryNode.data)) {\n /*\n For the particular case of a boundary within a text node containing rendered line breaks (within a\n <pre> element, for example), we need a slightly complicated approach to get the boundary's offset in\n IE. The facts:\n\n - Each line break is represented as \\r in the text node's data/nodeValue properties\n - Each line break is represented as \\r\\n in the TextRange's 'text' property\n - The 'text' property of the TextRange does not contain trailing line breaks\n\n To get round the problem presented by the final fact above, we can use the fact that TextRange's\n moveStart() and moveEnd() methods return the actual number of characters moved, which is not\n necessarily the same as the number of characters it was instructed to move. The simplest approach is\n to use this to store the characters moved when moving both the start and end of the range to the\n start of the document body and subtracting the start offset from the end offset (the\n \"move-negative-gazillion\" method). However, this is extremely slow when the document is large and\n the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to\n the end of the document) has the same problem.\n\n Another approach that works is to use moveStart() to move the start boundary of the range up to the\n end boundary one character at a time and incrementing a counter with the value returned by the\n moveStart() call. However, the check for whether the start boundary has reached the end boundary is\n expensive, so this method is slow (although unlike \"move-negative-gazillion\" is largely unaffected\n by the location of the range within the document).\n\n The approach used below is a hybrid of the two methods above. It uses the fact that a string\n containing the TextRange's 'text' property with each \\r\\n converted to a single \\r character cannot\n be longer than the text of the TextRange, so the start of the range is moved that length initially\n and then a character at a time to make up for any trailing line breaks not contained in the 'text'\n property. This has good performance in most situations compared to the previous two methods.\n */\n var tempRange = workingRange.duplicate();\n var rangeLength = tempRange.text.replace(/\\r\\n/g, \"\\r\").length;\n\n offset = tempRange.moveStart(\"character\", rangeLength);\n while ( (comparison = tempRange.compareEndPoints(\"StartToEnd\", tempRange)) == -1) {\n offset++;\n tempRange.moveStart(\"character\", 1);\n }\n } else {\n offset = workingRange.text.length;\n }\n boundaryPosition = new DomPosition(boundaryNode, offset);\n } else {\n\n // If the boundary immediately follows a character data node and this is the end boundary, we should favour\n // a position within that, and likewise for a start boundary preceding a character data node\n previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;\n nextNode = (isCollapsed || isStart) && workingNode.nextSibling;\n if (nextNode && isCharacterDataNode(nextNode)) {\n boundaryPosition = new DomPosition(nextNode, 0);\n } else if (previousNode && isCharacterDataNode(previousNode)) {\n boundaryPosition = new DomPosition(previousNode, previousNode.data.length);\n } else {\n boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));\n }\n }\n\n // Clean up\n dom.removeNode(workingNode);\n\n return {\n boundaryPosition: boundaryPosition,\n nodeInfo: {\n nodeIndex: nodeIndex,\n containerElement: containerElement\n }\n };\n };\n\n // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that\n // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange\n // (http://code.google.com/p/ierange/)\n var createBoundaryTextRange = function(boundaryPosition, isStart) {\n var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;\n var doc = dom.getDocument(boundaryPosition.node);\n var workingNode, childNodes, workingRange = getBody(doc).createTextRange();\n var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);\n\n if (nodeIsDataNode) {\n boundaryNode = boundaryPosition.node;\n boundaryParent = boundaryNode.parentNode;\n } else {\n childNodes = boundaryPosition.node.childNodes;\n boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;\n boundaryParent = boundaryPosition.node;\n }\n\n // Position the range immediately before the node containing the boundary\n workingNode = doc.createElement(\"span\");\n\n // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within\n // the element rather than immediately before or after it\n workingNode.innerHTML = \"&#feff;\";\n\n // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report\n // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12\n if (boundaryNode) {\n boundaryParent.insertBefore(workingNode, boundaryNode);\n } else {\n boundaryParent.appendChild(workingNode);\n }\n\n workingRange.moveToElementText(workingNode);\n workingRange.collapse(!isStart);\n\n // Clean up\n boundaryParent.removeChild(workingNode);\n\n // Move the working range to the text offset, if required\n if (nodeIsDataNode) {\n workingRange[isStart ? \"moveStart\" : \"moveEnd\"](\"character\", boundaryOffset);\n }\n\n return workingRange;\n };\n\n /*------------------------------------------------------------------------------------------------------------*/\n\n // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a\n // prototype\n\n WrappedTextRange = function(textRange) {\n this.textRange = textRange;\n this.refresh();\n };\n\n WrappedTextRange.prototype = new DomRange(document);\n\n WrappedTextRange.prototype.refresh = function() {\n var start, end, startBoundary;\n\n // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.\n var rangeContainerElement = getTextRangeContainerElement(this.textRange);\n\n if (textRangeIsCollapsed(this.textRange)) {\n end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,\n true).boundaryPosition;\n } else {\n startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);\n start = startBoundary.boundaryPosition;\n\n // An optimization used here is that if the start and end boundaries have the same parent element, the\n // search scope for the end boundary can be limited to exclude the portion of the element that precedes\n // the start boundary\n end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,\n startBoundary.nodeInfo).boundaryPosition;\n }\n\n this.setStart(start.node, start.offset);\n this.setEnd(end.node, end.offset);\n };\n\n WrappedTextRange.prototype.getName = function() {\n return \"WrappedTextRange\";\n };\n\n DomRange.copyComparisonConstants(WrappedTextRange);\n\n var rangeToTextRange = function(range) {\n if (range.collapsed) {\n return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n } else {\n var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);\n var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();\n textRange.setEndPoint(\"StartToStart\", startRange);\n textRange.setEndPoint(\"EndToEnd\", endRange);\n return textRange;\n }\n };\n\n WrappedTextRange.rangeToTextRange = rangeToTextRange;\n\n WrappedTextRange.prototype.toTextRange = function() {\n return rangeToTextRange(this);\n };\n\n api.WrappedTextRange = WrappedTextRange;\n\n // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which\n // implementation to use by default.\n if (!api.features.implementsDomRange || api.config.preferTextRange) {\n // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work\n var globalObj = (function(f) { return f(\"return this;\")(); })(Function);\n if (typeof globalObj.Range == \"undefined\") {\n globalObj.Range = WrappedTextRange;\n }\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return getBody(doc).createTextRange();\n };\n\n api.WrappedRange = WrappedTextRange;\n }\n }\n\n api.createRange = function(doc) {\n doc = getContentDocument(doc, module, \"createRange\");\n return new api.WrappedRange(api.createNativeRange(doc));\n };\n\n api.createRangyRange = function(doc) {\n doc = getContentDocument(doc, module, \"createRangyRange\");\n return new DomRange(doc);\n };\n\n util.createAliasForDeprecatedMethod(api, \"createIframeRange\", \"createRange\");\n util.createAliasForDeprecatedMethod(api, \"createIframeRangyRange\", \"createRangyRange\");\n\n api.addShimListener(function(win) {\n var doc = win.document;\n if (typeof doc.createRange == \"undefined\") {\n doc.createRange = function() {\n return api.createRange(doc);\n };\n }\n doc = win = null;\n });\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification\n // in the W3C Selection API spec (https://www.w3.org/TR/selection-api)\n api.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function(api, module) {\n api.config.checkSelectionRanges = true;\n\n var BOOLEAN = \"boolean\";\n var NUMBER = \"number\";\n var dom = api.dom;\n var util = api.util;\n var isHostMethod = util.isHostMethod;\n var DomRange = api.DomRange;\n var WrappedRange = api.WrappedRange;\n var DOMException = api.DOMException;\n var DomPosition = dom.DomPosition;\n var getNativeSelection;\n var selectionIsCollapsed;\n var features = api.features;\n var CONTROL = \"Control\";\n var getDocument = dom.getDocument;\n var getBody = dom.getBody;\n var rangesEqual = DomRange.rangesEqual;\n\n\n // Utility function to support direction parameters in the API that may be a string (\"backward\", \"backwards\",\n // \"forward\" or \"forwards\") or a Boolean (true for backwards).\n function isDirectionBackward(dir) {\n return (typeof dir == \"string\") ? /^backward(s)?$/i.test(dir) : !!dir;\n }\n\n function getWindow(win, methodName) {\n if (!win) {\n return window;\n } else if (dom.isWindow(win)) {\n return win;\n } else if (win instanceof WrappedSelection) {\n return win.win;\n } else {\n var doc = dom.getContentDocument(win, module, methodName);\n return dom.getWindow(doc);\n }\n }\n\n function getWinSelection(winParam) {\n return getWindow(winParam, \"getWinSelection\").getSelection();\n }\n\n function getDocSelection(winParam) {\n return getWindow(winParam, \"getDocSelection\").document.selection;\n }\n\n function winSelectionIsBackward(sel) {\n var backward = false;\n if (sel.anchorNode) {\n backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);\n }\n return backward;\n }\n\n // Test for the Range/TextRange and Selection features required\n // Test for ability to retrieve selection\n var implementsWinGetSelection = isHostMethod(window, \"getSelection\"),\n implementsDocSelection = util.isHostObject(document, \"selection\");\n\n features.implementsWinGetSelection = implementsWinGetSelection;\n features.implementsDocSelection = implementsDocSelection;\n\n var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);\n\n if (useDocumentSelection) {\n getNativeSelection = getDocSelection;\n api.isSelectionValid = function(winParam) {\n var doc = getWindow(winParam, \"isSelectionValid\").document, nativeSel = doc.selection;\n\n // Check whether the selection TextRange is actually contained within the correct document\n return (nativeSel.type != \"None\" || getDocument(nativeSel.createRange().parentElement()) == doc);\n };\n } else if (implementsWinGetSelection) {\n getNativeSelection = getWinSelection;\n api.isSelectionValid = function() {\n return true;\n };\n } else {\n module.fail(\"Neither document.selection or window.getSelection() detected.\");\n return false;\n }\n\n api.getNativeSelection = getNativeSelection;\n\n var testSelection = getNativeSelection();\n\n // In Firefox, the selection is null in an iframe with display: none. See issue #138.\n if (!testSelection) {\n module.fail(\"Native selection was null (possibly issue 138?)\");\n return false;\n }\n\n var testRange = api.createNativeRange(document);\n var body = getBody(document);\n\n // Obtaining a range from a selection\n var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,\n [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]);\n\n features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;\n\n // Test for existence of native selection extend() method\n var selectionHasExtend = isHostMethod(testSelection, \"extend\");\n features.selectionHasExtend = selectionHasExtend;\n\n // Test for existence of native selection setBaseAndExtent() method\n var selectionHasSetBaseAndExtent = isHostMethod(testSelection, \"setBaseAndExtent\");\n features.selectionHasSetBaseAndExtent = selectionHasSetBaseAndExtent;\n\n // Test if rangeCount exists\n var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);\n features.selectionHasRangeCount = selectionHasRangeCount;\n\n var selectionSupportsMultipleRanges = false;\n var collapsedNonEditableSelectionsSupported = true;\n\n var addRangeBackwardToNative = selectionHasExtend ?\n function(nativeSelection, range) {\n var doc = DomRange.getRangeDocument(range);\n var endRange = api.createRange(doc);\n endRange.collapseToPoint(range.endContainer, range.endOffset);\n nativeSelection.addRange(getNativeRange(endRange));\n nativeSelection.extend(range.startContainer, range.startOffset);\n } : null;\n\n if (util.areHostMethods(testSelection, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) &&\n typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {\n\n (function() {\n // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are\n // performed on the current document's selection. See issue 109.\n\n // Note also that if a selection previously existed, it is wiped and later restored by these tests. This\n // will result in the selection direction being reversed if the original selection was backwards and the\n // browser does not support setting backwards selections (Internet Explorer, I'm looking at you).\n var sel = window.getSelection();\n if (sel) {\n // Store the current selection\n var originalSelectionRangeCount = sel.rangeCount;\n var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);\n var originalSelectionRanges = [];\n var originalSelectionBackward = winSelectionIsBackward(sel);\n for (var i = 0; i < originalSelectionRangeCount; ++i) {\n originalSelectionRanges[i] = sel.getRangeAt(i);\n }\n\n // Create some test elements\n var testEl = dom.createTestElement(document, \"\", false);\n var textNode = testEl.appendChild( document.createTextNode(\"\\u00a0\\u00a0\\u00a0\") );\n\n // Test whether the native selection will allow a collapsed selection within a non-editable element\n var r1 = document.createRange();\n\n r1.setStart(textNode, 1);\n r1.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r1);\n collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);\n sel.removeAllRanges();\n\n // Test whether the native selection is capable of supporting multiple ranges.\n if (!selectionHasMultipleRanges) {\n // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a\n // console error of \"Discontiguous selection is not supported.\" that cannot be suppressed. There's\n // nothing we can do about this while retaining the feature test so we have to resort to a browser\n // sniff. I'm not happy about it. See\n // https://code.google.com/p/chromium/issues/detail?id=399791\n var chromeMatch = window.navigator.appVersion.match(/Chrome\\/(.*?) /);\n if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {\n selectionSupportsMultipleRanges = false;\n } else {\n var r2 = r1.cloneRange();\n r1.setStart(textNode, 0);\n r2.setEnd(textNode, 3);\n r2.setStart(textNode, 2);\n sel.addRange(r1);\n sel.addRange(r2);\n selectionSupportsMultipleRanges = (sel.rangeCount == 2);\n }\n }\n\n // Clean up\n dom.removeNode(testEl);\n sel.removeAllRanges();\n\n for (i = 0; i < originalSelectionRangeCount; ++i) {\n if (i == 0 && originalSelectionBackward) {\n if (addRangeBackwardToNative) {\n addRangeBackwardToNative(sel, originalSelectionRanges[i]);\n } else {\n api.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend\");\n sel.addRange(originalSelectionRanges[i]);\n }\n } else {\n sel.addRange(originalSelectionRanges[i]);\n }\n }\n }\n })();\n }\n\n features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;\n features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;\n\n // ControlRanges\n var implementsControlRange = false, testControlRange;\n\n if (body && isHostMethod(body, \"createControlRange\")) {\n testControlRange = body.createControlRange();\n if (util.areHostProperties(testControlRange, [\"item\", \"add\"])) {\n implementsControlRange = true;\n }\n }\n features.implementsControlRange = implementsControlRange;\n\n // Selection collapsedness\n if (selectionHasAnchorAndFocus) {\n selectionIsCollapsed = function(sel) {\n return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;\n };\n } else {\n selectionIsCollapsed = function(sel) {\n return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;\n };\n }\n\n function updateAnchorAndFocusFromRange(sel, range, backward) {\n var anchorPrefix = backward ? \"end\" : \"start\", focusPrefix = backward ? \"start\" : \"end\";\n sel.anchorNode = range[anchorPrefix + \"Container\"];\n sel.anchorOffset = range[anchorPrefix + \"Offset\"];\n sel.focusNode = range[focusPrefix + \"Container\"];\n sel.focusOffset = range[focusPrefix + \"Offset\"];\n }\n\n function updateAnchorAndFocusFromNativeSelection(sel) {\n var nativeSel = sel.nativeSelection;\n sel.anchorNode = nativeSel.anchorNode;\n sel.anchorOffset = nativeSel.anchorOffset;\n sel.focusNode = nativeSel.focusNode;\n sel.focusOffset = nativeSel.focusOffset;\n }\n\n function updateEmptySelection(sel) {\n sel.anchorNode = sel.focusNode = null;\n sel.anchorOffset = sel.focusOffset = 0;\n sel.rangeCount = 0;\n sel.isCollapsed = true;\n sel._ranges.length = 0;\n updateType(sel);\n }\n\n function updateType(sel) {\n sel.type = (sel.rangeCount == 0) ? \"None\" : (selectionIsCollapsed(sel) ? \"Caret\" : \"Range\");\n }\n\n function getNativeRange(range) {\n var nativeRange;\n if (range instanceof DomRange) {\n nativeRange = api.createNativeRange(range.getDocument());\n nativeRange.setEnd(range.endContainer, range.endOffset);\n nativeRange.setStart(range.startContainer, range.startOffset);\n } else if (range instanceof WrappedRange) {\n nativeRange = range.nativeRange;\n } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {\n nativeRange = range;\n }\n return nativeRange;\n }\n\n function rangeContainsSingleElement(rangeNodes) {\n if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {\n return false;\n }\n for (var i = 1, len = rangeNodes.length; i < len; ++i) {\n if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {\n return false;\n }\n }\n return true;\n }\n\n function getSingleElementFromRange(range) {\n var nodes = range.getNodes();\n if (!rangeContainsSingleElement(nodes)) {\n throw module.createError(\"getSingleElementFromRange: range \" + range.inspect() + \" did not consist of a single element\");\n }\n return nodes[0];\n }\n\n // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange\n function isTextRange(range) {\n return !!range && typeof range.text != \"undefined\";\n }\n\n function updateFromTextRange(sel, range) {\n // Create a Range from the selected TextRange\n var wrappedRange = new WrappedRange(range);\n sel._ranges = [wrappedRange];\n\n updateAnchorAndFocusFromRange(sel, wrappedRange, false);\n sel.rangeCount = 1;\n sel.isCollapsed = wrappedRange.collapsed;\n updateType(sel);\n }\n\n function updateControlSelection(sel) {\n // Update the wrapped selection based on what's now in the native selection\n sel._ranges.length = 0;\n if (sel.docSelection.type == \"None\") {\n updateEmptySelection(sel);\n } else {\n var controlRange = sel.docSelection.createRange();\n if (isTextRange(controlRange)) {\n // This case (where the selection type is \"Control\" and calling createRange() on the selection returns\n // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected\n // ControlRange have been removed from the ControlRange and removed from the document.\n updateFromTextRange(sel, controlRange);\n } else {\n sel.rangeCount = controlRange.length;\n var range, doc = getDocument(controlRange.item(0));\n for (var i = 0; i < sel.rangeCount; ++i) {\n range = api.createRange(doc);\n range.selectNode(controlRange.item(i));\n sel._ranges.push(range);\n }\n sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;\n updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);\n updateType(sel);\n }\n }\n }\n\n function addRangeToControlSelection(sel, range) {\n var controlRange = sel.docSelection.createRange();\n var rangeElement = getSingleElementFromRange(range);\n\n // Create a new ControlRange containing all the elements in the selected ControlRange plus the element\n // contained by the supplied range\n var doc = getDocument(controlRange.item(0));\n var newControlRange = getBody(doc).createControlRange();\n for (var i = 0, len = controlRange.length; i < len; ++i) {\n newControlRange.add(controlRange.item(i));\n }\n try {\n newControlRange.add(rangeElement);\n } catch (ex) {\n throw module.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n }\n newControlRange.select();\n\n // Update the wrapped selection based on what's now in the native selection\n updateControlSelection(sel);\n }\n\n var getSelectionRangeAt;\n\n if (isHostMethod(testSelection, \"getRangeAt\")) {\n // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.\n // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a\n // lesson to us all, especially me.\n getSelectionRangeAt = function(sel, index) {\n try {\n return sel.getRangeAt(index);\n } catch (ex) {\n return null;\n }\n };\n } else if (selectionHasAnchorAndFocus) {\n getSelectionRangeAt = function(sel) {\n var doc = getDocument(sel.anchorNode);\n var range = api.createRange(doc);\n range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);\n\n // Handle the case when the selection was selected backwards (from the end to the start in the\n // document)\n if (range.collapsed !== this.isCollapsed) {\n range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);\n }\n\n return range;\n };\n }\n\n function WrappedSelection(selection, docSelection, win) {\n this.nativeSelection = selection;\n this.docSelection = docSelection;\n this._ranges = [];\n this.win = win;\n this.refresh();\n }\n\n WrappedSelection.prototype = api.selectionPrototype;\n\n function deleteProperties(sel) {\n sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;\n sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;\n sel.detached = true;\n updateType(sel);\n }\n\n var cachedRangySelections = [];\n\n function actOnCachedSelection(win, action) {\n var i = cachedRangySelections.length, cached, sel;\n while (i--) {\n cached = cachedRangySelections[i];\n sel = cached.selection;\n if (action == \"deleteAll\") {\n deleteProperties(sel);\n } else if (cached.win == win) {\n if (action == \"delete\") {\n cachedRangySelections.splice(i, 1);\n return true;\n } else {\n return sel;\n }\n }\n }\n if (action == \"deleteAll\") {\n cachedRangySelections.length = 0;\n }\n return null;\n }\n\n var getSelection = function(win) {\n // Check if the parameter is a Rangy Selection object\n if (win && win instanceof WrappedSelection) {\n win.refresh();\n return win;\n }\n\n win = getWindow(win, \"getNativeSelection\");\n\n var sel = actOnCachedSelection(win);\n var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;\n if (sel) {\n sel.nativeSelection = nativeSel;\n sel.docSelection = docSel;\n sel.refresh();\n } else {\n sel = new WrappedSelection(nativeSel, docSel, win);\n cachedRangySelections.push( { win: win, selection: sel } );\n }\n return sel;\n };\n\n api.getSelection = getSelection;\n\n util.createAliasForDeprecatedMethod(api, \"getIframeSelection\", \"getSelection\");\n\n var selProto = WrappedSelection.prototype;\n\n function createControlSelection(sel, ranges) {\n // Ensure that the selection becomes of type \"Control\"\n var doc = getDocument(ranges[0].startContainer);\n var controlRange = getBody(doc).createControlRange();\n for (var i = 0, el, len = ranges.length; i < len; ++i) {\n el = getSingleElementFromRange(ranges[i]);\n try {\n controlRange.add(el);\n } catch (ex) {\n throw module.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n }\n }\n controlRange.select();\n\n // Update the wrapped selection based on what's now in the native selection\n updateControlSelection(sel);\n }\n\n // Selecting a range\n if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, [\"removeAllRanges\", \"addRange\"])) {\n selProto.removeAllRanges = function() {\n this.nativeSelection.removeAllRanges();\n updateEmptySelection(this);\n };\n\n var addRangeBackward = function(sel, range) {\n addRangeBackwardToNative(sel.nativeSelection, range);\n sel.refresh();\n };\n\n if (selectionHasRangeCount) {\n selProto.addRange = function(range, direction) {\n if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n addRangeToControlSelection(this, range);\n } else {\n if (isDirectionBackward(direction) && selectionHasExtend) {\n addRangeBackward(this, range);\n } else {\n var previousRangeCount;\n if (selectionSupportsMultipleRanges) {\n previousRangeCount = this.rangeCount;\n } else {\n this.removeAllRanges();\n previousRangeCount = 0;\n }\n // Clone the native range so that changing the selected range does not affect the selection.\n // This is contrary to the spec but is the only way to achieve consistency between browsers. See\n // issue 80.\n var clonedNativeRange = getNativeRange(range).cloneRange();\n try {\n this.nativeSelection.addRange(clonedNativeRange);\n } catch (ex) {\n }\n\n // Check whether adding the range was successful\n this.rangeCount = this.nativeSelection.rangeCount;\n\n if (this.rangeCount == previousRangeCount + 1) {\n // The range was added successfully\n\n // Check whether the range that we added to the selection is reflected in the last range extracted from\n // the selection\n if (api.config.checkSelectionRanges) {\n var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);\n if (nativeRange && !rangesEqual(nativeRange, range)) {\n // Happens in WebKit with, for example, a selection placed at the start of a text node\n range = new WrappedRange(nativeRange);\n }\n }\n this._ranges[this.rangeCount - 1] = range;\n updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));\n this.isCollapsed = selectionIsCollapsed(this);\n updateType(this);\n } else {\n // The range was not added successfully. The simplest thing is to refresh\n this.refresh();\n }\n }\n }\n };\n } else {\n selProto.addRange = function(range, direction) {\n if (isDirectionBackward(direction) && selectionHasExtend) {\n addRangeBackward(this, range);\n } else {\n this.nativeSelection.addRange(getNativeRange(range));\n this.refresh();\n }\n };\n }\n\n selProto.setRanges = function(ranges) {\n if (implementsControlRange && implementsDocSelection && ranges.length > 1) {\n createControlSelection(this, ranges);\n } else {\n this.removeAllRanges();\n for (var i = 0, len = ranges.length; i < len; ++i) {\n this.addRange(ranges[i]);\n }\n }\n };\n } else if (isHostMethod(testSelection, \"empty\") && isHostMethod(testRange, \"select\") &&\n implementsControlRange && useDocumentSelection) {\n\n selProto.removeAllRanges = function() {\n // Added try/catch as fix for issue #21\n try {\n this.docSelection.empty();\n\n // Check for empty() not working (issue #24)\n if (this.docSelection.type != \"None\") {\n // Work around failure to empty a control selection by instead selecting a TextRange and then\n // calling empty()\n var doc;\n if (this.anchorNode) {\n doc = getDocument(this.anchorNode);\n } else if (this.docSelection.type == CONTROL) {\n var controlRange = this.docSelection.createRange();\n if (controlRange.length) {\n doc = getDocument( controlRange.item(0) );\n }\n }\n if (doc) {\n var textRange = getBody(doc).createTextRange();\n textRange.select();\n this.docSelection.empty();\n }\n }\n } catch(ex) {}\n updateEmptySelection(this);\n };\n\n selProto.addRange = function(range) {\n if (this.docSelection.type == CONTROL) {\n addRangeToControlSelection(this, range);\n } else {\n api.WrappedTextRange.rangeToTextRange(range).select();\n this._ranges[0] = range;\n this.rangeCount = 1;\n this.isCollapsed = this._ranges[0].collapsed;\n updateAnchorAndFocusFromRange(this, range, false);\n updateType(this);\n }\n };\n\n selProto.setRanges = function(ranges) {\n this.removeAllRanges();\n var rangeCount = ranges.length;\n if (rangeCount > 1) {\n createControlSelection(this, ranges);\n } else if (rangeCount) {\n this.addRange(ranges[0]);\n }\n };\n } else {\n module.fail(\"No means of selecting a Range or TextRange was found\");\n return false;\n }\n\n selProto.getRangeAt = function(index) {\n if (index < 0 || index >= this.rangeCount) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n } else {\n // Clone the range to preserve selection-range independence. See issue 80.\n return this._ranges[index].cloneRange();\n }\n };\n\n var refreshSelection;\n\n if (useDocumentSelection) {\n refreshSelection = function(sel) {\n var range;\n if (api.isSelectionValid(sel.win)) {\n range = sel.docSelection.createRange();\n } else {\n range = getBody(sel.win.document).createTextRange();\n range.collapse(true);\n }\n\n if (sel.docSelection.type == CONTROL) {\n updateControlSelection(sel);\n } else if (isTextRange(range)) {\n updateFromTextRange(sel, range);\n } else {\n updateEmptySelection(sel);\n }\n };\n } else if (isHostMethod(testSelection, \"getRangeAt\") && typeof testSelection.rangeCount == NUMBER) {\n refreshSelection = function(sel) {\n if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {\n updateControlSelection(sel);\n } else {\n sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;\n if (sel.rangeCount) {\n for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));\n }\n updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));\n sel.isCollapsed = selectionIsCollapsed(sel);\n updateType(sel);\n } else {\n updateEmptySelection(sel);\n }\n }\n };\n } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {\n refreshSelection = function(sel) {\n var range, nativeSel = sel.nativeSelection;\n if (nativeSel.anchorNode) {\n range = getSelectionRangeAt(nativeSel, 0);\n sel._ranges = [range];\n sel.rangeCount = 1;\n updateAnchorAndFocusFromNativeSelection(sel);\n sel.isCollapsed = selectionIsCollapsed(sel);\n updateType(sel);\n } else {\n updateEmptySelection(sel);\n }\n };\n } else {\n module.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\");\n return false;\n }\n\n selProto.refresh = function(checkForChanges) {\n var oldRanges = checkForChanges ? this._ranges.slice(0) : null;\n var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;\n\n refreshSelection(this);\n if (checkForChanges) {\n // Check the range count first\n var i = oldRanges.length;\n if (i != this._ranges.length) {\n return true;\n }\n\n // Now check the direction. Checking the anchor position is the same is enough since we're checking all the\n // ranges after this\n if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {\n return true;\n }\n\n // Finally, compare each range in turn\n while (i--) {\n if (!rangesEqual(oldRanges[i], this._ranges[i])) {\n return true;\n }\n }\n return false;\n }\n };\n\n // Removal of a single range\n var removeRangeManually = function(sel, range) {\n var ranges = sel.getAllRanges();\n sel.removeAllRanges();\n for (var i = 0, len = ranges.length; i < len; ++i) {\n if (!rangesEqual(range, ranges[i])) {\n sel.addRange(ranges[i]);\n }\n }\n if (!sel.rangeCount) {\n updateEmptySelection(sel);\n }\n };\n\n if (implementsControlRange && implementsDocSelection) {\n selProto.removeRange = function(range) {\n if (this.docSelection.type == CONTROL) {\n var controlRange = this.docSelection.createRange();\n var rangeElement = getSingleElementFromRange(range);\n\n // Create a new ControlRange containing all the elements in the selected ControlRange minus the\n // element contained by the supplied range\n var doc = getDocument(controlRange.item(0));\n var newControlRange = getBody(doc).createControlRange();\n var el, removed = false;\n for (var i = 0, len = controlRange.length; i < len; ++i) {\n el = controlRange.item(i);\n if (el !== rangeElement || removed) {\n newControlRange.add(controlRange.item(i));\n } else {\n removed = true;\n }\n }\n newControlRange.select();\n\n // Update the wrapped selection based on what's now in the native selection\n updateControlSelection(this);\n } else {\n removeRangeManually(this, range);\n }\n };\n } else {\n selProto.removeRange = function(range) {\n removeRangeManually(this, range);\n };\n }\n\n // Detecting if a selection is backward\n var selectionIsBackward;\n if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {\n selectionIsBackward = winSelectionIsBackward;\n\n selProto.isBackward = function() {\n return selectionIsBackward(this);\n };\n } else {\n selectionIsBackward = selProto.isBackward = function() {\n return false;\n };\n }\n\n // Create an alias for backwards compatibility. From 1.3, everything is \"backward\" rather than \"backwards\"\n selProto.isBackwards = selProto.isBackward;\n\n // Selection stringifier\n // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.\n // The current spec does not yet define this method.\n selProto.toString = function() {\n var rangeTexts = [];\n for (var i = 0, len = this.rangeCount; i < len; ++i) {\n rangeTexts[i] = \"\" + this._ranges[i];\n }\n return rangeTexts.join(\"\");\n };\n\n function assertNodeInSameDocument(sel, node) {\n if (sel.win.document != getDocument(node)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (dom.isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n // No current browser conforms fully to the spec for this method, so Rangy's own method is always used\n selProto.collapse = function(node, offset) {\n assertNodeInSameDocument(this, node);\n var range = api.createRange(node);\n range.collapseToPoint(node, offset);\n this.setSingleRange(range);\n this.isCollapsed = true;\n };\n\n selProto.collapseToStart = function() {\n if (this.rangeCount) {\n var range = this._ranges[0];\n this.collapse(range.startContainer, range.startOffset);\n } else {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n };\n\n selProto.collapseToEnd = function() {\n if (this.rangeCount) {\n var range = this._ranges[this.rangeCount - 1];\n this.collapse(range.endContainer, range.endOffset);\n } else {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n };\n\n // The spec is very specific on how selectAllChildren should be implemented and not all browsers implement it as\n // specified so the native implementation is never used by Rangy.\n selProto.selectAllChildren = function(node) {\n assertNodeInSameDocument(this, node);\n var range = api.createRange(node);\n range.selectNodeContents(node);\n this.setSingleRange(range);\n };\n\n if (selectionHasSetBaseAndExtent) {\n selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n this.nativeSelection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);\n this.refresh();\n };\n } else if (selectionHasExtend) {\n selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n assertValidOffset(anchorNode, anchorOffset);\n assertValidOffset(focusNode, focusOffset);\n assertNodeInSameDocument(this, anchorNode);\n assertNodeInSameDocument(this, focusNode);\n var range = api.createRange(node);\n var isBackwards = (dom.comparePoints(anchorNode, anchorOffset, focusNode, focusOffset) == -1);\n if (isBackwards) {\n range.setStartAndEnd(focusNode, focusOffset, anchorNode, anchorOffset);\n } else {\n range.setStartAndEnd(anchorNode, anchorOffset, focusNode, focusOffset);\n }\n this.setSingleRange(range, isBackwards);\n };\n }\n\n selProto.deleteFromDocument = function() {\n // Sepcial behaviour required for IE's control selections\n if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n var controlRange = this.docSelection.createRange();\n var element;\n while (controlRange.length) {\n element = controlRange.item(0);\n controlRange.remove(element);\n dom.removeNode(element);\n }\n this.refresh();\n } else if (this.rangeCount) {\n var ranges = this.getAllRanges();\n if (ranges.length) {\n this.removeAllRanges();\n for (var i = 0, len = ranges.length; i < len; ++i) {\n ranges[i].deleteContents();\n }\n // The spec says nothing about what the selection should contain after calling deleteContents on each\n // range. Firefox moves the selection to where the final selected range was, so we emulate that\n this.addRange(ranges[len - 1]);\n }\n }\n };\n\n // The following are non-standard extensions\n selProto.eachRange = function(func, returnValue) {\n for (var i = 0, len = this._ranges.length; i < len; ++i) {\n if ( func( this.getRangeAt(i) ) ) {\n return returnValue;\n }\n }\n };\n\n selProto.getAllRanges = function() {\n var ranges = [];\n this.eachRange(function(range) {\n ranges.push(range);\n });\n return ranges;\n };\n\n selProto.setSingleRange = function(range, direction) {\n this.removeAllRanges();\n this.addRange(range, direction);\n };\n\n selProto.callMethodOnEachRange = function(methodName, params) {\n var results = [];\n this.eachRange( function(range) {\n results.push( range[methodName].apply(range, params || []) );\n } );\n return results;\n };\n\n function createStartOrEndSetter(isStart) {\n return function(node, offset) {\n var range;\n if (this.rangeCount) {\n range = this.getRangeAt(0);\n range[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n } else {\n range = api.createRange(this.win.document);\n range.setStartAndEnd(node, offset);\n }\n this.setSingleRange(range, this.isBackward());\n };\n }\n\n selProto.setStart = createStartOrEndSetter(true);\n selProto.setEnd = createStartOrEndSetter(false);\n\n // Add select() method to Range prototype. Any existing selection will be removed.\n api.rangePrototype.select = function(direction) {\n getSelection( this.getDocument() ).setSingleRange(this, direction);\n };\n\n selProto.changeEachRange = function(func) {\n var ranges = [];\n var backward = this.isBackward();\n\n this.eachRange(function(range) {\n func(range);\n ranges.push(range);\n });\n\n this.removeAllRanges();\n if (backward && ranges.length == 1) {\n this.addRange(ranges[0], \"backward\");\n } else {\n this.setRanges(ranges);\n }\n };\n\n selProto.containsNode = function(node, allowPartial) {\n return this.eachRange( function(range) {\n return range.containsNode(node, allowPartial);\n }, true ) || false;\n };\n\n selProto.getBookmark = function(containerNode) {\n return {\n backward: this.isBackward(),\n rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [containerNode])\n };\n };\n\n selProto.moveToBookmark = function(bookmark) {\n var selRanges = [];\n for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {\n range = api.createRange(this.win);\n range.moveToBookmark(rangeBookmark);\n selRanges.push(range);\n }\n if (bookmark.backward) {\n this.setSingleRange(selRanges[0], \"backward\");\n } else {\n this.setRanges(selRanges);\n }\n };\n\n selProto.saveRanges = function() {\n return {\n backward: this.isBackward(),\n ranges: this.callMethodOnEachRange(\"cloneRange\")\n };\n };\n\n selProto.restoreRanges = function(selRanges) {\n this.removeAllRanges();\n for (var i = 0, range; range = selRanges.ranges[i]; ++i) {\n this.addRange(range, (selRanges.backward && i == 0));\n }\n };\n\n selProto.toHtml = function() {\n var rangeHtmls = [];\n this.eachRange(function(range) {\n rangeHtmls.push( DomRange.toHtml(range) );\n });\n return rangeHtmls.join(\"\");\n };\n\n if (features.implementsTextRange) {\n selProto.getNativeTextRange = function() {\n var sel, textRange;\n if ( (sel = this.docSelection) ) {\n var range = sel.createRange();\n if (isTextRange(range)) {\n return range;\n } else {\n throw module.createError(\"getNativeTextRange: selection is a control selection\");\n }\n } else if (this.rangeCount > 0) {\n return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );\n } else {\n throw module.createError(\"getNativeTextRange: selection contains no range\");\n }\n };\n }\n\n function inspect(sel) {\n var rangeInspects = [];\n var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);\n var focus = new DomPosition(sel.focusNode, sel.focusOffset);\n var name = (typeof sel.getName == \"function\") ? sel.getName() : \"Selection\";\n\n if (typeof sel.rangeCount != \"undefined\") {\n for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));\n }\n }\n return \"[\" + name + \"(Ranges: \" + rangeInspects.join(\", \") +\n \")(anchor: \" + anchor.inspect() + \", focus: \" + focus.inspect() + \"]\";\n }\n\n selProto.getName = function() {\n return \"WrappedSelection\";\n };\n\n selProto.inspect = function() {\n return inspect(this);\n };\n\n selProto.detach = function() {\n actOnCachedSelection(this.win, \"delete\");\n deleteProperties(this);\n };\n\n WrappedSelection.detachAll = function() {\n actOnCachedSelection(null, \"deleteAll\");\n };\n\n WrappedSelection.inspect = inspect;\n WrappedSelection.isDirectionBackward = isDirectionBackward;\n\n api.Selection = WrappedSelection;\n\n api.selectionPrototype = selProto;\n\n api.addShimListener(function(win) {\n if (typeof win.getSelection == \"undefined\") {\n win.getSelection = function() {\n return getSelection(win);\n };\n }\n win = null;\n });\n });\n \n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wait for document to load before initializing\n var docReady = false;\n\n var loadHandler = function(e) {\n if (!docReady) {\n docReady = true;\n if (!api.initialized && api.config.autoInitialize) {\n init();\n }\n }\n };\n\n if (isBrowser) {\n // Test whether the document has already been loaded and initialize immediately if so\n if (document.readyState == \"complete\") {\n loadHandler();\n } else {\n if (isHostMethod(document, \"addEventListener\")) {\n document.addEventListener(\"DOMContentLoaded\", loadHandler, false);\n }\n\n // Add a fallback in case the DOMContentLoaded event isn't supported\n addListener(window, \"load\", loadHandler);\n }\n }\n\n return api;\n}, this);","/**\n * Text range module for Rangy.\n * Text-based manipulation and searching of ranges and selections.\n *\n * Features\n *\n * - Ability to move range boundaries by character or word offsets\n * - Customizable word tokenizer\n * - Ignores text nodes inside <script> or <style> elements or those hidden by CSS display and visibility properties\n * - Range findText method to search for text or regex within the page or within a range. Flags for whole words and case\n * sensitivity\n * - Selection and range save/restore as text offsets within a node\n * - Methods to return visible text within a range or selection\n * - innerText method for elements\n *\n * References\n *\n * https://www.w3.org/Bugs/Public/show_bug.cgi?id=13145\n * http://aryeh.name/spec/innertext/innertext.html\n * http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2022, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.1\n * Build date: 17 August 2022\n */\n\n/**\n * Problem: handling of trailing spaces before line breaks is handled inconsistently between browsers.\n *\n * First, a <br>: this is relatively simple. For the following HTML:\n *\n * 1 <br>2\n *\n * - IE and WebKit render the space, include it in the selection (i.e. when the content is selected and pasted into a\n * textarea, the space is present) and allow the caret to be placed after it.\n * - Firefox does not acknowledge the space in the selection but it is possible to place the caret after it.\n * - Opera does not render the space but has two separate caret positions on either side of the space (left and right\n * arrow keys show this) and includes the space in the selection.\n *\n * The other case is the line break or breaks implied by block elements. For the following HTML:\n *\n * <p>1 </p><p>2<p>\n *\n * - WebKit does not acknowledge the space in any way\n * - Firefox, IE and Opera as per <br>\n *\n * One more case is trailing spaces before line breaks in elements with white-space: pre-line. For the following HTML:\n *\n * <p style=\"white-space: pre-line\">1\n * 2</p>\n *\n * - Firefox and WebKit include the space in caret positions\n * - IE does not support pre-line up to and including version 9\n * - Opera ignores the space\n * - Trailing space only renders if there is a non-collapsed character in the line\n *\n * Problem is whether Rangy should ever acknowledge the space and if so, when. Another problem is whether this can be\n * feature-tested\n */\n(function(factory, root) {\n if (typeof define == \"function\" && define.amd) {\n // AMD. Register as an anonymous module with a dependency on Rangy.\n define([\"./rangy-core\"], factory);\n } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n // Node/CommonJS style\n module.exports = factory( require(\"rangy\") );\n } else {\n // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n factory(root.rangy);\n }\n})(function(rangy) {\n rangy.createModule(\"TextRange\", [\"WrappedSelection\"], function(api, module) {\n var UNDEF = \"undefined\";\n var CHARACTER = \"character\", WORD = \"word\";\n var dom = api.dom, util = api.util;\n var extend = util.extend;\n var createOptions = util.createOptions;\n var getBody = dom.getBody;\n\n\n var spacesRegex = /^[ \\t\\f\\r\\n]+$/;\n var spacesMinusLineBreaksRegex = /^[ \\t\\f\\r]+$/;\n var allWhiteSpaceRegex = /^[\\t-\\r \\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200B\\u2028\\u2029\\u202F\\u205F\\u3000]+$/;\n var nonLineBreakWhiteSpaceRegex = /^[\\t \\u00A0\\u1680\\u180E\\u2000-\\u200B\\u202F\\u205F\\u3000]+$/;\n var lineBreakRegex = /^[\\n-\\r\\u0085\\u2028\\u2029]$/;\n\n var defaultLanguage = \"en\";\n\n var isDirectionBackward = api.Selection.isDirectionBackward;\n\n // Properties representing whether trailing spaces inside blocks are completely collapsed (as they are in WebKit,\n // but not other browsers). Also test whether trailing spaces before <br> elements are collapsed.\n var trailingSpaceInBlockCollapses = false;\n var trailingSpaceBeforeBrCollapses = false;\n var trailingSpaceBeforeBlockCollapses = false;\n var trailingSpaceBeforeLineBreakInPreLineCollapses = true;\n\n (function() {\n var el = dom.createTestElement(document, \"<p>1 </p><p></p>\", true);\n var p = el.firstChild;\n var sel = api.getSelection();\n sel.collapse(p.lastChild, 2);\n sel.setStart(p.firstChild, 0);\n trailingSpaceInBlockCollapses = (\"\" + sel).length == 1;\n\n el.innerHTML = \"1 <br />\";\n sel.collapse(el, 2);\n sel.setStart(el.firstChild, 0);\n trailingSpaceBeforeBrCollapses = (\"\" + sel).length == 1;\n\n el.innerHTML = \"1 <p>1</p>\";\n sel.collapse(el, 2);\n sel.setStart(el.firstChild, 0);\n trailingSpaceBeforeBlockCollapses = (\"\" + sel).length == 1;\n\n dom.removeNode(el);\n sel.removeAllRanges();\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // This function must create word and non-word tokens for the whole of the text supplied to it\n function defaultTokenizer(chars, wordOptions) {\n var word = chars.join(\"\"), result, tokenRanges = [];\n\n function createTokenRange(start, end, isWord) {\n tokenRanges.push( { start: start, end: end, isWord: isWord } );\n }\n\n // Match words and mark characters\n var lastWordEnd = 0, wordStart, wordEnd;\n while ( (result = wordOptions.wordRegex.exec(word)) ) {\n wordStart = result.index;\n wordEnd = wordStart + result[0].length;\n\n // Create token for non-word characters preceding this word\n if (wordStart > lastWordEnd) {\n createTokenRange(lastWordEnd, wordStart, false);\n }\n\n // Get trailing space characters for word\n if (wordOptions.includeTrailingSpace) {\n while ( nonLineBreakWhiteSpaceRegex.test(chars[wordEnd]) ) {\n ++wordEnd;\n }\n }\n createTokenRange(wordStart, wordEnd, true);\n lastWordEnd = wordEnd;\n }\n\n // Create token for trailing non-word characters, if any exist\n if (lastWordEnd < chars.length) {\n createTokenRange(lastWordEnd, chars.length, false);\n }\n\n return tokenRanges;\n }\n\n function convertCharRangeToToken(chars, tokenRange) {\n var tokenChars = chars.slice(tokenRange.start, tokenRange.end);\n var token = {\n isWord: tokenRange.isWord,\n chars: tokenChars,\n toString: function() {\n return tokenChars.join(\"\");\n }\n };\n for (var i = 0, len = tokenChars.length; i < len; ++i) {\n tokenChars[i].token = token;\n }\n return token;\n }\n\n function tokenize(chars, wordOptions, tokenizer) {\n var tokenRanges = tokenizer(chars, wordOptions);\n var tokens = [];\n for (var i = 0, tokenRange; tokenRange = tokenRanges[i++]; ) {\n tokens.push( convertCharRangeToToken(chars, tokenRange) );\n }\n return tokens;\n }\n\n var defaultCharacterOptions = {\n includeBlockContentTrailingSpace: true,\n includeSpaceBeforeBr: true,\n includeSpaceBeforeBlock: true,\n includePreLineTrailingSpace: true,\n ignoreCharacters: \"\"\n };\n\n function normalizeIgnoredCharacters(ignoredCharacters) {\n // Check if character is ignored\n var ignoredChars = ignoredCharacters || \"\";\n\n // Normalize ignored characters into a string consisting of characters in ascending order of character code\n var ignoredCharsArray = (typeof ignoredChars == \"string\") ? ignoredChars.split(\"\") : ignoredChars;\n ignoredCharsArray.sort(function(char1, char2) {\n return char1.charCodeAt(0) - char2.charCodeAt(0);\n });\n\n /// Convert back to a string and remove duplicates\n return ignoredCharsArray.join(\"\").replace(/(.)\\1+/g, \"$1\");\n }\n\n var defaultCaretCharacterOptions = {\n includeBlockContentTrailingSpace: !trailingSpaceBeforeLineBreakInPreLineCollapses,\n includeSpaceBeforeBr: !trailingSpaceBeforeBrCollapses,\n includeSpaceBeforeBlock: !trailingSpaceBeforeBlockCollapses,\n includePreLineTrailingSpace: true\n };\n\n var defaultWordOptions = {\n \"en\": {\n wordRegex: /[a-z0-9]+('[a-z0-9]+)*/gi,\n includeTrailingSpace: false,\n tokenizer: defaultTokenizer\n }\n };\n\n var defaultFindOptions = {\n caseSensitive: false,\n withinRange: null,\n wholeWordsOnly: false,\n wrap: false,\n direction: \"forward\",\n wordOptions: null,\n characterOptions: null\n };\n\n var defaultMoveOptions = {\n wordOptions: null,\n characterOptions: null\n };\n\n var defaultExpandOptions = {\n wordOptions: null,\n characterOptions: null,\n trim: false,\n trimStart: true,\n trimEnd: true\n };\n\n var defaultWordIteratorOptions = {\n wordOptions: null,\n characterOptions: null,\n direction: \"forward\"\n };\n\n function createWordOptions(options) {\n var lang, defaults;\n if (!options) {\n return defaultWordOptions[defaultLanguage];\n } else {\n lang = options.language || defaultLanguage;\n defaults = {};\n extend(defaults, defaultWordOptions[lang] || defaultWordOptions[defaultLanguage]);\n extend(defaults, options);\n return defaults;\n }\n }\n\n function createNestedOptions(optionsParam, defaults) {\n var options = createOptions(optionsParam, defaults);\n if (defaults.hasOwnProperty(\"wordOptions\")) {\n options.wordOptions = createWordOptions(options.wordOptions);\n }\n if (defaults.hasOwnProperty(\"characterOptions\")) {\n options.characterOptions = createOptions(options.characterOptions, defaultCharacterOptions);\n }\n return options;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n /* DOM utility functions */\n var getComputedStyleProperty = dom.getComputedStyleProperty;\n\n // Create cachable versions of DOM functions\n\n // Test for old IE's incorrect display properties\n var tableCssDisplayBlock;\n (function() {\n var table = document.createElement(\"table\");\n var body = getBody(document);\n body.appendChild(table);\n tableCssDisplayBlock = (getComputedStyleProperty(table, \"display\") == \"block\");\n body.removeChild(table);\n })();\n\n var defaultDisplayValueForTag = {\n table: \"table\",\n caption: \"table-caption\",\n colgroup: \"table-column-group\",\n col: \"table-column\",\n thead: \"table-header-group\",\n tbody: \"table-row-group\",\n tfoot: \"table-footer-group\",\n tr: \"table-row\",\n td: \"table-cell\",\n th: \"table-cell\"\n };\n\n // Corrects IE's \"block\" value for table-related elements\n function getComputedDisplay(el, win) {\n var display = getComputedStyleProperty(el, \"display\", win);\n var tagName = el.tagName.toLowerCase();\n return (display == \"block\" &&\n tableCssDisplayBlock &&\n defaultDisplayValueForTag.hasOwnProperty(tagName)) ?\n defaultDisplayValueForTag[tagName] : display;\n }\n\n function isHidden(node) {\n var ancestors = getAncestorsAndSelf(node);\n for (var i = 0, len = ancestors.length; i < len; ++i) {\n if (ancestors[i].nodeType == 1 && getComputedDisplay(ancestors[i]) == \"none\") {\n return true;\n }\n }\n\n return false;\n }\n\n function isVisibilityHiddenTextNode(textNode) {\n var el;\n return textNode.nodeType == 3 &&\n (el = textNode.parentNode) &&\n getComputedStyleProperty(el, \"visibility\") == \"hidden\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n \n // \"A block node is either an Element whose \"display\" property does not have\n // resolved value \"inline\" or \"inline-block\" or \"inline-table\" or \"none\", or a\n // Document, or a DocumentFragment.\"\n function isBlockNode(node) {\n return node &&\n ((node.nodeType == 1 && !/^(inline(-block|-table)?|none)$/.test(getComputedDisplay(node))) ||\n node.nodeType == 9 || node.nodeType == 11);\n }\n\n function getLastDescendantOrSelf(node) {\n var lastChild = node.lastChild;\n return lastChild ? getLastDescendantOrSelf(lastChild) : node;\n }\n\n function containsPositions(node) {\n return dom.isCharacterDataNode(node) ||\n !/^(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)$/i.test(node.nodeName);\n }\n\n function getAncestors(node) {\n var ancestors = [];\n while (node.parentNode) {\n ancestors.unshift(node.parentNode);\n node = node.parentNode;\n }\n return ancestors;\n }\n\n function getAncestorsAndSelf(node) {\n return getAncestors(node).concat([node]);\n }\n\n function nextNodeDescendants(node) {\n while (node && !node.nextSibling) {\n node = node.parentNode;\n }\n if (!node) {\n return null;\n }\n return node.nextSibling;\n }\n\n function nextNode(node, excludeChildren) {\n if (!excludeChildren && node.hasChildNodes()) {\n return node.firstChild;\n }\n return nextNodeDescendants(node);\n }\n\n function previousNode(node) {\n var previous = node.previousSibling;\n if (previous) {\n node = previous;\n while (node.hasChildNodes()) {\n node = node.lastChild;\n }\n return node;\n }\n var parent = node.parentNode;\n if (parent && parent.nodeType == 1) {\n return parent;\n }\n return null;\n }\n\n // Adpated from Aryeh's code.\n // \"A whitespace node is either a Text node whose data is the empty string; or\n // a Text node whose data consists only of one or more tabs (0x0009), line\n // feeds (0x000A), carriage returns (0x000D), and/or spaces (0x0020), and whose\n // parent is an Element whose resolved value for \"white-space\" is \"normal\" or\n // \"nowrap\"; or a Text node whose data consists only of one or more tabs\n // (0x0009), carriage returns (0x000D), and/or spaces (0x0020), and whose\n // parent is an Element whose resolved value for \"white-space\" is \"pre-line\".\"\n function isWhitespaceNode(node) {\n if (!node || node.nodeType != 3) {\n return false;\n }\n var text = node.data;\n if (text === \"\") {\n return true;\n }\n var parent = node.parentNode;\n if (!parent || parent.nodeType != 1) {\n return false;\n }\n var computedWhiteSpace = getComputedStyleProperty(node.parentNode, \"whiteSpace\");\n\n return (/^[\\t\\n\\r ]+$/.test(text) && /^(normal|nowrap)$/.test(computedWhiteSpace)) ||\n (/^[\\t\\r ]+$/.test(text) && computedWhiteSpace == \"pre-line\");\n }\n\n // Adpated from Aryeh's code.\n // \"node is a collapsed whitespace node if the following algorithm returns\n // true:\"\n function isCollapsedWhitespaceNode(node) {\n // \"If node's data is the empty string, return true.\"\n if (node.data === \"\") {\n return true;\n }\n\n // \"If node is not a whitespace node, return false.\"\n if (!isWhitespaceNode(node)) {\n return false;\n }\n\n // \"Let ancestor be node's parent.\"\n var ancestor = node.parentNode;\n\n // \"If ancestor is null, return true.\"\n if (!ancestor) {\n return true;\n }\n\n // \"If the \"display\" property of some ancestor of node has resolved value \"none\", return true.\"\n if (isHidden(node)) {\n return true;\n }\n\n return false;\n }\n\n function isCollapsedNode(node) {\n var type = node.nodeType;\n return type == 7 /* PROCESSING_INSTRUCTION */ ||\n type == 8 /* COMMENT */ ||\n isHidden(node) ||\n /^(script|style)$/i.test(node.nodeName) ||\n isVisibilityHiddenTextNode(node) ||\n isCollapsedWhitespaceNode(node);\n }\n\n function isIgnoredNode(node, win) {\n var type = node.nodeType;\n return type == 7 /* PROCESSING_INSTRUCTION */ ||\n type == 8 /* COMMENT */ ||\n (type == 1 && getComputedDisplay(node, win) == \"none\");\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Possibly overengineered caching system to prevent repeated DOM calls slowing everything down\n\n function Cache() {\n this.store = {};\n }\n\n Cache.prototype = {\n get: function(key) {\n return this.store.hasOwnProperty(key) ? this.store[key] : null;\n },\n\n set: function(key, value) {\n return this.store[key] = value;\n }\n };\n\n var cachedCount = 0, uncachedCount = 0;\n\n function createCachingGetter(methodName, func, objProperty) {\n return function(args) {\n var cache = this.cache;\n if (cache.hasOwnProperty(methodName)) {\n cachedCount++;\n return cache[methodName];\n } else {\n uncachedCount++;\n var value = func.call(this, objProperty ? this[objProperty] : this, args);\n cache[methodName] = value;\n return value;\n }\n };\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function NodeWrapper(node, session) {\n this.node = node;\n this.session = session;\n this.cache = new Cache();\n this.positions = new Cache();\n }\n\n var nodeProto = {\n getPosition: function(offset) {\n var positions = this.positions;\n return positions.get(offset) || positions.set(offset, new Position(this, offset));\n },\n\n toString: function() {\n return \"[NodeWrapper(\" + dom.inspectNode(this.node) + \")]\";\n }\n };\n\n NodeWrapper.prototype = nodeProto;\n\n var EMPTY = \"EMPTY\",\n NON_SPACE = \"NON_SPACE\",\n UNCOLLAPSIBLE_SPACE = \"UNCOLLAPSIBLE_SPACE\",\n COLLAPSIBLE_SPACE = \"COLLAPSIBLE_SPACE\",\n TRAILING_SPACE_BEFORE_BLOCK = \"TRAILING_SPACE_BEFORE_BLOCK\",\n TRAILING_SPACE_IN_BLOCK = \"TRAILING_SPACE_IN_BLOCK\",\n TRAILING_SPACE_BEFORE_BR = \"TRAILING_SPACE_BEFORE_BR\",\n PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK = \"PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK\",\n TRAILING_LINE_BREAK_AFTER_BR = \"TRAILING_LINE_BREAK_AFTER_BR\",\n INCLUDED_TRAILING_LINE_BREAK_AFTER_BR = \"INCLUDED_TRAILING_LINE_BREAK_AFTER_BR\";\n\n extend(nodeProto, {\n isCharacterDataNode: createCachingGetter(\"isCharacterDataNode\", dom.isCharacterDataNode, \"node\"),\n getNodeIndex: createCachingGetter(\"nodeIndex\", dom.getNodeIndex, \"node\"),\n getLength: createCachingGetter(\"nodeLength\", dom.getNodeLength, \"node\"),\n containsPositions: createCachingGetter(\"containsPositions\", containsPositions, \"node\"),\n isWhitespace: createCachingGetter(\"isWhitespace\", isWhitespaceNode, \"node\"),\n isCollapsedWhitespace: createCachingGetter(\"isCollapsedWhitespace\", isCollapsedWhitespaceNode, \"node\"),\n getComputedDisplay: createCachingGetter(\"computedDisplay\", getComputedDisplay, \"node\"),\n isCollapsed: createCachingGetter(\"collapsed\", isCollapsedNode, \"node\"),\n isIgnored: createCachingGetter(\"ignored\", isIgnoredNode, \"node\"),\n next: createCachingGetter(\"nextPos\", nextNode, \"node\"),\n previous: createCachingGetter(\"previous\", previousNode, \"node\"),\n\n getTextNodeInfo: createCachingGetter(\"textNodeInfo\", function(textNode) {\n var spaceRegex = null, collapseSpaces = false;\n var cssWhitespace = getComputedStyleProperty(textNode.parentNode, \"whiteSpace\");\n var preLine = (cssWhitespace == \"pre-line\");\n if (preLine) {\n spaceRegex = spacesMinusLineBreaksRegex;\n collapseSpaces = true;\n } else if (cssWhitespace == \"normal\" || cssWhitespace == \"nowrap\") {\n spaceRegex = spacesRegex;\n collapseSpaces = true;\n }\n\n return {\n node: textNode,\n text: textNode.data,\n spaceRegex: spaceRegex,\n collapseSpaces: collapseSpaces,\n preLine: preLine\n };\n }, \"node\"),\n\n hasInnerText: createCachingGetter(\"hasInnerText\", function(el, backward) {\n var session = this.session;\n var posAfterEl = session.getPosition(el.parentNode, this.getNodeIndex() + 1);\n var firstPosInEl = session.getPosition(el, 0);\n\n var pos = backward ? posAfterEl : firstPosInEl;\n var endPos = backward ? firstPosInEl : posAfterEl;\n\n /*\n <body><p>X </p><p>Y</p></body>\n\n Positions:\n\n body:0:\"\"\n p:0:\"\"\n text:0:\"\"\n text:1:\"X\"\n text:2:TRAILING_SPACE_IN_BLOCK\n text:3:COLLAPSED_SPACE\n p:1:\"\"\n body:1:\"\\n\"\n p:0:\"\"\n text:0:\"\"\n text:1:\"Y\"\n\n A character is a TRAILING_SPACE_IN_BLOCK iff:\n\n - There is no uncollapsed character after it within the visible containing block element\n\n A character is a TRAILING_SPACE_BEFORE_BR iff:\n\n - There is no uncollapsed character after it preceding a <br> element\n\n An element has inner text iff\n\n - It is not hidden\n - It contains an uncollapsed character\n\n All trailing spaces (pre-line, before <br>, end of block) require definite non-empty characters to render.\n */\n\n while (pos !== endPos) {\n pos.prepopulateChar();\n if (pos.isDefinitelyNonEmpty()) {\n return true;\n }\n pos = backward ? pos.previousVisible() : pos.nextVisible();\n }\n\n return false;\n }, \"node\"),\n\n isRenderedBlock: createCachingGetter(\"isRenderedBlock\", function(el) {\n // Ensure that a block element containing a <br> is considered to have inner text\n var brs = el.getElementsByTagName(\"br\");\n for (var i = 0, len = brs.length; i < len; ++i) {\n if (!isCollapsedNode(brs[i])) {\n return true;\n }\n }\n return this.hasInnerText();\n }, \"node\"),\n\n getTrailingSpace: createCachingGetter(\"trailingSpace\", function(el) {\n if (el.tagName.toLowerCase() == \"br\") {\n return \"\";\n } else {\n switch (this.getComputedDisplay()) {\n case \"inline\":\n var child = el.lastChild;\n while (child) {\n if (!isIgnoredNode(child)) {\n return (child.nodeType == 1) ? this.session.getNodeWrapper(child).getTrailingSpace() : \"\";\n }\n child = child.previousSibling;\n }\n break;\n case \"inline-block\":\n case \"inline-table\":\n case \"none\":\n case \"table-column\":\n case \"table-column-group\":\n break;\n case \"table-cell\":\n return \"\\t\";\n default:\n return this.isRenderedBlock(true) ? \"\\n\" : \"\";\n }\n }\n return \"\";\n }, \"node\"),\n\n getLeadingSpace: createCachingGetter(\"leadingSpace\", function(el) {\n switch (this.getComputedDisplay()) {\n case \"inline\":\n case \"inline-block\":\n case \"inline-table\":\n case \"none\":\n case \"table-column\":\n case \"table-column-group\":\n case \"table-cell\":\n break;\n default:\n return this.isRenderedBlock(false) ? \"\\n\" : \"\";\n }\n return \"\";\n }, \"node\")\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function Position(nodeWrapper, offset) {\n this.offset = offset;\n this.nodeWrapper = nodeWrapper;\n this.node = nodeWrapper.node;\n this.session = nodeWrapper.session;\n this.cache = new Cache();\n }\n\n function inspectPosition() {\n return \"[Position(\" + dom.inspectNode(this.node) + \":\" + this.offset + \")]\";\n }\n\n var positionProto = {\n character: \"\",\n characterType: EMPTY,\n isBr: false,\n\n /*\n This method:\n - Fully populates positions that have characters that can be determined independently of any other characters.\n - Populates most types of space positions with a provisional character. The character is finalized later.\n */\n prepopulateChar: function() {\n var pos = this;\n if (!pos.prepopulatedChar) {\n var node = pos.node, offset = pos.offset;\n var visibleChar = \"\", charType = EMPTY;\n var finalizedChar = false;\n if (offset > 0) {\n if (node.nodeType == 3) {\n var text = node.data;\n var textChar = text.charAt(offset - 1);\n\n var nodeInfo = pos.nodeWrapper.getTextNodeInfo();\n var spaceRegex = nodeInfo.spaceRegex;\n if (nodeInfo.collapseSpaces) {\n if (spaceRegex.test(textChar)) {\n // \"If the character at position is from set, append a single space (U+0020) to newdata and advance\n // position until the character at position is not from set.\"\n\n // We also need to check for the case where we're in a pre-line and we have a space preceding a\n // line break, because such spaces are collapsed in some browsers\n if (offset > 1 && spaceRegex.test(text.charAt(offset - 2))) {\n } else if (nodeInfo.preLine && text.charAt(offset) === \"\\n\") {\n visibleChar = \" \";\n charType = PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK;\n } else {\n visibleChar = \" \";\n //pos.checkForFollowingLineBreak = true;\n charType = COLLAPSIBLE_SPACE;\n }\n } else {\n visibleChar = textChar;\n charType = NON_SPACE;\n finalizedChar = true;\n }\n } else {\n visibleChar = textChar;\n charType = UNCOLLAPSIBLE_SPACE;\n finalizedChar = true;\n }\n } else {\n var nodePassed = node.childNodes[offset - 1];\n if (nodePassed && nodePassed.nodeType == 1 && !isCollapsedNode(nodePassed)) {\n if (nodePassed.tagName.toLowerCase() == \"br\") {\n visibleChar = \"\\n\";\n pos.isBr = true;\n charType = COLLAPSIBLE_SPACE;\n finalizedChar = false;\n } else {\n pos.checkForTrailingSpace = true;\n }\n }\n\n // Check the leading space of the next node for the case when a block element follows an inline\n // element or text node. In that case, there is an implied line break between the two nodes.\n if (!visibleChar) {\n var nextNode = node.childNodes[offset];\n if (nextNode && nextNode.nodeType == 1 && !isCollapsedNode(nextNode)) {\n pos.checkForLeadingSpace = true;\n }\n }\n }\n }\n\n pos.prepopulatedChar = true;\n pos.character = visibleChar;\n pos.characterType = charType;\n pos.isCharInvariant = finalizedChar;\n }\n },\n\n isDefinitelyNonEmpty: function() {\n var charType = this.characterType;\n return charType == NON_SPACE || charType == UNCOLLAPSIBLE_SPACE;\n },\n\n // Resolve leading and trailing spaces, which may involve prepopulating other positions\n resolveLeadingAndTrailingSpaces: function() {\n if (!this.prepopulatedChar) {\n this.prepopulateChar();\n }\n if (this.checkForTrailingSpace) {\n var trailingSpace = this.session.getNodeWrapper(this.node.childNodes[this.offset - 1]).getTrailingSpace();\n if (trailingSpace) {\n this.isTrailingSpace = true;\n this.character = trailingSpace;\n this.characterType = COLLAPSIBLE_SPACE;\n }\n this.checkForTrailingSpace = false;\n }\n if (this.checkForLeadingSpace) {\n var leadingSpace = this.session.getNodeWrapper(this.node.childNodes[this.offset]).getLeadingSpace();\n if (leadingSpace) {\n this.isLeadingSpace = true;\n this.character = leadingSpace;\n this.characterType = COLLAPSIBLE_SPACE;\n }\n this.checkForLeadingSpace = false;\n }\n },\n\n getPrecedingUncollapsedPosition: function(characterOptions) {\n var pos = this, character;\n while ( (pos = pos.previousVisible()) ) {\n character = pos.getCharacter(characterOptions);\n if (character !== \"\") {\n return pos;\n }\n }\n\n return null;\n },\n\n getCharacter: function(characterOptions) {\n this.resolveLeadingAndTrailingSpaces();\n\n var thisChar = this.character, returnChar;\n\n // Check if character is ignored\n var ignoredChars = normalizeIgnoredCharacters(characterOptions.ignoreCharacters);\n var isIgnoredCharacter = (thisChar !== \"\" && ignoredChars.indexOf(thisChar) > -1);\n\n // Check if this position's character is invariant (i.e. not dependent on character options) and return it\n // if so\n if (this.isCharInvariant) {\n returnChar = isIgnoredCharacter ? \"\" : thisChar;\n return returnChar;\n }\n\n var cacheKey = [\"character\", characterOptions.includeSpaceBeforeBr, characterOptions.includeBlockContentTrailingSpace, characterOptions.includePreLineTrailingSpace, ignoredChars].join(\"_\");\n var cachedChar = this.cache.get(cacheKey);\n if (cachedChar !== null) {\n return cachedChar;\n }\n\n // We need to actually get the character now\n var character = \"\";\n var collapsible = (this.characterType == COLLAPSIBLE_SPACE);\n\n var nextPos, previousPos;\n var gotPreviousPos = false;\n var pos = this;\n\n function getPreviousPos() {\n if (!gotPreviousPos) {\n previousPos = pos.getPrecedingUncollapsedPosition(characterOptions);\n gotPreviousPos = true;\n }\n return previousPos;\n }\n\n // Disallow a collapsible space that is followed by a line break or is the last character\n if (collapsible) {\n // Allow a trailing space that we've previously determined should be included\n if (this.type == INCLUDED_TRAILING_LINE_BREAK_AFTER_BR) {\n character = \"\\n\";\n }\n // Disallow a collapsible space that follows a trailing space or line break, or is the first character,\n // or follows a collapsible included space\n else if (thisChar == \" \" &&\n (!getPreviousPos() || previousPos.isTrailingSpace || previousPos.character == \"\\n\" || (previousPos.character == \" \" && previousPos.characterType == COLLAPSIBLE_SPACE))) {\n }\n // Allow a leading line break unless it follows a line break\n else if (thisChar == \"\\n\" && this.isLeadingSpace) {\n if (getPreviousPos() && previousPos.character != \"\\n\") {\n character = \"\\n\";\n } else {\n }\n } else {\n nextPos = this.nextUncollapsed();\n if (nextPos) {\n if (nextPos.isBr) {\n this.type = TRAILING_SPACE_BEFORE_BR;\n } else if (nextPos.isTrailingSpace && nextPos.character == \"\\n\") {\n this.type = TRAILING_SPACE_IN_BLOCK;\n } else if (nextPos.isLeadingSpace && nextPos.character == \"\\n\") {\n this.type = TRAILING_SPACE_BEFORE_BLOCK;\n }\n\n if (nextPos.character == \"\\n\") {\n if (this.type == TRAILING_SPACE_BEFORE_BR && !characterOptions.includeSpaceBeforeBr) {\n } else if (this.type == TRAILING_SPACE_BEFORE_BLOCK && !characterOptions.includeSpaceBeforeBlock) {\n } else if (this.type == TRAILING_SPACE_IN_BLOCK && nextPos.isTrailingSpace && !characterOptions.includeBlockContentTrailingSpace) {\n } else if (this.type == PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK && nextPos.type == NON_SPACE && !characterOptions.includePreLineTrailingSpace) {\n } else if (thisChar == \"\\n\") {\n if (nextPos.isTrailingSpace) {\n if (this.isTrailingSpace) {\n } else if (this.isBr) {\n nextPos.type = TRAILING_LINE_BREAK_AFTER_BR;\n\n if (getPreviousPos() && previousPos.isLeadingSpace && !previousPos.isTrailingSpace && previousPos.character == \"\\n\") {\n nextPos.character = \"\";\n } else {\n nextPos.type = INCLUDED_TRAILING_LINE_BREAK_AFTER_BR;\n }\n }\n } else {\n character = \"\\n\";\n }\n } else if (thisChar == \" \") {\n character = \" \";\n } else {\n }\n } else {\n character = thisChar;\n }\n } else {\n }\n }\n }\n\n if (ignoredChars.indexOf(character) > -1) {\n character = \"\";\n }\n\n\n this.cache.set(cacheKey, character);\n\n return character;\n },\n\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset === pos.offset;\n },\n\n inspect: inspectPosition,\n\n toString: function() {\n return this.character;\n }\n };\n\n Position.prototype = positionProto;\n\n extend(positionProto, {\n next: createCachingGetter(\"nextPos\", function(pos) {\n var nodeWrapper = pos.nodeWrapper, node = pos.node, offset = pos.offset, session = nodeWrapper.session;\n if (!node) {\n return null;\n }\n var nextNode, nextOffset, child;\n if (offset == nodeWrapper.getLength()) {\n // Move onto the next node\n nextNode = node.parentNode;\n nextOffset = nextNode ? nodeWrapper.getNodeIndex() + 1 : 0;\n } else {\n if (nodeWrapper.isCharacterDataNode()) {\n nextNode = node;\n nextOffset = offset + 1;\n } else {\n child = node.childNodes[offset];\n // Go into the children next, if children there are\n if (session.getNodeWrapper(child).containsPositions()) {\n nextNode = child;\n nextOffset = 0;\n } else {\n nextNode = node;\n nextOffset = offset + 1;\n }\n }\n }\n\n return nextNode ? session.getPosition(nextNode, nextOffset) : null;\n }),\n\n previous: createCachingGetter(\"previous\", function(pos) {\n var nodeWrapper = pos.nodeWrapper, node = pos.node, offset = pos.offset, session = nodeWrapper.session;\n var previousNode, previousOffset, child;\n if (offset == 0) {\n previousNode = node.parentNode;\n previousOffset = previousNode ? nodeWrapper.getNodeIndex() : 0;\n } else {\n if (nodeWrapper.isCharacterDataNode()) {\n previousNode = node;\n previousOffset = offset - 1;\n } else {\n child = node.childNodes[offset - 1];\n // Go into the children next, if children there are\n if (session.getNodeWrapper(child).containsPositions()) {\n previousNode = child;\n previousOffset = dom.getNodeLength(child);\n } else {\n previousNode = node;\n previousOffset = offset - 1;\n }\n }\n }\n return previousNode ? session.getPosition(previousNode, previousOffset) : null;\n }),\n\n /*\n Next and previous position moving functions that filter out\n\n - Hidden (CSS visibility/display) elements\n - Script and style elements\n */\n nextVisible: createCachingGetter(\"nextVisible\", function(pos) {\n var next = pos.next();\n if (!next) {\n return null;\n }\n var nodeWrapper = next.nodeWrapper, node = next.node;\n var newPos = next;\n if (nodeWrapper.isCollapsed()) {\n // We're skipping this node and all its descendants\n newPos = nodeWrapper.session.getPosition(node.parentNode, nodeWrapper.getNodeIndex() + 1);\n }\n return newPos;\n }),\n\n nextUncollapsed: createCachingGetter(\"nextUncollapsed\", function(pos) {\n var nextPos = pos;\n while ( (nextPos = nextPos.nextVisible()) ) {\n nextPos.resolveLeadingAndTrailingSpaces();\n if (nextPos.character !== \"\") {\n return nextPos;\n }\n }\n return null;\n }),\n\n previousVisible: createCachingGetter(\"previousVisible\", function(pos) {\n var previous = pos.previous();\n if (!previous) {\n return null;\n }\n var nodeWrapper = previous.nodeWrapper, node = previous.node;\n var newPos = previous;\n if (nodeWrapper.isCollapsed()) {\n // We're skipping this node and all its descendants\n newPos = nodeWrapper.session.getPosition(node.parentNode, nodeWrapper.getNodeIndex());\n }\n return newPos;\n })\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var currentSession = null;\n\n var Session = (function() {\n function createWrapperCache(nodeProperty) {\n var cache = new Cache();\n\n return {\n get: function(node) {\n var wrappersByProperty = cache.get(node[nodeProperty]);\n if (wrappersByProperty) {\n for (var i = 0, wrapper; wrapper = wrappersByProperty[i++]; ) {\n if (wrapper.node === node) {\n return wrapper;\n }\n }\n }\n return null;\n },\n\n set: function(nodeWrapper) {\n var property = nodeWrapper.node[nodeProperty];\n var wrappersByProperty = cache.get(property) || cache.set(property, []);\n wrappersByProperty.push(nodeWrapper);\n }\n };\n }\n\n var uniqueIDSupported = util.isHostProperty(document.documentElement, \"uniqueID\");\n\n function Session() {\n this.initCaches();\n }\n\n Session.prototype = {\n initCaches: function() {\n this.elementCache = uniqueIDSupported ? (function() {\n var elementsCache = new Cache();\n\n return {\n get: function(el) {\n return elementsCache.get(el.uniqueID);\n },\n\n set: function(elWrapper) {\n elementsCache.set(elWrapper.node.uniqueID, elWrapper);\n }\n };\n })() : createWrapperCache(\"tagName\");\n\n // Store text nodes keyed by data, although we may need to truncate this\n this.textNodeCache = createWrapperCache(\"data\");\n this.otherNodeCache = createWrapperCache(\"nodeName\");\n },\n\n getNodeWrapper: function(node) {\n var wrapperCache;\n switch (node.nodeType) {\n case 1:\n wrapperCache = this.elementCache;\n break;\n case 3:\n wrapperCache = this.textNodeCache;\n break;\n default:\n wrapperCache = this.otherNodeCache;\n break;\n }\n\n var wrapper = wrapperCache.get(node);\n if (!wrapper) {\n wrapper = new NodeWrapper(node, this);\n wrapperCache.set(wrapper);\n }\n return wrapper;\n },\n\n getPosition: function(node, offset) {\n return this.getNodeWrapper(node).getPosition(offset);\n },\n\n getRangeBoundaryPosition: function(range, isStart) {\n var prefix = isStart ? \"start\" : \"end\";\n return this.getPosition(range[prefix + \"Container\"], range[prefix + \"Offset\"]);\n },\n\n detach: function() {\n this.elementCache = this.textNodeCache = this.otherNodeCache = null;\n }\n };\n\n return Session;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function startSession() {\n endSession();\n return (currentSession = new Session());\n }\n\n function getSession() {\n return currentSession || startSession();\n }\n\n function endSession() {\n if (currentSession) {\n currentSession.detach();\n }\n currentSession = null;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the rangy.dom utility object\n\n extend(dom, {\n nextNode: nextNode,\n previousNode: previousNode\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function createCharacterIterator(startPos, backward, endPos, characterOptions) {\n\n // Adjust the end position to ensure that it is actually reached\n if (endPos) {\n if (backward) {\n if (isCollapsedNode(endPos.node)) {\n endPos = startPos.previousVisible();\n }\n } else {\n if (isCollapsedNode(endPos.node)) {\n endPos = endPos.nextVisible();\n }\n }\n }\n\n var pos = startPos, finished = false;\n\n function next() {\n var charPos = null;\n if (backward) {\n charPos = pos;\n if (!finished) {\n pos = pos.previousVisible();\n finished = !pos || (endPos && pos.equals(endPos));\n }\n } else {\n if (!finished) {\n charPos = pos = pos.nextVisible();\n finished = !pos || (endPos && pos.equals(endPos));\n }\n }\n if (finished) {\n pos = null;\n }\n return charPos;\n }\n\n var previousTextPos, returnPreviousTextPos = false;\n\n return {\n next: function() {\n if (returnPreviousTextPos) {\n returnPreviousTextPos = false;\n return previousTextPos;\n } else {\n var pos, character;\n while ( (pos = next()) ) {\n character = pos.getCharacter(characterOptions);\n if (character) {\n previousTextPos = pos;\n return pos;\n }\n }\n return null;\n }\n },\n\n rewind: function() {\n if (previousTextPos) {\n returnPreviousTextPos = true;\n } else {\n throw module.createError(\"createCharacterIterator: cannot rewind. Only one position can be rewound.\");\n }\n },\n\n dispose: function() {\n startPos = endPos = null;\n }\n };\n }\n\n var arrayIndexOf = Array.prototype.indexOf ?\n function(arr, val) {\n return arr.indexOf(val);\n } :\n function(arr, val) {\n for (var i = 0, len = arr.length; i < len; ++i) {\n if (arr[i] === val) {\n return i;\n }\n }\n return -1;\n };\n\n // Provides a pair of iterators over text positions, tokenized. Transparently requests more text when next()\n // is called and there is no more tokenized text\n function createTokenizedTextProvider(pos, characterOptions, wordOptions) {\n var forwardIterator = createCharacterIterator(pos, false, null, characterOptions);\n var backwardIterator = createCharacterIterator(pos, true, null, characterOptions);\n var tokenizer = wordOptions.tokenizer;\n\n // Consumes a word and the whitespace beyond it\n function consumeWord(forward) {\n var pos, textChar;\n var newChars = [], it = forward ? forwardIterator : backwardIterator;\n\n var passedWordBoundary = false, insideWord = false;\n\n while ( (pos = it.next()) ) {\n textChar = pos.character;\n\n\n if (allWhiteSpaceRegex.test(textChar)) {\n if (insideWord) {\n insideWord = false;\n passedWordBoundary = true;\n }\n } else {\n if (passedWordBoundary) {\n it.rewind();\n break;\n } else {\n insideWord = true;\n }\n }\n newChars.push(pos);\n }\n\n\n return newChars;\n }\n\n // Get initial word surrounding initial position and tokenize it\n var forwardChars = consumeWord(true);\n var backwardChars = consumeWord(false).reverse();\n var tokens = tokenize(backwardChars.concat(forwardChars), wordOptions, tokenizer);\n\n // Create initial token buffers\n var forwardTokensBuffer = forwardChars.length ?\n tokens.slice(arrayIndexOf(tokens, forwardChars[0].token)) : [];\n\n var backwardTokensBuffer = backwardChars.length ?\n tokens.slice(0, arrayIndexOf(tokens, backwardChars.pop().token) + 1) : [];\n\n function inspectBuffer(buffer) {\n var textPositions = [\"[\" + buffer.length + \"]\"];\n for (var i = 0; i < buffer.length; ++i) {\n textPositions.push(\"(word: \" + buffer[i] + \", is word: \" + buffer[i].isWord + \")\");\n }\n return textPositions;\n }\n\n\n return {\n nextEndToken: function() {\n var lastToken, forwardChars;\n\n // If we're down to the last token, consume character chunks until we have a word or run out of\n // characters to consume\n while ( forwardTokensBuffer.length == 1 &&\n !(lastToken = forwardTokensBuffer[0]).isWord &&\n (forwardChars = consumeWord(true)).length > 0) {\n\n // Merge trailing non-word into next word and tokenize\n forwardTokensBuffer = tokenize(lastToken.chars.concat(forwardChars), wordOptions, tokenizer);\n }\n\n return forwardTokensBuffer.shift();\n },\n\n previousStartToken: function() {\n var lastToken, backwardChars;\n\n // If we're down to the last token, consume character chunks until we have a word or run out of\n // characters to consume\n while ( backwardTokensBuffer.length == 1 &&\n !(lastToken = backwardTokensBuffer[0]).isWord &&\n (backwardChars = consumeWord(false)).length > 0) {\n\n // Merge leading non-word into next word and tokenize\n backwardTokensBuffer = tokenize(backwardChars.reverse().concat(lastToken.chars), wordOptions, tokenizer);\n }\n\n return backwardTokensBuffer.pop();\n },\n\n dispose: function() {\n forwardIterator.dispose();\n backwardIterator.dispose();\n forwardTokensBuffer = backwardTokensBuffer = null;\n }\n };\n }\n\n function movePositionBy(pos, unit, count, characterOptions, wordOptions) {\n var unitsMoved = 0, currentPos, newPos = pos, charIterator, nextPos, absCount = Math.abs(count), token;\n if (count !== 0) {\n var backward = (count < 0);\n\n switch (unit) {\n case CHARACTER:\n charIterator = createCharacterIterator(pos, backward, null, characterOptions);\n while ( (currentPos = charIterator.next()) && unitsMoved < absCount ) {\n ++unitsMoved;\n newPos = currentPos;\n }\n nextPos = currentPos;\n charIterator.dispose();\n break;\n case WORD:\n var tokenizedTextProvider = createTokenizedTextProvider(pos, characterOptions, wordOptions);\n var next = backward ? tokenizedTextProvider.previousStartToken : tokenizedTextProvider.nextEndToken;\n\n while ( (token = next()) && unitsMoved < absCount ) {\n if (token.isWord) {\n ++unitsMoved;\n newPos = backward ? token.chars[0] : token.chars[token.chars.length - 1];\n }\n }\n break;\n default:\n throw new Error(\"movePositionBy: unit '\" + unit + \"' not implemented\");\n }\n\n // Perform any necessary position tweaks\n if (backward) {\n newPos = newPos.previousVisible();\n unitsMoved = -unitsMoved;\n } else if (newPos && newPos.isLeadingSpace && !newPos.isTrailingSpace) {\n // Tweak the position for the case of a leading space. The problem is that an uncollapsed leading space\n // before a block element (for example, the line break between \"1\" and \"2\" in the following HTML:\n // \"1<p>2</p>\") is considered to be attached to the position immediately before the block element, which\n // corresponds with a different selection position in most browsers from the one we want (i.e. at the\n // start of the contents of the block element). We get round this by advancing the position returned to\n // the last possible equivalent visible position.\n if (unit == WORD) {\n charIterator = createCharacterIterator(pos, false, null, characterOptions);\n nextPos = charIterator.next();\n charIterator.dispose();\n }\n if (nextPos) {\n newPos = nextPos.previousVisible();\n }\n }\n }\n\n\n return {\n position: newPos,\n unitsMoved: unitsMoved\n };\n }\n\n function createRangeCharacterIterator(session, range, characterOptions, backward) {\n var rangeStart = session.getRangeBoundaryPosition(range, true);\n var rangeEnd = session.getRangeBoundaryPosition(range, false);\n var itStart = backward ? rangeEnd : rangeStart;\n var itEnd = backward ? rangeStart : rangeEnd;\n\n return createCharacterIterator(itStart, !!backward, itEnd, characterOptions);\n }\n\n function getRangeCharacters(session, range, characterOptions) {\n\n var chars = [], it = createRangeCharacterIterator(session, range, characterOptions), pos;\n while ( (pos = it.next()) ) {\n chars.push(pos);\n }\n\n it.dispose();\n return chars;\n }\n\n function isWholeWord(startPos, endPos, wordOptions) {\n var range = api.createRange(startPos.node);\n range.setStartAndEnd(startPos.node, startPos.offset, endPos.node, endPos.offset);\n return !range.expand(\"word\", { wordOptions: wordOptions });\n }\n\n function findTextFromPosition(initialPos, searchTerm, isRegex, searchScopeRange, findOptions) {\n var backward = isDirectionBackward(findOptions.direction);\n var it = createCharacterIterator(\n initialPos,\n backward,\n initialPos.session.getRangeBoundaryPosition(searchScopeRange, backward),\n findOptions.characterOptions\n );\n var text = \"\", chars = [], pos, currentChar, matchStartIndex, matchEndIndex;\n var result, insideRegexMatch;\n var returnValue = null;\n\n function handleMatch(startIndex, endIndex) {\n var startPos = chars[startIndex].previousVisible();\n var endPos = chars[endIndex - 1];\n var valid = (!findOptions.wholeWordsOnly || isWholeWord(startPos, endPos, findOptions.wordOptions));\n\n return {\n startPos: startPos,\n endPos: endPos,\n valid: valid\n };\n }\n\n while ( (pos = it.next()) ) {\n currentChar = pos.character;\n if (!isRegex && !findOptions.caseSensitive) {\n currentChar = currentChar.toLowerCase();\n }\n\n if (backward) {\n chars.unshift(pos);\n text = currentChar + text;\n } else {\n chars.push(pos);\n text += currentChar;\n }\n\n if (isRegex) {\n result = searchTerm.exec(text);\n if (result) {\n matchStartIndex = result.index;\n matchEndIndex = matchStartIndex + result[0].length;\n if (insideRegexMatch) {\n // Check whether the match is now over\n if ((!backward && matchEndIndex < text.length) || (backward && matchStartIndex > 0)) {\n returnValue = handleMatch(matchStartIndex, matchEndIndex);\n break;\n }\n } else {\n insideRegexMatch = true;\n }\n }\n } else if ( (matchStartIndex = text.indexOf(searchTerm)) != -1 ) {\n returnValue = handleMatch(matchStartIndex, matchStartIndex + searchTerm.length);\n break;\n }\n }\n\n // Check whether regex match extends to the end of the range\n if (insideRegexMatch) {\n returnValue = handleMatch(matchStartIndex, matchEndIndex);\n }\n it.dispose();\n\n return returnValue;\n }\n\n function createEntryPointFunction(func) {\n return function() {\n var sessionRunning = !!currentSession;\n var session = getSession();\n var args = [session].concat( util.toArray(arguments) );\n var returnValue = func.apply(this, args);\n if (!sessionRunning) {\n endSession();\n }\n return returnValue;\n };\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the Rangy Range object\n\n function createRangeBoundaryMover(isStart, collapse) {\n /*\n Unit can be \"character\" or \"word\"\n Options:\n\n - includeTrailingSpace\n - wordRegex\n - tokenizer\n - collapseSpaceBeforeLineBreak\n */\n return createEntryPointFunction(\n function(session, unit, count, moveOptions) {\n if (typeof count == UNDEF) {\n count = unit;\n unit = CHARACTER;\n }\n moveOptions = createNestedOptions(moveOptions, defaultMoveOptions);\n\n var boundaryIsStart = isStart;\n if (collapse) {\n boundaryIsStart = (count >= 0);\n this.collapse(!boundaryIsStart);\n }\n var moveResult = movePositionBy(session.getRangeBoundaryPosition(this, boundaryIsStart), unit, count, moveOptions.characterOptions, moveOptions.wordOptions);\n var newPos = moveResult.position;\n this[boundaryIsStart ? \"setStart\" : \"setEnd\"](newPos.node, newPos.offset);\n return moveResult.unitsMoved;\n }\n );\n }\n\n function createRangeTrimmer(isStart) {\n return createEntryPointFunction(\n function(session, characterOptions) {\n characterOptions = createOptions(characterOptions, defaultCharacterOptions);\n var pos;\n var it = createRangeCharacterIterator(session, this, characterOptions, !isStart);\n var trimCharCount = 0;\n while ( (pos = it.next()) && allWhiteSpaceRegex.test(pos.character) ) {\n ++trimCharCount;\n }\n it.dispose();\n var trimmed = (trimCharCount > 0);\n if (trimmed) {\n this[isStart ? \"moveStart\" : \"moveEnd\"](\n \"character\",\n isStart ? trimCharCount : -trimCharCount,\n { characterOptions: characterOptions }\n );\n }\n return trimmed;\n }\n );\n }\n\n extend(api.rangePrototype, {\n moveStart: createRangeBoundaryMover(true, false),\n\n moveEnd: createRangeBoundaryMover(false, false),\n\n move: createRangeBoundaryMover(true, true),\n\n trimStart: createRangeTrimmer(true),\n\n trimEnd: createRangeTrimmer(false),\n\n trim: createEntryPointFunction(\n function(session, characterOptions) {\n var startTrimmed = this.trimStart(characterOptions), endTrimmed = this.trimEnd(characterOptions);\n return startTrimmed || endTrimmed;\n }\n ),\n\n expand: createEntryPointFunction(\n function(session, unit, expandOptions) {\n var moved = false;\n expandOptions = createNestedOptions(expandOptions, defaultExpandOptions);\n var characterOptions = expandOptions.characterOptions;\n if (!unit) {\n unit = CHARACTER;\n }\n if (unit == WORD) {\n var wordOptions = expandOptions.wordOptions;\n var startPos = session.getRangeBoundaryPosition(this, true);\n var endPos = session.getRangeBoundaryPosition(this, false);\n\n var startTokenizedTextProvider = createTokenizedTextProvider(startPos, characterOptions, wordOptions);\n var startToken = startTokenizedTextProvider.nextEndToken();\n var newStartPos = startToken.chars[0].previousVisible();\n var endToken, newEndPos;\n\n if (this.collapsed) {\n endToken = startToken;\n } else {\n var endTokenizedTextProvider = createTokenizedTextProvider(endPos, characterOptions, wordOptions);\n endToken = endTokenizedTextProvider.previousStartToken();\n }\n newEndPos = endToken.chars[endToken.chars.length - 1];\n\n if (!newStartPos.equals(startPos)) {\n this.setStart(newStartPos.node, newStartPos.offset);\n moved = true;\n }\n if (newEndPos && !newEndPos.equals(endPos)) {\n this.setEnd(newEndPos.node, newEndPos.offset);\n moved = true;\n }\n\n if (expandOptions.trim) {\n if (expandOptions.trimStart) {\n moved = this.trimStart(characterOptions) || moved;\n }\n if (expandOptions.trimEnd) {\n moved = this.trimEnd(characterOptions) || moved;\n }\n }\n\n return moved;\n } else {\n return this.moveEnd(CHARACTER, 1, expandOptions);\n }\n }\n ),\n\n text: createEntryPointFunction(\n function(session, characterOptions) {\n return this.collapsed ?\n \"\" : getRangeCharacters(session, this, createOptions(characterOptions, defaultCharacterOptions)).join(\"\");\n }\n ),\n\n selectCharacters: createEntryPointFunction(\n function(session, containerNode, startIndex, endIndex, characterOptions) {\n var moveOptions = { characterOptions: characterOptions };\n if (!containerNode) {\n containerNode = getBody( this.getDocument() );\n }\n this.selectNodeContents(containerNode);\n this.collapse(true);\n this.moveStart(\"character\", startIndex, moveOptions);\n this.collapse(true);\n this.moveEnd(\"character\", endIndex - startIndex, moveOptions);\n }\n ),\n\n // Character indexes are relative to the start of node\n toCharacterRange: createEntryPointFunction(\n function(session, containerNode, characterOptions) {\n if (!containerNode) {\n containerNode = getBody( this.getDocument() );\n }\n var parent = containerNode.parentNode, nodeIndex = dom.getNodeIndex(containerNode);\n var rangeStartsBeforeNode = (dom.comparePoints(this.startContainer, this.endContainer, parent, nodeIndex) == -1);\n var rangeBetween = this.cloneRange();\n var startIndex, endIndex;\n if (rangeStartsBeforeNode) {\n rangeBetween.setStartAndEnd(this.startContainer, this.startOffset, parent, nodeIndex);\n startIndex = -rangeBetween.text(characterOptions).length;\n } else {\n rangeBetween.setStartAndEnd(parent, nodeIndex, this.startContainer, this.startOffset);\n startIndex = rangeBetween.text(characterOptions).length;\n }\n endIndex = startIndex + this.text(characterOptions).length;\n\n return {\n start: startIndex,\n end: endIndex\n };\n }\n ),\n\n findText: createEntryPointFunction(\n function(session, searchTermParam, findOptions) {\n // Set up options\n findOptions = createNestedOptions(findOptions, defaultFindOptions);\n\n // Create word options if we're matching whole words only\n if (findOptions.wholeWordsOnly) {\n // We don't ever want trailing spaces for search results\n findOptions.wordOptions.includeTrailingSpace = false;\n }\n\n var backward = isDirectionBackward(findOptions.direction);\n\n // Create a range representing the search scope if none was provided\n var searchScopeRange = findOptions.withinRange;\n if (!searchScopeRange) {\n searchScopeRange = api.createRange();\n searchScopeRange.selectNodeContents(this.getDocument());\n }\n\n // Examine and prepare the search term\n var searchTerm = searchTermParam, isRegex = false;\n if (typeof searchTerm == \"string\") {\n if (!findOptions.caseSensitive) {\n searchTerm = searchTerm.toLowerCase();\n }\n } else {\n isRegex = true;\n }\n\n var initialPos = session.getRangeBoundaryPosition(this, !backward);\n\n // Adjust initial position if it lies outside the search scope\n var comparison = searchScopeRange.comparePoint(initialPos.node, initialPos.offset);\n\n if (comparison === -1) {\n initialPos = session.getRangeBoundaryPosition(searchScopeRange, true);\n } else if (comparison === 1) {\n initialPos = session.getRangeBoundaryPosition(searchScopeRange, false);\n }\n\n var pos = initialPos;\n var wrappedAround = false;\n\n // Try to find a match and ignore invalid ones\n var findResult;\n while (true) {\n findResult = findTextFromPosition(pos, searchTerm, isRegex, searchScopeRange, findOptions);\n\n if (findResult) {\n if (findResult.valid) {\n this.setStartAndEnd(findResult.startPos.node, findResult.startPos.offset, findResult.endPos.node, findResult.endPos.offset);\n return true;\n } else {\n // We've found a match that is not a whole word, so we carry on searching from the point immediately\n // after the match\n pos = backward ? findResult.startPos : findResult.endPos;\n }\n } else if (findOptions.wrap && !wrappedAround) {\n // No result found but we're wrapping around and limiting the scope to the unsearched part of the range\n searchScopeRange = searchScopeRange.cloneRange();\n pos = session.getRangeBoundaryPosition(searchScopeRange, !backward);\n searchScopeRange.setBoundary(initialPos.node, initialPos.offset, backward);\n wrappedAround = true;\n } else {\n // Nothing found and we can't wrap around, so we're done\n return false;\n }\n }\n }\n ),\n\n pasteHtml: function(html) {\n this.deleteContents();\n if (html) {\n var frag = this.createContextualFragment(html);\n var lastChild = frag.lastChild;\n this.insertNode(frag);\n this.collapseAfter(lastChild);\n }\n }\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the Rangy Selection object\n\n function createSelectionTrimmer(methodName) {\n return createEntryPointFunction(\n function(session, characterOptions) {\n var trimmed = false;\n this.changeEachRange(function(range) {\n trimmed = range[methodName](characterOptions) || trimmed;\n });\n return trimmed;\n }\n );\n }\n\n extend(api.selectionPrototype, {\n expand: createEntryPointFunction(\n function(session, unit, expandOptions) {\n this.changeEachRange(function(range) {\n range.expand(unit, expandOptions);\n });\n }\n ),\n\n move: createEntryPointFunction(\n function(session, unit, count, options) {\n var unitsMoved = 0;\n if (this.focusNode) {\n this.collapse(this.focusNode, this.focusOffset);\n var range = this.getRangeAt(0);\n if (!options) {\n options = {};\n }\n options.characterOptions = createOptions(options.characterOptions, defaultCaretCharacterOptions);\n unitsMoved = range.move(unit, count, options);\n this.setSingleRange(range);\n }\n return unitsMoved;\n }\n ),\n\n trimStart: createSelectionTrimmer(\"trimStart\"),\n trimEnd: createSelectionTrimmer(\"trimEnd\"),\n trim: createSelectionTrimmer(\"trim\"),\n\n selectCharacters: createEntryPointFunction(\n function(session, containerNode, startIndex, endIndex, direction, characterOptions) {\n var range = api.createRange(containerNode);\n range.selectCharacters(containerNode, startIndex, endIndex, characterOptions);\n this.setSingleRange(range, direction);\n }\n ),\n\n saveCharacterRanges: createEntryPointFunction(\n function(session, containerNode, characterOptions) {\n var ranges = this.getAllRanges(), rangeCount = ranges.length;\n var rangeInfos = [];\n\n var backward = rangeCount == 1 && this.isBackward();\n\n for (var i = 0, len = ranges.length; i < len; ++i) {\n rangeInfos[i] = {\n characterRange: ranges[i].toCharacterRange(containerNode, characterOptions),\n backward: backward,\n characterOptions: characterOptions\n };\n }\n\n return rangeInfos;\n }\n ),\n\n restoreCharacterRanges: createEntryPointFunction(\n function(session, containerNode, saved) {\n this.removeAllRanges();\n for (var i = 0, len = saved.length, range, rangeInfo, characterRange; i < len; ++i) {\n rangeInfo = saved[i];\n characterRange = rangeInfo.characterRange;\n range = api.createRange(containerNode);\n range.selectCharacters(containerNode, characterRange.start, characterRange.end, rangeInfo.characterOptions);\n this.addRange(range, rangeInfo.backward);\n }\n }\n ),\n\n text: createEntryPointFunction(\n function(session, characterOptions) {\n var rangeTexts = [];\n for (var i = 0, len = this.rangeCount; i < len; ++i) {\n rangeTexts[i] = this.getRangeAt(i).text(characterOptions);\n }\n return rangeTexts.join(\"\");\n }\n )\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the core rangy object\n\n api.innerText = function(el, characterOptions) {\n var range = api.createRange(el);\n range.selectNodeContents(el);\n var text = range.text(characterOptions);\n return text;\n };\n\n api.createWordIterator = function(startNode, startOffset, iteratorOptions) {\n var session = getSession();\n iteratorOptions = createNestedOptions(iteratorOptions, defaultWordIteratorOptions);\n var startPos = session.getPosition(startNode, startOffset);\n var tokenizedTextProvider = createTokenizedTextProvider(startPos, iteratorOptions.characterOptions, iteratorOptions.wordOptions);\n var backward = isDirectionBackward(iteratorOptions.direction);\n\n return {\n next: function() {\n return backward ? tokenizedTextProvider.previousStartToken() : tokenizedTextProvider.nextEndToken();\n },\n\n dispose: function() {\n tokenizedTextProvider.dispose();\n this.next = function() {};\n }\n };\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n api.noMutation = function(func) {\n var session = getSession();\n func(session);\n endSession();\n };\n\n api.noMutation.createEntryPointFunction = createEntryPointFunction;\n\n api.textRange = {\n isBlockNode: isBlockNode,\n isCollapsedWhitespaceNode: isCollapsedWhitespaceNode,\n\n createPosition: createEntryPointFunction(\n function(session, node, offset) {\n return session.getPosition(node, offset);\n }\n )\n };\n });\n \n return rangy;\n}, this);","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","/**\n * Defines all supported event types by Editable.JS and provides default\n * implementations for them defined in {{#crossLink \"Behavior\"}}{{/crossLink}}\n *\n * @type {Object}\n */\nexport default {\n log: false,\n logErrors: true,\n editableClass: 'js-editable',\n editableDisabledClass: 'js-editable-disabled',\n pastingAttribute: 'data-editable-is-pasting',\n trimLeadingAndTrailingWhitespaces: true,\n boldMarkup: {\n type: 'tag',\n name: 'strong',\n attribs: {},\n trim: true\n },\n italicMarkup: {\n type: 'tag',\n name: 'em',\n attribs: {},\n trim: true\n },\n underlineMarkup: {\n type: 'tag',\n name: 'u',\n attribs: {},\n trim: false\n },\n linkMarkup: {\n type: 'tag',\n name: 'a',\n attribs: {},\n trim: true\n },\n\n // Rules that are applied when filtering pasted content\n pastedHtmlRules: {\n // Elements and their attributes to keep in pasted text\n // Note that elements not explicitly allowed here will not be removed, their\n // tags will get stripped but their content will be kept. Use `blacklistedElements`\n // to get rid of a whole element (tag+content)\n allowedElements: {\n 'a': {\n 'href': true,\n 'rel': true,\n 'target': true\n },\n 'strong': {},\n 'em': {},\n 'br': {}\n },\n allowedPlainTextElements: {\n 'br': {}\n },\n\n // Elements that have required attributes.\n // If these are not present the elements are filtered out.\n // Required attributes have to be present in the 'allowed' object\n // as well if they should not be filtered out.\n requiredAttributes: {\n 'a': ['href']\n },\n\n // Elements that should be transformed into other elements\n transformElements: {\n 'b': 'strong',\n 'i': 'em'\n },\n\n // A list of elements which should be split into paragraphs.\n splitIntoBlocks: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'blockquote'],\n\n // A list of HTML block level elements.\n blockLevelElements: [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p', 'pre', 'hr', 'blockquote',\n 'article', 'figure', 'header', 'footer', 'ul', 'ol', 'li', 'section', 'table', 'video'\n ],\n\n // A list of elements that will get completely removed when pasted. Their tags\n // and content (text content and child elements) will get removed.\n blacklistedElements: ['style', 'script'],\n\n keepInternalRelativeLinks: false,\n\n // Replace quotes in a pasted content with quotes from config.\n replaceQuotes: {\n // quotes: ['“', '”'],\n // singleQuotes: ['‘', '’'],\n // apostrophe: '’'\n }\n }\n}\n","import config from '../config'\n\n// Allows for safe error logging\n// Falls back to console.log if console.error is not available\nexport default function error () {\n if (config.logErrors === false) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (!global.console) return\n\n if (typeof console.error === 'function') return console.error(args)\n\n console.log(args)\n}\n","const toString = Object.prototype.toString\nconst htmlCharacters = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n}\n\n// TODO: replace with lodash methods\nexport function trimRight (text) {\n return text.replace(/\\s+$/, '')\n}\n\nexport function trimLeft (text) {\n return text.replace(/^\\s+/, '')\n}\n\nexport function trim (text) {\n return text.replace(/^\\s+|\\s+$/g, '')\n}\n\nexport function isString (obj) {\n return toString.call(obj) === '[object String]'\n}\n\n/**\n * Turn any string into a regular expression.\n * This can be used to search or replace a string conveniently.\n */\n\nexport function regexp (str, flags) {\n if (!flags) flags = 'g'\n const escapedStr = str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n return new RegExp(escapedStr, flags)\n}\n\n/**\n * Escape HTML characters <, > and &\n * Usage: escapeHtml('<div>')\n *\n * @param { String }\n * @param { Boolean } Optional. If true \" and ' will also be escaped.\n * @return { String } Escaped Html you can assign to innerHTML of an element.\n */\n\n// TODO: replace with npm.im/he\n\nexport function escapeHtml (s, forAttribute) {\n return s.replace(forAttribute ? /[&<>'\"]/g : /[&<>]/g, function (c) { // \"'\n return htmlCharacters[c]\n })\n}\n\n/**\n * Escape a string the browser way.\n */\n\nexport function browserEscapeHtml (str) {\n const div = document.createElement('div')\n div.appendChild(document.createTextNode(str))\n return div.innerHTML\n}\n\nexport function replaceLast (text, searchValue, replaceValue) {\n if (!text) return ''\n text = `${text}`\n if (!searchValue || replaceValue == null) return text\n const lastOccurrenceIndex = text.lastIndexOf(searchValue)\n if (lastOccurrenceIndex === -1) return text\n return `${\n text.slice(0, lastOccurrenceIndex)\n }${\n replaceValue\n }${\n text.slice(lastOccurrenceIndex + searchValue.length)\n }`\n}\n\nexport function endsWithSingleSpace (text) {\n return /\\S+\\s{1}$/.test(text)\n}\n","// DOM node types\n// https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType\n\nexport const elementNode = 1\nexport const attributeNode = 2\nexport const textNode = 3\nexport const cdataSectionNode = 4\nexport const entityReferenceNode = 5\nexport const entityNode = 6\nexport const processingInstructionNode = 7\nexport const commentNode = 8\nexport const documentNode = 9\nexport const documentTypeNode = 10\nexport const documentFragmentNode = 11\nexport const notationNode = 12\n","/**\n * @param {HTMLElement | Array | String} target\n * @param {Document} document\n */\nexport const domArray = (target, document) => {\n if (typeof target === 'string') return Array.from(document.querySelectorAll(target))\n if (target.tagName) return [target]\n if (Array.isArray(target)) return target\n // Support NodeList and jQuery arrays\n return Array.from(target)\n}\n\n/**\n * @param { HTMLElement | String } target\n * @param { Document } document\n * @returns { HTMLElement }\n */\nexport const domSelector = (target, document) => {\n if (typeof target === 'string') return document.querySelector(target)\n if (target.tagName) return target\n // Support NodeList and jQuery arrays\n if (target[0]) return target[0]\n return target\n}\n\nexport const createElement = (html, win = window) => {\n const el = win.document.createElement('div')\n el.innerHTML = html\n return el.firstElementChild\n}\n\n/**\n* Get the closest dom element matching a selector\n* @description\n* - If a textNode is passed, it will still find the correct element\n* - If a document is passed, it will return undefined\n* @param {Node} elem\n* @param {String} selector\n* @returns {HTMLElement|undefined}\n*/\nexport const closest = (elem, selector) => {\n if (!elem.closest) elem = elem.parentNode\n if (elem && elem.closest) return elem.closest(selector)\n}\n","import * as string from './util/string'\nimport * as nodeType from './node-type'\nimport config from './config'\nimport {closest} from './util/dom'\n\n/**\n * The parser module provides helper methods to parse html-chunks\n * manipulations and helpers for common tasks.\n * Provides DOM lookup helpers\n *\n * @module core\n * @submodule parser\n */\n\n/**\n * Get the editableJS host block of a node.\n *\n * @method getHost\n * @param {DOM Node}\n * @return {DOM Node}\n */\nexport function getHost (node) {\n node = (node.jquery ? node[0] : node)\n return closest(node, `.${config.editableClass}`)\n}\n\n/**\n * Get the index of a node so that\n * parent.childNodes[ getNodeIndex(node) ] would return the node again.\n *\n * @method getNodeIndex\n * @param {HTMLElement}\n */\nexport function getNodeIndex (node) {\n let index = 0\n while ((node = node.previousSibling) !== null) index++\n return index\n}\n\n/**\n * Check if node contains text or element nodes\n * whitespace counts too!\n *\n * @method isVoid\n * @param {HTMLElement}\n */\nexport function isVoid (node) {\n for (const child of node.childNodes) {\n if (child.nodeType === nodeType.textNode && !isVoidTextNode(child)) {\n return false\n }\n if (child.nodeType === nodeType.elementNode) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if node is a text node and completely empty without any whitespace\n *\n * @method isVoidTextNode\n * @param {HTMLElement}\n */\nexport function isVoidTextNode (node) {\n return node.nodeType === nodeType.textNode && !node.nodeValue\n}\n\n/**\n * Check if node is a text node and contains nothing but whitespace\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function isWhitespaceOnly (node) {\n return node.nodeType === nodeType.textNode && lastOffsetWithContent(node) === 0\n}\n\nexport function isLinebreak (node) {\n return node.nodeType === nodeType.elementNode && node.tagName === 'BR'\n}\n\n/**\n * Returns the last offset where the cursor can be positioned to\n * be at the visible end of its container.\n * Currently works only for empty text nodes (not empty tags)\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function lastOffsetWithContent (elem) {\n if (elem.nodeType === nodeType.textNode) return string.trimRight(elem.nodeValue).length\n\n let lastOffset = 0\n Array.from(elem.childNodes).reverse().every((node, index, nodes) => {\n if (isWhitespaceOnly(node) || isLinebreak(node)) return true\n\n lastOffset = nodes.length - index\n return false\n })\n return lastOffset\n}\n\nexport function isBeginningOfHost (host, container, offset) {\n if (container === host) return isStartOffset(container, offset)\n\n if (isStartOffset(container, offset)) {\n // The index of the element simulates a range offset\n // right before the element.\n const offsetInParent = getNodeIndex(container)\n return isBeginningOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isEndOfHost (host, container, offset) {\n if (container === host) return isEndOffset(container, offset)\n\n if (isEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isStartOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === 0\n\n if (container.childNodes.length === 0) return true\n\n if (\n container.childNodes.length === 1 &&\n container.firstChild.nodeType === nodeType.elementNode &&\n container.firstChild.getAttribute('data-editable') === 'remove'\n ) return true\n\n return container.childNodes[offset] === container.firstChild\n}\n\nexport function isEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === container.length\n\n if (container.childNodes.length === 0) return true\n\n if (offset > 0) return container.childNodes[offset - 1] === container.lastChild\n\n return false\n}\n\nexport function isTextEndOfHost (host, container, offset) {\n if (container === host) return isTextEndOffset(container, offset)\n\n if (isTextEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isTextEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isTextEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) {\n const text = string.trimRight(container.nodeValue)\n return offset >= text.length\n }\n\n if (container.childNodes.length === 0) return true\n\n return offset >= lastOffsetWithContent(container)\n}\n\nexport function isSameNode (target, source) {\n let i, len, attr\n\n if (target.nodeType !== source.nodeType) return false\n\n if (target.nodeName !== source.nodeName) return false\n\n for (i = 0, len = target.attributes.length; i < len; i++) {\n attr = target.attributes[i]\n if (source.getAttribute(attr.name) !== attr.value) return false\n }\n\n return true\n}\n\n/**\n * Return the deepest last child of a node.\n *\n * @method lastChild\n * @param {HTMLElement} container The container to iterate on.\n * @return {HTMLElement} The deepest last child in the container.\n */\nexport function lastChild (container) {\n return container.lastChild\n ? lastChild(container.lastChild)\n : container\n}\n\n/**\n * Obsolete version of {{#crossLink \"lastChild\"}}{{/crossLink}}.\n */\nexport function latestChild (container) {\n console.warn('Editable.js: Using obsolete function parser.latestCild(), use lastChild() instead')\n return lastChild(container)\n}\n\n/**\n * Checks if a documentFragment has no children.\n * Fragments without children can cause errors if inserted into ranges.\n *\n * @method isDocumentFragmentWithoutChildren\n * @param {HTMLElement} DOM node.\n * @return {Boolean}\n */\nexport function isDocumentFragmentWithoutChildren (fragment) {\n return fragment &&\n fragment.nodeType === nodeType.documentFragmentNode &&\n fragment.childNodes.length === 0\n}\n\n/**\n * Determine if an element behaves like an inline element.\n */\nexport function isInlineElement (window, element) {\n const styles = element.currentStyle || window.getComputedStyle(element, '')\n const display = styles.display\n switch (display) {\n case 'inline':\n case 'inline-block':\n return true\n default:\n return false\n }\n}\n","import rangy from 'rangy'\nimport error from './util/error'\nimport * as nodeType from './node-type'\n\n/**\n * Inspired by the Selection save and restore module for Rangy by Tim Down\n * Saves and restores ranges using invisible marker elements in the DOM.\n */\nlet boundaryMarkerId = 0\n\n// (U+FEFF) zero width no-break space\nconst markerTextChar = '\\ufeff'\n\nfunction isChildOf (parent, possibleChild) {\n for (let i = 0; i < parent.children.length; i++) {\n if (parent.children[i] === possibleChild) return true\n }\n return false\n}\n\nfunction startContainerIsChild (range) {\n const parent = range.commonAncestorContainer\n if (parent.nodeType === 3) return false // if we are on the text node it can't be a parent\n const possibleChild = range.startContainer.parentElement\n return isChildOf(parent, possibleChild)\n}\n\nfunction endContainerIsChild (range) {\n const parent = range.commonAncestorContainer\n if (parent.nodeType === 3) return false // if we are on the text node it can't be a parent\n const possibleChild = range.endContainer.parentElement\n return isChildOf(parent, possibleChild)\n}\n\nexport function insertRangeBoundaryMarker (range, atStart) {\n const container = range.commonAncestorContainer\n const directlyBeforeFormatTag = startContainerIsChild(range) && atStart\n const directlyAfterFormatTag = endContainerIsChild(range) && !atStart\n\n // If ownerDocument is null the commonAncestorContainer is window.document\n if (container.ownerDocument === null || container.ownerDocument === undefined) {\n error('Cannot save range: range is emtpy')\n }\n\n // Create the marker element containing a single\n // invisible character using DOM methods and insert it\n const doc = container.ownerDocument.defaultView.document\n const markerEl = doc.createElement('span')\n markerEl.id = `editable-range-boundary-${++boundaryMarkerId}`\n markerEl.setAttribute('data-editable', 'remove')\n markerEl.style.lineHeight = '0'\n markerEl.style.display = 'none'\n markerEl.appendChild(doc.createTextNode(markerTextChar))\n\n // if another tag is trailing exactly at the start or end, prepend\n // or append the marker element directly on the parent in order to prevent breaking HTML markup.\n if (directlyBeforeFormatTag) {\n range.endContainer.parentElement.insertBefore(markerEl, range.startContainer.parentElement)\n } else if (directlyAfterFormatTag) {\n // emulating insertAfter with nextSibling\n range.startContainer.parentElement.insertBefore(markerEl,\n range.endContainer.parentElement.nextSibling)\n } else {\n // Clone the Range and collapse to the appropriate boundary point\n const boundaryRange = range.cloneRange()\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(markerEl)\n }\n\n return markerEl\n}\n\nexport function setRangeBoundary (host, range, markerId, atStart) {\n const markerEl = getMarker(host, markerId)\n if (!markerEl) return console.log('Marker element has been removed. Cannot restore selection.')\n range[atStart ? 'setStartBefore' : 'setEndBefore'](markerEl)\n markerEl.remove()\n}\n\nexport function save (range) {\n let rangeInfo, startEl, endEl\n\n // insert markers\n if (range.collapsed) {\n endEl = insertRangeBoundaryMarker(range, false)\n rangeInfo = {\n markerId: endEl.id,\n collapsed: true\n }\n } else {\n endEl = insertRangeBoundaryMarker(range, false)\n startEl = insertRangeBoundaryMarker(range, true)\n\n rangeInfo = {\n startMarkerId: startEl.id,\n endMarkerId: endEl.id,\n collapsed: false\n }\n }\n\n // Adjust each range's boundaries to lie between its markers\n if (range.collapsed) {\n range.collapseBefore(endEl)\n } else {\n range.setEndBefore(endEl)\n range.setStartAfter(startEl)\n }\n\n return rangeInfo\n}\n\nexport function restore (host, rangeInfo) {\n if (rangeInfo.restored) return\n\n const range = rangy.createRange()\n if (rangeInfo.collapsed) {\n const markerEl = getMarker(host, rangeInfo.markerId)\n if (markerEl) {\n markerEl.style.display = 'inline'\n const previousNode = markerEl.previousSibling\n\n // Workaround for rangy issue 17\n if (previousNode && previousNode.nodeType === nodeType.textNode) {\n markerEl.remove()\n range.collapseToPoint(previousNode, previousNode.length)\n } else {\n range.collapseBefore(markerEl)\n markerEl.remove()\n }\n } else {\n console.log('Marker element has been removed. Cannot restore selection.')\n }\n } else {\n setRangeBoundary(host, range, rangeInfo.startMarkerId, true)\n setRangeBoundary(host, range, rangeInfo.endMarkerId, false)\n }\n\n range.normalizeBoundaries()\n return range\n}\n\nfunction getMarker (host, id) {\n return host.querySelector(`#${id}`)\n}\n","import rangy from 'rangy'\nimport * as nodeType from './node-type'\nimport * as rangeSaveRestore from './range-save-restore'\nimport * as parser from './parser'\nimport * as string from './util/string'\nimport {createElement} from './util/dom'\nimport config from './config'\n\nfunction restoreRange (host, range, func) {\n range = rangeSaveRestore.save(range)\n func()\n return rangeSaveRestore.restore(host, range)\n}\n\nconst zeroWidthSpace = /\\u200B/g\nconst zeroWidthNonBreakingSpace = /\\uFEFF/g\nconst whitespaceExceptSpace = /[^\\S ]/g\n\n// Clean up the Html.\nexport function tidyHtml (element) {\n // if (element.normalize) element.normalize()\n normalizeTags(element)\n}\n\n// Remove empty tags and merge consecutive tags (they must have the same\n// attributes).\n//\n// @method normalizeTags\n// @param {HTMLElement} element The element to process.\nexport function normalizeTags (element) {\n const fragment = document.createDocumentFragment()\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(element, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(element, 'lastChild')\n\n for (const node of element.childNodes) {\n // skip empty tags, so they'll get removed\n if (node.nodeName !== 'BR' && !node.textContent) continue\n\n if (node.nodeType === nodeType.elementNode && node.nodeName !== 'BR') {\n let sibling = node\n while ((sibling = sibling.nextSibling) !== null) {\n if (!parser.isSameNode(sibling, node)) break\n\n for (const siblingChild of sibling.childNodes) {\n node.appendChild(siblingChild.cloneNode(true))\n }\n\n sibling.remove()\n }\n\n normalizeTags(node)\n }\n\n fragment.appendChild(node.cloneNode(true))\n }\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(fragment)\n}\n\nexport function normalizeWhitespace (text) {\n return text.replace(whitespaceExceptSpace, ' ')\n}\n\n// Clean the element from character, tags, etc... added by the plugin logic.\n//\n// @method cleanInternals\n// @param {HTMLElement} element The element to process.\nexport function cleanInternals (element) {\n // Uses extract content for simplicity. A custom method\n // that does not clone the element could be faster if needed.\n element.innerHTML = extractContent(element, true)\n}\n\n// Extracts the content from a host element.\n// Does not touch or change the host. Just returns\n// the content and removes elements marked for removal by editable.\n//\n// @param {DOM node or document fragment} Element where to clean out the innerHTML.\n// If you pass a document fragment it will be empty after this call.\n// @param {Boolean} Flag whether to keep ui elements like spellchecking highlights.\n// @returns {String} The cleaned innerHTML of the passed element or document fragment.\nexport function extractContent (element, keepUiElements) {\n const innerHtml = (element.nodeType === nodeType.documentFragmentNode\n ? getInnerHtmlOfFragment(element)\n : element.innerHTML\n )\n .replace(zeroWidthNonBreakingSpace, '') // Used for forcing inline elements to have a height\n .replace(zeroWidthSpace, '<br>') // Used for cross-browser newlines\n\n const clone = document.createElement('div')\n clone.innerHTML = innerHtml\n unwrapInternalNodes(clone, keepUiElements)\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(clone, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(clone, 'lastChild')\n\n return clone.innerHTML\n}\n\nexport function getInnerHtmlOfFragment (documentFragment) {\n const div = document.createElement('div')\n div.appendChild(documentFragment)\n return div.innerHTML\n}\n\n// Create a document fragment from an html string\n// @param {String} e.g. 'some html <span>text</span>.'\nexport function createFragmentFromString (htmlString) {\n const wrapper = document.createElement('div')\n wrapper.innerHTML = htmlString\n\n const fragment = document.createDocumentFragment()\n while (wrapper.firstChild) fragment.appendChild(wrapper.firstChild)\n return fragment\n}\n\nexport function adoptElement (node, doc) {\n return node.ownerDocument !== doc\n ? doc.adoptNode(node)\n : node\n}\n\n// This is a slight variation of the cloneContents method of a rangyRange.\n// It will return a fragment with the cloned contents of the range\n// without the commonAncestorElement.\n//\n// @param {rangyRange}\n// @return {DocumentFragment}\nexport function cloneRangeContents (range) {\n const rangeFragment = range.cloneContents()\n const parent = rangeFragment.childNodes[0]\n const fragment = document.createDocumentFragment()\n while (parent.childNodes.length) fragment.appendChild(parent.childNodes[0])\n return fragment\n}\n\nfunction removeWhitespaces (node, type, firstCall = true) {\n let elem\n while ((elem = node[type])) {\n if (elem.nodeType === nodeType.textNode) {\n if (/^\\s+$/.test(elem.textContent)) node.removeChild(elem)\n else break\n } else if (elem.nodeName === 'BR') {\n elem.remove()\n } else {\n if (elem[type]) removeWhitespaces(elem, type, false)\n break\n }\n }\n\n if (!firstCall) return\n elem = node[type]\n if (elem?.nodeType !== nodeType.textNode) return\n // Remove whitespaces at the end or start of a block with content\n // e.g. ' Hello world' > 'Hello World'\n if (config.trimLeadingAndTrailingWhitespaces) {\n elem.textContent = elem.textContent.replace(type.startsWith('last') ? / +$/ : /^ +/, '')\n }\n}\n\n// Remove elements that were inserted for internal or user interface purposes\n//\n// @param {DOM node}\n// @param {Boolean} whether to keep ui elements like spellchecking highlights\n// Currently:\n// - Saved ranges\nexport function unwrapInternalNodes (sibling, keepUiElements) {\n while (sibling) {\n const nextSibling = sibling.nextSibling\n\n if (sibling.nodeType !== nodeType.elementNode) {\n sibling = nextSibling\n continue\n }\n\n const attr = sibling.getAttribute('data-editable')\n\n if (sibling.firstChild) unwrapInternalNodes(sibling.firstChild, keepUiElements)\n\n if (attr === 'remove' || (attr === 'ui-remove' && !keepUiElements)) {\n sibling.remove()\n } if (attr === 'unwrap' || (attr === 'ui-unwrap' && !keepUiElements)) {\n unwrap(sibling)\n }\n\n sibling = nextSibling\n }\n}\n\n// Get all tags that start or end inside the range\nexport function getTags (host, range, filterFunc) {\n const innerTags = getInnerTags(range, filterFunc)\n const ancestorTags = getAncestorTags(host, range, filterFunc)\n return innerTags.concat(ancestorTags)\n}\n\n// Get all ancestor tags that start or end inside the range\nexport function getAncestorTags (host, range, filterFunc) {\n const tags = []\n let node = range.commonAncestorContainer\n while (node !== host) {\n if (!filterFunc || filterFunc(node)) tags.push(node)\n node = node.parentNode\n }\n\n return tags\n}\n\nexport function getTagsByName (host, range, tagName) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === tagName.toUpperCase()\n })\n}\n\nexport function getTagsByNameAndAttributes (host, range, elem) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === elem.nodeName.toUpperCase() &&\n areSameAttributes(node.attributes, elem.attributes)\n })\n}\n\nexport function areSameAttributes (attrs1, attrs2) {\n if (attrs1.length !== attrs2.length) return false\n\n for (let i = 0; i < attrs1.length; i++) {\n const attr = attrs2[attrs1[i].name]\n if (!(attr && attr.value === attrs1[i].value)) return false\n }\n\n return true\n}\n\n// Get all tags that start or end inside the range\nexport function getInnerTags (range, filterFunc) {\n return range.getNodes([nodeType.elementNode], filterFunc)\n}\n\n// Get all tags whose text is completely within the current selection.\nexport function getContainedTags (range, filterFunc) {\n return range.getNodes([nodeType.elementNode], filterFunc)\n .filter(elem => range.containsNodeText(elem))\n}\n\n// Transform an array of elements into an array\n// of tagnames in uppercase\n//\n// @return example: ['STRONG', 'B']\nexport function getTagNames (elements = []) {\n return elements.map((element) => element.nodeName)\n}\n\nexport function isAffectedBy (host, range, tagName) {\n return getTags(host, range)\n .some((elem) => elem.nodeName === tagName.toUpperCase())\n}\n\n// select a whole element\nexport function selectNodeContents (element) {\n const range = rangy.createRange()\n range.selectNodeContents(element)\n return range\n}\n\n// Check if the range selects all of the elements contents,\n// not less or more.\n//\n// @param visible: Only compare visible text. That way it does not\n// matter if the user selects an additional whitespace or not.\nexport function isExactSelection (range, elem, visible) {\n const elemRange = rangy.createRange()\n elemRange.selectNodeContents(elem)\n\n if (!range.intersectsRange(elemRange)) return false\n\n let rangeText = range.toString()\n let elemText = (elem.jquery ? elem[0] : elem).textContent\n\n if (visible) {\n rangeText = string.trim(rangeText)\n elemText = string.trim(elemText)\n }\n\n return rangeText !== '' && rangeText === elemText\n}\n\nexport function expandTo (host, range, elem) {\n range.selectNodeContents(elem)\n return range\n}\n\nexport function toggleTag (host, range, elem) {\n const elems = getTagsByNameAndAttributes(host, range, elem)\n\n if (elems.length === 1 &&\n isExactSelection(range, elems[0], 'visible')) {\n return removeFormattingElem(host, range, elem)\n }\n\n return forceWrap(host, range, elem)\n}\n\nexport function isWrappable (range) {\n return range.canSurroundContents()\n}\n\nexport function forceWrap (host, range, elem) {\n let restoredRange = restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n\n // remove all tags if the range is not wrappable\n if (!isWrappable(restoredRange)) {\n restoredRange = restoreRange(host, restoredRange, () => {\n nuke(host, restoredRange)\n })\n }\n\n wrap(restoredRange, elem)\n return restoredRange\n}\n\nexport function wrap (range, elem) {\n if (!isWrappable(range)) {\n console.log('content.wrap(): can not surround range')\n return\n }\n\n if (typeof elem === 'string') elem = createElement(elem)\n range.surroundContents(elem)\n}\n\nexport function unwrap (elem) {\n elem = elem.jquery ? elem[0] : elem\n const parent = elem.parentNode\n while (elem.firstChild) parent.insertBefore(elem.firstChild, elem)\n parent.removeChild(elem)\n}\n\nexport function removeFormattingElem (host, range, elem) {\n return restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n}\n\nexport function removeFormatting (host, range, selector) {\n return restoreRange(host, range, () => {\n nuke(host, range, selector)\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nuke (host, range, selector) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!selector || elem.matches(selector))) {\n unwrap(elem)\n }\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeElem (host, range, node) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!node ||\n (elem.nodeName.toUpperCase() === node.nodeName.toUpperCase() &&\n areSameAttributes(elem.attributes, node.attributes)))) {\n unwrap(elem)\n }\n })\n}\n\n// Insert a single character (or string) before or after\n// the range.\nexport function insertCharacter (range, character, atStart) {\n const insertEl = document.createTextNode(character)\n const boundaryRange = range.cloneRange()\n\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(insertEl)\n range[atStart ? 'setStartBefore' : 'setEndAfter'](insertEl)\n range.normalizeBoundaries()\n}\n\n// Surround the range with characters like start and end quotes.\n//\n// @method surround\nexport function surround (host, range, startCharacter, endCharacter) {\n insertCharacter(range, endCharacter || startCharacter, false)\n insertCharacter(range, startCharacter, true)\n return range\n}\n\n// Removes a character from the text within a range.\n//\n// @method deleteCharacter\nexport function deleteCharacter (host, range, character) {\n if (!containsString(range, character)) return range\n\n range.splitBoundaries()\n const restoredRange = restoreRange(host, range, () => {\n const charRegexp = string.regexp(character)\n\n range.getNodes([nodeType.textNode], (node) => {\n return node.nodeValue.search(charRegexp) >= 0\n })\n .forEach((node) => {\n node.nodeValue = node.nodeValue.replace(charRegexp, '')\n })\n })\n\n restoredRange.normalizeBoundaries()\n return restoredRange\n}\n\nexport function containsString (range, str) {\n return range.toString().indexOf(str) >= 0\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeTag (host, range, tagName) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() === tagName.toUpperCase()) unwrap(elem)\n })\n}\n","import config from './config'\nimport * as content from './content'\n\nlet nextBlockId = 1\nconst state = {}\n\nexport const next = getSibling('nextElementSibling')\nexport const previous = getSibling('previousElementSibling')\n\nexport function init (elem, {normalize, plainText, shouldSpellcheck}) {\n setBlockId(elem)\n\n elem.setAttribute('contenteditable', true)\n elem.setAttribute('spellcheck', Boolean(shouldSpellcheck))\n elem.setAttribute('data-plaintext', Boolean(plainText))\n\n elem.classList.remove(config.editableDisabledClass)\n elem.classList.add(config.editableClass)\n\n if (normalize) content.tidyHtml(elem)\n}\n\n\nexport function disable (elem) {\n elem.removeAttribute('contenteditable')\n elem.removeAttribute('spellcheck')\n elem.removeAttribute('data-plaintext')\n\n setState(elem, undefined)\n\n elem.classList.remove(config.editableClass)\n elem.classList.add(config.editableDisabledClass)\n}\n\nexport function isPlainTextBlock (elem) {\n return elem.getAttribute('data-plaintext') === 'true'\n}\n\nexport function setBlockId (elem) {\n if (!elem.hasAttribute('data-editable')) {\n elem.setAttribute('data-editable', `id-${nextBlockId}`)\n nextBlockId += 1\n }\n}\n\n\nexport function getState (elem) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n return state[id]\n }\n}\n\n\nexport function setState (elem, data) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n state[id] = data\n }\n}\n\n\n// Helpers\n// -------\n\nfunction getSibling (type) {\n return function (element) {\n const sibling = element[type]\n return sibling && sibling.getAttribute('contenteditable')\n ? sibling\n : null\n }\n}\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const doubleQuotePairs = [\n ['«', '»'], // ch german, french\n ['»', '«'], // danish\n ['\"', '\"'], // danish, not specified\n ['“', '”'], // english US\n ['”', '”'], // swedish\n ['“', '“'], // chinese simplified\n ['„', '“'] // german\n]\nconst singleQuotePairs = [\n ['‘', '’'], // english UK\n ['‹', '›'], // ch german, french\n ['‚', '‘'], // german\n ['’', '’'], // swedish\n ['›', '‹'], // danish\n [`'`, `'`], // danish, not specified\n [`‘`, `’`] // chinese simplified\n]\n\nconst apostrophe = [\n '’', // german\n `'` // default\n]\nconst quotesRegex = /([‘’‹›‚'«»\"“”„])(?![^<]*?>)/g\n// whitespace end of tag, or any dash (normal, en or em-dash)\n// or any opening double quote\nconst beforeOpeningQuote = /\\s|[>\\-–—«»”\"“„]/\n\n// whitespace begin of tag, or any dash (normal, en or em-dash)\n// or any closing quote, or any punctuation\nconst afterClosingQuote = /\\s|[<\\-–—«»”\"“‘’‹›'.;?:,]/\nlet replacements\n\nexport function replaceAllQuotes (str, replaceQuotesRules) {\n replacements = replaceQuotesRules || {}\n replacements.quotes = replacements.quotes || [undefined, undefined]\n replacements.singleQuotes = replacements.singleQuotes || [undefined, undefined]\n\n const matches = getAllQuotes(str)\n if (matches.length > 0) {\n replaceMatchedQuotes(matches, 0)\n return replaceExistingQuotes(str, matches)\n }\n\n return str\n}\n\nfunction replaceMatchedQuotes (matches, position) {\n\n while (position < matches.length) {\n const closingTag = findClosingQuote(matches, position)\n\n if (closingTag) {\n matches[position].replace = closingTag.type === 'double'\n ? replacements.quotes[0]\n : replacements.singleQuotes[0]\n\n matches[closingTag.position].replace = closingTag.type === 'double'\n ? replacements.quotes[1]\n : replacements.singleQuotes[1]\n\n if (closingTag.position !== position + 1) {\n const nestedMatches = matches.slice(position + 1, closingTag.position)\n if (nestedMatches) {\n replaceMatchedQuotes(nestedMatches, 0)\n }\n }\n\n position = closingTag.position + 1\n } else {\n matches[position].replace = replaceApostrophe(matches[position].char)\n position += 1\n }\n }\n}\n\nfunction findClosingQuote (matches, position) {\n if (position === matches.length - 1) return\n const current = matches[position]\n const openingQuote = current.char\n\n if (current.before && !beforeOpeningQuote.test(current.before)) return\n\n const possibleClosingSingleQuotes = getPossibleClosingQuotes(openingQuote, singleQuotePairs)\n const possibleClosingDoubleQuotes = getPossibleClosingQuotes(openingQuote, doubleQuotePairs)\n for (let i = position + 1; i < matches.length; i++) {\n if ((matches[i].after && afterClosingQuote.test(matches[i].after)) || !matches[i].after) {\n if (possibleClosingSingleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'single'}\n }\n if (possibleClosingDoubleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'double'}\n }\n }\n }\n}\n\nfunction getPossibleClosingQuotes (openingQuote, pairs) {\n return pairs.filter(quotePair => quotePair[0] === openingQuote).map((quotePair) => quotePair[1])\n}\n\nfunction replaceApostrophe (quote) {\n if (apostrophe.includes(quote)) {\n return replacements.apostrophe\n }\n}\n\nfunction getAllQuotes (str) {\n return [...str.matchAll(quotesRegex)].map((match) => {\n const index = match.index\n return {\n char: match[1],\n before: index > 0 ? str[index - 1] : '',\n after: (index + 1) < str.length ? str[index + 1] : ''\n }\n })\n}\n\nfunction replaceExistingQuotes (str, matches) {\n let index = 0\n return str.replace(quotesRegex, (match) => {\n const replacement = matches[index].replace || matches[index].char\n index += 1\n return replacement\n })\n}\n","import config from './config'\nimport * as string from './util/string'\nimport * as nodeType from './node-type'\nimport * as quotes from './quotes'\nimport {isPlainTextBlock} from './block'\n\nlet allowedElements, allowedPlainTextElements, requiredAttributes, transformElements, blockLevelElements, replaceQuotes\nlet splitIntoBlocks, blacklistedElements\nconst whitespaceOnly = /^\\s*$/\nconst blockPlaceholder = '<!-- BLOCK -->'\nlet keepInternalRelativeLinks\n\nupdateConfig(config)\nexport function updateConfig (conf) {\n const rules = conf.pastedHtmlRules\n allowedElements = rules.allowedElements || {}\n allowedPlainTextElements = rules.allowedPlainTextElements || {}\n requiredAttributes = rules.requiredAttributes || {}\n transformElements = rules.transformElements || {}\n blacklistedElements = rules.blacklistedElements || []\n keepInternalRelativeLinks = rules.keepInternalRelativeLinks || false\n replaceQuotes = rules.replaceQuotes || {}\n\n blockLevelElements = {}\n rules.blockLevelElements.forEach((name) => { blockLevelElements[name] = true })\n splitIntoBlocks = {}\n rules.splitIntoBlocks.forEach((name) => { splitIntoBlocks[name] = true })\n}\n\nexport function paste (block, cursor, clipboardContent) {\n const document = block.ownerDocument\n block.setAttribute(config.pastingAttribute, true)\n\n if (cursor.isSelection) {\n cursor = cursor.deleteExactSurroundingTags()\n .deleteContainedTags()\n .deleteContent()\n }\n\n // Create a placeholder to help parse HTML\n const pasteHolder = document.createElement('div')\n pasteHolder.innerHTML = clipboardContent\n\n const isPlainText = isPlainTextBlock(block)\n const blocks = parseContent(pasteHolder, {plainText: isPlainText})\n\n block.removeAttribute(config.pastingAttribute)\n return {blocks, cursor}\n}\n\n/**\n * - Parse pasted content\n * - Split it up into blocks\n * - clean and normalize every block\n * - optionally strip the host location an anchorTag-href\n * www.livindocs.io/internalLink -> /internalLink\n *\n * @param {DOM node} A container where the pasted content is located.\n * @returns {Array of Strings} An array of cleaned innerHTML like strings.\n */\nexport function parseContent (element, {plainText = false} = {}) {\n const options = {\n allowedElements: plainText ? allowedPlainTextElements : allowedElements,\n keepInternalRelativeLinks: plainText ? false : keepInternalRelativeLinks\n }\n\n // Filter pasted content\n return filterHtmlElements(element, options)\n // Handle Blocks\n .split(blockPlaceholder)\n .map((entry) => string.trim(cleanWhitespace(replaceAllQuotes(entry))))\n .filter((entry) => !whitespaceOnly.test(entry))\n}\n\nfunction filterHtmlElements (elem, options) {\n return Array.from(elem.childNodes).reduce((content, child) => {\n if (blacklistedElements.indexOf(child.nodeName.toLowerCase()) !== -1) {\n return ''\n }\n\n // Keep internal relative links relative (on paste).\n if (options.keepInternalRelativeLinks && child.nodeName === 'A' && child.href) {\n const stripInternalHost = child.getAttribute('href').replace(window.location.origin, '')\n child.setAttribute('href', stripInternalHost)\n }\n\n if (child.nodeType === nodeType.elementNode) {\n const childContent = filterHtmlElements(child, options)\n return content + conditionalNodeWrap(child, childContent, options)\n }\n\n // Escape HTML characters <, > and &\n if (child.nodeType === nodeType.textNode) return content + string.escapeHtml(child.nodeValue)\n return content\n }, '')\n}\n\nfunction conditionalNodeWrap (child, content, options) {\n let nodeName = child.nodeName.toLowerCase()\n nodeName = transformNodeName(nodeName)\n\n if (shouldKeepNode(nodeName, child, options)) {\n const attributes = filterAttributes(nodeName, child)\n\n if (nodeName === 'br') return `<${nodeName + attributes}>`\n\n if (!whitespaceOnly.test(content)) {\n return `<${nodeName + attributes}>${content}</${nodeName}>`\n }\n\n return content\n }\n\n if (splitIntoBlocks[nodeName]) {\n return blockPlaceholder + content + blockPlaceholder\n }\n\n // prevent missing whitespace between text when block-level\n // elements are removed.\n if (blockLevelElements[nodeName]) return `${content} `\n\n return content\n}\n\n// returns string of concatenated attributes e.g. 'target=\"_blank\" rel=\"nofollow\" href=\"/test.com\"'\nfunction filterAttributes (nodeName, node) {\n return Array.from(node.attributes).reduce((attributes, {name, value}) => {\n if (allowedElements[nodeName][name] && value) {\n return `${attributes} ${name}=\"${value}\"`\n }\n return attributes\n }, '')\n}\n\nfunction transformNodeName (nodeName) {\n return transformElements[nodeName] || nodeName\n}\n\nfunction hasRequiredAttributes (nodeName, node) {\n const requiredAttrs = requiredAttributes[nodeName]\n if (!requiredAttrs) return true\n\n return !requiredAttrs.some((name) => !node.getAttribute(name))\n}\n\nfunction shouldKeepNode (nodeName, node, options) {\n return options.allowedElements[nodeName] && hasRequiredAttributes(nodeName, node)\n}\n\nfunction cleanWhitespace (str) {\n return str\n .replace(/\\n/g, ' ')\n .replace(/ {2,}/g, ' ')\n .replace(/(.)\\u00A0/g, (match, group) => group + (/[\\u0020]/.test(group)\n ? '\\u00A0'\n : ' '\n ))\n}\n\nfunction replaceAllQuotes (str) {\n if (replaceQuotes.quotes || replaceQuotes.singleQuotes || replaceQuotes.apostrophe) {\n return quotes.replaceAllQuotes(str, replaceQuotes)\n }\n\n return str\n}\n","import browser from 'bowser'\n\n/**\n* Check for contenteditable support\n*\n* (from Modernizr)\n* this is known to false positive in some mobile browsers\n* here is a whitelist of verified working browsers:\n* https://github.com/NielsLeenheer/html5test/blob/549f6eac866aa861d9649a0707ff2c0157895706/scripts/engine.js#L2083\n*/\nexport const contenteditable = typeof document.documentElement.contentEditable !== 'undefined'\n\nconst parser = browser.getParser(window.navigator.userAgent)\nconst browserEngine = parser.getEngineName()\nconst webKit = browserEngine === 'WebKit'\n\n/**\n * Check selectionchange event (supported in IE, Chrome, Firefox and Safari)\n * Firefox supports it since version 52 (2017).\n * Opera has no support as of 2021.\n */\nconst hasNativeSelectionchangeSupport = (document) => {\n const doc = document\n const osc = doc.onselectionchange\n if (osc !== undefined) {\n try {\n doc.onselectionchange = 0\n return doc.onselectionchange === null\n } catch (e) {\n } finally {\n doc.onselectionchange = osc\n }\n }\n return false\n}\n\nexport const selectionchange = hasNativeSelectionchangeSupport(document)\n\n// See Keyboard.prototype.preventContenteditableBug for more information.\nexport const contenteditableSpanBug = !!webKit\n","// Eventable Mixin.\n//\n// Simple mixin to add event emitter methods to an object (Publish/Subscribe).\n//\n// Add on, off and notify methods to an object:\n// eventable(obj)\n//\n// publish an event:\n// obj.notify(context, 'action', param1, param2)\n//\n// Optionally pass a context that will be applied to every event:\n// eventable(obj, context)\n//\n// With this publishing can omit the context argument:\n// obj.notify('action', param1, param2)\n//\n// Subscribe to a 'channel'\n// obj.on('action', funtion(param1, param2){ ... })\n//\n// Unsubscribe an individual listener:\n// obj.off('action', method)\n//\n// Unsubscribe all listeners of a channel:\n// obj.off('action')\n//\n// Unsubscribe all listeners of all channels:\n// obj.off()\n\nexport default function eventable (obj, notifyContext) {\n const events = getEventableModule(notifyContext)\n obj.on = events.on\n obj.off = events.off\n obj.notify = events.notify\n}\n\nfunction getEventableModule (notifyContext) {\n let listeners = {}\n\n function addListener (events, listener) {\n events.split(' ').forEach(event => {\n listeners[event] = listeners[event] || []\n listeners[event].unshift(listener)\n })\n }\n\n function removeListener (event, listener) {\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n const index = eventListeners.indexOf(listener)\n if (index < 0) return\n\n eventListeners.splice(index, 1)\n }\n\n // Public Methods\n return {\n on (event, listener) {\n if (arguments.length === 2) {\n addListener(event, listener)\n } else if (arguments.length === 1) {\n for (const eventType in event) addListener(eventType, event[eventType])\n }\n return this\n },\n\n off (event, listener) {\n if (arguments.length === 2) {\n removeListener(event, listener)\n } else if (arguments.length === 1) {\n listeners[event] = []\n } else {\n listeners = {}\n }\n },\n\n notify (context, event) {\n const args = Array.from(arguments)\n\n if (notifyContext) {\n event = context\n context = notifyContext\n args.splice(0, 1)\n } else {\n args.splice(0, 2)\n }\n\n if (this.switchContext) {\n const nextEvent = this.switchContext.events.shift()\n if (event !== nextEvent) this.switchContext = undefined\n }\n\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n // Execute the newest listeners first.\n // Stop if a listener returns false.\n eventListeners.every((listener) => listener.apply(context, args) !== false)\n }\n }\n}\n","// code from mdn: https://developer.mozilla.org/en-US/docs/Web/API/window.scrollX\nfunction getScrollPosition (win) {\n const x = (win.pageXOffset !== undefined) ? win.pageXOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollLeft\n const y = (win.pageYOffset !== undefined) ? win.pageYOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollTop\n return {x, y}\n}\n\nexport {getScrollPosition}\n","import rangy from 'rangy'\nimport * as viewport from './util/viewport'\n\nimport * as content from './content'\nimport * as parser from './parser'\nimport * as string from './util/string'\nimport {elementNode, documentFragmentNode} from './node-type'\nimport error from './util/error'\nimport * as rangeSaveRestore from './range-save-restore'\n// import printRange from './util/print_range'\nimport {closest} from './util/dom'\n\n/**\n * The Cursor module provides a cross-browser abstraction layer for cursor.\n *\n * @module core\n * @submodule cursor\n */\n\nexport default class Cursor {\n\n static findHost (elem, selector) {\n return closest(elem, selector)\n }\n\n /**\n * Class for the Cursor module.\n *\n * @class Cursor\n * @constructor\n */\n constructor (editableHost, rangyRange) {\n this.setHost(editableHost)\n this.range = rangyRange\n this.isCursor = true\n }\n\n // Get all tags that affect the current selection. Optionally pass a\n // method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the returned\n // DOM Nodes.\n // @return {Array of DOM Nodes}\n getTags (filterFunc) {\n return content.getTags(this.host, this.range, filterFunc)\n }\n\n // Get the names of all tags that affect the current selection. Optionally\n // pass a method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the DOM\n // Nodes whose names are returned.\n // @return {Array<String> of tag names}\n getTagNames (filterFunc) {\n return content.getTagNames(this.getTags(filterFunc))\n }\n\n // Get all tags of the specified type that affect the current selection.\n //\n // @method getTagsByName\n // @param {String} tagName. E.g. 'a' to get all links.\n // @return {Array of DOM Nodes}\n getTagsByName (tagName) {\n return content.getTagsByName(this.host, this.range, tagName)\n }\n\n // Get all tags that are completely within the current selection.\n getInnerTags (filterFunc) {\n return content.getInnerTags(this.range, filterFunc)\n }\n\n // Get all tags whose text is completely within the current selection.\n getContainedTags (filterFunc) {\n return content.getContainedTags(this.range, filterFunc)\n }\n\n // Get all tags that surround the current selection.\n getAncestorTags (filterFunc) {\n return content.getAncestorTags(this.host, this.range, filterFunc)\n }\n\n isAtEnd () {\n return parser.isEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtTextEnd () {\n return parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtLastLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(false)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range.nativeRange, this.win)\n return isCloseTo(hostCoords.bottom, cursorCoords.bottom)\n }\n\n isAtFirstLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(true)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range.nativeRange, this.win)\n return isCloseTo(hostCoords.top, cursorCoords.top)\n }\n\n isAtBeginning () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n )\n }\n\n // Insert content before the cursor\n //\n // @param {String, DOM node or document fragment}\n insertBefore (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n\n let preceedingElement = element\n if (element.nodeType === documentFragmentNode) {\n const lastIndex = element.childNodes.length - 1\n preceedingElement = element.childNodes[lastIndex]\n }\n\n this.range.insertNode(element)\n this.range.setStartAfter(preceedingElement)\n this.range.setEndAfter(preceedingElement)\n }\n\n // Insert content after the cursor\n //\n // @param {String, DOM node or document fragment}\n insertAfter (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n this.range.insertNode(element)\n }\n\n // Alias for #setVisibleSelection()\n setSelection () {\n this.setVisibleSelection()\n }\n\n setVisibleSelection () {\n if (this.win.document.activeElement !== this.host) {\n const {x, y} = viewport.getScrollPosition(this.win)\n this.win.scrollTo(x, y)\n }\n rangy.getSelection(this.win).setSingleRange(this.range)\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // before() will return a document fragment containing a text node 'fo'.\n //\n // @returns {Document Fragment} content before the cursor or selection.\n before () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return content.cloneRangeContents(range)\n }\n\n textBefore () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return range.toString()\n }\n\n // Same as before() but returns a string.\n beforeHtml () {\n return content.getInnerHtmlOfFragment(this.before())\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // after() will return a document fragment containing a text node 'o'.\n //\n // @returns {Document Fragment} content after the cursor or selection.\n after () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return content.cloneRangeContents(range)\n }\n\n textAfter () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return range.toString()\n }\n\n // Same as after() but returns a string.\n afterHtml () {\n return content.getInnerHtmlOfFragment(this.after())\n }\n\n getBoundingClientRect () {\n return this.range.nativeRange.getBoundingClientRect()\n }\n\n // Get the BoundingClientRect of the cursor.\n // The returned values are transformed to be absolute\n // (relative to the document).\n getCoordinates (positioning = 'absolute') {\n const coords = this.range.nativeRange.getBoundingClientRect()\n if (positioning === 'fixed') return coords\n\n\n // translate into absolute positions\n const {x, y} = viewport.getScrollPosition(this.win)\n return {\n top: coords.top + y,\n bottom: coords.bottom + y,\n left: coords.left + x,\n right: coords.right + x,\n height: coords.height,\n width: coords.width\n }\n }\n\n moveBefore (element) {\n this.updateHost(element)\n this.range.setStartBefore(element)\n this.range.setEndBefore(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n moveAfter (element) {\n this.updateHost(element)\n this.range.setStartAfter(element)\n this.range.setEndAfter(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the beginning of the host.\n moveAtBeginning (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(true)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the end of the host.\n moveAtEnd (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(false)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor after the last visible character of the host.\n moveAtTextEnd (element) {\n return this.moveAtEnd(parser.lastChild(element))\n }\n\n setHost (element) {\n if (element.jquery) element = element[0]\n this.host = element\n this.win = (element === undefined || element === null) ? window : element.ownerDocument.defaultView\n }\n\n updateHost (element) {\n const host = parser.getHost(element)\n if (!host) error('Can not set cursor outside of an editable block')\n this.setHost(host)\n }\n\n retainVisibleSelection (callback) {\n this.save()\n callback()\n this.restore()\n this.setVisibleSelection()\n }\n\n save () {\n this.savedRangeInfo = rangeSaveRestore.save(this.range)\n this.savedRangeInfo.host = this.host\n }\n\n restore () {\n if (!this.savedRangeInfo) error('Could not restore selection')\n\n this.host = this.savedRangeInfo.host\n this.range = rangeSaveRestore.restore(this.host, this.savedRangeInfo)\n this.savedRangeInfo = undefined\n }\n\n equals (cursor) {\n if (!cursor) return false\n\n if (!cursor.host) return false\n if (!cursor.host.isEqualNode(this.host)) return false\n\n if (!cursor.range) return false\n if (!cursor.range.equals(this.range)) return false\n\n return true\n }\n\n // Create an element with the correct ownerWindow\n // (see: http://www.w3.org/DOM/faq.html#ownerdoc)\n createElement (tagName, attributes = {}) {\n const element = this.win.document.createElement(tagName)\n for (const attributeName in attributes) {\n const attributeValue = attributes[attributeName]\n element.setAttribute(attributeName, attributeValue)\n }\n return element\n }\n\n createTextNode (text) {\n return this.win.document.createTextNode(text)\n }\n\n // Make sure a node has the correct ownerWindow\n // (see: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode)\n adoptElement (node) {\n return content.adoptElement(node, this.win.document)\n }\n\n // Currently we call triggerChange manually after format changes.\n // This is to prevent excessive triggering of the change event during\n // merge or split operations or other manipulations by scripts.\n triggerChange () {\n const event = document.createEvent('HTMLEvents')\n event.initEvent('formatEditable', true, false)\n this.host.dispatchEvent(event)\n }\n}\n\n\n/**\n* Get position of the range or cursor\n*\n* Can be used to reliably get the boundingClientRect without\n* some any of the drawbacks that the native range has.\n*\n* With the native range.getClientBoundingRect(), newlines are\n* not considered when calculating the position\n*\n* @param {Range} range\n* @param {Window} win\n*/\nfunction getRangeBoundingClientRect (range, win) {\n if (range.startContainer.nodeType !== elementNode) return range.getBoundingClientRect()\n const el = win.document.createElement('span')\n el.setAttribute('doc-editable', 'unwrap')\n range.insertNode(el)\n const coords = el.getBoundingClientRect()\n el.remove()\n return coords\n}\n\nfunction isCloseTo (a, b) {\n if (a === b) return true\n if (Math.abs(a - b) <= 2) return true\n return false\n}\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import {textNode} from './node-type'\n\n// A DOM node iterator.\n//\n// Has the ability to replace nodes on the fly and continue\n// the iteration.\nexport default class NodeIterator {\n\n constructor (root, method) {\n this.current = this.previous = this.nextNode = this.root = root\n this.iteratorFunc = this[method || 'getNext']\n }\n\n [Symbol.iterator] () {\n return this\n }\n\n getNextTextNode () {\n let next\n while ((next = this.getNext())) {\n if (next.nodeType === textNode && next.data !== '') return next\n }\n }\n\n getPreviousTextNode () {\n let prev\n while ((prev = this.getPrevious())) {\n if (prev.nodeType === textNode && prev.data !== '') return prev\n }\n }\n\n next () {\n const value = this.iteratorFunc()\n return value ? {value} : {done: true}\n }\n\n getNext () {\n let n = this.current = this.nextNode\n let child = this.nextNode = undefined\n if (this.current) {\n child = n.firstChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.nextNode = child\n } else {\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n getPrevious () {\n let n = this.current = this.previous\n let child = this.previous = undefined\n if (this.current) {\n child = n.lastChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.previous = child\n } else {\n while ((n !== this.root) && !(this.previous = n.previousSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n replaceCurrent (replacement) {\n this.current = replacement\n this.nextNode = undefined\n this.previous = undefined\n let n = this.current\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n}\n","import rangy from 'rangy'\n\nimport NodeIterator from './node-iterator'\nimport * as nodeType from './node-type'\n\nexport default {\n\n // Get the text from an editable block with a NodeIterator.\n // This must work the same as when later iterating over the text\n // in highlightMatches().\n extractText (element) {\n let text = ''\n getText(element, (part) => { text += part })\n return text\n },\n\n // Go through the element to highlight the matches while keeping the\n // existing html valid (highlighting a match may require inserting multiple\n // elements).\n //\n // @params\n // - matches\n // Array of positions in the string to highlight:\n // e.g [{startIndex: 0, endIndex: 1, match: 'The'}]\n highlightMatches (element, matches) {\n if (!matches || matches.length === 0) {\n return\n }\n\n const iterator = new NodeIterator(element)\n let currentMatchIndex = 0\n let totalOffset = 0\n let currentMatch = matches[currentMatchIndex]\n let portions = []\n let next\n let wordId\n let textNode\n while ((next = iterator.getNext())) {\n // Account for <br> elements\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n textNode = next\n } else if (next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n totalOffset += 1\n continue\n } else {\n continue\n }\n\n const nodeText = textNode.data\n let nodeEndOffset = totalOffset + nodeText.length\n if (currentMatch.startIndex < nodeEndOffset && totalOffset < currentMatch.endIndex) {\n // get portion position (fist, last or in the middle)\n const isFirstPortion = totalOffset <= currentMatch.startIndex\n const isLastPortion = nodeEndOffset >= currentMatch.endIndex\n\n if (isFirstPortion) {\n wordId = currentMatch.id || currentMatch.startIndex\n }\n\n // calculate offset and length\n let offset\n if (isFirstPortion) {\n offset = currentMatch.startIndex - totalOffset\n } else {\n offset = 0\n }\n\n let length\n if (isLastPortion) {\n length = (currentMatch.endIndex - totalOffset) - offset\n } else {\n length = nodeText.length - offset\n }\n\n // create portion object\n const portion = {\n element: textNode,\n text: nodeText.substring(offset, offset + length),\n offset,\n length,\n isLastPortion,\n wordId\n }\n\n portions.push(portion)\n\n if (isLastPortion) {\n const lastNode = this.wrapMatch(portions, currentMatch.marker, currentMatch.title)\n iterator.replaceCurrent(lastNode)\n\n // recalculate nodeEndOffset if we have to replace the current node.\n nodeEndOffset = totalOffset + portion.length + portion.offset\n\n portions = []\n currentMatchIndex += 1\n if (currentMatchIndex < matches.length) {\n currentMatch = matches[currentMatchIndex]\n }\n }\n }\n\n totalOffset = nodeEndOffset\n }\n },\n\n // @return the last wrapped element\n wrapMatch (portions, stencilElement, title) {\n return portions.map((portion) => this.wrapPortion(portion, stencilElement, title)).pop()\n },\n\n wrapPortion (portion, stencilElement, title) {\n const range = rangy.createRange()\n range.setStart(portion.element, portion.offset)\n range.setEnd(portion.element, portion.offset + portion.length)\n const node = stencilElement.cloneNode(true)\n node.setAttribute('data-word-id', portion.wordId)\n if (title) node.setAttribute('title', title)\n range.surroundContents(node)\n\n // Fix a weird behaviour where an empty text node is inserted after the range\n if (node.nextSibling) {\n const next = node.nextSibling\n if (next.nodeType === nodeType.textNode && next.data === '') {\n next.remove()\n }\n }\n\n return node\n }\n\n}\n\n// Extract the text of an element.\n// This has two notable behaviours:\n// - It uses a NodeIterator which will skip elements\n// with data-editable=\"remove\"\n// - It returns a \\n for <br> elements\n// (The only block level element allowed inside of editables)\nfunction getText (element, callback) {\n const iterator = new NodeIterator(element)\n let next\n while ((next = iterator.getNext())) {\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n callback(next.data)\n } else if (next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n callback('\\n')\n }\n }\n}\n","export default class WordHighlighting {\n\n // @param markerNode {DOM Node}\n // @param matchMode {String} either 'word' or 'text'\n constructor (markerNode, matchMode = 'word') {\n this.marker = markerNode\n this.matchMode = matchMode\n }\n\n isElement (obj) {\n try {\n if (!obj) return false\n return obj instanceof obj.ownerDocument?.defaultView.HTMLElement\n } catch (e) {\n // Browsers not supporting W3 DOM2 don't have HTMLElement and\n // an exception is thrown and we end up here. Testing some\n // properties that all elements have (works on IE7)\n return (typeof obj === 'object') &&\n (obj.nodeType === 1) && (typeof obj.style === 'object') &&\n (typeof obj.ownerDocument === 'object')\n }\n }\n\n findMatches (text, highlights) {\n if (!text || text === '' || !this.isElement(this.marker)) return\n\n if (highlights && highlights.length > 0) {\n return this.searchMatches(text, highlights)\n }\n }\n\n searchMatches (text, highlights) {\n const createRegex = this.matchMode === 'word'\n ? createWordRegex\n : createHighlightRegex\n\n const regex = createRegex(highlights)\n const matches = [...text.matchAll(regex)]\n\n return matches.map((entry) => this.prepareMatch(entry))\n }\n\n prepareMatch (match) {\n let startIndex\n let matchedText\n if (this.matchMode === 'word') {\n startIndex = match.index + match[1].length\n matchedText = match[2]\n } else {\n startIndex = match.index\n matchedText = match[0]\n }\n\n return {\n startIndex,\n endIndex: startIndex + matchedText.length,\n match: matchedText,\n marker: this.marker\n }\n }\n\n}\n\nfunction createHighlightRegex (words) {\n const escapedWords = (words || []).map((word) => escapeRegEx(word))\n\n const regex = `(${escapedWords.join('|')})`\n return new RegExp(regex, 'g')\n}\n\n// Regex to find whole words within a string\n//\n// Unicode character blocks for letters.\n// See: http://jrgraphix.net/research/unicode_blocks.php\n//\n// \\\\u0041-\\\\u005A A-Z (Basic Latin)\n// \\\\u0061-\\\\u007A a-z (Basic Latin)\n// \\\\u0030-\\\\u0039 0-9 (Basic Latin)\n// \\\\u00AA ª (Latin-1 Supplement)\n// \\\\u00B5 µ (Latin-1 Supplement)\n// \\\\u00BA º (Latin-1 Supplement)\n// \\\\u00C0-\\\\u00D6 À-Ö (Latin-1 Supplement)\n// \\\\u00D8-\\\\u00F6 Ø-ö (Latin-1 Supplement)\n// \\\\u00F8-\\\\u00FF ø-ÿ (Latin-1 Supplement)\n// \\\\u0100-\\\\u017F Ā-ſ (Latin Extended-A)\n// \\\\u0180-\\\\u024F ƀ-ɏ (Latin Extended-B)\nconst letterChars = '\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u0030-\\\\u0039\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u00FF\\\\u0100-\\\\u017F\\\\u0180-\\\\u024F'\n\nfunction createWordRegex (words) {\n const escapedWords = (words || []).map((word) => escapeRegEx(word))\n\n // (notLetter|^)(words)(?=notLetter|$)\n const regex = `([^${letterChars}]|^)` +\n `(${escapedWords.join('|')})` +\n `(?=[^${letterChars}]|$)`\n\n return new RegExp(regex, 'g')\n}\n\nfunction escapeRegEx (s) {\n return String(s).replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1')\n}\n","import rangy from 'rangy'\nimport * as content from './content'\nimport highlightText from './highlight-text'\nimport TextHighlighting from './plugins/highlighting/text-highlighting'\nimport {closest, createElement} from './util/dom'\n\nfunction isInHost (elem, host) {\n return closest(elem, '[data-editable]:not([data-word-id])') === host\n}\n\nconst highlightSupport = {\n\n highlightText (editableHost, text, highlightId, type) {\n if (this.hasHighlight(editableHost, highlightId)) return\n const blockText = highlightText.extractText(editableHost)\n\n const marker = `<span class=\"highlight-${type}\"></span>`\n const markerNode = highlightSupport.createMarkerNode(marker, type, this.win)\n\n const textSearch = new TextHighlighting(markerNode, 'text')\n const matches = textSearch.findMatches(blockText, [text])\n\n if (matches && matches.length) {\n if (highlightId) matches[0].id = highlightId\n highlightText.highlightMatches(editableHost, matches)\n return matches[0].startIndex\n }\n },\n\n\n // This function was changed to track matches when text is added to the start of a component, but multiple white spaces break it in a strict sense\n // The function works in the editor and in browsers, but tests with multiple white spaces will fail.\n // Browsers change the white spaces to &nbsp and the function works, and the tests in highlight.spec.js have been updated to represent this.\n\n highlightRange (editableHost, text, highlightId, startIndex, endIndex, dispatcher, type = 'comment') {\n if (this.hasHighlight(editableHost, highlightId)) {\n this.removeHighlight(editableHost, highlightId)\n }\n const firstMarker = `<span class=\"highlight-${type}\"></span>`\n const markerNode = highlightSupport.createMarkerNode(firstMarker, type, this.win)\n const textSearch = new TextHighlighting(markerNode, 'text')\n const blockText = highlightText.extractText(editableHost)\n if (blockText === '') return -1 // the text was deleted so we can't highlight it\n const matchesArray = textSearch.findMatches(blockText, [text])\n const {actualStartIndex, actualEndIndex} = this.getIndex(matchesArray, startIndex, endIndex)\n const range = rangy.createRange()\n range.selectCharacters(editableHost, actualStartIndex, actualEndIndex)\n\n if (!isInHost(range.commonAncestorContainer, editableHost)) {\n return -1\n }\n\n const marker = highlightSupport.createMarkerNode(\n `<span class=\"highlight-${type}\" data-word-id=\"${highlightId}\"></span>`,\n type,\n this.win\n )\n const fragment = range.extractContents()\n marker.appendChild(fragment)\n range.deleteContents()\n range.insertNode(marker)\n highlightSupport.cleanupStaleMarkerNodes(editableHost, 'comment')\n if (dispatcher) {\n dispatcher.notify('change', editableHost)\n }\n return actualStartIndex\n },\n\n updateHighlight (editableHost, highlightId, addCssClass, removeCssClass) {\n if (!document.documentElement.classList) return\n\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n if (removeCssClass) elem.classList.remove(removeCssClass)\n if (addCssClass) elem.classList.add(addCssClass)\n }\n },\n\n removeHighlight (editableHost, highlightId, dispatcher) {\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n content.unwrap(elem)\n // in Chrome browsers the unwrap method leaves the host node split into 2 (lastChild !== firstChild)\n editableHost.normalize()\n if (dispatcher) dispatcher.notify('change', editableHost)\n }\n },\n\n hasHighlight (editableHost, highlightId) {\n const matches = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n return !!matches.length\n },\n\n extractHighlightedRanges (editableHost, type) {\n let findMarkersQuery = '[data-word-id]'\n if (type) findMarkersQuery += `[data-highlight=\"${type}\"]`\n const markers = editableHost.querySelectorAll(findMarkersQuery)\n if (!markers.length) return\n\n const groups = {}\n for (const marker of markers) {\n const highlightId = marker.getAttribute('data-word-id')\n if (!groups[highlightId]) {\n groups[highlightId] = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n }\n\n }\n\n const res = {}\n for (const highlightId in groups) {\n const position = this.extractMarkerNodePosition(editableHost, groups[highlightId])\n if (position) res[highlightId] = position\n }\n\n return res\n },\n\n extractMarkerNodePosition (editableHost, markers) {\n const range = rangy.createRange()\n if (markers.length > 1) {\n range.setStartBefore(markers[0])\n range.setEndAfter(markers[markers.length - 1])\n } else {\n range.selectNode(markers[0])\n }\n\n const textRange = range.toCharacterRange(editableHost)\n return {\n start: textRange.start,\n end: textRange.end,\n text: range.text(),\n nativeRange: range.nativeRange\n }\n },\n\n cleanupStaleMarkerNodes (editableHost, highlightType) {\n const nodes = editableHost.querySelectorAll(`span[data-highlight=\"${highlightType}\"]`)\n for (const node of nodes) {\n if (!node.textContent.length) {\n node.remove()\n }\n }\n },\n\n createMarkerNode (markerMarkup, highlightType, win) {\n const marker = createElement(markerMarkup, win)\n marker.setAttribute('data-editable', 'ui-unwrap')\n marker.setAttribute('data-highlight', highlightType)\n return marker\n },\n\n // This function checks to see if text has been added to the component before the comment\n // If it has, the start index is updated, otherwise it remains the same\n getIndex (matchesArray, startIndex, endIndex) {\n const newStartIndex = matchesArray.find((match) => {\n return match.startIndex >= startIndex // checks if the startIndex has increased\n })\n const actualStartIndex = newStartIndex ? newStartIndex.startIndex : startIndex\n const actualEndIndex = actualStartIndex ? (actualStartIndex + (endIndex - startIndex)) : endIndex\n\n return {actualStartIndex, actualEndIndex}\n }\n\n}\n\nexport default highlightSupport\n","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","\nimport 'rangy/lib/rangy-textrange'\nimport Cursor from './cursor'\nimport * as content from './content'\nimport * as parser from './parser'\nimport * as block from './block'\nimport config from './config'\nimport highlightSupport from './highlight-support'\nimport highlightText from './highlight-text'\n\n/**\n * The Selection module provides a cross-browser abstraction layer for range\n * and selection.\n *\n * @module core\n * @submodule selection\n */\n/**\n * Class that represents a selection and provides functionality to access or\n * modify the selection.\n *\n * @class Selection\n * @constructor\n */\n\nexport default class Selection extends Cursor {\n constructor () {\n super(...arguments)\n delete this.isCursor\n this.isSelection = true\n }\n\n // Get the text inside the selection.\n text () {\n return this.range.toString()\n }\n\n // Get the html inside the selection.\n html () {\n return this.range.toHtml()\n }\n\n isAllSelected () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n ) && parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n getTextRange () {\n return this.range.toCharacterRange(this.host)\n }\n\n // Return a plain string of the current selection content.\n toString () {\n return this.range.toString()\n }\n\n // Return true if the selection can be wrapped, i.e. all open nodes\n // are closed within this selection.\n isWrappable () {\n return content.isWrappable(this.range)\n }\n\n // Get the ClientRects of this selection.\n // Use this if you want more precision than getBoundingClientRect can give.\n getRects () {\n // consider: translate into absolute positions\n // just like Cursor#getCoordinates()\n return this.range.nativeRange.getClientRects()\n }\n\n\n link (href, attrs = {}) {\n if (href) attrs.href = href\n const link = this.createElement(config.linkMarkup.name, config.linkMarkup.attribs)\n for (const key in attrs) {\n const value = attrs[key]\n if (value === undefined) continue\n if (value === null) {\n link.removeAttribute(key)\n } else {\n link.setAttribute(key, value)\n }\n }\n if (config.linkMarkup.trim) this.trimRange()\n\n this.forceWrap(link)\n }\n\n // trims whitespaces on the left and right of a selection, i.e. what you want in case of links\n trimRange () {\n const textToTrim = this.range.toString()\n const whitespacesOnTheLeft = textToTrim.search(/\\S|$/)\n const lastNonWhitespace = textToTrim.search(/\\S[\\s]+$/)\n const whitespacesOnTheRight = lastNonWhitespace === -1 ? 0 : textToTrim.length - (lastNonWhitespace + 1)\n this.range.setStart(this.range.startContainer, this.range.startOffset + whitespacesOnTheLeft)\n this.range.setEnd(this.range.endContainer, this.range.endOffset - whitespacesOnTheRight)\n }\n\n unlink () {\n this.removeFormatting(config.linkMarkup.name)\n }\n\n toggleLink (href, attrs) {\n const links = this.getTagsByName(config.linkMarkup.name)\n if (links.length >= 1) {\n const firstLink = links[0]\n if (this.isExactSelection(firstLink, 'visible')) {\n this.unlink()\n } else {\n this.expandTo(firstLink)\n }\n } else {\n this.link(href, attrs)\n }\n }\n\n // Manually add a highlight\n // Note: the current code does not work with newlines (LP)\n highlight ({highlightId}) {\n const textBefore = this.textBefore()\n const currentTextContent = this.text()\n\n const marker = '<span class=\"highlight-comment\"></span>'\n const markerNode = highlightSupport.createMarkerNode(marker, this.win)\n\n markerNode.setAttribute('data-match', currentTextContent)\n\n const match = {\n startIndex: textBefore.length,\n endIndex: textBefore.length + currentTextContent.length,\n match: currentTextContent,\n marker: markerNode\n }\n\n // Note: highlighting won't retain the selection\n highlightText.highlightMatches(this.host, [match])\n }\n\n // toggle('<em>')\n toggle (elem) {\n if (block.isPlainTextBlock(this.host)) return\n elem = this.adoptElement(elem)\n this.range = content.toggleTag(this.host, this.range, elem)\n this.setSelection()\n }\n\n toggleCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.toggle(customElem)\n }\n\n makeCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.forceWrap(customElem)\n }\n\n makeBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.forceWrap(bold)\n }\n\n toggleBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.toggle(bold)\n }\n\n giveEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.forceWrap(em)\n }\n\n toggleEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.toggle(em)\n }\n\n makeUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.forceWrap(u)\n }\n\n toggleUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.toggle(u)\n }\n\n insertCharacter (character) {\n const cursor = this.deleteContent()\n const textNode = cursor.createTextNode(character)\n cursor.insertBefore(textNode)\n cursor.setSelection()\n return cursor\n }\n\n // Surround the selection with characters like quotes.\n //\n // @param {String} E.g. '«'\n // @param {String} E.g. '»'\n surround (startCharacter, endCharacter) {\n this.range = content.surround(this.host, this.range, startCharacter, endCharacter)\n this.setSelection()\n }\n\n removeSurround (startCharacter, endCharacter) {\n this.range = content.deleteCharacter(this.host, this.range, startCharacter)\n this.range = content.deleteCharacter(this.host, this.range, endCharacter)\n this.setSelection()\n }\n\n removeChars (chars = []) {\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n this.range = content.deleteCharacter(this.host, this.range, char)\n }\n this.setSelection()\n }\n\n toggleSurround (startCharacter, endCharacter) {\n if (this.containsString(startCharacter) &&\n this.containsString(endCharacter)) {\n this.removeSurround(startCharacter, endCharacter)\n } else {\n this.surround(startCharacter, endCharacter)\n }\n }\n\n // @param {String} selector. An element selector, e.g. 'a' or 'span.some-class'\n // that represents elements to be removed; if undefined,\n // remove all.\n removeFormatting (selector) {\n this.range = content.removeFormatting(this.host, this.range, selector)\n this.setSelection()\n }\n\n // Delete the farest ancestor that is an exact selection\n //\n // @return Selection instance\n deleteExactSurroundingTags () {\n const ancestorTags = this.getAncestorTags().reverse()\n for (const ancestorTag of ancestorTags) {\n if (this.isExactSelection(ancestorTag)) {\n ancestorTag.remove()\n break\n }\n }\n return new Selection(this.host, this.range)\n }\n\n // Delete all the tags whose text is completely within the current selection.\n //\n // @return Selection instance\n deleteContainedTags () {\n const containedTags = this.getContainedTags()\n containedTags.forEach(containedTag => containedTag.remove())\n return new Selection(this.host, this.range)\n }\n\n // Delete the contents inside the range and exact surrounding markups.\n // After that the selection will be a cursor.\n //\n // @return Cursor instance\n deleteContent () {\n this.range.deleteContents()\n return new Cursor(this.host, this.range)\n }\n\n // Expand the current selection.\n //\n // @param {DOM Node}\n expandTo (elem) {\n this.range = content.expandTo(this.host, this.range, elem)\n this.setSelection()\n }\n\n // Collapse the selection at the beginning of the selection\n //\n // @return Cursor instance\n collapseAtBeginning (elem) {\n this.range.collapse(true)\n this.setSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Collapse the selection at the end of the selection\n //\n // @return Cursor instance\n collapseAtEnd (elem) {\n this.range.collapse(false)\n this.setSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Wrap the selection with the specified tag. If any other tag with\n // the same tagName is affecting the selection this tag will be\n // remove first.\n forceWrap (elem) {\n if (block.isPlainTextBlock(this.host)) return\n elem = this.adoptElement(elem)\n this.range = content.forceWrap(this.host, this.range, elem)\n this.setSelection()\n }\n\n // Check if the selection is the same as the elements contents.\n //\n // @method isExactSelection\n // @param {DOM Node}\n // @param {flag: undefined or 'visible'} if 'visible' is passed\n // whitespaces at the beginning or end of the selection will\n // be ignored.\n // @return {Boolean}\n isExactSelection (elem, onlyVisible) {\n return content.isExactSelection(this.range, elem, onlyVisible)\n }\n\n // Check if the selection contains the passed string.\n //\n // @method containsString\n // @return {Boolean}\n containsString (str) {\n return content.containsString(this.range, str)\n }\n\n // Delete all occurrences of the specified character from the\n // selection.\n deleteCharacter (character) {\n this.range = content.deleteCharacter(this.host, this.range, character)\n this.setSelection()\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import Cursor from './cursor'\nimport Selection from './selection'\n\n/** RangeContainer\n *\n * primarily used to compare ranges\n * its designed to work with undefined ranges as well\n * so we can easily compare them without checking for undefined\n * all the time\n */\n\nexport default class RangeContainer {\n constructor (editableHost, rangyRange) {\n this.host = editableHost && editableHost.jquery\n ? editableHost[0]\n : editableHost\n this.range = rangyRange\n this.isAnythingSelected = (rangyRange !== undefined)\n this.isCursor = (this.isAnythingSelected && rangyRange.collapsed)\n this.isSelection = (this.isAnythingSelected && !this.isCursor)\n }\n\n getCursor () {\n if (this.isCursor) return new Cursor(this.host, this.range)\n }\n\n getSelection () {\n if (this.isSelection) return new Selection(this.host, this.range)\n }\n\n forceCursor () {\n if (!this.isSelection) return this.getCursor()\n return this.getSelection().deleteContent()\n }\n\n isDifferentFrom (otherRangeContainer = new RangeContainer()) {\n const self = this.range\n const other = otherRangeContainer.range\n if (self && other) return !self.equals(other)\n if (!self && !other) return false\n return true\n }\n}\n","import rangy from 'rangy'\n\nimport * as parser from './parser'\nimport RangeContainer from './range-container'\nimport Cursor from './cursor'\nimport Selection from './selection'\n\n/**\n * The SelectionWatcher module watches for selection changes inside\n * of editable blocks.\n *\n * @module core\n * @submodule selectionWatcher\n */\n\nexport default class SelectionWatcher {\n constructor (dispatcher, win) {\n this.dispatcher = dispatcher\n this.win = win || window\n this.rangySelection = undefined\n this.currentSelection = undefined\n this.currentRange = undefined\n }\n\n /**\n * Updates the internal selection pointer to the current rangy selection.\n * Returns true if no exception occurred.\n */\n syncSelection () {\n // it is possible that rangy has a problem with the nativeSelection\n try {\n this.rangySelection = rangy.getSelection(this.win)\n } catch (err) {\n return false\n }\n\n return true\n }\n\n /**\n * Return a RangeContainer if the current selection is within an editable\n * otherwise return an empty RangeContainer\n */\n getRangeContainer () {\n const successfulSync = this.syncSelection()\n\n // rangeCount is 0 or 1 in all browsers except firefox\n // firefox can work with multiple ranges\n // (on a mac hold down the command key to select multiple ranges)\n if (this.rangySelection.rangeCount && successfulSync) {\n const range = this.rangySelection.getRangeAt(0)\n const hostNode = parser.getHost(range.commonAncestorContainer)\n if (hostNode) return new RangeContainer(hostNode, range)\n }\n\n // return an empty range container\n return new RangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return RangeContainer instance\n */\n getFreshRange () {\n return this.getRangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getFreshSelection () {\n const range = this.getRangeContainer()\n\n return range.isCursor\n ? range.getCursor(this.win)\n : range.getSelection(this.win)\n }\n\n /**\n * Get the selection set by the last selectionChanged event.\n * Sometimes the event does not fire fast enough and the selection\n * you get is not the one the user sees.\n * In those cases use #getFreshSelection()\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getSelection () {\n return this.currentSelection\n }\n\n forceCursor () {\n const range = this.getRangeContainer()\n return range.forceCursor()\n }\n\n selectionChanged () {\n const newRange = this.getRangeContainer()\n if (newRange.isDifferentFrom(this.currentRange)) {\n const lastSelection = this.currentSelection\n this.currentRange = newRange\n\n // empty selection or cursor\n if (lastSelection) {\n if (lastSelection.isCursor && !this.currentRange.isCursor) {\n this.dispatcher.notify('cursor', lastSelection.host)\n } else if (lastSelection.isSelection && !this.currentRange.isSelection) {\n this.dispatcher.notify('selection', lastSelection.host)\n }\n }\n\n // set new selection or cursor and fire event\n if (this.currentRange.isCursor) {\n this.currentSelection = new Cursor(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('cursor', this.currentSelection.host, this.currentSelection)\n } else if (this.currentRange.isSelection) {\n this.currentSelection = new Selection(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('selection', this.currentSelection.host, this.currentSelection)\n } else {\n this.currentSelection = undefined\n }\n }\n }\n}\n","import rangy from 'rangy'\n\nimport {contenteditableSpanBug} from './feature-detection'\nimport * as nodeType from './node-type'\nimport eventable from './eventable'\n\n/**\n * The Keyboard module defines an event API for key events.\n */\n\nexport default class Keyboard {\n constructor (selectionWatcher) {\n eventable(this)\n this.selectionWatcher = selectionWatcher\n }\n\n dispatchKeyEvent (event, target, notifyCharacterEvent) {\n switch (event.keyCode) {\n case this.key.left:\n return this.notify(target, 'left', event)\n\n case this.key.right:\n return this.notify(target, 'right', event)\n\n case this.key.up:\n return this.notify(target, 'up', event)\n\n case this.key.down:\n return this.notify(target, 'down', event)\n\n case this.key.tab:\n if (event.shiftKey) return this.notify(target, 'shiftTab', event)\n return this.notify(target, 'tab', event)\n\n case this.key.esc:\n return this.notify(target, 'esc', event)\n\n case this.key.backspace:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'backspace', event)\n\n case this.key.delete:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'delete', event)\n\n case this.key.enter:\n if (event.shiftKey) return this.notify(target, 'shiftEnter', event)\n return this.notify(target, 'enter', event)\n\n case this.key.ctrl:\n case this.key.shift:\n case this.key.alt:\n return\n\n // Metakey\n case 224: // Firefox: 224\n case 17: // Opera: 17\n case 91: // Chrome/Safari: 91 (Left)\n case 93: // Chrome/Safari: 93 (Right)\n return\n\n default:\n // Added here to avoid using fall-through in the switch\n // when b or i are pressed without ctrlKey or metaKey\n if (event.keyCode === this.key.b && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'bold', event)\n }\n if (event.keyCode === this.key.i && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'italic', event)\n }\n\n this.preventContenteditableBug(target, event)\n if (!notifyCharacterEvent) return\n // Don't notify character events as long as either the ctrl or\n // meta key are pressed.\n // see: https://github.com/livingdocsIO/editable.js/pull/125\n if (!event.ctrlKey && !event.metaKey) return this.notify(target, 'character', event)\n }\n }\n\n preventContenteditableBug (target, event) {\n if (!contenteditableSpanBug) return\n if (event.ctrlKey || event.metaKey) return\n\n // This fixes a strange webkit bug that can be reproduced as follows:\n //\n // 1. A node used within a contenteditable has some style, e.g through the\n // following CSS:\n //\n // strong {\n // color: red\n // }\n //\n // 2. A selection starts with the first character of a styled node and ends\n // outside of that node, e.g: \"big beautiful\" is selected in the following\n // html:\n //\n // <p contenteditable=\"true\">\n // Hello <strong>big</strong> beautiful world\n // </p>\n //\n // 3. The user types a letter character to replace \"big beautiful\", e.g. \"x\"\n //\n // Result: Webkits adds <font> and <b> tags:\n //\n // <p contenteditable=\"true\">\n // Hello\n // <font color=\"#ff0000\">\n // <b>f</b>\n // </font>\n // world\n // </p>\n //\n // This bug ONLY happens, if the first character of the node is selected and\n // the selection goes further than the node.\n //\n // Solution:\n //\n // Manually remove the element that would be removed anyway before inserting\n // the new letter.\n const rangyInstance = this.selectionWatcher.getFreshRange()\n if (!rangyInstance.isSelection) return\n\n const nodeToRemove = Keyboard.getNodeToRemove(rangyInstance.range, target)\n if (nodeToRemove) nodeToRemove.remove()\n }\n\n static getNodeToRemove (selectionRange, target) {\n // This function is only used by preventContenteditableBug. It is exposed on\n // the Keyboard constructor for testing purpose only.\n\n // Let's make sure we are in the edge-case, in which the bug happens.\n // The selection does not start at the beginning of a node. We have\n // nothing to do.\n if (selectionRange.startOffset !== 0) return\n\n let startNodeElement = selectionRange.startContainer\n\n // If the node is a textNode, we select its parent.\n if (startNodeElement.nodeType === nodeType.textNode) startNodeElement = startNodeElement.parentNode\n\n // The target is the contenteditable element, which we do not want to replace\n if (startNodeElement === target) return\n\n // We get a range that contains everything within the sartNodeElement to test\n // if the selectionRange is within the startNode, we have nothing to do.\n const startNodeRange = rangy.createRange()\n startNodeRange.setStartBefore(startNodeElement.firstChild)\n startNodeRange.setEndAfter(startNodeElement.lastChild)\n if (startNodeRange.containsRange(selectionRange)) return\n\n // If the selectionRange.startContainer was a textNode, we have to make sure\n // that its parent's content starts with this node. Content is either a\n // text node or an element. This is done to avoid false positives like the\n // following one:\n // <strong>foo<em>bar</em>|baz</strong>quux|\n if (selectionRange.startContainer.nodeType === nodeType.textNode) {\n const contentNodeTypes = [nodeType.textNode, nodeType.elementNode]\n let firstContentNode = startNodeElement.firstChild\n\n do {\n if (contentNodeTypes.indexOf(firstContentNode.nodeType) !== -1) break\n } while ((firstContentNode = firstContentNode.nextSibling))\n\n if (firstContentNode !== selectionRange.startContainer) return\n }\n\n // Now we know, that we have to return at least the startNodeElement for\n // removal. But it could be, that we also need to remove its parent, e.g.\n // we need to remove <strong> in the following example:\n // <strong><em>|foo</em>bar</strong>baz|\n const rangeStartingBeforeCurrentElement = selectionRange.cloneRange()\n rangeStartingBeforeCurrentElement.setStartBefore(startNodeElement)\n\n return Keyboard.getNodeToRemove(\n rangeStartingBeforeCurrentElement,\n target\n ) || startNodeElement\n }\n}\n\nKeyboard.key = Keyboard.prototype.key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n tab: 9,\n esc: 27,\n backspace: 8,\n delete: 46,\n enter: 13,\n shift: 16,\n ctrl: 17,\n alt: 18,\n b: 66,\n i: 73\n}\n","import {selectionchange} from './feature-detection'\nimport * as clipboard from './clipboard'\nimport eventable from './eventable'\nimport SelectionWatcher from './selection-watcher'\nimport config from './config'\nimport Keyboard from './keyboard'\nimport {closest} from './util/dom'\nimport {replaceLast, endsWithSingleSpace} from './util/string'\n\n// This will be set to true once we detect the input event is working.\n// Input event description on MDN:\n// https://developer.mozilla.org/en-US/docs/Web/Reference/Events/input\nlet isInputEventSupported = false\n\n/**\n * The Dispatcher module is responsible for dealing with events and their handlers.\n *\n * @module core\n * @submodule dispatcher\n */\nexport default class Dispatcher {\n\n constructor (editable) {\n const win = editable.win\n eventable(this, editable)\n this.supportsInputEvent = false\n this.document = win.document\n this.config = editable.config\n this.editable = editable\n this.editableSelector = editable.editableSelector\n this.selectionWatcher = new SelectionWatcher(this, win)\n this.keyboard = new Keyboard(this.selectionWatcher)\n this.activeListeners = []\n this.setup()\n this.getEditableBlockByEvent = (evt) => closest(evt.target, editable.editableSelector)\n }\n\n setupDocumentListener (event, func, capture = false) {\n const listener = {event, listener: func.bind(this), capture}\n this.activeListeners.push(listener)\n\n this.document.addEventListener(event, listener.listener, capture)\n return this\n }\n\n /**\n * Sets up all events that Editable.JS is catching.\n *\n * @method setup\n */\n setup () {\n // setup all events listeners and keyboard handlers\n this.setupKeyboardEvents()\n this.setupEventListeners()\n }\n\n unload () {\n this.off()\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n suspend () {\n if (this.suspended) return\n this.suspended = true\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n continue () {\n if (!this.suspended) return\n this.suspended = false\n this.setupEventListeners()\n }\n\n setupEventListeners () {\n this.setupElementListeners()\n this.setupKeydownListener()\n\n if (selectionchange) {\n this.setupSelectionChangeListeners()\n } else {\n this.setupSelectionChangeFallbackListeners()\n }\n }\n\n /**\n * Sets up events that are triggered on modifying an element.\n *\n * @method setupElementListeners\n */\n setupElementListeners () {\n this\n .setupDocumentListener('focus', function focusListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (evt.target.getAttribute(config.pastingAttribute)) return\n this.selectionWatcher.syncSelection()\n this.notify('focus', block)\n }, true)\n .setupDocumentListener('blur', function blurListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (block.getAttribute(config.pastingAttribute)) return\n this.notify('blur', block)\n }, true)\n .setupDocumentListener('copy', function copyListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'copy', selection)\n }\n })\n .setupDocumentListener('cut', function cutListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'cut', selection)\n this.triggerChangeEvent(block)\n }\n })\n .setupDocumentListener('paste', function pasteListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n\n evt.preventDefault()\n const selection = this.selectionWatcher.getFreshSelection()\n const clipboardContent = evt.clipboardData.getData('text/html') || evt.clipboardData.getData('text/plain')\n\n const {blocks, cursor} = clipboard.paste(block, selection, clipboardContent)\n if (blocks.length) {\n if (endsWithSingleSpace(evt.target.innerText)) {\n cursor.retainVisibleSelection(() => {\n block.innerHTML = replaceLast(block.innerHTML, '&nbsp;', ' ')\n })\n }\n this.notify('paste', block, blocks, cursor)\n // The input event does not fire when we process the content manually\n // and insert it via script\n this.notify('change', block)\n } else {\n cursor.setVisibleSelection()\n }\n })\n .setupDocumentListener('input', function inputListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (isInputEventSupported) {\n this.notify('change', block)\n } else {\n // Most likely the event was already handled manually by\n // triggerChangeEvent so the first time we just switch the\n // isInputEventSupported flag without notifying the change event.\n isInputEventSupported = true\n }\n })\n\n .setupDocumentListener('formatEditable', function formatEditableListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n this.notify('change', block)\n })\n }\n\n /**\n * Trigger a change event\n *\n * This should be done in these cases:\n * - typing a letter\n * - delete (backspace and delete keys)\n * - cut\n * - paste\n * - copy and paste (not easily possible manually as far as I know)\n *\n * Preferably this is done using the input event. But the input event is not\n * supported on all browsers for contenteditable elements.\n * To make things worse it is not detectable either. So instead of detecting\n * we set 'isInputEventSupported' when the input event fires the first time.\n */\n triggerChangeEvent (target) {\n if (isInputEventSupported) return\n this.notify('change', target)\n }\n\n dispatchSwitchEvent (event, element, direction) {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return\n const cursor = this.selectionWatcher.getFreshSelection()\n if (!cursor || cursor.isSelection) return\n\n // store position\n if (!this.switchContext) {\n this.switchContext = {\n positionX: cursor.getBoundingClientRect().left,\n events: ['cursor']\n }\n } else {\n this.switchContext.events = ['cursor']\n }\n\n if (direction === 'up' && cursor.isAtFirstLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n\n if (direction === 'down' && cursor.isAtLastLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n }\n\n /**\n * Sets up listener for keydown event which forwards events to\n * the Keyboard instance.\n *\n * @method setupKeydownListener\n */\n setupKeydownListener () {\n this.setupDocumentListener('keydown', function (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const notifyCharacterEvent = !isInputEventSupported\n this.keyboard.dispatchKeyEvent(evt, block, notifyCharacterEvent)\n }, true)\n }\n\n /**\n * Sets up handlers for the keyboard events.\n * Keyboard definitions are in {{#crossLink \"Keyboard\"}}{{/crossLink}}.\n *\n * @method setupKeyboardEvents\n */\n setupKeyboardEvents () {\n const self = this\n\n this.keyboard\n .on('up', function (event) {\n self.dispatchSwitchEvent(event, this, 'up')\n })\n\n .on('down', function (event) {\n self.dispatchSwitchEvent(event, this, 'down')\n })\n\n .on('backspace', function (event) {\n const range = self.selectionWatcher.getFreshRange()\n if (!range.isCursor) return self.triggerChangeEvent(this)\n\n const cursor = range.getCursor()\n if (!cursor.isAtBeginning()) return self.triggerChangeEvent(this)\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'before', cursor)\n })\n\n .on('delete', function (event) {\n const range = self.selectionWatcher.getFreshRange()\n if (!range.isCursor) return self.triggerChangeEvent(this)\n\n const cursor = range.getCursor()\n if (!cursor.isAtTextEnd()) return self.triggerChangeEvent(this)\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'after', cursor)\n })\n\n .on('enter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const range = self.selectionWatcher.getFreshRange()\n const cursor = range.forceCursor()\n\n if (cursor.isAtTextEnd()) {\n self.notify('insert', this, 'after', cursor)\n } else if (cursor.isAtBeginning()) {\n self.notify('insert', this, 'before', cursor)\n } else {\n self.notify('split', this, cursor.before(), cursor.after(), cursor)\n }\n })\n\n .on('shiftEnter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const cursor = self.selectionWatcher.forceCursor()\n self.notify('newline', this, cursor)\n })\n\n .on('bold', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleBold', selection)\n }\n })\n\n .on('italic', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleEmphasis', selection)\n }\n })\n\n .on('character', function (event) {\n self.notify('change', this)\n })\n }\n\n /**\n * Sets up events that are triggered on a selection change.\n *\n * @method setupSelectionChangeListeners\n */\n setupSelectionChangeListeners () {\n let selectionDirty = false\n let suppressSelectionChanges = false\n const selectionWatcher = this.selectionWatcher\n\n // fires on mousemove (thats probably a bit too much)\n // catches changes like 'select all' from context menu\n this.setupDocumentListener('selectionchange', (evt) => {\n const cursor = this.selectionWatcher.getFreshSelection()\n\n if (cursor && cursor.isSelection && cursor.isAtBeginning() && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'both')\n } else if (cursor && cursor.isSelection && cursor.isAtBeginning()) {\n this.notify('selectToBoundary', cursor.host, evt, 'start')\n } else if (cursor && cursor.isSelection && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'end')\n }\n\n if (suppressSelectionChanges) {\n selectionDirty = true\n } else {\n selectionWatcher.selectionChanged()\n }\n })\n\n // listen for selection changes by mouse so we can\n // suppress the selectionchange event and only fire the\n // change event on mouseup\n this.setupDocumentListener('mousedown', function (evt) {\n if (!this.getEditableBlockByEvent(evt)) return\n if (this.config.mouseMoveSelectionChanges === false) {\n suppressSelectionChanges = true\n\n // Without this timeout the previous selection is active\n // until the mouseup event (no. not good).\n setTimeout(() => selectionWatcher.selectionChanged(), 0)\n }\n\n this.document.addEventListener('mouseup', () => {\n suppressSelectionChanges = false\n\n if (selectionDirty) {\n selectionDirty = false\n selectionWatcher.selectionChanged()\n }\n }, {\n capture: true,\n once: true\n })\n })\n }\n\n /**\n * Fallback solution to support selection change events on browsers that don't\n * support selectionChange.\n *\n * @method setupSelectionChangeFallbackListeners\n */\n setupSelectionChangeFallbackListeners () {\n // listen for selection changes by mouse\n this.setupDocumentListener('mouseup', () => {\n // In Opera when clicking outside of a block\n // it does not update the selection as it should\n // without the timeout\n setTimeout(() => this.selectionWatcher.selectionChanged(), 0)\n })\n\n // listen for selection changes by keys\n this.setupDocumentListener('keyup', (evt) => {\n if (!this.getEditableBlockByEvent(evt)) return\n // when pressing Command + Shift + Left for example the keyup is only triggered\n // after at least two keys are released. Strange. The culprit seems to be the\n // Command key. Do we need a workaround?\n this.selectionWatcher.selectionChanged()\n })\n }\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import * as content from '../../content'\n\n/**\n* Spellcheck class.\n*\n* @class Spellcheck\n* @constructor\n*/\nexport default class SpellcheckService {\n\n constructor (spellcheckService) {\n this.spellcheckService = spellcheckService\n }\n\n check (text, callback) {\n if (!text) return callback(null)\n\n const condensedText = content.normalizeWhitespace(text)\n\n this.spellcheckService(condensedText, (misspelledWords) => {\n if (misspelledWords && misspelledWords.length > 0) {\n callback(null, misspelledWords)\n } else {\n callback(null)\n }\n })\n }\n\n}\n","// See: https://en.wikipedia.org/wiki/Whitespace_character\n\nconst characters = {\n 'A0': 'no-break space', // \\\\u00A0\n '2000': 'en quad', // \\\\u2000\n '2001': 'em quad', // \\\\u2001\n '2002': 'en space', // \\\\u2002\n '2003': 'em space', // \\\\u2003\n '2004': 'three-per-em space', // \\\\u2004\n '2005': 'four-per-em space', // \\\\u2005\n '2006': 'six-per-em space', // \\\\u2006\n '2007': 'figure space', // \\\\u2007\n '2008': 'punctuation space', // \\\\u2008\n '2009': 'thin space', // \\\\u2009\n '200A': 'hair space', // \\\\u200A\n '202F': 'narrow no-break space', // \\\\u202F\n '205F': 'medium mathematical space', // \\\\u205F\n '3000': 'ideographic space' // \\\\u3000\n}\n\n// The no-break space is not highlighted as this can cause problems.\n// Browser can insert no-break spaces when typing at the end of\n// a paragraph and the highlighting prevents browsers from converting\n// the no-break space back to a normal space when the user keeps typing.\nconst specialWhitespaceChars = '\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000'\n\nexport default class WhitespaceHighlighting {\n\n constructor (markerNode) {\n this.marker = markerNode\n }\n\n findMatches (text) {\n if (!text) return\n\n let regex = `[${specialWhitespaceChars}]`\n regex = new RegExp(regex, 'g')\n\n const matches = []\n let match\n while ((match = regex.exec(text))) matches.push(match)\n\n return matches.map((entry) => this.prepareMatch(entry))\n }\n\n prepareMatch (match) {\n const startIndex = match.index\n const unicode = getUnicode(match[0])\n const description = characters[unicode]\n return {\n startIndex,\n endIndex: startIndex + match.length,\n match: match[0],\n title: `${description} (\\\\u${unicode})`,\n marker: this.marker\n }\n }\n}\n\nfunction getUnicode (character) {\n const code = character.charCodeAt(0)\n return `${code.toString(16).toUpperCase()}`\n}\n","export default class MatchCollection {\n\n constructor () {\n this.matches = []\n }\n\n addMatches (name, matches) {\n if (!matches || !matches.length) return\n\n this.matches = mergeMatches(this.matches, matches)\n }\n\n}\n\n// Private Helpers\n// ---------------\n\nfunction mergeMatches (matches1, matches2) {\n let next\n const length1 = matches1.length\n const length2 = matches2.length\n let lastEndIndex = -1\n const output = []\n\n const state = {\n a1: matches1,\n i1: 0,\n a2: matches2,\n i2: 0\n }\n\n while (state.i1 < length1 || state.i2 < length2) {\n next = pickNext(state)\n if (next.startIndex >= lastEndIndex) {\n output.push(next)\n }\n lastEndIndex = next.endIndex\n }\n\n return output\n}\n\nfunction pickNext (state) {\n const i1 = state.i1\n const i2 = state.i2\n const item1 = state.a1[i1]\n const item2 = state.a2[i2]\n\n if (item1 && item2 && item1.startIndex < item2.startIndex) {\n state.i1 = i1 + 1\n return item1\n } else if (item1 && item2) {\n state.i2 = i2 + 1\n return item2\n } else if (item1) {\n state.i1 = i1 + 1\n return item1\n } else if (item2) {\n state.i2 = i2 + 1\n return item2\n } else {\n return undefined\n }\n}\n","import _merge from 'lodash-es/merge'\nimport * as nodeType from './node-type'\nimport * as content from './content'\nimport highlightText from './highlight-text'\nimport SpellcheckService from './plugins/highlighting/spellcheck-service'\nimport WhitespaceHighlighting from './plugins/highlighting/whitespace-highlighting'\nimport WordHighlighting from './plugins/highlighting/text-highlighting'\nimport MatchCollection from './plugins/highlighting/match-collection'\nimport highlightSupport from './highlight-support'\nimport {domArray, domSelector} from './util/dom'\n\nexport default class Highlighting {\n\n constructor (editable, configuration, spellcheckConfig) {\n this.editable = editable\n this.win = editable.win\n this.focusedEditableHost = undefined\n this.currentlyCheckedEditableHost = undefined\n this.timeout = {}\n\n const defaultConfig = {\n checkOnInit: false,\n checkOnFocus: false,\n checkOnChange: true,\n // unbounce rate in ms before calling the spellcheck service after changes\n throttle: 1000,\n // remove highlights after a change if the cursor is inside a highlight\n removeOnCorrection: true,\n spellcheck: {\n marker: '<span class=\"highlight-spellcheck\"></span>',\n throttle: 1000,\n spellcheckService: function () {}\n },\n whitespace: {\n marker: '<span class=\"highlight-whitespace\"></span>'\n }\n }\n\n this.config = _merge({}, defaultConfig, configuration)\n\n const spellcheckService = this.config.spellcheck.spellcheckService\n const spellcheckMarker = this.config.spellcheck.marker\n const whitespaceMarker = this.config.whitespace.marker\n const spellcheckMarkerNode = highlightSupport\n .createMarkerNode(spellcheckMarker, 'spellcheck', this.win)\n const whitespaceMarkerNode = highlightSupport\n .createMarkerNode(whitespaceMarker, 'spellcheck', this.win)\n\n this.spellcheckService = new SpellcheckService(spellcheckService)\n this.spellcheck = new WordHighlighting(spellcheckMarkerNode)\n this.whitespace = new WhitespaceHighlighting(whitespaceMarkerNode)\n\n this.setupListeners()\n }\n\n // Events\n // ------\n\n setupListeners () {\n if (this.config.checkOnFocus) {\n this.editable.on('focus', (...args) => this.onFocus(...args))\n this.editable.on('blur', (...args) => this.onBlur(...args))\n }\n if (this.config.checkOnChange || this.config.removeOnCorrection) {\n this.editable.on('change', (...args) => this.onChange(...args))\n }\n if (this.config.checkOnInit) {\n this.editable.on('init', (...args) => this.onInit(...args))\n }\n }\n\n onInit (editableHost) {\n this.highlight(editableHost)\n }\n\n onFocus (editableHost) {\n if (this.focusedEditableHost !== editableHost) {\n this.focusedEditableHost = editableHost\n this.editableHasChanged(editableHost)\n }\n }\n\n onBlur (editableHost) {\n if (this.focusedEditableHost === editableHost) {\n this.focusedEditableHost = undefined\n }\n }\n\n onChange (editableHost) {\n if (this.config.checkOnChange) {\n this.editableHasChanged(editableHost, this.config.throttle)\n }\n if (this.config.removeOnCorrection) {\n this.removeHighlightsAtCursor(editableHost)\n }\n }\n\n // Manage Highlights\n // -----------------\n\n editableHasChanged (editableHost, throttle) {\n if (this.timeout.id && this.timeout.editableHost === editableHost) {\n clearTimeout(this.timeout.id)\n }\n\n const timeoutId = setTimeout(() => {\n this.highlight(editableHost)\n\n this.timeout = {}\n }, throttle || 0)\n\n this.timeout = {\n id: timeoutId,\n editableHost: editableHost\n }\n }\n\n highlight (editableHost) {\n let text = highlightText.extractText(editableHost)\n\n // getSpellcheck\n this.spellcheckService.check(text, (err, misspelledWords) => {\n if (err) { return }\n\n // refresh the text\n text = highlightText.extractText(editableHost)\n\n const matchCollection = new MatchCollection()\n\n let matches = this.spellcheck.findMatches(text, misspelledWords)\n matchCollection.addMatches('spellcheck', matches)\n\n matches = this.whitespace.findMatches(text)\n matchCollection.addMatches('whitespace', matches)\n\n this.safeHighlightMatches(editableHost, matchCollection.matches)\n })\n }\n\n // Calls highlightMatches internally but ensures\n // that the selection stays the same\n safeHighlightMatches (editableHost, matches) {\n const selection = this.editable.getSelection(editableHost)\n if (selection) {\n selection.retainVisibleSelection(() => {\n this.highlightMatches(editableHost, matches)\n })\n } else {\n this.highlightMatches(editableHost, matches)\n }\n if (this.editable.dispatcher) {\n this.editable.dispatcher.notify('spellcheckUpdated', editableHost)\n }\n }\n\n highlightMatches (editableHost, matches) {\n // Remove old highlights\n this.removeHighlights(editableHost)\n\n // Create new highlights\n if (matches && matches.length > 0) {\n // const span = this.createMarkerNode()\n highlightText.highlightMatches(editableHost, matches)\n }\n }\n\n removeHighlights (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n for (const elem of domArray('[data-highlight=\"spellcheck\"]', editableHost)) {\n content.unwrap(elem)\n }\n }\n\n removeHighlightsAtCursor (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n const selection = this.editable.getSelection(editableHost)\n if (selection && selection.isCursor) {\n let elementAtCursor = selection.range.startContainer\n if (elementAtCursor.nodeType === nodeType.textNode) {\n elementAtCursor = elementAtCursor.parentNode\n }\n\n let wordId\n do {\n if (elementAtCursor === editableHost) return\n const highlightType = elementAtCursor.getAttribute('data-highlight')\n if (highlightType === 'spellcheck') {\n wordId = elementAtCursor.getAttribute('data-word-id')\n break\n }\n } while ((elementAtCursor = elementAtCursor.parentNode))\n\n if (wordId) {\n selection.retainVisibleSelection(() => {\n for (const elem of domArray(`[data-word-id=\"${wordId}\"]`, editableHost)) {\n content.unwrap(elem)\n }\n })\n }\n }\n }\n\n}\n","import config from '../config'\n\n// Allows for safe console logging\n// If the last param is the string \"trace\" console.trace will be called\n// configuration: disable with config.log = false\nexport default function log () {\n if (config.log === false) return\n\n if (!global.console) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (arguments.length !== 1 && args[args.length - 1] === 'trace') {\n args.pop()\n if (console.trace) console.trace()\n }\n\n return console.log(args)\n}\n","'use strict'\nimport NodeIterator from '../node-iterator'\n\nexport function textNodesUnder (node) {\n const iterator = new NodeIterator(node, 'getNextTextNode')\n return [...iterator]\n}\n\n// NOTE: if there is only one text node, then just that node and\n// the abs offset are returned\nexport function getTextNodeAndRelativeOffset ({textNodes, absOffset}) {\n let cumulativeOffset = 0\n let relativeOffset = 0\n let targetNode\n for (let i = 0; i < textNodes.length; i++) {\n const node = textNodes[i]\n if (absOffset <= cumulativeOffset + node.textContent.length) {\n targetNode = node\n relativeOffset = absOffset - cumulativeOffset\n break\n }\n cumulativeOffset += node.textContent.length\n }\n return {node: targetNode, relativeOffset}\n}\n\nexport function getTotalCharCount (element) {\n const textNodes = textNodesUnder(element)\n const reducer = (acc, node) => acc + node.textContent.length\n return textNodes.reduce(reducer, 0)\n}\n","'use strict'\nimport {getTotalCharCount, textNodesUnder, getTextNodeAndRelativeOffset} from './element'\n\n/**\n * This is a binary search algorithm implementation aimed at finding\n * a character offset position in a consecutive strings of characters\n * over several lines.\n *\n * Refer to this page in order to learn more about binary search:\n * https://en.wikipedia.org/wiki/Binary_search_algorithm\n *\n * @returns {object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\nexport function binaryCursorSearch ({\n host,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX // coordinates relative to viewport (e.g. from getBoundingClientRect())\n}) {\n const hostRange = host.ownerDocument.createRange()\n hostRange.selectNodeContents(host)\n const hostCoords = hostRange.getBoundingClientRect()\n const totalCharCount = getTotalCharCount(host)\n const textNodes = textNodesUnder(host)\n\n // early terminate on empty editables\n if (totalCharCount === 0) return {wasFound: false}\n\n const data = {\n currentOffset: Math.floor(totalCharCount / 2),\n leftLimit: 0,\n rightLimit: totalCharCount\n }\n\n let offset = data.currentOffset\n let distance\n let safety = 20\n while (data.leftLimit < data.rightLimit && safety > 0) {\n safety = safety -= 1\n offset = data.currentOffset\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n distance = Math.abs(coords.left - positionX)\n\n // up / down axis\n if (requiredOnFirstLine && hostCoords.top !== coords.top) {\n moveLeft(data)\n continue\n } else if (requiredOnLastLine && hostCoords.bottom !== coords.bottom) {\n moveRight(data)\n continue\n }\n\n // left / right axis\n if (positionX < coords.left) {\n moveLeft(data)\n } else {\n moveRight(data)\n }\n }\n\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n const finalDistance = Math.abs(coords.left - positionX)\n\n // Decide if last or second last offset is closest\n if (finalDistance < distance) {\n distance = finalDistance\n offset = data.currentOffset\n }\n\n return {distance, offset, wasFound: true}\n}\n\n// move the binary search index in between the current position and the left limit\nfunction moveLeft (data) {\n data.rightLimit = data.currentOffset\n data.currentOffset = Math.floor((data.currentOffset + data.leftLimit) / 2)\n}\n// move the binary search index in between the current position and the right limit\nfunction moveRight (data) {\n data.leftLimit = data.currentOffset\n data.currentOffset = Math.ceil((data.currentOffset + data.rightLimit) / 2)\n}\n\nfunction createRangeAtCharacterOffset ({textNodes, offset}) {\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n\n const newRange = node.ownerDocument.createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n return newRange\n}\n","import rangy from 'rangy'\nimport config from './config'\nimport error from './util/error'\nimport * as parser from './parser'\nimport * as block from './block'\nimport * as content from './content'\nimport * as clipboard from './clipboard'\nimport Dispatcher from './dispatcher'\nimport Cursor from './cursor'\nimport highlightSupport from './highlight-support'\nimport Highlighting from './highlighting'\nimport createDefaultEvents from './create-default-events'\nimport browser from 'bowser'\nimport {textNodesUnder, getTextNodeAndRelativeOffset} from './util/element'\nimport {binaryCursorSearch} from './util/binary_search'\nimport {domArray} from './util/dom'\n\n/**\n * The Core module provides the Editable class that defines the Editable.JS\n * API and is the main entry point for Editable.JS.\n * It also provides the cursor module for cross-browser cursors, and the dom\n * submodule.\n *\n * @module core\n */\n\n/**\n * Constructor for the Editable.JS API that is externally visible.\n *\n * @param {Object} configuration for this editable instance.\n * window: The window where to attach the editable events.\n * defaultBehavior: {Boolean} Load default-behavior.js.\n * mouseMoveSelectionChanges: {Boolean} Whether to get cursor and selection events on mousemove.\n * browserSpellcheck: {Boolean} Set the spellcheck attribute on editable elements\n *\n * @class Editable\n */\nexport class Editable {\n\n constructor (instanceConfig) {\n const defaultInstanceConfig = {\n window: window,\n defaultBehavior: true,\n mouseMoveSelectionChanges: false,\n browserSpellcheck: true\n }\n\n this.config = Object.assign(defaultInstanceConfig, instanceConfig)\n this.win = this.config.window\n this.editableSelector = `.${config.editableClass}`\n\n if (!rangy.initialized) {\n rangy.init()\n }\n\n this.dispatcher = new Dispatcher(this)\n if (this.config.defaultBehavior === true) {\n this.dispatcher.on(createDefaultEvents(this))\n }\n }\n\n /**\n * @returns the default Editable configs from config.js\n */\n static getGlobalConfig () {\n return config\n }\n\n /**\n * Set configuration options that affect all editable\n * instances.\n *\n * @param {Object} global configuration options (defaults are defined in config.js)\n * log: {Boolean}\n * logErrors: {Boolean}\n * editableClass: {String} e.g. 'js-editable'\n * editableDisabledClass: {String} e.g. 'js-editable-disabled'\n * pastingAttribute: {String} default: e.g. 'data-editable-is-pasting'\n * boldTag: e.g. '<strong>'\n * italicTag: e.g. '<em>'\n */\n static globalConfig (globalConfig) {\n Object.assign(config, globalConfig)\n clipboard.updateConfig(config)\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n * Opposite of {{#crossLink \"Editable/remove\"}}{{/crossLink}}.\n * Calls dispatcher.setup to setup all event listeners.\n *\n * @method add\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be added on.\n * @param {normalize, plainText} options Block specific configuration\n * @chainable\n */\n add (target, options) {\n this.enable(target, options)\n // TODO check css whitespace settings\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * Opposite of {{#crossLink \"Editable/add\"}}{{/crossLink}}.\n *\n * @method remove\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be removed from.\n * @chainable\n */\n remove (target) {\n const targets = domArray(target, this.win.document)\n\n this.disable(targets)\n\n for (const element of targets) {\n element.classList.remove(config.editableDisabledClass)\n }\n\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * The target elements are marked as disabled.\n *\n * @method disable\n * @param { HTMLElement | undefined } elem editable root element(s)\n * If no param is specified all editables are disabled.\n * @chainable\n */\n disable (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n block.disable(element)\n }\n\n return this\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n *\n * @method enable\n * @param { HTMLElement | undefined } target editable root element(s)\n * If no param is specified all editables marked as disabled are enabled.\n * @param {boolean} normalize normalizes target content (legacy param)\n * @param {boolean} options.normalize normalizes target content\n * @param {boolean} options.plainText prevents text formatting for block\n * @chainable\n */\n enable (target, options) {\n const {\n normalize = typeof options === 'boolean' ? options : false,\n plainText = false\n } = options ?? {}\n const shouldSpellcheck = this.config.browserSpellcheck\n const targets = domArray(target || `.${config.editableDisabledClass}`, this.win.document)\n\n for (const element of targets) {\n block.init(element, {normalize, plainText, shouldSpellcheck})\n this.dispatcher.notify('init', element)\n }\n\n return this\n }\n\n /**\n * Temporarily disable an editable.\n * Can be used to prevent text selection while dragging an element\n * for example.\n *\n * @method suspend\n * @param { HTMLElement | undefined } target\n */\n suspend (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.removeAttribute('contenteditable')\n }\n\n this.dispatcher.suspend()\n return this\n }\n\n /**\n * Reverse the effects of suspend()\n *\n * @method continue\n * @param { HTMLElement | undefined } target\n */\n continue (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.setAttribute('contenteditable', true)\n }\n\n this.dispatcher.continue()\n return this\n }\n /**\n * Set the cursor inside of an editable block.\n *\n * @method createCursor\n * @param { HTMLElement } element\n * @param { 'beginning' | 'end' | 'before' | 'after' } position\n */\n\n createCursor (element, position = 'beginning') {\n const host = Cursor.findHost(element, this.editableSelector)\n if (!host) return undefined\n\n const range = rangy.createRange()\n\n if (position === 'beginning' || position === 'end') {\n range.selectNodeContents(element)\n range.collapse(position === 'beginning')\n } else if (element !== host) {\n if (position === 'before') {\n range.setStartBefore(element)\n range.setEndBefore(element)\n } else if (position === 'after') {\n range.setStartAfter(element)\n range.setEndAfter(element)\n }\n } else {\n error('EditableJS: cannot create cursor outside of an editable block.')\n }\n\n return new Cursor(host, range)\n }\n\n createCursorAtCharacterOffset ({element, offset}) {\n const textNodes = textNodesUnder(element)\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n const newRange = rangy.createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n const host = Cursor.findHost(element, this.editableSelector)\n const nextCursor = new Cursor(host, newRange)\n\n nextCursor.setVisibleSelection()\n return nextCursor\n }\n\n createCursorAtBeginning (element) {\n return this.createCursor(element, 'beginning')\n }\n\n createCursorAtEnd (element) {\n return this.createCursor(element, 'end')\n }\n\n createCursorBefore (element) {\n return this.createCursor(element, 'before')\n }\n\n createCursorAfter (element) {\n return this.createCursor(element, 'after')\n }\n\n /**\n * Extract the content from an editable host or document fragment.\n * This method will remove all internal elements and ui-elements.\n *\n * @param {DOM node or Document Fragment} The innerHTML of this element or fragment will be extracted.\n * @returns {String} The cleaned innerHTML.\n */\n getContent (element) {\n return content.extractContent(element)\n }\n\n /**\n * @param {String | DocumentFragment} content to append.\n * @returns {Cursor} A new Cursor object just before the inserted content.\n */\n appendTo (inputElement, contentToAppend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'end')\n // TODO create content in the right window\n cursor.insertAfter(typeof contentToAppend === 'string'\n ? content.createFragmentFromString(contentToAppend)\n : contentToAppend\n )\n return cursor\n }\n\n /**\n * @param {String | DocumentFragment} content to prepend\n * @returns {Cursor} A new Cursor object just after the inserted content.\n */\n prependTo (inputElement, contentToPrepend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'beginning')\n // TODO create content in the right window\n cursor.insertBefore(typeof contentToPrepend === 'string'\n ? content.createFragmentFromString(contentToPrepend)\n : contentToPrepend\n )\n return cursor\n }\n\n /**\n * Get the current selection.\n * Only returns something if the selection is within an editable element.\n * If you pass an editable host as param it only returns something if the selection is inside this\n * very editable element.\n *\n * @param {DOMNode} Optional. An editable host where the selection needs to be contained.\n * @returns A Cursor or Selection object or undefined.\n */\n getSelection (editableHost) {\n let selection = this.dispatcher.selectionWatcher.getFreshSelection()\n if (!(editableHost && selection)) return selection\n\n const range = selection.range\n // Check if the selection is inside the editableHost\n // The try...catch is required if the editableHost was removed from the DOM.\n try {\n if (range.compareNode(editableHost) !== range.NODE_BEFORE_AND_AFTER) {\n selection = undefined\n }\n } catch (e) {\n selection = undefined\n }\n\n return selection\n }\n\n /**\n * Enable spellchecking\n *\n * @chainable\n */\n setupHighlighting (hightlightingConfig) {\n this.highlighting = new Highlighting(this, hightlightingConfig)\n\n return this\n }\n\n // For backwards compatibility\n setupSpellcheck (conf) {\n let marker\n\n if (conf.markerNode) {\n marker = conf.markerNode.outerHTML\n }\n\n this.setupHighlighting({\n throttle: conf.throttle,\n spellcheck: {\n marker: marker,\n spellcheckService: conf.spellcheckService\n }\n })\n\n this.spellcheck = {\n checkSpelling: (elem) => {\n this.highlighting.highlight(elem)\n }\n }\n }\n\n /**\n * Highlight text within an editable.\n *\n * By default highlights all occurrences of `text`.\n * Pass it a `textRange` object to highlight a\n * specific text portion.\n *\n * The markup used for the highlighting will be removed\n * from the final content.\n *\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} options.text\n * @param {String} options.highlightId Added to the highlight markups in the property `data-word-id`\n * @param {Object} [options.textRange] An optional range which gets used to set the markers.\n * @param {Number} options.textRange.start\n * @param {Number} options.textRange.end\n * @param {Boolean} options.raiseEvents do throw change events\n * @return {Number} The text-based start offset of the newly applied highlight or `-1` if the range was considered invalid.\n */\n highlight ({editableHost, text, highlightId, textRange, raiseEvents, type = 'comment'}) {\n if (!textRange) {\n return highlightSupport.highlightText(editableHost, text, highlightId, type)\n }\n if (typeof textRange.start !== 'number' || typeof textRange.end !== 'number') {\n error(\n 'Error in Editable.highlight: You passed a textRange object with invalid keys. Expected shape: { start: Number, end: Number }'\n )\n return -1\n }\n if (textRange.start === textRange.end) {\n error(\n 'Error in Editable.highlight: You passed a textRange object with equal start and end offsets, which is considered a cursor and therefore unfit to create a highlight.'\n )\n return -1\n }\n return highlightSupport.highlightRange(editableHost, text, highlightId, textRange.start, textRange.end, raiseEvents ? this.dispatcher : undefined, type)\n }\n\n /**\n * Extracts positions of all DOMNodes that match `[data-word-id]` and the `[data-highlight]`\n *\n * Returns an object where the keys represent a highlight id and the value\n * a text range object of shape:\n * ```\n * { start: number, end: number, text: string}\n * ```\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} [options.type]\n * @return {Object} ranges\n */\n getHighlightPositions ({editableHost, type}) {\n return highlightSupport.extractHighlightedRanges(\n editableHost,\n type\n )\n }\n\n removeHighlight ({editableHost, highlightId, raiseEvents}) {\n highlightSupport.removeHighlight(editableHost, highlightId, raiseEvents ? this.dispatcher : undefined)\n }\n\n decorateHighlight ({editableHost, highlightId, addCssClass, removeCssClass}) {\n highlightSupport.updateHighlight(editableHost, highlightId, addCssClass, removeCssClass)\n }\n\n /**\n * Subscribe a callback function to a custom event fired by the API.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to execute in response to the\n * event.\n *\n * @chainable\n */\n on (event, handler) {\n // TODO throw error if event is not one of EVENTS\n // TODO throw error if handler is not a function\n this.dispatcher.on(event, handler)\n return this\n }\n\n /**\n * Unsubscribe a callback function from a custom event fired by the API.\n * Opposite of {{#crossLink \"Editable/on\"}}{{/crossLink}}.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to remove from the\n * event or the special value false to remove all callbacks.\n *\n * @chainable\n */\n off (...args) {\n this.dispatcher.off.apply(this.dispatcher, args)\n return this\n }\n\n /**\n * Unsubscribe all callbacks and event listeners.\n *\n * @chainable\n */\n unload () {\n this.dispatcher.unload()\n return this\n }\n\n /**\n * Takes coordinates and uses its left value to find out how to offset a character in a string to\n * closely match the coordinates.left value.\n * Takes conditions for the result being on the first line, used when navigating to a paragraph from\n * the above paragraph and being on the last line, used when navigating to a paragraph from the below\n * paragraph.\n *\n * Internally this sets up the methods used for a binary cursor search and calls this.\n *\n * @param {DomNode} element\n * - the editable hostDOM Node to which the cursor jumps\n * @param {object} coordinates\n * - The bounding rect of the preceding cursor to be matched\n * @param {boolean} requiredOnFirstLine\n * - set to true if you want to require the cursor to be on the first line of the paragraph\n * @param {boolean} requiredOnLastLine\n * - set to true if you want to require the cursor to be on the last line of the paragraph\n *\n * @return {Object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\n findClosestCursorOffset ({\n element,\n origCoordinates,\n requiredOnFirstLine = false,\n requiredOnLastLine = false\n }) {\n const positionX = this.dispatcher.switchContext\n ? this.dispatcher.switchContext.positionX\n : origCoordinates.left\n\n return binaryCursorSearch({\n host: element,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX\n })\n }\n}\n\n// Expose modules and editable\nEditable.parser = parser\nEditable.content = content\nEditable.browser = browser\n\n// Set up callback functions for several events.\n;['focus', 'blur', 'flow', 'selection', 'cursor', 'newline',\n 'insert', 'split', 'merge', 'empty', 'change', 'switch',\n 'move', 'clipboard', 'paste', 'spellcheckUpdated', 'selectToBoundary'\n].forEach((name) => {\n // Generate a callback function to subscribe to an event.\n Editable.prototype[name] = function (handler) {\n return this.on(name, handler)\n }\n})\n","import createDefaultBehavior from './create-default-behavior'\n\nexport default function createDefaultEvents (editable) {\n const behavior = createDefaultBehavior(editable)\n\n return {\n /**\n * The focus event is triggered when an element gains focus.\n * The default behavior is to... TODO\n *\n * @event focus\n * @param {HTMLElement} element The element triggering the event.\n */\n focus (element) {\n behavior.focus(element)\n },\n\n /**\n * The blur event is triggered when an element looses focus.\n * The default behavior is to... TODO\n *\n * @event blur\n * @param {HTMLElement} element The element triggering the event.\n */\n blur (element) {\n behavior.blur(element)\n },\n\n /**\n * The flow event is triggered when the user starts typing or pause typing.\n * The default behavior is to... TODO\n *\n * @event flow\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The flow action: \"start\" or \"pause\".\n */\n flow (element, action) {\n behavior.flow(element, action)\n },\n\n /**\n * The selection event is triggered after the user has selected some\n * content.\n * The default behavior is to... TODO\n *\n * @event selection\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n */\n selection (element, selection) {\n behavior.selection(element, selection)\n },\n\n /**\n * The cursor event is triggered after cursor position has changed.\n * The default behavior is to... TODO\n *\n * @event cursor\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual Cursor object.\n */\n cursor (element, cursor) {\n behavior.cursor(element, cursor)\n },\n\n /**\n * The newline event is triggered when a newline should be inserted. This\n * happens when SHIFT+ENTER key is pressed.\n * The default behavior is to add a <br />\n *\n * @event newline\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual cursor object.\n */\n newline (element, cursor) {\n behavior.newline(element, cursor)\n },\n\n /**\n * The split event is triggered when a block should be split into two\n * blocks. This happens when ENTER is pressed within a non-empty block.\n * The default behavior is to... TODO\n *\n * @event split\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} before The HTML string before the split.\n * @param {String} after The HTML string after the split.\n * @param {Cursor} cursor The actual cursor object.\n */\n split (element, before, after, cursor) {\n behavior.split(element, before, after, cursor)\n },\n\n /**\n * The insert event is triggered when a new block should be inserted. This\n * happens when ENTER key is pressed at the beginning of a block (should\n * insert before) or at the end of a block (should insert after).\n * The default behavior is to... TODO\n *\n * @event insert\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The insert direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n insert (element, direction, cursor) {\n behavior.insert(element, direction, cursor)\n },\n\n /**\n * The merge event is triggered when two needs to be merged. This happens\n * when BACKSPACE is pressed at the beginning of a block (should merge with\n * the preceding block) or DEL is pressed at the end of a block (should\n * merge with the following block).\n * The default behavior is to... TODO\n *\n * @event merge\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The merge direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n merge (element, direction, cursor) {\n behavior.merge(element, direction, cursor)\n },\n\n /**\n * The empty event is triggered when a block is emptied.\n * The default behavior is to... TODO\n *\n * @event empty\n * @param {HTMLElement} element The element triggering the event.\n */\n empty (element) {\n behavior.empty(element)\n },\n\n /**\n * The switch event is triggered when the user switches to another block.\n * This happens when an ARROW key is pressed near the boundaries of a block.\n * The default behavior is to... TODO\n *\n * @event switch\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The switch direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.*\n */\n switch (element, direction, cursor) {\n behavior.switch(element, direction, cursor)\n },\n\n /**\n * The move event is triggered when the user moves a selection in a block.\n * This happens when the user selects some (or all) content in a block and\n * an ARROW key is pressed (up: drag before, down: drag after).\n * The default behavior is to... TODO\n *\n * @event move\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n * @param {String} direction The move direction: \"before\" or \"after\".\n */\n move (element, selection, direction) {\n behavior.move(element, selection, direction)\n },\n\n /**\n * The clipboard event is triggered when the user copies or cuts\n * a selection within a block.\n *\n * @event clipboard\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The clipboard action: \"copy\" or \"cut\".\n * @param {Selection} selection A selection object around the copied content.\n */\n clipboard (element, action, selection) {\n behavior.clipboard(element, action, selection)\n },\n\n /**\n * The paste event is triggered when the user pastes text\n *\n * @event paste\n * @param {HTMLElement} The element triggering the event.\n * @param {Array of String} The pasted blocks\n * @param {Cursor} The cursor object.\n */\n paste (element, blocks, cursor) {\n behavior.paste(element, blocks, cursor)\n },\n\n /**\n * The toggleBold event is triggered when the bold keyboard shortcut is used\n *\n * @event toggleBold\n * @param {Selection} The selection object.\n */\n toggleBold (selection) {\n behavior.toggleBold(selection)\n },\n\n /**\n * The toggleEmphasis event is triggered when the italic keyboard shortcut is used\n *\n * @event toggleEmphasis\n * @param {Selection} The selection object.\n */\n toggleEmphasis (selection) {\n behavior.toggleEmphasis(selection)\n }\n }\n}\n","import * as parser from './parser'\nimport * as content from './content'\nimport log from './util/log'\nimport * as block from './block'\nimport * as nodeType from './node-type'\n\n/**\n * The Behavior module defines the behavior triggered in response to the Editable.JS\n * events (see {{#crossLink \"Editable\"}}{{/crossLink}}).\n * The behavior can be overwritten by a user with Editable.init() or on\n * Editable.add() per element.\n *\n * @module core\n * @submodule behavior\n */\n\nexport default function createDefaultBehavior (editable) {\n const document = editable.win.document\n /**\n * Factory for the default behavior.\n * Provides default behavior of the Editable.JS API.\n *\n * @static\n */\n\n return {\n /** @param {HTMLElement} element */\n focus (element) {\n if (!parser.isVoid(element)) return\n\n // Add an zero width space if the editable is empty to force it to have a height\n // E.g. Firefox does not render empty block elements\n // and most browsers do not render empty inline elements.\n element.appendChild(document.createTextNode('\\uFEFF'))\n },\n\n blur (element) {\n // Note: there is a special case when the tab is changed where\n // we can get a blur event even if the cursor is still in the editable.\n // This blur would cause us to loose the cursor position (cause of cleanInternals()).\n // To prevent this we check if the activeElement is still the editable.\n // (Note: document.getSelection() did not work reliably in this case.)\n if (document.activeElement === element) return\n\n content.cleanInternals(element)\n },\n\n selection (element, selection) {\n log(selection ? 'Default selection behavior' : 'Default selection empty behavior')\n },\n\n cursor (element, cursor) {\n log(cursor ? 'Default cursor behavior' : 'Default cursor empty behavior')\n },\n\n newline (element, cursor) {\n // When the cursor is at the text end, we'll need to add an empty text node\n // after the br tag to ensure that the cursor shows up on the next line\n if (cursor.isAtTextEnd()) {\n const br = document.createElement('br')\n cursor.insertBefore(br)\n\n // Only append a zero width space if there's none after the br tag\n // We don't need to remove them as they get cleaned up on blur\n if (\n br.nextSibling?.nodeType !== nodeType.textNode ||\n br.nextSibling.textContent[0] !== '\\uFEFF'\n ) {\n cursor.insertAfter(document.createTextNode('\\uFEFF'))\n }\n } else {\n cursor.insertBefore(document.createElement('br'))\n }\n\n cursor.setVisibleSelection()\n },\n\n insert (element, direction, cursor) {\n const parent = element.parentNode\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n\n switch (direction) {\n case 'before':\n parent.insertBefore(newElement, element)\n element.focus()\n break\n case 'after':\n parent.insertBefore(newElement, element.nextSibling)\n newElement.focus()\n break\n }\n },\n\n split (element, before, after, cursor) {\n const newNode = element.cloneNode(false)\n newNode.appendChild(before)\n\n const parent = element.parentNode\n parent.insertBefore(newNode, element)\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(after)\n content.tidyHtml(newNode)\n content.tidyHtml(element)\n element.focus()\n },\n\n merge (element, direction, cursor) {\n let container, merger\n\n switch (direction) {\n case 'before':\n container = block.previous(element)\n merger = element\n break\n case 'after':\n container = element\n merger = block.next(element)\n break\n }\n\n if (!(container && merger)) return\n\n cursor = container.childNodes.length > 0\n ? editable.appendTo(container, merger.innerHTML)\n : editable.prependTo(container, merger.innerHTML)\n\n // remove merged node\n merger.remove()\n\n cursor.save()\n content.tidyHtml(container)\n cursor.restore()\n cursor.setVisibleSelection()\n },\n\n empty (element) {\n log('Default empty behavior')\n },\n\n switch (element, direction, cursor) {\n switch (direction) {\n case 'before':\n const previous = block.previous(element)\n if (previous) {\n cursor.moveAtTextEnd(previous)\n cursor.setVisibleSelection()\n }\n break\n case 'after':\n const next = block.next(element)\n if (next) {\n cursor.moveAtBeginning(next)\n cursor.setVisibleSelection()\n }\n break\n }\n },\n\n move (element, selection, direction) {\n log('Default move behavior')\n },\n\n paste (element, blocks, cursor) {\n if (blocks.length === 0) return\n\n cursor.insertBefore(blocks.shift())\n if (blocks.length === 0) return cursor.setVisibleSelection()\n\n const parent = element.parentNode\n let currentElement = element\n\n blocks.forEach((str) => {\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n const fragment = content.createFragmentFromString(str)\n newElement.appendChild(fragment)\n parent.insertBefore(newElement, currentElement.nextSibling)\n currentElement = newElement\n })\n\n // focus last element\n editable.createCursorAtEnd(currentElement)\n .setVisibleSelection()\n },\n\n clipboard (element, action, cursor) {\n log('Default clipboard behavior')\n },\n\n toggleBold (selection) {\n selection.toggleBold()\n },\n\n toggleEmphasis (selection) {\n selection.toggleEmphasis()\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","e","t","r","n","i","l","call","m","c","d","o","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","getFirstMatch","match","length","getSecondMatch","matchAndReturnConst","test","getWindowsVersionName","getMacOSVersionName","split","splice","map","parseInt","push","getAndroidVersionName","getVersionPrecision","compareVersions","a","Math","max","u","Array","join","reverse","min","find","assign","arguments","apply","concat","keys","forEach","getBrowserAlias","BROWSER_ALIASES_MAP","getBrowserTypeByAlias","BROWSER_MAP","ENGINE_MAP","OS_MAP","PLATFORMS_MAP","Bada","BlackBerry","Chrome","Chromium","Electron","Epiphany","Firefox","Focus","Generic","Googlebot","Maxthon","Opera","PhantomJS","Puffin","QupZilla","QQ","QQLite","Safari","Sailfish","SeaMonkey","Sleipnir","Swing","Tizen","Vivaldi","WeChat","Roku","amazon_silk","android","bada","blackberry","chrome","chromium","electron","epiphany","firefox","focus","generic","googlebot","google_search","ie","k_meleon","maxthon","edge","mz","naver","opera","opera_coast","phantomjs","puffin","qupzilla","qq","qqlite","safari","sailfish","samsung_internet","seamonkey","sleipnir","swing","tizen","uc","vivaldi","webos","wechat","yandex","tablet","mobile","desktop","tv","WindowsPhone","Windows","MacOS","iOS","Android","WebOS","Linux","ChromeOS","PlayStation4","EdgeHTML","Blink","Trident","Presto","Gecko","WebKit","configurable","writable","key","getParser","Error","parse","getResult","this","_ua","parsedResult","getUA","parseBrowser","browser","some","describe","getBrowser","getBrowserName","String","name","toLowerCase","getBrowserVersion","version","getOS","os","parseOS","getOSName","getOSVersion","getPlatform","platform","parsePlatform","getPlatformType","type","getEngine","engine","parseEngine","getEngineName","satisfies","isOS","isPlatform","f","h","isBrowser","compareVersion","substr","indexOf","isEngine","is","search","versionName","replace","vendor","model","Number","OBJECT","FUNCTION","UNDEFINED","domRangeProperties","domRangeMethods","textRangeProperties","textRangeMethods","isHostMethod","isHostObject","isHostProperty","createMultiplePropertyTest","testFunc","props","areHostMethods","areHostObjects","areHostProperties","isTextRange","range","getBody","doc","body","getElementsByTagName","extend","addListener","modules","window","document","util","arr","func","len","api","initialized","supported","features","config","alertOnFail","alertOnWarn","preferTextRange","autoInitialize","rangyAutoInitialize","consoleLog","msg","console","log","alertOrLog","shouldAlert","alert","fail","reason","warn","obj","deep","toString","createOptions","optionsParam","defaults","options","toArray","el","createElement","appendChild","slice","childNodes","nodeType","arrayLike","eventType","listener","addEventListener","attachEvent","initListeners","getErrorDesc","ex","message","description","init","testRange","implementsDomRange","implementsTextRange","createRange","nodeName","createTextRange","moduleName","Module","deprecationNotice","deprecated","replacement","createAliasForDeprecatedMethod","owner","addInitListener","shimListeners","dependencies","initializer","createModule","initFunc","newModule","stack","RangePrototype","addShimListener","shim","createMissingNativeApi","win","requiredModule","requiredModuleNames","createError","createCoreModule","rangePrototype","selectionPrototype","UNDEF","textNode","createTextNode","arrayContains","val","getNodeIndex","node","previousSibling","getCommonAncestor","node1","node2","ancestors","parentNode","isAncestorOf","ancestor","descendant","selfIsAncestor","getClosestAncestorIn","isCharacterDataNode","insertAfter","precedingNode","nextNode","nextSibling","parent","insertBefore","getDocument","ownerDocument","getWindow","defaultView","parentWindow","getIframeDocument","iframeEl","contentDocument","contentWindow","isWindow","getComputedStyleProperty","crashyTextNodes","isBrokenNode","inspectNode","data","idAttr","id","innerHTML","NodeIterator","_next","DomPosition","offset","DOMException","codeName","code","firstChild","getComputedStyle","propName","documentElement","currentStyle","_current","hasNext","next","child","detach","equals","pos","inspect","INDEX_SIZE_ERR","HIERARCHY_REQUEST_ERR","WRONG_DOCUMENT_ERR","NO_MODIFICATION_ALLOWED_ERR","NOT_FOUND_ERR","NOT_SUPPORTED_ERR","INVALID_STATE_ERR","INVALID_NODE_TYPE_ERR","dom","isHtmlNamespace","ns","namespaceURI","parentElement","getNodeLength","isOrIsAncestorOf","isTextOrCommentNode","splitDataNode","index","positionsToPreserve","newNode","cloneNode","deleteData","position","getIframeWindow","getContentDocument","methodName","tagName","getRootContainer","comparePoints","nodeA","offsetA","nodeB","offsetB","nodeC","childA","childB","createTestElement","html","contentEditable","bodyFirstChild","removeNode","removeChild","fragmentFromNodeChildren","fragment","createDocumentFragment","createIterator","isNonTextPartiallySelected","startContainer","endContainer","getRangeDocument","getBoundaryBeforeNode","getBoundaryAfterNode","insertNodeAtPosition","firstNodeInserted","rangesIntersect","rangeA","rangeB","touchingIsIntersecting","assertRangeValid","startComparison","startOffset","endOffset","endComparison","cloneSubtree","iterator","partiallySelected","subIterator","frag","isPartiallySelectedSubtree","getSubtreeIterator","iterateSubtree","rangeIterator","iteratorState","it","subRangeIterator","stop","deleteSubtree","remove","extractSubtree","getName","RangeIterator","clonePartiallySelectedTextNodes","collapsed","sc","so","ec","eo","commonAncestorContainer","isSingleCharacterDataNode","_first","_last","reset","current","start","end","subRange","cloneRange","collapse","Range","updateBoundaries","beforeAfterNodeTypes","rootContainerNodeTypes","insertableNodeTypes","surroundNodeTypes","createAncestorFinder","nodeTypes","getDocumentOrFragmentContainer","getReadonlyAncestor","getDocTypeNotationEntityAncestor","getElementAncestor","assertNoDocTypeNotationEntityAncestor","allowSelf","assertValidNodeType","invalidTypes","assertValidOffset","assertSameDocumentOrFragment","assertNodeNotReadOnly","assertNode","isValidOffset","isRangeValid","styleEl","htmlParsingConforms","createContextualFragment","fragmentStr","splitRangeBoundaries","startEndSame","setStartAndEnd","rangeToHtml","container","cloneContents","rangeProperties","s2s","s2e","e2e","e2s","n_b","n_a","n_b_a","n_i","copyComparisonConstantsToObject","START_TO_START","START_TO_END","END_TO_END","END_TO_START","NODE_BEFORE","NODE_AFTER","NODE_BEFORE_AND_AFTER","NODE_INSIDE","copyComparisonConstants","constructor","createRangeContentRemover","remover","boundaryUpdater","boundary","returnValue","createPrototypeRange","createBeforeAfterNodeSetter","isBefore","isStart","setRangeStart","setRangeEnd","F","setStart","setEnd","args","setBoundary","setStartBefore","setStartAfter","setEndBefore","setEndAfter","selectNodeContents","selectNode","extractContents","deleteContents","canSurroundContents","boundariesInvalid","splitBoundaries","splitBoundariesPreservingPositions","normalizeBoundaries","sibling","mergeForward","appendData","mergeBackward","nodeLength","insertData","nodeIndex","normalizeStart","endNode","startNode","collapseToPoint","updateCollapsedAndCommonAncestor","compareBoundaryPoints","how","prefixA","prefixB","insertNode","clone","surroundContents","content","hasChildNodes","lastChild","prop","textParts","compareNode","comparePoint","toHtml","intersectsNode","isPointInRange","intersectsRange","intersectsOrTouchesRange","intersection","intersectionRange","union","unionRange","containsNode","allowPartial","containsNodeContents","containsRange","containsNodeText","nodeRange","textNodes","getNodes","lastTextNode","pop","filter","regex","filterNodeTypes","filterExists","RegExp","nodes","getNodesInRange","collapseBefore","collapseAfter","getBookmark","containerNode","preSelectionRange","moveToBookmark","bookmark","charIndex","nextCharIndex","nodeStack","foundStart","rangesEqual","isValid","r1","r2","DomRange","WrappedRange","WrappedTextRange","rangeProto","updateRangeProperties","nativeRange","startMoved","endMoved","nativeRangeDifferent","refresh","testTextNode","oppositeName","range2","createNativeRange","getTextRangeBoundaryPosition","textRange","wholeRangeContainerElement","isCollapsed","startInfo","workingRange","duplicate","containerElement","canHaveHTML","boundaryPosition","nodeInfo","workingNode","comparison","previousNode","boundaryNode","workingComparisonType","childNodeCount","moveToElementText","compareEndPoints","floor","setEndPoint","tempRange","rangeLength","text","moveStart","createBoundaryTextRange","boundaryParent","boundaryOffset","nodeIsDataNode","startBoundary","rangeContainerElement","parentEl","startEl","endEl","startEndContainer","getTextRangeContainerElement","rangeToTextRange","startRange","endRange","toTextRange","globalObj","Function","createRangyRange","checkSelectionRanges","getNativeSelection","selectionIsCollapsed","BOOLEAN","NUMBER","CONTROL","isDirectionBackward","dir","WrappedSelection","getDocSelection","winParam","selection","winSelectionIsBackward","sel","backward","anchorNode","anchorOffset","focusNode","focusOffset","implementsWinGetSelection","implementsDocSelection","useDocumentSelection","isSelectionValid","nativeSel","getSelection","testSelection","selectionHasAnchorAndFocus","selectionHasExtend","selectionHasSetBaseAndExtent","selectionHasRangeCount","rangeCount","selectionSupportsMultipleRanges","collapsedNonEditableSelectionsSupported","addRangeBackwardToNative","nativeSelection","addRange","getNativeRange","originalSelectionRangeCount","selectionHasMultipleRanges","originalSelectionRanges","originalSelectionBackward","getRangeAt","testEl","removeAllRanges","chromeMatch","navigator","appVersion","testControlRange","getSelectionRangeAt","implementsControlRange","updateAnchorAndFocusFromRange","anchorPrefix","focusPrefix","updateEmptySelection","_ranges","updateType","getSingleElementFromRange","rangeNodes","rangeContainsSingleElement","updateFromTextRange","wrappedRange","updateControlSelection","docSelection","controlRange","item","addRangeToControlSelection","rangeElement","newControlRange","createControlRange","add","select","deleteProperties","detached","cachedRangySelections","actOnCachedSelection","action","cached","docSel","refreshSelection","selProto","createControlSelection","ranges","addRangeBackward","direction","previousRangeCount","clonedNativeRange","selectionIsBackward","setRanges","empty","updateAnchorAndFocusFromNativeSelection","checkForChanges","oldRanges","oldAnchorNode","oldAnchorOffset","removeRangeManually","getAllRanges","assertNodeInSameDocument","createStartOrEndSetter","setSingleRange","isBackward","rangeInspects","anchor","removeRange","removed","isBackwards","rangeTexts","collapseToStart","collapseToEnd","selectAllChildren","setBaseAndExtent","deleteFromDocument","element","eachRange","callMethodOnEachRange","params","results","changeEachRange","rangeBookmarks","rangeBookmark","selRanges","saveRanges","restoreRanges","rangeHtmls","getNativeTextRange","detachAll","Selection","docReady","loadHandler","readyState","rangy","trailingSpaceBeforeBrCollapses","trailingSpaceBeforeBlockCollapses","CHARACTER","WORD","spacesRegex","spacesMinusLineBreaksRegex","allWhiteSpaceRegex","nonLineBreakWhiteSpaceRegex","defaultLanguage","convertCharRangeToToken","chars","tokenRange","tokenChars","token","isWord","tokenize","wordOptions","tokenizer","tokenRanges","tokens","defaultCharacterOptions","includeBlockContentTrailingSpace","includeSpaceBeforeBr","includeSpaceBeforeBlock","includePreLineTrailingSpace","ignoreCharacters","defaultCaretCharacterOptions","defaultWordOptions","wordRegex","includeTrailingSpace","result","word","createTokenRange","wordStart","wordEnd","lastWordEnd","exec","defaultFindOptions","caseSensitive","withinRange","wholeWordsOnly","wrap","characterOptions","defaultMoveOptions","defaultExpandOptions","trim","trimStart","trimEnd","defaultWordIteratorOptions","createNestedOptions","lang","language","createWordOptions","tableCssDisplayBlock","table","defaultDisplayValueForTag","caption","colgroup","col","thead","tbody","tfoot","tr","td","th","getComputedDisplay","display","isHidden","unshift","getAncestors","getAncestorsAndSelf","excludeChildren","nextNodeDescendants","previous","isWhitespaceNode","computedWhiteSpace","isCollapsedWhitespaceNode","isCollapsedNode","isVisibilityHiddenTextNode","isIgnoredNode","Cache","store","createCachingGetter","objProperty","cache","NodeWrapper","session","positions","set","nodeProto","getPosition","Position","EMPTY","NON_SPACE","UNCOLLAPSIBLE_SPACE","COLLAPSIBLE_SPACE","TRAILING_SPACE_BEFORE_BLOCK","TRAILING_SPACE_IN_BLOCK","TRAILING_SPACE_BEFORE_BR","PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK","INCLUDED_TRAILING_LINE_BREAK_AFTER_BR","nodeWrapper","getLength","containsPositions","isWhitespace","isCollapsedWhitespace","isIgnored","getTextNodeInfo","spaceRegex","collapseSpaces","cssWhitespace","preLine","hasInnerText","posAfterEl","firstPosInEl","endPos","prepopulateChar","isDefinitelyNonEmpty","previousVisible","nextVisible","isRenderedBlock","brs","getTrailingSpace","getNodeWrapper","getLeadingSpace","positionProto","character","characterType","isBr","prepopulatedChar","visibleChar","charType","finalizedChar","textChar","charAt","nodePassed","checkForTrailingSpace","checkForLeadingSpace","isCharInvariant","resolveLeadingAndTrailingSpaces","trailingSpace","isTrailingSpace","leadingSpace","isLeadingSpace","getPrecedingUncollapsedPosition","getCharacter","thisChar","ignoredChars","ignoredCharacters","ignoredCharsArray","sort","char1","char2","charCodeAt","normalizeIgnoredCharacters","isIgnoredCharacter","cacheKey","cachedChar","nextPos","previousPos","collapsible","gotPreviousPos","getPreviousPos","nextUncollapsed","nextOffset","previousOffset","newPos","currentSession","Session","createWrapperCache","nodeProperty","wrappersByProperty","wrapper","property","uniqueIDSupported","initCaches","elementsCache","elementCache","uniqueID","elWrapper","textNodeCache","otherNodeCache","wrapperCache","getRangeBoundaryPosition","prefix","getSession","endSession","createCharacterIterator","startPos","finished","charPos","previousTextPos","returnPreviousTextPos","rewind","dispose","arrayIndexOf","createTokenizedTextProvider","forwardIterator","backwardIterator","consumeWord","forward","newChars","passedWordBoundary","insideWord","forwardChars","backwardChars","forwardTokensBuffer","backwardTokensBuffer","nextEndToken","lastToken","shift","previousStartToken","createRangeCharacterIterator","rangeStart","rangeEnd","isWholeWord","expand","findTextFromPosition","initialPos","searchTerm","isRegex","searchScopeRange","findOptions","currentChar","matchStartIndex","matchEndIndex","insideRegexMatch","handleMatch","startIndex","endIndex","valid","createEntryPointFunction","sessionRunning","createRangeBoundaryMover","unit","count","moveOptions","boundaryIsStart","moveResult","currentPos","charIterator","unitsMoved","absCount","abs","tokenizedTextProvider","movePositionBy","createRangeTrimmer","trimCharCount","trimmed","createSelectionTrimmer","moveEnd","move","startTrimmed","endTrimmed","expandOptions","moved","endToken","newEndPos","startToken","newStartPos","getRangeCharacters","selectCharacters","toCharacterRange","rangeStartsBeforeNode","rangeBetween","findText","searchTermParam","findResult","wrappedAround","pasteHtml","saveCharacterRanges","rangeInfos","characterRange","restoreCharacterRanges","saved","rangeInfo","innerText","createWordIterator","iteratorOptions","noMutation","isBlockNode","createPosition","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","g","globalThis","_classCallCheck","instance","Constructor","TypeError","_typeof","_defineProperties","target","descriptor","arg","input","hint","prim","toPrimitive","res","_createClass","protoProps","staticProps","logErrors","editableClass","editableDisabledClass","pastingAttribute","trimLeadingAndTrailingWhitespaces","boldMarkup","attribs","italicMarkup","underlineMarkup","linkMarkup","pastedHtmlRules","allowedElements","allowedPlainTextElements","requiredAttributes","transformElements","splitIntoBlocks","blockLevelElements","blacklistedElements","keepInternalRelativeLinks","replaceQuotes","error","from","global","htmlCharacters","trimRight","isString","elementNode","documentFragmentNode","domArray","querySelectorAll","isArray","domSelector","querySelector","firstElementChild","closest","elem","selector","getHost","jquery","isVoid","_step","_iterator","_createForOfIteratorHelper","done","isVoidTextNode","err","nodeValue","isWhitespaceOnly","lastOffsetWithContent","isLinebreak","string","lastOffset","every","isBeginningOfHost","host","isStartOffset","offsetInParent","isEndOfHost","isEndOffset","getAttribute","isTextEndOfHost","isTextEndOffset","isSameNode","source","attr","attributes","latestChild","isDocumentFragmentWithoutChildren","isInlineElement","boundaryMarkerId","markerTextChar","isChildOf","possibleChild","children","insertRangeBoundaryMarker","atStart","directlyBeforeFormatTag","startContainerIsChild","directlyAfterFormatTag","endContainerIsChild","markerEl","setAttribute","style","lineHeight","boundaryRange","setRangeBoundary","markerId","getMarker","save","startMarkerId","endMarkerId","restore","restored","restoreRange","rangeSaveRestore","zeroWidthSpace","zeroWidthNonBreakingSpace","whitespaceExceptSpace","tidyHtml","normalizeTags","removeWhitespaces","textContent","parser","_step2","_iterator2","siblingChild","normalizeWhitespace","cleanInternals","extractContent","keepUiElements","innerHtml","getInnerHtmlOfFragment","unwrapInternalNodes","documentFragment","div","createFragmentFromString","htmlString","adoptElement","adoptNode","cloneRangeContents","_elem","firstCall","startsWith","unwrap","getTags","filterFunc","innerTags","getInnerTags","ancestorTags","getAncestorTags","tags","getTagsByName","toUpperCase","getTagsByNameAndAttributes","areSameAttributes","attrs1","attrs2","getContainedTags","getTagNames","isAffectedBy","isExactSelection","visible","elemRange","rangeText","elemText","expandTo","toggleTag","elems","removeFormattingElem","forceWrap","isWrappable","restoredRange","nukeElem","nuke","removeFormatting","matches","insertCharacter","insertEl","surround","startCharacter","endCharacter","deleteCharacter","containsString","charRegexp","str","flags","escapedStr","nukeTag","nextBlockId","state","getSibling","_ref","normalize","plainText","shouldSpellcheck","hasAttribute","setBlockId","Boolean","classList","isPlainTextBlock","arr2","_toConsumableArray","iter","minLen","replacements","doubleQuotePairs","singleQuotePairs","apostrophe","quotesRegex","beforeOpeningQuote","afterClosingQuote","replaceAllQuotes","replaceQuotesRules","quotes","singleQuotes","matchAll","char","before","after","getAllQuotes","replaceMatchedQuotes","replaceExistingQuotes","closingTag","findClosingQuote","nestedMatches","replaceApostrophe","openingQuote","possibleClosingSingleQuotes","getPossibleClosingQuotes","possibleClosingDoubleQuotes","includes","pairs","quotePair","quote","whitespaceOnly","blockPlaceholder","updateConfig","conf","rules","paste","block","cursor","clipboardContent","isSelection","deleteExactSurroundingTags","deleteContainedTags","deleteContent","pasteHolder","blocks","_ref$plainText","filterHtmlElements","entry","group","parseContent","removeAttribute","reduce","href","stripInternalHost","location","origin","requiredAttrs","hasRequiredAttributes","shouldKeepNode","transformNodeName","_ref2","filterAttributes","conditionalNodeWrap","webKit","userAgent","selectionchange","osc","onselectionchange","hasNativeSelectionchangeSupport","contenteditableSpanBug","eventable","notifyContext","events","listeners","event","on","off","eventListeners","removeListener","notify","context","switchContext","getEventableModule","getScrollPosition","x","pageXOffset","scrollLeft","y","pageYOffset","scrollTop","Cursor","editableHost","rangyRange","setHost","isCursor","hostRange","hostCoords","getRangeBoundingClientRect","cursorCoords","isCloseTo","bottom","top","preceedingElement","lastIndex","setVisibleSelection","activeElement","_viewport$getScrollPo","viewport","scrollTo","getBoundingClientRect","positioning","coords","_viewport$getScrollPo2","left","right","height","width","updateHost","moveAtEnd","callback","savedRangeInfo","isEqualNode","attributeName","attributeValue","createEvent","initEvent","dispatchEvent","b","_setPrototypeOf","setPrototypeOf","__proto__","_getPrototypeOf","getPrototypeOf","_Symbol$iterator","method","iteratorFunc","getNext","prev","getPrevious","extractText","getText","part","highlightMatches","wordId","currentMatchIndex","totalOffset","currentMatch","portions","nodeText","nodeEndOffset","isFirstPortion","isLastPortion","portion","substring","lastNode","wrapMatch","marker","title","replaceCurrent","stencilElement","_this","wrapPortion","WordHighlighting","markerNode","matchMode","_obj$ownerDocument","HTMLElement","highlights","isElement","searchMatches","createWordRegex","createHighlightRegex","prepareMatch","matchedText","words","escapedWords","escapeRegEx","letterChars","highlightSupport","highlightText","highlightId","hasHighlight","blockText","createMarkerNode","TextHighlighting","findMatches","highlightRange","dispatcher","removeHighlight","firstMarker","textSearch","matchesArray","_this$getIndex","getIndex","actualStartIndex","actualEndIndex","cleanupStaleMarkerNodes","updateHighlight","addCssClass","removeCssClass","extractHighlightedRanges","findMarkersQuery","markers","_step3","groups","_iterator3","extractMarkerNodePosition","highlightType","_step4","_iterator4","markerMarkup","newStartIndex","ReferenceError","_Cursor","subClass","superClass","_inherits","_super","_createSuper","getClientRects","attrs","link","trimRange","textToTrim","whitespacesOnTheLeft","lastNonWhitespace","whitespacesOnTheRight","links","firstLink","unlink","textBefore","currentTextContent","setSelection","_ref2$trim","customElem","toggle","_ref3","_ref3$trim","bold","em","removeSurround","ancestorTag","containedTag","onlyVisible","RangeContainer","isAnythingSelected","getCursor","otherRangeContainer","other","SelectionWatcher","rangySelection","currentSelection","currentRange","successfulSync","syncSelection","hostNode","getRangeContainer","forceCursor","newRange","isDifferentFrom","lastSelection","Keyboard","selectionWatcher","notifyCharacterEvent","keyCode","up","down","tab","shiftKey","esc","backspace","preventContenteditableBug","enter","ctrl","alt","ctrlKey","metaKey","rangyInstance","getFreshRange","nodeToRemove","getNodeToRemove","selectionRange","startNodeElement","startNodeRange","contentNodeTypes","firstContentNode","rangeStartingBeforeCurrentElement","delete","isInputEventSupported","Dispatcher","editable","supportsInputEvent","editableSelector","keyboard","activeListeners","setup","getEditableBlockByEvent","evt","capture","setupKeyboardEvents","setupEventListeners","removeEventListener","suspended","setupElementListeners","setupKeydownListener","setupSelectionChangeListeners","setupSelectionChangeFallbackListeners","setupDocumentListener","getFreshSelection","triggerChangeEvent","preventDefault","clipboardData","getData","_clipboard$paste","clipboard","retainVisibleSelection","searchValue","replaceValue","lastOccurrenceIndex","lastIndexOf","replaceLast","altKey","positionX","isAtFirstLine","stopPropagation","isAtLastLine","dispatchKeyEvent","dispatchSwitchEvent","isAtBeginning","isAtTextEnd","selectionDirty","suppressSelectionChanges","isAtEnd","selectionChanged","mouseMoveSelectionChanges","setTimeout","once","_this2","array","ListCache","entries","clear","__data__","size","has","freeSelf","objectProto","nativeObjectToString","symToStringTag","isOwn","tag","unmasked","uid","maskSrcKey","IE_PROTO","funcToString","reIsHostCtor","reIsNative","object","Hash","MapCache","Stack","LARGE_ARRAY_SIZE","iteratee","keysFunc","iterable","freeExports","freeModule","Buffer","allocUnsafe","Uint8Array","typedArray","isDeep","arrayBuffer","buffer","byteLength","byteOffset","objectCreate","proto","transform","Ctor","propertyIsEnumerable","isBuffer","objectCtorString","typedArrayTags","freeProcess","process","nodeUtil","require","types","binding","nodeIsTypedArray","isTypedArray","objValue","reIsUint","inherited","isArr","isArg","isBuff","isType","skipIndexes","isProto","customizer","isNew","newValue","srcIndex","mergeFunc","srcValue","stacked","isCommon","isTyped","copy","baseMerge","nativeMax","nativeNow","Date","now","lastCalled","stamp","remaining","otherArgs","thisArg","assigner","sources","guard","SpellcheckService","spellcheckService","condensedText","misspelledWords","characters","WhitespaceHighlighting","unicode","MatchCollection","matches1","matches2","length1","length2","lastEndIndex","output","a1","i1","a2","i2","pickNext","mergeMatches","item1","item2","Highlighting","configuration","spellcheckConfig","focusedEditableHost","currentlyCheckedEditableHost","timeout","_merge","checkOnInit","checkOnFocus","checkOnChange","throttle","removeOnCorrection","spellcheck","whitespace","spellcheckMarker","whitespaceMarker","spellcheckMarkerNode","whitespaceMarkerNode","setupListeners","onFocus","onBlur","onChange","onInit","highlight","editableHasChanged","removeHighlightsAtCursor","clearTimeout","timeoutId","_this3","check","matchCollection","addMatches","safeHighlightMatches","_this4","removeHighlights","elementAtCursor","trace","textNodesUnder","getTextNodeAndRelativeOffset","targetNode","absOffset","cumulativeOffset","relativeOffset","moveLeft","rightLimit","currentOffset","leftLimit","moveRight","ceil","createRangeAtCharacterOffset","_getTextNodeAndRelati","Editable","instanceConfig","behavior","defaultInstanceConfig","defaultBehavior","browserSpellcheck","blur","newline","_br$nextSibling","br","insert","newElement","merge","merger","appendTo","prependTo","moveAtTextEnd","moveAtBeginning","currentElement","createCursorAtEnd","toggleBold","toggleEmphasis","createDefaultBehavior","flow","enable","targets","disable","setState","_ref$normalize","suspend","_step5","_iterator5","findHost","nextCursor","createCursor","inputElement","contentToAppend","contentToPrepend","hightlightingConfig","highlighting","outerHTML","setupHighlighting","checkSpelling","raiseEvents","_ref3$type","_ref4","_ref5","_ref6","handler","_len","_key","unload","_ref7","origCoordinates","_ref7$requiredOnFirst","requiredOnFirstLine","_ref7$requiredOnLastL","requiredOnLastLine","totalCharCount","acc","wasFound","distance","safety","finalDistance","binaryCursorSearch","globalConfig"],"sourceRoot":""}
1
+ {"version":3,"file":"dist/editable.js","mappings":"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","sources":["webpack://Editable/webpack/universalModuleDefinition","webpack://Editable/./node_modules/bowser/es5.js","webpack://Editable/./node_modules/rangy/lib/rangy-core.js","webpack://Editable/./node_modules/rangy/lib/rangy-textrange.js","webpack://Editable/webpack/bootstrap","webpack://Editable/webpack/runtime/compat get default export","webpack://Editable/webpack/runtime/define property getters","webpack://Editable/webpack/runtime/global","webpack://Editable/webpack/runtime/hasOwnProperty shorthand","webpack://Editable/webpack/runtime/make namespace object","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://Editable/./src/config.js","webpack://Editable/./src/util/error.js","webpack://Editable/./src/util/string.js","webpack://Editable/./src/node-type.js","webpack://Editable/./src/node-iterator.js","webpack://Editable/./src/util/dom.js","webpack://Editable/./src/parser.js","webpack://Editable/./src/range-save-restore.js","webpack://Editable/./src/content.js","webpack://Editable/./src/block.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://Editable/./src/quotes.js","webpack://Editable/./src/clipboard.js","webpack://Editable/./src/feature-detection.js","webpack://Editable/./src/eventable.js","webpack://Editable/./src/util/viewport.js","webpack://Editable/./src/cursor.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://Editable/./src/highlight-text.js","webpack://Editable/./src/plugins/highlighting/text-highlighting.js","webpack://Editable/./src/highlight-support.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://Editable/./src/selection.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://Editable/./src/range-container.js","webpack://Editable/./src/selection-watcher.js","webpack://Editable/./src/keyboard.js","webpack://Editable/./src/dispatcher.js","webpack://Editable/./node_modules/lodash-es/_listCacheClear.js","webpack://Editable/./node_modules/lodash-es/eq.js","webpack://Editable/./node_modules/lodash-es/_assocIndexOf.js","webpack://Editable/./node_modules/lodash-es/_listCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_ListCache.js","webpack://Editable/./node_modules/lodash-es/_listCacheGet.js","webpack://Editable/./node_modules/lodash-es/_listCacheHas.js","webpack://Editable/./node_modules/lodash-es/_listCacheSet.js","webpack://Editable/./node_modules/lodash-es/_freeGlobal.js","webpack://Editable/./node_modules/lodash-es/_root.js","webpack://Editable/./node_modules/lodash-es/_Symbol.js","webpack://Editable/./node_modules/lodash-es/_getRawTag.js","webpack://Editable/./node_modules/lodash-es/_objectToString.js","webpack://Editable/./node_modules/lodash-es/_baseGetTag.js","webpack://Editable/./node_modules/lodash-es/isObject.js","webpack://Editable/./node_modules/lodash-es/isFunction.js","webpack://Editable/./node_modules/lodash-es/_coreJsData.js","webpack://Editable/./node_modules/lodash-es/_isMasked.js","webpack://Editable/./node_modules/lodash-es/_toSource.js","webpack://Editable/./node_modules/lodash-es/_baseIsNative.js","webpack://Editable/./node_modules/lodash-es/_getNative.js","webpack://Editable/./node_modules/lodash-es/_getValue.js","webpack://Editable/./node_modules/lodash-es/_Map.js","webpack://Editable/./node_modules/lodash-es/_nativeCreate.js","webpack://Editable/./node_modules/lodash-es/_hashGet.js","webpack://Editable/./node_modules/lodash-es/_hashHas.js","webpack://Editable/./node_modules/lodash-es/_Hash.js","webpack://Editable/./node_modules/lodash-es/_hashClear.js","webpack://Editable/./node_modules/lodash-es/_hashDelete.js","webpack://Editable/./node_modules/lodash-es/_hashSet.js","webpack://Editable/./node_modules/lodash-es/_getMapData.js","webpack://Editable/./node_modules/lodash-es/_isKeyable.js","webpack://Editable/./node_modules/lodash-es/_MapCache.js","webpack://Editable/./node_modules/lodash-es/_mapCacheClear.js","webpack://Editable/./node_modules/lodash-es/_mapCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_mapCacheGet.js","webpack://Editable/./node_modules/lodash-es/_mapCacheHas.js","webpack://Editable/./node_modules/lodash-es/_mapCacheSet.js","webpack://Editable/./node_modules/lodash-es/_Stack.js","webpack://Editable/./node_modules/lodash-es/_stackClear.js","webpack://Editable/./node_modules/lodash-es/_stackDelete.js","webpack://Editable/./node_modules/lodash-es/_stackGet.js","webpack://Editable/./node_modules/lodash-es/_stackHas.js","webpack://Editable/./node_modules/lodash-es/_stackSet.js","webpack://Editable/./node_modules/lodash-es/_defineProperty.js","webpack://Editable/./node_modules/lodash-es/_baseAssignValue.js","webpack://Editable/./node_modules/lodash-es/_assignMergeValue.js","webpack://Editable/./node_modules/lodash-es/_baseFor.js","webpack://Editable/./node_modules/lodash-es/_createBaseFor.js","webpack://Editable/./node_modules/lodash-es/_cloneBuffer.js","webpack://Editable/./node_modules/lodash-es/_Uint8Array.js","webpack://Editable/./node_modules/lodash-es/_cloneTypedArray.js","webpack://Editable/./node_modules/lodash-es/_cloneArrayBuffer.js","webpack://Editable/./node_modules/lodash-es/_baseCreate.js","webpack://Editable/./node_modules/lodash-es/_getPrototype.js","webpack://Editable/./node_modules/lodash-es/_overArg.js","webpack://Editable/./node_modules/lodash-es/_isPrototype.js","webpack://Editable/./node_modules/lodash-es/isObjectLike.js","webpack://Editable/./node_modules/lodash-es/_baseIsArguments.js","webpack://Editable/./node_modules/lodash-es/isArguments.js","webpack://Editable/./node_modules/lodash-es/isArray.js","webpack://Editable/./node_modules/lodash-es/isLength.js","webpack://Editable/./node_modules/lodash-es/isArrayLike.js","webpack://Editable/./node_modules/lodash-es/isBuffer.js","webpack://Editable/./node_modules/lodash-es/stubFalse.js","webpack://Editable/./node_modules/lodash-es/isPlainObject.js","webpack://Editable/./node_modules/lodash-es/_baseIsTypedArray.js","webpack://Editable/./node_modules/lodash-es/_nodeUtil.js","webpack://Editable/./node_modules/lodash-es/isTypedArray.js","webpack://Editable/./node_modules/lodash-es/_baseUnary.js","webpack://Editable/./node_modules/lodash-es/_safeGet.js","webpack://Editable/./node_modules/lodash-es/_assignValue.js","webpack://Editable/./node_modules/lodash-es/_isIndex.js","webpack://Editable/./node_modules/lodash-es/_arrayLikeKeys.js","webpack://Editable/./node_modules/lodash-es/_baseTimes.js","webpack://Editable/./node_modules/lodash-es/_baseKeysIn.js","webpack://Editable/./node_modules/lodash-es/_nativeKeysIn.js","webpack://Editable/./node_modules/lodash-es/keysIn.js","webpack://Editable/./node_modules/lodash-es/toPlainObject.js","webpack://Editable/./node_modules/lodash-es/_copyObject.js","webpack://Editable/./node_modules/lodash-es/_baseMergeDeep.js","webpack://Editable/./node_modules/lodash-es/isArrayLikeObject.js","webpack://Editable/./node_modules/lodash-es/_copyArray.js","webpack://Editable/./node_modules/lodash-es/_initCloneObject.js","webpack://Editable/./node_modules/lodash-es/_baseMerge.js","webpack://Editable/./node_modules/lodash-es/identity.js","webpack://Editable/./node_modules/lodash-es/_overRest.js","webpack://Editable/./node_modules/lodash-es/_baseSetToString.js","webpack://Editable/./node_modules/lodash-es/constant.js","webpack://Editable/./node_modules/lodash-es/_shortOut.js","webpack://Editable/./node_modules/lodash-es/_setToString.js","webpack://Editable/./node_modules/lodash-es/_baseRest.js","webpack://Editable/./node_modules/lodash-es/_apply.js","webpack://Editable/./node_modules/lodash-es/merge.js","webpack://Editable/./node_modules/lodash-es/_createAssigner.js","webpack://Editable/./node_modules/lodash-es/_isIterateeCall.js","webpack://Editable/./src/plugins/highlighting/spellcheck-service.js","webpack://Editable/./src/plugins/highlighting/whitespace-highlighting.js","webpack://Editable/./src/plugins/highlighting/match-collection.js","webpack://Editable/./src/highlighting.js","webpack://Editable/./src/util/log.js","webpack://Editable/./src/util/element.js","webpack://Editable/./src/util/binary_search.js","webpack://Editable/./src/core.js","webpack://Editable/./src/create-default-events.js","webpack://Editable/./src/create-default-behavior.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Editable\"] = factory();\n\telse\n\t\troot[\"Editable\"] = factory();\n})(self, () => {\nreturn ","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.bowser=t():e.bowser=t()}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"\",r(r.s=90)}({17:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||\"\"},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||\"\"},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},e.getMacOSVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},e.getAndroidVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?\"Cupcake\":1===t[0]&&t[1]>=6?\"Donut\":2===t[0]&&t[1]<2?\"Eclair\":2===t[0]&&2===t[1]?\"Froyo\":2===t[0]&&t[1]>2?\"Gingerbread\":3===t[0]?\"Honeycomb\":4===t[0]&&t[1]<1?\"Ice Cream Sandwich\":4===t[0]&&t[1]<4?\"Jelly Bean\":4===t[0]&&t[1]>=4?\"KitKat\":5===t[0]?\"Lollipop\":6===t[0]?\"Marshmallow\":7===t[0]?\"Nougat\":8===t[0]?\"Oreo\":9===t[0]?\"Pie\":void 0},e.getVersionPrecision=function(e){return e.split(\".\").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],(function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(\".0\");return e.map(n.split(\".\"),(function(e){return new Array(20-e.length).join(\"0\")+e})).reverse()}));for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1}else if(u[0][a]<u[1][a])return-1}},e.map=function(e,t){var r,n=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)n.push(t(e[r]));return n},e.find=function(e,t){var r,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,n=e.length;r<n;r+=1){var i=e[r];if(t(i,r))return i}},e.assign=function(e){for(var t,r,n=e,i=arguments.length,s=new Array(i>1?i-1:0),a=1;a<i;a++)s[a-1]=arguments[a];if(Object.assign)return Object.assign.apply(Object,[e].concat(s));var o=function(){var e=s[t];\"object\"==typeof e&&null!==e&&Object.keys(e).forEach((function(t){n[t]=e[t]}))};for(t=0,r=s.length;t<r;t+=1)o();return e},e.getBrowserAlias=function(e){return n.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return n.BROWSER_MAP[e]||\"\"},e}();t.default=i,e.exports=t.default},18:function(e,t,r){\"use strict\";t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0;t.BROWSER_ALIASES_MAP={\"Amazon Silk\":\"amazon_silk\",\"Android Browser\":\"android\",Bada:\"bada\",BlackBerry:\"blackberry\",Chrome:\"chrome\",Chromium:\"chromium\",Electron:\"electron\",Epiphany:\"epiphany\",Firefox:\"firefox\",Focus:\"focus\",Generic:\"generic\",\"Google Search\":\"google_search\",Googlebot:\"googlebot\",\"Internet Explorer\":\"ie\",\"K-Meleon\":\"k_meleon\",Maxthon:\"maxthon\",\"Microsoft Edge\":\"edge\",\"MZ Browser\":\"mz\",\"NAVER Whale Browser\":\"naver\",Opera:\"opera\",\"Opera Coast\":\"opera_coast\",PhantomJS:\"phantomjs\",Puffin:\"puffin\",QupZilla:\"qupzilla\",QQ:\"qq\",QQLite:\"qqlite\",Safari:\"safari\",Sailfish:\"sailfish\",\"Samsung Internet for Android\":\"samsung_internet\",SeaMonkey:\"seamonkey\",Sleipnir:\"sleipnir\",Swing:\"swing\",Tizen:\"tizen\",\"UC Browser\":\"uc\",Vivaldi:\"vivaldi\",\"WebOS Browser\":\"webos\",WeChat:\"wechat\",\"Yandex Browser\":\"yandex\",Roku:\"roku\"};t.BROWSER_MAP={amazon_silk:\"Amazon Silk\",android:\"Android Browser\",bada:\"Bada\",blackberry:\"BlackBerry\",chrome:\"Chrome\",chromium:\"Chromium\",electron:\"Electron\",epiphany:\"Epiphany\",firefox:\"Firefox\",focus:\"Focus\",generic:\"Generic\",googlebot:\"Googlebot\",google_search:\"Google Search\",ie:\"Internet Explorer\",k_meleon:\"K-Meleon\",maxthon:\"Maxthon\",edge:\"Microsoft Edge\",mz:\"MZ Browser\",naver:\"NAVER Whale Browser\",opera:\"Opera\",opera_coast:\"Opera Coast\",phantomjs:\"PhantomJS\",puffin:\"Puffin\",qupzilla:\"QupZilla\",qq:\"QQ Browser\",qqlite:\"QQ Browser Lite\",safari:\"Safari\",sailfish:\"Sailfish\",samsung_internet:\"Samsung Internet for Android\",seamonkey:\"SeaMonkey\",sleipnir:\"Sleipnir\",swing:\"Swing\",tizen:\"Tizen\",uc:\"UC Browser\",vivaldi:\"Vivaldi\",webos:\"WebOS Browser\",wechat:\"WeChat\",yandex:\"Yandex Browser\"};t.PLATFORMS_MAP={tablet:\"tablet\",mobile:\"mobile\",desktop:\"desktop\",tv:\"tv\"};t.OS_MAP={WindowsPhone:\"Windows Phone\",Windows:\"Windows\",MacOS:\"macOS\",iOS:\"iOS\",Android:\"Android\",WebOS:\"WebOS\",BlackBerry:\"BlackBerry\",Bada:\"Bada\",Tizen:\"Tizen\",Linux:\"Linux\",ChromeOS:\"Chrome OS\",PlayStation4:\"PlayStation 4\",Roku:\"Roku\"};t.ENGINE_MAP={EdgeHTML:\"EdgeHTML\",Blink:\"Blink\",Trident:\"Trident\",Presto:\"Presto\",Gecko:\"Gecko\",WebKit:\"WebKit\"}},90:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(91))&&n.__esModule?n:{default:n},s=r(18);function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var o=function(){function e(){}var t,r,n;return e.getParser=function(e,t){if(void 0===t&&(t=!1),\"string\"!=typeof e)throw new Error(\"UserAgent should be a string\");return new i.default(e,t)},e.parse=function(e){return new i.default(e).getResult()},t=e,n=[{key:\"BROWSER_MAP\",get:function(){return s.BROWSER_MAP}},{key:\"ENGINE_MAP\",get:function(){return s.ENGINE_MAP}},{key:\"OS_MAP\",get:function(){return s.OS_MAP}},{key:\"PLATFORMS_MAP\",get:function(){return s.PLATFORMS_MAP}}],(r=null)&&a(t.prototype,r),n&&a(t,n),e}();t.default=o,e.exports=t.default},91:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n=u(r(92)),i=u(r(93)),s=u(r(94)),a=u(r(95)),o=u(r(17));function u(e){return e&&e.__esModule?e:{default:e}}var d=function(){function e(e,t){if(void 0===t&&(t=!1),null==e||\"\"===e)throw new Error(\"UserAgent parameter can't be empty\");this._ua=e,this.parsedResult={},!0!==t&&this.parse()}var t=e.prototype;return t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=o.default.find(n.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||\"\":this.getBrowser().name||\"\"},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=o.default.find(i.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||\"\":t||\"\"},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||\"\":t||\"\"},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=o.default.find(s.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||\"\":this.getEngine().name||\"\"},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=o.default.find(a.default,(function(t){if(\"function\"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error(\"Browser's test function is not valid\")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return o.default.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,r={},n=0,i={},s=0;if(Object.keys(e).forEach((function(t){var a=e[t];\"string\"==typeof a?(i[t]=a,s+=1):\"object\"==typeof a&&(r[t]=a,n+=1)})),n>0){var a=Object.keys(r),u=o.default.find(a,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=o.default.find(a,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=o.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===e[0]||\"<\"===e[0]?(r=e.substr(1),\"=\"===e[1]?(n=!0,r=e.substr(2)):t=[],\">\"===e[0]?t.push(1):t.push(-1)):\"=\"===e[0]?r=e.substr(1):\"~\"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\\/(\\d+(\\.?_?\\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:\"Googlebot\"},r=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\\/|opios/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:\"Samsung Internet for Android\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:\"NAVER Whale Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:\"MZ Browser\"},r=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:\"Focus\"},r=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:\"Swing\"},r=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:\"Opera Coast\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\\/\\d+(?:.?_?\\d+)+/i],describe:function(e){var t={name:\"Opera Touch\"},r=i.default.getFirstMatch(/(?:opt)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:\"Yandex Browser\"},r=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:\"UC Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:\"Maxthon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:\"Epiphany\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:\"Puffin\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:\"Sleipnir\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:\"K-Meleon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:\"WeChat\"},r=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?\"QQ Browser Lite\":\"QQ Browser\"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:\"Internet Explorer\"},r=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\\sedg\\//i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:\"Vivaldi\"},r=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:\"SeaMonkey\"},r=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:\"Sailfish\"},r=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:\"Amazon Silk\"},r=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:\"PhantomJS\"},r=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:\"SlimerJS\"},r=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t={name:\"BlackBerry\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:\"WebOS Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:\"Bada\"},r=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:\"Tizen\"},r=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:\"QupZilla\"},r=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:\"Firefox\"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:\"Electron\"},r=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:\"Miui\"},r=i.default.getFirstMatch(/(?:MiuiBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:\"Chromium\"},r=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:\"Chrome\"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:\"Google Search\"},r=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:\"Android Browser\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:\"PlayStation 4\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:\"Safari\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default},93:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(e){var t={name:s.OS_MAP.iOS},r=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,e).replace(/[_\\s]/g,\".\"),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,e).replace(/[_\\s]/g,\".\");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,e)||i.default.getFirstMatch(/\\bbb(\\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default},94:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&\"Nova\",r={type:s.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return t&&(r.model=t),r}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:t}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"blackberry\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(e){return\"bada\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"windows phone\"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(\".\")[0]);return\"android\"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return\"android\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"macos\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(e){return\"windows\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"linux\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"playstation 4\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return\"roku\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default},95:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return\"microsoft edge\"===e.getBrowserName(!0)},describe:function(e){if(/\\sedg\\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default}})}));","/**\n * Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Copyright 2022, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.1\n * Build date: 17 August 2022\n */\n\n(function(factory, root) {\n if (typeof define == \"function\" && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n // Node/CommonJS style\n module.exports = factory();\n } else {\n // No AMD or CommonJS support so we place Rangy in (probably) the global variable\n root.rangy = factory();\n }\n})(function() {\n\n var OBJECT = \"object\", FUNCTION = \"function\", UNDEFINED = \"undefined\";\n\n // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START\n // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.\n var domRangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n // Minimal set of methods required for DOM Level 2 Range compliance\n var domRangeMethods = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\",\n \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\",\n \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"];\n\n var textRangeProperties = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"];\n\n // Subset of TextRange's full set of methods that we're interested in\n var textRangeMethods = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\",\n \"setEndPoint\", \"getBoundingClientRect\"];\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Trio of functions taken from Peter Michaux's article:\n // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting\n function isHostMethod(o, p) {\n var t = typeof o[p];\n return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == \"unknown\";\n }\n\n function isHostObject(o, p) {\n return !!(typeof o[p] == OBJECT && o[p]);\n }\n\n function isHostProperty(o, p) {\n return typeof o[p] != UNDEFINED;\n }\n\n // Creates a convenience function to save verbose repeated calls to tests functions\n function createMultiplePropertyTest(testFunc) {\n return function(o, props) {\n var i = props.length;\n while (i--) {\n if (!testFunc(o, props[i])) {\n return false;\n }\n }\n return true;\n };\n }\n\n // Next trio of functions are a convenience to save verbose repeated calls to previous two functions\n var areHostMethods = createMultiplePropertyTest(isHostMethod);\n var areHostObjects = createMultiplePropertyTest(isHostObject);\n var areHostProperties = createMultiplePropertyTest(isHostProperty);\n\n function isTextRange(range) {\n return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);\n }\n\n function getBody(doc) {\n return isHostObject(doc, \"body\") ? doc.body : doc.getElementsByTagName(\"body\")[0];\n }\n\n var forEach = [].forEach ?\n function(arr, func) {\n arr.forEach(func);\n } :\n function(arr, func) {\n for (var i = 0, len = arr.length; i < len; ++i) {\n func(arr[i], i);\n }\n };\n\n var modules = {};\n\n var isBrowser = (typeof window != UNDEFINED && typeof document != UNDEFINED);\n\n var util = {\n isHostMethod: isHostMethod,\n isHostObject: isHostObject,\n isHostProperty: isHostProperty,\n areHostMethods: areHostMethods,\n areHostObjects: areHostObjects,\n areHostProperties: areHostProperties,\n isTextRange: isTextRange,\n getBody: getBody,\n forEach: forEach\n };\n\n var api = {\n version: \"1.3.1\",\n initialized: false,\n isBrowser: isBrowser,\n supported: true,\n util: util,\n features: {},\n modules: modules,\n config: {\n alertOnFail: false,\n alertOnWarn: false,\n preferTextRange: false,\n autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize\n }\n };\n\n function consoleLog(msg) {\n if (typeof console != UNDEFINED && isHostMethod(console, \"log\")) {\n console.log(msg);\n }\n }\n\n function alertOrLog(msg, shouldAlert) {\n if (isBrowser && shouldAlert) {\n alert(msg);\n } else {\n consoleLog(msg);\n }\n }\n\n function fail(reason) {\n api.initialized = true;\n api.supported = false;\n alertOrLog(\"Rangy is not supported in this environment. Reason: \" + reason, api.config.alertOnFail);\n }\n\n api.fail = fail;\n\n function warn(msg) {\n alertOrLog(\"Rangy warning: \" + msg, api.config.alertOnWarn);\n }\n\n api.warn = warn;\n\n // Add utility extend() method\n var extend;\n if ({}.hasOwnProperty) {\n util.extend = extend = function(obj, props, deep) {\n var o, p;\n for (var i in props) {\n if (props.hasOwnProperty(i)) {\n o = obj[i];\n p = props[i];\n if (deep && o !== null && typeof o == \"object\" && p !== null && typeof p == \"object\") {\n extend(o, p, true);\n }\n obj[i] = p;\n }\n }\n // Special case for toString, which does not show up in for...in loops in IE <= 8\n if (props.hasOwnProperty(\"toString\")) {\n obj.toString = props.toString;\n }\n return obj;\n };\n\n util.createOptions = function(optionsParam, defaults) {\n var options = {};\n extend(options, defaults);\n if (optionsParam) {\n extend(options, optionsParam);\n }\n return options;\n };\n } else {\n fail(\"hasOwnProperty not supported\");\n }\n\n // Test whether we're in a browser and bail out if not\n if (!isBrowser) {\n fail(\"Rangy can only run in a browser\");\n }\n\n // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not\n (function() {\n var toArray;\n\n if (isBrowser) {\n var el = document.createElement(\"div\");\n el.appendChild(document.createElement(\"span\"));\n var slice = [].slice;\n try {\n if (slice.call(el.childNodes, 0)[0].nodeType == 1) {\n toArray = function(arrayLike) {\n return slice.call(arrayLike, 0);\n };\n }\n } catch (e) {}\n }\n\n if (!toArray) {\n toArray = function(arrayLike) {\n var arr = [];\n for (var i = 0, len = arrayLike.length; i < len; ++i) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n util.toArray = toArray;\n })();\n\n // Very simple event handler wrapper function that doesn't attempt to solve issues such as \"this\" handling or\n // normalization of event properties because we don't need this.\n var addListener;\n if (isBrowser) {\n if (isHostMethod(document, \"addEventListener\")) {\n addListener = function(obj, eventType, listener) {\n obj.addEventListener(eventType, listener, false);\n };\n } else if (isHostMethod(document, \"attachEvent\")) {\n addListener = function(obj, eventType, listener) {\n obj.attachEvent(\"on\" + eventType, listener);\n };\n } else {\n fail(\"Document does not have required addEventListener or attachEvent method\");\n }\n\n util.addListener = addListener;\n }\n\n var initListeners = [];\n\n function getErrorDesc(ex) {\n return ex.message || ex.description || String(ex);\n }\n\n // Initialization\n function init() {\n if (!isBrowser || api.initialized) {\n return;\n }\n var testRange;\n var implementsDomRange = false, implementsTextRange = false;\n\n // First, perform basic feature tests\n\n if (isHostMethod(document, \"createRange\")) {\n testRange = document.createRange();\n if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {\n implementsDomRange = true;\n }\n }\n\n var body = getBody(document);\n if (!body || body.nodeName.toLowerCase() != \"body\") {\n fail(\"No body element found\");\n return;\n }\n\n if (body && isHostMethod(body, \"createTextRange\")) {\n testRange = body.createTextRange();\n if (isTextRange(testRange)) {\n implementsTextRange = true;\n }\n }\n\n if (!implementsDomRange && !implementsTextRange) {\n fail(\"Neither Range nor TextRange are available\");\n return;\n }\n\n api.initialized = true;\n api.features = {\n implementsDomRange: implementsDomRange,\n implementsTextRange: implementsTextRange\n };\n\n // Initialize modules\n var module, errorMessage;\n for (var moduleName in modules) {\n if ( (module = modules[moduleName]) instanceof Module ) {\n module.init(module, api);\n }\n }\n\n // Call init listeners\n for (var i = 0, len = initListeners.length; i < len; ++i) {\n try {\n initListeners[i](api);\n } catch (ex) {\n errorMessage = \"Rangy init listener threw an exception. Continuing. Detail: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n }\n }\n }\n\n function deprecationNotice(deprecated, replacement, module) {\n if (module) {\n deprecated += \" in module \" + module.name;\n }\n api.warn(\"DEPRECATED: \" + deprecated + \" is deprecated. Please use \" +\n replacement + \" instead.\");\n }\n\n function createAliasForDeprecatedMethod(owner, deprecated, replacement, module) {\n owner[deprecated] = function() {\n deprecationNotice(deprecated, replacement, module);\n return owner[replacement].apply(owner, util.toArray(arguments));\n };\n }\n\n util.deprecationNotice = deprecationNotice;\n util.createAliasForDeprecatedMethod = createAliasForDeprecatedMethod;\n\n // Allow external scripts to initialize this library in case it's loaded after the document has loaded\n api.init = init;\n\n // Execute listener immediately if already initialized\n api.addInitListener = function(listener) {\n if (api.initialized) {\n listener(api);\n } else {\n initListeners.push(listener);\n }\n };\n\n var shimListeners = [];\n\n api.addShimListener = function(listener) {\n shimListeners.push(listener);\n };\n\n function shim(win) {\n win = win || window;\n init();\n\n // Notify listeners\n for (var i = 0, len = shimListeners.length; i < len; ++i) {\n shimListeners[i](win);\n }\n }\n\n if (isBrowser) {\n api.shim = api.createMissingNativeApi = shim;\n createAliasForDeprecatedMethod(api, \"createMissingNativeApi\", \"shim\");\n }\n\n function Module(name, dependencies, initializer) {\n this.name = name;\n this.dependencies = dependencies;\n this.initialized = false;\n this.supported = false;\n this.initializer = initializer;\n }\n\n Module.prototype = {\n init: function() {\n var requiredModuleNames = this.dependencies || [];\n for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {\n moduleName = requiredModuleNames[i];\n\n requiredModule = modules[moduleName];\n if (!requiredModule || !(requiredModule instanceof Module)) {\n throw new Error(\"required module '\" + moduleName + \"' not found\");\n }\n\n requiredModule.init();\n\n if (!requiredModule.supported) {\n throw new Error(\"required module '\" + moduleName + \"' not supported\");\n }\n }\n\n // Now run initializer\n this.initializer(this);\n },\n\n fail: function(reason) {\n this.initialized = true;\n this.supported = false;\n throw new Error(reason);\n },\n\n warn: function(msg) {\n api.warn(\"Module \" + this.name + \": \" + msg);\n },\n\n deprecationNotice: function(deprecated, replacement) {\n api.warn(\"DEPRECATED: \" + deprecated + \" in module \" + this.name + \" is deprecated. Please use \" +\n replacement + \" instead\");\n },\n\n createError: function(msg) {\n return new Error(\"Error in Rangy \" + this.name + \" module: \" + msg);\n }\n };\n\n function createModule(name, dependencies, initFunc) {\n var newModule = new Module(name, dependencies, function(module) {\n if (!module.initialized) {\n module.initialized = true;\n try {\n initFunc(api, module);\n module.supported = true;\n } catch (ex) {\n var errorMessage = \"Module '\" + name + \"' failed to load: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n if (ex.stack) {\n consoleLog(ex.stack);\n }\n }\n }\n });\n modules[name] = newModule;\n return newModule;\n }\n\n api.createModule = function(name) {\n // Allow 2 or 3 arguments (second argument is an optional array of dependencies)\n var initFunc, dependencies;\n if (arguments.length == 2) {\n initFunc = arguments[1];\n dependencies = [];\n } else {\n initFunc = arguments[2];\n dependencies = arguments[1];\n }\n\n var module = createModule(name, dependencies, initFunc);\n\n // Initialize the module immediately if the core is already initialized\n if (api.initialized && api.supported) {\n module.init();\n }\n };\n\n api.createCoreModule = function(name, dependencies, initFunc) {\n createModule(name, dependencies, initFunc);\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately\n\n function RangePrototype() {}\n api.RangePrototype = RangePrototype;\n api.rangePrototype = new RangePrototype();\n\n function SelectionPrototype() {}\n api.selectionPrototype = new SelectionPrototype();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // DOM utility methods used by Rangy\n api.createCoreModule(\"DomUtil\", [], function(api, module) {\n var UNDEF = \"undefined\";\n var util = api.util;\n var getBody = util.getBody;\n\n // Perform feature tests\n if (!util.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"])) {\n module.fail(\"document missing a Node creation method\");\n }\n\n if (!util.isHostMethod(document, \"getElementsByTagName\")) {\n module.fail(\"document missing getElementsByTagName method\");\n }\n\n var el = document.createElement(\"div\");\n if (!util.areHostMethods(el, [\"insertBefore\", \"appendChild\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]))) {\n module.fail(\"Incomplete Element implementation\");\n }\n\n // innerHTML is required for Range's createContextualFragment method\n if (!util.isHostProperty(el, \"innerHTML\")) {\n module.fail(\"Element is missing innerHTML property\");\n }\n\n var textNode = document.createTextNode(\"test\");\n if (!util.areHostMethods(textNode, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) ||\n !util.areHostProperties(textNode, [\"data\"]))) {\n module.fail(\"Incomplete Text Node implementation\");\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been\n // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that\n // contains just the document as a single element and the value searched for is the document.\n var arrayContains = /*Array.prototype.indexOf ?\n function(arr, val) {\n return arr.indexOf(val) > -1;\n }:*/\n\n function(arr, val) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === val) {\n return true;\n }\n }\n return false;\n };\n\n // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI\n function isHtmlNamespace(node) {\n var ns;\n return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == \"http://www.w3.org/1999/xhtml\");\n }\n\n function parentElement(node) {\n var parent = node.parentNode;\n return (parent.nodeType == 1) ? parent : null;\n }\n\n function getNodeIndex(node) {\n var i = 0;\n while( (node = node.previousSibling) ) {\n ++i;\n }\n return i;\n }\n\n function getNodeLength(node) {\n switch (node.nodeType) {\n case 7:\n case 10:\n return 0;\n case 3:\n case 8:\n return node.length;\n default:\n return node.childNodes.length;\n }\n }\n\n function getCommonAncestor(node1, node2) {\n var ancestors = [], n;\n for (n = node1; n; n = n.parentNode) {\n ancestors.push(n);\n }\n\n for (n = node2; n; n = n.parentNode) {\n if (arrayContains(ancestors, n)) {\n return n;\n }\n }\n\n return null;\n }\n\n function isAncestorOf(ancestor, descendant, selfIsAncestor) {\n var n = selfIsAncestor ? descendant : descendant.parentNode;\n while (n) {\n if (n === ancestor) {\n return true;\n } else {\n n = n.parentNode;\n }\n }\n return false;\n }\n\n function isOrIsAncestorOf(ancestor, descendant) {\n return isAncestorOf(ancestor, descendant, true);\n }\n\n function getClosestAncestorIn(node, ancestor, selfIsAncestor) {\n var p, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n p = n.parentNode;\n if (p === ancestor) {\n return n;\n }\n n = p;\n }\n return null;\n }\n\n function isCharacterDataNode(node) {\n var t = node.nodeType;\n return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment\n }\n\n function isTextOrCommentNode(node) {\n if (!node) {\n return false;\n }\n var t = node.nodeType;\n return t == 3 || t == 8 ; // Text or Comment\n }\n\n function insertAfter(node, precedingNode) {\n var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;\n if (nextNode) {\n parent.insertBefore(node, nextNode);\n } else {\n parent.appendChild(node);\n }\n return node;\n }\n\n // Note that we cannot use splitText() because it is bugridden in IE 9.\n function splitDataNode(node, index, positionsToPreserve) {\n var newNode = node.cloneNode(false);\n newNode.deleteData(0, index);\n node.deleteData(index, node.length - index);\n insertAfter(newNode, node);\n\n // Preserve positions\n if (positionsToPreserve) {\n for (var i = 0, position; position = positionsToPreserve[i++]; ) {\n // Handle case where position was inside the portion of node after the split point\n if (position.node == node && position.offset > index) {\n position.node = newNode;\n position.offset -= index;\n }\n // Handle the case where the position is a node offset within node's parent\n else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {\n ++position.offset;\n }\n }\n }\n return newNode;\n }\n\n function getDocument(node) {\n if (node.nodeType == 9) {\n return node;\n } else if (typeof node.ownerDocument != UNDEF) {\n return node.ownerDocument;\n } else if (typeof node.document != UNDEF) {\n return node.document;\n } else if (node.parentNode) {\n return getDocument(node.parentNode);\n } else {\n throw module.createError(\"getDocument: no document found for node\");\n }\n }\n\n function getWindow(node) {\n var doc = getDocument(node);\n if (typeof doc.defaultView != UNDEF) {\n return doc.defaultView;\n } else if (typeof doc.parentWindow != UNDEF) {\n return doc.parentWindow;\n } else {\n throw module.createError(\"Cannot get a window object for node\");\n }\n }\n\n function getIframeDocument(iframeEl) {\n if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument;\n } else if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow.document;\n } else {\n throw module.createError(\"getIframeDocument: No Document object found for iframe element\");\n }\n }\n\n function getIframeWindow(iframeEl) {\n if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow;\n } else if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument.defaultView;\n } else {\n throw module.createError(\"getIframeWindow: No Window object found for iframe element\");\n }\n }\n\n // This looks bad. Is it worth it?\n function isWindow(obj) {\n return obj && util.isHostMethod(obj, \"setTimeout\") && util.isHostObject(obj, \"document\");\n }\n\n function getContentDocument(obj, module, methodName) {\n var doc;\n\n if (!obj) {\n doc = document;\n }\n\n // Test if a DOM node has been passed and obtain a document object for it if so\n else if (util.isHostProperty(obj, \"nodeType\")) {\n doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == \"iframe\") ?\n getIframeDocument(obj) : getDocument(obj);\n }\n\n // Test if the doc parameter appears to be a Window object\n else if (isWindow(obj)) {\n doc = obj.document;\n }\n\n if (!doc) {\n throw module.createError(methodName + \"(): Parameter must be a Window object or DOM node\");\n }\n\n return doc;\n }\n\n function getRootContainer(node) {\n var parent;\n while ( (parent = node.parentNode) ) {\n node = parent;\n }\n return node;\n }\n\n function comparePoints(nodeA, offsetA, nodeB, offsetB) {\n // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing\n var nodeC, root, childA, childB, n;\n if (nodeA == nodeB) {\n // Case 1: nodes are the same\n return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {\n // Case 2: node C (container B or an ancestor) is a child node of A\n return offsetA <= getNodeIndex(nodeC) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {\n // Case 3: node C (container A or an ancestor) is a child node of B\n return getNodeIndex(nodeC) < offsetB ? -1 : 1;\n } else {\n root = getCommonAncestor(nodeA, nodeB);\n if (!root) {\n throw new Error(\"comparePoints error: nodes have no common ancestor\");\n }\n\n // Case 4: containers are siblings or descendants of siblings\n childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);\n childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);\n\n if (childA === childB) {\n // This shouldn't be possible\n throw module.createError(\"comparePoints got to case 4 and childA and childB are the same!\");\n } else {\n n = root.firstChild;\n while (n) {\n if (n === childA) {\n return -1;\n } else if (n === childB) {\n return 1;\n }\n n = n.nextSibling;\n }\n }\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried\n var crashyTextNodes = false;\n\n function isBrokenNode(node) {\n var n;\n try {\n n = node.parentNode;\n return false;\n } catch (e) {\n return true;\n }\n }\n\n (function() {\n var el = document.createElement(\"b\");\n el.innerHTML = \"1\";\n var textNode = el.firstChild;\n el.innerHTML = \"<br />\";\n crashyTextNodes = isBrokenNode(textNode);\n\n api.features.crashyTextNodes = crashyTextNodes;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function inspectNode(node) {\n if (!node) {\n return \"[No node]\";\n }\n if (crashyTextNodes && isBrokenNode(node)) {\n return \"[Broken node]\";\n }\n if (isCharacterDataNode(node)) {\n return '\"' + node.data + '\"';\n }\n if (node.nodeType == 1) {\n var idAttr = node.id ? ' id=\"' + node.id + '\"' : \"\";\n return \"<\" + node.nodeName + idAttr + \">[index:\" + getNodeIndex(node) + \",length:\" + node.childNodes.length + \"][\" + (node.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n }\n return node.nodeName;\n }\n\n function fragmentFromNodeChildren(node) {\n var fragment = getDocument(node).createDocumentFragment(), child;\n while ( (child = node.firstChild) ) {\n fragment.appendChild(child);\n }\n return fragment;\n }\n\n var getComputedStyleProperty;\n if (typeof window.getComputedStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return getWindow(el).getComputedStyle(el, null)[propName];\n };\n } else if (typeof document.documentElement.currentStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return el.currentStyle ? el.currentStyle[propName] : \"\";\n };\n } else {\n module.fail(\"No means of obtaining computed style properties found\");\n }\n\n function createTestElement(doc, html, contentEditable) {\n var body = getBody(doc);\n var el = doc.createElement(\"div\");\n el.contentEditable = \"\" + !!contentEditable;\n if (html) {\n el.innerHTML = html;\n }\n\n // Insert the test element at the start of the body to prevent scrolling to the bottom in iOS (issue #292)\n var bodyFirstChild = body.firstChild;\n if (bodyFirstChild) {\n body.insertBefore(el, bodyFirstChild);\n } else {\n body.appendChild(el);\n }\n\n return el;\n }\n\n function removeNode(node) {\n return node.parentNode.removeChild(node);\n }\n\n function NodeIterator(root) {\n this.root = root;\n this._next = root;\n }\n\n NodeIterator.prototype = {\n _current: null,\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n var n = this._current = this._next;\n var child, next;\n if (this._current) {\n child = n.firstChild;\n if (child) {\n this._next = child;\n } else {\n next = null;\n while ((n !== this.root) && !(next = n.nextSibling)) {\n n = n.parentNode;\n }\n this._next = next;\n }\n }\n return this._current;\n },\n\n detach: function() {\n this._current = this._next = this.root = null;\n }\n };\n\n function createIterator(root) {\n return new NodeIterator(root);\n }\n\n function DomPosition(node, offset) {\n this.node = node;\n this.offset = offset;\n }\n\n DomPosition.prototype = {\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset == pos.offset;\n },\n\n inspect: function() {\n return \"[DomPosition(\" + inspectNode(this.node) + \":\" + this.offset + \")]\";\n },\n\n toString: function() {\n return this.inspect();\n }\n };\n\n function DOMException(codeName) {\n this.code = this[codeName];\n this.codeName = codeName;\n this.message = \"DOMException: \" + this.codeName;\n }\n\n DOMException.prototype = {\n INDEX_SIZE_ERR: 1,\n HIERARCHY_REQUEST_ERR: 3,\n WRONG_DOCUMENT_ERR: 4,\n NO_MODIFICATION_ALLOWED_ERR: 7,\n NOT_FOUND_ERR: 8,\n NOT_SUPPORTED_ERR: 9,\n INVALID_STATE_ERR: 11,\n INVALID_NODE_TYPE_ERR: 24\n };\n\n DOMException.prototype.toString = function() {\n return this.message;\n };\n\n api.dom = {\n arrayContains: arrayContains,\n isHtmlNamespace: isHtmlNamespace,\n parentElement: parentElement,\n getNodeIndex: getNodeIndex,\n getNodeLength: getNodeLength,\n getCommonAncestor: getCommonAncestor,\n isAncestorOf: isAncestorOf,\n isOrIsAncestorOf: isOrIsAncestorOf,\n getClosestAncestorIn: getClosestAncestorIn,\n isCharacterDataNode: isCharacterDataNode,\n isTextOrCommentNode: isTextOrCommentNode,\n insertAfter: insertAfter,\n splitDataNode: splitDataNode,\n getDocument: getDocument,\n getWindow: getWindow,\n getIframeWindow: getIframeWindow,\n getIframeDocument: getIframeDocument,\n getBody: getBody,\n isWindow: isWindow,\n getContentDocument: getContentDocument,\n getRootContainer: getRootContainer,\n comparePoints: comparePoints,\n isBrokenNode: isBrokenNode,\n inspectNode: inspectNode,\n getComputedStyleProperty: getComputedStyleProperty,\n createTestElement: createTestElement,\n removeNode: removeNode,\n fragmentFromNodeChildren: fragmentFromNodeChildren,\n createIterator: createIterator,\n DomPosition: DomPosition\n };\n\n api.DOMException = DOMException;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Pure JavaScript implementation of DOM Range\n api.createCoreModule(\"DomRange\", [\"DomUtil\"], function(api, module) {\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DOMException = api.DOMException;\n\n var isCharacterDataNode = dom.isCharacterDataNode;\n var getNodeIndex = dom.getNodeIndex;\n var isOrIsAncestorOf = dom.isOrIsAncestorOf;\n var getDocument = dom.getDocument;\n var comparePoints = dom.comparePoints;\n var splitDataNode = dom.splitDataNode;\n var getClosestAncestorIn = dom.getClosestAncestorIn;\n var getNodeLength = dom.getNodeLength;\n var arrayContains = dom.arrayContains;\n var getRootContainer = dom.getRootContainer;\n var crashyTextNodes = api.features.crashyTextNodes;\n\n var removeNode = dom.removeNode;\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Utility functions\n\n function isNonTextPartiallySelected(node, range) {\n return (node.nodeType != 3) &&\n (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));\n }\n\n function getRangeDocument(range) {\n return range.document || getDocument(range.startContainer);\n }\n\n function getRangeRoot(range) {\n return getRootContainer(range.startContainer);\n }\n\n function getBoundaryBeforeNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node));\n }\n\n function getBoundaryAfterNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node) + 1);\n }\n\n function insertNodeAtPosition(node, n, o) {\n var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;\n if (isCharacterDataNode(n)) {\n if (o == n.length) {\n dom.insertAfter(node, n);\n } else {\n n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));\n }\n } else if (o >= n.childNodes.length) {\n n.appendChild(node);\n } else {\n n.insertBefore(node, n.childNodes[o]);\n }\n return firstNodeInserted;\n }\n\n function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {\n assertRangeValid(rangeA);\n assertRangeValid(rangeB);\n\n if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n\n var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),\n endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n }\n\n function cloneSubtree(iterator) {\n var partiallySelected;\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n partiallySelected = iterator.isPartiallySelectedSubtree();\n node = node.cloneNode(!partiallySelected);\n if (partiallySelected) {\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(cloneSubtree(subIterator));\n subIterator.detach();\n }\n\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function iterateSubtree(rangeIterator, func, iteratorState) {\n var it, n;\n iteratorState = iteratorState || { stop: false };\n for (var node, subRangeIterator; node = rangeIterator.next(); ) {\n if (rangeIterator.isPartiallySelectedSubtree()) {\n if (func(node) === false) {\n iteratorState.stop = true;\n return;\n } else {\n // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of\n // the node selected by the Range.\n subRangeIterator = rangeIterator.getSubtreeIterator();\n iterateSubtree(subRangeIterator, func, iteratorState);\n subRangeIterator.detach();\n if (iteratorState.stop) {\n return;\n }\n }\n } else {\n // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its\n // descendants\n it = dom.createIterator(node);\n while ( (n = it.next()) ) {\n if (func(n) === false) {\n iteratorState.stop = true;\n return;\n }\n }\n }\n }\n }\n\n function deleteSubtree(iterator) {\n var subIterator;\n while (iterator.next()) {\n if (iterator.isPartiallySelectedSubtree()) {\n subIterator = iterator.getSubtreeIterator();\n deleteSubtree(subIterator);\n subIterator.detach();\n } else {\n iterator.remove();\n }\n }\n }\n\n function extractSubtree(iterator) {\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n\n if (iterator.isPartiallySelectedSubtree()) {\n node = node.cloneNode(false);\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(extractSubtree(subIterator));\n subIterator.detach();\n } else {\n iterator.remove();\n }\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function getNodesInRange(range, nodeTypes, filter) {\n var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;\n var filterExists = !!filter;\n if (filterNodeTypes) {\n regex = new RegExp(\"^(\" + nodeTypes.join(\"|\") + \")$\");\n }\n\n var nodes = [];\n iterateSubtree(new RangeIterator(range, false), function(node) {\n if (filterNodeTypes && !regex.test(node.nodeType)) {\n return;\n }\n if (filterExists && !filter(node)) {\n return;\n }\n // Don't include a boundary container if it is a character data node and the range does not contain any\n // of its character data. See issue 190.\n var sc = range.startContainer;\n if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {\n return;\n }\n\n var ec = range.endContainer;\n if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {\n return;\n }\n\n nodes.push(node);\n });\n return nodes;\n }\n\n function inspect(range) {\n var name = (typeof range.getName == \"undefined\") ? \"Range\" : range.getName();\n return \"[\" + name + \"(\" + dom.inspectNode(range.startContainer) + \":\" + range.startOffset + \", \" +\n dom.inspectNode(range.endContainer) + \":\" + range.endOffset + \")]\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)\n\n function RangeIterator(range, clonePartiallySelectedTextNodes) {\n this.range = range;\n this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;\n\n\n if (!range.collapsed) {\n this.sc = range.startContainer;\n this.so = range.startOffset;\n this.ec = range.endContainer;\n this.eo = range.endOffset;\n var root = range.commonAncestorContainer;\n\n if (this.sc === this.ec && isCharacterDataNode(this.sc)) {\n this.isSingleCharacterDataNode = true;\n this._first = this._last = this._next = this.sc;\n } else {\n this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?\n this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);\n this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?\n this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);\n }\n }\n }\n\n RangeIterator.prototype = {\n _current: null,\n _next: null,\n _first: null,\n _last: null,\n isSingleCharacterDataNode: false,\n\n reset: function() {\n this._current = null;\n this._next = this._first;\n },\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n // Move to next node\n var current = this._current = this._next;\n if (current) {\n this._next = (current !== this._last) ? current.nextSibling : null;\n\n // Check for partially selected text nodes\n if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {\n if (current === this.ec) {\n (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);\n }\n if (this._current === this.sc) {\n (current = current.cloneNode(true)).deleteData(0, this.so);\n }\n }\n }\n\n return current;\n },\n\n remove: function() {\n var current = this._current, start, end;\n\n if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {\n start = (current === this.sc) ? this.so : 0;\n end = (current === this.ec) ? this.eo : current.length;\n if (start != end) {\n current.deleteData(start, end - start);\n }\n } else {\n if (current.parentNode) {\n removeNode(current);\n } else {\n }\n }\n },\n\n // Checks if the current node is partially selected\n isPartiallySelectedSubtree: function() {\n var current = this._current;\n return isNonTextPartiallySelected(current, this.range);\n },\n\n getSubtreeIterator: function() {\n var subRange;\n if (this.isSingleCharacterDataNode) {\n subRange = this.range.cloneRange();\n subRange.collapse(false);\n } else {\n subRange = new Range(getRangeDocument(this.range));\n var current = this._current;\n var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);\n\n if (isOrIsAncestorOf(current, this.sc)) {\n startContainer = this.sc;\n startOffset = this.so;\n }\n if (isOrIsAncestorOf(current, this.ec)) {\n endContainer = this.ec;\n endOffset = this.eo;\n }\n\n updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);\n }\n return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);\n },\n\n detach: function() {\n this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n }\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];\n var rootContainerNodeTypes = [2, 9, 11];\n var readonlyNodeTypes = [5, 6, 10, 12];\n var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];\n var surroundNodeTypes = [1, 3, 4, 5, 7, 8];\n\n function createAncestorFinder(nodeTypes) {\n return function(node, selfIsAncestor) {\n var t, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n t = n.nodeType;\n if (arrayContains(nodeTypes, t)) {\n return n;\n }\n n = n.parentNode;\n }\n return null;\n };\n }\n\n var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );\n var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);\n var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );\n var getElementAncestor = createAncestorFinder( [1] );\n\n function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {\n if (getDocTypeNotationEntityAncestor(node, allowSelf)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidNodeType(node, invalidTypes) {\n if (!arrayContains(invalidTypes, node.nodeType)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n function assertSameDocumentOrFragment(node1, node2) {\n if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertNodeNotReadOnly(node) {\n if (getReadonlyAncestor(node, true)) {\n throw new DOMException(\"NO_MODIFICATION_ALLOWED_ERR\");\n }\n }\n\n function assertNode(node, codeName) {\n if (!node) {\n throw new DOMException(codeName);\n }\n }\n\n function isValidOffset(node, offset) {\n return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);\n }\n\n function isRangeValid(range) {\n return (!!range.startContainer && !!range.endContainer &&\n !(crashyTextNodes && (dom.isBrokenNode(range.startContainer) || dom.isBrokenNode(range.endContainer))) &&\n getRootContainer(range.startContainer) == getRootContainer(range.endContainer) &&\n isValidOffset(range.startContainer, range.startOffset) &&\n isValidOffset(range.endContainer, range.endOffset));\n }\n\n function assertRangeValid(range) {\n if (!isRangeValid(range)) {\n throw new Error(\"Range error: Range is not valid. This usually happens after DOM mutation. Range: (\" + range.inspect() + \")\");\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test the browser's innerHTML support to decide how to implement createContextualFragment\n var styleEl = document.createElement(\"style\");\n var htmlParsingConforms = false;\n try {\n styleEl.innerHTML = \"<b>x</b>\";\n htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Pre-Blink Opera incorrectly creates an element node\n } catch (e) {\n // IE 6 and 7 throw\n }\n\n api.features.htmlParsingConforms = htmlParsingConforms;\n\n var createContextualFragment = htmlParsingConforms ?\n\n // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See\n // discussion and base code for this implementation at issue 67.\n // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface\n // Thanks to Aleks Williams.\n function(fragmentStr) {\n // \"Let node the context object's start's node.\"\n var node = this.startContainer;\n var doc = getDocument(node);\n\n // \"If the context object's start's node is null, raise an INVALID_STATE_ERR\n // exception and abort these steps.\"\n if (!node) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // \"Let element be as follows, depending on node's interface:\"\n // Document, Document Fragment: null\n var el = null;\n\n // \"Element: node\"\n if (node.nodeType == 1) {\n el = node;\n\n // \"Text, Comment: node's parentElement\"\n } else if (isCharacterDataNode(node)) {\n el = dom.parentElement(node);\n }\n\n // \"If either element is null or element's ownerDocument is an HTML document\n // and element's local name is \"html\" and element's namespace is the HTML\n // namespace\"\n if (el === null || (\n el.nodeName == \"HTML\" &&\n dom.isHtmlNamespace(getDocument(el).documentElement) &&\n dom.isHtmlNamespace(el)\n )) {\n\n // \"let element be a new Element with \"body\" as its local name and the HTML\n // namespace as its namespace.\"\"\n el = doc.createElement(\"body\");\n } else {\n el = el.cloneNode(false);\n }\n\n // \"If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm.\"\n // \"If the node's document is an XML document: Invoke the XML fragment parsing algorithm.\"\n // \"In either case, the algorithm must be invoked with fragment as the input\n // and element as the context element.\"\n el.innerHTML = fragmentStr;\n\n // \"If this raises an exception, then abort these steps. Otherwise, let new\n // children be the nodes returned.\"\n\n // \"Let fragment be a new DocumentFragment.\"\n // \"Append all new children to fragment.\"\n // \"Return fragment.\"\n return dom.fragmentFromNodeChildren(el);\n } :\n\n // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that\n // previous versions of Rangy used (with the exception of using a body element rather than a div)\n function(fragmentStr) {\n var doc = getRangeDocument(this);\n var el = doc.createElement(\"body\");\n el.innerHTML = fragmentStr;\n\n return dom.fragmentFromNodeChildren(el);\n };\n\n function splitRangeBoundaries(range, positionsToPreserve) {\n assertRangeValid(range);\n\n var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;\n var startEndSame = (sc === ec);\n\n if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {\n splitDataNode(ec, eo, positionsToPreserve);\n }\n\n if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {\n sc = splitDataNode(sc, so, positionsToPreserve);\n if (startEndSame) {\n eo -= so;\n ec = sc;\n } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {\n eo++;\n }\n so = 0;\n }\n range.setStartAndEnd(sc, so, ec, eo);\n }\n\n function rangeToHtml(range) {\n assertRangeValid(range);\n var container = range.commonAncestorContainer.parentNode.cloneNode(false);\n container.appendChild( range.cloneContents() );\n return container.innerHTML;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var rangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n var s2s = 0, s2e = 1, e2e = 2, e2s = 3;\n var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;\n\n util.extend(api.rangePrototype, {\n compareBoundaryPoints: function(how, range) {\n assertRangeValid(this);\n assertSameDocumentOrFragment(this.startContainer, range.startContainer);\n\n var nodeA, offsetA, nodeB, offsetB;\n var prefixA = (how == e2s || how == s2s) ? \"start\" : \"end\";\n var prefixB = (how == s2e || how == s2s) ? \"start\" : \"end\";\n nodeA = this[prefixA + \"Container\"];\n offsetA = this[prefixA + \"Offset\"];\n nodeB = range[prefixB + \"Container\"];\n offsetB = range[prefixB + \"Offset\"];\n return comparePoints(nodeA, offsetA, nodeB, offsetB);\n },\n\n insertNode: function(node) {\n assertRangeValid(this);\n assertValidNodeType(node, insertableNodeTypes);\n assertNodeNotReadOnly(this.startContainer);\n\n if (isOrIsAncestorOf(node, this.startContainer)) {\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n\n // No check for whether the container of the start of the Range is of a type that does not allow\n // children of the type of node: the browser's DOM implementation should do this for us when we attempt\n // to add the node\n\n var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);\n this.setStartBefore(firstNodeInserted);\n },\n\n cloneContents: function() {\n assertRangeValid(this);\n\n var clone, frag;\n if (this.collapsed) {\n return getRangeDocument(this).createDocumentFragment();\n } else {\n if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {\n clone = this.startContainer.cloneNode(true);\n clone.data = clone.data.slice(this.startOffset, this.endOffset);\n frag = getRangeDocument(this).createDocumentFragment();\n frag.appendChild(clone);\n return frag;\n } else {\n var iterator = new RangeIterator(this, true);\n clone = cloneSubtree(iterator);\n iterator.detach();\n }\n return clone;\n }\n },\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n surroundContents: function(node) {\n assertValidNodeType(node, surroundNodeTypes);\n\n if (!this.canSurroundContents()) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // Extract the contents\n var content = this.extractContents();\n\n // Clear the children of the node\n if (node.hasChildNodes()) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n }\n\n // Insert the new node and add the extracted contents\n insertNodeAtPosition(node, this.startContainer, this.startOffset);\n node.appendChild(content);\n\n this.selectNode(node);\n },\n\n cloneRange: function() {\n assertRangeValid(this);\n var range = new Range(getRangeDocument(this));\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = this[prop];\n }\n return range;\n },\n\n toString: function() {\n assertRangeValid(this);\n var sc = this.startContainer;\n if (sc === this.endContainer && isCharacterDataNode(sc)) {\n return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : \"\";\n } else {\n var textParts = [], iterator = new RangeIterator(this, true);\n iterateSubtree(iterator, function(node) {\n // Accept only text or CDATA nodes, not comments\n if (node.nodeType == 3 || node.nodeType == 4) {\n textParts.push(node.data);\n }\n });\n iterator.detach();\n return textParts.join(\"\");\n }\n },\n\n // The methods below are all non-standard. The following batch were introduced by Mozilla but have since\n // been removed from Mozilla.\n\n compareNode: function(node) {\n assertRangeValid(this);\n\n var parent = node.parentNode;\n var nodeIndex = getNodeIndex(node);\n\n if (!parent) {\n throw new DOMException(\"NOT_FOUND_ERR\");\n }\n\n var startComparison = this.comparePoint(parent, nodeIndex),\n endComparison = this.comparePoint(parent, nodeIndex + 1);\n\n if (startComparison < 0) { // Node starts before\n return (endComparison > 0) ? n_b_a : n_b;\n } else {\n return (endComparison > 0) ? n_a : n_i;\n }\n },\n\n comparePoint: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {\n return -1;\n } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {\n return 1;\n }\n return 0;\n },\n\n createContextualFragment: createContextualFragment,\n\n toHtml: function() {\n return rangeToHtml(this);\n },\n\n // touchingIsIntersecting determines whether this method considers a node that borders a range intersects\n // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)\n intersectsNode: function(node, touchingIsIntersecting) {\n assertRangeValid(this);\n if (getRootContainer(node) != getRangeRoot(this)) {\n return false;\n }\n\n var parent = node.parentNode, offset = getNodeIndex(node);\n if (!parent) {\n return true;\n }\n\n var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),\n endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n },\n\n isPointInRange: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&\n (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);\n },\n\n // The methods below are non-standard and invented by me.\n\n // Sharing a boundary start-to-end or end-to-start does not count as intersection.\n intersectsRange: function(range) {\n return rangesIntersect(this, range, false);\n },\n\n // Sharing a boundary start-to-end or end-to-start does count as intersection.\n intersectsOrTouchesRange: function(range) {\n return rangesIntersect(this, range, true);\n },\n\n intersection: function(range) {\n if (this.intersectsRange(range)) {\n var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),\n endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);\n\n var intersectionRange = this.cloneRange();\n if (startComparison == -1) {\n intersectionRange.setStart(range.startContainer, range.startOffset);\n }\n if (endComparison == 1) {\n intersectionRange.setEnd(range.endContainer, range.endOffset);\n }\n return intersectionRange;\n }\n return null;\n },\n\n union: function(range) {\n if (this.intersectsOrTouchesRange(range)) {\n var unionRange = this.cloneRange();\n if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {\n unionRange.setStart(range.startContainer, range.startOffset);\n }\n if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {\n unionRange.setEnd(range.endContainer, range.endOffset);\n }\n return unionRange;\n } else {\n throw new DOMException(\"Ranges do not intersect\");\n }\n },\n\n containsNode: function(node, allowPartial) {\n if (allowPartial) {\n return this.intersectsNode(node, false);\n } else {\n return this.compareNode(node) == n_i;\n }\n },\n\n containsNodeContents: function(node) {\n return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;\n },\n\n containsRange: function(range) {\n var intersection = this.intersection(range);\n return intersection !== null && range.equals(intersection);\n },\n\n containsNodeText: function(node) {\n var nodeRange = this.cloneRange();\n nodeRange.selectNode(node);\n var textNodes = nodeRange.getNodes([3]);\n if (textNodes.length > 0) {\n nodeRange.setStart(textNodes[0], 0);\n var lastTextNode = textNodes.pop();\n nodeRange.setEnd(lastTextNode, lastTextNode.length);\n return this.containsRange(nodeRange);\n } else {\n return this.containsNodeContents(node);\n }\n },\n\n getNodes: function(nodeTypes, filter) {\n assertRangeValid(this);\n return getNodesInRange(this, nodeTypes, filter);\n },\n\n getDocument: function() {\n return getRangeDocument(this);\n },\n\n collapseBefore: function(node) {\n this.setEndBefore(node);\n this.collapse(false);\n },\n\n collapseAfter: function(node) {\n this.setStartAfter(node);\n this.collapse(true);\n },\n\n getBookmark: function(containerNode) {\n var doc = getRangeDocument(this);\n var preSelectionRange = api.createRange(doc);\n containerNode = containerNode || dom.getBody(doc);\n preSelectionRange.selectNodeContents(containerNode);\n var range = this.intersection(preSelectionRange);\n var start = 0, end = 0;\n if (range) {\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n start = preSelectionRange.toString().length;\n end = start + range.toString().length;\n }\n\n return {\n start: start,\n end: end,\n containerNode: containerNode\n };\n },\n\n moveToBookmark: function(bookmark) {\n var containerNode = bookmark.containerNode;\n var charIndex = 0;\n this.setStart(containerNode, 0);\n this.collapse(true);\n var nodeStack = [containerNode], node, foundStart = false, stop = false;\n var nextCharIndex, i, childNodes;\n\n while (!stop && (node = nodeStack.pop())) {\n if (node.nodeType == 3) {\n nextCharIndex = charIndex + node.length;\n if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {\n this.setStart(node, bookmark.start - charIndex);\n foundStart = true;\n }\n if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {\n this.setEnd(node, bookmark.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n childNodes = node.childNodes;\n i = childNodes.length;\n while (i--) {\n nodeStack.push(childNodes[i]);\n }\n }\n }\n },\n\n getName: function() {\n return \"DomRange\";\n },\n\n equals: function(range) {\n return Range.rangesEqual(this, range);\n },\n\n isValid: function() {\n return isRangeValid(this);\n },\n\n inspect: function() {\n return inspect(this);\n },\n\n detach: function() {\n // In DOM4, detach() is now a no-op.\n }\n });\n\n function copyComparisonConstantsToObject(obj) {\n obj.START_TO_START = s2s;\n obj.START_TO_END = s2e;\n obj.END_TO_END = e2e;\n obj.END_TO_START = e2s;\n\n obj.NODE_BEFORE = n_b;\n obj.NODE_AFTER = n_a;\n obj.NODE_BEFORE_AND_AFTER = n_b_a;\n obj.NODE_INSIDE = n_i;\n }\n\n function copyComparisonConstants(constructor) {\n copyComparisonConstantsToObject(constructor);\n copyComparisonConstantsToObject(constructor.prototype);\n }\n\n function createRangeContentRemover(remover, boundaryUpdater) {\n return function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;\n\n var iterator = new RangeIterator(this, true);\n\n // Work out where to position the range after content removal\n var node, boundary;\n if (sc !== root) {\n node = getClosestAncestorIn(sc, root, true);\n boundary = getBoundaryAfterNode(node);\n sc = boundary.node;\n so = boundary.offset;\n }\n\n // Check none of the range is read-only\n iterateSubtree(iterator, assertNodeNotReadOnly);\n\n iterator.reset();\n\n // Remove the content\n var returnValue = remover(iterator);\n iterator.detach();\n\n // Move to the new position\n boundaryUpdater(this, sc, so, sc, so);\n\n return returnValue;\n };\n }\n\n function createPrototypeRange(constructor, boundaryUpdater) {\n function createBeforeAfterNodeSetter(isBefore, isStart) {\n return function(node) {\n assertValidNodeType(node, beforeAfterNodeTypes);\n assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);\n\n var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);\n (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);\n };\n }\n\n function setRangeStart(range, node, offset) {\n var ec = range.endContainer, eo = range.endOffset;\n if (node !== range.startContainer || offset !== range.startOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {\n ec = node;\n eo = offset;\n }\n boundaryUpdater(range, node, offset, ec, eo);\n }\n }\n\n function setRangeEnd(range, node, offset) {\n var sc = range.startContainer, so = range.startOffset;\n if (node !== range.endContainer || offset !== range.endOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {\n sc = node;\n so = offset;\n }\n boundaryUpdater(range, sc, so, node, offset);\n }\n }\n\n // Set up inheritance\n var F = function() {};\n F.prototype = api.rangePrototype;\n constructor.prototype = new F();\n\n util.extend(constructor.prototype, {\n setStart: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeStart(this, node, offset);\n },\n\n setEnd: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeEnd(this, node, offset);\n },\n\n /**\n * Convenience method to set a range's start and end boundaries. Overloaded as follows:\n * - Two parameters (node, offset) creates a collapsed range at that position\n * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at\n * startOffset and ending at endOffset\n * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in\n * startNode and ending at endOffset in endNode\n */\n setStartAndEnd: function() {\n var args = arguments;\n var sc = args[0], so = args[1], ec = sc, eo = so;\n\n switch (args.length) {\n case 3:\n eo = args[2];\n break;\n case 4:\n ec = args[2];\n eo = args[3];\n break;\n }\n\n assertNoDocTypeNotationEntityAncestor(sc, true);\n assertValidOffset(sc, so);\n\n assertNoDocTypeNotationEntityAncestor(ec, true);\n assertValidOffset(ec, eo);\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n setBoundary: function(node, offset, isStart) {\n this[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n },\n\n setStartBefore: createBeforeAfterNodeSetter(true, true),\n setStartAfter: createBeforeAfterNodeSetter(false, true),\n setEndBefore: createBeforeAfterNodeSetter(true, false),\n setEndAfter: createBeforeAfterNodeSetter(false, false),\n\n collapse: function(isStart) {\n assertRangeValid(this);\n if (isStart) {\n boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);\n } else {\n boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n }\n },\n\n selectNodeContents: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n\n boundaryUpdater(this, node, 0, node, getNodeLength(node));\n },\n\n selectNode: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, false);\n assertValidNodeType(node, beforeAfterNodeTypes);\n\n var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);\n boundaryUpdater(this, start.node, start.offset, end.node, end.offset);\n },\n\n extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),\n\n deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n splitBoundaries: function() {\n splitRangeBoundaries(this);\n },\n\n splitBoundariesPreservingPositions: function(positionsToPreserve) {\n splitRangeBoundaries(this, positionsToPreserve);\n },\n\n normalizeBoundaries: function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;\n\n var mergeForward = function(node) {\n var sibling = node.nextSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n ec = node;\n eo = node.length;\n node.appendData(sibling.data);\n removeNode(sibling);\n }\n };\n\n var mergeBackward = function(node) {\n var sibling = node.previousSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n sc = node;\n var nodeLength = node.length;\n so = sibling.length;\n node.insertData(0, sibling.data);\n removeNode(sibling);\n if (sc == ec) {\n eo += so;\n ec = sc;\n } else if (ec == node.parentNode) {\n var nodeIndex = getNodeIndex(node);\n if (eo == nodeIndex) {\n ec = node;\n eo = nodeLength;\n } else if (eo > nodeIndex) {\n eo--;\n }\n }\n }\n };\n\n var normalizeStart = true;\n var sibling;\n\n if (isCharacterDataNode(ec)) {\n if (eo == ec.length) {\n mergeForward(ec);\n } else if (eo == 0) {\n sibling = ec.previousSibling;\n if (sibling && sibling.nodeType == ec.nodeType) {\n eo = sibling.length;\n if (sc == ec) {\n normalizeStart = false;\n }\n sibling.appendData(ec.data);\n removeNode(ec);\n ec = sibling;\n }\n }\n } else {\n if (eo > 0) {\n var endNode = ec.childNodes[eo - 1];\n if (endNode && isCharacterDataNode(endNode)) {\n mergeForward(endNode);\n }\n }\n normalizeStart = !this.collapsed;\n }\n\n if (normalizeStart) {\n if (isCharacterDataNode(sc)) {\n if (so == 0) {\n mergeBackward(sc);\n } else if (so == sc.length) {\n sibling = sc.nextSibling;\n if (sibling && sibling.nodeType == sc.nodeType) {\n if (ec == sibling) {\n ec = sc;\n eo += sc.length;\n }\n sc.appendData(sibling.data);\n removeNode(sibling);\n }\n }\n } else {\n if (so < sc.childNodes.length) {\n var startNode = sc.childNodes[so];\n if (startNode && isCharacterDataNode(startNode)) {\n mergeBackward(startNode);\n }\n }\n }\n } else {\n sc = ec;\n so = eo;\n }\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n collapseToPoint: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n this.setStartAndEnd(node, offset);\n },\n\n parentElement: function() {\n assertRangeValid(this);\n var parentNode = this.commonAncestorContainer;\n return parentNode ? getElementAncestor(this.commonAncestorContainer, true) : null;\n }\n });\n\n copyComparisonConstants(constructor);\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Updates commonAncestorContainer and collapsed after boundary change\n function updateCollapsedAndCommonAncestor(range) {\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n range.commonAncestorContainer = range.collapsed ?\n range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);\n }\n\n function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {\n range.startContainer = startContainer;\n range.startOffset = startOffset;\n range.endContainer = endContainer;\n range.endOffset = endOffset;\n range.document = dom.getDocument(startContainer);\n updateCollapsedAndCommonAncestor(range);\n }\n\n function Range(doc) {\n updateBoundaries(this, doc, 0, doc, 0);\n }\n\n createPrototypeRange(Range, updateBoundaries);\n\n util.extend(Range, {\n rangeProperties: rangeProperties,\n RangeIterator: RangeIterator,\n copyComparisonConstants: copyComparisonConstants,\n createPrototypeRange: createPrototypeRange,\n inspect: inspect,\n toHtml: rangeToHtml,\n getRangeDocument: getRangeDocument,\n rangesEqual: function(r1, r2) {\n return r1.startContainer === r2.startContainer &&\n r1.startOffset === r2.startOffset &&\n r1.endContainer === r2.endContainer &&\n r1.endOffset === r2.endOffset;\n }\n });\n\n api.DomRange = Range;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wrappers for the browser's native DOM Range and/or TextRange implementation\n api.createCoreModule(\"WrappedRange\", [\"DomRange\"], function(api, module) {\n var WrappedRange, WrappedTextRange;\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DomRange = api.DomRange;\n var getBody = dom.getBody;\n var getContentDocument = dom.getContentDocument;\n var isCharacterDataNode = dom.isCharacterDataNode;\n\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n if (api.features.implementsDomRange) {\n // This is a wrapper around the browser's native DOM Range. It has two aims:\n // - Provide workarounds for specific browser bugs\n // - provide convenient extensions, which are inherited from Rangy's DomRange\n\n (function() {\n var rangeProto;\n var rangeProperties = DomRange.rangeProperties;\n\n function updateRangeProperties(range) {\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = range.nativeRange[prop];\n }\n // Fix for broken collapsed property in IE 9.\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n }\n\n function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {\n var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);\n var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);\n var nativeRangeDifferent = !range.equals(range.nativeRange);\n\n // Always set both boundaries for the benefit of IE9 (see issue 35)\n if (startMoved || endMoved || nativeRangeDifferent) {\n range.setEnd(endContainer, endOffset);\n range.setStart(startContainer, startOffset);\n }\n }\n\n var createBeforeAfterNodeSetter;\n\n WrappedRange = function(range) {\n if (!range) {\n throw module.createError(\"WrappedRange: Range must be specified\");\n }\n this.nativeRange = range;\n updateRangeProperties(this);\n };\n\n DomRange.createPrototypeRange(WrappedRange, updateNativeRange);\n\n rangeProto = WrappedRange.prototype;\n\n rangeProto.selectNode = function(node) {\n this.nativeRange.selectNode(node);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneContents = function() {\n return this.nativeRange.cloneContents();\n };\n\n // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,\n // insertNode() is never delegated to the native range.\n\n rangeProto.surroundContents = function(node) {\n this.nativeRange.surroundContents(node);\n updateRangeProperties(this);\n };\n\n rangeProto.collapse = function(isStart) {\n this.nativeRange.collapse(isStart);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneRange = function() {\n return new WrappedRange(this.nativeRange.cloneRange());\n };\n\n rangeProto.refresh = function() {\n updateRangeProperties(this);\n };\n\n rangeProto.toString = function() {\n return this.nativeRange.toString();\n };\n\n // Create test range and node for feature detection\n\n var testTextNode = document.createTextNode(\"test\");\n getBody(document).appendChild(testTextNode);\n var range = document.createRange();\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and\n // correct for it\n\n range.setStart(testTextNode, 0);\n range.setEnd(testTextNode, 0);\n\n try {\n range.setStart(testTextNode, 1);\n\n rangeProto.setStart = function(node, offset) {\n this.nativeRange.setStart(node, offset);\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n this.nativeRange.setEnd(node, offset);\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name) {\n return function(node) {\n this.nativeRange[name](node);\n updateRangeProperties(this);\n };\n };\n\n } catch(ex) {\n\n rangeProto.setStart = function(node, offset) {\n try {\n this.nativeRange.setStart(node, offset);\n } catch (ex) {\n this.nativeRange.setEnd(node, offset);\n this.nativeRange.setStart(node, offset);\n }\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n try {\n this.nativeRange.setEnd(node, offset);\n } catch (ex) {\n this.nativeRange.setStart(node, offset);\n this.nativeRange.setEnd(node, offset);\n }\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name, oppositeName) {\n return function(node) {\n try {\n this.nativeRange[name](node);\n } catch (ex) {\n this.nativeRange[oppositeName](node);\n this.nativeRange[name](node);\n }\n updateRangeProperties(this);\n };\n };\n }\n\n rangeProto.setStartBefore = createBeforeAfterNodeSetter(\"setStartBefore\", \"setEndBefore\");\n rangeProto.setStartAfter = createBeforeAfterNodeSetter(\"setStartAfter\", \"setEndAfter\");\n rangeProto.setEndBefore = createBeforeAfterNodeSetter(\"setEndBefore\", \"setStartBefore\");\n rangeProto.setEndAfter = createBeforeAfterNodeSetter(\"setEndAfter\", \"setStartAfter\");\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing\n // whether the native implementation can be trusted\n rangeProto.selectNodeContents = function(node) {\n this.setStartAndEnd(node, 0, dom.getNodeLength(node));\n };\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for\n // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738\n\n range.selectNodeContents(testTextNode);\n range.setEnd(testTextNode, 3);\n\n var range2 = document.createRange();\n range2.selectNodeContents(testTextNode);\n range2.setEnd(testTextNode, 4);\n range2.setStart(testTextNode, 2);\n\n if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&\n range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {\n // This is the wrong way round, so correct for it\n\n rangeProto.compareBoundaryPoints = function(type, range) {\n range = range.nativeRange || range;\n if (type == range.START_TO_END) {\n type = range.END_TO_START;\n } else if (type == range.END_TO_START) {\n type = range.START_TO_END;\n }\n return this.nativeRange.compareBoundaryPoints(type, range);\n };\n } else {\n rangeProto.compareBoundaryPoints = function(type, range) {\n return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for IE deleteContents() and extractContents() bug and correct it. See issue 107.\n\n var el = document.createElement(\"div\");\n el.innerHTML = \"123\";\n var textNode = el.firstChild;\n var body = getBody(document);\n body.appendChild(el);\n\n range.setStart(textNode, 1);\n range.setEnd(textNode, 2);\n range.deleteContents();\n\n if (textNode.data == \"13\") {\n // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and\n // extractContents()\n rangeProto.deleteContents = function() {\n this.nativeRange.deleteContents();\n updateRangeProperties(this);\n };\n\n rangeProto.extractContents = function() {\n var frag = this.nativeRange.extractContents();\n updateRangeProperties(this);\n return frag;\n };\n } else {\n }\n\n body.removeChild(el);\n body = null;\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for existence of createContextualFragment and delegate to it if it exists\n if (util.isHostMethod(range, \"createContextualFragment\")) {\n rangeProto.createContextualFragment = function(fragmentStr) {\n return this.nativeRange.createContextualFragment(fragmentStr);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Clean up\n getBody(document).removeChild(testTextNode);\n\n rangeProto.getName = function() {\n return \"WrappedRange\";\n };\n\n api.WrappedRange = WrappedRange;\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return doc.createRange();\n };\n })();\n }\n\n if (api.features.implementsTextRange) {\n /*\n This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()\n method. For example, in the following (where pipes denote the selection boundaries):\n\n <ul id=\"ul\"><li id=\"a\">| a </li><li id=\"b\"> b |</li></ul>\n\n var range = document.selection.createRange();\n alert(range.parentElement().id); // Should alert \"ul\" but alerts \"b\"\n\n This method returns the common ancestor node of the following:\n - the parentElement() of the textRange\n - the parentElement() of the textRange after calling collapse(true)\n - the parentElement() of the textRange after calling collapse(false)\n */\n var getTextRangeContainerElement = function(textRange) {\n var parentEl = textRange.parentElement();\n var range = textRange.duplicate();\n range.collapse(true);\n var startEl = range.parentElement();\n range = textRange.duplicate();\n range.collapse(false);\n var endEl = range.parentElement();\n var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);\n\n return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);\n };\n\n var textRangeIsCollapsed = function(textRange) {\n return textRange.compareEndPoints(\"StartToEnd\", textRange) == 0;\n };\n\n // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started\n // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)\n // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange\n // bugs, handling for inputs and images, plus optimizations.\n var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {\n var workingRange = textRange.duplicate();\n workingRange.collapse(isStart);\n var containerElement = workingRange.parentElement();\n\n // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so\n // check for that\n if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {\n containerElement = wholeRangeContainerElement;\n }\n\n\n // Deal with nodes that cannot \"contain rich HTML markup\". In practice, this means form inputs, images and\n // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx\n if (!containerElement.canHaveHTML) {\n var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));\n return {\n boundaryPosition: pos,\n nodeInfo: {\n nodeIndex: pos.offset,\n containerElement: pos.node\n }\n };\n }\n\n var workingNode = dom.getDocument(containerElement).createElement(\"span\");\n\n // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5\n // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64\n if (workingNode.parentNode) {\n dom.removeNode(workingNode);\n }\n\n var comparison, workingComparisonType = isStart ? \"StartToStart\" : \"StartToEnd\";\n var previousNode, nextNode, boundaryPosition, boundaryNode;\n var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;\n var childNodeCount = containerElement.childNodes.length;\n var end = childNodeCount;\n\n // Check end first. Code within the loop assumes that the endth child node of the container is definitely\n // after the range boundary.\n var nodeIndex = end;\n\n while (true) {\n if (nodeIndex == childNodeCount) {\n containerElement.appendChild(workingNode);\n } else {\n containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);\n }\n workingRange.moveToElementText(workingNode);\n comparison = workingRange.compareEndPoints(workingComparisonType, textRange);\n if (comparison == 0 || start == end) {\n break;\n } else if (comparison == -1) {\n if (end == start + 1) {\n // We know the endth child node is after the range boundary, so we must be done.\n break;\n } else {\n start = nodeIndex;\n }\n } else {\n end = (end == start + 1) ? start : nodeIndex;\n }\n nodeIndex = Math.floor((start + end) / 2);\n containerElement.removeChild(workingNode);\n }\n\n\n // We've now reached or gone past the boundary of the text range we're interested in\n // so have identified the node we want\n boundaryNode = workingNode.nextSibling;\n\n if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {\n // This is a character data node (text, comment, cdata). The working range is collapsed at the start of\n // the node containing the text range's boundary, so we move the end of the working range to the\n // boundary point and measure the length of its text to get the boundary's offset within the node.\n workingRange.setEndPoint(isStart ? \"EndToStart\" : \"EndToEnd\", textRange);\n\n var offset;\n\n if (/[\\r\\n]/.test(boundaryNode.data)) {\n /*\n For the particular case of a boundary within a text node containing rendered line breaks (within a\n <pre> element, for example), we need a slightly complicated approach to get the boundary's offset in\n IE. The facts:\n\n - Each line break is represented as \\r in the text node's data/nodeValue properties\n - Each line break is represented as \\r\\n in the TextRange's 'text' property\n - The 'text' property of the TextRange does not contain trailing line breaks\n\n To get round the problem presented by the final fact above, we can use the fact that TextRange's\n moveStart() and moveEnd() methods return the actual number of characters moved, which is not\n necessarily the same as the number of characters it was instructed to move. The simplest approach is\n to use this to store the characters moved when moving both the start and end of the range to the\n start of the document body and subtracting the start offset from the end offset (the\n \"move-negative-gazillion\" method). However, this is extremely slow when the document is large and\n the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to\n the end of the document) has the same problem.\n\n Another approach that works is to use moveStart() to move the start boundary of the range up to the\n end boundary one character at a time and incrementing a counter with the value returned by the\n moveStart() call. However, the check for whether the start boundary has reached the end boundary is\n expensive, so this method is slow (although unlike \"move-negative-gazillion\" is largely unaffected\n by the location of the range within the document).\n\n The approach used below is a hybrid of the two methods above. It uses the fact that a string\n containing the TextRange's 'text' property with each \\r\\n converted to a single \\r character cannot\n be longer than the text of the TextRange, so the start of the range is moved that length initially\n and then a character at a time to make up for any trailing line breaks not contained in the 'text'\n property. This has good performance in most situations compared to the previous two methods.\n */\n var tempRange = workingRange.duplicate();\n var rangeLength = tempRange.text.replace(/\\r\\n/g, \"\\r\").length;\n\n offset = tempRange.moveStart(\"character\", rangeLength);\n while ( (comparison = tempRange.compareEndPoints(\"StartToEnd\", tempRange)) == -1) {\n offset++;\n tempRange.moveStart(\"character\", 1);\n }\n } else {\n offset = workingRange.text.length;\n }\n boundaryPosition = new DomPosition(boundaryNode, offset);\n } else {\n\n // If the boundary immediately follows a character data node and this is the end boundary, we should favour\n // a position within that, and likewise for a start boundary preceding a character data node\n previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;\n nextNode = (isCollapsed || isStart) && workingNode.nextSibling;\n if (nextNode && isCharacterDataNode(nextNode)) {\n boundaryPosition = new DomPosition(nextNode, 0);\n } else if (previousNode && isCharacterDataNode(previousNode)) {\n boundaryPosition = new DomPosition(previousNode, previousNode.data.length);\n } else {\n boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));\n }\n }\n\n // Clean up\n dom.removeNode(workingNode);\n\n return {\n boundaryPosition: boundaryPosition,\n nodeInfo: {\n nodeIndex: nodeIndex,\n containerElement: containerElement\n }\n };\n };\n\n // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that\n // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange\n // (http://code.google.com/p/ierange/)\n var createBoundaryTextRange = function(boundaryPosition, isStart) {\n var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;\n var doc = dom.getDocument(boundaryPosition.node);\n var workingNode, childNodes, workingRange = getBody(doc).createTextRange();\n var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);\n\n if (nodeIsDataNode) {\n boundaryNode = boundaryPosition.node;\n boundaryParent = boundaryNode.parentNode;\n } else {\n childNodes = boundaryPosition.node.childNodes;\n boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;\n boundaryParent = boundaryPosition.node;\n }\n\n // Position the range immediately before the node containing the boundary\n workingNode = doc.createElement(\"span\");\n\n // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within\n // the element rather than immediately before or after it\n workingNode.innerHTML = \"&#feff;\";\n\n // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report\n // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12\n if (boundaryNode) {\n boundaryParent.insertBefore(workingNode, boundaryNode);\n } else {\n boundaryParent.appendChild(workingNode);\n }\n\n workingRange.moveToElementText(workingNode);\n workingRange.collapse(!isStart);\n\n // Clean up\n boundaryParent.removeChild(workingNode);\n\n // Move the working range to the text offset, if required\n if (nodeIsDataNode) {\n workingRange[isStart ? \"moveStart\" : \"moveEnd\"](\"character\", boundaryOffset);\n }\n\n return workingRange;\n };\n\n /*------------------------------------------------------------------------------------------------------------*/\n\n // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a\n // prototype\n\n WrappedTextRange = function(textRange) {\n this.textRange = textRange;\n this.refresh();\n };\n\n WrappedTextRange.prototype = new DomRange(document);\n\n WrappedTextRange.prototype.refresh = function() {\n var start, end, startBoundary;\n\n // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.\n var rangeContainerElement = getTextRangeContainerElement(this.textRange);\n\n if (textRangeIsCollapsed(this.textRange)) {\n end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,\n true).boundaryPosition;\n } else {\n startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);\n start = startBoundary.boundaryPosition;\n\n // An optimization used here is that if the start and end boundaries have the same parent element, the\n // search scope for the end boundary can be limited to exclude the portion of the element that precedes\n // the start boundary\n end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,\n startBoundary.nodeInfo).boundaryPosition;\n }\n\n this.setStart(start.node, start.offset);\n this.setEnd(end.node, end.offset);\n };\n\n WrappedTextRange.prototype.getName = function() {\n return \"WrappedTextRange\";\n };\n\n DomRange.copyComparisonConstants(WrappedTextRange);\n\n var rangeToTextRange = function(range) {\n if (range.collapsed) {\n return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n } else {\n var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);\n var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();\n textRange.setEndPoint(\"StartToStart\", startRange);\n textRange.setEndPoint(\"EndToEnd\", endRange);\n return textRange;\n }\n };\n\n WrappedTextRange.rangeToTextRange = rangeToTextRange;\n\n WrappedTextRange.prototype.toTextRange = function() {\n return rangeToTextRange(this);\n };\n\n api.WrappedTextRange = WrappedTextRange;\n\n // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which\n // implementation to use by default.\n if (!api.features.implementsDomRange || api.config.preferTextRange) {\n // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work\n var globalObj = (function(f) { return f(\"return this;\")(); })(Function);\n if (typeof globalObj.Range == \"undefined\") {\n globalObj.Range = WrappedTextRange;\n }\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return getBody(doc).createTextRange();\n };\n\n api.WrappedRange = WrappedTextRange;\n }\n }\n\n api.createRange = function(doc) {\n doc = getContentDocument(doc, module, \"createRange\");\n return new api.WrappedRange(api.createNativeRange(doc));\n };\n\n api.createRangyRange = function(doc) {\n doc = getContentDocument(doc, module, \"createRangyRange\");\n return new DomRange(doc);\n };\n\n util.createAliasForDeprecatedMethod(api, \"createIframeRange\", \"createRange\");\n util.createAliasForDeprecatedMethod(api, \"createIframeRangyRange\", \"createRangyRange\");\n\n api.addShimListener(function(win) {\n var doc = win.document;\n if (typeof doc.createRange == \"undefined\") {\n doc.createRange = function() {\n return api.createRange(doc);\n };\n }\n doc = win = null;\n });\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification\n // in the W3C Selection API spec (https://www.w3.org/TR/selection-api)\n api.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function(api, module) {\n api.config.checkSelectionRanges = true;\n\n var BOOLEAN = \"boolean\";\n var NUMBER = \"number\";\n var dom = api.dom;\n var util = api.util;\n var isHostMethod = util.isHostMethod;\n var DomRange = api.DomRange;\n var WrappedRange = api.WrappedRange;\n var DOMException = api.DOMException;\n var DomPosition = dom.DomPosition;\n var getNativeSelection;\n var selectionIsCollapsed;\n var features = api.features;\n var CONTROL = \"Control\";\n var getDocument = dom.getDocument;\n var getBody = dom.getBody;\n var rangesEqual = DomRange.rangesEqual;\n\n\n // Utility function to support direction parameters in the API that may be a string (\"backward\", \"backwards\",\n // \"forward\" or \"forwards\") or a Boolean (true for backwards).\n function isDirectionBackward(dir) {\n return (typeof dir == \"string\") ? /^backward(s)?$/i.test(dir) : !!dir;\n }\n\n function getWindow(win, methodName) {\n if (!win) {\n return window;\n } else if (dom.isWindow(win)) {\n return win;\n } else if (win instanceof WrappedSelection) {\n return win.win;\n } else {\n var doc = dom.getContentDocument(win, module, methodName);\n return dom.getWindow(doc);\n }\n }\n\n function getWinSelection(winParam) {\n return getWindow(winParam, \"getWinSelection\").getSelection();\n }\n\n function getDocSelection(winParam) {\n return getWindow(winParam, \"getDocSelection\").document.selection;\n }\n\n function winSelectionIsBackward(sel) {\n var backward = false;\n if (sel.anchorNode) {\n backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);\n }\n return backward;\n }\n\n // Test for the Range/TextRange and Selection features required\n // Test for ability to retrieve selection\n var implementsWinGetSelection = isHostMethod(window, \"getSelection\"),\n implementsDocSelection = util.isHostObject(document, \"selection\");\n\n features.implementsWinGetSelection = implementsWinGetSelection;\n features.implementsDocSelection = implementsDocSelection;\n\n var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);\n\n if (useDocumentSelection) {\n getNativeSelection = getDocSelection;\n api.isSelectionValid = function(winParam) {\n var doc = getWindow(winParam, \"isSelectionValid\").document, nativeSel = doc.selection;\n\n // Check whether the selection TextRange is actually contained within the correct document\n return (nativeSel.type != \"None\" || getDocument(nativeSel.createRange().parentElement()) == doc);\n };\n } else if (implementsWinGetSelection) {\n getNativeSelection = getWinSelection;\n api.isSelectionValid = function() {\n return true;\n };\n } else {\n module.fail(\"Neither document.selection or window.getSelection() detected.\");\n return false;\n }\n\n api.getNativeSelection = getNativeSelection;\n\n var testSelection = getNativeSelection();\n\n // In Firefox, the selection is null in an iframe with display: none. See issue #138.\n if (!testSelection) {\n module.fail(\"Native selection was null (possibly issue 138?)\");\n return false;\n }\n\n var testRange = api.createNativeRange(document);\n var body = getBody(document);\n\n // Obtaining a range from a selection\n var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,\n [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]);\n\n features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;\n\n // Test for existence of native selection extend() method\n var selectionHasExtend = isHostMethod(testSelection, \"extend\");\n features.selectionHasExtend = selectionHasExtend;\n\n // Test for existence of native selection setBaseAndExtent() method\n var selectionHasSetBaseAndExtent = isHostMethod(testSelection, \"setBaseAndExtent\");\n features.selectionHasSetBaseAndExtent = selectionHasSetBaseAndExtent;\n\n // Test if rangeCount exists\n var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);\n features.selectionHasRangeCount = selectionHasRangeCount;\n\n var selectionSupportsMultipleRanges = false;\n var collapsedNonEditableSelectionsSupported = true;\n\n var addRangeBackwardToNative = selectionHasExtend ?\n function(nativeSelection, range) {\n var doc = DomRange.getRangeDocument(range);\n var endRange = api.createRange(doc);\n endRange.collapseToPoint(range.endContainer, range.endOffset);\n nativeSelection.addRange(getNativeRange(endRange));\n nativeSelection.extend(range.startContainer, range.startOffset);\n } : null;\n\n if (util.areHostMethods(testSelection, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) &&\n typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {\n\n (function() {\n // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are\n // performed on the current document's selection. See issue 109.\n\n // Note also that if a selection previously existed, it is wiped and later restored by these tests. This\n // will result in the selection direction being reversed if the original selection was backwards and the\n // browser does not support setting backwards selections (Internet Explorer, I'm looking at you).\n var sel = window.getSelection();\n if (sel) {\n // Store the current selection\n var originalSelectionRangeCount = sel.rangeCount;\n var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);\n var originalSelectionRanges = [];\n var originalSelectionBackward = winSelectionIsBackward(sel);\n for (var i = 0; i < originalSelectionRangeCount; ++i) {\n originalSelectionRanges[i] = sel.getRangeAt(i);\n }\n\n // Create some test elements\n var testEl = dom.createTestElement(document, \"\", false);\n var textNode = testEl.appendChild( document.createTextNode(\"\\u00a0\\u00a0\\u00a0\") );\n\n // Test whether the native selection will allow a collapsed selection within a non-editable element\n var r1 = document.createRange();\n\n r1.setStart(textNode, 1);\n r1.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r1);\n collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);\n sel.removeAllRanges();\n\n // Test whether the native selection is capable of supporting multiple ranges.\n if (!selectionHasMultipleRanges) {\n // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a\n // console error of \"Discontiguous selection is not supported.\" that cannot be suppressed. There's\n // nothing we can do about this while retaining the feature test so we have to resort to a browser\n // sniff. I'm not happy about it. See\n // https://code.google.com/p/chromium/issues/detail?id=399791\n var chromeMatch = window.navigator.appVersion.match(/Chrome\\/(.*?) /);\n if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {\n selectionSupportsMultipleRanges = false;\n } else {\n var r2 = r1.cloneRange();\n r1.setStart(textNode, 0);\n r2.setEnd(textNode, 3);\n r2.setStart(textNode, 2);\n sel.addRange(r1);\n sel.addRange(r2);\n selectionSupportsMultipleRanges = (sel.rangeCount == 2);\n }\n }\n\n // Clean up\n dom.removeNode(testEl);\n sel.removeAllRanges();\n\n for (i = 0; i < originalSelectionRangeCount; ++i) {\n if (i == 0 && originalSelectionBackward) {\n if (addRangeBackwardToNative) {\n addRangeBackwardToNative(sel, originalSelectionRanges[i]);\n } else {\n api.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend\");\n sel.addRange(originalSelectionRanges[i]);\n }\n } else {\n sel.addRange(originalSelectionRanges[i]);\n }\n }\n }\n })();\n }\n\n features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;\n features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;\n\n // ControlRanges\n var implementsControlRange = false, testControlRange;\n\n if (body && isHostMethod(body, \"createControlRange\")) {\n testControlRange = body.createControlRange();\n if (util.areHostProperties(testControlRange, [\"item\", \"add\"])) {\n implementsControlRange = true;\n }\n }\n features.implementsControlRange = implementsControlRange;\n\n // Selection collapsedness\n if (selectionHasAnchorAndFocus) {\n selectionIsCollapsed = function(sel) {\n return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;\n };\n } else {\n selectionIsCollapsed = function(sel) {\n return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;\n };\n }\n\n function updateAnchorAndFocusFromRange(sel, range, backward) {\n var anchorPrefix = backward ? \"end\" : \"start\", focusPrefix = backward ? \"start\" : \"end\";\n sel.anchorNode = range[anchorPrefix + \"Container\"];\n sel.anchorOffset = range[anchorPrefix + \"Offset\"];\n sel.focusNode = range[focusPrefix + \"Container\"];\n sel.focusOffset = range[focusPrefix + \"Offset\"];\n }\n\n function updateAnchorAndFocusFromNativeSelection(sel) {\n var nativeSel = sel.nativeSelection;\n sel.anchorNode = nativeSel.anchorNode;\n sel.anchorOffset = nativeSel.anchorOffset;\n sel.focusNode = nativeSel.focusNode;\n sel.focusOffset = nativeSel.focusOffset;\n }\n\n function updateEmptySelection(sel) {\n sel.anchorNode = sel.focusNode = null;\n sel.anchorOffset = sel.focusOffset = 0;\n sel.rangeCount = 0;\n sel.isCollapsed = true;\n sel._ranges.length = 0;\n updateType(sel);\n }\n\n function updateType(sel) {\n sel.type = (sel.rangeCount == 0) ? \"None\" : (selectionIsCollapsed(sel) ? \"Caret\" : \"Range\");\n }\n\n function getNativeRange(range) {\n var nativeRange;\n if (range instanceof DomRange) {\n nativeRange = api.createNativeRange(range.getDocument());\n nativeRange.setEnd(range.endContainer, range.endOffset);\n nativeRange.setStart(range.startContainer, range.startOffset);\n } else if (range instanceof WrappedRange) {\n nativeRange = range.nativeRange;\n } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {\n nativeRange = range;\n }\n return nativeRange;\n }\n\n function rangeContainsSingleElement(rangeNodes) {\n if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {\n return false;\n }\n for (var i = 1, len = rangeNodes.length; i < len; ++i) {\n if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {\n return false;\n }\n }\n return true;\n }\n\n function getSingleElementFromRange(range) {\n var nodes = range.getNodes();\n if (!rangeContainsSingleElement(nodes)) {\n throw module.createError(\"getSingleElementFromRange: range \" + range.inspect() + \" did not consist of a single element\");\n }\n return nodes[0];\n }\n\n // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange\n function isTextRange(range) {\n return !!range && typeof range.text != \"undefined\";\n }\n\n function updateFromTextRange(sel, range) {\n // Create a Range from the selected TextRange\n var wrappedRange = new WrappedRange(range);\n sel._ranges = [wrappedRange];\n\n updateAnchorAndFocusFromRange(sel, wrappedRange, false);\n sel.rangeCount = 1;\n sel.isCollapsed = wrappedRange.collapsed;\n updateType(sel);\n }\n\n function updateControlSelection(sel) {\n // Update the wrapped selection based on what's now in the native selection\n sel._ranges.length = 0;\n if (sel.docSelection.type == \"None\") {\n updateEmptySelection(sel);\n } else {\n var controlRange = sel.docSelection.createRange();\n if (isTextRange(controlRange)) {\n // This case (where the selection type is \"Control\" and calling createRange() on the selection returns\n // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected\n // ControlRange have been removed from the ControlRange and removed from the document.\n updateFromTextRange(sel, controlRange);\n } else {\n sel.rangeCount = controlRange.length;\n var range, doc = getDocument(controlRange.item(0));\n for (var i = 0; i < sel.rangeCount; ++i) {\n range = api.createRange(doc);\n range.selectNode(controlRange.item(i));\n sel._ranges.push(range);\n }\n sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;\n updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);\n updateType(sel);\n }\n }\n }\n\n function addRangeToControlSelection(sel, range) {\n var controlRange = sel.docSelection.createRange();\n var rangeElement = getSingleElementFromRange(range);\n\n // Create a new ControlRange containing all the elements in the selected ControlRange plus the element\n // contained by the supplied range\n var doc = getDocument(controlRange.item(0));\n var newControlRange = getBody(doc).createControlRange();\n for (var i = 0, len = controlRange.length; i < len; ++i) {\n newControlRange.add(controlRange.item(i));\n }\n try {\n newControlRange.add(rangeElement);\n } catch (ex) {\n throw module.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n }\n newControlRange.select();\n\n // Update the wrapped selection based on what's now in the native selection\n updateControlSelection(sel);\n }\n\n var getSelectionRangeAt;\n\n if (isHostMethod(testSelection, \"getRangeAt\")) {\n // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.\n // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a\n // lesson to us all, especially me.\n getSelectionRangeAt = function(sel, index) {\n try {\n return sel.getRangeAt(index);\n } catch (ex) {\n return null;\n }\n };\n } else if (selectionHasAnchorAndFocus) {\n getSelectionRangeAt = function(sel) {\n var doc = getDocument(sel.anchorNode);\n var range = api.createRange(doc);\n range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);\n\n // Handle the case when the selection was selected backwards (from the end to the start in the\n // document)\n if (range.collapsed !== this.isCollapsed) {\n range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);\n }\n\n return range;\n };\n }\n\n function WrappedSelection(selection, docSelection, win) {\n this.nativeSelection = selection;\n this.docSelection = docSelection;\n this._ranges = [];\n this.win = win;\n this.refresh();\n }\n\n WrappedSelection.prototype = api.selectionPrototype;\n\n function deleteProperties(sel) {\n sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;\n sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;\n sel.detached = true;\n updateType(sel);\n }\n\n var cachedRangySelections = [];\n\n function actOnCachedSelection(win, action) {\n var i = cachedRangySelections.length, cached, sel;\n while (i--) {\n cached = cachedRangySelections[i];\n sel = cached.selection;\n if (action == \"deleteAll\") {\n deleteProperties(sel);\n } else if (cached.win == win) {\n if (action == \"delete\") {\n cachedRangySelections.splice(i, 1);\n return true;\n } else {\n return sel;\n }\n }\n }\n if (action == \"deleteAll\") {\n cachedRangySelections.length = 0;\n }\n return null;\n }\n\n var getSelection = function(win) {\n // Check if the parameter is a Rangy Selection object\n if (win && win instanceof WrappedSelection) {\n win.refresh();\n return win;\n }\n\n win = getWindow(win, \"getNativeSelection\");\n\n var sel = actOnCachedSelection(win);\n var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;\n if (sel) {\n sel.nativeSelection = nativeSel;\n sel.docSelection = docSel;\n sel.refresh();\n } else {\n sel = new WrappedSelection(nativeSel, docSel, win);\n cachedRangySelections.push( { win: win, selection: sel } );\n }\n return sel;\n };\n\n api.getSelection = getSelection;\n\n util.createAliasForDeprecatedMethod(api, \"getIframeSelection\", \"getSelection\");\n\n var selProto = WrappedSelection.prototype;\n\n function createControlSelection(sel, ranges) {\n // Ensure that the selection becomes of type \"Control\"\n var doc = getDocument(ranges[0].startContainer);\n var controlRange = getBody(doc).createControlRange();\n for (var i = 0, el, len = ranges.length; i < len; ++i) {\n el = getSingleElementFromRange(ranges[i]);\n try {\n controlRange.add(el);\n } catch (ex) {\n throw module.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n }\n }\n controlRange.select();\n\n // Update the wrapped selection based on what's now in the native selection\n updateControlSelection(sel);\n }\n\n // Selecting a range\n if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, [\"removeAllRanges\", \"addRange\"])) {\n selProto.removeAllRanges = function() {\n this.nativeSelection.removeAllRanges();\n updateEmptySelection(this);\n };\n\n var addRangeBackward = function(sel, range) {\n addRangeBackwardToNative(sel.nativeSelection, range);\n sel.refresh();\n };\n\n if (selectionHasRangeCount) {\n selProto.addRange = function(range, direction) {\n if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n addRangeToControlSelection(this, range);\n } else {\n if (isDirectionBackward(direction) && selectionHasExtend) {\n addRangeBackward(this, range);\n } else {\n var previousRangeCount;\n if (selectionSupportsMultipleRanges) {\n previousRangeCount = this.rangeCount;\n } else {\n this.removeAllRanges();\n previousRangeCount = 0;\n }\n // Clone the native range so that changing the selected range does not affect the selection.\n // This is contrary to the spec but is the only way to achieve consistency between browsers. See\n // issue 80.\n var clonedNativeRange = getNativeRange(range).cloneRange();\n try {\n this.nativeSelection.addRange(clonedNativeRange);\n } catch (ex) {\n }\n\n // Check whether adding the range was successful\n this.rangeCount = this.nativeSelection.rangeCount;\n\n if (this.rangeCount == previousRangeCount + 1) {\n // The range was added successfully\n\n // Check whether the range that we added to the selection is reflected in the last range extracted from\n // the selection\n if (api.config.checkSelectionRanges) {\n var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);\n if (nativeRange && !rangesEqual(nativeRange, range)) {\n // Happens in WebKit with, for example, a selection placed at the start of a text node\n range = new WrappedRange(nativeRange);\n }\n }\n this._ranges[this.rangeCount - 1] = range;\n updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));\n this.isCollapsed = selectionIsCollapsed(this);\n updateType(this);\n } else {\n // The range was not added successfully. The simplest thing is to refresh\n this.refresh();\n }\n }\n }\n };\n } else {\n selProto.addRange = function(range, direction) {\n if (isDirectionBackward(direction) && selectionHasExtend) {\n addRangeBackward(this, range);\n } else {\n this.nativeSelection.addRange(getNativeRange(range));\n this.refresh();\n }\n };\n }\n\n selProto.setRanges = function(ranges) {\n if (implementsControlRange && implementsDocSelection && ranges.length > 1) {\n createControlSelection(this, ranges);\n } else {\n this.removeAllRanges();\n for (var i = 0, len = ranges.length; i < len; ++i) {\n this.addRange(ranges[i]);\n }\n }\n };\n } else if (isHostMethod(testSelection, \"empty\") && isHostMethod(testRange, \"select\") &&\n implementsControlRange && useDocumentSelection) {\n\n selProto.removeAllRanges = function() {\n // Added try/catch as fix for issue #21\n try {\n this.docSelection.empty();\n\n // Check for empty() not working (issue #24)\n if (this.docSelection.type != \"None\") {\n // Work around failure to empty a control selection by instead selecting a TextRange and then\n // calling empty()\n var doc;\n if (this.anchorNode) {\n doc = getDocument(this.anchorNode);\n } else if (this.docSelection.type == CONTROL) {\n var controlRange = this.docSelection.createRange();\n if (controlRange.length) {\n doc = getDocument( controlRange.item(0) );\n }\n }\n if (doc) {\n var textRange = getBody(doc).createTextRange();\n textRange.select();\n this.docSelection.empty();\n }\n }\n } catch(ex) {}\n updateEmptySelection(this);\n };\n\n selProto.addRange = function(range) {\n if (this.docSelection.type == CONTROL) {\n addRangeToControlSelection(this, range);\n } else {\n api.WrappedTextRange.rangeToTextRange(range).select();\n this._ranges[0] = range;\n this.rangeCount = 1;\n this.isCollapsed = this._ranges[0].collapsed;\n updateAnchorAndFocusFromRange(this, range, false);\n updateType(this);\n }\n };\n\n selProto.setRanges = function(ranges) {\n this.removeAllRanges();\n var rangeCount = ranges.length;\n if (rangeCount > 1) {\n createControlSelection(this, ranges);\n } else if (rangeCount) {\n this.addRange(ranges[0]);\n }\n };\n } else {\n module.fail(\"No means of selecting a Range or TextRange was found\");\n return false;\n }\n\n selProto.getRangeAt = function(index) {\n if (index < 0 || index >= this.rangeCount) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n } else {\n // Clone the range to preserve selection-range independence. See issue 80.\n return this._ranges[index].cloneRange();\n }\n };\n\n var refreshSelection;\n\n if (useDocumentSelection) {\n refreshSelection = function(sel) {\n var range;\n if (api.isSelectionValid(sel.win)) {\n range = sel.docSelection.createRange();\n } else {\n range = getBody(sel.win.document).createTextRange();\n range.collapse(true);\n }\n\n if (sel.docSelection.type == CONTROL) {\n updateControlSelection(sel);\n } else if (isTextRange(range)) {\n updateFromTextRange(sel, range);\n } else {\n updateEmptySelection(sel);\n }\n };\n } else if (isHostMethod(testSelection, \"getRangeAt\") && typeof testSelection.rangeCount == NUMBER) {\n refreshSelection = function(sel) {\n if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {\n updateControlSelection(sel);\n } else {\n sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;\n if (sel.rangeCount) {\n for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));\n }\n updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));\n sel.isCollapsed = selectionIsCollapsed(sel);\n updateType(sel);\n } else {\n updateEmptySelection(sel);\n }\n }\n };\n } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {\n refreshSelection = function(sel) {\n var range, nativeSel = sel.nativeSelection;\n if (nativeSel.anchorNode) {\n range = getSelectionRangeAt(nativeSel, 0);\n sel._ranges = [range];\n sel.rangeCount = 1;\n updateAnchorAndFocusFromNativeSelection(sel);\n sel.isCollapsed = selectionIsCollapsed(sel);\n updateType(sel);\n } else {\n updateEmptySelection(sel);\n }\n };\n } else {\n module.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\");\n return false;\n }\n\n selProto.refresh = function(checkForChanges) {\n var oldRanges = checkForChanges ? this._ranges.slice(0) : null;\n var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;\n\n refreshSelection(this);\n if (checkForChanges) {\n // Check the range count first\n var i = oldRanges.length;\n if (i != this._ranges.length) {\n return true;\n }\n\n // Now check the direction. Checking the anchor position is the same is enough since we're checking all the\n // ranges after this\n if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {\n return true;\n }\n\n // Finally, compare each range in turn\n while (i--) {\n if (!rangesEqual(oldRanges[i], this._ranges[i])) {\n return true;\n }\n }\n return false;\n }\n };\n\n // Removal of a single range\n var removeRangeManually = function(sel, range) {\n var ranges = sel.getAllRanges();\n sel.removeAllRanges();\n for (var i = 0, len = ranges.length; i < len; ++i) {\n if (!rangesEqual(range, ranges[i])) {\n sel.addRange(ranges[i]);\n }\n }\n if (!sel.rangeCount) {\n updateEmptySelection(sel);\n }\n };\n\n if (implementsControlRange && implementsDocSelection) {\n selProto.removeRange = function(range) {\n if (this.docSelection.type == CONTROL) {\n var controlRange = this.docSelection.createRange();\n var rangeElement = getSingleElementFromRange(range);\n\n // Create a new ControlRange containing all the elements in the selected ControlRange minus the\n // element contained by the supplied range\n var doc = getDocument(controlRange.item(0));\n var newControlRange = getBody(doc).createControlRange();\n var el, removed = false;\n for (var i = 0, len = controlRange.length; i < len; ++i) {\n el = controlRange.item(i);\n if (el !== rangeElement || removed) {\n newControlRange.add(controlRange.item(i));\n } else {\n removed = true;\n }\n }\n newControlRange.select();\n\n // Update the wrapped selection based on what's now in the native selection\n updateControlSelection(this);\n } else {\n removeRangeManually(this, range);\n }\n };\n } else {\n selProto.removeRange = function(range) {\n removeRangeManually(this, range);\n };\n }\n\n // Detecting if a selection is backward\n var selectionIsBackward;\n if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {\n selectionIsBackward = winSelectionIsBackward;\n\n selProto.isBackward = function() {\n return selectionIsBackward(this);\n };\n } else {\n selectionIsBackward = selProto.isBackward = function() {\n return false;\n };\n }\n\n // Create an alias for backwards compatibility. From 1.3, everything is \"backward\" rather than \"backwards\"\n selProto.isBackwards = selProto.isBackward;\n\n // Selection stringifier\n // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.\n // The current spec does not yet define this method.\n selProto.toString = function() {\n var rangeTexts = [];\n for (var i = 0, len = this.rangeCount; i < len; ++i) {\n rangeTexts[i] = \"\" + this._ranges[i];\n }\n return rangeTexts.join(\"\");\n };\n\n function assertNodeInSameDocument(sel, node) {\n if (sel.win.document != getDocument(node)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (dom.isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n // No current browser conforms fully to the spec for this method, so Rangy's own method is always used\n selProto.collapse = function(node, offset) {\n assertNodeInSameDocument(this, node);\n var range = api.createRange(node);\n range.collapseToPoint(node, offset);\n this.setSingleRange(range);\n this.isCollapsed = true;\n };\n\n selProto.collapseToStart = function() {\n if (this.rangeCount) {\n var range = this._ranges[0];\n this.collapse(range.startContainer, range.startOffset);\n } else {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n };\n\n selProto.collapseToEnd = function() {\n if (this.rangeCount) {\n var range = this._ranges[this.rangeCount - 1];\n this.collapse(range.endContainer, range.endOffset);\n } else {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n };\n\n // The spec is very specific on how selectAllChildren should be implemented and not all browsers implement it as\n // specified so the native implementation is never used by Rangy.\n selProto.selectAllChildren = function(node) {\n assertNodeInSameDocument(this, node);\n var range = api.createRange(node);\n range.selectNodeContents(node);\n this.setSingleRange(range);\n };\n\n if (selectionHasSetBaseAndExtent) {\n selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n this.nativeSelection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);\n this.refresh();\n };\n } else if (selectionHasExtend) {\n selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n assertValidOffset(anchorNode, anchorOffset);\n assertValidOffset(focusNode, focusOffset);\n assertNodeInSameDocument(this, anchorNode);\n assertNodeInSameDocument(this, focusNode);\n var range = api.createRange(node);\n var isBackwards = (dom.comparePoints(anchorNode, anchorOffset, focusNode, focusOffset) == -1);\n if (isBackwards) {\n range.setStartAndEnd(focusNode, focusOffset, anchorNode, anchorOffset);\n } else {\n range.setStartAndEnd(anchorNode, anchorOffset, focusNode, focusOffset);\n }\n this.setSingleRange(range, isBackwards);\n };\n }\n\n selProto.deleteFromDocument = function() {\n // Sepcial behaviour required for IE's control selections\n if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n var controlRange = this.docSelection.createRange();\n var element;\n while (controlRange.length) {\n element = controlRange.item(0);\n controlRange.remove(element);\n dom.removeNode(element);\n }\n this.refresh();\n } else if (this.rangeCount) {\n var ranges = this.getAllRanges();\n if (ranges.length) {\n this.removeAllRanges();\n for (var i = 0, len = ranges.length; i < len; ++i) {\n ranges[i].deleteContents();\n }\n // The spec says nothing about what the selection should contain after calling deleteContents on each\n // range. Firefox moves the selection to where the final selected range was, so we emulate that\n this.addRange(ranges[len - 1]);\n }\n }\n };\n\n // The following are non-standard extensions\n selProto.eachRange = function(func, returnValue) {\n for (var i = 0, len = this._ranges.length; i < len; ++i) {\n if ( func( this.getRangeAt(i) ) ) {\n return returnValue;\n }\n }\n };\n\n selProto.getAllRanges = function() {\n var ranges = [];\n this.eachRange(function(range) {\n ranges.push(range);\n });\n return ranges;\n };\n\n selProto.setSingleRange = function(range, direction) {\n this.removeAllRanges();\n this.addRange(range, direction);\n };\n\n selProto.callMethodOnEachRange = function(methodName, params) {\n var results = [];\n this.eachRange( function(range) {\n results.push( range[methodName].apply(range, params || []) );\n } );\n return results;\n };\n\n function createStartOrEndSetter(isStart) {\n return function(node, offset) {\n var range;\n if (this.rangeCount) {\n range = this.getRangeAt(0);\n range[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n } else {\n range = api.createRange(this.win.document);\n range.setStartAndEnd(node, offset);\n }\n this.setSingleRange(range, this.isBackward());\n };\n }\n\n selProto.setStart = createStartOrEndSetter(true);\n selProto.setEnd = createStartOrEndSetter(false);\n\n // Add select() method to Range prototype. Any existing selection will be removed.\n api.rangePrototype.select = function(direction) {\n getSelection( this.getDocument() ).setSingleRange(this, direction);\n };\n\n selProto.changeEachRange = function(func) {\n var ranges = [];\n var backward = this.isBackward();\n\n this.eachRange(function(range) {\n func(range);\n ranges.push(range);\n });\n\n this.removeAllRanges();\n if (backward && ranges.length == 1) {\n this.addRange(ranges[0], \"backward\");\n } else {\n this.setRanges(ranges);\n }\n };\n\n selProto.containsNode = function(node, allowPartial) {\n return this.eachRange( function(range) {\n return range.containsNode(node, allowPartial);\n }, true ) || false;\n };\n\n selProto.getBookmark = function(containerNode) {\n return {\n backward: this.isBackward(),\n rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [containerNode])\n };\n };\n\n selProto.moveToBookmark = function(bookmark) {\n var selRanges = [];\n for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {\n range = api.createRange(this.win);\n range.moveToBookmark(rangeBookmark);\n selRanges.push(range);\n }\n if (bookmark.backward) {\n this.setSingleRange(selRanges[0], \"backward\");\n } else {\n this.setRanges(selRanges);\n }\n };\n\n selProto.saveRanges = function() {\n return {\n backward: this.isBackward(),\n ranges: this.callMethodOnEachRange(\"cloneRange\")\n };\n };\n\n selProto.restoreRanges = function(selRanges) {\n this.removeAllRanges();\n for (var i = 0, range; range = selRanges.ranges[i]; ++i) {\n this.addRange(range, (selRanges.backward && i == 0));\n }\n };\n\n selProto.toHtml = function() {\n var rangeHtmls = [];\n this.eachRange(function(range) {\n rangeHtmls.push( DomRange.toHtml(range) );\n });\n return rangeHtmls.join(\"\");\n };\n\n if (features.implementsTextRange) {\n selProto.getNativeTextRange = function() {\n var sel, textRange;\n if ( (sel = this.docSelection) ) {\n var range = sel.createRange();\n if (isTextRange(range)) {\n return range;\n } else {\n throw module.createError(\"getNativeTextRange: selection is a control selection\");\n }\n } else if (this.rangeCount > 0) {\n return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );\n } else {\n throw module.createError(\"getNativeTextRange: selection contains no range\");\n }\n };\n }\n\n function inspect(sel) {\n var rangeInspects = [];\n var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);\n var focus = new DomPosition(sel.focusNode, sel.focusOffset);\n var name = (typeof sel.getName == \"function\") ? sel.getName() : \"Selection\";\n\n if (typeof sel.rangeCount != \"undefined\") {\n for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));\n }\n }\n return \"[\" + name + \"(Ranges: \" + rangeInspects.join(\", \") +\n \")(anchor: \" + anchor.inspect() + \", focus: \" + focus.inspect() + \"]\";\n }\n\n selProto.getName = function() {\n return \"WrappedSelection\";\n };\n\n selProto.inspect = function() {\n return inspect(this);\n };\n\n selProto.detach = function() {\n actOnCachedSelection(this.win, \"delete\");\n deleteProperties(this);\n };\n\n WrappedSelection.detachAll = function() {\n actOnCachedSelection(null, \"deleteAll\");\n };\n\n WrappedSelection.inspect = inspect;\n WrappedSelection.isDirectionBackward = isDirectionBackward;\n\n api.Selection = WrappedSelection;\n\n api.selectionPrototype = selProto;\n\n api.addShimListener(function(win) {\n if (typeof win.getSelection == \"undefined\") {\n win.getSelection = function() {\n return getSelection(win);\n };\n }\n win = null;\n });\n });\n \n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wait for document to load before initializing\n var docReady = false;\n\n var loadHandler = function(e) {\n if (!docReady) {\n docReady = true;\n if (!api.initialized && api.config.autoInitialize) {\n init();\n }\n }\n };\n\n if (isBrowser) {\n // Test whether the document has already been loaded and initialize immediately if so\n if (document.readyState == \"complete\") {\n loadHandler();\n } else {\n if (isHostMethod(document, \"addEventListener\")) {\n document.addEventListener(\"DOMContentLoaded\", loadHandler, false);\n }\n\n // Add a fallback in case the DOMContentLoaded event isn't supported\n addListener(window, \"load\", loadHandler);\n }\n }\n\n return api;\n}, this);","/**\n * Text range module for Rangy.\n * Text-based manipulation and searching of ranges and selections.\n *\n * Features\n *\n * - Ability to move range boundaries by character or word offsets\n * - Customizable word tokenizer\n * - Ignores text nodes inside <script> or <style> elements or those hidden by CSS display and visibility properties\n * - Range findText method to search for text or regex within the page or within a range. Flags for whole words and case\n * sensitivity\n * - Selection and range save/restore as text offsets within a node\n * - Methods to return visible text within a range or selection\n * - innerText method for elements\n *\n * References\n *\n * https://www.w3.org/Bugs/Public/show_bug.cgi?id=13145\n * http://aryeh.name/spec/innertext/innertext.html\n * http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2022, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.1\n * Build date: 17 August 2022\n */\n\n/**\n * Problem: handling of trailing spaces before line breaks is handled inconsistently between browsers.\n *\n * First, a <br>: this is relatively simple. For the following HTML:\n *\n * 1 <br>2\n *\n * - IE and WebKit render the space, include it in the selection (i.e. when the content is selected and pasted into a\n * textarea, the space is present) and allow the caret to be placed after it.\n * - Firefox does not acknowledge the space in the selection but it is possible to place the caret after it.\n * - Opera does not render the space but has two separate caret positions on either side of the space (left and right\n * arrow keys show this) and includes the space in the selection.\n *\n * The other case is the line break or breaks implied by block elements. For the following HTML:\n *\n * <p>1 </p><p>2<p>\n *\n * - WebKit does not acknowledge the space in any way\n * - Firefox, IE and Opera as per <br>\n *\n * One more case is trailing spaces before line breaks in elements with white-space: pre-line. For the following HTML:\n *\n * <p style=\"white-space: pre-line\">1\n * 2</p>\n *\n * - Firefox and WebKit include the space in caret positions\n * - IE does not support pre-line up to and including version 9\n * - Opera ignores the space\n * - Trailing space only renders if there is a non-collapsed character in the line\n *\n * Problem is whether Rangy should ever acknowledge the space and if so, when. Another problem is whether this can be\n * feature-tested\n */\n(function(factory, root) {\n if (typeof define == \"function\" && define.amd) {\n // AMD. Register as an anonymous module with a dependency on Rangy.\n define([\"./rangy-core\"], factory);\n } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n // Node/CommonJS style\n module.exports = factory( require(\"rangy\") );\n } else {\n // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n factory(root.rangy);\n }\n})(function(rangy) {\n rangy.createModule(\"TextRange\", [\"WrappedSelection\"], function(api, module) {\n var UNDEF = \"undefined\";\n var CHARACTER = \"character\", WORD = \"word\";\n var dom = api.dom, util = api.util;\n var extend = util.extend;\n var createOptions = util.createOptions;\n var getBody = dom.getBody;\n\n\n var spacesRegex = /^[ \\t\\f\\r\\n]+$/;\n var spacesMinusLineBreaksRegex = /^[ \\t\\f\\r]+$/;\n var allWhiteSpaceRegex = /^[\\t-\\r \\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200B\\u2028\\u2029\\u202F\\u205F\\u3000]+$/;\n var nonLineBreakWhiteSpaceRegex = /^[\\t \\u00A0\\u1680\\u180E\\u2000-\\u200B\\u202F\\u205F\\u3000]+$/;\n var lineBreakRegex = /^[\\n-\\r\\u0085\\u2028\\u2029]$/;\n\n var defaultLanguage = \"en\";\n\n var isDirectionBackward = api.Selection.isDirectionBackward;\n\n // Properties representing whether trailing spaces inside blocks are completely collapsed (as they are in WebKit,\n // but not other browsers). Also test whether trailing spaces before <br> elements are collapsed.\n var trailingSpaceInBlockCollapses = false;\n var trailingSpaceBeforeBrCollapses = false;\n var trailingSpaceBeforeBlockCollapses = false;\n var trailingSpaceBeforeLineBreakInPreLineCollapses = true;\n\n (function() {\n var el = dom.createTestElement(document, \"<p>1 </p><p></p>\", true);\n var p = el.firstChild;\n var sel = api.getSelection();\n sel.collapse(p.lastChild, 2);\n sel.setStart(p.firstChild, 0);\n trailingSpaceInBlockCollapses = (\"\" + sel).length == 1;\n\n el.innerHTML = \"1 <br />\";\n sel.collapse(el, 2);\n sel.setStart(el.firstChild, 0);\n trailingSpaceBeforeBrCollapses = (\"\" + sel).length == 1;\n\n el.innerHTML = \"1 <p>1</p>\";\n sel.collapse(el, 2);\n sel.setStart(el.firstChild, 0);\n trailingSpaceBeforeBlockCollapses = (\"\" + sel).length == 1;\n\n dom.removeNode(el);\n sel.removeAllRanges();\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // This function must create word and non-word tokens for the whole of the text supplied to it\n function defaultTokenizer(chars, wordOptions) {\n var word = chars.join(\"\"), result, tokenRanges = [];\n\n function createTokenRange(start, end, isWord) {\n tokenRanges.push( { start: start, end: end, isWord: isWord } );\n }\n\n // Match words and mark characters\n var lastWordEnd = 0, wordStart, wordEnd;\n while ( (result = wordOptions.wordRegex.exec(word)) ) {\n wordStart = result.index;\n wordEnd = wordStart + result[0].length;\n\n // Create token for non-word characters preceding this word\n if (wordStart > lastWordEnd) {\n createTokenRange(lastWordEnd, wordStart, false);\n }\n\n // Get trailing space characters for word\n if (wordOptions.includeTrailingSpace) {\n while ( nonLineBreakWhiteSpaceRegex.test(chars[wordEnd]) ) {\n ++wordEnd;\n }\n }\n createTokenRange(wordStart, wordEnd, true);\n lastWordEnd = wordEnd;\n }\n\n // Create token for trailing non-word characters, if any exist\n if (lastWordEnd < chars.length) {\n createTokenRange(lastWordEnd, chars.length, false);\n }\n\n return tokenRanges;\n }\n\n function convertCharRangeToToken(chars, tokenRange) {\n var tokenChars = chars.slice(tokenRange.start, tokenRange.end);\n var token = {\n isWord: tokenRange.isWord,\n chars: tokenChars,\n toString: function() {\n return tokenChars.join(\"\");\n }\n };\n for (var i = 0, len = tokenChars.length; i < len; ++i) {\n tokenChars[i].token = token;\n }\n return token;\n }\n\n function tokenize(chars, wordOptions, tokenizer) {\n var tokenRanges = tokenizer(chars, wordOptions);\n var tokens = [];\n for (var i = 0, tokenRange; tokenRange = tokenRanges[i++]; ) {\n tokens.push( convertCharRangeToToken(chars, tokenRange) );\n }\n return tokens;\n }\n\n var defaultCharacterOptions = {\n includeBlockContentTrailingSpace: true,\n includeSpaceBeforeBr: true,\n includeSpaceBeforeBlock: true,\n includePreLineTrailingSpace: true,\n ignoreCharacters: \"\"\n };\n\n function normalizeIgnoredCharacters(ignoredCharacters) {\n // Check if character is ignored\n var ignoredChars = ignoredCharacters || \"\";\n\n // Normalize ignored characters into a string consisting of characters in ascending order of character code\n var ignoredCharsArray = (typeof ignoredChars == \"string\") ? ignoredChars.split(\"\") : ignoredChars;\n ignoredCharsArray.sort(function(char1, char2) {\n return char1.charCodeAt(0) - char2.charCodeAt(0);\n });\n\n /// Convert back to a string and remove duplicates\n return ignoredCharsArray.join(\"\").replace(/(.)\\1+/g, \"$1\");\n }\n\n var defaultCaretCharacterOptions = {\n includeBlockContentTrailingSpace: !trailingSpaceBeforeLineBreakInPreLineCollapses,\n includeSpaceBeforeBr: !trailingSpaceBeforeBrCollapses,\n includeSpaceBeforeBlock: !trailingSpaceBeforeBlockCollapses,\n includePreLineTrailingSpace: true\n };\n\n var defaultWordOptions = {\n \"en\": {\n wordRegex: /[a-z0-9]+('[a-z0-9]+)*/gi,\n includeTrailingSpace: false,\n tokenizer: defaultTokenizer\n }\n };\n\n var defaultFindOptions = {\n caseSensitive: false,\n withinRange: null,\n wholeWordsOnly: false,\n wrap: false,\n direction: \"forward\",\n wordOptions: null,\n characterOptions: null\n };\n\n var defaultMoveOptions = {\n wordOptions: null,\n characterOptions: null\n };\n\n var defaultExpandOptions = {\n wordOptions: null,\n characterOptions: null,\n trim: false,\n trimStart: true,\n trimEnd: true\n };\n\n var defaultWordIteratorOptions = {\n wordOptions: null,\n characterOptions: null,\n direction: \"forward\"\n };\n\n function createWordOptions(options) {\n var lang, defaults;\n if (!options) {\n return defaultWordOptions[defaultLanguage];\n } else {\n lang = options.language || defaultLanguage;\n defaults = {};\n extend(defaults, defaultWordOptions[lang] || defaultWordOptions[defaultLanguage]);\n extend(defaults, options);\n return defaults;\n }\n }\n\n function createNestedOptions(optionsParam, defaults) {\n var options = createOptions(optionsParam, defaults);\n if (defaults.hasOwnProperty(\"wordOptions\")) {\n options.wordOptions = createWordOptions(options.wordOptions);\n }\n if (defaults.hasOwnProperty(\"characterOptions\")) {\n options.characterOptions = createOptions(options.characterOptions, defaultCharacterOptions);\n }\n return options;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n /* DOM utility functions */\n var getComputedStyleProperty = dom.getComputedStyleProperty;\n\n // Create cachable versions of DOM functions\n\n // Test for old IE's incorrect display properties\n var tableCssDisplayBlock;\n (function() {\n var table = document.createElement(\"table\");\n var body = getBody(document);\n body.appendChild(table);\n tableCssDisplayBlock = (getComputedStyleProperty(table, \"display\") == \"block\");\n body.removeChild(table);\n })();\n\n var defaultDisplayValueForTag = {\n table: \"table\",\n caption: \"table-caption\",\n colgroup: \"table-column-group\",\n col: \"table-column\",\n thead: \"table-header-group\",\n tbody: \"table-row-group\",\n tfoot: \"table-footer-group\",\n tr: \"table-row\",\n td: \"table-cell\",\n th: \"table-cell\"\n };\n\n // Corrects IE's \"block\" value for table-related elements\n function getComputedDisplay(el, win) {\n var display = getComputedStyleProperty(el, \"display\", win);\n var tagName = el.tagName.toLowerCase();\n return (display == \"block\" &&\n tableCssDisplayBlock &&\n defaultDisplayValueForTag.hasOwnProperty(tagName)) ?\n defaultDisplayValueForTag[tagName] : display;\n }\n\n function isHidden(node) {\n var ancestors = getAncestorsAndSelf(node);\n for (var i = 0, len = ancestors.length; i < len; ++i) {\n if (ancestors[i].nodeType == 1 && getComputedDisplay(ancestors[i]) == \"none\") {\n return true;\n }\n }\n\n return false;\n }\n\n function isVisibilityHiddenTextNode(textNode) {\n var el;\n return textNode.nodeType == 3 &&\n (el = textNode.parentNode) &&\n getComputedStyleProperty(el, \"visibility\") == \"hidden\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n \n // \"A block node is either an Element whose \"display\" property does not have\n // resolved value \"inline\" or \"inline-block\" or \"inline-table\" or \"none\", or a\n // Document, or a DocumentFragment.\"\n function isBlockNode(node) {\n return node &&\n ((node.nodeType == 1 && !/^(inline(-block|-table)?|none)$/.test(getComputedDisplay(node))) ||\n node.nodeType == 9 || node.nodeType == 11);\n }\n\n function getLastDescendantOrSelf(node) {\n var lastChild = node.lastChild;\n return lastChild ? getLastDescendantOrSelf(lastChild) : node;\n }\n\n function containsPositions(node) {\n return dom.isCharacterDataNode(node) ||\n !/^(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)$/i.test(node.nodeName);\n }\n\n function getAncestors(node) {\n var ancestors = [];\n while (node.parentNode) {\n ancestors.unshift(node.parentNode);\n node = node.parentNode;\n }\n return ancestors;\n }\n\n function getAncestorsAndSelf(node) {\n return getAncestors(node).concat([node]);\n }\n\n function nextNodeDescendants(node) {\n while (node && !node.nextSibling) {\n node = node.parentNode;\n }\n if (!node) {\n return null;\n }\n return node.nextSibling;\n }\n\n function nextNode(node, excludeChildren) {\n if (!excludeChildren && node.hasChildNodes()) {\n return node.firstChild;\n }\n return nextNodeDescendants(node);\n }\n\n function previousNode(node) {\n var previous = node.previousSibling;\n if (previous) {\n node = previous;\n while (node.hasChildNodes()) {\n node = node.lastChild;\n }\n return node;\n }\n var parent = node.parentNode;\n if (parent && parent.nodeType == 1) {\n return parent;\n }\n return null;\n }\n\n // Adpated from Aryeh's code.\n // \"A whitespace node is either a Text node whose data is the empty string; or\n // a Text node whose data consists only of one or more tabs (0x0009), line\n // feeds (0x000A), carriage returns (0x000D), and/or spaces (0x0020), and whose\n // parent is an Element whose resolved value for \"white-space\" is \"normal\" or\n // \"nowrap\"; or a Text node whose data consists only of one or more tabs\n // (0x0009), carriage returns (0x000D), and/or spaces (0x0020), and whose\n // parent is an Element whose resolved value for \"white-space\" is \"pre-line\".\"\n function isWhitespaceNode(node) {\n if (!node || node.nodeType != 3) {\n return false;\n }\n var text = node.data;\n if (text === \"\") {\n return true;\n }\n var parent = node.parentNode;\n if (!parent || parent.nodeType != 1) {\n return false;\n }\n var computedWhiteSpace = getComputedStyleProperty(node.parentNode, \"whiteSpace\");\n\n return (/^[\\t\\n\\r ]+$/.test(text) && /^(normal|nowrap)$/.test(computedWhiteSpace)) ||\n (/^[\\t\\r ]+$/.test(text) && computedWhiteSpace == \"pre-line\");\n }\n\n // Adpated from Aryeh's code.\n // \"node is a collapsed whitespace node if the following algorithm returns\n // true:\"\n function isCollapsedWhitespaceNode(node) {\n // \"If node's data is the empty string, return true.\"\n if (node.data === \"\") {\n return true;\n }\n\n // \"If node is not a whitespace node, return false.\"\n if (!isWhitespaceNode(node)) {\n return false;\n }\n\n // \"Let ancestor be node's parent.\"\n var ancestor = node.parentNode;\n\n // \"If ancestor is null, return true.\"\n if (!ancestor) {\n return true;\n }\n\n // \"If the \"display\" property of some ancestor of node has resolved value \"none\", return true.\"\n if (isHidden(node)) {\n return true;\n }\n\n return false;\n }\n\n function isCollapsedNode(node) {\n var type = node.nodeType;\n return type == 7 /* PROCESSING_INSTRUCTION */ ||\n type == 8 /* COMMENT */ ||\n isHidden(node) ||\n /^(script|style)$/i.test(node.nodeName) ||\n isVisibilityHiddenTextNode(node) ||\n isCollapsedWhitespaceNode(node);\n }\n\n function isIgnoredNode(node, win) {\n var type = node.nodeType;\n return type == 7 /* PROCESSING_INSTRUCTION */ ||\n type == 8 /* COMMENT */ ||\n (type == 1 && getComputedDisplay(node, win) == \"none\");\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Possibly overengineered caching system to prevent repeated DOM calls slowing everything down\n\n function Cache() {\n this.store = {};\n }\n\n Cache.prototype = {\n get: function(key) {\n return this.store.hasOwnProperty(key) ? this.store[key] : null;\n },\n\n set: function(key, value) {\n return this.store[key] = value;\n }\n };\n\n var cachedCount = 0, uncachedCount = 0;\n\n function createCachingGetter(methodName, func, objProperty) {\n return function(args) {\n var cache = this.cache;\n if (cache.hasOwnProperty(methodName)) {\n cachedCount++;\n return cache[methodName];\n } else {\n uncachedCount++;\n var value = func.call(this, objProperty ? this[objProperty] : this, args);\n cache[methodName] = value;\n return value;\n }\n };\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function NodeWrapper(node, session) {\n this.node = node;\n this.session = session;\n this.cache = new Cache();\n this.positions = new Cache();\n }\n\n var nodeProto = {\n getPosition: function(offset) {\n var positions = this.positions;\n return positions.get(offset) || positions.set(offset, new Position(this, offset));\n },\n\n toString: function() {\n return \"[NodeWrapper(\" + dom.inspectNode(this.node) + \")]\";\n }\n };\n\n NodeWrapper.prototype = nodeProto;\n\n var EMPTY = \"EMPTY\",\n NON_SPACE = \"NON_SPACE\",\n UNCOLLAPSIBLE_SPACE = \"UNCOLLAPSIBLE_SPACE\",\n COLLAPSIBLE_SPACE = \"COLLAPSIBLE_SPACE\",\n TRAILING_SPACE_BEFORE_BLOCK = \"TRAILING_SPACE_BEFORE_BLOCK\",\n TRAILING_SPACE_IN_BLOCK = \"TRAILING_SPACE_IN_BLOCK\",\n TRAILING_SPACE_BEFORE_BR = \"TRAILING_SPACE_BEFORE_BR\",\n PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK = \"PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK\",\n TRAILING_LINE_BREAK_AFTER_BR = \"TRAILING_LINE_BREAK_AFTER_BR\",\n INCLUDED_TRAILING_LINE_BREAK_AFTER_BR = \"INCLUDED_TRAILING_LINE_BREAK_AFTER_BR\";\n\n extend(nodeProto, {\n isCharacterDataNode: createCachingGetter(\"isCharacterDataNode\", dom.isCharacterDataNode, \"node\"),\n getNodeIndex: createCachingGetter(\"nodeIndex\", dom.getNodeIndex, \"node\"),\n getLength: createCachingGetter(\"nodeLength\", dom.getNodeLength, \"node\"),\n containsPositions: createCachingGetter(\"containsPositions\", containsPositions, \"node\"),\n isWhitespace: createCachingGetter(\"isWhitespace\", isWhitespaceNode, \"node\"),\n isCollapsedWhitespace: createCachingGetter(\"isCollapsedWhitespace\", isCollapsedWhitespaceNode, \"node\"),\n getComputedDisplay: createCachingGetter(\"computedDisplay\", getComputedDisplay, \"node\"),\n isCollapsed: createCachingGetter(\"collapsed\", isCollapsedNode, \"node\"),\n isIgnored: createCachingGetter(\"ignored\", isIgnoredNode, \"node\"),\n next: createCachingGetter(\"nextPos\", nextNode, \"node\"),\n previous: createCachingGetter(\"previous\", previousNode, \"node\"),\n\n getTextNodeInfo: createCachingGetter(\"textNodeInfo\", function(textNode) {\n var spaceRegex = null, collapseSpaces = false;\n var cssWhitespace = getComputedStyleProperty(textNode.parentNode, \"whiteSpace\");\n var preLine = (cssWhitespace == \"pre-line\");\n if (preLine) {\n spaceRegex = spacesMinusLineBreaksRegex;\n collapseSpaces = true;\n } else if (cssWhitespace == \"normal\" || cssWhitespace == \"nowrap\") {\n spaceRegex = spacesRegex;\n collapseSpaces = true;\n }\n\n return {\n node: textNode,\n text: textNode.data,\n spaceRegex: spaceRegex,\n collapseSpaces: collapseSpaces,\n preLine: preLine\n };\n }, \"node\"),\n\n hasInnerText: createCachingGetter(\"hasInnerText\", function(el, backward) {\n var session = this.session;\n var posAfterEl = session.getPosition(el.parentNode, this.getNodeIndex() + 1);\n var firstPosInEl = session.getPosition(el, 0);\n\n var pos = backward ? posAfterEl : firstPosInEl;\n var endPos = backward ? firstPosInEl : posAfterEl;\n\n /*\n <body><p>X </p><p>Y</p></body>\n\n Positions:\n\n body:0:\"\"\n p:0:\"\"\n text:0:\"\"\n text:1:\"X\"\n text:2:TRAILING_SPACE_IN_BLOCK\n text:3:COLLAPSED_SPACE\n p:1:\"\"\n body:1:\"\\n\"\n p:0:\"\"\n text:0:\"\"\n text:1:\"Y\"\n\n A character is a TRAILING_SPACE_IN_BLOCK iff:\n\n - There is no uncollapsed character after it within the visible containing block element\n\n A character is a TRAILING_SPACE_BEFORE_BR iff:\n\n - There is no uncollapsed character after it preceding a <br> element\n\n An element has inner text iff\n\n - It is not hidden\n - It contains an uncollapsed character\n\n All trailing spaces (pre-line, before <br>, end of block) require definite non-empty characters to render.\n */\n\n while (pos !== endPos) {\n pos.prepopulateChar();\n if (pos.isDefinitelyNonEmpty()) {\n return true;\n }\n pos = backward ? pos.previousVisible() : pos.nextVisible();\n }\n\n return false;\n }, \"node\"),\n\n isRenderedBlock: createCachingGetter(\"isRenderedBlock\", function(el) {\n // Ensure that a block element containing a <br> is considered to have inner text\n var brs = el.getElementsByTagName(\"br\");\n for (var i = 0, len = brs.length; i < len; ++i) {\n if (!isCollapsedNode(brs[i])) {\n return true;\n }\n }\n return this.hasInnerText();\n }, \"node\"),\n\n getTrailingSpace: createCachingGetter(\"trailingSpace\", function(el) {\n if (el.tagName.toLowerCase() == \"br\") {\n return \"\";\n } else {\n switch (this.getComputedDisplay()) {\n case \"inline\":\n var child = el.lastChild;\n while (child) {\n if (!isIgnoredNode(child)) {\n return (child.nodeType == 1) ? this.session.getNodeWrapper(child).getTrailingSpace() : \"\";\n }\n child = child.previousSibling;\n }\n break;\n case \"inline-block\":\n case \"inline-table\":\n case \"none\":\n case \"table-column\":\n case \"table-column-group\":\n break;\n case \"table-cell\":\n return \"\\t\";\n default:\n return this.isRenderedBlock(true) ? \"\\n\" : \"\";\n }\n }\n return \"\";\n }, \"node\"),\n\n getLeadingSpace: createCachingGetter(\"leadingSpace\", function(el) {\n switch (this.getComputedDisplay()) {\n case \"inline\":\n case \"inline-block\":\n case \"inline-table\":\n case \"none\":\n case \"table-column\":\n case \"table-column-group\":\n case \"table-cell\":\n break;\n default:\n return this.isRenderedBlock(false) ? \"\\n\" : \"\";\n }\n return \"\";\n }, \"node\")\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function Position(nodeWrapper, offset) {\n this.offset = offset;\n this.nodeWrapper = nodeWrapper;\n this.node = nodeWrapper.node;\n this.session = nodeWrapper.session;\n this.cache = new Cache();\n }\n\n function inspectPosition() {\n return \"[Position(\" + dom.inspectNode(this.node) + \":\" + this.offset + \")]\";\n }\n\n var positionProto = {\n character: \"\",\n characterType: EMPTY,\n isBr: false,\n\n /*\n This method:\n - Fully populates positions that have characters that can be determined independently of any other characters.\n - Populates most types of space positions with a provisional character. The character is finalized later.\n */\n prepopulateChar: function() {\n var pos = this;\n if (!pos.prepopulatedChar) {\n var node = pos.node, offset = pos.offset;\n var visibleChar = \"\", charType = EMPTY;\n var finalizedChar = false;\n if (offset > 0) {\n if (node.nodeType == 3) {\n var text = node.data;\n var textChar = text.charAt(offset - 1);\n\n var nodeInfo = pos.nodeWrapper.getTextNodeInfo();\n var spaceRegex = nodeInfo.spaceRegex;\n if (nodeInfo.collapseSpaces) {\n if (spaceRegex.test(textChar)) {\n // \"If the character at position is from set, append a single space (U+0020) to newdata and advance\n // position until the character at position is not from set.\"\n\n // We also need to check for the case where we're in a pre-line and we have a space preceding a\n // line break, because such spaces are collapsed in some browsers\n if (offset > 1 && spaceRegex.test(text.charAt(offset - 2))) {\n } else if (nodeInfo.preLine && text.charAt(offset) === \"\\n\") {\n visibleChar = \" \";\n charType = PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK;\n } else {\n visibleChar = \" \";\n //pos.checkForFollowingLineBreak = true;\n charType = COLLAPSIBLE_SPACE;\n }\n } else {\n visibleChar = textChar;\n charType = NON_SPACE;\n finalizedChar = true;\n }\n } else {\n visibleChar = textChar;\n charType = UNCOLLAPSIBLE_SPACE;\n finalizedChar = true;\n }\n } else {\n var nodePassed = node.childNodes[offset - 1];\n if (nodePassed && nodePassed.nodeType == 1 && !isCollapsedNode(nodePassed)) {\n if (nodePassed.tagName.toLowerCase() == \"br\") {\n visibleChar = \"\\n\";\n pos.isBr = true;\n charType = COLLAPSIBLE_SPACE;\n finalizedChar = false;\n } else {\n pos.checkForTrailingSpace = true;\n }\n }\n\n // Check the leading space of the next node for the case when a block element follows an inline\n // element or text node. In that case, there is an implied line break between the two nodes.\n if (!visibleChar) {\n var nextNode = node.childNodes[offset];\n if (nextNode && nextNode.nodeType == 1 && !isCollapsedNode(nextNode)) {\n pos.checkForLeadingSpace = true;\n }\n }\n }\n }\n\n pos.prepopulatedChar = true;\n pos.character = visibleChar;\n pos.characterType = charType;\n pos.isCharInvariant = finalizedChar;\n }\n },\n\n isDefinitelyNonEmpty: function() {\n var charType = this.characterType;\n return charType == NON_SPACE || charType == UNCOLLAPSIBLE_SPACE;\n },\n\n // Resolve leading and trailing spaces, which may involve prepopulating other positions\n resolveLeadingAndTrailingSpaces: function() {\n if (!this.prepopulatedChar) {\n this.prepopulateChar();\n }\n if (this.checkForTrailingSpace) {\n var trailingSpace = this.session.getNodeWrapper(this.node.childNodes[this.offset - 1]).getTrailingSpace();\n if (trailingSpace) {\n this.isTrailingSpace = true;\n this.character = trailingSpace;\n this.characterType = COLLAPSIBLE_SPACE;\n }\n this.checkForTrailingSpace = false;\n }\n if (this.checkForLeadingSpace) {\n var leadingSpace = this.session.getNodeWrapper(this.node.childNodes[this.offset]).getLeadingSpace();\n if (leadingSpace) {\n this.isLeadingSpace = true;\n this.character = leadingSpace;\n this.characterType = COLLAPSIBLE_SPACE;\n }\n this.checkForLeadingSpace = false;\n }\n },\n\n getPrecedingUncollapsedPosition: function(characterOptions) {\n var pos = this, character;\n while ( (pos = pos.previousVisible()) ) {\n character = pos.getCharacter(characterOptions);\n if (character !== \"\") {\n return pos;\n }\n }\n\n return null;\n },\n\n getCharacter: function(characterOptions) {\n this.resolveLeadingAndTrailingSpaces();\n\n var thisChar = this.character, returnChar;\n\n // Check if character is ignored\n var ignoredChars = normalizeIgnoredCharacters(characterOptions.ignoreCharacters);\n var isIgnoredCharacter = (thisChar !== \"\" && ignoredChars.indexOf(thisChar) > -1);\n\n // Check if this position's character is invariant (i.e. not dependent on character options) and return it\n // if so\n if (this.isCharInvariant) {\n returnChar = isIgnoredCharacter ? \"\" : thisChar;\n return returnChar;\n }\n\n var cacheKey = [\"character\", characterOptions.includeSpaceBeforeBr, characterOptions.includeBlockContentTrailingSpace, characterOptions.includePreLineTrailingSpace, ignoredChars].join(\"_\");\n var cachedChar = this.cache.get(cacheKey);\n if (cachedChar !== null) {\n return cachedChar;\n }\n\n // We need to actually get the character now\n var character = \"\";\n var collapsible = (this.characterType == COLLAPSIBLE_SPACE);\n\n var nextPos, previousPos;\n var gotPreviousPos = false;\n var pos = this;\n\n function getPreviousPos() {\n if (!gotPreviousPos) {\n previousPos = pos.getPrecedingUncollapsedPosition(characterOptions);\n gotPreviousPos = true;\n }\n return previousPos;\n }\n\n // Disallow a collapsible space that is followed by a line break or is the last character\n if (collapsible) {\n // Allow a trailing space that we've previously determined should be included\n if (this.type == INCLUDED_TRAILING_LINE_BREAK_AFTER_BR) {\n character = \"\\n\";\n }\n // Disallow a collapsible space that follows a trailing space or line break, or is the first character,\n // or follows a collapsible included space\n else if (thisChar == \" \" &&\n (!getPreviousPos() || previousPos.isTrailingSpace || previousPos.character == \"\\n\" || (previousPos.character == \" \" && previousPos.characterType == COLLAPSIBLE_SPACE))) {\n }\n // Allow a leading line break unless it follows a line break\n else if (thisChar == \"\\n\" && this.isLeadingSpace) {\n if (getPreviousPos() && previousPos.character != \"\\n\") {\n character = \"\\n\";\n } else {\n }\n } else {\n nextPos = this.nextUncollapsed();\n if (nextPos) {\n if (nextPos.isBr) {\n this.type = TRAILING_SPACE_BEFORE_BR;\n } else if (nextPos.isTrailingSpace && nextPos.character == \"\\n\") {\n this.type = TRAILING_SPACE_IN_BLOCK;\n } else if (nextPos.isLeadingSpace && nextPos.character == \"\\n\") {\n this.type = TRAILING_SPACE_BEFORE_BLOCK;\n }\n\n if (nextPos.character == \"\\n\") {\n if (this.type == TRAILING_SPACE_BEFORE_BR && !characterOptions.includeSpaceBeforeBr) {\n } else if (this.type == TRAILING_SPACE_BEFORE_BLOCK && !characterOptions.includeSpaceBeforeBlock) {\n } else if (this.type == TRAILING_SPACE_IN_BLOCK && nextPos.isTrailingSpace && !characterOptions.includeBlockContentTrailingSpace) {\n } else if (this.type == PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK && nextPos.type == NON_SPACE && !characterOptions.includePreLineTrailingSpace) {\n } else if (thisChar == \"\\n\") {\n if (nextPos.isTrailingSpace) {\n if (this.isTrailingSpace) {\n } else if (this.isBr) {\n nextPos.type = TRAILING_LINE_BREAK_AFTER_BR;\n\n if (getPreviousPos() && previousPos.isLeadingSpace && !previousPos.isTrailingSpace && previousPos.character == \"\\n\") {\n nextPos.character = \"\";\n } else {\n nextPos.type = INCLUDED_TRAILING_LINE_BREAK_AFTER_BR;\n }\n }\n } else {\n character = \"\\n\";\n }\n } else if (thisChar == \" \") {\n character = \" \";\n } else {\n }\n } else {\n character = thisChar;\n }\n } else {\n }\n }\n }\n\n if (ignoredChars.indexOf(character) > -1) {\n character = \"\";\n }\n\n\n this.cache.set(cacheKey, character);\n\n return character;\n },\n\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset === pos.offset;\n },\n\n inspect: inspectPosition,\n\n toString: function() {\n return this.character;\n }\n };\n\n Position.prototype = positionProto;\n\n extend(positionProto, {\n next: createCachingGetter(\"nextPos\", function(pos) {\n var nodeWrapper = pos.nodeWrapper, node = pos.node, offset = pos.offset, session = nodeWrapper.session;\n if (!node) {\n return null;\n }\n var nextNode, nextOffset, child;\n if (offset == nodeWrapper.getLength()) {\n // Move onto the next node\n nextNode = node.parentNode;\n nextOffset = nextNode ? nodeWrapper.getNodeIndex() + 1 : 0;\n } else {\n if (nodeWrapper.isCharacterDataNode()) {\n nextNode = node;\n nextOffset = offset + 1;\n } else {\n child = node.childNodes[offset];\n // Go into the children next, if children there are\n if (session.getNodeWrapper(child).containsPositions()) {\n nextNode = child;\n nextOffset = 0;\n } else {\n nextNode = node;\n nextOffset = offset + 1;\n }\n }\n }\n\n return nextNode ? session.getPosition(nextNode, nextOffset) : null;\n }),\n\n previous: createCachingGetter(\"previous\", function(pos) {\n var nodeWrapper = pos.nodeWrapper, node = pos.node, offset = pos.offset, session = nodeWrapper.session;\n var previousNode, previousOffset, child;\n if (offset == 0) {\n previousNode = node.parentNode;\n previousOffset = previousNode ? nodeWrapper.getNodeIndex() : 0;\n } else {\n if (nodeWrapper.isCharacterDataNode()) {\n previousNode = node;\n previousOffset = offset - 1;\n } else {\n child = node.childNodes[offset - 1];\n // Go into the children next, if children there are\n if (session.getNodeWrapper(child).containsPositions()) {\n previousNode = child;\n previousOffset = dom.getNodeLength(child);\n } else {\n previousNode = node;\n previousOffset = offset - 1;\n }\n }\n }\n return previousNode ? session.getPosition(previousNode, previousOffset) : null;\n }),\n\n /*\n Next and previous position moving functions that filter out\n\n - Hidden (CSS visibility/display) elements\n - Script and style elements\n */\n nextVisible: createCachingGetter(\"nextVisible\", function(pos) {\n var next = pos.next();\n if (!next) {\n return null;\n }\n var nodeWrapper = next.nodeWrapper, node = next.node;\n var newPos = next;\n if (nodeWrapper.isCollapsed()) {\n // We're skipping this node and all its descendants\n newPos = nodeWrapper.session.getPosition(node.parentNode, nodeWrapper.getNodeIndex() + 1);\n }\n return newPos;\n }),\n\n nextUncollapsed: createCachingGetter(\"nextUncollapsed\", function(pos) {\n var nextPos = pos;\n while ( (nextPos = nextPos.nextVisible()) ) {\n nextPos.resolveLeadingAndTrailingSpaces();\n if (nextPos.character !== \"\") {\n return nextPos;\n }\n }\n return null;\n }),\n\n previousVisible: createCachingGetter(\"previousVisible\", function(pos) {\n var previous = pos.previous();\n if (!previous) {\n return null;\n }\n var nodeWrapper = previous.nodeWrapper, node = previous.node;\n var newPos = previous;\n if (nodeWrapper.isCollapsed()) {\n // We're skipping this node and all its descendants\n newPos = nodeWrapper.session.getPosition(node.parentNode, nodeWrapper.getNodeIndex());\n }\n return newPos;\n })\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var currentSession = null;\n\n var Session = (function() {\n function createWrapperCache(nodeProperty) {\n var cache = new Cache();\n\n return {\n get: function(node) {\n var wrappersByProperty = cache.get(node[nodeProperty]);\n if (wrappersByProperty) {\n for (var i = 0, wrapper; wrapper = wrappersByProperty[i++]; ) {\n if (wrapper.node === node) {\n return wrapper;\n }\n }\n }\n return null;\n },\n\n set: function(nodeWrapper) {\n var property = nodeWrapper.node[nodeProperty];\n var wrappersByProperty = cache.get(property) || cache.set(property, []);\n wrappersByProperty.push(nodeWrapper);\n }\n };\n }\n\n var uniqueIDSupported = util.isHostProperty(document.documentElement, \"uniqueID\");\n\n function Session() {\n this.initCaches();\n }\n\n Session.prototype = {\n initCaches: function() {\n this.elementCache = uniqueIDSupported ? (function() {\n var elementsCache = new Cache();\n\n return {\n get: function(el) {\n return elementsCache.get(el.uniqueID);\n },\n\n set: function(elWrapper) {\n elementsCache.set(elWrapper.node.uniqueID, elWrapper);\n }\n };\n })() : createWrapperCache(\"tagName\");\n\n // Store text nodes keyed by data, although we may need to truncate this\n this.textNodeCache = createWrapperCache(\"data\");\n this.otherNodeCache = createWrapperCache(\"nodeName\");\n },\n\n getNodeWrapper: function(node) {\n var wrapperCache;\n switch (node.nodeType) {\n case 1:\n wrapperCache = this.elementCache;\n break;\n case 3:\n wrapperCache = this.textNodeCache;\n break;\n default:\n wrapperCache = this.otherNodeCache;\n break;\n }\n\n var wrapper = wrapperCache.get(node);\n if (!wrapper) {\n wrapper = new NodeWrapper(node, this);\n wrapperCache.set(wrapper);\n }\n return wrapper;\n },\n\n getPosition: function(node, offset) {\n return this.getNodeWrapper(node).getPosition(offset);\n },\n\n getRangeBoundaryPosition: function(range, isStart) {\n var prefix = isStart ? \"start\" : \"end\";\n return this.getPosition(range[prefix + \"Container\"], range[prefix + \"Offset\"]);\n },\n\n detach: function() {\n this.elementCache = this.textNodeCache = this.otherNodeCache = null;\n }\n };\n\n return Session;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function startSession() {\n endSession();\n return (currentSession = new Session());\n }\n\n function getSession() {\n return currentSession || startSession();\n }\n\n function endSession() {\n if (currentSession) {\n currentSession.detach();\n }\n currentSession = null;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the rangy.dom utility object\n\n extend(dom, {\n nextNode: nextNode,\n previousNode: previousNode\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function createCharacterIterator(startPos, backward, endPos, characterOptions) {\n\n // Adjust the end position to ensure that it is actually reached\n if (endPos) {\n if (backward) {\n if (isCollapsedNode(endPos.node)) {\n endPos = startPos.previousVisible();\n }\n } else {\n if (isCollapsedNode(endPos.node)) {\n endPos = endPos.nextVisible();\n }\n }\n }\n\n var pos = startPos, finished = false;\n\n function next() {\n var charPos = null;\n if (backward) {\n charPos = pos;\n if (!finished) {\n pos = pos.previousVisible();\n finished = !pos || (endPos && pos.equals(endPos));\n }\n } else {\n if (!finished) {\n charPos = pos = pos.nextVisible();\n finished = !pos || (endPos && pos.equals(endPos));\n }\n }\n if (finished) {\n pos = null;\n }\n return charPos;\n }\n\n var previousTextPos, returnPreviousTextPos = false;\n\n return {\n next: function() {\n if (returnPreviousTextPos) {\n returnPreviousTextPos = false;\n return previousTextPos;\n } else {\n var pos, character;\n while ( (pos = next()) ) {\n character = pos.getCharacter(characterOptions);\n if (character) {\n previousTextPos = pos;\n return pos;\n }\n }\n return null;\n }\n },\n\n rewind: function() {\n if (previousTextPos) {\n returnPreviousTextPos = true;\n } else {\n throw module.createError(\"createCharacterIterator: cannot rewind. Only one position can be rewound.\");\n }\n },\n\n dispose: function() {\n startPos = endPos = null;\n }\n };\n }\n\n var arrayIndexOf = Array.prototype.indexOf ?\n function(arr, val) {\n return arr.indexOf(val);\n } :\n function(arr, val) {\n for (var i = 0, len = arr.length; i < len; ++i) {\n if (arr[i] === val) {\n return i;\n }\n }\n return -1;\n };\n\n // Provides a pair of iterators over text positions, tokenized. Transparently requests more text when next()\n // is called and there is no more tokenized text\n function createTokenizedTextProvider(pos, characterOptions, wordOptions) {\n var forwardIterator = createCharacterIterator(pos, false, null, characterOptions);\n var backwardIterator = createCharacterIterator(pos, true, null, characterOptions);\n var tokenizer = wordOptions.tokenizer;\n\n // Consumes a word and the whitespace beyond it\n function consumeWord(forward) {\n var pos, textChar;\n var newChars = [], it = forward ? forwardIterator : backwardIterator;\n\n var passedWordBoundary = false, insideWord = false;\n\n while ( (pos = it.next()) ) {\n textChar = pos.character;\n\n\n if (allWhiteSpaceRegex.test(textChar)) {\n if (insideWord) {\n insideWord = false;\n passedWordBoundary = true;\n }\n } else {\n if (passedWordBoundary) {\n it.rewind();\n break;\n } else {\n insideWord = true;\n }\n }\n newChars.push(pos);\n }\n\n\n return newChars;\n }\n\n // Get initial word surrounding initial position and tokenize it\n var forwardChars = consumeWord(true);\n var backwardChars = consumeWord(false).reverse();\n var tokens = tokenize(backwardChars.concat(forwardChars), wordOptions, tokenizer);\n\n // Create initial token buffers\n var forwardTokensBuffer = forwardChars.length ?\n tokens.slice(arrayIndexOf(tokens, forwardChars[0].token)) : [];\n\n var backwardTokensBuffer = backwardChars.length ?\n tokens.slice(0, arrayIndexOf(tokens, backwardChars.pop().token) + 1) : [];\n\n function inspectBuffer(buffer) {\n var textPositions = [\"[\" + buffer.length + \"]\"];\n for (var i = 0; i < buffer.length; ++i) {\n textPositions.push(\"(word: \" + buffer[i] + \", is word: \" + buffer[i].isWord + \")\");\n }\n return textPositions;\n }\n\n\n return {\n nextEndToken: function() {\n var lastToken, forwardChars;\n\n // If we're down to the last token, consume character chunks until we have a word or run out of\n // characters to consume\n while ( forwardTokensBuffer.length == 1 &&\n !(lastToken = forwardTokensBuffer[0]).isWord &&\n (forwardChars = consumeWord(true)).length > 0) {\n\n // Merge trailing non-word into next word and tokenize\n forwardTokensBuffer = tokenize(lastToken.chars.concat(forwardChars), wordOptions, tokenizer);\n }\n\n return forwardTokensBuffer.shift();\n },\n\n previousStartToken: function() {\n var lastToken, backwardChars;\n\n // If we're down to the last token, consume character chunks until we have a word or run out of\n // characters to consume\n while ( backwardTokensBuffer.length == 1 &&\n !(lastToken = backwardTokensBuffer[0]).isWord &&\n (backwardChars = consumeWord(false)).length > 0) {\n\n // Merge leading non-word into next word and tokenize\n backwardTokensBuffer = tokenize(backwardChars.reverse().concat(lastToken.chars), wordOptions, tokenizer);\n }\n\n return backwardTokensBuffer.pop();\n },\n\n dispose: function() {\n forwardIterator.dispose();\n backwardIterator.dispose();\n forwardTokensBuffer = backwardTokensBuffer = null;\n }\n };\n }\n\n function movePositionBy(pos, unit, count, characterOptions, wordOptions) {\n var unitsMoved = 0, currentPos, newPos = pos, charIterator, nextPos, absCount = Math.abs(count), token;\n if (count !== 0) {\n var backward = (count < 0);\n\n switch (unit) {\n case CHARACTER:\n charIterator = createCharacterIterator(pos, backward, null, characterOptions);\n while ( (currentPos = charIterator.next()) && unitsMoved < absCount ) {\n ++unitsMoved;\n newPos = currentPos;\n }\n nextPos = currentPos;\n charIterator.dispose();\n break;\n case WORD:\n var tokenizedTextProvider = createTokenizedTextProvider(pos, characterOptions, wordOptions);\n var next = backward ? tokenizedTextProvider.previousStartToken : tokenizedTextProvider.nextEndToken;\n\n while ( (token = next()) && unitsMoved < absCount ) {\n if (token.isWord) {\n ++unitsMoved;\n newPos = backward ? token.chars[0] : token.chars[token.chars.length - 1];\n }\n }\n break;\n default:\n throw new Error(\"movePositionBy: unit '\" + unit + \"' not implemented\");\n }\n\n // Perform any necessary position tweaks\n if (backward) {\n newPos = newPos.previousVisible();\n unitsMoved = -unitsMoved;\n } else if (newPos && newPos.isLeadingSpace && !newPos.isTrailingSpace) {\n // Tweak the position for the case of a leading space. The problem is that an uncollapsed leading space\n // before a block element (for example, the line break between \"1\" and \"2\" in the following HTML:\n // \"1<p>2</p>\") is considered to be attached to the position immediately before the block element, which\n // corresponds with a different selection position in most browsers from the one we want (i.e. at the\n // start of the contents of the block element). We get round this by advancing the position returned to\n // the last possible equivalent visible position.\n if (unit == WORD) {\n charIterator = createCharacterIterator(pos, false, null, characterOptions);\n nextPos = charIterator.next();\n charIterator.dispose();\n }\n if (nextPos) {\n newPos = nextPos.previousVisible();\n }\n }\n }\n\n\n return {\n position: newPos,\n unitsMoved: unitsMoved\n };\n }\n\n function createRangeCharacterIterator(session, range, characterOptions, backward) {\n var rangeStart = session.getRangeBoundaryPosition(range, true);\n var rangeEnd = session.getRangeBoundaryPosition(range, false);\n var itStart = backward ? rangeEnd : rangeStart;\n var itEnd = backward ? rangeStart : rangeEnd;\n\n return createCharacterIterator(itStart, !!backward, itEnd, characterOptions);\n }\n\n function getRangeCharacters(session, range, characterOptions) {\n\n var chars = [], it = createRangeCharacterIterator(session, range, characterOptions), pos;\n while ( (pos = it.next()) ) {\n chars.push(pos);\n }\n\n it.dispose();\n return chars;\n }\n\n function isWholeWord(startPos, endPos, wordOptions) {\n var range = api.createRange(startPos.node);\n range.setStartAndEnd(startPos.node, startPos.offset, endPos.node, endPos.offset);\n return !range.expand(\"word\", { wordOptions: wordOptions });\n }\n\n function findTextFromPosition(initialPos, searchTerm, isRegex, searchScopeRange, findOptions) {\n var backward = isDirectionBackward(findOptions.direction);\n var it = createCharacterIterator(\n initialPos,\n backward,\n initialPos.session.getRangeBoundaryPosition(searchScopeRange, backward),\n findOptions.characterOptions\n );\n var text = \"\", chars = [], pos, currentChar, matchStartIndex, matchEndIndex;\n var result, insideRegexMatch;\n var returnValue = null;\n\n function handleMatch(startIndex, endIndex) {\n var startPos = chars[startIndex].previousVisible();\n var endPos = chars[endIndex - 1];\n var valid = (!findOptions.wholeWordsOnly || isWholeWord(startPos, endPos, findOptions.wordOptions));\n\n return {\n startPos: startPos,\n endPos: endPos,\n valid: valid\n };\n }\n\n while ( (pos = it.next()) ) {\n currentChar = pos.character;\n if (!isRegex && !findOptions.caseSensitive) {\n currentChar = currentChar.toLowerCase();\n }\n\n if (backward) {\n chars.unshift(pos);\n text = currentChar + text;\n } else {\n chars.push(pos);\n text += currentChar;\n }\n\n if (isRegex) {\n result = searchTerm.exec(text);\n if (result) {\n matchStartIndex = result.index;\n matchEndIndex = matchStartIndex + result[0].length;\n if (insideRegexMatch) {\n // Check whether the match is now over\n if ((!backward && matchEndIndex < text.length) || (backward && matchStartIndex > 0)) {\n returnValue = handleMatch(matchStartIndex, matchEndIndex);\n break;\n }\n } else {\n insideRegexMatch = true;\n }\n }\n } else if ( (matchStartIndex = text.indexOf(searchTerm)) != -1 ) {\n returnValue = handleMatch(matchStartIndex, matchStartIndex + searchTerm.length);\n break;\n }\n }\n\n // Check whether regex match extends to the end of the range\n if (insideRegexMatch) {\n returnValue = handleMatch(matchStartIndex, matchEndIndex);\n }\n it.dispose();\n\n return returnValue;\n }\n\n function createEntryPointFunction(func) {\n return function() {\n var sessionRunning = !!currentSession;\n var session = getSession();\n var args = [session].concat( util.toArray(arguments) );\n var returnValue = func.apply(this, args);\n if (!sessionRunning) {\n endSession();\n }\n return returnValue;\n };\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the Rangy Range object\n\n function createRangeBoundaryMover(isStart, collapse) {\n /*\n Unit can be \"character\" or \"word\"\n Options:\n\n - includeTrailingSpace\n - wordRegex\n - tokenizer\n - collapseSpaceBeforeLineBreak\n */\n return createEntryPointFunction(\n function(session, unit, count, moveOptions) {\n if (typeof count == UNDEF) {\n count = unit;\n unit = CHARACTER;\n }\n moveOptions = createNestedOptions(moveOptions, defaultMoveOptions);\n\n var boundaryIsStart = isStart;\n if (collapse) {\n boundaryIsStart = (count >= 0);\n this.collapse(!boundaryIsStart);\n }\n var moveResult = movePositionBy(session.getRangeBoundaryPosition(this, boundaryIsStart), unit, count, moveOptions.characterOptions, moveOptions.wordOptions);\n var newPos = moveResult.position;\n this[boundaryIsStart ? \"setStart\" : \"setEnd\"](newPos.node, newPos.offset);\n return moveResult.unitsMoved;\n }\n );\n }\n\n function createRangeTrimmer(isStart) {\n return createEntryPointFunction(\n function(session, characterOptions) {\n characterOptions = createOptions(characterOptions, defaultCharacterOptions);\n var pos;\n var it = createRangeCharacterIterator(session, this, characterOptions, !isStart);\n var trimCharCount = 0;\n while ( (pos = it.next()) && allWhiteSpaceRegex.test(pos.character) ) {\n ++trimCharCount;\n }\n it.dispose();\n var trimmed = (trimCharCount > 0);\n if (trimmed) {\n this[isStart ? \"moveStart\" : \"moveEnd\"](\n \"character\",\n isStart ? trimCharCount : -trimCharCount,\n { characterOptions: characterOptions }\n );\n }\n return trimmed;\n }\n );\n }\n\n extend(api.rangePrototype, {\n moveStart: createRangeBoundaryMover(true, false),\n\n moveEnd: createRangeBoundaryMover(false, false),\n\n move: createRangeBoundaryMover(true, true),\n\n trimStart: createRangeTrimmer(true),\n\n trimEnd: createRangeTrimmer(false),\n\n trim: createEntryPointFunction(\n function(session, characterOptions) {\n var startTrimmed = this.trimStart(characterOptions), endTrimmed = this.trimEnd(characterOptions);\n return startTrimmed || endTrimmed;\n }\n ),\n\n expand: createEntryPointFunction(\n function(session, unit, expandOptions) {\n var moved = false;\n expandOptions = createNestedOptions(expandOptions, defaultExpandOptions);\n var characterOptions = expandOptions.characterOptions;\n if (!unit) {\n unit = CHARACTER;\n }\n if (unit == WORD) {\n var wordOptions = expandOptions.wordOptions;\n var startPos = session.getRangeBoundaryPosition(this, true);\n var endPos = session.getRangeBoundaryPosition(this, false);\n\n var startTokenizedTextProvider = createTokenizedTextProvider(startPos, characterOptions, wordOptions);\n var startToken = startTokenizedTextProvider.nextEndToken();\n var newStartPos = startToken.chars[0].previousVisible();\n var endToken, newEndPos;\n\n if (this.collapsed) {\n endToken = startToken;\n } else {\n var endTokenizedTextProvider = createTokenizedTextProvider(endPos, characterOptions, wordOptions);\n endToken = endTokenizedTextProvider.previousStartToken();\n }\n newEndPos = endToken.chars[endToken.chars.length - 1];\n\n if (!newStartPos.equals(startPos)) {\n this.setStart(newStartPos.node, newStartPos.offset);\n moved = true;\n }\n if (newEndPos && !newEndPos.equals(endPos)) {\n this.setEnd(newEndPos.node, newEndPos.offset);\n moved = true;\n }\n\n if (expandOptions.trim) {\n if (expandOptions.trimStart) {\n moved = this.trimStart(characterOptions) || moved;\n }\n if (expandOptions.trimEnd) {\n moved = this.trimEnd(characterOptions) || moved;\n }\n }\n\n return moved;\n } else {\n return this.moveEnd(CHARACTER, 1, expandOptions);\n }\n }\n ),\n\n text: createEntryPointFunction(\n function(session, characterOptions) {\n return this.collapsed ?\n \"\" : getRangeCharacters(session, this, createOptions(characterOptions, defaultCharacterOptions)).join(\"\");\n }\n ),\n\n selectCharacters: createEntryPointFunction(\n function(session, containerNode, startIndex, endIndex, characterOptions) {\n var moveOptions = { characterOptions: characterOptions };\n if (!containerNode) {\n containerNode = getBody( this.getDocument() );\n }\n this.selectNodeContents(containerNode);\n this.collapse(true);\n this.moveStart(\"character\", startIndex, moveOptions);\n this.collapse(true);\n this.moveEnd(\"character\", endIndex - startIndex, moveOptions);\n }\n ),\n\n // Character indexes are relative to the start of node\n toCharacterRange: createEntryPointFunction(\n function(session, containerNode, characterOptions) {\n if (!containerNode) {\n containerNode = getBody( this.getDocument() );\n }\n var parent = containerNode.parentNode, nodeIndex = dom.getNodeIndex(containerNode);\n var rangeStartsBeforeNode = (dom.comparePoints(this.startContainer, this.endContainer, parent, nodeIndex) == -1);\n var rangeBetween = this.cloneRange();\n var startIndex, endIndex;\n if (rangeStartsBeforeNode) {\n rangeBetween.setStartAndEnd(this.startContainer, this.startOffset, parent, nodeIndex);\n startIndex = -rangeBetween.text(characterOptions).length;\n } else {\n rangeBetween.setStartAndEnd(parent, nodeIndex, this.startContainer, this.startOffset);\n startIndex = rangeBetween.text(characterOptions).length;\n }\n endIndex = startIndex + this.text(characterOptions).length;\n\n return {\n start: startIndex,\n end: endIndex\n };\n }\n ),\n\n findText: createEntryPointFunction(\n function(session, searchTermParam, findOptions) {\n // Set up options\n findOptions = createNestedOptions(findOptions, defaultFindOptions);\n\n // Create word options if we're matching whole words only\n if (findOptions.wholeWordsOnly) {\n // We don't ever want trailing spaces for search results\n findOptions.wordOptions.includeTrailingSpace = false;\n }\n\n var backward = isDirectionBackward(findOptions.direction);\n\n // Create a range representing the search scope if none was provided\n var searchScopeRange = findOptions.withinRange;\n if (!searchScopeRange) {\n searchScopeRange = api.createRange();\n searchScopeRange.selectNodeContents(this.getDocument());\n }\n\n // Examine and prepare the search term\n var searchTerm = searchTermParam, isRegex = false;\n if (typeof searchTerm == \"string\") {\n if (!findOptions.caseSensitive) {\n searchTerm = searchTerm.toLowerCase();\n }\n } else {\n isRegex = true;\n }\n\n var initialPos = session.getRangeBoundaryPosition(this, !backward);\n\n // Adjust initial position if it lies outside the search scope\n var comparison = searchScopeRange.comparePoint(initialPos.node, initialPos.offset);\n\n if (comparison === -1) {\n initialPos = session.getRangeBoundaryPosition(searchScopeRange, true);\n } else if (comparison === 1) {\n initialPos = session.getRangeBoundaryPosition(searchScopeRange, false);\n }\n\n var pos = initialPos;\n var wrappedAround = false;\n\n // Try to find a match and ignore invalid ones\n var findResult;\n while (true) {\n findResult = findTextFromPosition(pos, searchTerm, isRegex, searchScopeRange, findOptions);\n\n if (findResult) {\n if (findResult.valid) {\n this.setStartAndEnd(findResult.startPos.node, findResult.startPos.offset, findResult.endPos.node, findResult.endPos.offset);\n return true;\n } else {\n // We've found a match that is not a whole word, so we carry on searching from the point immediately\n // after the match\n pos = backward ? findResult.startPos : findResult.endPos;\n }\n } else if (findOptions.wrap && !wrappedAround) {\n // No result found but we're wrapping around and limiting the scope to the unsearched part of the range\n searchScopeRange = searchScopeRange.cloneRange();\n pos = session.getRangeBoundaryPosition(searchScopeRange, !backward);\n searchScopeRange.setBoundary(initialPos.node, initialPos.offset, backward);\n wrappedAround = true;\n } else {\n // Nothing found and we can't wrap around, so we're done\n return false;\n }\n }\n }\n ),\n\n pasteHtml: function(html) {\n this.deleteContents();\n if (html) {\n var frag = this.createContextualFragment(html);\n var lastChild = frag.lastChild;\n this.insertNode(frag);\n this.collapseAfter(lastChild);\n }\n }\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the Rangy Selection object\n\n function createSelectionTrimmer(methodName) {\n return createEntryPointFunction(\n function(session, characterOptions) {\n var trimmed = false;\n this.changeEachRange(function(range) {\n trimmed = range[methodName](characterOptions) || trimmed;\n });\n return trimmed;\n }\n );\n }\n\n extend(api.selectionPrototype, {\n expand: createEntryPointFunction(\n function(session, unit, expandOptions) {\n this.changeEachRange(function(range) {\n range.expand(unit, expandOptions);\n });\n }\n ),\n\n move: createEntryPointFunction(\n function(session, unit, count, options) {\n var unitsMoved = 0;\n if (this.focusNode) {\n this.collapse(this.focusNode, this.focusOffset);\n var range = this.getRangeAt(0);\n if (!options) {\n options = {};\n }\n options.characterOptions = createOptions(options.characterOptions, defaultCaretCharacterOptions);\n unitsMoved = range.move(unit, count, options);\n this.setSingleRange(range);\n }\n return unitsMoved;\n }\n ),\n\n trimStart: createSelectionTrimmer(\"trimStart\"),\n trimEnd: createSelectionTrimmer(\"trimEnd\"),\n trim: createSelectionTrimmer(\"trim\"),\n\n selectCharacters: createEntryPointFunction(\n function(session, containerNode, startIndex, endIndex, direction, characterOptions) {\n var range = api.createRange(containerNode);\n range.selectCharacters(containerNode, startIndex, endIndex, characterOptions);\n this.setSingleRange(range, direction);\n }\n ),\n\n saveCharacterRanges: createEntryPointFunction(\n function(session, containerNode, characterOptions) {\n var ranges = this.getAllRanges(), rangeCount = ranges.length;\n var rangeInfos = [];\n\n var backward = rangeCount == 1 && this.isBackward();\n\n for (var i = 0, len = ranges.length; i < len; ++i) {\n rangeInfos[i] = {\n characterRange: ranges[i].toCharacterRange(containerNode, characterOptions),\n backward: backward,\n characterOptions: characterOptions\n };\n }\n\n return rangeInfos;\n }\n ),\n\n restoreCharacterRanges: createEntryPointFunction(\n function(session, containerNode, saved) {\n this.removeAllRanges();\n for (var i = 0, len = saved.length, range, rangeInfo, characterRange; i < len; ++i) {\n rangeInfo = saved[i];\n characterRange = rangeInfo.characterRange;\n range = api.createRange(containerNode);\n range.selectCharacters(containerNode, characterRange.start, characterRange.end, rangeInfo.characterOptions);\n this.addRange(range, rangeInfo.backward);\n }\n }\n ),\n\n text: createEntryPointFunction(\n function(session, characterOptions) {\n var rangeTexts = [];\n for (var i = 0, len = this.rangeCount; i < len; ++i) {\n rangeTexts[i] = this.getRangeAt(i).text(characterOptions);\n }\n return rangeTexts.join(\"\");\n }\n )\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Extensions to the core rangy object\n\n api.innerText = function(el, characterOptions) {\n var range = api.createRange(el);\n range.selectNodeContents(el);\n var text = range.text(characterOptions);\n return text;\n };\n\n api.createWordIterator = function(startNode, startOffset, iteratorOptions) {\n var session = getSession();\n iteratorOptions = createNestedOptions(iteratorOptions, defaultWordIteratorOptions);\n var startPos = session.getPosition(startNode, startOffset);\n var tokenizedTextProvider = createTokenizedTextProvider(startPos, iteratorOptions.characterOptions, iteratorOptions.wordOptions);\n var backward = isDirectionBackward(iteratorOptions.direction);\n\n return {\n next: function() {\n return backward ? tokenizedTextProvider.previousStartToken() : tokenizedTextProvider.nextEndToken();\n },\n\n dispose: function() {\n tokenizedTextProvider.dispose();\n this.next = function() {};\n }\n };\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n api.noMutation = function(func) {\n var session = getSession();\n func(session);\n endSession();\n };\n\n api.noMutation.createEntryPointFunction = createEntryPointFunction;\n\n api.textRange = {\n isBlockNode: isBlockNode,\n isCollapsedWhitespaceNode: isCollapsedWhitespaceNode,\n\n createPosition: createEntryPointFunction(\n function(session, node, offset) {\n return session.getPosition(node, offset);\n }\n )\n };\n });\n \n return rangy;\n}, this);","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","/**\n * Defines all supported event types by Editable.JS and provides default\n * implementations for them defined in {{#crossLink \"Behavior\"}}{{/crossLink}}\n *\n * @type {Object}\n */\nexport default {\n log: false,\n logErrors: true,\n editableClass: 'js-editable',\n editableDisabledClass: 'js-editable-disabled',\n pastingAttribute: 'data-editable-is-pasting',\n trimLeadingAndTrailingWhitespaces: true,\n boldMarkup: {\n type: 'tag',\n name: 'strong',\n attribs: {},\n trim: true\n },\n italicMarkup: {\n type: 'tag',\n name: 'em',\n attribs: {},\n trim: true\n },\n underlineMarkup: {\n type: 'tag',\n name: 'u',\n attribs: {},\n trim: false\n },\n linkMarkup: {\n type: 'tag',\n name: 'a',\n attribs: {},\n trim: true\n },\n\n // Rules that are applied when filtering pasted content\n pastedHtmlRules: {\n // Elements and their attributes to keep in pasted text\n // Note that elements not explicitly allowed here will not be removed, their\n // tags will get stripped but their content will be kept. Use `blacklistedElements`\n // to get rid of a whole element (tag+content)\n allowedElements: {\n 'a': {\n 'href': true,\n 'rel': true,\n 'target': true\n },\n 'strong': {},\n 'em': {},\n 'br': {}\n },\n allowedPlainTextElements: {\n 'br': {}\n },\n\n // Elements that have required attributes.\n // If these are not present the elements are filtered out.\n // Required attributes have to be present in the 'allowed' object\n // as well if they should not be filtered out.\n requiredAttributes: {\n 'a': ['href']\n },\n\n // Elements that should be transformed into other elements\n transformElements: {\n 'b': 'strong',\n 'i': 'em'\n },\n\n // A list of elements which should be split into paragraphs.\n splitIntoBlocks: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'blockquote'],\n\n // A list of HTML block level elements.\n blockLevelElements: [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p', 'pre', 'hr', 'blockquote',\n 'article', 'figure', 'header', 'footer', 'ul', 'ol', 'li', 'section', 'table', 'video'\n ],\n\n // A list of elements that will get completely removed when pasted. Their tags\n // and content (text content and child elements) will get removed.\n blacklistedElements: ['style', 'script'],\n\n keepInternalRelativeLinks: false,\n\n // Replace quotes in a pasted content with quotes from config.\n replaceQuotes: {\n // quotes: ['“', '”'],\n // singleQuotes: ['‘', '’'],\n // apostrophe: '’'\n }\n }\n}\n","import config from '../config'\n\n// Allows for safe error logging\n// Falls back to console.log if console.error is not available\nexport default function error () {\n if (config.logErrors === false) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (!global.console) return\n\n if (typeof console.error === 'function') return console.error(args)\n\n console.log(args)\n}\n","const toString = Object.prototype.toString\nconst htmlCharacters = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n}\n\n// TODO: replace with lodash methods\nexport function trimRight (text) {\n return text.replace(/\\s+$/, '')\n}\n\nexport function trimLeft (text) {\n return text.replace(/^\\s+/, '')\n}\n\nexport function trim (text) {\n return text.replace(/^\\s+|\\s+$/g, '')\n}\n\nexport function isString (obj) {\n return toString.call(obj) === '[object String]'\n}\n\n/**\n * Turn any string into a regular expression.\n * This can be used to search or replace a string conveniently.\n */\n\nexport function regexp (str, flags) {\n if (!flags) flags = 'g'\n const escapedStr = str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n return new RegExp(escapedStr, flags)\n}\n\n/**\n * Escape HTML characters <, > and &\n * Usage: escapeHtml('<div>')\n *\n * @param { String }\n * @param { Boolean } Optional. If true \" and ' will also be escaped.\n * @return { String } Escaped Html you can assign to innerHTML of an element.\n */\n\n// TODO: replace with npm.im/he\n\nexport function escapeHtml (s, forAttribute) {\n return s.replace(forAttribute ? /[&<>'\"]/g : /[&<>]/g, function (c) { // \"'\n return htmlCharacters[c]\n })\n}\n\n/**\n * Escape a string the browser way.\n */\n\nexport function browserEscapeHtml (str) {\n const div = document.createElement('div')\n div.appendChild(document.createTextNode(str))\n return div.innerHTML\n}\n\nexport function replaceLast (text, searchValue, replaceValue) {\n if (!text) return ''\n text = `${text}`\n if (!searchValue || replaceValue == null) return text\n const lastOccurrenceIndex = text.lastIndexOf(searchValue)\n if (lastOccurrenceIndex === -1) return text\n return `${\n text.slice(0, lastOccurrenceIndex)\n }${\n replaceValue\n }${\n text.slice(lastOccurrenceIndex + searchValue.length)\n }`\n}\n\nexport function endsWithSingleSpace (text) {\n return /\\S+\\s{1}$/.test(text)\n}\n","// DOM node types\n// https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType\n\nexport const elementNode = 1\nexport const attributeNode = 2\nexport const textNode = 3\nexport const cdataSectionNode = 4\nexport const entityReferenceNode = 5\nexport const entityNode = 6\nexport const processingInstructionNode = 7\nexport const commentNode = 8\nexport const documentNode = 9\nexport const documentTypeNode = 10\nexport const documentFragmentNode = 11\nexport const notationNode = 12\n","import {textNode} from './node-type'\n\n// A DOM node iterator.\n//\n// Has the ability to replace nodes on the fly and continue\n// the iteration.\nexport default class NodeIterator {\n\n constructor (root, method) {\n this.current = this.previous = this.nextNode = this.root = root\n this.iteratorFunc = this[method || 'getNext']\n }\n\n [Symbol.iterator] () {\n return this\n }\n\n getNextTextNode () {\n let next\n while ((next = this.getNext())) {\n if (next.nodeType === textNode && next.data !== '') return next\n }\n }\n\n getPreviousTextNode () {\n let prev\n while ((prev = this.getPrevious())) {\n if (prev.nodeType === textNode && prev.data !== '') return prev\n }\n }\n\n next () {\n const value = this.iteratorFunc()\n return value ? {value} : {done: true}\n }\n\n getNext () {\n let n = this.current = this.nextNode\n let child = this.nextNode = undefined\n if (this.current) {\n child = n.firstChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.nextNode = child\n } else {\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n getPrevious () {\n let n = this.current = this.previous\n let child = this.previous = undefined\n if (this.current) {\n child = n.lastChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.previous = child\n } else {\n while ((n !== this.root) && !(this.previous = n.previousSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n replaceCurrent (replacement) {\n this.current = replacement\n this.nextNode = undefined\n this.previous = undefined\n let n = this.current\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n}\n","import NodeIterator from '../node-iterator'\nimport {textNode} from '../node-type'\n\n/**\n * @param {HTMLElement | Array | String} target\n * @param {Document} document\n */\nexport const domArray = (target, document) => {\n if (typeof target === 'string') return Array.from(document.querySelectorAll(target))\n if (target.tagName) return [target]\n if (Array.isArray(target)) return target\n // Support NodeList and jQuery arrays\n return Array.from(target)\n}\n\n/**\n * @param { HTMLElement | String } target\n * @param { Document } document\n * @returns { HTMLElement }\n */\nexport const domSelector = (target, document) => {\n if (typeof target === 'string') return document.querySelector(target)\n if (target.tagName) return target\n // Support NodeList and jQuery arrays\n if (target[0]) return target[0]\n return target\n}\n\nexport const createElement = (html, win = window) => {\n const el = win.document.createElement('div')\n el.innerHTML = html\n return el.firstElementChild\n}\n\n/**\n* Get the closest dom element matching a selector\n* @description\n* - If a textNode is passed, it will still find the correct element\n* - If a document is passed, it will return undefined\n* @param {Node} elem\n* @param {String} selector\n* @returns {HTMLElement|undefined}\n*/\nexport const closest = (elem, selector) => {\n if (!elem.closest) elem = elem.parentNode\n if (elem && elem.closest) return elem.closest(selector)\n}\n\nexport function findStartExcludingWhitespace ({root, startContainer, startOffset, whitespacesOnTheLeft}) {\n const isTextNode = startContainer.nodeType === textNode\n if (!isTextNode) {\n return findStartExcludingWhitespace({\n root,\n startContainer: startContainer.childNodes[startOffset],\n startOffset: 0,\n whitespacesOnTheLeft\n })\n }\n\n const offsetAfterWhitespace = startOffset + whitespacesOnTheLeft\n if (startContainer.length > offsetAfterWhitespace) {\n return [startContainer, offsetAfterWhitespace]\n }\n\n // Pass the root so that the iterator can traverse to siblings\n const iterator = new NodeIterator(root)\n // Set the position to the node which is selected\n iterator.nextNode = startContainer\n // Iterate once to avoid returning self\n iterator.getNextTextNode()\n\n const container = iterator.getNextTextNode()\n if (!container) {\n // No more text nodes - use the end of the last text node\n const previousTextNode = iterator.getPreviousTextNode()\n return [previousTextNode, previousTextNode.length]\n }\n\n return findStartExcludingWhitespace({\n root,\n startContainer: container,\n startOffset: 0,\n whitespacesOnTheLeft: offsetAfterWhitespace - startContainer.length\n })\n}\n\nexport function findEndExcludingWhitespace ({root, endContainer, endOffset, whitespacesOnTheRight}) {\n const isTextNode = endContainer.nodeType === textNode\n if (!isTextNode) {\n const isFirstNode = !endContainer.childNodes[endOffset - 1]\n const container = isFirstNode\n ? endContainer.childNodes[endOffset]\n : endContainer.childNodes[endOffset - 1]\n let offset = 0\n if (!isFirstNode) {\n offset = container.nodeType === textNode\n ? container.length\n : container.childNodes.length\n }\n return findEndExcludingWhitespace({\n root,\n endContainer: container,\n endOffset: offset,\n whitespacesOnTheRight\n })\n }\n\n const offsetBeforeWhitespace = endOffset - whitespacesOnTheRight\n if (offsetBeforeWhitespace > 0) {\n return [endContainer, offsetBeforeWhitespace]\n }\n\n // Pass the root so that the iterator can traverse to siblings\n const iterator = new NodeIterator(root)\n // Set the position to the node which is selected\n iterator.previous = endContainer\n // Iterate once to avoid returning self\n iterator.getPreviousTextNode()\n\n const container = iterator.getPreviousTextNode()\n if (!container) {\n // No more text nodes - use the start of the first text node\n return [iterator.getNextTextNode(), 0]\n }\n\n return findEndExcludingWhitespace({\n root,\n endContainer: container,\n endOffset: container.length,\n whitespacesOnTheRight: whitespacesOnTheRight - endOffset\n })\n}\n","import * as string from './util/string'\nimport * as nodeType from './node-type'\nimport config from './config'\nimport {closest} from './util/dom'\n\n/**\n * The parser module provides helper methods to parse html-chunks\n * manipulations and helpers for common tasks.\n * Provides DOM lookup helpers\n *\n * @module core\n * @submodule parser\n */\n\n/**\n * Get the editableJS host block of a node.\n *\n * @method getHost\n * @param {DOM Node}\n * @return {DOM Node}\n */\nexport function getHost (node) {\n node = (node.jquery ? node[0] : node)\n return closest(node, `.${config.editableClass}`)\n}\n\n/**\n * Get the index of a node so that\n * parent.childNodes[ getNodeIndex(node) ] would return the node again.\n *\n * @method getNodeIndex\n * @param {HTMLElement}\n */\nexport function getNodeIndex (node) {\n let index = 0\n while ((node = node.previousSibling) !== null) index++\n return index\n}\n\n/**\n * Check if node contains text or element nodes\n * whitespace counts too!\n *\n * @method isVoid\n * @param {HTMLElement}\n */\nexport function isVoid (node) {\n for (const child of node.childNodes) {\n if (child.nodeType === nodeType.textNode && !isVoidTextNode(child)) {\n return false\n }\n if (child.nodeType === nodeType.elementNode) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if node is a text node and completely empty without any whitespace\n *\n * @method isVoidTextNode\n * @param {HTMLElement}\n */\nexport function isVoidTextNode (node) {\n return node.nodeType === nodeType.textNode && !node.nodeValue\n}\n\n/**\n * Check if node is a text node and contains nothing but whitespace\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function isWhitespaceOnly (node) {\n return node.nodeType === nodeType.textNode && lastOffsetWithContent(node) === 0\n}\n\nexport function isLinebreak (node) {\n return node.nodeType === nodeType.elementNode && node.tagName === 'BR'\n}\n\n/**\n * Returns the last offset where the cursor can be positioned to\n * be at the visible end of its container.\n * Currently works only for empty text nodes (not empty tags)\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function lastOffsetWithContent (elem) {\n if (elem.nodeType === nodeType.textNode) return string.trimRight(elem.nodeValue).length\n\n let lastOffset = 0\n Array.from(elem.childNodes).reverse().every((node, index, nodes) => {\n if (isWhitespaceOnly(node) || isLinebreak(node)) return true\n\n lastOffset = nodes.length - index\n return false\n })\n return lastOffset\n}\n\nexport function isBeginningOfHost (host, container, offset) {\n if (container === host) return isStartOffset(container, offset)\n\n if (isStartOffset(container, offset)) {\n // The index of the element simulates a range offset\n // right before the element.\n const offsetInParent = getNodeIndex(container)\n return isBeginningOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isEndOfHost (host, container, offset) {\n if (container === host) return isEndOffset(container, offset)\n\n if (isEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isStartOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === 0\n\n if (container.childNodes.length === 0) return true\n\n if (\n container.childNodes.length === 1 &&\n container.firstChild.nodeType === nodeType.elementNode &&\n container.firstChild.getAttribute('data-editable') === 'remove'\n ) return true\n\n return container.childNodes[offset] === container.firstChild\n}\n\nexport function isEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === container.length\n\n if (container.childNodes.length === 0) return true\n\n if (offset > 0) return container.childNodes[offset - 1] === container.lastChild\n\n return false\n}\n\nexport function isTextEndOfHost (host, container, offset) {\n if (container === host) return isTextEndOffset(container, offset)\n\n if (isTextEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isTextEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isTextEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) {\n const text = string.trimRight(container.nodeValue)\n return offset >= text.length\n }\n\n if (container.childNodes.length === 0) return true\n\n return offset >= lastOffsetWithContent(container)\n}\n\nexport function isSameNode (target, source) {\n let i, len, attr\n\n if (target.nodeType !== source.nodeType) return false\n\n if (target.nodeName !== source.nodeName) return false\n\n for (i = 0, len = target.attributes.length; i < len; i++) {\n attr = target.attributes[i]\n if (source.getAttribute(attr.name) !== attr.value) return false\n }\n\n return true\n}\n\n/**\n * Return the deepest last child of a node.\n *\n * @method lastChild\n * @param {HTMLElement} container The container to iterate on.\n * @return {HTMLElement} The deepest last child in the container.\n */\nexport function lastChild (container) {\n return container.lastChild\n ? lastChild(container.lastChild)\n : container\n}\n\n/**\n * Obsolete version of {{#crossLink \"lastChild\"}}{{/crossLink}}.\n */\nexport function latestChild (container) {\n console.warn('Editable.js: Using obsolete function parser.latestCild(), use lastChild() instead')\n return lastChild(container)\n}\n\n/**\n * Checks if a documentFragment has no children.\n * Fragments without children can cause errors if inserted into ranges.\n *\n * @method isDocumentFragmentWithoutChildren\n * @param {HTMLElement} DOM node.\n * @return {Boolean}\n */\nexport function isDocumentFragmentWithoutChildren (fragment) {\n return fragment &&\n fragment.nodeType === nodeType.documentFragmentNode &&\n fragment.childNodes.length === 0\n}\n\n/**\n * Determine if an element behaves like an inline element.\n */\nexport function isInlineElement (window, element) {\n const styles = element.currentStyle || window.getComputedStyle(element, '')\n const display = styles.display\n switch (display) {\n case 'inline':\n case 'inline-block':\n return true\n default:\n return false\n }\n}\n","import rangy from 'rangy'\nimport error from './util/error'\nimport * as nodeType from './node-type'\n\n/**\n * Inspired by the Selection save and restore module for Rangy by Tim Down\n * Saves and restores ranges using invisible marker elements in the DOM.\n */\nlet boundaryMarkerId = 0\n\n// (U+FEFF) zero width no-break space\nconst markerTextChar = '\\ufeff'\n\nfunction isChildOf (parent, possibleChild) {\n for (let i = 0; i < parent.children.length; i++) {\n if (parent.children[i] === possibleChild) return true\n }\n return false\n}\n\nfunction startContainerIsChild (range) {\n const parent = range.commonAncestorContainer\n if (parent.nodeType === 3) return false // if we are on the text node it can't be a parent\n const possibleChild = range.startContainer.parentElement\n return isChildOf(parent, possibleChild)\n}\n\nfunction endContainerIsChild (range) {\n const parent = range.commonAncestorContainer\n if (parent.nodeType === 3) return false // if we are on the text node it can't be a parent\n const possibleChild = range.endContainer.parentElement\n return isChildOf(parent, possibleChild)\n}\n\nexport function insertRangeBoundaryMarker (range, atStart) {\n const container = range.commonAncestorContainer\n const directlyBeforeFormatTag = startContainerIsChild(range) && atStart\n const directlyAfterFormatTag = endContainerIsChild(range) && !atStart\n\n // If ownerDocument is null the commonAncestorContainer is window.document\n if (container.ownerDocument === null || container.ownerDocument === undefined) {\n error('Cannot save range: range is emtpy')\n }\n\n // Create the marker element containing a single\n // invisible character using DOM methods and insert it\n const doc = container.ownerDocument.defaultView.document\n const markerEl = doc.createElement('span')\n markerEl.id = `editable-range-boundary-${++boundaryMarkerId}`\n markerEl.setAttribute('data-editable', 'remove')\n markerEl.style.lineHeight = '0'\n markerEl.style.display = 'none'\n markerEl.appendChild(doc.createTextNode(markerTextChar))\n\n // if another tag is trailing exactly at the start or end, prepend\n // or append the marker element directly on the parent in order to prevent breaking HTML markup.\n if (directlyBeforeFormatTag) {\n range.endContainer.parentElement.insertBefore(markerEl, range.startContainer.parentElement)\n } else if (directlyAfterFormatTag) {\n // emulating insertAfter with nextSibling\n range.startContainer.parentElement.insertBefore(markerEl,\n range.endContainer.parentElement.nextSibling)\n } else {\n // Clone the Range and collapse to the appropriate boundary point\n const boundaryRange = range.cloneRange()\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(markerEl)\n }\n\n return markerEl\n}\n\nexport function setRangeBoundary (host, range, markerId, atStart) {\n const markerEl = getMarker(host, markerId)\n if (!markerEl) return console.log('Marker element has been removed. Cannot restore selection.')\n range[atStart ? 'setStartBefore' : 'setEndBefore'](markerEl)\n markerEl.remove()\n}\n\nexport function save (range) {\n let rangeInfo, startEl, endEl\n\n // insert markers\n if (range.collapsed) {\n endEl = insertRangeBoundaryMarker(range, false)\n rangeInfo = {\n markerId: endEl.id,\n collapsed: true\n }\n } else {\n endEl = insertRangeBoundaryMarker(range, false)\n startEl = insertRangeBoundaryMarker(range, true)\n\n rangeInfo = {\n startMarkerId: startEl.id,\n endMarkerId: endEl.id,\n collapsed: false\n }\n }\n\n // Adjust each range's boundaries to lie between its markers\n if (range.collapsed) {\n range.collapseBefore(endEl)\n } else {\n range.setEndBefore(endEl)\n range.setStartAfter(startEl)\n }\n\n return rangeInfo\n}\n\nexport function restore (host, rangeInfo) {\n if (rangeInfo.restored) return\n\n const range = rangy.createRange()\n if (rangeInfo.collapsed) {\n const markerEl = getMarker(host, rangeInfo.markerId)\n if (markerEl) {\n markerEl.style.display = 'inline'\n const previousNode = markerEl.previousSibling\n\n // Workaround for rangy issue 17\n if (previousNode && previousNode.nodeType === nodeType.textNode) {\n markerEl.remove()\n range.collapseToPoint(previousNode, previousNode.length)\n } else {\n range.collapseBefore(markerEl)\n markerEl.remove()\n }\n } else {\n console.log('Marker element has been removed. Cannot restore selection.')\n }\n } else {\n setRangeBoundary(host, range, rangeInfo.startMarkerId, true)\n setRangeBoundary(host, range, rangeInfo.endMarkerId, false)\n }\n\n range.normalizeBoundaries()\n return range\n}\n\nfunction getMarker (host, id) {\n return host.querySelector(`#${id}`)\n}\n","import rangy from 'rangy'\nimport * as nodeType from './node-type'\nimport * as rangeSaveRestore from './range-save-restore'\nimport * as parser from './parser'\nimport * as string from './util/string'\nimport {createElement} from './util/dom'\nimport config from './config'\n\nfunction restoreRange (host, range, func) {\n range = rangeSaveRestore.save(range)\n func()\n return rangeSaveRestore.restore(host, range)\n}\n\nconst zeroWidthSpace = /\\u200B/g\nconst zeroWidthNonBreakingSpace = /\\uFEFF/g\nconst whitespaceExceptSpace = /[^\\S ]/g\n\n// Clean up the Html.\nexport function tidyHtml (element) {\n // if (element.normalize) element.normalize()\n normalizeTags(element)\n}\n\n// Remove empty tags and merge consecutive tags (they must have the same\n// attributes).\n//\n// @method normalizeTags\n// @param {HTMLElement} element The element to process.\nexport function normalizeTags (element) {\n const fragment = document.createDocumentFragment()\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(element, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(element, 'lastChild')\n\n for (const node of element.childNodes) {\n // skip empty tags, so they'll get removed\n if (node.nodeName !== 'BR' && !node.textContent) continue\n\n if (node.nodeType === nodeType.elementNode && node.nodeName !== 'BR') {\n let sibling = node\n while ((sibling = sibling.nextSibling) !== null) {\n if (!parser.isSameNode(sibling, node)) break\n\n for (const siblingChild of sibling.childNodes) {\n node.appendChild(siblingChild.cloneNode(true))\n }\n\n sibling.remove()\n }\n\n normalizeTags(node)\n }\n\n fragment.appendChild(node.cloneNode(true))\n }\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(fragment)\n}\n\nexport function normalizeWhitespace (text) {\n return text.replace(whitespaceExceptSpace, ' ')\n}\n\n// Clean the element from character, tags, etc... added by the plugin logic.\n//\n// @method cleanInternals\n// @param {HTMLElement} element The element to process.\nexport function cleanInternals (element) {\n // Uses extract content for simplicity. A custom method\n // that does not clone the element could be faster if needed.\n element.innerHTML = extractContent(element, true)\n}\n\n// Extracts the content from a host element.\n// Does not touch or change the host. Just returns\n// the content and removes elements marked for removal by editable.\n//\n// @param {DOM node or document fragment} Element where to clean out the innerHTML.\n// If you pass a document fragment it will be empty after this call.\n// @param {Boolean} Flag whether to keep ui elements like spellchecking highlights.\n// @returns {String} The cleaned innerHTML of the passed element or document fragment.\nexport function extractContent (element, keepUiElements) {\n const innerHtml = (element.nodeType === nodeType.documentFragmentNode\n ? getInnerHtmlOfFragment(element)\n : element.innerHTML\n )\n .replace(zeroWidthNonBreakingSpace, '') // Used for forcing inline elements to have a height\n .replace(zeroWidthSpace, '<br>') // Used for cross-browser newlines\n\n const clone = document.createElement('div')\n clone.innerHTML = innerHtml\n unwrapInternalNodes(clone, keepUiElements)\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(clone, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(clone, 'lastChild')\n\n return clone.innerHTML\n}\n\nexport function getInnerHtmlOfFragment (documentFragment) {\n const div = document.createElement('div')\n div.appendChild(documentFragment)\n return div.innerHTML\n}\n\n// Create a document fragment from an html string\n// @param {String} e.g. 'some html <span>text</span>.'\nexport function createFragmentFromString (htmlString) {\n const wrapper = document.createElement('div')\n wrapper.innerHTML = htmlString\n\n const fragment = document.createDocumentFragment()\n while (wrapper.firstChild) fragment.appendChild(wrapper.firstChild)\n return fragment\n}\n\nexport function adoptElement (node, doc) {\n return node.ownerDocument !== doc\n ? doc.adoptNode(node)\n : node\n}\n\n// This is a slight variation of the cloneContents method of a rangyRange.\n// It will return a fragment with the cloned contents of the range\n// without the commonAncestorElement.\n//\n// @param {rangyRange}\n// @return {DocumentFragment}\nexport function cloneRangeContents (range) {\n const rangeFragment = range.cloneContents()\n const parent = rangeFragment.childNodes[0]\n const fragment = document.createDocumentFragment()\n while (parent.childNodes.length) fragment.appendChild(parent.childNodes[0])\n return fragment\n}\n\nfunction removeWhitespaces (node, type, firstCall = true) {\n let elem\n while ((elem = node[type])) {\n if (elem.nodeType === nodeType.textNode) {\n if (/^\\s+$/.test(elem.textContent)) node.removeChild(elem)\n else break\n } else if (elem.nodeName === 'BR') {\n elem.remove()\n } else {\n if (elem[type]) removeWhitespaces(elem, type, false)\n break\n }\n }\n\n if (!firstCall) return\n elem = node[type]\n if (elem?.nodeType !== nodeType.textNode) return\n // Remove whitespaces at the end or start of a block with content\n // e.g. ' Hello world' > 'Hello World'\n if (config.trimLeadingAndTrailingWhitespaces) {\n elem.textContent = elem.textContent.replace(type.startsWith('last') ? / +$/ : /^ +/, '')\n }\n}\n\n// Remove elements that were inserted for internal or user interface purposes\n//\n// @param {DOM node}\n// @param {Boolean} whether to keep ui elements like spellchecking highlights\n// Currently:\n// - Saved ranges\nexport function unwrapInternalNodes (sibling, keepUiElements) {\n while (sibling) {\n const nextSibling = sibling.nextSibling\n\n if (sibling.nodeType !== nodeType.elementNode) {\n sibling = nextSibling\n continue\n }\n\n const attr = sibling.getAttribute('data-editable')\n\n if (sibling.firstChild) unwrapInternalNodes(sibling.firstChild, keepUiElements)\n\n if (attr === 'remove' || (attr === 'ui-remove' && !keepUiElements)) {\n sibling.remove()\n } if (attr === 'unwrap' || (attr === 'ui-unwrap' && !keepUiElements)) {\n unwrap(sibling)\n }\n\n sibling = nextSibling\n }\n}\n\n// Get all tags that start or end inside the range\nexport function getTags (host, range, filterFunc) {\n const innerTags = getInnerTags(range, filterFunc)\n const ancestorTags = getAncestorTags(host, range, filterFunc)\n return innerTags.concat(ancestorTags)\n}\n\n// Get all ancestor tags that start or end inside the range\nexport function getAncestorTags (host, range, filterFunc) {\n const tags = []\n let node = range.commonAncestorContainer\n while (node !== host) {\n if (!filterFunc || filterFunc(node)) tags.push(node)\n node = node.parentNode\n }\n\n return tags\n}\n\nexport function getTagsByName (host, range, tagName) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === tagName.toUpperCase()\n })\n}\n\nexport function getTagsByNameAndAttributes (host, range, elem) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === elem.nodeName.toUpperCase() &&\n areSameAttributes(node.attributes, elem.attributes)\n })\n}\n\nexport function areSameAttributes (attrs1, attrs2) {\n if (attrs1.length !== attrs2.length) return false\n\n for (let i = 0; i < attrs1.length; i++) {\n const attr = attrs2[attrs1[i].name]\n if (!(attr && attr.value === attrs1[i].value)) return false\n }\n\n return true\n}\n\n// Get all tags that start or end inside the range\nexport function getInnerTags (range, filterFunc) {\n return range.getNodes([nodeType.elementNode], filterFunc)\n}\n\n// Get all tags whose text is completely within the current selection.\nexport function getContainedTags (range, filterFunc) {\n return range.getNodes([nodeType.elementNode], filterFunc)\n .filter(elem => range.containsNodeText(elem))\n}\n\n// Transform an array of elements into an array\n// of tagnames in uppercase\n//\n// @return example: ['STRONG', 'B']\nexport function getTagNames (elements = []) {\n return elements.map((element) => element.nodeName)\n}\n\nexport function isAffectedBy (host, range, tagName) {\n return getTags(host, range)\n .some((elem) => elem.nodeName === tagName.toUpperCase())\n}\n\n// select a whole element\nexport function selectNodeContents (element) {\n const range = rangy.createRange()\n range.selectNodeContents(element)\n return range\n}\n\n// Check if the range selects all of the elements contents,\n// not less or more.\n//\n// @param visible: Only compare visible text. That way it does not\n// matter if the user selects an additional whitespace or not.\nexport function isExactSelection (range, elem, visible) {\n const elemRange = rangy.createRange()\n elemRange.selectNodeContents(elem)\n\n if (!range.intersectsRange(elemRange)) return false\n\n let rangeText = range.toString()\n let elemText = (elem.jquery ? elem[0] : elem).textContent\n\n if (visible) {\n rangeText = string.trim(rangeText)\n elemText = string.trim(elemText)\n }\n\n return rangeText !== '' && rangeText === elemText\n}\n\nexport function expandTo (host, range, elem) {\n range.selectNodeContents(elem)\n return range\n}\n\nexport function toggleTag (host, range, elem) {\n const elems = getTagsByNameAndAttributes(host, range, elem)\n\n if (elems.length === 1 &&\n isExactSelection(range, elems[0], 'visible')) {\n return removeFormattingElem(host, range, elem)\n }\n\n return forceWrap(host, range, elem)\n}\n\nexport function isWrappable (range) {\n return range.canSurroundContents()\n}\n\nexport function forceWrap (host, range, elem) {\n let restoredRange = restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n\n // remove all tags if the range is not wrappable\n if (!isWrappable(restoredRange)) {\n restoredRange = restoreRange(host, restoredRange, () => {\n nuke(host, restoredRange)\n })\n }\n\n wrap(restoredRange, elem)\n return restoredRange\n}\n\nexport function wrap (range, elem) {\n if (!isWrappable(range)) {\n console.log('content.wrap(): can not surround range')\n return\n }\n\n if (typeof elem === 'string') elem = createElement(elem)\n range.surroundContents(elem)\n}\n\nexport function unwrap (elem) {\n elem = elem.jquery ? elem[0] : elem\n const parent = elem.parentNode\n while (elem.firstChild) parent.insertBefore(elem.firstChild, elem)\n parent.removeChild(elem)\n}\n\nexport function removeFormattingElem (host, range, elem) {\n return restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n}\n\nexport function removeFormatting (host, range, selector) {\n return restoreRange(host, range, () => {\n nuke(host, range, selector)\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nuke (host, range, selector) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!selector || elem.matches(selector))) {\n unwrap(elem)\n }\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeElem (host, range, node) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!node ||\n (elem.nodeName.toUpperCase() === node.nodeName.toUpperCase() &&\n areSameAttributes(elem.attributes, node.attributes)))) {\n unwrap(elem)\n }\n })\n}\n\n// Insert a single character (or string) before or after\n// the range.\nexport function insertCharacter (range, character, atStart) {\n const insertEl = document.createTextNode(character)\n const boundaryRange = range.cloneRange()\n\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(insertEl)\n range[atStart ? 'setStartBefore' : 'setEndAfter'](insertEl)\n range.normalizeBoundaries()\n}\n\n// Surround the range with characters like start and end quotes.\n//\n// @method surround\nexport function surround (host, range, startCharacter, endCharacter) {\n insertCharacter(range, endCharacter || startCharacter, false)\n insertCharacter(range, startCharacter, true)\n return range\n}\n\n// Removes a character from the text within a range.\n//\n// @method deleteCharacter\nexport function deleteCharacter (host, range, character) {\n if (!containsString(range, character)) return range\n\n range.splitBoundaries()\n const restoredRange = restoreRange(host, range, () => {\n const charRegexp = string.regexp(character)\n\n range.getNodes([nodeType.textNode], (node) => {\n return node.nodeValue.search(charRegexp) >= 0\n })\n .forEach((node) => {\n node.nodeValue = node.nodeValue.replace(charRegexp, '')\n })\n })\n\n restoredRange.normalizeBoundaries()\n return restoredRange\n}\n\nexport function containsString (range, str) {\n return range.toString().indexOf(str) >= 0\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeTag (host, range, tagName) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() === tagName.toUpperCase()) unwrap(elem)\n })\n}\n","import config from './config'\nimport * as content from './content'\n\nlet nextBlockId = 1\nconst state = {}\n\nexport const next = getSibling('nextElementSibling')\nexport const previous = getSibling('previousElementSibling')\n\nexport function init (elem, {normalize, plainText, shouldSpellcheck}) {\n setBlockId(elem)\n\n elem.setAttribute('contenteditable', true)\n elem.setAttribute('spellcheck', Boolean(shouldSpellcheck))\n elem.setAttribute('data-plaintext', Boolean(plainText))\n\n elem.classList.remove(config.editableDisabledClass)\n elem.classList.add(config.editableClass)\n\n if (normalize) content.tidyHtml(elem)\n}\n\n\nexport function disable (elem) {\n elem.removeAttribute('contenteditable')\n elem.removeAttribute('spellcheck')\n elem.removeAttribute('data-plaintext')\n\n setState(elem, undefined)\n\n elem.classList.remove(config.editableClass)\n elem.classList.add(config.editableDisabledClass)\n}\n\nexport function isPlainTextBlock (elem) {\n return elem.getAttribute('data-plaintext') === 'true'\n}\n\nexport function setBlockId (elem) {\n if (!elem.hasAttribute('data-editable')) {\n elem.setAttribute('data-editable', `id-${nextBlockId}`)\n nextBlockId += 1\n }\n}\n\n\nexport function getState (elem) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n return state[id]\n }\n}\n\n\nexport function setState (elem, data) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n state[id] = data\n }\n}\n\n\n// Helpers\n// -------\n\nfunction getSibling (type) {\n return function (element) {\n const sibling = element[type]\n return sibling && sibling.getAttribute('contenteditable')\n ? sibling\n : null\n }\n}\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const doubleQuotePairs = [\n ['«', '»'], // ch german, french\n ['»', '«'], // danish\n ['\"', '\"'], // danish, not specified\n ['“', '”'], // english US\n ['”', '”'], // swedish\n ['“', '“'], // chinese simplified\n ['„', '“'] // german\n]\nconst singleQuotePairs = [\n ['‘', '’'], // english UK\n ['‹', '›'], // ch german, french\n ['‚', '‘'], // german\n ['’', '’'], // swedish\n ['›', '‹'], // danish\n [`'`, `'`], // danish, not specified\n [`‘`, `’`] // chinese simplified\n]\n\nconst apostrophe = [\n '’', // german\n `'` // default\n]\nconst quotesRegex = /([‘’‹›‚'«»\"“”„])(?![^<]*?>)/g\n// whitespace end of tag, or any dash (normal, en or em-dash)\n// or any opening double quote\nconst beforeOpeningQuote = /\\s|[>\\-–—«»”\"“„]/\n\n// whitespace begin of tag, or any dash (normal, en or em-dash)\n// or any closing quote, or any punctuation\nconst afterClosingQuote = /\\s|[<\\-–—«»”\"“‘’‹›'.;?:,]/\nlet replacements\n\nexport function replaceAllQuotes (str, replaceQuotesRules) {\n replacements = replaceQuotesRules || {}\n replacements.quotes = replacements.quotes || [undefined, undefined]\n replacements.singleQuotes = replacements.singleQuotes || [undefined, undefined]\n\n const matches = getAllQuotes(str)\n if (matches.length > 0) {\n replaceMatchedQuotes(matches, 0)\n return replaceExistingQuotes(str, matches)\n }\n\n return str\n}\n\nfunction replaceMatchedQuotes (matches, position) {\n\n while (position < matches.length) {\n const closingTag = findClosingQuote(matches, position)\n\n if (closingTag) {\n matches[position].replace = closingTag.type === 'double'\n ? replacements.quotes[0]\n : replacements.singleQuotes[0]\n\n matches[closingTag.position].replace = closingTag.type === 'double'\n ? replacements.quotes[1]\n : replacements.singleQuotes[1]\n\n if (closingTag.position !== position + 1) {\n const nestedMatches = matches.slice(position + 1, closingTag.position)\n if (nestedMatches) {\n replaceMatchedQuotes(nestedMatches, 0)\n }\n }\n\n position = closingTag.position + 1\n } else {\n matches[position].replace = replaceApostrophe(matches[position].char)\n position += 1\n }\n }\n}\n\nfunction findClosingQuote (matches, position) {\n if (position === matches.length - 1) return\n const current = matches[position]\n const openingQuote = current.char\n\n if (current.before && !beforeOpeningQuote.test(current.before)) return\n\n const possibleClosingSingleQuotes = getPossibleClosingQuotes(openingQuote, singleQuotePairs)\n const possibleClosingDoubleQuotes = getPossibleClosingQuotes(openingQuote, doubleQuotePairs)\n for (let i = position + 1; i < matches.length; i++) {\n if ((matches[i].after && afterClosingQuote.test(matches[i].after)) || !matches[i].after) {\n if (possibleClosingSingleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'single'}\n }\n if (possibleClosingDoubleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'double'}\n }\n }\n }\n}\n\nfunction getPossibleClosingQuotes (openingQuote, pairs) {\n return pairs.filter(quotePair => quotePair[0] === openingQuote).map((quotePair) => quotePair[1])\n}\n\nfunction replaceApostrophe (quote) {\n if (apostrophe.includes(quote)) {\n return replacements.apostrophe\n }\n}\n\nfunction getAllQuotes (str) {\n return [...str.matchAll(quotesRegex)].map((match) => {\n const index = match.index\n return {\n char: match[1],\n before: index > 0 ? str[index - 1] : '',\n after: (index + 1) < str.length ? str[index + 1] : ''\n }\n })\n}\n\nfunction replaceExistingQuotes (str, matches) {\n let index = 0\n return str.replace(quotesRegex, (match) => {\n const replacement = matches[index].replace || matches[index].char\n index += 1\n return replacement\n })\n}\n","import config from './config'\nimport * as string from './util/string'\nimport * as nodeType from './node-type'\nimport * as quotes from './quotes'\nimport {isPlainTextBlock} from './block'\n\nlet allowedElements, allowedPlainTextElements, requiredAttributes, transformElements, blockLevelElements, replaceQuotes\nlet splitIntoBlocks, blacklistedElements\nconst whitespaceOnly = /^\\s*$/\nconst blockPlaceholder = '<!-- BLOCK -->'\nlet keepInternalRelativeLinks\n\nupdateConfig(config)\nexport function updateConfig (conf) {\n const rules = conf.pastedHtmlRules\n allowedElements = rules.allowedElements || {}\n allowedPlainTextElements = rules.allowedPlainTextElements || {}\n requiredAttributes = rules.requiredAttributes || {}\n transformElements = rules.transformElements || {}\n blacklistedElements = rules.blacklistedElements || []\n keepInternalRelativeLinks = rules.keepInternalRelativeLinks || false\n replaceQuotes = rules.replaceQuotes || {}\n\n blockLevelElements = {}\n rules.blockLevelElements.forEach((name) => { blockLevelElements[name] = true })\n splitIntoBlocks = {}\n rules.splitIntoBlocks.forEach((name) => { splitIntoBlocks[name] = true })\n}\n\nexport function paste (block, cursor, clipboardContent) {\n const document = block.ownerDocument\n block.setAttribute(config.pastingAttribute, true)\n\n if (cursor.isSelection) {\n cursor = cursor.deleteExactSurroundingTags()\n .deleteContainedTags()\n .deleteContent()\n }\n\n // Create a placeholder to help parse HTML\n const pasteHolder = document.createElement('div')\n pasteHolder.innerHTML = clipboardContent\n\n const isPlainText = isPlainTextBlock(block)\n const blocks = parseContent(pasteHolder, {plainText: isPlainText})\n\n block.removeAttribute(config.pastingAttribute)\n return {blocks, cursor}\n}\n\n/**\n * - Parse pasted content\n * - Split it up into blocks\n * - clean and normalize every block\n * - optionally strip the host location an anchorTag-href\n * www.livindocs.io/internalLink -> /internalLink\n *\n * @param {DOM node} A container where the pasted content is located.\n * @returns {Array of Strings} An array of cleaned innerHTML like strings.\n */\nexport function parseContent (element, {plainText = false} = {}) {\n const options = {\n allowedElements: plainText ? allowedPlainTextElements : allowedElements,\n keepInternalRelativeLinks: plainText ? false : keepInternalRelativeLinks\n }\n\n // Filter pasted content\n return filterHtmlElements(element, options)\n // Handle Blocks\n .split(blockPlaceholder)\n .map((entry) => string.trim(cleanWhitespace(replaceAllQuotes(entry))))\n .filter((entry) => !whitespaceOnly.test(entry))\n}\n\nfunction filterHtmlElements (elem, options) {\n return Array.from(elem.childNodes).reduce((content, child) => {\n if (blacklistedElements.indexOf(child.nodeName.toLowerCase()) !== -1) {\n return ''\n }\n\n // Keep internal relative links relative (on paste).\n if (options.keepInternalRelativeLinks && child.nodeName === 'A' && child.href) {\n const stripInternalHost = child.getAttribute('href').replace(window.location.origin, '')\n child.setAttribute('href', stripInternalHost)\n }\n\n if (child.nodeType === nodeType.elementNode) {\n const childContent = filterHtmlElements(child, options)\n return content + conditionalNodeWrap(child, childContent, options)\n }\n\n // Escape HTML characters <, > and &\n if (child.nodeType === nodeType.textNode) return content + string.escapeHtml(child.nodeValue)\n return content\n }, '')\n}\n\nfunction conditionalNodeWrap (child, content, options) {\n let nodeName = child.nodeName.toLowerCase()\n nodeName = transformNodeName(nodeName)\n\n if (shouldKeepNode(nodeName, child, options)) {\n const attributes = filterAttributes(nodeName, child)\n\n if (nodeName === 'br') return `<${nodeName + attributes}>`\n\n if (!whitespaceOnly.test(content)) {\n return `<${nodeName + attributes}>${content}</${nodeName}>`\n }\n\n return content\n }\n\n if (splitIntoBlocks[nodeName]) {\n return blockPlaceholder + content + blockPlaceholder\n }\n\n // prevent missing whitespace between text when block-level\n // elements are removed.\n if (blockLevelElements[nodeName]) return `${content} `\n\n return content\n}\n\n// returns string of concatenated attributes e.g. 'target=\"_blank\" rel=\"nofollow\" href=\"/test.com\"'\nfunction filterAttributes (nodeName, node) {\n return Array.from(node.attributes).reduce((attributes, {name, value}) => {\n if (allowedElements[nodeName][name] && value) {\n return `${attributes} ${name}=\"${value}\"`\n }\n return attributes\n }, '')\n}\n\nfunction transformNodeName (nodeName) {\n return transformElements[nodeName] || nodeName\n}\n\nfunction hasRequiredAttributes (nodeName, node) {\n const requiredAttrs = requiredAttributes[nodeName]\n if (!requiredAttrs) return true\n\n return !requiredAttrs.some((name) => !node.getAttribute(name))\n}\n\nfunction shouldKeepNode (nodeName, node, options) {\n return options.allowedElements[nodeName] && hasRequiredAttributes(nodeName, node)\n}\n\nfunction cleanWhitespace (str) {\n return str\n .replace(/\\n/g, ' ')\n .replace(/ {2,}/g, ' ')\n .replace(/(.)\\u00A0/g, (match, group) => group + (/[\\u0020]/.test(group)\n ? '\\u00A0'\n : ' '\n ))\n}\n\nfunction replaceAllQuotes (str) {\n if (replaceQuotes.quotes || replaceQuotes.singleQuotes || replaceQuotes.apostrophe) {\n return quotes.replaceAllQuotes(str, replaceQuotes)\n }\n\n return str\n}\n","import browser from 'bowser'\n\n/**\n* Check for contenteditable support\n*\n* (from Modernizr)\n* this is known to false positive in some mobile browsers\n* here is a whitelist of verified working browsers:\n* https://github.com/NielsLeenheer/html5test/blob/549f6eac866aa861d9649a0707ff2c0157895706/scripts/engine.js#L2083\n*/\nexport const contenteditable = typeof document.documentElement.contentEditable !== 'undefined'\n\nconst parser = browser.getParser(window.navigator.userAgent)\nconst browserEngine = parser.getEngineName()\nconst webKit = browserEngine === 'WebKit'\n\n/**\n * Check selectionchange event (supported in IE, Chrome, Firefox and Safari)\n * Firefox supports it since version 52 (2017).\n * Opera has no support as of 2021.\n */\nconst hasNativeSelectionchangeSupport = (document) => {\n const doc = document\n const osc = doc.onselectionchange\n if (osc !== undefined) {\n try {\n doc.onselectionchange = 0\n return doc.onselectionchange === null\n } catch (e) {\n } finally {\n doc.onselectionchange = osc\n }\n }\n return false\n}\n\nexport const selectionchange = hasNativeSelectionchangeSupport(document)\n\n// See Keyboard.prototype.preventContenteditableBug for more information.\nexport const contenteditableSpanBug = !!webKit\n","// Eventable Mixin.\n//\n// Simple mixin to add event emitter methods to an object (Publish/Subscribe).\n//\n// Add on, off and notify methods to an object:\n// eventable(obj)\n//\n// publish an event:\n// obj.notify(context, 'action', param1, param2)\n//\n// Optionally pass a context that will be applied to every event:\n// eventable(obj, context)\n//\n// With this publishing can omit the context argument:\n// obj.notify('action', param1, param2)\n//\n// Subscribe to a 'channel'\n// obj.on('action', funtion(param1, param2){ ... })\n//\n// Unsubscribe an individual listener:\n// obj.off('action', method)\n//\n// Unsubscribe all listeners of a channel:\n// obj.off('action')\n//\n// Unsubscribe all listeners of all channels:\n// obj.off()\n\nexport default function eventable (obj, notifyContext) {\n const events = getEventableModule(notifyContext)\n obj.on = events.on\n obj.off = events.off\n obj.notify = events.notify\n}\n\nfunction getEventableModule (notifyContext) {\n let listeners = {}\n\n function addListener (events, listener) {\n events.split(' ').forEach(event => {\n listeners[event] = listeners[event] || []\n listeners[event].unshift(listener)\n })\n }\n\n function removeListener (event, listener) {\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n const index = eventListeners.indexOf(listener)\n if (index < 0) return\n\n eventListeners.splice(index, 1)\n }\n\n // Public Methods\n return {\n on (event, listener) {\n if (arguments.length === 2) {\n addListener(event, listener)\n } else if (arguments.length === 1) {\n for (const eventType in event) addListener(eventType, event[eventType])\n }\n return this\n },\n\n off (event, listener) {\n if (arguments.length === 2) {\n removeListener(event, listener)\n } else if (arguments.length === 1) {\n listeners[event] = []\n } else {\n listeners = {}\n }\n },\n\n notify (context, event) {\n const args = Array.from(arguments)\n\n if (notifyContext) {\n event = context\n context = notifyContext\n args.splice(0, 1)\n } else {\n args.splice(0, 2)\n }\n\n if (this.switchContext) {\n const nextEvent = this.switchContext.events.shift()\n if (event !== nextEvent) this.switchContext = undefined\n }\n\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n // Execute the newest listeners first.\n // Stop if a listener returns false.\n eventListeners.every((listener) => listener.apply(context, args) !== false)\n }\n }\n}\n","// code from mdn: https://developer.mozilla.org/en-US/docs/Web/API/window.scrollX\nfunction getScrollPosition (win) {\n const x = (win.pageXOffset !== undefined) ? win.pageXOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollLeft\n const y = (win.pageYOffset !== undefined) ? win.pageYOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollTop\n return {x, y}\n}\n\nexport {getScrollPosition}\n","import rangy from 'rangy'\nimport * as viewport from './util/viewport'\n\nimport * as content from './content'\nimport * as parser from './parser'\nimport * as string from './util/string'\nimport {elementNode, documentFragmentNode} from './node-type'\nimport error from './util/error'\nimport * as rangeSaveRestore from './range-save-restore'\n// import printRange from './util/print_range'\nimport {closest} from './util/dom'\n\n/**\n * The Cursor module provides a cross-browser abstraction layer for cursor.\n *\n * @module core\n * @submodule cursor\n */\n\nexport default class Cursor {\n\n static findHost (elem, selector) {\n return closest(elem, selector)\n }\n\n /**\n * Class for the Cursor module.\n *\n * @class Cursor\n * @constructor\n */\n constructor (editableHost, rangyRange) {\n this.setHost(editableHost)\n this.range = rangyRange\n this.isCursor = true\n }\n\n // Get all tags that affect the current selection. Optionally pass a\n // method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the returned\n // DOM Nodes.\n // @return {Array of DOM Nodes}\n getTags (filterFunc) {\n return content.getTags(this.host, this.range, filterFunc)\n }\n\n // Get the names of all tags that affect the current selection. Optionally\n // pass a method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the DOM\n // Nodes whose names are returned.\n // @return {Array<String> of tag names}\n getTagNames (filterFunc) {\n return content.getTagNames(this.getTags(filterFunc))\n }\n\n // Get all tags of the specified type that affect the current selection.\n //\n // @method getTagsByName\n // @param {String} tagName. E.g. 'a' to get all links.\n // @return {Array of DOM Nodes}\n getTagsByName (tagName) {\n return content.getTagsByName(this.host, this.range, tagName)\n }\n\n // Get all tags that are completely within the current selection.\n getInnerTags (filterFunc) {\n return content.getInnerTags(this.range, filterFunc)\n }\n\n // Get all tags whose text is completely within the current selection.\n getContainedTags (filterFunc) {\n return content.getContainedTags(this.range, filterFunc)\n }\n\n // Get all tags that surround the current selection.\n getAncestorTags (filterFunc) {\n return content.getAncestorTags(this.host, this.range, filterFunc)\n }\n\n isAtEnd () {\n return parser.isEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtTextEnd () {\n return parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtLastLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(false)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range.nativeRange, this.win)\n return isCloseTo(hostCoords.bottom, cursorCoords.bottom)\n }\n\n isAtFirstLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(true)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range.nativeRange, this.win)\n return isCloseTo(hostCoords.top, cursorCoords.top)\n }\n\n isAtBeginning () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n )\n }\n\n // Insert content before the cursor\n //\n // @param {String, DOM node or document fragment}\n insertBefore (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n\n let preceedingElement = element\n if (element.nodeType === documentFragmentNode) {\n const lastIndex = element.childNodes.length - 1\n preceedingElement = element.childNodes[lastIndex]\n }\n\n this.range.insertNode(element)\n this.range.setStartAfter(preceedingElement)\n this.range.setEndAfter(preceedingElement)\n }\n\n // Insert content after the cursor\n //\n // @param {String, DOM node or document fragment}\n insertAfter (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n this.range.insertNode(element)\n }\n\n // Alias for #setVisibleSelection()\n setSelection () {\n this.setVisibleSelection()\n }\n\n setVisibleSelection () {\n if (this.win.document.activeElement !== this.host) {\n const {x, y} = viewport.getScrollPosition(this.win)\n this.win.scrollTo(x, y)\n }\n rangy.getSelection(this.win).setSingleRange(this.range)\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // before() will return a document fragment containing a text node 'fo'.\n //\n // @returns {Document Fragment} content before the cursor or selection.\n before () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return content.cloneRangeContents(range)\n }\n\n textBefore () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return range.toString()\n }\n\n // Same as before() but returns a string.\n beforeHtml () {\n return content.getInnerHtmlOfFragment(this.before())\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // after() will return a document fragment containing a text node 'o'.\n //\n // @returns {Document Fragment} content after the cursor or selection.\n after () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return content.cloneRangeContents(range)\n }\n\n textAfter () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return range.toString()\n }\n\n // Same as after() but returns a string.\n afterHtml () {\n return content.getInnerHtmlOfFragment(this.after())\n }\n\n getBoundingClientRect () {\n return this.range.nativeRange.getBoundingClientRect()\n }\n\n // Get the BoundingClientRect of the cursor.\n // The returned values are transformed to be absolute\n // (relative to the document).\n getCoordinates (positioning = 'absolute') {\n const coords = this.range.nativeRange.getBoundingClientRect()\n if (positioning === 'fixed') return coords\n\n\n // translate into absolute positions\n const {x, y} = viewport.getScrollPosition(this.win)\n return {\n top: coords.top + y,\n bottom: coords.bottom + y,\n left: coords.left + x,\n right: coords.right + x,\n height: coords.height,\n width: coords.width\n }\n }\n\n moveBefore (element) {\n this.updateHost(element)\n this.range.setStartBefore(element)\n this.range.setEndBefore(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n moveAfter (element) {\n this.updateHost(element)\n this.range.setStartAfter(element)\n this.range.setEndAfter(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the beginning of the host.\n moveAtBeginning (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(true)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the end of the host.\n moveAtEnd (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(false)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor after the last visible character of the host.\n moveAtTextEnd (element) {\n return this.moveAtEnd(parser.lastChild(element))\n }\n\n setHost (element) {\n if (element.jquery) element = element[0]\n this.host = element\n this.win = (element === undefined || element === null) ? window : element.ownerDocument.defaultView\n }\n\n updateHost (element) {\n const host = parser.getHost(element)\n if (!host) error('Can not set cursor outside of an editable block')\n this.setHost(host)\n }\n\n retainVisibleSelection (callback) {\n this.save()\n callback()\n this.restore()\n this.setVisibleSelection()\n }\n\n save () {\n this.savedRangeInfo = rangeSaveRestore.save(this.range)\n this.savedRangeInfo.host = this.host\n }\n\n restore () {\n if (!this.savedRangeInfo) error('Could not restore selection')\n\n this.host = this.savedRangeInfo.host\n this.range = rangeSaveRestore.restore(this.host, this.savedRangeInfo)\n this.savedRangeInfo = undefined\n }\n\n equals (cursor) {\n if (!cursor) return false\n\n if (!cursor.host) return false\n if (!cursor.host.isEqualNode(this.host)) return false\n\n if (!cursor.range) return false\n if (!cursor.range.equals(this.range)) return false\n\n return true\n }\n\n // Create an element with the correct ownerWindow\n // (see: http://www.w3.org/DOM/faq.html#ownerdoc)\n createElement (tagName, attributes = {}) {\n const element = this.win.document.createElement(tagName)\n for (const attributeName in attributes) {\n const attributeValue = attributes[attributeName]\n element.setAttribute(attributeName, attributeValue)\n }\n return element\n }\n\n createTextNode (text) {\n return this.win.document.createTextNode(text)\n }\n\n // Make sure a node has the correct ownerWindow\n // (see: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode)\n adoptElement (node) {\n return content.adoptElement(node, this.win.document)\n }\n\n // Currently we call triggerChange manually after format changes.\n // This is to prevent excessive triggering of the change event during\n // merge or split operations or other manipulations by scripts.\n triggerChange () {\n const event = document.createEvent('HTMLEvents')\n event.initEvent('formatEditable', true, false)\n this.host.dispatchEvent(event)\n }\n}\n\n\n/**\n* Get position of the range or cursor\n*\n* Can be used to reliably get the boundingClientRect without\n* some any of the drawbacks that the native range has.\n*\n* With the native range.getClientBoundingRect(), newlines are\n* not considered when calculating the position\n*\n* @param {Range} range\n* @param {Window} win\n*/\nfunction getRangeBoundingClientRect (range, win) {\n if (range.startContainer.nodeType !== elementNode) return range.getBoundingClientRect()\n const el = win.document.createElement('span')\n el.setAttribute('doc-editable', 'unwrap')\n range.insertNode(el)\n const coords = el.getBoundingClientRect()\n el.remove()\n return coords\n}\n\nfunction isCloseTo (a, b) {\n if (a === b) return true\n if (Math.abs(a - b) <= 2) return true\n return false\n}\n","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import rangy from 'rangy'\n\nimport NodeIterator from './node-iterator'\nimport * as nodeType from './node-type'\n\nexport default {\n\n // Get the text from an editable block with a NodeIterator.\n // This must work the same as when later iterating over the text\n // in highlightMatches().\n extractText (element) {\n let text = ''\n getText(element, (part) => { text += part })\n return text\n },\n\n // Go through the element to highlight the matches while keeping the\n // existing html valid (highlighting a match may require inserting multiple\n // elements).\n //\n // @params\n // - matches\n // Array of positions in the string to highlight:\n // e.g [{startIndex: 0, endIndex: 1, match: 'The'}]\n highlightMatches (element, matches) {\n if (!matches || matches.length === 0) {\n return\n }\n\n const iterator = new NodeIterator(element)\n let currentMatchIndex = 0\n let totalOffset = 0\n let currentMatch = matches[currentMatchIndex]\n let portions = []\n let next\n let wordId\n let textNode\n while ((next = iterator.getNext())) {\n // Account for <br> elements\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n textNode = next\n } else if (next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n totalOffset += 1\n continue\n } else {\n continue\n }\n\n const nodeText = textNode.data\n let nodeEndOffset = totalOffset + nodeText.length\n if (currentMatch.startIndex < nodeEndOffset && totalOffset < currentMatch.endIndex) {\n // get portion position (fist, last or in the middle)\n const isFirstPortion = totalOffset <= currentMatch.startIndex\n const isLastPortion = nodeEndOffset >= currentMatch.endIndex\n\n if (isFirstPortion) {\n wordId = currentMatch.id || currentMatch.startIndex\n }\n\n // calculate offset and length\n let offset\n if (isFirstPortion) {\n offset = currentMatch.startIndex - totalOffset\n } else {\n offset = 0\n }\n\n let length\n if (isLastPortion) {\n length = (currentMatch.endIndex - totalOffset) - offset\n } else {\n length = nodeText.length - offset\n }\n\n // create portion object\n const portion = {\n element: textNode,\n text: nodeText.substring(offset, offset + length),\n offset,\n length,\n isLastPortion,\n wordId\n }\n\n portions.push(portion)\n\n if (isLastPortion) {\n const lastNode = this.wrapMatch(portions, currentMatch.marker, currentMatch.title)\n iterator.replaceCurrent(lastNode)\n\n // recalculate nodeEndOffset if we have to replace the current node.\n nodeEndOffset = totalOffset + portion.length + portion.offset\n\n portions = []\n currentMatchIndex += 1\n if (currentMatchIndex < matches.length) {\n currentMatch = matches[currentMatchIndex]\n }\n }\n }\n\n totalOffset = nodeEndOffset\n }\n },\n\n // @return the last wrapped element\n wrapMatch (portions, stencilElement, title) {\n return portions.map((portion) => this.wrapPortion(portion, stencilElement, title)).pop()\n },\n\n wrapPortion (portion, stencilElement, title) {\n const range = rangy.createRange()\n range.setStart(portion.element, portion.offset)\n range.setEnd(portion.element, portion.offset + portion.length)\n const node = stencilElement.cloneNode(true)\n node.setAttribute('data-word-id', portion.wordId)\n if (title) node.setAttribute('title', title)\n range.surroundContents(node)\n\n // Fix a weird behaviour where an empty text node is inserted after the range\n if (node.nextSibling) {\n const next = node.nextSibling\n if (next.nodeType === nodeType.textNode && next.data === '') {\n next.remove()\n }\n }\n\n return node\n }\n\n}\n\n// Extract the text of an element.\n// This has two notable behaviours:\n// - It uses a NodeIterator which will skip elements\n// with data-editable=\"remove\"\n// - It returns a \\n for <br> elements\n// (The only block level element allowed inside of editables)\nfunction getText (element, callback) {\n const iterator = new NodeIterator(element)\n let next\n while ((next = iterator.getNext())) {\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n callback(next.data)\n } else if (next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n callback('\\n')\n }\n }\n}\n","export default class WordHighlighting {\n\n // @param markerNode {DOM Node}\n // @param matchMode {String} either 'word' or 'text'\n constructor (markerNode, matchMode = 'word') {\n this.marker = markerNode\n this.matchMode = matchMode\n }\n\n isElement (obj) {\n try {\n if (!obj) return false\n return obj instanceof obj.ownerDocument?.defaultView.HTMLElement\n } catch (e) {\n // Browsers not supporting W3 DOM2 don't have HTMLElement and\n // an exception is thrown and we end up here. Testing some\n // properties that all elements have (works on IE7)\n return (typeof obj === 'object') &&\n (obj.nodeType === 1) && (typeof obj.style === 'object') &&\n (typeof obj.ownerDocument === 'object')\n }\n }\n\n findMatches (text, highlights) {\n if (!text || text === '' || !this.isElement(this.marker)) return\n\n if (highlights && highlights.length > 0) {\n return this.searchMatches(text, highlights)\n }\n }\n\n searchMatches (text, highlights) {\n const createRegex = this.matchMode === 'word'\n ? createWordRegex\n : createHighlightRegex\n\n const regex = createRegex(highlights)\n const matches = [...text.matchAll(regex)]\n\n return matches.map((entry) => this.prepareMatch(entry))\n }\n\n prepareMatch (match) {\n let startIndex\n let matchedText\n if (this.matchMode === 'word') {\n startIndex = match.index + match[1].length\n matchedText = match[2]\n } else {\n startIndex = match.index\n matchedText = match[0]\n }\n\n return {\n startIndex,\n endIndex: startIndex + matchedText.length,\n match: matchedText,\n marker: this.marker\n }\n }\n\n}\n\nfunction createHighlightRegex (words) {\n const escapedWords = (words || []).map((word) => escapeRegEx(word))\n\n const regex = `(${escapedWords.join('|')})`\n return new RegExp(regex, 'g')\n}\n\n// Regex to find whole words within a string\n//\n// Unicode character blocks for letters.\n// See: http://jrgraphix.net/research/unicode_blocks.php\n//\n// \\\\u0041-\\\\u005A A-Z (Basic Latin)\n// \\\\u0061-\\\\u007A a-z (Basic Latin)\n// \\\\u0030-\\\\u0039 0-9 (Basic Latin)\n// \\\\u00AA ª (Latin-1 Supplement)\n// \\\\u00B5 µ (Latin-1 Supplement)\n// \\\\u00BA º (Latin-1 Supplement)\n// \\\\u00C0-\\\\u00D6 À-Ö (Latin-1 Supplement)\n// \\\\u00D8-\\\\u00F6 Ø-ö (Latin-1 Supplement)\n// \\\\u00F8-\\\\u00FF ø-ÿ (Latin-1 Supplement)\n// \\\\u0100-\\\\u017F Ā-ſ (Latin Extended-A)\n// \\\\u0180-\\\\u024F ƀ-ɏ (Latin Extended-B)\nconst letterChars = '\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u0030-\\\\u0039\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u00FF\\\\u0100-\\\\u017F\\\\u0180-\\\\u024F'\n\nfunction createWordRegex (words) {\n const escapedWords = (words || []).map((word) => escapeRegEx(word))\n\n // (notLetter|^)(words)(?=notLetter|$)\n const regex = `([^${letterChars}]|^)` +\n `(${escapedWords.join('|')})` +\n `(?=[^${letterChars}]|$)`\n\n return new RegExp(regex, 'g')\n}\n\nfunction escapeRegEx (s) {\n return String(s).replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1')\n}\n","import rangy from 'rangy'\nimport * as content from './content'\nimport highlightText from './highlight-text'\nimport TextHighlighting from './plugins/highlighting/text-highlighting'\nimport {closest, createElement} from './util/dom'\n\nfunction isInHost (elem, host) {\n return closest(elem, '[data-editable]:not([data-word-id])') === host\n}\n\nconst highlightSupport = {\n\n highlightText (editableHost, text, highlightId, type) {\n if (this.hasHighlight(editableHost, highlightId)) return\n const blockText = highlightText.extractText(editableHost)\n\n const marker = `<span class=\"highlight-${type}\"></span>`\n const markerNode = highlightSupport.createMarkerNode(marker, type, this.win)\n\n const textSearch = new TextHighlighting(markerNode, 'text')\n const matches = textSearch.findMatches(blockText, [text])\n\n if (matches && matches.length) {\n if (highlightId) matches[0].id = highlightId\n highlightText.highlightMatches(editableHost, matches)\n return matches[0].startIndex\n }\n },\n\n\n // This function was changed to track matches when text is added to the start of a component, but multiple white spaces break it in a strict sense\n // The function works in the editor and in browsers, but tests with multiple white spaces will fail.\n // Browsers change the white spaces to &nbsp and the function works, and the tests in highlight.spec.js have been updated to represent this.\n\n highlightRange (editableHost, text, highlightId, startIndex, endIndex, dispatcher, type = 'comment') {\n if (this.hasHighlight(editableHost, highlightId)) {\n this.removeHighlight(editableHost, highlightId)\n }\n const firstMarker = `<span class=\"highlight-${type}\"></span>`\n const markerNode = highlightSupport.createMarkerNode(firstMarker, type, this.win)\n const textSearch = new TextHighlighting(markerNode, 'text')\n const blockText = highlightText.extractText(editableHost)\n if (blockText === '') return -1 // the text was deleted so we can't highlight it\n const matchesArray = textSearch.findMatches(blockText, [text])\n const {actualStartIndex, actualEndIndex} = this.getIndex(matchesArray, startIndex, endIndex)\n const range = rangy.createRange()\n range.selectCharacters(editableHost, actualStartIndex, actualEndIndex)\n\n if (!isInHost(range.commonAncestorContainer, editableHost)) {\n return -1\n }\n\n const marker = highlightSupport.createMarkerNode(\n `<span class=\"highlight-${type}\" data-word-id=\"${highlightId}\"></span>`,\n type,\n this.win\n )\n const fragment = range.extractContents()\n marker.appendChild(fragment)\n range.deleteContents()\n range.insertNode(marker)\n highlightSupport.cleanupStaleMarkerNodes(editableHost, 'comment')\n if (dispatcher) {\n dispatcher.notify('change', editableHost)\n }\n return actualStartIndex\n },\n\n updateHighlight (editableHost, highlightId, addCssClass, removeCssClass) {\n if (!document.documentElement.classList) return\n\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n if (removeCssClass) elem.classList.remove(removeCssClass)\n if (addCssClass) elem.classList.add(addCssClass)\n }\n },\n\n removeHighlight (editableHost, highlightId, dispatcher) {\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n content.unwrap(elem)\n // in Chrome browsers the unwrap method leaves the host node split into 2 (lastChild !== firstChild)\n editableHost.normalize()\n if (dispatcher) dispatcher.notify('change', editableHost)\n }\n },\n\n hasHighlight (editableHost, highlightId) {\n const matches = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n return !!matches.length\n },\n\n extractHighlightedRanges (editableHost, type) {\n let findMarkersQuery = '[data-word-id]'\n if (type) findMarkersQuery += `[data-highlight=\"${type}\"]`\n const markers = editableHost.querySelectorAll(findMarkersQuery)\n if (!markers.length) return\n\n const groups = {}\n for (const marker of markers) {\n const highlightId = marker.getAttribute('data-word-id')\n if (!groups[highlightId]) {\n groups[highlightId] = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n }\n\n }\n\n const res = {}\n for (const highlightId in groups) {\n const position = this.extractMarkerNodePosition(editableHost, groups[highlightId])\n if (position) res[highlightId] = position\n }\n\n return res\n },\n\n extractMarkerNodePosition (editableHost, markers) {\n const range = rangy.createRange()\n if (markers.length > 1) {\n range.setStartBefore(markers[0])\n range.setEndAfter(markers[markers.length - 1])\n } else {\n range.selectNode(markers[0])\n }\n\n const textRange = range.toCharacterRange(editableHost)\n return {\n start: textRange.start,\n end: textRange.end,\n text: range.text(),\n nativeRange: range.nativeRange\n }\n },\n\n cleanupStaleMarkerNodes (editableHost, highlightType) {\n const nodes = editableHost.querySelectorAll(`span[data-highlight=\"${highlightType}\"]`)\n for (const node of nodes) {\n if (!node.textContent.length) {\n node.remove()\n }\n }\n },\n\n createMarkerNode (markerMarkup, highlightType, win) {\n const marker = createElement(markerMarkup, win)\n marker.setAttribute('data-editable', 'ui-unwrap')\n marker.setAttribute('data-highlight', highlightType)\n return marker\n },\n\n // This function checks to see if text has been added to the component before the comment\n // If it has, the start index is updated, otherwise it remains the same\n getIndex (matchesArray, startIndex, endIndex) {\n const newStartIndex = matchesArray.find((match) => {\n return match.startIndex >= startIndex // checks if the startIndex has increased\n })\n const actualStartIndex = newStartIndex ? newStartIndex.startIndex : startIndex\n const actualEndIndex = actualStartIndex ? (actualStartIndex + (endIndex - startIndex)) : endIndex\n\n return {actualStartIndex, actualEndIndex}\n }\n\n}\n\nexport default highlightSupport\n","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","\nimport 'rangy/lib/rangy-textrange'\nimport Cursor from './cursor'\nimport * as content from './content'\nimport * as parser from './parser'\nimport * as block from './block'\nimport config from './config'\nimport highlightSupport from './highlight-support'\nimport highlightText from './highlight-text'\nimport {\n findStartExcludingWhitespace,\n findEndExcludingWhitespace\n} from './util/dom'\n\n/**\n * The Selection module provides a cross-browser abstraction layer for range\n * and selection.\n *\n * @module core\n * @submodule selection\n */\n/**\n * Class that represents a selection and provides functionality to access or\n * modify the selection.\n *\n * @class Selection\n * @constructor\n */\n\nexport default class Selection extends Cursor {\n constructor () {\n super(...arguments)\n delete this.isCursor\n this.isSelection = true\n }\n\n // Get the text inside the selection.\n text () {\n return this.range.toString()\n }\n\n // Get the html inside the selection.\n html () {\n return this.range.toHtml()\n }\n\n isAllSelected () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n ) && parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n getTextRange () {\n return this.range.toCharacterRange(this.host)\n }\n\n // Return a plain string of the current selection content.\n toString () {\n return this.range.toString()\n }\n\n // Return true if the selection can be wrapped, i.e. all open nodes\n // are closed within this selection.\n isWrappable () {\n return content.isWrappable(this.range)\n }\n\n // Get the ClientRects of this selection.\n // Use this if you want more precision than getBoundingClientRect can give.\n getRects () {\n // consider: translate into absolute positions\n // just like Cursor#getCoordinates()\n return this.range.nativeRange.getClientRects()\n }\n\n\n link (href, attrs = {}) {\n if (href) attrs.href = href\n const link = this.createElement(config.linkMarkup.name, config.linkMarkup.attribs)\n for (const key in attrs) {\n const value = attrs[key]\n if (value === undefined) continue\n if (value === null) {\n link.removeAttribute(key)\n } else {\n link.setAttribute(key, value)\n }\n }\n if (config.linkMarkup.trim) this.trimRange()\n\n this.forceWrap(link)\n }\n\n // trims whitespaces on the left and right of a selection, i.e. what you want in case of links\n trimRange () {\n const textToTrim = this.range.toString()\n const whitespacesOnTheLeft = textToTrim.search(/\\S|$/)\n const lastNonWhitespace = textToTrim.search(/\\S[\\s]+$/)\n const whitespacesOnTheRight = lastNonWhitespace === -1\n ? 0\n : textToTrim.length - (lastNonWhitespace + 1)\n\n const [startContainer, startOffset] = findStartExcludingWhitespace({\n root: this.range.commonAncestorContainer,\n startContainer: this.range.startContainer,\n startOffset: this.range.startOffset,\n whitespacesOnTheLeft\n })\n this.range.setStart(startContainer, startOffset)\n\n const [endContainer, endOffset] = findEndExcludingWhitespace({\n root: this.range.commonAncestorContainer,\n endContainer: this.range.endContainer,\n endOffset: this.range.endOffset,\n whitespacesOnTheRight\n })\n this.range.setEnd(endContainer, endOffset)\n }\n\n unlink () {\n this.removeFormatting(config.linkMarkup.name)\n }\n\n toggleLink (href, attrs) {\n const links = this.getTagsByName(config.linkMarkup.name)\n if (links.length >= 1) {\n const firstLink = links[0]\n if (this.isExactSelection(firstLink, 'visible')) {\n this.unlink()\n } else {\n this.expandTo(firstLink)\n }\n } else {\n this.link(href, attrs)\n }\n }\n\n // Manually add a highlight\n // Note: the current code does not work with newlines (LP)\n highlight ({highlightId}) {\n const textBefore = this.textBefore()\n const currentTextContent = this.text()\n\n const marker = '<span class=\"highlight-comment\"></span>'\n const markerNode = highlightSupport.createMarkerNode(marker, this.win)\n\n markerNode.setAttribute('data-match', currentTextContent)\n\n const match = {\n startIndex: textBefore.length,\n endIndex: textBefore.length + currentTextContent.length,\n match: currentTextContent,\n marker: markerNode\n }\n\n // Note: highlighting won't retain the selection\n highlightText.highlightMatches(this.host, [match])\n }\n\n // toggle('<em>')\n toggle (elem) {\n if (block.isPlainTextBlock(this.host)) return\n if (this.range.collapsed) return\n elem = this.adoptElement(elem)\n this.range = content.toggleTag(this.host, this.range, elem)\n this.setSelection()\n }\n\n toggleCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.toggle(customElem)\n }\n\n makeCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.forceWrap(customElem)\n }\n\n makeBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.forceWrap(bold)\n }\n\n toggleBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.toggle(bold)\n }\n\n giveEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.forceWrap(em)\n }\n\n toggleEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.toggle(em)\n }\n\n makeUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.forceWrap(u)\n }\n\n toggleUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.toggle(u)\n }\n\n insertCharacter (character) {\n const cursor = this.deleteContent()\n const textNode = cursor.createTextNode(character)\n cursor.insertBefore(textNode)\n cursor.setSelection()\n return cursor\n }\n\n // Surround the selection with characters like quotes.\n //\n // @param {String} E.g. '«'\n // @param {String} E.g. '»'\n surround (startCharacter, endCharacter) {\n this.range = content.surround(this.host, this.range, startCharacter, endCharacter)\n this.setSelection()\n }\n\n removeSurround (startCharacter, endCharacter) {\n this.range = content.deleteCharacter(this.host, this.range, startCharacter)\n this.range = content.deleteCharacter(this.host, this.range, endCharacter)\n this.setSelection()\n }\n\n removeChars (chars = []) {\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n this.range = content.deleteCharacter(this.host, this.range, char)\n }\n this.setSelection()\n }\n\n toggleSurround (startCharacter, endCharacter) {\n if (this.containsString(startCharacter) &&\n this.containsString(endCharacter)) {\n this.removeSurround(startCharacter, endCharacter)\n } else {\n this.surround(startCharacter, endCharacter)\n }\n }\n\n // @param {String} selector. An element selector, e.g. 'a' or 'span.some-class'\n // that represents elements to be removed; if undefined,\n // remove all.\n removeFormatting (selector) {\n this.range = content.removeFormatting(this.host, this.range, selector)\n this.setSelection()\n }\n\n // Delete the farest ancestor that is an exact selection\n //\n // @return Selection instance\n deleteExactSurroundingTags () {\n const ancestorTags = this.getAncestorTags().reverse()\n for (const ancestorTag of ancestorTags) {\n if (this.isExactSelection(ancestorTag)) {\n ancestorTag.remove()\n break\n }\n }\n return new Selection(this.host, this.range)\n }\n\n // Delete all the tags whose text is completely within the current selection.\n //\n // @return Selection instance\n deleteContainedTags () {\n const containedTags = this.getContainedTags()\n containedTags.forEach(containedTag => containedTag.remove())\n return new Selection(this.host, this.range)\n }\n\n // Delete the contents inside the range and exact surrounding markups.\n // After that the selection will be a cursor.\n //\n // @return Cursor instance\n deleteContent () {\n this.range.deleteContents()\n return new Cursor(this.host, this.range)\n }\n\n // Expand the current selection.\n //\n // @param {DOM Node}\n expandTo (elem) {\n this.range = content.expandTo(this.host, this.range, elem)\n this.setSelection()\n }\n\n // Collapse the selection at the beginning of the selection\n //\n // @return Cursor instance\n collapseAtBeginning (elem) {\n this.range.collapse(true)\n this.setSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Collapse the selection at the end of the selection\n //\n // @return Cursor instance\n collapseAtEnd (elem) {\n this.range.collapse(false)\n this.setSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Wrap the selection with the specified tag. If any other tag with\n // the same tagName is affecting the selection this tag will be\n // remove first.\n forceWrap (elem) {\n if (block.isPlainTextBlock(this.host)) return\n if (this.range.collapsed) return\n elem = this.adoptElement(elem)\n this.range = content.forceWrap(this.host, this.range, elem)\n this.setSelection()\n }\n\n // Check if the selection is the same as the elements contents.\n //\n // @method isExactSelection\n // @param {DOM Node}\n // @param {flag: undefined or 'visible'} if 'visible' is passed\n // whitespaces at the beginning or end of the selection will\n // be ignored.\n // @return {Boolean}\n isExactSelection (elem, onlyVisible) {\n return content.isExactSelection(this.range, elem, onlyVisible)\n }\n\n // Check if the selection contains the passed string.\n //\n // @method containsString\n // @return {Boolean}\n containsString (str) {\n return content.containsString(this.range, str)\n }\n\n // Delete all occurrences of the specified character from the\n // selection.\n deleteCharacter (character) {\n this.range = content.deleteCharacter(this.host, this.range, character)\n this.setSelection()\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import Cursor from './cursor'\nimport Selection from './selection'\n\n/** RangeContainer\n *\n * primarily used to compare ranges\n * its designed to work with undefined ranges as well\n * so we can easily compare them without checking for undefined\n * all the time\n */\n\nexport default class RangeContainer {\n constructor (editableHost, rangyRange) {\n this.host = editableHost && editableHost.jquery\n ? editableHost[0]\n : editableHost\n this.range = rangyRange\n this.isAnythingSelected = (rangyRange !== undefined)\n this.isCursor = (this.isAnythingSelected && rangyRange.collapsed)\n this.isSelection = (this.isAnythingSelected && !this.isCursor)\n }\n\n getCursor () {\n if (this.isCursor) return new Cursor(this.host, this.range)\n }\n\n getSelection () {\n if (this.isSelection) return new Selection(this.host, this.range)\n }\n\n forceCursor () {\n if (!this.isSelection) return this.getCursor()\n return this.getSelection().deleteContent()\n }\n\n isDifferentFrom (otherRangeContainer = new RangeContainer()) {\n const self = this.range\n const other = otherRangeContainer.range\n if (self && other) return !self.equals(other)\n if (!self && !other) return false\n return true\n }\n}\n","import rangy from 'rangy'\n\nimport * as parser from './parser'\nimport RangeContainer from './range-container'\nimport Cursor from './cursor'\nimport Selection from './selection'\n\n/**\n * The SelectionWatcher module watches for selection changes inside\n * of editable blocks.\n *\n * @module core\n * @submodule selectionWatcher\n */\n\nexport default class SelectionWatcher {\n constructor (dispatcher, win) {\n this.dispatcher = dispatcher\n this.win = win || window\n this.rangySelection = undefined\n this.currentSelection = undefined\n this.currentRange = undefined\n }\n\n /**\n * Updates the internal selection pointer to the current rangy selection.\n * Returns true if no exception occurred.\n */\n syncSelection () {\n // it is possible that rangy has a problem with the nativeSelection\n try {\n this.rangySelection = rangy.getSelection(this.win)\n } catch (err) {\n return false\n }\n\n return true\n }\n\n /**\n * Return a RangeContainer if the current selection is within an editable\n * otherwise return an empty RangeContainer\n */\n getRangeContainer () {\n const successfulSync = this.syncSelection()\n\n // rangeCount is 0 or 1 in all browsers except firefox\n // firefox can work with multiple ranges\n // (on a mac hold down the command key to select multiple ranges)\n if (this.rangySelection.rangeCount && successfulSync) {\n const range = this.rangySelection.getRangeAt(0)\n const hostNode = parser.getHost(range.commonAncestorContainer)\n if (hostNode) return new RangeContainer(hostNode, range)\n }\n\n // return an empty range container\n return new RangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return RangeContainer instance\n */\n getFreshRange () {\n return this.getRangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getFreshSelection () {\n const range = this.getRangeContainer()\n\n return range.isCursor\n ? range.getCursor(this.win)\n : range.getSelection(this.win)\n }\n\n /**\n * Get the selection set by the last selectionChanged event.\n * Sometimes the event does not fire fast enough and the selection\n * you get is not the one the user sees.\n * In those cases use #getFreshSelection()\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getSelection () {\n return this.currentSelection\n }\n\n forceCursor () {\n const range = this.getRangeContainer()\n return range.forceCursor()\n }\n\n selectionChanged () {\n const newRange = this.getRangeContainer()\n if (newRange.isDifferentFrom(this.currentRange)) {\n const lastSelection = this.currentSelection\n this.currentRange = newRange\n\n // empty selection or cursor\n if (lastSelection) {\n if (lastSelection.isCursor && !this.currentRange.isCursor) {\n this.dispatcher.notify('cursor', lastSelection.host)\n } else if (lastSelection.isSelection && !this.currentRange.isSelection) {\n this.dispatcher.notify('selection', lastSelection.host)\n }\n }\n\n // set new selection or cursor and fire event\n if (this.currentRange.isCursor) {\n this.currentSelection = new Cursor(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('cursor', this.currentSelection.host, this.currentSelection)\n } else if (this.currentRange.isSelection) {\n this.currentSelection = new Selection(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('selection', this.currentSelection.host, this.currentSelection)\n } else {\n this.currentSelection = undefined\n }\n }\n }\n}\n","import rangy from 'rangy'\n\nimport {contenteditableSpanBug} from './feature-detection'\nimport * as nodeType from './node-type'\nimport eventable from './eventable'\n\n/**\n * The Keyboard module defines an event API for key events.\n */\n\nexport default class Keyboard {\n constructor (selectionWatcher) {\n eventable(this)\n this.selectionWatcher = selectionWatcher\n }\n\n dispatchKeyEvent (event, target, notifyCharacterEvent) {\n switch (event.keyCode) {\n case this.key.left:\n return this.notify(target, 'left', event)\n\n case this.key.right:\n return this.notify(target, 'right', event)\n\n case this.key.up:\n return this.notify(target, 'up', event)\n\n case this.key.down:\n return this.notify(target, 'down', event)\n\n case this.key.tab:\n if (event.shiftKey) return this.notify(target, 'shiftTab', event)\n return this.notify(target, 'tab', event)\n\n case this.key.esc:\n return this.notify(target, 'esc', event)\n\n case this.key.backspace:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'backspace', event)\n\n case this.key.delete:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'delete', event)\n\n case this.key.enter:\n if (event.shiftKey) return this.notify(target, 'shiftEnter', event)\n return this.notify(target, 'enter', event)\n\n case this.key.ctrl:\n case this.key.shift:\n case this.key.alt:\n return\n\n // Metakey\n case 224: // Firefox: 224\n case 17: // Opera: 17\n case 91: // Chrome/Safari: 91 (Left)\n case 93: // Chrome/Safari: 93 (Right)\n return\n\n default:\n // Added here to avoid using fall-through in the switch\n // when b or i are pressed without ctrlKey or metaKey\n if (event.keyCode === this.key.b && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'bold', event)\n }\n if (event.keyCode === this.key.i && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'italic', event)\n }\n\n this.preventContenteditableBug(target, event)\n if (!notifyCharacterEvent) return\n // Don't notify character events as long as either the ctrl or\n // meta key are pressed.\n // see: https://github.com/livingdocsIO/editable.js/pull/125\n if (!event.ctrlKey && !event.metaKey) return this.notify(target, 'character', event)\n }\n }\n\n preventContenteditableBug (target, event) {\n if (!contenteditableSpanBug) return\n if (event.ctrlKey || event.metaKey) return\n\n // This fixes a strange webkit bug that can be reproduced as follows:\n //\n // 1. A node used within a contenteditable has some style, e.g through the\n // following CSS:\n //\n // strong {\n // color: red\n // }\n //\n // 2. A selection starts with the first character of a styled node and ends\n // outside of that node, e.g: \"big beautiful\" is selected in the following\n // html:\n //\n // <p contenteditable=\"true\">\n // Hello <strong>big</strong> beautiful world\n // </p>\n //\n // 3. The user types a letter character to replace \"big beautiful\", e.g. \"x\"\n //\n // Result: Webkits adds <font> and <b> tags:\n //\n // <p contenteditable=\"true\">\n // Hello\n // <font color=\"#ff0000\">\n // <b>f</b>\n // </font>\n // world\n // </p>\n //\n // This bug ONLY happens, if the first character of the node is selected and\n // the selection goes further than the node.\n //\n // Solution:\n //\n // Manually remove the element that would be removed anyway before inserting\n // the new letter.\n const rangyInstance = this.selectionWatcher.getFreshRange()\n if (!rangyInstance.isSelection) return\n\n const nodeToRemove = Keyboard.getNodeToRemove(rangyInstance.range, target)\n if (nodeToRemove) nodeToRemove.remove()\n }\n\n static getNodeToRemove (selectionRange, target) {\n // This function is only used by preventContenteditableBug. It is exposed on\n // the Keyboard constructor for testing purpose only.\n\n // Let's make sure we are in the edge-case, in which the bug happens.\n // The selection does not start at the beginning of a node. We have\n // nothing to do.\n if (selectionRange.startOffset !== 0) return\n\n let startNodeElement = selectionRange.startContainer\n\n // If the node is a textNode, we select its parent.\n if (startNodeElement.nodeType === nodeType.textNode) startNodeElement = startNodeElement.parentNode\n\n // The target is the contenteditable element, which we do not want to replace\n if (startNodeElement === target) return\n\n // We get a range that contains everything within the sartNodeElement to test\n // if the selectionRange is within the startNode, we have nothing to do.\n const startNodeRange = rangy.createRange()\n startNodeRange.setStartBefore(startNodeElement.firstChild)\n startNodeRange.setEndAfter(startNodeElement.lastChild)\n if (startNodeRange.containsRange(selectionRange)) return\n\n // If the selectionRange.startContainer was a textNode, we have to make sure\n // that its parent's content starts with this node. Content is either a\n // text node or an element. This is done to avoid false positives like the\n // following one:\n // <strong>foo<em>bar</em>|baz</strong>quux|\n if (selectionRange.startContainer.nodeType === nodeType.textNode) {\n const contentNodeTypes = [nodeType.textNode, nodeType.elementNode]\n let firstContentNode = startNodeElement.firstChild\n\n do {\n if (contentNodeTypes.indexOf(firstContentNode.nodeType) !== -1) break\n } while ((firstContentNode = firstContentNode.nextSibling))\n\n if (firstContentNode !== selectionRange.startContainer) return\n }\n\n // Now we know, that we have to return at least the startNodeElement for\n // removal. But it could be, that we also need to remove its parent, e.g.\n // we need to remove <strong> in the following example:\n // <strong><em>|foo</em>bar</strong>baz|\n const rangeStartingBeforeCurrentElement = selectionRange.cloneRange()\n rangeStartingBeforeCurrentElement.setStartBefore(startNodeElement)\n\n return Keyboard.getNodeToRemove(\n rangeStartingBeforeCurrentElement,\n target\n ) || startNodeElement\n }\n}\n\nKeyboard.key = Keyboard.prototype.key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n tab: 9,\n esc: 27,\n backspace: 8,\n delete: 46,\n enter: 13,\n shift: 16,\n ctrl: 17,\n alt: 18,\n b: 66,\n i: 73\n}\n","import {selectionchange} from './feature-detection'\nimport * as clipboard from './clipboard'\nimport eventable from './eventable'\nimport SelectionWatcher from './selection-watcher'\nimport config from './config'\nimport Keyboard from './keyboard'\nimport {closest} from './util/dom'\nimport {replaceLast, endsWithSingleSpace} from './util/string'\n\n// This will be set to true once we detect the input event is working.\n// Input event description on MDN:\n// https://developer.mozilla.org/en-US/docs/Web/Reference/Events/input\nlet isInputEventSupported = false\n\n/**\n * The Dispatcher module is responsible for dealing with events and their handlers.\n *\n * @module core\n * @submodule dispatcher\n */\nexport default class Dispatcher {\n\n constructor (editable) {\n const win = editable.win\n eventable(this, editable)\n this.supportsInputEvent = false\n this.document = win.document\n this.config = editable.config\n this.editable = editable\n this.editableSelector = editable.editableSelector\n this.selectionWatcher = new SelectionWatcher(this, win)\n this.keyboard = new Keyboard(this.selectionWatcher)\n this.activeListeners = []\n this.setup()\n this.getEditableBlockByEvent = (evt) => closest(evt.target, editable.editableSelector)\n }\n\n setupDocumentListener (event, func, capture = false) {\n const listener = {event, listener: func.bind(this), capture}\n this.activeListeners.push(listener)\n\n this.document.addEventListener(event, listener.listener, capture)\n return this\n }\n\n /**\n * Sets up all events that Editable.JS is catching.\n *\n * @method setup\n */\n setup () {\n // setup all events listeners and keyboard handlers\n this.setupKeyboardEvents()\n this.setupEventListeners()\n }\n\n unload () {\n this.off()\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n suspend () {\n if (this.suspended) return\n this.suspended = true\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n continue () {\n if (!this.suspended) return\n this.suspended = false\n this.setupEventListeners()\n }\n\n setupEventListeners () {\n this.setupElementListeners()\n this.setupKeydownListener()\n\n if (selectionchange) {\n this.setupSelectionChangeListeners()\n } else {\n this.setupSelectionChangeFallbackListeners()\n }\n }\n\n /**\n * Sets up events that are triggered on modifying an element.\n *\n * @method setupElementListeners\n */\n setupElementListeners () {\n this\n .setupDocumentListener('focus', function focusListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (evt.target.getAttribute(config.pastingAttribute)) return\n this.selectionWatcher.syncSelection()\n this.notify('focus', block)\n }, true)\n .setupDocumentListener('blur', function blurListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (block.getAttribute(config.pastingAttribute)) return\n this.notify('blur', block)\n }, true)\n .setupDocumentListener('copy', function copyListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'copy', selection)\n }\n })\n .setupDocumentListener('cut', function cutListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'cut', selection)\n this.triggerChangeEvent(block)\n }\n })\n .setupDocumentListener('paste', function pasteListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n\n evt.preventDefault()\n const selection = this.selectionWatcher.getFreshSelection()\n const clipboardContent = evt.clipboardData.getData('text/html') || evt.clipboardData.getData('text/plain')\n\n const {blocks, cursor} = clipboard.paste(block, selection, clipboardContent)\n if (blocks.length) {\n if (endsWithSingleSpace(evt.target.innerText)) {\n cursor.retainVisibleSelection(() => {\n block.innerHTML = replaceLast(block.innerHTML, '&nbsp;', ' ')\n })\n }\n this.notify('paste', block, blocks, cursor)\n // The input event does not fire when we process the content manually\n // and insert it via script\n this.notify('change', block)\n } else {\n cursor.setVisibleSelection()\n }\n })\n .setupDocumentListener('input', function inputListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (isInputEventSupported) {\n this.notify('change', block)\n } else {\n // Most likely the event was already handled manually by\n // triggerChangeEvent so the first time we just switch the\n // isInputEventSupported flag without notifying the change event.\n isInputEventSupported = true\n }\n })\n\n .setupDocumentListener('formatEditable', function formatEditableListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n this.notify('change', block)\n })\n }\n\n /**\n * Trigger a change event\n *\n * This should be done in these cases:\n * - typing a letter\n * - delete (backspace and delete keys)\n * - cut\n * - paste\n * - copy and paste (not easily possible manually as far as I know)\n *\n * Preferably this is done using the input event. But the input event is not\n * supported on all browsers for contenteditable elements.\n * To make things worse it is not detectable either. So instead of detecting\n * we set 'isInputEventSupported' when the input event fires the first time.\n */\n triggerChangeEvent (target) {\n if (isInputEventSupported) return\n this.notify('change', target)\n }\n\n dispatchSwitchEvent (event, element, direction) {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return\n const cursor = this.selectionWatcher.getFreshSelection()\n if (!cursor || cursor.isSelection) return\n\n // store position\n if (!this.switchContext) {\n this.switchContext = {\n positionX: cursor.getBoundingClientRect().left,\n events: ['cursor']\n }\n } else {\n this.switchContext.events = ['cursor']\n }\n\n if (direction === 'up' && cursor.isAtFirstLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n\n if (direction === 'down' && cursor.isAtLastLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n }\n\n /**\n * Sets up listener for keydown event which forwards events to\n * the Keyboard instance.\n *\n * @method setupKeydownListener\n */\n setupKeydownListener () {\n this.setupDocumentListener('keydown', function (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const notifyCharacterEvent = !isInputEventSupported\n this.keyboard.dispatchKeyEvent(evt, block, notifyCharacterEvent)\n }, true)\n }\n\n /**\n * Sets up handlers for the keyboard events.\n * Keyboard definitions are in {{#crossLink \"Keyboard\"}}{{/crossLink}}.\n *\n * @method setupKeyboardEvents\n */\n setupKeyboardEvents () {\n const self = this\n\n this.keyboard\n .on('up', function (event) {\n self.dispatchSwitchEvent(event, this, 'up')\n })\n\n .on('down', function (event) {\n self.dispatchSwitchEvent(event, this, 'down')\n })\n\n .on('backspace', function (event) {\n const range = self.selectionWatcher.getFreshRange()\n if (!range.isCursor) return self.triggerChangeEvent(this)\n\n const cursor = range.getCursor()\n if (!cursor.isAtBeginning()) return self.triggerChangeEvent(this)\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'before', cursor)\n })\n\n .on('delete', function (event) {\n const range = self.selectionWatcher.getFreshRange()\n if (!range.isCursor) return self.triggerChangeEvent(this)\n\n const cursor = range.getCursor()\n if (!cursor.isAtTextEnd()) return self.triggerChangeEvent(this)\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'after', cursor)\n })\n\n .on('enter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const range = self.selectionWatcher.getFreshRange()\n const cursor = range.forceCursor()\n\n if (cursor.isAtTextEnd()) {\n self.notify('insert', this, 'after', cursor)\n } else if (cursor.isAtBeginning()) {\n self.notify('insert', this, 'before', cursor)\n } else {\n self.notify('split', this, cursor.before(), cursor.after(), cursor)\n }\n })\n\n .on('shiftEnter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const cursor = self.selectionWatcher.forceCursor()\n self.notify('newline', this, cursor)\n })\n\n .on('bold', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleBold', selection)\n }\n })\n\n .on('italic', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleEmphasis', selection)\n }\n })\n\n .on('character', function (event) {\n self.notify('change', this)\n })\n }\n\n /**\n * Sets up events that are triggered on a selection change.\n *\n * @method setupSelectionChangeListeners\n */\n setupSelectionChangeListeners () {\n let selectionDirty = false\n let suppressSelectionChanges = false\n const selectionWatcher = this.selectionWatcher\n\n // fires on mousemove (thats probably a bit too much)\n // catches changes like 'select all' from context menu\n this.setupDocumentListener('selectionchange', (evt) => {\n const cursor = this.selectionWatcher.getFreshSelection()\n\n if (cursor && cursor.isSelection && cursor.isAtBeginning() && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'both')\n } else if (cursor && cursor.isSelection && cursor.isAtBeginning()) {\n this.notify('selectToBoundary', cursor.host, evt, 'start')\n } else if (cursor && cursor.isSelection && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'end')\n }\n\n if (suppressSelectionChanges) {\n selectionDirty = true\n } else {\n selectionWatcher.selectionChanged()\n }\n })\n\n // listen for selection changes by mouse so we can\n // suppress the selectionchange event and only fire the\n // change event on mouseup\n this.setupDocumentListener('mousedown', function (evt) {\n if (!this.getEditableBlockByEvent(evt)) return\n if (this.config.mouseMoveSelectionChanges === false) {\n suppressSelectionChanges = true\n\n // Without this timeout the previous selection is active\n // until the mouseup event (no. not good).\n setTimeout(() => selectionWatcher.selectionChanged(), 0)\n }\n\n this.document.addEventListener('mouseup', () => {\n suppressSelectionChanges = false\n\n if (selectionDirty) {\n selectionDirty = false\n selectionWatcher.selectionChanged()\n }\n }, {\n capture: true,\n once: true\n })\n })\n }\n\n /**\n * Fallback solution to support selection change events on browsers that don't\n * support selectionChange.\n *\n * @method setupSelectionChangeFallbackListeners\n */\n setupSelectionChangeFallbackListeners () {\n // listen for selection changes by mouse\n this.setupDocumentListener('mouseup', () => {\n // In Opera when clicking outside of a block\n // it does not update the selection as it should\n // without the timeout\n setTimeout(() => this.selectionWatcher.selectionChanged(), 0)\n })\n\n // listen for selection changes by keys\n this.setupDocumentListener('keyup', (evt) => {\n if (!this.getEditableBlockByEvent(evt)) return\n // when pressing Command + Shift + Left for example the keyup is only triggered\n // after at least two keys are released. Strange. The culprit seems to be the\n // Command key. Do we need a workaround?\n this.selectionWatcher.selectionChanged()\n })\n }\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import * as content from '../../content'\n\n/**\n* Spellcheck class.\n*\n* @class Spellcheck\n* @constructor\n*/\nexport default class SpellcheckService {\n\n constructor (spellcheckService) {\n this.spellcheckService = spellcheckService\n }\n\n check (text, callback) {\n if (!text) return callback(null)\n\n const condensedText = content.normalizeWhitespace(text)\n\n this.spellcheckService(condensedText, (misspelledWords) => {\n if (misspelledWords && misspelledWords.length > 0) {\n callback(null, misspelledWords)\n } else {\n callback(null)\n }\n })\n }\n\n}\n","// See: https://en.wikipedia.org/wiki/Whitespace_character\n\nconst characters = {\n 'A0': 'no-break space', // \\\\u00A0\n '2000': 'en quad', // \\\\u2000\n '2001': 'em quad', // \\\\u2001\n '2002': 'en space', // \\\\u2002\n '2003': 'em space', // \\\\u2003\n '2004': 'three-per-em space', // \\\\u2004\n '2005': 'four-per-em space', // \\\\u2005\n '2006': 'six-per-em space', // \\\\u2006\n '2007': 'figure space', // \\\\u2007\n '2008': 'punctuation space', // \\\\u2008\n '2009': 'thin space', // \\\\u2009\n '200A': 'hair space', // \\\\u200A\n '202F': 'narrow no-break space', // \\\\u202F\n '205F': 'medium mathematical space', // \\\\u205F\n '3000': 'ideographic space' // \\\\u3000\n}\n\n// The no-break space is not highlighted as this can cause problems.\n// Browser can insert no-break spaces when typing at the end of\n// a paragraph and the highlighting prevents browsers from converting\n// the no-break space back to a normal space when the user keeps typing.\nconst specialWhitespaceChars = '\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000'\n\nexport default class WhitespaceHighlighting {\n\n constructor (markerNode) {\n this.marker = markerNode\n }\n\n findMatches (text) {\n if (!text) return\n\n let regex = `[${specialWhitespaceChars}]`\n regex = new RegExp(regex, 'g')\n\n const matches = []\n let match\n while ((match = regex.exec(text))) matches.push(match)\n\n return matches.map((entry) => this.prepareMatch(entry))\n }\n\n prepareMatch (match) {\n const startIndex = match.index\n const unicode = getUnicode(match[0])\n const description = characters[unicode]\n return {\n startIndex,\n endIndex: startIndex + match.length,\n match: match[0],\n title: `${description} (\\\\u${unicode})`,\n marker: this.marker\n }\n }\n}\n\nfunction getUnicode (character) {\n const code = character.charCodeAt(0)\n return `${code.toString(16).toUpperCase()}`\n}\n","export default class MatchCollection {\n\n constructor () {\n this.matches = []\n }\n\n addMatches (name, matches) {\n if (!matches || !matches.length) return\n\n this.matches = mergeMatches(this.matches, matches)\n }\n\n}\n\n// Private Helpers\n// ---------------\n\nfunction mergeMatches (matches1, matches2) {\n let next\n const length1 = matches1.length\n const length2 = matches2.length\n let lastEndIndex = -1\n const output = []\n\n const state = {\n a1: matches1,\n i1: 0,\n a2: matches2,\n i2: 0\n }\n\n while (state.i1 < length1 || state.i2 < length2) {\n next = pickNext(state)\n if (next.startIndex >= lastEndIndex) {\n output.push(next)\n }\n lastEndIndex = next.endIndex\n }\n\n return output\n}\n\nfunction pickNext (state) {\n const i1 = state.i1\n const i2 = state.i2\n const item1 = state.a1[i1]\n const item2 = state.a2[i2]\n\n if (item1 && item2 && item1.startIndex < item2.startIndex) {\n state.i1 = i1 + 1\n return item1\n } else if (item1 && item2) {\n state.i2 = i2 + 1\n return item2\n } else if (item1) {\n state.i1 = i1 + 1\n return item1\n } else if (item2) {\n state.i2 = i2 + 1\n return item2\n } else {\n return undefined\n }\n}\n","import _merge from 'lodash-es/merge'\nimport * as nodeType from './node-type'\nimport * as content from './content'\nimport highlightText from './highlight-text'\nimport SpellcheckService from './plugins/highlighting/spellcheck-service'\nimport WhitespaceHighlighting from './plugins/highlighting/whitespace-highlighting'\nimport WordHighlighting from './plugins/highlighting/text-highlighting'\nimport MatchCollection from './plugins/highlighting/match-collection'\nimport highlightSupport from './highlight-support'\nimport {domArray, domSelector} from './util/dom'\n\nexport default class Highlighting {\n\n constructor (editable, configuration, spellcheckConfig) {\n this.editable = editable\n this.win = editable.win\n this.focusedEditableHost = undefined\n this.currentlyCheckedEditableHost = undefined\n this.timeout = {}\n\n const defaultConfig = {\n checkOnInit: false,\n checkOnFocus: false,\n checkOnChange: true,\n // unbounce rate in ms before calling the spellcheck service after changes\n throttle: 1000,\n // remove highlights after a change if the cursor is inside a highlight\n removeOnCorrection: true,\n spellcheck: {\n marker: '<span class=\"highlight-spellcheck\"></span>',\n throttle: 1000,\n spellcheckService: function () {}\n },\n whitespace: {\n marker: '<span class=\"highlight-whitespace\"></span>'\n }\n }\n\n this.config = _merge({}, defaultConfig, configuration)\n\n const spellcheckService = this.config.spellcheck.spellcheckService\n const spellcheckMarker = this.config.spellcheck.marker\n const whitespaceMarker = this.config.whitespace.marker\n const spellcheckMarkerNode = highlightSupport\n .createMarkerNode(spellcheckMarker, 'spellcheck', this.win)\n const whitespaceMarkerNode = highlightSupport\n .createMarkerNode(whitespaceMarker, 'spellcheck', this.win)\n\n this.spellcheckService = new SpellcheckService(spellcheckService)\n this.spellcheck = new WordHighlighting(spellcheckMarkerNode)\n this.whitespace = new WhitespaceHighlighting(whitespaceMarkerNode)\n\n this.setupListeners()\n }\n\n // Events\n // ------\n\n setupListeners () {\n if (this.config.checkOnFocus) {\n this.editable.on('focus', (...args) => this.onFocus(...args))\n this.editable.on('blur', (...args) => this.onBlur(...args))\n }\n if (this.config.checkOnChange || this.config.removeOnCorrection) {\n this.editable.on('change', (...args) => this.onChange(...args))\n }\n if (this.config.checkOnInit) {\n this.editable.on('init', (...args) => this.onInit(...args))\n }\n }\n\n onInit (editableHost) {\n this.highlight(editableHost)\n }\n\n onFocus (editableHost) {\n if (this.focusedEditableHost !== editableHost) {\n this.focusedEditableHost = editableHost\n this.editableHasChanged(editableHost)\n }\n }\n\n onBlur (editableHost) {\n if (this.focusedEditableHost === editableHost) {\n this.focusedEditableHost = undefined\n }\n }\n\n onChange (editableHost) {\n if (this.config.checkOnChange) {\n this.editableHasChanged(editableHost, this.config.throttle)\n }\n if (this.config.removeOnCorrection) {\n this.removeHighlightsAtCursor(editableHost)\n }\n }\n\n // Manage Highlights\n // -----------------\n\n editableHasChanged (editableHost, throttle) {\n if (this.timeout.id && this.timeout.editableHost === editableHost) {\n clearTimeout(this.timeout.id)\n }\n\n const timeoutId = setTimeout(() => {\n this.highlight(editableHost)\n\n this.timeout = {}\n }, throttle || 0)\n\n this.timeout = {\n id: timeoutId,\n editableHost: editableHost\n }\n }\n\n highlight (editableHost) {\n let text = highlightText.extractText(editableHost)\n\n // getSpellcheck\n this.spellcheckService.check(text, (err, misspelledWords) => {\n if (err) { return }\n\n // refresh the text\n text = highlightText.extractText(editableHost)\n\n const matchCollection = new MatchCollection()\n\n let matches = this.spellcheck.findMatches(text, misspelledWords)\n matchCollection.addMatches('spellcheck', matches)\n\n matches = this.whitespace.findMatches(text)\n matchCollection.addMatches('whitespace', matches)\n\n this.safeHighlightMatches(editableHost, matchCollection.matches)\n })\n }\n\n // Calls highlightMatches internally but ensures\n // that the selection stays the same\n safeHighlightMatches (editableHost, matches) {\n const selection = this.editable.getSelection(editableHost)\n if (selection) {\n selection.retainVisibleSelection(() => {\n this.highlightMatches(editableHost, matches)\n })\n } else {\n this.highlightMatches(editableHost, matches)\n }\n if (this.editable.dispatcher) {\n this.editable.dispatcher.notify('spellcheckUpdated', editableHost)\n }\n }\n\n highlightMatches (editableHost, matches) {\n // Remove old highlights\n this.removeHighlights(editableHost)\n\n // Create new highlights\n if (matches && matches.length > 0) {\n // const span = this.createMarkerNode()\n highlightText.highlightMatches(editableHost, matches)\n }\n }\n\n removeHighlights (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n for (const elem of domArray('[data-highlight=\"spellcheck\"]', editableHost)) {\n content.unwrap(elem)\n }\n }\n\n removeHighlightsAtCursor (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n const selection = this.editable.getSelection(editableHost)\n if (selection && selection.isCursor) {\n let elementAtCursor = selection.range.startContainer\n if (elementAtCursor.nodeType === nodeType.textNode) {\n elementAtCursor = elementAtCursor.parentNode\n }\n\n let wordId\n do {\n if (elementAtCursor === editableHost) return\n const highlightType = elementAtCursor.getAttribute('data-highlight')\n if (highlightType === 'spellcheck') {\n wordId = elementAtCursor.getAttribute('data-word-id')\n break\n }\n } while ((elementAtCursor = elementAtCursor.parentNode))\n\n if (wordId) {\n selection.retainVisibleSelection(() => {\n for (const elem of domArray(`[data-word-id=\"${wordId}\"]`, editableHost)) {\n content.unwrap(elem)\n }\n })\n }\n }\n }\n\n}\n","import config from '../config'\n\n// Allows for safe console logging\n// If the last param is the string \"trace\" console.trace will be called\n// configuration: disable with config.log = false\nexport default function log () {\n if (config.log === false) return\n\n if (!global.console) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (arguments.length !== 1 && args[args.length - 1] === 'trace') {\n args.pop()\n if (console.trace) console.trace()\n }\n\n return console.log(args)\n}\n","'use strict'\nimport NodeIterator from '../node-iterator'\n\nexport function textNodesUnder (node) {\n const iterator = new NodeIterator(node, 'getNextTextNode')\n return [...iterator]\n}\n\n// NOTE: if there is only one text node, then just that node and\n// the abs offset are returned\nexport function getTextNodeAndRelativeOffset ({textNodes, absOffset}) {\n let cumulativeOffset = 0\n let relativeOffset = 0\n let targetNode\n for (let i = 0; i < textNodes.length; i++) {\n const node = textNodes[i]\n if (absOffset <= cumulativeOffset + node.textContent.length) {\n targetNode = node\n relativeOffset = absOffset - cumulativeOffset\n break\n }\n cumulativeOffset += node.textContent.length\n }\n return {node: targetNode, relativeOffset}\n}\n\nexport function getTotalCharCount (element) {\n const textNodes = textNodesUnder(element)\n const reducer = (acc, node) => acc + node.textContent.length\n return textNodes.reduce(reducer, 0)\n}\n","'use strict'\nimport {getTotalCharCount, textNodesUnder, getTextNodeAndRelativeOffset} from './element'\n\n/**\n * This is a binary search algorithm implementation aimed at finding\n * a character offset position in a consecutive strings of characters\n * over several lines.\n *\n * Refer to this page in order to learn more about binary search:\n * https://en.wikipedia.org/wiki/Binary_search_algorithm\n *\n * @returns {object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\nexport function binaryCursorSearch ({\n host,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX // coordinates relative to viewport (e.g. from getBoundingClientRect())\n}) {\n const hostRange = host.ownerDocument.createRange()\n hostRange.selectNodeContents(host)\n const hostCoords = hostRange.getBoundingClientRect()\n const totalCharCount = getTotalCharCount(host)\n const textNodes = textNodesUnder(host)\n\n // early terminate on empty editables\n if (totalCharCount === 0) return {wasFound: false}\n\n const data = {\n currentOffset: Math.floor(totalCharCount / 2),\n leftLimit: 0,\n rightLimit: totalCharCount\n }\n\n let offset = data.currentOffset\n let distance\n let safety = 20\n while (data.leftLimit < data.rightLimit && safety > 0) {\n safety = safety -= 1\n offset = data.currentOffset\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n distance = Math.abs(coords.left - positionX)\n\n // up / down axis\n if (requiredOnFirstLine && hostCoords.top !== coords.top) {\n moveLeft(data)\n continue\n } else if (requiredOnLastLine && hostCoords.bottom !== coords.bottom) {\n moveRight(data)\n continue\n }\n\n // left / right axis\n if (positionX < coords.left) {\n moveLeft(data)\n } else {\n moveRight(data)\n }\n }\n\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n const finalDistance = Math.abs(coords.left - positionX)\n\n // Decide if last or second last offset is closest\n if (finalDistance < distance) {\n distance = finalDistance\n offset = data.currentOffset\n }\n\n return {distance, offset, wasFound: true}\n}\n\n// move the binary search index in between the current position and the left limit\nfunction moveLeft (data) {\n data.rightLimit = data.currentOffset\n data.currentOffset = Math.floor((data.currentOffset + data.leftLimit) / 2)\n}\n// move the binary search index in between the current position and the right limit\nfunction moveRight (data) {\n data.leftLimit = data.currentOffset\n data.currentOffset = Math.ceil((data.currentOffset + data.rightLimit) / 2)\n}\n\nfunction createRangeAtCharacterOffset ({textNodes, offset}) {\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n\n const newRange = node.ownerDocument.createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n return newRange\n}\n","import rangy from 'rangy'\nimport config from './config'\nimport error from './util/error'\nimport * as parser from './parser'\nimport * as block from './block'\nimport * as content from './content'\nimport * as clipboard from './clipboard'\nimport Dispatcher from './dispatcher'\nimport Cursor from './cursor'\nimport highlightSupport from './highlight-support'\nimport Highlighting from './highlighting'\nimport createDefaultEvents from './create-default-events'\nimport browser from 'bowser'\nimport {textNodesUnder, getTextNodeAndRelativeOffset} from './util/element'\nimport {binaryCursorSearch} from './util/binary_search'\nimport {domArray} from './util/dom'\n\n/**\n * The Core module provides the Editable class that defines the Editable.JS\n * API and is the main entry point for Editable.JS.\n * It also provides the cursor module for cross-browser cursors, and the dom\n * submodule.\n *\n * @module core\n */\n\n/**\n * Constructor for the Editable.JS API that is externally visible.\n *\n * @param {Object} configuration for this editable instance.\n * window: The window where to attach the editable events.\n * defaultBehavior: {Boolean} Load default-behavior.js.\n * mouseMoveSelectionChanges: {Boolean} Whether to get cursor and selection events on mousemove.\n * browserSpellcheck: {Boolean} Set the spellcheck attribute on editable elements\n *\n * @class Editable\n */\nexport class Editable {\n\n constructor (instanceConfig) {\n const defaultInstanceConfig = {\n window: window,\n defaultBehavior: true,\n mouseMoveSelectionChanges: false,\n browserSpellcheck: true\n }\n\n this.config = Object.assign(defaultInstanceConfig, instanceConfig)\n this.win = this.config.window\n this.editableSelector = `.${config.editableClass}`\n\n if (!rangy.initialized) {\n rangy.init()\n }\n\n this.dispatcher = new Dispatcher(this)\n if (this.config.defaultBehavior === true) {\n this.dispatcher.on(createDefaultEvents(this))\n }\n }\n\n /**\n * @returns the default Editable configs from config.js\n */\n static getGlobalConfig () {\n return config\n }\n\n /**\n * Set configuration options that affect all editable\n * instances.\n *\n * @param {Object} global configuration options (defaults are defined in config.js)\n * log: {Boolean}\n * logErrors: {Boolean}\n * editableClass: {String} e.g. 'js-editable'\n * editableDisabledClass: {String} e.g. 'js-editable-disabled'\n * pastingAttribute: {String} default: e.g. 'data-editable-is-pasting'\n * boldTag: e.g. '<strong>'\n * italicTag: e.g. '<em>'\n */\n static globalConfig (globalConfig) {\n Object.assign(config, globalConfig)\n clipboard.updateConfig(config)\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n * Opposite of {{#crossLink \"Editable/remove\"}}{{/crossLink}}.\n * Calls dispatcher.setup to setup all event listeners.\n *\n * @method add\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be added on.\n * @param {normalize, plainText} options Block specific configuration\n * @chainable\n */\n add (target, options) {\n this.enable(target, options)\n // TODO check css whitespace settings\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * Opposite of {{#crossLink \"Editable/add\"}}{{/crossLink}}.\n *\n * @method remove\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be removed from.\n * @chainable\n */\n remove (target) {\n const targets = domArray(target, this.win.document)\n\n this.disable(targets)\n\n for (const element of targets) {\n element.classList.remove(config.editableDisabledClass)\n }\n\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * The target elements are marked as disabled.\n *\n * @method disable\n * @param { HTMLElement | undefined } elem editable root element(s)\n * If no param is specified all editables are disabled.\n * @chainable\n */\n disable (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n block.disable(element)\n }\n\n return this\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n *\n * @method enable\n * @param { HTMLElement | undefined } target editable root element(s)\n * If no param is specified all editables marked as disabled are enabled.\n * @param {boolean} normalize normalizes target content (legacy param)\n * @param {boolean} options.normalize normalizes target content\n * @param {boolean} options.plainText prevents text formatting for block\n * @chainable\n */\n enable (target, options) {\n const {\n normalize = typeof options === 'boolean' ? options : false,\n plainText = false\n } = options ?? {}\n const shouldSpellcheck = this.config.browserSpellcheck\n const targets = domArray(target || `.${config.editableDisabledClass}`, this.win.document)\n\n for (const element of targets) {\n block.init(element, {normalize, plainText, shouldSpellcheck})\n this.dispatcher.notify('init', element)\n }\n\n return this\n }\n\n /**\n * Temporarily disable an editable.\n * Can be used to prevent text selection while dragging an element\n * for example.\n *\n * @method suspend\n * @param { HTMLElement | undefined } target\n */\n suspend (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.removeAttribute('contenteditable')\n }\n\n this.dispatcher.suspend()\n return this\n }\n\n /**\n * Reverse the effects of suspend()\n *\n * @method continue\n * @param { HTMLElement | undefined } target\n */\n continue (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.setAttribute('contenteditable', true)\n }\n\n this.dispatcher.continue()\n return this\n }\n /**\n * Set the cursor inside of an editable block.\n *\n * @method createCursor\n * @param { HTMLElement } element\n * @param { 'beginning' | 'end' | 'before' | 'after' } position\n */\n\n createCursor (element, position = 'beginning') {\n const host = Cursor.findHost(element, this.editableSelector)\n if (!host) return undefined\n\n const range = rangy.createRange()\n\n if (position === 'beginning' || position === 'end') {\n range.selectNodeContents(element)\n range.collapse(position === 'beginning')\n } else if (element !== host) {\n if (position === 'before') {\n range.setStartBefore(element)\n range.setEndBefore(element)\n } else if (position === 'after') {\n range.setStartAfter(element)\n range.setEndAfter(element)\n }\n } else {\n error('EditableJS: cannot create cursor outside of an editable block.')\n }\n\n return new Cursor(host, range)\n }\n\n createCursorAtCharacterOffset ({element, offset}) {\n const textNodes = textNodesUnder(element)\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n const newRange = rangy.createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n const host = Cursor.findHost(element, this.editableSelector)\n const nextCursor = new Cursor(host, newRange)\n\n nextCursor.setVisibleSelection()\n return nextCursor\n }\n\n createCursorAtBeginning (element) {\n return this.createCursor(element, 'beginning')\n }\n\n createCursorAtEnd (element) {\n return this.createCursor(element, 'end')\n }\n\n createCursorBefore (element) {\n return this.createCursor(element, 'before')\n }\n\n createCursorAfter (element) {\n return this.createCursor(element, 'after')\n }\n\n /**\n * Extract the content from an editable host or document fragment.\n * This method will remove all internal elements and ui-elements.\n *\n * @param {DOM node or Document Fragment} The innerHTML of this element or fragment will be extracted.\n * @returns {String} The cleaned innerHTML.\n */\n getContent (element) {\n return content.extractContent(element)\n }\n\n /**\n * @param {String | DocumentFragment} content to append.\n * @returns {Cursor} A new Cursor object just before the inserted content.\n */\n appendTo (inputElement, contentToAppend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'end')\n // TODO create content in the right window\n cursor.insertAfter(typeof contentToAppend === 'string'\n ? content.createFragmentFromString(contentToAppend)\n : contentToAppend\n )\n return cursor\n }\n\n /**\n * @param {String | DocumentFragment} content to prepend\n * @returns {Cursor} A new Cursor object just after the inserted content.\n */\n prependTo (inputElement, contentToPrepend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'beginning')\n // TODO create content in the right window\n cursor.insertBefore(typeof contentToPrepend === 'string'\n ? content.createFragmentFromString(contentToPrepend)\n : contentToPrepend\n )\n return cursor\n }\n\n /**\n * Get the current selection.\n * Only returns something if the selection is within an editable element.\n * If you pass an editable host as param it only returns something if the selection is inside this\n * very editable element.\n *\n * @param {DOMNode} Optional. An editable host where the selection needs to be contained.\n * @returns A Cursor or Selection object or undefined.\n */\n getSelection (editableHost) {\n let selection = this.dispatcher.selectionWatcher.getFreshSelection()\n if (!(editableHost && selection)) return selection\n\n const range = selection.range\n // Check if the selection is inside the editableHost\n // The try...catch is required if the editableHost was removed from the DOM.\n try {\n if (range.compareNode(editableHost) !== range.NODE_BEFORE_AND_AFTER) {\n selection = undefined\n }\n } catch (e) {\n selection = undefined\n }\n\n return selection\n }\n\n /**\n * Enable spellchecking\n *\n * @chainable\n */\n setupHighlighting (hightlightingConfig) {\n this.highlighting = new Highlighting(this, hightlightingConfig)\n\n return this\n }\n\n // For backwards compatibility\n setupSpellcheck (conf) {\n let marker\n\n if (conf.markerNode) {\n marker = conf.markerNode.outerHTML\n }\n\n this.setupHighlighting({\n throttle: conf.throttle,\n spellcheck: {\n marker: marker,\n spellcheckService: conf.spellcheckService\n }\n })\n\n this.spellcheck = {\n checkSpelling: (elem) => {\n this.highlighting.highlight(elem)\n }\n }\n }\n\n /**\n * Highlight text within an editable.\n *\n * By default highlights all occurrences of `text`.\n * Pass it a `textRange` object to highlight a\n * specific text portion.\n *\n * The markup used for the highlighting will be removed\n * from the final content.\n *\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} options.text\n * @param {String} options.highlightId Added to the highlight markups in the property `data-word-id`\n * @param {Object} [options.textRange] An optional range which gets used to set the markers.\n * @param {Number} options.textRange.start\n * @param {Number} options.textRange.end\n * @param {Boolean} options.raiseEvents do throw change events\n * @return {Number} The text-based start offset of the newly applied highlight or `-1` if the range was considered invalid.\n */\n highlight ({editableHost, text, highlightId, textRange, raiseEvents, type = 'comment'}) {\n if (!textRange) {\n return highlightSupport.highlightText(editableHost, text, highlightId, type)\n }\n if (typeof textRange.start !== 'number' || typeof textRange.end !== 'number') {\n error(\n 'Error in Editable.highlight: You passed a textRange object with invalid keys. Expected shape: { start: Number, end: Number }'\n )\n return -1\n }\n if (textRange.start === textRange.end) {\n error(\n 'Error in Editable.highlight: You passed a textRange object with equal start and end offsets, which is considered a cursor and therefore unfit to create a highlight.'\n )\n return -1\n }\n return highlightSupport.highlightRange(editableHost, text, highlightId, textRange.start, textRange.end, raiseEvents ? this.dispatcher : undefined, type)\n }\n\n /**\n * Extracts positions of all DOMNodes that match `[data-word-id]` and the `[data-highlight]`\n *\n * Returns an object where the keys represent a highlight id and the value\n * a text range object of shape:\n * ```\n * { start: number, end: number, text: string}\n * ```\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} [options.type]\n * @return {Object} ranges\n */\n getHighlightPositions ({editableHost, type}) {\n return highlightSupport.extractHighlightedRanges(\n editableHost,\n type\n )\n }\n\n removeHighlight ({editableHost, highlightId, raiseEvents}) {\n highlightSupport.removeHighlight(editableHost, highlightId, raiseEvents ? this.dispatcher : undefined)\n }\n\n decorateHighlight ({editableHost, highlightId, addCssClass, removeCssClass}) {\n highlightSupport.updateHighlight(editableHost, highlightId, addCssClass, removeCssClass)\n }\n\n /**\n * Subscribe a callback function to a custom event fired by the API.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to execute in response to the\n * event.\n *\n * @chainable\n */\n on (event, handler) {\n // TODO throw error if event is not one of EVENTS\n // TODO throw error if handler is not a function\n this.dispatcher.on(event, handler)\n return this\n }\n\n /**\n * Unsubscribe a callback function from a custom event fired by the API.\n * Opposite of {{#crossLink \"Editable/on\"}}{{/crossLink}}.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to remove from the\n * event or the special value false to remove all callbacks.\n *\n * @chainable\n */\n off (...args) {\n this.dispatcher.off.apply(this.dispatcher, args)\n return this\n }\n\n /**\n * Unsubscribe all callbacks and event listeners.\n *\n * @chainable\n */\n unload () {\n this.dispatcher.unload()\n return this\n }\n\n /**\n * Takes coordinates and uses its left value to find out how to offset a character in a string to\n * closely match the coordinates.left value.\n * Takes conditions for the result being on the first line, used when navigating to a paragraph from\n * the above paragraph and being on the last line, used when navigating to a paragraph from the below\n * paragraph.\n *\n * Internally this sets up the methods used for a binary cursor search and calls this.\n *\n * @param {DomNode} element\n * - the editable hostDOM Node to which the cursor jumps\n * @param {object} coordinates\n * - The bounding rect of the preceding cursor to be matched\n * @param {boolean} requiredOnFirstLine\n * - set to true if you want to require the cursor to be on the first line of the paragraph\n * @param {boolean} requiredOnLastLine\n * - set to true if you want to require the cursor to be on the last line of the paragraph\n *\n * @return {Object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\n findClosestCursorOffset ({\n element,\n origCoordinates,\n requiredOnFirstLine = false,\n requiredOnLastLine = false\n }) {\n const positionX = this.dispatcher.switchContext\n ? this.dispatcher.switchContext.positionX\n : origCoordinates.left\n\n return binaryCursorSearch({\n host: element,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX\n })\n }\n}\n\n// Expose modules and editable\nEditable.parser = parser\nEditable.content = content\nEditable.browser = browser\n\n// Set up callback functions for several events.\n;['focus', 'blur', 'flow', 'selection', 'cursor', 'newline',\n 'insert', 'split', 'merge', 'empty', 'change', 'switch',\n 'move', 'clipboard', 'paste', 'spellcheckUpdated', 'selectToBoundary'\n].forEach((name) => {\n // Generate a callback function to subscribe to an event.\n Editable.prototype[name] = function (handler) {\n return this.on(name, handler)\n }\n})\n","import createDefaultBehavior from './create-default-behavior'\n\nexport default function createDefaultEvents (editable) {\n const behavior = createDefaultBehavior(editable)\n\n return {\n /**\n * The focus event is triggered when an element gains focus.\n * The default behavior is to... TODO\n *\n * @event focus\n * @param {HTMLElement} element The element triggering the event.\n */\n focus (element) {\n behavior.focus(element)\n },\n\n /**\n * The blur event is triggered when an element looses focus.\n * The default behavior is to... TODO\n *\n * @event blur\n * @param {HTMLElement} element The element triggering the event.\n */\n blur (element) {\n behavior.blur(element)\n },\n\n /**\n * The flow event is triggered when the user starts typing or pause typing.\n * The default behavior is to... TODO\n *\n * @event flow\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The flow action: \"start\" or \"pause\".\n */\n flow (element, action) {\n behavior.flow(element, action)\n },\n\n /**\n * The selection event is triggered after the user has selected some\n * content.\n * The default behavior is to... TODO\n *\n * @event selection\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n */\n selection (element, selection) {\n behavior.selection(element, selection)\n },\n\n /**\n * The cursor event is triggered after cursor position has changed.\n * The default behavior is to... TODO\n *\n * @event cursor\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual Cursor object.\n */\n cursor (element, cursor) {\n behavior.cursor(element, cursor)\n },\n\n /**\n * The newline event is triggered when a newline should be inserted. This\n * happens when SHIFT+ENTER key is pressed.\n * The default behavior is to add a <br />\n *\n * @event newline\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual cursor object.\n */\n newline (element, cursor) {\n behavior.newline(element, cursor)\n },\n\n /**\n * The split event is triggered when a block should be split into two\n * blocks. This happens when ENTER is pressed within a non-empty block.\n * The default behavior is to... TODO\n *\n * @event split\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} before The HTML string before the split.\n * @param {String} after The HTML string after the split.\n * @param {Cursor} cursor The actual cursor object.\n */\n split (element, before, after, cursor) {\n behavior.split(element, before, after, cursor)\n },\n\n /**\n * The insert event is triggered when a new block should be inserted. This\n * happens when ENTER key is pressed at the beginning of a block (should\n * insert before) or at the end of a block (should insert after).\n * The default behavior is to... TODO\n *\n * @event insert\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The insert direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n insert (element, direction, cursor) {\n behavior.insert(element, direction, cursor)\n },\n\n /**\n * The merge event is triggered when two needs to be merged. This happens\n * when BACKSPACE is pressed at the beginning of a block (should merge with\n * the preceding block) or DEL is pressed at the end of a block (should\n * merge with the following block).\n * The default behavior is to... TODO\n *\n * @event merge\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The merge direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n merge (element, direction, cursor) {\n behavior.merge(element, direction, cursor)\n },\n\n /**\n * The empty event is triggered when a block is emptied.\n * The default behavior is to... TODO\n *\n * @event empty\n * @param {HTMLElement} element The element triggering the event.\n */\n empty (element) {\n behavior.empty(element)\n },\n\n /**\n * The switch event is triggered when the user switches to another block.\n * This happens when an ARROW key is pressed near the boundaries of a block.\n * The default behavior is to... TODO\n *\n * @event switch\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The switch direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.*\n */\n switch (element, direction, cursor) {\n behavior.switch(element, direction, cursor)\n },\n\n /**\n * The move event is triggered when the user moves a selection in a block.\n * This happens when the user selects some (or all) content in a block and\n * an ARROW key is pressed (up: drag before, down: drag after).\n * The default behavior is to... TODO\n *\n * @event move\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n * @param {String} direction The move direction: \"before\" or \"after\".\n */\n move (element, selection, direction) {\n behavior.move(element, selection, direction)\n },\n\n /**\n * The clipboard event is triggered when the user copies or cuts\n * a selection within a block.\n *\n * @event clipboard\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The clipboard action: \"copy\" or \"cut\".\n * @param {Selection} selection A selection object around the copied content.\n */\n clipboard (element, action, selection) {\n behavior.clipboard(element, action, selection)\n },\n\n /**\n * The paste event is triggered when the user pastes text\n *\n * @event paste\n * @param {HTMLElement} The element triggering the event.\n * @param {Array of String} The pasted blocks\n * @param {Cursor} The cursor object.\n */\n paste (element, blocks, cursor) {\n behavior.paste(element, blocks, cursor)\n },\n\n /**\n * The toggleBold event is triggered when the bold keyboard shortcut is used\n *\n * @event toggleBold\n * @param {Selection} The selection object.\n */\n toggleBold (selection) {\n behavior.toggleBold(selection)\n },\n\n /**\n * The toggleEmphasis event is triggered when the italic keyboard shortcut is used\n *\n * @event toggleEmphasis\n * @param {Selection} The selection object.\n */\n toggleEmphasis (selection) {\n behavior.toggleEmphasis(selection)\n }\n }\n}\n","import * as parser from './parser'\nimport * as content from './content'\nimport log from './util/log'\nimport * as block from './block'\nimport * as nodeType from './node-type'\n\n/**\n * The Behavior module defines the behavior triggered in response to the Editable.JS\n * events (see {{#crossLink \"Editable\"}}{{/crossLink}}).\n * The behavior can be overwritten by a user with Editable.init() or on\n * Editable.add() per element.\n *\n * @module core\n * @submodule behavior\n */\n\nexport default function createDefaultBehavior (editable) {\n const document = editable.win.document\n /**\n * Factory for the default behavior.\n * Provides default behavior of the Editable.JS API.\n *\n * @static\n */\n\n return {\n /** @param {HTMLElement} element */\n focus (element) {\n if (!parser.isVoid(element)) return\n\n // Add an zero width space if the editable is empty to force it to have a height\n // E.g. Firefox does not render empty block elements\n // and most browsers do not render empty inline elements.\n element.appendChild(document.createTextNode('\\uFEFF'))\n },\n\n blur (element) {\n // Note: there is a special case when the tab is changed where\n // we can get a blur event even if the cursor is still in the editable.\n // This blur would cause us to loose the cursor position (cause of cleanInternals()).\n // To prevent this we check if the activeElement is still the editable.\n // (Note: document.getSelection() did not work reliably in this case.)\n if (document.activeElement === element) return\n\n content.cleanInternals(element)\n },\n\n selection (element, selection) {\n log(selection ? 'Default selection behavior' : 'Default selection empty behavior')\n },\n\n cursor (element, cursor) {\n log(cursor ? 'Default cursor behavior' : 'Default cursor empty behavior')\n },\n\n newline (element, cursor) {\n // When the cursor is at the text end, we'll need to add an empty text node\n // after the br tag to ensure that the cursor shows up on the next line\n if (cursor.isAtTextEnd()) {\n const br = document.createElement('br')\n cursor.insertBefore(br)\n\n // Only append a zero width space if there's none after the br tag\n // We don't need to remove them as they get cleaned up on blur\n if (\n br.nextSibling?.nodeType !== nodeType.textNode ||\n br.nextSibling.textContent[0] !== '\\uFEFF'\n ) {\n cursor.insertAfter(document.createTextNode('\\uFEFF'))\n }\n } else {\n cursor.insertBefore(document.createElement('br'))\n }\n\n cursor.setVisibleSelection()\n },\n\n insert (element, direction, cursor) {\n const parent = element.parentNode\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n\n switch (direction) {\n case 'before':\n parent.insertBefore(newElement, element)\n element.focus()\n break\n case 'after':\n parent.insertBefore(newElement, element.nextSibling)\n newElement.focus()\n break\n }\n },\n\n split (element, before, after, cursor) {\n const newNode = element.cloneNode(false)\n newNode.appendChild(before)\n\n const parent = element.parentNode\n parent.insertBefore(newNode, element)\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(after)\n content.tidyHtml(newNode)\n content.tidyHtml(element)\n element.focus()\n },\n\n merge (element, direction, cursor) {\n let container, merger\n\n switch (direction) {\n case 'before':\n container = block.previous(element)\n merger = element\n break\n case 'after':\n container = element\n merger = block.next(element)\n break\n }\n\n if (!(container && merger)) return\n\n cursor = container.childNodes.length > 0\n ? editable.appendTo(container, merger.innerHTML)\n : editable.prependTo(container, merger.innerHTML)\n\n // remove merged node\n merger.remove()\n\n cursor.save()\n content.tidyHtml(container)\n cursor.restore()\n cursor.setVisibleSelection()\n },\n\n empty (element) {\n log('Default empty behavior')\n },\n\n switch (element, direction, cursor) {\n switch (direction) {\n case 'before':\n const previous = block.previous(element)\n if (previous) {\n cursor.moveAtTextEnd(previous)\n cursor.setVisibleSelection()\n }\n break\n case 'after':\n const next = block.next(element)\n if (next) {\n cursor.moveAtBeginning(next)\n cursor.setVisibleSelection()\n }\n break\n }\n },\n\n move (element, selection, direction) {\n log('Default move behavior')\n },\n\n paste (element, blocks, cursor) {\n if (blocks.length === 0) return\n\n cursor.insertBefore(blocks.shift())\n if (blocks.length === 0) return cursor.setVisibleSelection()\n\n const parent = element.parentNode\n let currentElement = element\n\n blocks.forEach((str) => {\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n const fragment = content.createFragmentFromString(str)\n newElement.appendChild(fragment)\n parent.insertBefore(newElement, currentElement.nextSibling)\n currentElement = newElement\n })\n\n // focus last element\n editable.createCursorAtEnd(currentElement)\n .setVisibleSelection()\n },\n\n clipboard (element, action, cursor) {\n log('Default clipboard behavior')\n },\n\n toggleBold (selection) {\n selection.toggleBold()\n },\n\n toggleEmphasis (selection) {\n selection.toggleEmphasis()\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","e","t","r","n","i","l","call","m","c","d","o","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","getFirstMatch","match","length","getSecondMatch","matchAndReturnConst","test","getWindowsVersionName","getMacOSVersionName","split","splice","map","parseInt","push","getAndroidVersionName","getVersionPrecision","compareVersions","a","Math","max","u","Array","join","reverse","min","find","assign","arguments","apply","concat","keys","forEach","getBrowserAlias","BROWSER_ALIASES_MAP","getBrowserTypeByAlias","BROWSER_MAP","ENGINE_MAP","OS_MAP","PLATFORMS_MAP","Bada","BlackBerry","Chrome","Chromium","Electron","Epiphany","Firefox","Focus","Generic","Googlebot","Maxthon","Opera","PhantomJS","Puffin","QupZilla","QQ","QQLite","Safari","Sailfish","SeaMonkey","Sleipnir","Swing","Tizen","Vivaldi","WeChat","Roku","amazon_silk","android","bada","blackberry","chrome","chromium","electron","epiphany","firefox","focus","generic","googlebot","google_search","ie","k_meleon","maxthon","edge","mz","naver","opera","opera_coast","phantomjs","puffin","qupzilla","qq","qqlite","safari","sailfish","samsung_internet","seamonkey","sleipnir","swing","tizen","uc","vivaldi","webos","wechat","yandex","tablet","mobile","desktop","tv","WindowsPhone","Windows","MacOS","iOS","Android","WebOS","Linux","ChromeOS","PlayStation4","EdgeHTML","Blink","Trident","Presto","Gecko","WebKit","configurable","writable","key","getParser","Error","parse","getResult","this","_ua","parsedResult","getUA","parseBrowser","browser","some","describe","getBrowser","getBrowserName","String","name","toLowerCase","getBrowserVersion","version","getOS","os","parseOS","getOSName","getOSVersion","getPlatform","platform","parsePlatform","getPlatformType","type","getEngine","engine","parseEngine","getEngineName","satisfies","isOS","isPlatform","f","h","isBrowser","compareVersion","substr","indexOf","isEngine","is","search","versionName","replace","vendor","model","Number","OBJECT","FUNCTION","UNDEFINED","domRangeProperties","domRangeMethods","textRangeProperties","textRangeMethods","isHostMethod","isHostObject","isHostProperty","createMultiplePropertyTest","testFunc","props","areHostMethods","areHostObjects","areHostProperties","isTextRange","range","getBody","doc","body","getElementsByTagName","extend","addListener","modules","window","document","util","arr","func","len","api","initialized","supported","features","config","alertOnFail","alertOnWarn","preferTextRange","autoInitialize","rangyAutoInitialize","consoleLog","msg","console","log","alertOrLog","shouldAlert","alert","fail","reason","warn","obj","deep","toString","createOptions","optionsParam","defaults","options","toArray","el","createElement","appendChild","slice","childNodes","nodeType","arrayLike","eventType","listener","addEventListener","attachEvent","initListeners","getErrorDesc","ex","message","description","init","testRange","implementsDomRange","implementsTextRange","createRange","nodeName","createTextRange","moduleName","Module","deprecationNotice","deprecated","replacement","createAliasForDeprecatedMethod","owner","addInitListener","shimListeners","dependencies","initializer","createModule","initFunc","newModule","stack","RangePrototype","addShimListener","shim","createMissingNativeApi","win","requiredModule","requiredModuleNames","createError","createCoreModule","rangePrototype","selectionPrototype","UNDEF","textNode","createTextNode","arrayContains","val","getNodeIndex","node","previousSibling","getCommonAncestor","node1","node2","ancestors","parentNode","isAncestorOf","ancestor","descendant","selfIsAncestor","getClosestAncestorIn","isCharacterDataNode","insertAfter","precedingNode","nextNode","nextSibling","parent","insertBefore","getDocument","ownerDocument","getWindow","defaultView","parentWindow","getIframeDocument","iframeEl","contentDocument","contentWindow","isWindow","getComputedStyleProperty","crashyTextNodes","isBrokenNode","inspectNode","data","idAttr","id","innerHTML","NodeIterator","_next","DomPosition","offset","DOMException","codeName","code","firstChild","getComputedStyle","propName","documentElement","currentStyle","_current","hasNext","next","child","detach","equals","pos","inspect","INDEX_SIZE_ERR","HIERARCHY_REQUEST_ERR","WRONG_DOCUMENT_ERR","NO_MODIFICATION_ALLOWED_ERR","NOT_FOUND_ERR","NOT_SUPPORTED_ERR","INVALID_STATE_ERR","INVALID_NODE_TYPE_ERR","dom","isHtmlNamespace","ns","namespaceURI","parentElement","getNodeLength","isOrIsAncestorOf","isTextOrCommentNode","splitDataNode","index","positionsToPreserve","newNode","cloneNode","deleteData","position","getIframeWindow","getContentDocument","methodName","tagName","getRootContainer","comparePoints","nodeA","offsetA","nodeB","offsetB","nodeC","childA","childB","createTestElement","html","contentEditable","bodyFirstChild","removeNode","removeChild","fragmentFromNodeChildren","fragment","createDocumentFragment","createIterator","isNonTextPartiallySelected","startContainer","endContainer","getRangeDocument","getBoundaryBeforeNode","getBoundaryAfterNode","insertNodeAtPosition","firstNodeInserted","rangesIntersect","rangeA","rangeB","touchingIsIntersecting","assertRangeValid","startComparison","startOffset","endOffset","endComparison","cloneSubtree","iterator","partiallySelected","subIterator","frag","isPartiallySelectedSubtree","getSubtreeIterator","iterateSubtree","rangeIterator","iteratorState","it","subRangeIterator","stop","deleteSubtree","remove","extractSubtree","getName","RangeIterator","clonePartiallySelectedTextNodes","collapsed","sc","so","ec","eo","commonAncestorContainer","isSingleCharacterDataNode","_first","_last","reset","current","start","end","subRange","cloneRange","collapse","Range","updateBoundaries","beforeAfterNodeTypes","rootContainerNodeTypes","insertableNodeTypes","surroundNodeTypes","createAncestorFinder","nodeTypes","getDocumentOrFragmentContainer","getReadonlyAncestor","getDocTypeNotationEntityAncestor","getElementAncestor","assertNoDocTypeNotationEntityAncestor","allowSelf","assertValidNodeType","invalidTypes","assertValidOffset","assertSameDocumentOrFragment","assertNodeNotReadOnly","assertNode","isValidOffset","isRangeValid","styleEl","htmlParsingConforms","createContextualFragment","fragmentStr","splitRangeBoundaries","startEndSame","setStartAndEnd","rangeToHtml","container","cloneContents","rangeProperties","s2s","s2e","e2e","e2s","n_b","n_a","n_b_a","n_i","copyComparisonConstantsToObject","START_TO_START","START_TO_END","END_TO_END","END_TO_START","NODE_BEFORE","NODE_AFTER","NODE_BEFORE_AND_AFTER","NODE_INSIDE","copyComparisonConstants","constructor","createRangeContentRemover","remover","boundaryUpdater","boundary","returnValue","createPrototypeRange","createBeforeAfterNodeSetter","isBefore","isStart","setRangeStart","setRangeEnd","F","setStart","setEnd","args","setBoundary","setStartBefore","setStartAfter","setEndBefore","setEndAfter","selectNodeContents","selectNode","extractContents","deleteContents","canSurroundContents","boundariesInvalid","splitBoundaries","splitBoundariesPreservingPositions","normalizeBoundaries","sibling","mergeForward","appendData","mergeBackward","nodeLength","insertData","nodeIndex","normalizeStart","endNode","startNode","collapseToPoint","updateCollapsedAndCommonAncestor","compareBoundaryPoints","how","prefixA","prefixB","insertNode","clone","surroundContents","content","hasChildNodes","lastChild","prop","textParts","compareNode","comparePoint","toHtml","intersectsNode","isPointInRange","intersectsRange","intersectsOrTouchesRange","intersection","intersectionRange","union","unionRange","containsNode","allowPartial","containsNodeContents","containsRange","containsNodeText","nodeRange","textNodes","getNodes","lastTextNode","pop","filter","regex","filterNodeTypes","filterExists","RegExp","nodes","getNodesInRange","collapseBefore","collapseAfter","getBookmark","containerNode","preSelectionRange","moveToBookmark","bookmark","charIndex","nextCharIndex","nodeStack","foundStart","rangesEqual","isValid","r1","r2","DomRange","WrappedRange","WrappedTextRange","rangeProto","updateRangeProperties","nativeRange","startMoved","endMoved","nativeRangeDifferent","refresh","testTextNode","oppositeName","range2","createNativeRange","getTextRangeBoundaryPosition","textRange","wholeRangeContainerElement","isCollapsed","startInfo","workingRange","duplicate","containerElement","canHaveHTML","boundaryPosition","nodeInfo","workingNode","comparison","previousNode","boundaryNode","workingComparisonType","childNodeCount","moveToElementText","compareEndPoints","floor","setEndPoint","tempRange","rangeLength","text","moveStart","createBoundaryTextRange","boundaryParent","boundaryOffset","nodeIsDataNode","startBoundary","rangeContainerElement","parentEl","startEl","endEl","startEndContainer","getTextRangeContainerElement","rangeToTextRange","startRange","endRange","toTextRange","globalObj","Function","createRangyRange","checkSelectionRanges","getNativeSelection","selectionIsCollapsed","BOOLEAN","NUMBER","CONTROL","isDirectionBackward","dir","WrappedSelection","getDocSelection","winParam","selection","winSelectionIsBackward","sel","backward","anchorNode","anchorOffset","focusNode","focusOffset","implementsWinGetSelection","implementsDocSelection","useDocumentSelection","isSelectionValid","nativeSel","getSelection","testSelection","selectionHasAnchorAndFocus","selectionHasExtend","selectionHasSetBaseAndExtent","selectionHasRangeCount","rangeCount","selectionSupportsMultipleRanges","collapsedNonEditableSelectionsSupported","addRangeBackwardToNative","nativeSelection","addRange","getNativeRange","originalSelectionRangeCount","selectionHasMultipleRanges","originalSelectionRanges","originalSelectionBackward","getRangeAt","testEl","removeAllRanges","chromeMatch","navigator","appVersion","testControlRange","getSelectionRangeAt","implementsControlRange","updateAnchorAndFocusFromRange","anchorPrefix","focusPrefix","updateEmptySelection","_ranges","updateType","getSingleElementFromRange","rangeNodes","rangeContainsSingleElement","updateFromTextRange","wrappedRange","updateControlSelection","docSelection","controlRange","item","addRangeToControlSelection","rangeElement","newControlRange","createControlRange","add","select","deleteProperties","detached","cachedRangySelections","actOnCachedSelection","action","cached","docSel","refreshSelection","selProto","createControlSelection","ranges","addRangeBackward","direction","previousRangeCount","clonedNativeRange","selectionIsBackward","setRanges","empty","updateAnchorAndFocusFromNativeSelection","checkForChanges","oldRanges","oldAnchorNode","oldAnchorOffset","removeRangeManually","getAllRanges","assertNodeInSameDocument","createStartOrEndSetter","setSingleRange","isBackward","rangeInspects","anchor","removeRange","removed","isBackwards","rangeTexts","collapseToStart","collapseToEnd","selectAllChildren","setBaseAndExtent","deleteFromDocument","element","eachRange","callMethodOnEachRange","params","results","changeEachRange","rangeBookmarks","rangeBookmark","selRanges","saveRanges","restoreRanges","rangeHtmls","getNativeTextRange","detachAll","Selection","docReady","loadHandler","readyState","rangy","trailingSpaceBeforeBrCollapses","trailingSpaceBeforeBlockCollapses","CHARACTER","WORD","spacesRegex","spacesMinusLineBreaksRegex","allWhiteSpaceRegex","nonLineBreakWhiteSpaceRegex","defaultLanguage","convertCharRangeToToken","chars","tokenRange","tokenChars","token","isWord","tokenize","wordOptions","tokenizer","tokenRanges","tokens","defaultCharacterOptions","includeBlockContentTrailingSpace","includeSpaceBeforeBr","includeSpaceBeforeBlock","includePreLineTrailingSpace","ignoreCharacters","defaultCaretCharacterOptions","defaultWordOptions","wordRegex","includeTrailingSpace","result","word","createTokenRange","wordStart","wordEnd","lastWordEnd","exec","defaultFindOptions","caseSensitive","withinRange","wholeWordsOnly","wrap","characterOptions","defaultMoveOptions","defaultExpandOptions","trim","trimStart","trimEnd","defaultWordIteratorOptions","createNestedOptions","lang","language","createWordOptions","tableCssDisplayBlock","table","defaultDisplayValueForTag","caption","colgroup","col","thead","tbody","tfoot","tr","td","th","getComputedDisplay","display","isHidden","unshift","getAncestors","getAncestorsAndSelf","excludeChildren","nextNodeDescendants","previous","isWhitespaceNode","computedWhiteSpace","isCollapsedWhitespaceNode","isCollapsedNode","isVisibilityHiddenTextNode","isIgnoredNode","Cache","store","createCachingGetter","objProperty","cache","NodeWrapper","session","positions","set","nodeProto","getPosition","Position","EMPTY","NON_SPACE","UNCOLLAPSIBLE_SPACE","COLLAPSIBLE_SPACE","TRAILING_SPACE_BEFORE_BLOCK","TRAILING_SPACE_IN_BLOCK","TRAILING_SPACE_BEFORE_BR","PRE_LINE_TRAILING_SPACE_BEFORE_LINE_BREAK","INCLUDED_TRAILING_LINE_BREAK_AFTER_BR","nodeWrapper","getLength","containsPositions","isWhitespace","isCollapsedWhitespace","isIgnored","getTextNodeInfo","spaceRegex","collapseSpaces","cssWhitespace","preLine","hasInnerText","posAfterEl","firstPosInEl","endPos","prepopulateChar","isDefinitelyNonEmpty","previousVisible","nextVisible","isRenderedBlock","brs","getTrailingSpace","getNodeWrapper","getLeadingSpace","positionProto","character","characterType","isBr","prepopulatedChar","visibleChar","charType","finalizedChar","textChar","charAt","nodePassed","checkForTrailingSpace","checkForLeadingSpace","isCharInvariant","resolveLeadingAndTrailingSpaces","trailingSpace","isTrailingSpace","leadingSpace","isLeadingSpace","getPrecedingUncollapsedPosition","getCharacter","thisChar","ignoredChars","ignoredCharacters","ignoredCharsArray","sort","char1","char2","charCodeAt","normalizeIgnoredCharacters","isIgnoredCharacter","cacheKey","cachedChar","nextPos","previousPos","collapsible","gotPreviousPos","getPreviousPos","nextUncollapsed","nextOffset","previousOffset","newPos","currentSession","Session","createWrapperCache","nodeProperty","wrappersByProperty","wrapper","property","uniqueIDSupported","initCaches","elementsCache","elementCache","uniqueID","elWrapper","textNodeCache","otherNodeCache","wrapperCache","getRangeBoundaryPosition","prefix","getSession","endSession","createCharacterIterator","startPos","finished","charPos","previousTextPos","returnPreviousTextPos","rewind","dispose","arrayIndexOf","createTokenizedTextProvider","forwardIterator","backwardIterator","consumeWord","forward","newChars","passedWordBoundary","insideWord","forwardChars","backwardChars","forwardTokensBuffer","backwardTokensBuffer","nextEndToken","lastToken","shift","previousStartToken","createRangeCharacterIterator","rangeStart","rangeEnd","isWholeWord","expand","findTextFromPosition","initialPos","searchTerm","isRegex","searchScopeRange","findOptions","currentChar","matchStartIndex","matchEndIndex","insideRegexMatch","handleMatch","startIndex","endIndex","valid","createEntryPointFunction","sessionRunning","createRangeBoundaryMover","unit","count","moveOptions","boundaryIsStart","moveResult","currentPos","charIterator","unitsMoved","absCount","abs","tokenizedTextProvider","movePositionBy","createRangeTrimmer","trimCharCount","trimmed","createSelectionTrimmer","moveEnd","move","startTrimmed","endTrimmed","expandOptions","moved","endToken","newEndPos","startToken","newStartPos","getRangeCharacters","selectCharacters","toCharacterRange","rangeStartsBeforeNode","rangeBetween","findText","searchTermParam","findResult","wrappedAround","pasteHtml","saveCharacterRanges","rangeInfos","characterRange","restoreCharacterRanges","saved","rangeInfo","innerText","createWordIterator","iteratorOptions","noMutation","isBlockNode","createPosition","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","g","globalThis","_classCallCheck","instance","Constructor","TypeError","_typeof","_defineProperties","target","descriptor","arg","input","hint","prim","toPrimitive","res","_createClass","protoProps","staticProps","logErrors","editableClass","editableDisabledClass","pastingAttribute","trimLeadingAndTrailingWhitespaces","boldMarkup","attribs","italicMarkup","underlineMarkup","linkMarkup","pastedHtmlRules","allowedElements","allowedPlainTextElements","requiredAttributes","transformElements","splitIntoBlocks","blockLevelElements","blacklistedElements","keepInternalRelativeLinks","replaceQuotes","error","from","global","htmlCharacters","trimRight","isString","elementNode","documentFragmentNode","_Symbol$iterator","method","iteratorFunc","getNext","prev","getPrevious","done","getAttribute","domArray","querySelectorAll","isArray","domSelector","querySelector","firstElementChild","closest","elem","selector","findStartExcludingWhitespace","_ref","whitespacesOnTheLeft","offsetAfterWhitespace","getNextTextNode","previousTextNode","getPreviousTextNode","findEndExcludingWhitespace","_ref2","whitespacesOnTheRight","isFirstNode","offsetBeforeWhitespace","getHost","jquery","isVoid","_step","_iterator","_createForOfIteratorHelper","isVoidTextNode","err","nodeValue","isWhitespaceOnly","lastOffsetWithContent","isLinebreak","string","lastOffset","every","isBeginningOfHost","host","isStartOffset","offsetInParent","isEndOfHost","isEndOffset","isTextEndOfHost","isTextEndOffset","isSameNode","source","attr","attributes","latestChild","isDocumentFragmentWithoutChildren","isInlineElement","boundaryMarkerId","markerTextChar","isChildOf","possibleChild","children","insertRangeBoundaryMarker","atStart","directlyBeforeFormatTag","startContainerIsChild","directlyAfterFormatTag","endContainerIsChild","markerEl","setAttribute","style","lineHeight","boundaryRange","setRangeBoundary","markerId","getMarker","save","startMarkerId","endMarkerId","restore","restored","restoreRange","rangeSaveRestore","zeroWidthSpace","zeroWidthNonBreakingSpace","whitespaceExceptSpace","tidyHtml","normalizeTags","removeWhitespaces","textContent","parser","_step2","_iterator2","siblingChild","normalizeWhitespace","cleanInternals","extractContent","keepUiElements","innerHtml","getInnerHtmlOfFragment","unwrapInternalNodes","documentFragment","div","createFragmentFromString","htmlString","adoptElement","adoptNode","cloneRangeContents","_elem","firstCall","startsWith","unwrap","getTags","filterFunc","innerTags","getInnerTags","ancestorTags","getAncestorTags","tags","getTagsByName","toUpperCase","getTagsByNameAndAttributes","areSameAttributes","attrs1","attrs2","getContainedTags","getTagNames","isAffectedBy","isExactSelection","visible","elemRange","rangeText","elemText","expandTo","toggleTag","elems","removeFormattingElem","forceWrap","isWrappable","restoredRange","nukeElem","nuke","removeFormatting","matches","insertCharacter","insertEl","surround","startCharacter","endCharacter","deleteCharacter","containsString","charRegexp","str","flags","escapedStr","nukeTag","nextBlockId","state","getSibling","normalize","plainText","shouldSpellcheck","hasAttribute","setBlockId","Boolean","classList","isPlainTextBlock","arr2","minLen","_toConsumableArray","iter","replacements","doubleQuotePairs","singleQuotePairs","apostrophe","quotesRegex","beforeOpeningQuote","afterClosingQuote","replaceAllQuotes","replaceQuotesRules","quotes","singleQuotes","matchAll","char","before","after","getAllQuotes","replaceMatchedQuotes","replaceExistingQuotes","closingTag","findClosingQuote","nestedMatches","replaceApostrophe","openingQuote","possibleClosingSingleQuotes","getPossibleClosingQuotes","possibleClosingDoubleQuotes","includes","pairs","quotePair","quote","whitespaceOnly","blockPlaceholder","updateConfig","conf","rules","paste","block","cursor","clipboardContent","isSelection","deleteExactSurroundingTags","deleteContainedTags","deleteContent","pasteHolder","blocks","_ref$plainText","filterHtmlElements","entry","group","parseContent","removeAttribute","reduce","href","stripInternalHost","location","origin","requiredAttrs","hasRequiredAttributes","shouldKeepNode","transformNodeName","filterAttributes","conditionalNodeWrap","webKit","userAgent","selectionchange","osc","onselectionchange","hasNativeSelectionchangeSupport","contenteditableSpanBug","eventable","notifyContext","events","listeners","event","on","off","eventListeners","removeListener","notify","context","switchContext","getEventableModule","getScrollPosition","x","pageXOffset","scrollLeft","y","pageYOffset","scrollTop","Cursor","editableHost","rangyRange","setHost","isCursor","hostRange","hostCoords","getRangeBoundingClientRect","cursorCoords","isCloseTo","bottom","top","preceedingElement","lastIndex","setVisibleSelection","activeElement","_viewport$getScrollPo","viewport","scrollTo","getBoundingClientRect","positioning","coords","_viewport$getScrollPo2","left","right","height","width","updateHost","moveAtEnd","callback","savedRangeInfo","isEqualNode","attributeName","attributeValue","createEvent","initEvent","dispatchEvent","b","_slicedToArray","_setPrototypeOf","setPrototypeOf","__proto__","_getPrototypeOf","getPrototypeOf","extractText","getText","part","highlightMatches","wordId","currentMatchIndex","totalOffset","currentMatch","portions","nodeText","nodeEndOffset","isFirstPortion","isLastPortion","portion","substring","lastNode","wrapMatch","marker","title","replaceCurrent","stencilElement","_this","wrapPortion","WordHighlighting","markerNode","matchMode","_obj$ownerDocument","HTMLElement","highlights","isElement","searchMatches","createWordRegex","createHighlightRegex","prepareMatch","matchedText","words","escapedWords","escapeRegEx","letterChars","highlightSupport","highlightText","highlightId","hasHighlight","blockText","createMarkerNode","TextHighlighting","findMatches","highlightRange","dispatcher","removeHighlight","firstMarker","textSearch","matchesArray","_this$getIndex","getIndex","actualStartIndex","actualEndIndex","cleanupStaleMarkerNodes","updateHighlight","addCssClass","removeCssClass","extractHighlightedRanges","findMarkersQuery","markers","_step3","groups","_iterator3","extractMarkerNodePosition","highlightType","_step4","_iterator4","markerMarkup","newStartIndex","ReferenceError","_Cursor","subClass","superClass","_inherits","_super","_createSuper","getClientRects","attrs","link","trimRange","textToTrim","lastNonWhitespace","_findStartExcludingWh2","_findEndExcludingWhit2","links","firstLink","unlink","textBefore","currentTextContent","setSelection","_ref2$trim","customElem","toggle","_ref3","_ref3$trim","bold","em","removeSurround","ancestorTag","containedTag","onlyVisible","RangeContainer","isAnythingSelected","getCursor","otherRangeContainer","other","SelectionWatcher","rangySelection","currentSelection","currentRange","successfulSync","syncSelection","hostNode","getRangeContainer","forceCursor","newRange","isDifferentFrom","lastSelection","Keyboard","selectionWatcher","notifyCharacterEvent","keyCode","up","down","tab","shiftKey","esc","backspace","preventContenteditableBug","enter","ctrl","alt","ctrlKey","metaKey","rangyInstance","getFreshRange","nodeToRemove","getNodeToRemove","selectionRange","startNodeElement","startNodeRange","contentNodeTypes","firstContentNode","rangeStartingBeforeCurrentElement","delete","isInputEventSupported","Dispatcher","editable","supportsInputEvent","editableSelector","keyboard","activeListeners","setup","getEditableBlockByEvent","evt","capture","setupKeyboardEvents","setupEventListeners","removeEventListener","suspended","setupElementListeners","setupKeydownListener","setupSelectionChangeListeners","setupSelectionChangeFallbackListeners","setupDocumentListener","getFreshSelection","triggerChangeEvent","preventDefault","clipboardData","getData","_clipboard$paste","clipboard","retainVisibleSelection","searchValue","replaceValue","lastOccurrenceIndex","lastIndexOf","replaceLast","altKey","positionX","isAtFirstLine","stopPropagation","isAtLastLine","dispatchKeyEvent","dispatchSwitchEvent","isAtBeginning","isAtTextEnd","selectionDirty","suppressSelectionChanges","isAtEnd","selectionChanged","mouseMoveSelectionChanges","setTimeout","once","_this2","array","ListCache","entries","clear","__data__","size","has","freeSelf","objectProto","nativeObjectToString","symToStringTag","isOwn","tag","unmasked","uid","maskSrcKey","IE_PROTO","funcToString","reIsHostCtor","reIsNative","object","Hash","MapCache","Stack","LARGE_ARRAY_SIZE","iteratee","keysFunc","iterable","freeExports","freeModule","Buffer","allocUnsafe","Uint8Array","typedArray","isDeep","arrayBuffer","buffer","byteLength","byteOffset","objectCreate","proto","transform","Ctor","propertyIsEnumerable","isBuffer","objectCtorString","typedArrayTags","freeProcess","process","nodeUtil","require","types","binding","nodeIsTypedArray","isTypedArray","objValue","reIsUint","inherited","isArr","isArg","isBuff","isType","skipIndexes","isProto","customizer","isNew","newValue","srcIndex","mergeFunc","srcValue","stacked","isCommon","isTyped","copy","baseMerge","nativeMax","nativeNow","Date","now","lastCalled","stamp","remaining","otherArgs","thisArg","assigner","sources","guard","SpellcheckService","spellcheckService","condensedText","misspelledWords","characters","WhitespaceHighlighting","unicode","MatchCollection","matches1","matches2","length1","length2","lastEndIndex","output","a1","i1","a2","i2","pickNext","mergeMatches","item1","item2","Highlighting","configuration","spellcheckConfig","focusedEditableHost","currentlyCheckedEditableHost","timeout","_merge","checkOnInit","checkOnFocus","checkOnChange","throttle","removeOnCorrection","spellcheck","whitespace","spellcheckMarker","whitespaceMarker","spellcheckMarkerNode","whitespaceMarkerNode","setupListeners","onFocus","onBlur","onChange","onInit","highlight","editableHasChanged","removeHighlightsAtCursor","clearTimeout","timeoutId","_this3","check","matchCollection","addMatches","safeHighlightMatches","_this4","removeHighlights","elementAtCursor","trace","textNodesUnder","getTextNodeAndRelativeOffset","targetNode","absOffset","cumulativeOffset","relativeOffset","moveLeft","rightLimit","currentOffset","leftLimit","moveRight","ceil","createRangeAtCharacterOffset","_getTextNodeAndRelati","Editable","instanceConfig","behavior","defaultInstanceConfig","defaultBehavior","browserSpellcheck","blur","newline","_br$nextSibling","br","insert","newElement","merge","merger","appendTo","prependTo","moveAtTextEnd","moveAtBeginning","currentElement","createCursorAtEnd","toggleBold","toggleEmphasis","createDefaultBehavior","flow","enable","targets","disable","setState","_ref$normalize","suspend","_step5","_iterator5","findHost","nextCursor","createCursor","inputElement","contentToAppend","contentToPrepend","hightlightingConfig","highlighting","outerHTML","setupHighlighting","checkSpelling","raiseEvents","_ref3$type","_ref4","_ref5","_ref6","handler","_len","_key","unload","_ref7","origCoordinates","_ref7$requiredOnFirst","requiredOnFirstLine","_ref7$requiredOnLastL","requiredOnLastLine","totalCharCount","acc","wasFound","distance","safety","finalDistance","binaryCursorSearch","globalConfig"],"sourceRoot":""}