{ const form = e.target; if (!(e instanceof CustomSubmitEvent) && form instanceof HTMLFormElement && form.method.toUpperCase() === 'POST' && !getSetting('memberID') && getCsrfKeyExpiry() < Date.now() / 1000) { Debug.log(`Intercepted form submission... fetching fresh CSRF key`); e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); getFreshCsrfKey() // .then(() => new Promise(resolve => setTimeout(resolve, 2000))) // DEBUG - wait a couple seconds so I can read the logs .then(() => { Debug.log(`Got a new CSRF key, resuming the form submission`); let submitButton = (e instanceof SubmitEvent || e.submitter instanceof Element) ? e.submitter : form.querySelector('button[type="submit"], button:not([type]), input[type="submit"]'); if (submitButton) { submitButton.click(); } else { // the click() causes the native submit event to fire. However, if there was no submitter (e.g. the user pressed 'Enter'), we need to dispatch our own submit event and see if they call prevent default. const ev = new CustomSubmitEvent(e); form.dispatchEvent(ev); if (ev.defaultPrevented) { return; } form.submit(); } }); } }, {capture: true}); // Add a little jQuery plugin that allows us to add callbacks // to CSS animations $.fn.animationComplete = function (callback) { return $( this ).one('webkitAnimationEnd animationend', function (e) { // Important fix: ignore bubbled transition events if( e.target == this ){ callback.apply( this ); } }); }; // In case we already have ips_uid elements on the page, start at the highest found // jQuery plugin that adds a unique id to an element if an ID doesn't // already exist. Based on jQueryUI method. $.fn.identify = function () { return this.each( function () { if( !this.id ) { this.id = 'ips_uid_' + urand + '_' + (++uid); } }); }; // Redefine .html() so that we can observe lazy-loaded content when we update elements var oldHtml = $.fn.html; var newHtml = function (value) { var toReturn = oldHtml.apply(this, arguments); var elem = $( this ); // If we've updated with a string... if( typeof value === "string" ){ var itemsToLoad = elem.find( ips.utils.lazyLoad.contentSelector ); var lazyLoadWrapper = elem.closest('[data-controller^="core.front.core.lightboxedImages"]'); if( itemsToLoad.length ){ try { // See if we're inserting into an element that already handles lazy loading... if( lazyLoadWrapper.length ){ lazyLoadWrapper.trigger('refreshContent'); } else { // If not, just observe manually Debug.log("Updated with `html()` and found content to lazyLoad"); if( ips.getSetting('lazyLoadEnabled') ){ ips.utils.lazyLoad.observe(this); } else { ips.utils.lazyLoad.loadContent(this); // load immediately } } } catch (err) { } } } return toReturn; } $.fn.html = newHtml; // Redefine .prop() so that we can observe events when properties are changed // See: http://stackoverflow.com/questions/16336473/add-event-handler-when-checkbox-becomes-disabled var oldProp = $.fn.prop; var newProp = function () { var retFunc = oldProp.apply( this, arguments ); this.trigger( 'propChanged', this ); return retFunc; }; $.fn.prop = newProp; // Add a utility function for easily adding // methods to a prototype. // From "Javascript: The Good Parts" by Douglas Crockford Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; // Set up mustache-style templates for language interpolation in underscore _.templateSettings = { interpolate: /\{\{(.+?)\}\}/g }; // Warn users about pasting stuff into the console if( !Debug.isEnabled() && window.console ){ window.console.log("%cThis is a browser feature intended for developers. Do not paste any code here given to you by someone else. It may compromise your account or have other negative side effects.", "font-weight: bold; font-size: 14px;"); } // Signal that we're ready to begin $( document ) .trigger('doneBooting') .ready( function () { // Set our location _location = $( 'body' ).attr('data-pageLocation') || 'front'; _preloadLoader(); }); }, /** * Allows us to use mock ajax objects if necessary, and fetches a fresh CSRF token if we're on a guest page before sending the request * * @returns {object} Ajax object (jQuery's $.ajax by default) */ getAjax = function () { const wrap = method => (...args) => { let options = {}, url; if (typeof args[0] === 'string') { url = args[0]; options = args[1] || {}; } else if (typeof args[0] === 'object' && args[0]) { options = args[0]; } if ((options.method || options.type)?.toLowerCase() === 'post' && !getSetting('memberID') || getCsrfKeyExpiry() < Date.now() / 1000) { return method(...args); } // Guest with an expired CSRF key? Oh boy, we need to return a proxy object for an api encompassing its own polyfill (our polyfill > $.ajax > XMLHttpRequest) let requestInstance; const decoratorQueues = {}; const properties = {}; let thenResolve, thenReject, mimeTypeOverride; const uploadEventListeners = new Map(); const uploadDispatchedEvents = []; const proxyXHRObject = { _promise: new Promise((resolve, reject) => { thenResolve = resolve; thenReject = reject }), then(cb) { this._promise.then(cb); }, catch(...args) { this._promise.catch(...args) }, finally(...args) { this._promise.finally(...args); }, _aborted: false, get aborted() { return this._aborted; }, _abortedStatusText: undefined, get abortedStatusText() { return this._abortedStatusText; }, abort(statusText) { this._aborted = true; this._abortedStatusText = statusText; requestInstance?.abort(statusText); }, getAllResponseHeaders() { return requestInstance?.getAllResponseHeaders() || null; }, getResponseHeader(header) { return requestInstance?.getResponseHeader(header) || null; }, overrideMimeType(mimeType) { if (requestInstance) { requestInstance.overrideMimeType(mimeType); return; } mimeTypeOverride = mimeType; }, get readyState() { return requestInstance ? requestInstance.readyState : 0; }, get response() { return requestInstance ? ('response' in requestInstance ? requestInstance.response : null) : null; }, get responseText() { if (typeof requestInstance?.responseText === 'string') { return requestInstance.responseText; } return ""; }, get responseType() { if (typeof requestInstance?.responseType === 'string') { return requestInstance.responseType; } return ""; }, get responseURL() { return requestInstance ? requestInstance.responseURL : (url || options.url || window.location.href); }, get responseXML() { return requestInstance ? requestInstance.responseXML : null; }, get status() { return requestInstance ? requestInstance.status : 0; }, get statusText() { return requestInstance ? requestInstance.statusText : ""; }, get timeout() { return properties.timeout || 0; }, set timeout(val) { properties.timeout = val; if (requestInstance) { requestInstance.timeout = val; } }, get withCredentials() { return !!(requestInstance ? requestInstance.withCredentials : properties.withCredentials); }, set withCredentials(val) { val = !!val; properties.withCredentials = val; // track this in case it was set before the request instance was defined if (requestInstance) { requestInstance.withCredentials = val; } }, _upload: { _getEventCollection(event, options) { const path = [ event, (options && options.capture) ? "true" : "false" ]; let collection = uploadEventListeners; for (let i = 0; i < path.length; i++) { const cmp = path[i]; collection.set(cmp, collection.get(cmp) || new Map()); collection = collection.get(cmp); } return collection; }, addEventListener(event, cb, options={}) { requestInstance?.upload?.addEventListener?.(event, cb, options); this._getEventCollection(event, options).set(cb, {options, event}); }, removeEventListener(event, cb, options={}) { requestInstance?.upload?.removeEventListener?.(event, cb, options); this._getEventCollection(event, options).delete(cb); }, dispatchEvent(...args) { if (requestInstance?.upload?.dispatchEvent instanceof Function) { requestInstance.upload.dispatchEvent(...args); return; } uploadDispatchedEvents.push(args); }, set onabort(cb) { this.addEventListener('abort', cb); }, set onerror(cb) { this.addEventListener('error', cb); }, set onload(cb) { this.addEventListener('load', cb); }, set onloadend(cb) { this.addEventListener('loadend', cb); }, set onloadstart(cb) { this.addEventListener('loadstart', cb); }, set onprogress(cb) { this.addEventListener('progress', cb); }, set ontimeout(cb) { this.addEventListener('timeout', cb); } }, get upload() { return requestInstance ? requestInstance.upload : this._upload; } } for (const chainableMethod of ['done','always', 'fail', 'success', 'error', 'complete']) { proxyXHRObject[chainableMethod] = (function(...args) { decoratorQueues[chainableMethod] = decoratorQueues[chainableMethod] || []; decoratorQueues[chainableMethod].push(args); requestInstance?.[chainableMethod]?.(...args); return this; }).bind(proxyXHRObject); } for (const simpleMethod of ['getAllResponseHeaders', 'getResponseHeader']) { proxyXHRObject[simpleMethod] = (function(...args) { return requestInstance?.[simpleMethod]?.(...args); }).bind(proxyXHRObject); } getFreshCsrfKey() .then(() => { Debug.log(`Intercepted Fetch request and get fresh CSRF Key`); requestInstance = method(url, options); if (requestInstance.upload) { if (Object.keys(uploadEventListeners).length) { function evalCollection(collection) { for (const [key, childCollection] of collection.entries()) { if (key instanceof Function) { requestInstance.upload.addEventListener(childCollection.event, key, childCollection.options); } else { evalCollection(childCollection); } } } evalCollection(uploadEventListeners); } for (const args of uploadDispatchedEvents) { requestInstance.upload.dispatchEvent(...args); } } if (mimeTypeOverride) { requestInstance.overrideMimeType(mimeTypeOverride); } for (const queue in decoratorQueues) { requestInstance[queue](...decoratorQueues[queue]); } for (const property in properties) { requestInstance[property] = properties[property]; } requestInstance .then((...result) => { thenResolve(...result); }).catch(err => { thenReject(err); }); if (proxyXHRObject.aborted) { proxyXHRObject.abortedStatusText ? requestInstance.abort(proxyXHRObject.abortedStatusText) : requestInstance.abort(); } }); return proxyXHRObject; } if( getSetting('mock_ajax') ){ return wrap(getSetting('mock_ajax')); } return wrap($.ajax); }, /** * Returns our main wrapper (body by default) * With custom skins, sometimes inserting into the body can cause styling issues. * With the container setting, we can choose to insert them somewhere else. * * @returns {element} The container */ getContainer = function () { var tryThis = $( getSetting('container') ); return ( tryThis.length ) ? tryThis : $('body'); }, /** * Loading spinners are contained in a different font file, so there's a FOUT * when they are first shown. We'll create an invisible element so the browser * loads them. * * @returns {void} */ _preloadLoader = function () { var elem = $('').css({ visibility: 'hidden', position: 'absolute', top: '-300px', width: '1px', height: '1px', overflow: 'hidden' }); if( $('html').attr('dir') == 'rtl' ){ elem.css({ right: '-300px' }); } else { elem.css({ left: '-300px' }); } elem.append( $('').addClass('ipsLoading ipsLoading_noAnim').css({ display: 'block' }) ); $('body').append( elem ); }, /** * Refresh teh csrf key if needed * @return {Promise} * @private */ _refreshCsrfKey = async function() { // we do this before refreshing to prevent any infinite loops. setSetting('csrfKeyExpiry', Math.floor(Date.now() / 1000 + 20)); try { // we use fetch() directly to not use the existing csrf key that getAjax uses const response = await fetch(getSetting('baseURL').toString().replace(/\/+$/, '') + '/?app=core&module=system&controller=ajax&do=getCsrfKey&path=' + window.location.pathname ); const data = await response.json(); Debug.log(`Got new CSRF Key: ${data.key}`); setSetting('csrfKey', data.key); setSetting('csrfKeyExpiry', typeof data.expiry === "number" ? data.expiry : Math.floor(Date.now() / 1000 + 500)); _setAjaxConfig(); // All csrfKey inputs document .querySelectorAll(`form input[name="csrfKey"]`) .forEach(input => { input.value = data.key; }); // Make sure the form's action is updated document.querySelectorAll(`form:is([action*="?csrfKey="],[action*="&csrfKey="])`) .forEach(form => { const url = new URL(form.action); if ((url.toString().startsWith('https:' + ips.getSetting('baseURL')) || url.toString().startsWith('http:' + ips.getSetting('baseURL'))) && (url.searchParams.has('csrfKey') || form.method.toLowerCase() !== 'get')) { ips.utils.url.addParamToURL(url, 'csrfKey', data.key); form.action = url.toString(); } }); // Any links need updating too document.querySelectorAll(`[href*="?csrfKey="], [href*="&csrfKey="]`) .forEach(linkLikeEl => { const url = new URL(linkLikeEl.href || linkLikeEl.getAttribute('href')); if ((url.toString().startsWith('https:' + ips.getSetting('baseURL')) || url.toString().startsWith('http:' + ips.getSetting('baseURL'))) && url.searchParams.has('csrfKey')) { ips.utils.url.addParamToURL(url, 'csrfKey', data.key); linkLikeEl.setAttribute('href', url.toString()); } }); // Dispatch an event so third party code can listen document.dispatchEvent(new CustomEvent('ips:csrfKeyUpdated')); } catch (e) { Debug.warn(e); } }, /** * Get the time the csrf key should expire. If there is no current csrf key, we return null * * @return {number} */ getCsrfKeyExpiry = function() { const setting = getSetting('csrfKeyExpiry'); if (typeof setting === "number" && !Number.isNaN(setting) && getSetting('csrfKey')) { return setting; } return 0; // in this case, we assume it's expired }, /** * Refresh the csrf key on the page to make sure it's valid * * @returns {Promise} */ getFreshCsrfKey = async function() { // Logged In and we know the key? Return it now if (getSetting('memberID') && getSetting('csrfKey')) { return getSetting('csrfKey'); } if (Date.now() / 1000 >= getCsrfKeyExpiry()) { await _refreshCsrfKey(); } return ips.getSetting('csrfKey'); }, /** * * @private */ _setAjaxEventListeners = function() { // Add global loading indicator ability var count = 0; $( document ) .ajaxSend( function (event, request, settings) { if( !_.isUndefined( settings ) && settings.showLoading === true ){ if( !$('#elAjaxLoading').length ){ getContainer().append( templates.render('core.general.ajax') ); } count++; ips.utils.anim.go( 'fadeIn fast', $('#elAjaxLoading') ); } }) .ajaxComplete( function (event, request, settings) { if( !_.isUndefined( settings ) && settings.showLoading === true ){ count--; if( count === 0 ){ ips.utils.anim.go( 'fadeOut fast', $('#elAjaxLoading') ); } } // Check for redirect response if( !_.isUndefined( settings ) && !settings.bypassRedirect ){ var responseJson = null; if( !_.isUndefined( request.responseJSON ) && !_.isUndefined( request.responseJSON.redirect ) ) { responseJson = request.responseJSON; } else if( !_.isUndefined( request.responseText ) ) { try { var jsonResponse = $.parseJSON( request.responseText ); if( jsonResponse && !_.isUndefined( jsonResponse.redirect ) ) { responseJson = jsonResponse; } } catch( err ){} } if( responseJson ){ // Do we have a flash message to show? if( !_.isUndefined( responseJson.message ) && responseJson.message != '' ){ ips.utils.cookie.set( 'flmsg', responseJson.message ); } if ( responseJson.redirect.match( /#/ ) ) { window.location.href = responseJson.redirect; window.location.reload(); } else { window.location = responseJson.redirect; } } } // Re-parse cookies ips.utils.cookie.init(); }); }, /** * Sets up our global ajax handlers * * @returns {void} */ _setAjaxConfig = function () { var data = { csrfKey: ips.getSetting('csrfKey') }; $.ajaxSetup({ data: data, cache: true }); }, /** * Config getter * * @param {string} key Setting key to return * @returns {mixed} Config setting, or undefined if it doesn't exist */ getSetting = function (key) { return _settings[ key ]; }, /** * Return full settings object * * @returns {object} Settings object */ getAllSettings = function () { return _settings; }, /** * Config setter * * @param {string} key Key to set * @param {mixed} value Setting value * @returns {void} */ setSetting = function (key, value) { _settings[ key ] = value; }, /** * Adds strings to our language object * * @param {mixed} strings Either an {object} of key/values, or a {string} as a key * @param {string} [...] If strings is a string, this param is the value * @returns {void} */ setString = function (strings) { if( _.isString( strings ) && arguments.length == 2 && _.isString( arguments[1] ) ){ strings = {}; strings[ arguments[0] ] = arguments[1]; } else if( !_.isObject( strings ) ){ Debug.warn("Invalid strings object passed to addString"); return; } $.each( strings, function (key, value ){ _strings[ key ] = value; }); }, /** * Detect if a language string exists * * @param {mixed} key The key * @returns {bool} */ haveString = function (key) { return !_.isUndefined( _strings[ key ] ); }, /** * Retrieves a string from storage, and interpolates values if needed * * @param {mixed} strings Either an {object} of key/values, or a {string} as a key * @param {string} [...] If strings is a string, this param is the value * @returns {string} The interpolated string (empty if the key does not exist) */ getString = function (key, values) { if( _.isUndefined( _strings[ key ] ) ){ Debug.warn("The string '" + key + "' doesn't exist"); return ''; } var thisString = _strings[ key ], values = values || {}; // Do we have special values to parse? if( !_.indexOf( thisString, '{{' ) ){ return thisString; } // Add some vars into the values _.extend( values, { baseURL: ips.getSetting('baseURL') }); try { return _.template( thisString )( values ); } catch (err) { return ( Debug.isEnabled() ) ? "[Error using language string " + key + "]" : ""; } }, /** * GraphQL Response setter * * @param {string} key Key to set * @param {mixed} value Response value * @returns {void} */ setGraphQlData = function (key, value) { _graphData[ key ] = value; }, /** * GraphQL Responses getter * * @param {string} key Key to return * @returns {mixed} Data, or undefined if it doesn't exist */ getGraphQlData = function (key) { return _graphData[ key ]; }, /** * Returns the location in which we're running * * @returns {string} Location key */ getLocation = function () { return _location; }, /** * Create a module, checking that each namespace is ready to accept * modules. If the init method exists on the given module, it is added * to the document.ready queue. * * @param {string} name The full module path to create * @param {function} fn The module definition * @returns {void} */ createModule = function (name, fn) { var bits = name.split('.'), currentPath = window; var tmpName = []; // Loop through the path pieces and ensure they exist if( bits.length ){ for( var i = 0; i < bits.length; i++ ){ if( _.isUndefined( currentPath[ bits[i] ] ) ){ currentPath[ bits[i] ] = {}; } currentPath = currentPath[ bits[i] ]; } } else { return false; } // Assign our module to the path currentPath = _.extend( currentPath, fn.call( currentPath ) ); // Set up init if it exists if( _.isFunction( currentPath.init ) ){ // support external loading. If the script is embedded in another webpage after it loads, the document is already 'ready'. We will instead listen for a 'ipsScriptsReady' event if (window.ipsScriptsExternallyLoaded) { $(document.body).on('ipsScriptsReady', function () { currentPath.init.call(currentPath); }) } else { $(document).ready(function () { currentPath.init.call(currentPath); }); } } $( document ).trigger( 'moduleCreated', [ name ] ); }, /** * Provides a pluralized version of a string based on the supplied value * * @param {string} stringKey The key of the language string containing the pluralization tag * @param {number} value The value to be pluralized * @returns {void} */ pluralize = function (stringKey, params) { // Get the string we'll work with var word = stringKey; // Get the pluralization tags from it var i = 0; if( !_.isArray( params ) ){ params = [ params ]; } word = word.replace( /\{(!|\d+?)?#(.*?)\}/g, function (a,b,c,d) { // {# [1:count][?:counts]} if( !b || b == '!' ){ b = i; i++; } var value; var fallback; var output = ''; var replacement = params[ b ] + ''; c.replace( /\[(.+?):(.+?)\]/g, function (w,x,y,z) { var xLen = x.length * -1; if( x == '?' ){ fallback = y.replace( '#', replacement ); } else if( x.charAt(0) == '%' && x.substring( 1 ) == replacement.substring( 0, x.substring( 1 ).length ) ){ value = y.replace( '#', replacement ); } else if( x.charAt(0) == '*' && x.substring( 1 ) == replacement.substr( -x.substring( 1 ).length ) ){ value = y.replace( '#', replacement ); } else if( x == replacement ) { value = y.replace( '#', replacement ); } }); output = a.replace( /^\{/, '' ).replace(/\}$/, '' ).replace( '!#', '' ); output = output.replace( b + '#', replacement ).replace( '#', replacement ); output = output.replace( /\[.+\]/, value == null ? fallback : value ).trim(); return output; }); return word; }, testConsole = function () { if( window.atob && window.console ){ console.log( window.atob("ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgd293ICAgICAgICAgICAgICAgICAgICAgICAgICAgI\ CAgIAogICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGZvcnVtICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAga\ G93IGFqYXggICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICB2ZXJ5IGNvbW11bml0eSAgICAgIC\ AgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWNoIG1lbWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\ ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCg==") ); } return ''; }; var templates = function () { var _templateStore = {}; /** * Sets a mustache template * * @param {string} key Key name for this template * @param {mixed} template Template, as string or function which returns a string * @returns {void} */ var set = function (key, template) { _templateStore[ key ] = template; }, /** * Return a mustache template * * @param {string} key Key name for the template to retrieve * @returns {string} Template contents */ get = function (key) { if( _templateStore[ key ] ){ if( _.isFunction( _templateStore[ key ] ) ){ return _templateStore[ key ](); } else { return _templateStore[ key ]; } } return ''; }, /** * Renders a mustache template * * @param {string} key Key name for this template * @param {object} obj Object of values with which to render the template * @returns {string} The rendered contents */ render = function (key, obj) { // Add some common vars obj = _.extend( obj || {}, { baseURL: ips.getSetting('baseURL'), lang: _lang, blankImg: ips.getSetting('blankImg') || '' }); return Mustache.render( get( key ), obj ); }, /** * Returns a compile mustache template ready for us * * @param {string} key Key name for this template * @returns {function} A compiled template function */ compile = function (key) { if( _templateStore[ key ] ){ return Mustache.parse( get( key ) ); } return $.noop; }, /** * Returns a function that Mustache can use to swap out language strings * Allows {{#lang}}key{{/lang}} to be used in the templates * * @returns {function} A closure */ _lang = function () { return function (text, render) { return render( ips.getString( text ) ); } }; return { set: set, get: get, render: render, compile: compile }; }(); /** * Clean the contents of an element. * * @param elem */ function cleanContentsOf(elem) { elem = $(elem); if (!elem.length) { Debug.log(`Skipped the cleaning of IPS modules and controllers from an empty content selection`); return; } Debug.log('Cleaning up IPS modules and controllers from content'); // Clean the controllers from this element window.ips.controller.cleanContentsOf(elem, false); // Remove any widgets that exist in this elem window.ips.ui.destructAllWidgets( $( elem ) ); elem.each(function() { const elem = $(this); for (const group of ['ui', 'utils']) { for (const module in window.ips[group]) { if (window.ips[group][module].onCleanup instanceof Function) { try { window.ips[group][module].onCleanup(elem); } catch (e) { e.message = `An error occurred when calling ips[${JSON.stringify(group)}][${JSON.stringify(module)}].onCleanup() an an element`; e.cleanupTarget = elem; Debug.error(e); } } } } }); $(document).trigger('contentCleanup', [elem]); } return { boot: boot, createModule: createModule, getSetting: getSetting, getAllSettings: getAllSettings, setSetting: setSetting, getGraphQlData: getGraphQlData, setGraphQlData: setGraphQlData, getAjax: getAjax, getContainer: getContainer, setString: setString, haveString: haveString, getString: getString, pluralize: pluralize, getLocation: getLocation, templates: templates, testConsole: testConsole, cleanContentsOf }; }()); ips.boot( ipsSettings ); // Extend some core objects with useful methods String.prototype.startsWith = function (pattern) { return this.lastIndexOf(pattern, 0) === 0; }; }(jQuery, _)); // Polyfill for event.submitter not existing in safari // Taken from https://gist.github.com/nuxodin/3ae174f2a6a112df3ccad22459237a91 !function(){ var lastBtn = null document.addEventListener('click',function(e){ if (!e.target.closest) return; lastBtn = e.target.closest('button, input[type=submit]'); }, true); document.addEventListener('submit',function(e){ if ('submitter' in e) return; var canditates = [document.activeElement, lastBtn]; lastBtn = null; for (var i=0; i < canditates.length; i++) { var candidate = canditates[i]; if (!candidate) continue; if (!candidate.form) continue; if (!candidate.matches('button, input[type=button], input[type=image]')) continue; e.submitter = candidate; return; } e.submitter = e.target.querySelector('button, input[type=button], input[type=image]'); }, true); }();]]> = options.level && options.adapters.length ){ for( var i = 0; i < options.adapters.length; i++ ){ options.adapters[ i ].write( level, message ); } } return Debug; }, /** * Sets the enabled/disabled status of logging * * @param {boolean} enabled Whether logging should be enabled * @returns {object} Returns Debug */ setEnabled = function (enabled) { options.enabled = ( enabled === false ) ? false : true; return Debug; }, /** * See whether debugging is enabled * * @returns {boolean} */ isEnabled = function () { return options.enabled; }, /** * Sets the debugging severity threshold * * @param {number} level Level to set as minimum threshold * @returns {object} Returns Debug */ setLevel = function (level) { if( LEVEL[ level ] ){ options.level = LEVEL[ level ]; } return Debug; }, /** * Adds an adapter to use for logging * * @param {number} level Level to set as minimum threshold * @returns {object} Returns Debug */ addAdapter = function (adapter) { if( _.isObject( adapter ) ){ options.adapters.push( adapter ); } return Debug; }, /** * Clears all adapters * * @returns {object} Returns Debug */ clearAdapters = function () { options.adapters = []; return Debug; }; return { // logging methods debug: debug, log: debug, // Alias for matt info: info, warn: warn, error: error, // other methods setEnabled: setEnabled, setLevel: setLevel, addAdapter: addAdapter, clearAdapters: clearAdapters, isEnabled: isEnabled }; }(); /** Default Console adapter */ var Console = function() {}; Console.prototype.write = function ( level, msg ){ if( window.console ){ switch( level ){ case 1: if( _.isObject( msg ) ){ console.dir( msg ); } else { console.log( msg ); } break; case 2: console.info( msg ); break; case 3: console.warn( msg ); break; case 4: console.error( msg ); break; } } }; Debug.addAdapter( new Console ); if ( ipsDebug || ( !_.isUndefined( window.localStorage ) && 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem('DEBUG') ) ) { Debug.setEnabled( true ).setLevel( 'DEBUG' ).info("Enabled logging"); } }(jQuery, _));]]> controllerOne( mixin1; mixin2 ), controllerTwo, controllerThree, returns: *
		 * {
		 * 	controllerOne: [ mixin1, mixin2 ],
		 *	controllerTwo: [],
		 * 	controllerThree: []
		 * }
		 * 
* * @returns {string} */ _getControllersAndMixins = function (controllerString) { var controllers = {}; var pieces = controllerString.split(','); for( var i = 0; i < pieces.length; i++ ){ pieces[i] = pieces[i].trim(); // Fix case issues on user-submitted content if( !_.isUndefined( _controllerCaseMap[ pieces[i] ] ) ){ pieces[i] = _controllerCaseMap[ pieces[i] ]; } if( pieces[i].indexOf('(') === -1 ){ controllers[ pieces[i] ] = []; continue; } var p = pieces[i].match( /([a-zA-Z0-9.]+)\((.+?)\)/i ); var mixinPieces = []; _.each( p[2].split(';'), function (val) { mixinPieces.push( val.trim() ); }); controllers[ p[1] ] = mixinPieces; } return controllers; }, /** * Returns an incremental controller ID * Controller IDs are used to enable controllers to identify events that they * emitted themselves. * * @returns {string} */ getInstanceID = function () { return 'ipscontroller' + (++instanceID); }, /** * Allows an element to be cleaned externally. If the element passed is not a controller scope, * it'll search down one level of the DOM to find controllers. * * @param {element} elem The element to clean * @param {boolean} [destroyWidgets] Destroy the widgets along with the controllers? * @returns {void} */ cleanContentsOf = function (elem, destroyWidgets=true) { if (destroyWidgets) { ips.cleanContentsOf(elem) return; } Debug.log('Cleaning controllers from content'); $( elem ).find('[data-controller]') .each( function () { var loopController = $( this ); var controllers = loopController.data( '_controllerObjs' ) || []; if( controllers.length ){ loopController.data('_controllerObjs', []); for( var i = 0; i < controllers.length; i++ ){ controllers[i]._destroy.apply( controllers[i] ); delete controllers[i]; } } }); }, /** * Initializes a controller instance by creating a new function, extending it with * the controller methods then initializing it on the relevant dom node * * @param {element} elem The element that will form the scope of this controller * @param {string} controllerID ID of this controller * @returns {void} */ initControllerOnElem = function (elem, controllerID, mixins) { if( !_controllers[ controllerID ] ){ Debug.error("Controller '" + controllerID + "' has not been registered"); return; } if( _.isUndefined( $( elem ).data('_controllers') )){ $( elem ).data('_controllers', []); } $( elem ).data('_controllers').push( controllerID ); if( _.isUndefined( _prototypes[ controllerID ] ) ){ // Fetch our controller prototype _prototypes[ controllerID ] = getBaseController(); // Extend with our specific controller methods $.extend( true, _prototypes[ controllerID ].prototype, _controllers[ controllerID ] ); } // And init if( _.isUndefined( $( elem ).data( '_controllerObjs' ) ) ){ $( elem ).data( '_controllerObjs', [] ); } var controllers = $( elem ).data( '_controllerObjs' ); var obj = new _prototypes[ controllerID ](elem, controllerID); controllers.push( obj ); // Any mixins? // Auto mixins first if( !_.isUndefined( _autoMixins[ controllerID ] ) && _.size( _autoMixins[ controllerID ] ) ){ _.each( _autoMixins[ controllerID ], function (val, key) { _autoMixins[ controllerID ][ key ].call( obj ); }); } // Then the manually-specified ones if( mixins.length ){ for( var i = 0; i < mixins.length; i++ ){ if( !_.isUndefined( _manualMixins[ controllerID ] ) && !_.isUndefined( _manualMixins[ controllerID ][ mixins[i] ] ) ){ _manualMixins[ controllerID ][ mixins[i] ].call( obj ); } } } if( _.isFunction( obj.initialize ) ){ obj.initialize.call( obj ); } $( elem ).removeData( '_controller' + controllerID ); $( document ).trigger( 'controllerReady', { controllerID: obj.controllerID, controllerType: obj.controllerType, controllerElem: elem }); }, /** * Finds controllers within a node that have an ID matching the provided name * Wildcard character * supported at the front or end of the controller parameter * * @param {string} controller Controller name to find * @param {element} node Optional node to search in (document by default) * @returns {function} */ _findSubControllers = function (controller, node) { var results = []; node = ( node && ( _.isElement( node ) || node.jquery ) ) ? node : document; if( controller.indexOf('*') === -1 ){ results = $( node ).find('[data-controller*="' + controller + '"]'); } else { var pieces = controller.split('.'); if( pieces[0] == '*' ){ pieces.shift(); results = $( node ).find('[data-controller$="' + pieces.join('.') + '"]'); } else if( pieces[ pieces.length - 1 ] == '*' ){ pieces.pop(); results = $( node ).find('[data-controller^="' + pieces.join('.') + '"]'); } } return results; }, /** * Returns a new function that will form our controller prototype * * @returns {function} */ getBaseController = function () { /** Base controller definition */ var baseController = function (scope, type) { this.controllerType = type; this.controllerID = getInstanceID(); this.scope = $( scope ); this._eventListeners = []; var self = this; // Advice methods - inspired by http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/ // and Twitter Flight var adviceFuncs = { before: function (baseFn, newFn) { return function () { newFn.apply( this, arguments ); return baseFn.apply( this, arguments ); }; }, after: function (baseFn, newFn) { return function () { var toReturn = baseFn.apply( this, arguments ); newFn.apply( this, arguments ); return toReturn; } }, around: function (baseFn, newFn) { return function () { var args = ips.utils.argsToArray( arguments ); args.unshift( baseFn.bind( this ) ); return newFn.apply( this, args ); } } } _.each( ['before', 'after', 'around'], _.bind( function (type) { this[ type ] = function (base, fn) { if( _.isUndefined( this[ base ] ) || !_.isFunction( this[ base ] ) ){ Debug.log( "Method '" + base + '" is not present in controller ' + this.controllerID ); return; } // Replace our base method with a wrapped version this[ base ] = adviceFuncs[ type ]( this[ base ], fn ); }; }, this ) ); //Debug.info("Initialized " + this.controllerID + " of type " + this.controllerType); }; baseController.method('_destroy', function () { Debug.log( 'Destroyed instance ' + this.controllerID + ' of ' + this.controllerType ); // Remove each event listener that was created in this controller if( this._eventListeners.length ){ for( var i = 0; i < this._eventListeners.length; i++ ){ var data = this._eventListeners[i]; if( data['delegate'] ){ data['elem'].off( data['ev'], data['delegate'], data['fn'] ); } else { data['elem'].off( data['ev'], data['fn'] ); } } } if( _.isFunction( this.destroy ) ){ this.destroy.call( this ); } // Remove reference to scope so that GC can do its thing this.scope = null; }); // Searches for controllers within the current, triggers a destroy event and deletes the controller objs baseController.method('cleanContents', function () { Debug.log('Cleaning contents of controller'); this.scope.find('[data-controller]') .each( function () { var loopController = $( this ); var controllers = loopController.data( '_controllerObjs' ) || []; if( controllers.length ){ loopController.data('_controllerObjs', []); for( var i = 0; i < controllers.length; i++ ){ controllers[i]._destroy.apply( controllers[i] ); delete controllers[i]; } } }); // Remove any widgets that exist in this elem ips.ui.destructAllWidgets( this.scope ); }); baseController.method('trigger', function (elem, ev, data) { // Convert silly arguments object to an array var args = ips.utils.argsToArray( arguments ); elem = ( !_.isElement( elem ) && !elem.jquery ) ? this.scope : $( args.shift() ); ev = args[0]; data = args[1] || {}; // Add our origin to the event if( !data.stack ){ data.stack = []; } data.stack.push( 'controllers.' + this.controllerType + '.' + this.controllerID ); elem.trigger( ev, data ); }); baseController.method('on', function (elem, ev, delegate, fn) { // Convert silly arguments object to an array var args = ips.utils.argsToArray( arguments ); // Reconfigure our args as necessary elem = ( !_.isElement( elem ) && elem != document && elem != window ) ? this.scope : $( args.shift() ); ev = args[0]; fn = ( args.length == 3 ) ? args[2] : args[1]; delegate = ( args.length == 3 ) ? args[1] : undefined; if( !_.isFunction( fn ) ){ Debug.warn("Callback function for " + ev + " doesn't exist in " + this.controllerType + " (" + this.controllerID + ")"); return; } // Bind our callback to the controller let _fn = _.bind( fn, this ); fn = (...args) => { try { _fn(...args) } catch (e) { Debug.error(e); } } // Set up the event if( delegate ){ elem.on( ev, delegate, fn ); this._eventListeners.push({ elem: elem, event: ev, delegate: delegate, fn: fn }); } else { elem.on( ev, fn ); this._eventListeners.push({ elem: elem, event: ev, fn: fn }); } }); baseController.method('triggerOn', function (controller, ev, data) { var toTrigger = _findSubControllers( controller, this.scope ); if( !toTrigger.length ){ return; } data = data || {}; // Add our origin to the event if( !data.stack ){ data.stack = []; } data.stack.push( 'controllers.' + this.controllerType + '.' + this.controllerID ); toTrigger.trigger( ev, data ); }); return baseController; }; return { initControllerOnElem: initControllerOnElem, register: register, mixin: mixin, isRegistered: isRegistered, init: init, cleanContentsOf: cleanContentsOf }; }); }( jQuery, _ )); ]]>
') .attr('type', 'text') .attr('data-role', 'minimizedVersion') .attr('placeholder', ips.getString('specifyLocation')) .on('focus', function (e) { // Hide the minimized version $(this).hide(); // Set country if applicable if (options.country) { $(elem).find('[data-role="countrySelect"]').val(options.country); } // Init init(elem, options, e); // Show the main address fields elem.show().find('input').first().focus(); }); const value = []; // Build the existing value elem.find('input, select').each( function () { if( $( this ).val() ){ if( $( this ).is('select') ){ value.push( $( this ).find('option[value="' + $( this ).val() + '"]').text().trim() ); } else { value.push( $( this ).val().trim() ); } } }); if (value.length) { tempInput.val(value.join(', ')); } elem .hide() .after( tempInput ); } /** * Handle updates based on the country input being changed. This is also invoked when the module is first initialized to set it up * * @param {jQuery} elem * @param {AddressFormOptions} options * @param {Event} e */ function countryChange(elem, options, e) { ips.getAjax()( ips.getSetting('baseURL') + 'index.php?app=core&module=system&controller=ajax&do=states&country=' + $(e.target).val() ) .done( function (response) { let regionSelect; let regionText; if (response.length) { if( !$( elem ).find('[data-role="regionSelect"]').length ) { regionText = $( elem ).find('[data-role="regionText"]'); } else { regionText = $(elem).find('[data-role="regionSelect"]'); } regionSelect = $(''); regionText.attr( 'name', regionSelect.attr('name') ).val( "" ); regionSelect.replaceWith( regionText ); } } } ); if (typeof elem.attr('data-ipsAddressForm-googlePlaces') === 'string') { ips.ui.map.afterGoogleMapsLoaded(() => googlePlacesInit(elem)) } } /** * Adds an address line to an address form input * * @param {jQuery} elem * @param {string} value */ function addAddressLine(elem, value) { const lastLine = elem.find('[data-role="addressLine"]').closest('li').last(); const newLine = lastLine.clone(); if (value) { newLine.find('input').focus().val( value ); } lastLine.after(newLine); } /** * Setup the add address line button; sets up the click handler * @param {jQuery} elem */ function recalculateAddAddressLineButton(elem) { elem.find( '[data-role="addAddressLine"]' ).remove(); const button = $(''); button.click( function () { addAddressLine(elem, ''); recalculateAddAddressLineButton(elem); }); elem.find('[data-role="addressLine"]').last().after( button ); } /** * Initialize the autocomplete suggestions widget * * @param {jQuery} elem */ function googlePlacesInit(elem) { const googlePlacesInput = $(elem).find('[data-role="addressLine"]').first(); const options = { types: ['geocode'], componentRestrictions: {country: $(elem).find('[data-role="countrySelect"]').val()} }; if (!options.componentRestrictions.country) { delete options.componentRestrictions } const autocomplete = new google.maps.places.Autocomplete(googlePlacesInput.get(0), options); googlePlacesInput.on( 'focus', function () { if( navigator.geolocation ){ navigator.geolocation.getCurrentPosition( function (position) { const geolocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); autocomplete.setBounds( new google.maps.LatLngBounds( geolocation, geolocation ) ); }); } } ); googlePlacesInput.on( 'keypress', function(e) { if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { return false; } } ); google.maps.event.addListener( autocomplete, 'place_changed', function () { const place = autocomplete.getPlace(); for (let i = 0; i < $( elem ).find('[data-role="addressLine"]').length; i++) { $( elem ).find('[data-role="addressLine"]').val( '' ); } const parsedAddress = $('
' + place.adr_address + '
'); const addressLines = []; let existingAddressLines = $(elem).find('[data-role="addressLine"]').length; if ( parsedAddress.find('.post-office-box').length ) { addressLines.push( parsedAddress.find('.post-office-box').text() ); } if ( parsedAddress.find('.street-address').length ) { addressLines.push( parsedAddress.find('.street-address').text() ); } if ( parsedAddress.find('.extended-address').length ) { addressLines.push( parsedAddress.find('.extended-address').text() ); } for (let i = 0; i < addressLines.length; i++) { if( existingAddressLines ){ $( elem ).find('[data-role="addressLine"]').slice( i, 1 ).focus().val( addressLines[i] ); existingAddressLines--; } else { addAddressLine(elem, addressLines[i]); } } if (parsedAddress.find('.locality') ) { elem.find('[data-role="city"]').focus().val( parsedAddress.find('.locality').text() ); } if (parsedAddress.find('.region')) { elem.find('[data-role="regionText"]').focus().val( parsedAddress.find('.region').text() ); if ( elem.find('[data-role="regionSelect"] option[value="' + parsedAddress.find('.region').text() + '"]').length ) { elem.find('[data-role="regionSelect"]').val( parsedAddress.find('.region').text() ); } else { for (let i in place.address_components ) { if ( place.address_components[i].types[0] === 'administrative_area_level_1' || place.address_components[i].types[0] === 'administrative_area_level_2' ) { if ( elem.find('[data-role="regionSelect"] option[value="' + place.address_components[i].long_name + '"]').length ) { elem.find('[data-role="regionSelect"]').val( place.address_components[i].long_name ); break; } else if ( elem.find('[data-role="regionSelect"] option[value="' + place.address_components[i].short_name + '"]').length ) { elem.find('[data-role="regionSelect"]').val( place.address_components[i].short_name ); break; } } } } } if (parsedAddress.find('.postal-code')) { elem.find('[data-role="postalCode"]').focus().val( parsedAddress.find('.postal-code').text() ); } }); } // Register this module as a widget to enable the data API and // jQuery plugin functionality ips.ui.registerWidget( 'addressForm', ips.ui.addressForm, ['minimize','country','requireFullAddress'] ); return { respond }; }); }(jQuery, _));]]>
/* global ips, _, Debug */ /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * * ips.ui.alert.js - Alert widget for alerts, prompts, confirms. * * Author: Rikki Tissier */ ;( function($, _, undefined){ "use strict"; ips.createModule('ips.ui.alert', function(){ var respond = function (elem, options) { alertObj( options, elem ); }, show = function (options) { alertObj( options ); }; ips.ui.registerWidget('alert', ips.ui.alert, [ 'message', 'type', 'icon', 'focus' ] ); return { respond: respond, show: show }; }); /** * Alert instance * * @param {object} options The options passed into this instance * @returns {void} */ var alertObj = function (options) { var alert = null, modal = null; var _defaults = { type: 'alert', // alert, confirm, prompt, verify message: ips.getString('generic_confirm'), buttons: { ok: ips.getString('ok'), cancel: ips.getString('cancel'), yes: ips.getString('yes'), no: ips.getString('no') }, icon: 'info', showIcon: true, callbacks: {} }; var _icons = { warn: 'fa fa-exclamation-triangle', success: 'fa fa-check-circle', info: 'fa fa-info-circle', ok: 'fa fa-check-circle', question: 'fa fa-question-circle' }; options = _.defaults( options || {}, _defaults ); /** * Initialization * * @returns {void} */ var init = function () { // Build alert _buildAlert(); _setUpEvents(); }, /** * Set up events for the alert - button clicks, and document events for keyboard accessibility * * @returns {void} */ _setUpEvents = function () { alert.on( 'click', '[data-action]', _clickButton ); $( document ).on('keydown', function (e) { switch( e.keyCode ){ case ips.ui.key.ESCAPE: if( options.type == 'alert' ){ alert.find('[data-action="ok"]').click(); } else { alert.find('[data-action="cancel"], [data-action="no"]').click(); } break; case ips.ui.key.ENTER: alert.find('[data-action="ok"], [data-action="yes"]').click(); break; } }); }, /** * Event handler for clicking a button in the alert * Looks for a callback to execute, then removes the alert from the dom * * @param {event} e Event object * @returns {void} */ _clickButton = function (e) { var button = $( e.currentTarget ); var action = button.attr('data-action'); var value = null; if( options.type == 'prompt' ){ value = alert.find('[data-role="promptValue"]').val(); } if( _.isFunction( options.callbacks[ action ] ) ){ options.callbacks[ action ]( value ); } _remove(); }, /** * Removes the alert from the dom and unsets the events * * @returns {void} */ _remove = function () { modal.remove(); ips.utils.anim.go( 'fadeOutDown fast', alert ).done( function () { alert.remove(); }); }, /** * Builds the alert element based on options * * @returns {void} */ _buildAlert = function () { var parts = {}, buttons = []; // Icon if( options.showIcon ){ parts.icon = ips.templates.render( 'core.alert.icon', { icon: _icons[ options.icon ] || options.icon }); } parts.id = 'alert_' + ( Math.round( Math.random() * 10000000 ) ); parts.text = options.message; if( options.subText ){ parts.subtext = ips.templates.render( 'core.alert.subText', { text: options.subText }); } if( options.subTextHtml ){ parts.subtext = ips.templates.render( 'core.alert.subTextHtml', { text: options.subTextHtml }); } // Build buttons switch( options.type ){ case 'alert': buttons.push( ips.templates.render( 'core.alert.button', { action: 'ok', title: options.buttons.ok, extra: 'ipsButton_primary' })); break; case 'confirm': case 'prompt': buttons.push( ips.templates.render( 'core.alert.button', { action: 'ok', title: options.buttons.ok, extra: 'ipsButton_primary' })); buttons.push( ips.templates.render( 'core.alert.button', { action: 'cancel', title: options.buttons.cancel, extra: 'ipsButton_light' })); break; case 'verify': buttons.push( ips.templates.render( 'core.alert.button', { action: 'yes', title: options.buttons.yes, extra: 'ipsButton_primary' })); if( options.buttons.no ){ buttons.push( ips.templates.render( 'core.alert.button', { action: 'no', title: options.buttons.no, extra: 'ipsButton_light' })); } if( options.buttons.cancel ){ buttons.push( ips.templates.render( 'core.alert.button', { action: 'cancel', title: options.buttons.cancel, extra: 'ipsButton_light' })); } break; } parts.buttons = buttons.join(''); // Prompt? if( options.type == 'prompt' ){ parts.text += ips.templates.render( 'core.alert.prompt'); } // Build box var tmpAlert = $.parseHTML( ips.templates.render( 'core.alert.box', parts ).trim() ); alert = $( tmpAlert[0] ); $('body').append( alert ); // Build modal modal = ips.ui.getModal(); modal.css({ zIndex: ips.ui.zIndex() }).show(); alert.css( { zIndex: ips.ui.zIndex() } ); ips.utils.anim.go('zoomIn fast', alert ); // Focus the appropriate element if( options.focus ){ alert .find('[data-action="' + options.focus + '"]') .focus(); } else { if( options.type == 'prompt' ){ alert .find('[data-role="promptValue"]') .val( options.value || '' ) .focus(); } else { alert .find('[data-action="ok"], [data-action="yes"]') .focus(); } } }; init(); }; }(jQuery, _)); '); } else if( count.length === 0 ){ elem.find('.cAutoCheckIcon').html(''); } else { elem.find('.cAutoCheckIcon').html(''); } var countToDisplay = count.length + initialCount; if( countToDisplay ){ elem.find('[data-role="autoCheckCount"]').text( countToDisplay ).show(); } else if( elem.find('[data-role="autoCheckCount"]').is(':visible') ) { // We use a timeout because more than one setInitialCount call can be sent, so if a 0 comes in and then a 1, the fadeout will take // too long and a hide() call will occur after the show() call above since the fadeOut takes time. setTimeout( function(){ if( !initialCount ) { ips.utils.anim.go( 'fadeOut', elem.find('[data-role="autoCheckCount"]') ); } }, 300 ); } return count.length; }; init(); return { destruct: destruct, refresh: refresh }; }; }(jQuery, _));]]> ", "'", "\"" ] ), unique: false, customValues: true, fieldTemplate: 'core.autocomplete.field', resultsTemplate: 'core.autocomplete.resultWrapper', resultItemTemplate: 'core.autocomplete.resultItem', tokenTemplate: 'core.autocomplete.token', addTokenTemplate: 'core.autocomplete.addToken', addTokenText: ips.getString( 'add_tag' ), queryParam: 'q', forceLower: false, minLength: 1, minAjaxLength: 1, commaTrigger: true, searchFieldThreshold: 20 }; var respond = function (elem, options) { if( !$( elem ).data('_autocomplete') ){ $( elem ).data('_autocomplete', autocompleteObj(elem, _.defaults( options, defaults ) ) ); } }, /** * Destruct the autocomplete widget on this elem * * @param {element} elem The element to check * @returns {void} */ destruct = function (elem) { var obj = getObj( elem ); if( !_.isUndefined( obj ) ){ obj.destruct(); } }, /** * Retrieve the autocomplete instance (if any) on the given element * * @param {element} elem The element to check * @returns {mixed} The dialog instance or undefined */ getObj = function (elem) { elem = $( elem ); if( elem.data('_autocomplete') ){ return elem.data('_autocomplete'); } else if( $( '[name="' + elem.attr('name') + '_original' + '"]' ).length && $( '[name="' + elem.attr('name') + '_original' + '"]' ).data('_autocomplete') ){ return $( '[name="' + elem.attr('name') + '_original' + '"]' ).data('_autocomplete'); } return undefined; }; ips.ui.registerWidget('autocomplete', ips.ui.autocomplete, [ 'multiValues', 'freeChoice', 'dataSource', 'maxItems', 'itemSep', 'resultsElem', 'unique', 'commaTrigger', 'fieldTemplate', 'resultsTemplate', 'resultItemTemplate', 'tokenTemplate', 'addTokenTemplate', 'addTokenText', 'queryParam', 'minLength', 'maxLength', 'forceLower', 'disallowedCharacters', 'minAjaxLength' ] ); return { respond: respond, destruct: destruct, getObj: getObj }; }); /** * autocomplete instance * * @param {element} elem The element this widget is being created on * @param {object} options The options passed into this instance * @returns {void} */ var autocompleteObj = function (elem, options, e) { var timer, blurTimer, lastValue = '', originalTextField, valueField, textField, dataSource, elemID = $( elem ).identify().attr('id'), wrapper, inputItem, resultsElem, selectedToken, disabled = false, required = false, tooltip = null, tooltipTimer = null, mouseOverResults = false, hasError = false; /** * Sets up this instance. The datasource object is chosen depending on what options and/or * attributes are provided. We can fetch results from a local , remotely via ajax * or not look up results from a data source at all. * * @returns {void} */ var init = function () { if( $( elem ).is('textarea, input[type="text"], input[type="search"]') ){ originalTextField = $( elem ); } else { originalTextField = $( elem ).find('textarea, input[type="text"], input[type="search"]').first(); } try { options.disallowedCharacters = $.parseJSON( options.disallowedCharacters ); } catch (err) { Debug.error("Couldn't parse disallowed characters option"); } // Add our autocomplete wrapper to the page, and move the element into it _buildWrapper(); // Set up the data source for this control _getDataSource(); // Remove list from original field originalTextField.removeAttr('list'); // Build the list if( dataSource.type != 'none' ){ _buildResultsList(); if( dataSource.type == 'local' ) { _initAutocomplete(); } } if( originalTextField.is(':disabled') ){ disabled = true; } if( originalTextField.is('[required]') ){ required = true; originalTextField .removeProp('required') .removeAttr('aria-required'); } // Turn off autocomplete and spellcheck so the browser menu doesn't get in the way textField .prop( 'autocomplete', 'off' ) .prop( 'spellcheck', false ) .prop( 'disabled', disabled ) .attr( 'aria-autocomplete', 'list' ) .attr( 'aria-haspopup', 'true' ) .attr( 'tabindex', originalTextField.attr('tabindex') || '' ); if( options.maxLength ){ textField.attr( 'maxlength', options.maxLength + 1 ); } $( document ).on( 'click', _documentClick ); wrapper.click(function(e) { e.stopPropagation(); return false; }); // Set up events textField .on( 'focus', _focusField ) .on( 'blur', _blurField ) .on( 'keydown', _keydownField ) .on( 'keyup', _keyupField ) .on( 'input', _expandField ) .on( 'keypress', _keypressField ); wrapper .on( 'click', _clickWrapper ) .on( 'click', '[data-action="addToken"]', _clickAddToken ) .on( 'keydown', _keydownWrapper ) .on( 'propChanged', _propChanged ) .toggleClass( 'ipsField_autocompleteDisabled', disabled ); _buildInitialTokens(); elem .on( 'blur', function () { // For closed tagging, our text field is the same element as the autocomplete widget // In that case, we don't want to blur otherwise we go into a death loop. if( textField !== elem ){ textField.trigger('blur'); } }) .trigger( 'autoCompleteReady', { elemID: elemID, elem: elem, currentValues: tokens.getValues() }); // Some widgets like prefixedAutocomplete may not set up until after this UI module runs, so make sure we trigger the 'ready' event when needed elem.on( 'reissueReady', function() { elem.trigger( 'autoCompleteReady', { elemID: elemID, elem: elem, currentValues: tokens.getValues() }); }); }, /** * Destruct * Removes event handlers assosciated with this instance * * @returns {void} */ destruct = function () { $( document ).off( 'click', _documentClick ); }, /** * Determines whether any errors are present in the autocomplete widget (e.g. duplicates) * * @returns {void} */ hasErrors = function () { return hasError; }, /** * Responds to the propChange event, which we use to determine whether the original field has been toggled * * @returns {void} */ _propChanged = function (e) { disabled = originalTextField.is(':disabled'); wrapper.toggleClass( 'ipsField_autocompleteDisabled', disabled ); }, /** * Builds tokens from whatever values exist in the original text field * * @returns {void} */ _buildInitialTokens = function () { var value = _getOriginalValue(); if( !value ){ return; } // Get individual values var splitValues = _.without( value.split( "\n" ), '' ); var itemCount = 0; itemCount = splitValues.length; // Clear field, as tokens.add() will re-add value originalTextField.val(''); if( splitValues.length ){ for( var i = 0; i < itemCount; i++ ){ _addToken( splitValues[i] ); } } }, /** * Returns the value from the original text field (i.e. the value provided by the backend on pag load) * * @returns {string} */ _getOriginalValue = function () { return originalTextField.val(); //return _.unescape( originalTextField.val() ).replace("'", "'").replace("'", "'"); }, /** * Builds the element that results will appear in * * @returns {void} */ _buildResultsList = function () { if( options.resultsElem && $( options.resultsElem ).length ){ resultsElem = $( options.resultsElem ); return; } var resultsList = ips.templates.render( options.resultsTemplate, { id: elemID }); wrapper.append( resultsList ); resultsElem = $('#' + elemID + '_results'); resultsElem .on('mouseover', '[data-value]', function (e) { results.select( $( e.currentTarget ) ); }) .on('mouseenter', function () { mouseOverResults = true; }) .on('mouseleave', function () { mouseOverResults = false; }) .on('click', '[data-value]', function (e) { _addToken( $( e.currentTarget ).attr('data-value') ); textField.focus(); }) .attr( 'aria-busy', 'false' ); }, /** * Builds an autocomplete search field for the list of tokens * * @returns {void} */ _initAutocomplete = function() { if( dataSource.totalItems() > options.searchFieldThreshold && !options.freeChoice ){ var searchField = ips.templates.render( 'core.autocomplete.searchTypeAhead', {} ); $('#' + elemID + '_results').prepend( searchField ); // Set up events $('#' + elemID + '_results').on( 'keyup', 'input[type="search"]', _keyupAutocomplete ); } }, /** * Character entered in the autocomplete field - update our results * * @returns {void} */ _keyupAutocomplete = function(e) { _loadResults( $(this).val() ); return true; }, /** * Builds the wrapper element that looks like a text input, but allows us to insert * items as tokens * * @returns {void} */ _buildWrapper = function () { var existingClasses = elem[0].className; $( elem ) .after( ips.templates.render( options.fieldTemplate, { id: elemID })) .removeClass( existingClasses ); wrapper = $( '#' + elemID + '_wrapper' ); inputItem = $( '#' + elemID + '_inputItem' ); // If users have to choose from a predefined list, we'll hide the text field // and build a link which will show the results panel if( !options.freeChoice ){ var insertElem = ips.templates.render('core.autocomplete.addToken', { text: options.addTokenText }); textField = elem; } else { var insertElem = $('').attr( { type: 'text', id: elemID + '_dummyInput' }) .prop( 'autocomplete', 'off' ); textField = insertElem; } // Make a copy of the original text field using its name. This is because it's difficult to set // arbitrary values in the original text field later if it's associated with a datalist. var name = originalTextField.attr('name'); originalTextField.attr( 'name', originalTextField.attr('name') + '_original' ); valueField = $('",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Me(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return R(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return R(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0
1?a[1]:a[0];break;case S+"X":l[2]=r.tan(M(a));break;case S+"Y":l[1]=r.tan(M(a));break;case x:a=a.split(",");l[0]=a[0];l[1]=a[1];l[2]=a[2];l[3]=a[3];l[4]=parseInt(a[4],10);l[5]=parseInt(a[5],10);break}c[0]=f[0]*l[0]+f[2]*l[1];c[1]=f[1]*l[0]+f[3]*l[1];c[2]=f[0]*l[2]+f[2]*l[3];c[3]=f[1]*l[2]+f[3]*l[3];c[4]=f[0]*l[4]+f[2]*l[5]+f[4];c[5]=f[1]*l[4]+f[3]*l[5]+f[5];f=[c[0],c[1],c[2],c[3],c[4],c[5]]}return c}function N(e){var t,n,i,s=e[0],o=e[1],u=e[2],a=e[3];if(s*a-o*u){t=r.sqrt(s*s+o*o);s/=t;o/=t;i=s*u+o*a;u-=s*i;a-=o*i;n=r.sqrt(u*u+a*a);u/=n;a/=n;i/=n;if(s*a1?t[1]:e==E?r||t[0]:n+"")]:[n,n];break;case S+"X":case S+"Y":case w:t=t?M(t):0;break;case x:return N(t?_(t):[1,0,0,1,0,0]);break}return[[i,t]]}function L(e){return m.test(e)}function A(e){return e.replace(/(?:\([^)]*\))|\s/g,"")}function O(e,t,n){while(n=t.shift()){e.push(n)}}function M(e){return~e.indexOf("deg")?parseInt(e,10)*(r.PI*2/360):~e.indexOf("grad")?parseInt(e,10)*(r.PI/200):parseFloat(e)}function _(e){e=/([^,]*),([^,]*),([^,]*),([^,]*),([^,p]*)(?:px)?,([^)p]*)(?:px)?/.exec(e);return[e[1],e[2],e[3],e[4],e[5],e[6]]}var s=n.createElement("div"),o=s.style,u="Transform",a=["O"+u,"ms"+u,"Webkit"+u,"Moz"+u],f=a.length,l,c,h="Float32Array"in t,p,d,v=/Matrix([^)]*)/,m=/^\s*matrix\(\s*1\s*,\s*0\s*,\s*0\s*,\s*1\s*(?:,\s*0(?:px)?\s*){2}\)\s*$/,g="transform",y="transformOrigin",b="translate",w="rotate",E="scale",S="skew",x="matrix";while(f--){if(a[f]in o){e.support[g]=l=a[f];e.support[y]=l+"Origin";continue}}if(!l){e.support.matrixFilter=c=o.filter===""}e.cssNumber[g]=e.cssNumber[y]=true;if(l&&l!=g){e.cssProps[g]=l;e.cssProps[y]=l+"Origin";if(l=="Moz"+u){p={get:function(t,n){return n?e.css(t,l).split("px").join(""):t.style[l]},set:function(e,t){e.style[l]=/matrix\([^)p]*\)/.test(t)?t.replace(/matrix((?:[^,]*,){4})([^,]*),([^)]*)/,x+"$1$2px,$3px"):t}}}else if(/^1\.[0-5](?:\.|$)/.test(e.fn.jquery)){p={get:function(t,n){return n?e.css(t,l.replace(/^ms/,"Ms")):t.style[l]}}}}else if(c){p={get:function(t,n,r){var s=n&&t.currentStyle?t.currentStyle:t.style,o,u;if(s&&v.test(s.filter)){o=RegExp.$1.split(",");o=[o[0].split("=")[1],o[2].split("=")[1],o[1].split("=")[1],o[3].split("=")[1]]}else{o=[1,0,0,1]}if(!e.cssHooks[y]){o[4]=s?parseInt(s.left,10)||0:0;o[5]=s?parseInt(s.top,10)||0:0}else{u=e._data(t,"transformTranslate",i);o[4]=u?u[0]:0;o[5]=u?u[1]:0}return r?o:x+"("+o+")"},set:function(t,n,r){var i=t.style,s,o,u,a;if(!r){i.zoom=1}n=T(n);o=["Matrix("+"M11="+n[0],"M12="+n[2],"M21="+n[1],"M22="+n[3],"SizingMethod='auto expand'"].join();u=(s=t.currentStyle)&&s.filter||i.filter||"";i.filter=v.test(u)?u.replace(v,o):u+" progid:DXImageTransform.Microsoft."+o+")";if(!e.cssHooks[y]){if(a=e.transform.centerOrigin){i[a=="margin"?"marginLeft":"left"]=-(t.offsetWidth/2)+t.clientWidth/2+"px";i[a=="margin"?"marginTop":"top"]=-(t.offsetHeight/2)+t.clientHeight/2+"px"}i.left=n[4]+"px";i.top=n[5]+"px"}else{e.cssHooks[y].set(t,n)}}}}if(p){e.cssHooks[g]=p}d=p&&p.get||e.css;e.fx.step.transform=function(t){var n=t.elem,i=t.start,s=t.end,o=t.pos,u="",a=1e5,f,h,v,m;if(!i||typeof i==="string"){if(!i){i=d(n,l)}if(c){n.style.zoom=1}s=s.split("+=").join(i);e.extend(t,C(i,s));i=t.start;s=t.end}f=i.length;while(f--){h=i[f];v=s[f];m=+false;switch(h[0]){case b:m="px";case E:m||(m="");u=h[0]+"("+r.round((h[1][0]+(v[1][0]-h[1][0])*o)*a)/a+m+","+r.round((h[1][1]+(v[1][1]-h[1][1])*o)*a)/a+m+")"+u;break;case S+"X":case S+"Y":case w:u=h[0]+"("+r.round((h[1]+(v[1]-h[1])*o)*a)/a+"rad)"+u;break}}t.origin&&(u=t.origin+u);p&&p.set?p.set(n,u,+true):n.style[l]=u};e.transform={centerOrigin:"margin"}})(jQuery,window,document,Math)]]> =0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);]]> 2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n=r)return[];for(;a1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ","᠎"],F=[],J=function(t){return new m(t)},V=J(),$=J(O),tt=J(v),et=J(),nt=J(q);V.on("@",J(y)).on(".",J(w)).on("+",J(S)).on("#",J(N)).on("?",J(L)).on("/",J(E)).on("_",J(C)).on(":",J(k)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(j)),V.on("\n",J(z)).on(Z,nt),nt.on(Z,nt);for(var ot=0;ot=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var p=l.emit();o.push(new p(t.substr(a-c,c)))}}return o},yt=V,kt=Object.freeze({State:m,TOKENS:Y,run:vt,start:yt}),wt=l();wt.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var jt=n(wt,l(),{type:"email",isLink:!0}),xt=n(wt,l(),{type:"email",isLink:!0,toHref:function(){this.v;return"mailto:"+this.toString()}}),zt=n(wt,l(),{type:"text"}),Ot=n(wt,l(),{type:"nl"}),St=n(wt,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof E;)n=!0,a.push(o[r].toString()),r++;for(;p(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r=0&&u++,n++,c++;if(u<0)for(var p=n-c;p0&&(o.push(new zt(a)),a=[]),n-=u,c-=u;var h=l.emit();o.push(new h(t.slice(n-c,n)))}}return a.length>0&&o.push(new zt(a)),o},fe=Object.freeze({State:d,TOKENS:Nt,run:ge,start:At});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var me=function(t){return ge(vt(t))},de=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=me(t),o=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=me(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=de,e.inherits=n,e.options=g,e.parser=fe,e.scanner=kt,e.test=be,e.tokenize=me}(self.linkify=self.linkify||{})}();]]> ' + this._rowSelector); if( _.isUndefined( this.scope.attr('data-dummyLoading') ) ){ this._basicLoading( loading ); return; } if( !loading || !rowElem.length || !rows.length ){ return; } var template = 'table.row.loading'; if( this.scope.attr('data-dummyLoadingTemplate') ){ template = this.scope.attr('data-dummyLoadingTemplate'); } var newRows = []; // Build an array of rendered rows that we'll insert in one go for( var i = 0; i <= rows.length; i++ ){ var rnd = parseInt( Math.random() * (10 - 1) + 1 ); newRows.push( ips.templates.render( template, { extraClass: this.scope.attr('data-dummyLoadingClass') || '', rnd: rnd } ) ); } this.scope.find('[data-role="tableRows"]').html( newRows.join('') ); }; /** * Show a loading spinner over the top of the existing rows * * @param {object} response JSON object containing new HTML pieces * @returns {void} */ this._basicLoading = function ( loading ) { var rowElem = this.scope.find('[data-role="tableRows"]'); // Make sure we actually have a tableRows element if( !rowElem.length ) { return; } if( !this._tableOverlay ){ this._tableOverlay = $('
').addClass('ipsLoading').hide(); ips.getContainer().append( this._tableOverlay ); } if( loading ){ // Get dims & position var dims = ips.utils.position.getElemDims( rowElem ); var position = ips.utils.position.getElemPosition( rowElem ); this._tableOverlay.show().css({ left: position.viewportOffset.left + 'px', top: position.viewportOffset.top + $( document ).scrollTop() + 'px', width: dims.width + 'px', height: dims.height + 'px', position: 'absolute', zIndex: ips.ui.zIndex() }); rowElem.css({ opacity: "0.5" }); } else { rowElem.animate({ opacity: "1" }); this._tableOverlay.hide(); } }; /** * Change the sorting * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ this.changeSorting = function (e, data) { data.originalEvent.preventDefault(); // Don't sort if there's no sort value on this item if( _.isUndefined( data.selectedItemID ) ){ return; } var current = this._getSortValue(); var menuItem = data.menuElem.find('[data-ipsMenuValue="' + data.selectedItemID + '"]'); var sortBy = data.selectedItemID; var sortDirection = current.order; // Does this option also have a direction? if( menuItem.attr('data-sortDirection') ){ sortDirection = menuItem.attr('data-sortDirection'); } this.updateURL( { sortby: sortBy, sortdirection: sortDirection, page: 1 }); }; /** * Returns the current sort by and sort order value * * @returns {object} Object containing by and order keys */ this._getSortValue = function () { var by = ips.utils.url.getParam('sortby'); var order = ips.utils.url.getParam('sortdirection'); return { by: by || '', order: order || '' }; }; /** * Returns the current sort by and sort order value * * @returns {object} Object containing by and order keys */ this._getFilterValue = function () { var filter = ips.utils.url.getParam('filter'); return filter || ''; }; }); }(jQuery, _));]]> /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * * ips.core.comment.js - Comment model * * Author: Rikki Tissier */ ;( function($, _, undefined){ "use strict"; ips.model.register('core.comment', { initialize: function () { this.on( 'getEditForm.comment', this.getEditForm ); this.on( 'saveEditComment.comment', this.saveEditComment ); this.on( 'deleteComment.comment', this.deleteComment ); this.on( 'newComment.comment', this.newComment ); this.on( 'approveComment.comment', this.approveComment ); this.on( 'unrecommendComment.comment', this.unrecommendComment ); }, /** * Retrieves edit form * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ getEditForm: function (e, data) { this.getData( { url: data.url, dataType: 'html', data: {}, events: 'getEditForm', namespace: 'comment' }, data); }, /** * Saves edit back to server * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ saveEditComment: function (e, data) { var url = data.url; this.getData( { url: data.url, dataType: 'html', type: 'post', data: data.form || {}, events: 'saveEditComment', namespace: 'comment' }, data); }, /** * Approves comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ approveComment: function (e, data) { this.getData( { url: data.url, dataType: 'html', data: data.form || {}, events: 'approveComment', namespace: 'comment' }, data); }, /** * Unrecommend this comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ unrecommendComment: function (e, data) { this.getData( { url: data.url, dataType: 'json', data: data.form || {}, events: 'unrecommendComment', namespace: 'comment' }, data); }, /** * Deletes comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ deleteComment: function (e, data) { this.getData( { url: data.url, dataType: 'html', data: data.form || {}, events: 'deleteComment', namespace: 'comment' }, data); }, /** * Adds a new comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ newComment: function (e, data) { this.getData( { url: data.url, dataType: 'json', data: data.form || {}, events: 'newComment', namespace: 'comment' }, data); } }); }(jQuery, _)); ":">",'"':""","'":"'","/":"/","`":"`","=":"="};function escapeHtml(string){return String(string).replace(/[&<>"'`=\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var lineHasNonSpace=false;var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;var indentation="";var tagIndex=0;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i"){token=[type,value,start,scanner.pos,indentation,tagIndex,lineHasNonSpace]}else{token=[type,value,start,scanner.pos]}tagIndex++;tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}stripSpace();openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,intermediateValue,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){intermediateValue=context.view;names=name.split(".");index=0;while(intermediateValue!=null&&index")value=this.renderPartial(token,context,partials,config);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context,config);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate,config){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials,config)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j0||!lineHasNonSpace)){partialByNl[i]=filteredIndentation+partialByNl[i]}}return partialByNl.join("\n")};Writer.prototype.renderPartial=function renderPartial(token,context,partials,config){if(!partials)return;var tags=this.getConfigTags(config);var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null){var lineHasNonSpace=token[6];var tagIndex=token[5];var indentation=token[4];var indentedValue=value;if(tagIndex==0&&indentation){indentedValue=this.indentPartial(value,indentation,lineHasNonSpace)}var tokens=this.parse(indentedValue,tags);return this.renderTokens(tokens,context,partials,indentedValue,config)}};Writer.prototype.unescapedValue=function unescapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype.escapedValue=function escapedValue(token,context,config){var escape=this.getConfigEscape(config)||mustache.escape;var value=context.lookup(token[1]);if(value!=null)return typeof value==="number"&&escape===mustache.escape?String(value):escape(value)};Writer.prototype.rawValue=function rawValue(token){return token[1]};Writer.prototype.getConfigTags=function getConfigTags(config){if(isArray(config)){return config}else if(config&&typeof config==="object"){return config.tags}else{return undefined}};Writer.prototype.getConfigEscape=function getConfigEscape(config){if(config&&typeof config==="object"&&!isArray(config)){return config.escape}else{return undefined}};var mustache={name:"mustache.js",version:"4.2.0",tags:["{{","}}"],clearCache:undefined,escape:undefined,parse:undefined,render:undefined,Scanner:undefined,Context:undefined,Writer:undefined,set templateCache(cache){defaultWriter.templateCache=cache},get templateCache(){return defaultWriter.templateCache}};var defaultWriter=new Writer;mustache.clearCache=function clearCache(){return defaultWriter.clearCache()};mustache.parse=function parse(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function render(template,view,partials,config){if(typeof template!=="string"){throw new TypeError('Invalid template! Template should be a "string" '+'but "'+typeStr(template)+'" was given as the first '+"argument for mustache#render(template, view, partials)")}return defaultWriter.render(template,view,partials,config)};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer;return mustache});]]> =c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g")); e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,g=c.length;ak||122k||90k||122h[0]&&(h[1]+1>h[0]&&b.push("-"),b.push(f(h[1])));b.push("]");return b.join("")}function m(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),b=a.length,d=[],g=0,h=0;g/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null]));if(c=a.regexLiterals){var m=(c=1|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+ ("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+m+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+m+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i, null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return G(d,f)}function L(a,d,f){function c(a){var b=a.nodeType;if(1==b&&!t.test(a.className))if("br"===a.nodeName.toLowerCase())m(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(q);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+ d[0].length))&&a.parentNode.insertBefore(l.createTextNode(e),a.nextSibling),m(a),b||a.parentNode.removeChild(a))}}function m(a){function c(a,b){var e=b?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=c(k,1),d=a.nextSibling;k.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,k.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var t=/(?:^|\s)nocode(?:\s|$)/,q=/\r\n?|\n/,l=a.ownerDocument,n=l.createElement("li");a.firstChild;)n.appendChild(a.firstChild); for(var b=[n],p=0;p=+m[1],d=/\n/g,t=a.a,q=t.length,f=0,l=a.c,n=l.length,c=0,b=a.g,p=b.length,w=0;b[p]=q;var r,e;for(e=r=0;e=h&&(c+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(y){D.console&&console.log(y&&y.stack||y)}}var D="undefined"!==typeof window? window:{},B=["break,continue,do,else,for,if,return,while"],F=[[B,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],H=[F,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"], O=[F,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],P=[F,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"], F=[F,"abstract,async,await,constructor,debugger,enum,eval,export,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],Q=[B,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],R=[B,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"], B=[B,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],S=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,W=/\S/,X=x({keywords:[H,P,O,F,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",Q,R,B],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}), I={};t(X,["default-code"]);t(G([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));t(G([["pln",/^[\s]+/, null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]); t(G([],[["atv",/^[\s\S]+/]]),["uq.val"]);t(x({keywords:H,hashComments:!0,cStyleComments:!0,types:S}),"c cc cpp cxx cyc m".split(" "));t(x({keywords:"null,true,false"}),["json"]);t(x({keywords:P,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:S}),["cs"]);t(x({keywords:O,cStyleComments:!0}),["java"]);t(x({keywords:B,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);t(x({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);t(x({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END", hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);t(x({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);t(x({keywords:F,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);t(x({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0, regexLiterals:!0}),["coffee"]);t(G([],[["str",/^[\s\S]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:x,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="
"+a+"
"; c=c.firstChild;f&&L(c,f,!0);M({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});return c.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function f(){for(var c=D.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;p>=|>=|>>|===|==|\.\.\.|&&=|\.\.<|!==|!=|&=|~=|~|\(|\)|\[|\]|{|}|@|#|;|\.|,|:|\|\|=|\?\?|\|\||&&|&\*|&\+|&-|&=|\+=|-=|\/=|\*=|\^=|%=|\|=|->|`|==|\+\+|--|\/|\+|!|\*|%|<|>|&|\||\^|\?|=|-|_/,null],["typ",/^\b(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null]]),["swift"]); PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[["str",/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],["str",/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']+)\)/i],["kwd",/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], ["com",/^(?:\x3c!--|--\x3e)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#(?:[0-9a-f]{3}){1,2}\b/i],["pln",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],["pun",/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^\)\"\']+/]]),["css-str"]); PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\r\n]*/,null,"%"]],[["kwd",/^\\[a-zA-Z@]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[{}()\[\]=]+/]]),["latex","tex"]); PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],["str",/^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i], ["pln",/^[a-z_]\w*/i],["pun",/^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]]),["lua"]); ]]>
\ "); /* CONTROL STRIP TEMPLATES */ ips.templates.set('core.controlStrip.menu', " \ \ "); ips.templates.set('core.controlStrip.menuItem', " \ \ "); ips.templates.set('core.controlStrip.dropdown', " \
  • \ \ \ \
  • \ "); /* TOGGLE TEMPLATES */ ips.templates.set('core.forms.toggle', " \ \ \ \ "); /* TREES */ ips.templates.set('core.trees.childWrapper', " \ {{{content}}}\ "); ips.templates.set('core.trees.loadingRow', " \
    1. {{#lang}}loading{{/lang}}
    \ "); ips.templates.set('core.trees.loadingPane', " \
     
    \ "); ips.templates.set('core.trees.noRows', " \
    {{#lang}}no_results{{/lang}}
    \ "); /* LIVE SEARCH */ ips.templates.set('core.livesearch.noResults', " \
  • \

    \
  • \ "); /* LANGUAGES */ ips.templates.set('languages.translateString', " \ \ "); /* Guide search result */ ips.templates.set('support.guideSearch', " \
  • \ {{title}}\
  • \ "); ips.templates.set('support.guideSearch.noResults', " \
  • \ {{#lang}}no_results{{/lang}}\
  • \ "); ips.templates.set('support.ticket.supportSummary', " \
    \ {{#lang}}health_ticket_beforeproceeding{{/lang}}\
    \ ");]]>
    \
    \

    \
      \
    • \ \
    • \
    • \ \
    • \
    \ {{name}} {{#by}}By {{by}}{{/by}}\

    \
    \ {{content}}\
    \
    \ \ "); ips.templates.set('dashboard.menuItem', " \
  • \ {{name}}\
  • \ ");]]>
    \
    \
    \ \ \ ");]]>
    \ \ \ {{#lang}}menuManagerNewItem{{/lang}}\ \ \ "); ips.templates.set( 'menuManager.temporaryMenuItem', "\ \ "); ips.templates.set( 'menuManager.emptyList', "\
  • {{#lang}}menuManagerEmptyList{{/lang}}
  • \ ");]]>
    \ {{title}} \ \ "); ips.templates.set('templates.editor.tabPanel', " \ \ "); ips.templates.set('templates.editor.tabContent', " \ \ \ "); ips.templates.set('templates.editor.unsaved', " \ \ "); ips.templates.set('templates.editor.saved', " \ \ "); ips.templates.set('templates.editor.diffHeaders', " \
    \
    \
    {{#lang}}theme_diff_original_header{{/lang}} {{#lang}}theme_diff_original_desc{{/lang}}
    \
    \
    \
    {{#lang}}theme_diff_custom_header{{/lang}} {{#lang}}theme_diff_custom_desc{{/lang}}
    \
    \
    \ "); ips.templates.set('templates.editor.diffHeadersParent', " \
    \
    \
    {{#lang}}theme_diff_parent_header{{/lang}} {{#lang}}theme_diff_original_desc{{/lang}}
    \
    \
    \
    {{#lang}}theme_diff_custom_header{{/lang}} {{#lang}}theme_diff_custom_desc{{/lang}}
    \
    \
    \ "); ]]>
        {{text}}\ "); ips.templates.set('core.general.ajax', " \
      {{#lang}}loading{{/lang}}...
    \ "); ips.templates.set('core.general.flashMsg', " \ \ "); ips.templates.set('core.hovercard.loading', " \ \ "); /* POST CONTENT */ ips.templates.set('core.posts.spoiler', " \ {{#lang}}spoilerClickToReveal{{/lang}}\ "); ips.templates.set('core.posts.spoilerOpen', " \ {{#lang}}spoilerClickToHide{{/lang}}\ "); ips.templates.set('core.posts.multiQuoteOff', " \ \ "); ips.templates.set('core.posts.multiQuoteOn', " \ \ "); ips.templates.set('core.posts.multiQuoter', " \
    \   \
    \ "); ips.templates.set('core.menus.menuItem', " \
  • \ {{title}}\
  • \ "); ips.templates.set('core.menus.menuSep', " \

  • \ "); ips.templates.set('core.posts.quotedSpoiler', " \

    {{#lang}}quotedSpoiler{{/lang}}

    \ "); /* NOTIFICATION TEMPLATE */ ips.templates.set('core.postNotify.single', " \ \    {{{text}}}\    {{#lang}}showReply{{/lang}}\ \ "); ips.templates.set('core.postNotify.multiple', " \ \ {{text}}\    {{#lang}}showReplies{{/lang}}\ \ "); ips.templates.set('core.postNotify.multipleSpillOver', " \ \ {{text}}\ {{#canLoadNew}}\    {{showFirstX}}\    {{#lang}}showRepliesOr{{/lang}}\ {{/canLoadNew}}\    {{#lang}}goToNewestPage{{/lang}}\ \ "); ips.templates.set('core.notification.flashSingle', " \ \ \ \ "); ips.templates.set('core.notification.flashMultiple', " \ \ "); /* ALERTS */ ips.templates.set('core.alert.box', " \ \ "); ips.templates.set('core.alert.subText', " \
    {{text}}
    \ "); ips.templates.set('core.alert.subTextHtml', " \
    {{{text}}}
    \ "); ips.templates.set('core.alert.icon', " \ \ "); ips.templates.set('core.alert.button', " \
  • \ "); ips.templates.set('core.alert.prompt', " \

    \ \

    \ "); /* LIGHTBOX TEMPLATES */ ips.templates.set('core.lightbox.meta', "{{title}}"); ips.templates.set('core.lightbox.toolsMenu', " \ \ \ \ \ \ \ "); /* DIALOG TEMPLATES */ ips.templates.set('core.dialog.main', " \ \ ") /* TOOLTIP TEMPLATE */ ips.templates.set('core.tooltip', " \ \ "); /* SEARCH TEMPLATES */ ips.templates.set('core.search.loadingPanel', " \
    \  \
    \ "); /* EDITOR TEMPLATES */ ips.templates.set('core.editor.panelWrapper', " \
    \ {{content}}\
    \ "); ips.templates.set('core.editor.giphy', " \ \ "); ips.templates.set('core.editor.giphyThumb', " \
    {{title}}
    \ "); ips.templates.set('core.editor.giphyRow', " \
    {{{gifs}}}
    \ "); ips.templates.set('core.editor.pixabayThumb', " \
    \ "); ips.templates.set('core.editor.pixabayRow', " \
    {{{images}}}
    \ "); ips.templates.set('core.editor.emoticons', " \ \ "); ips.templates.set('core.editor.emoticonSection', " \
    {{{content}}}
    \ "); ips.templates.set('core.editor.emoticonMenu', " \ \ "); ips.templates.set('core.editor.emoticonCategory', " \
    {{title}}
    \
    {{{emoticons}}}
    \ "); ips.templates.set('core.editor.emoticonSearch', " \
    {{{emoticons}}}
    \ "); ips.templates.set('core.editor.emoticonRow', " \
    {{{emoticons}}}
    \ "); ips.templates.set('core.editor.emoticonItem', " \
    {{{img}}}
    \ "); ips.templates.set('core.editor.emoji', " \
    {{{display}}}
    \ "); ips.templates.set('core.editor.emojiNotNative', " \
    {{{img}}}
    \ "); ips.templates.set('core.editor.emoticonBlank', " \
     
    \ "); ips.templates.set('core.editor.emoticonNoResults', " \
    {{#lang}}no_results{{/lang}}
    \ "); ips.templates.set('core.editor.emojiResult', " \
  • \ {{{emoji}}} {{short_code}}\
  • \ "); ips.templates.set('core.editor.quote', "
    {{citation}}
    {{{contents}}}
    "); ips.templates.set('core.editor.legacyQuoteUpcast', "
    {{citation}}
    {{{contents}}}
    "); ips.templates.set('core.editor.citation', " \
    \  \ {{#contenturl}}\ \ {{/contenturl}}\ {{{citation}}}\
    \ "); ips.templates.set('core.editor.citationLink', " \ {{username}}\ "); ips.templates.set('core.editor.spoiler', "
    {{#lang}}editorSpoiler{{/lang}}
    "); ips.templates.set('core.editor.legacySpoilerUpcast', "
    {{#lang}}editorSpoiler{{/lang}}
    {{{contents}}}
    "); ips.templates.set('core.editor.spoilerHeader', " \
    \  \ {{#lang}}spoilerClickToReveal{{/lang}}\
    \ "); ips.templates.set('core.editor.initLoading', " \
     
    \ "); ips.templates.set('core.editor.previewLoading', " \
    \  \
    \ "); ips.templates.set('core.editor.stockReplies', " \ \ "); ips.templates.set('core.editor.editorStockRepliesWrap', " \
    {{{content}}}
    \ "); ips.templates.set('core.editor.editorStockRepliesRow', " \
    {{{title}}}
    \ "); /* ATTACHMENT TEMPLATES */ ips.templates.set('core.attachments.metaInfo', " \ {{size}} · {{downloads}} \ "); ips.templates.set('core.attachments.attachmentPreview', " \ {{title}}{{#lang}}attachmentPending{{/lang}} \ "); ips.templates.set('core.attachments.fileItemWrapper', " \
    {{{content}}}
    \ "); ips.templates.set('core.attachments.fileItem', " \
    \
    \ {{#thumb}}\ {{{thumb}}}\ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.imageItem', " \
    \
    \ {{#thumb}}\ {{{thumb}}}\ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.videoItem', " \
    \
    \ {{#thumb}}\ \ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.audioItem', " \
    \
    \ {{#thumb}}\ \ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.imageItemWrapper', " \
    {{{content}}}
    \ "); /* FORM TEMPLATES */ ips.templates.set('core.autocomplete.field', " \
    \ \
    • {{content}}
    \
    \ "); ips.templates.set('core.autocomplete.addToken', " \ {{text}} \ "); ips.templates.set('core.autocomplete.resultWrapper', " \ \ "); ips.templates.set('core.autocomplete.searchTypeAhead', " \
    \
    \ \
    \
    \ "); ips.templates.set('core.autocomplete.resultItem', " \
  • \
    \ {{html}}\
    \
  • \ "); ips.templates.set('core.autocomplete.tagsResultItem', " \
  • \
    \ {{html}}\ {{#recommended}}\ {{#lang}}tag_recommended{{/lang}}\ {{/recommended}}\
    \
  • \ "); ips.templates.set('core.autocomplete.token', " \
  • \ {{{title}}} ×\
  • \ "); ips.templates.set('core.autocomplete.memberItem', " \
  • \
    \ \
    \ {{{name}}}
    \ {{{extra}}}\
    \
    \
  • \ "); ips.templates.set('core.autocomplete.optional', " \ {{langString}}...\ "); ips.templates.set('core.forms.toggle', " \ \ \ \ "); ips.templates.set('core.forms.validationWrapper', " \
      {{content}}
    \ "); ips.templates.set('core.forms.validationItem', " \
  • {{message}}
  • \ "); ips.templates.set('core.forms.advicePopup', "\
    \
    \

    {{#lang}}password_advice_title{{/lang}}

    \

    \ {{#min}}\ {{min}} \ {{/min}}\ {{{text}}}\

    \
    \ \
    \ "); ips.templates.set('core.forms.validateOk', "\ \ \ \ "); ips.templates.set('core.forms.validateFail', "\ \ \ \ "); ips.templates.set('core.forms.validateFailText', "\

    \ {{message}}\

    \ "); /* TRUNCATE TEMPLATE */ ips.templates.set('core.truncate.expand', " \ {{text}}  \ "); /* NODE SELECT */ ips.templates.set('core.selectTree.token', " \
  • {{title}}
  • \ "); /* ACCESSIBILITY KEYBOARD NAV TEMPLATES */ ips.templates.set('core.accessibility.border', " \
    \ "); ips.templates.set('core.accessibility.arrow', " \
    \ "); /* INFINITE SCROLL */ ips.templates.set('core.infScroll.loading', " \
  • \ {{#lang}}loading{{/lang}}...\
  • \ "); ips.templates.set('core.infScroll.pageBreak', " \
  • \ {{#lang}}page{{/lang}} {{page}}\
  • \ "); ips.templates.set('core.pageAction.actionMenuItem', " \
  • \ {{#icon}}\ \ {{/icon}}\ {{^icon}}\ {{title}} \ {{/icon}}\ \
  • \ "); ips.templates.set('core.pageAction.actionItem', " \
  • \ {{#icon}}\ \ {{/icon}}\ {{^icon}}\ {{title}}\ {{/icon}}\
  • \ "); /* PAGE ACTIONS */ ips.templates.set('core.pageAction.wrapper', " \
    \
      \
    • {{{selectedLang}}}
    • \ {{{content}}}\
    \
    \ "); /* CAROUSEL */ ips.templates.set('core.carousel.bulletWrapper', "\
      {{content}}
    \ "); ips.templates.set('core.carousel.bulletItem', "\
  • \ "); /* RATINGS */ ips.templates.set('core.rating.wrapper', "\
    \
      \ {{{content}}}\
    \
    \ {{status}}\ ") ips.templates.set('core.rating.star', "\
  • \ "); ips.templates.set('core.rating.halfStar', "\
  • \ "); ips.templates.set('core.rating.loading', "\ \ "); /* SIDEBAR MANAGER */ ips.templates.set('core.sidebar.managerWrapper', " \
    \
    \

    {{#lang}}sidebarManager{{/lang}}

    \

    {{#lang}}sidebarManagerDesc{{/lang}}

    \

    {{#lang}}sidebarManagerDesc2{{/lang}}

    \
    \
    \
    \ \
    \
    \ "); ips.templates.set('core.sidebar.blockManage', " \
    \

    {{title}}

    \ \ \
    \
    \
    \ "); ips.templates.set('core.sidebar.blockManageNoConfig', " \
    \

    {{title}}

    \ \
    \ "); ips.templates.set('core.sidebar.blockIsEmpty', " \
    \ {{text}}\
    \ "); /* FOLLOW BUTTON LOADING */ ips.templates.set('core.follow.loading', " \
    \ "); /* STATUS TEMPLATES */ ips.templates.set('core.statuses.loadingComments', " \    {{#lang}}loadingComments{{/lang}}\ "); /* STACKS */ ips.templates.set('core.forms.stack', " \
  • \ \ \ \ \ ×\ \
    \ {{{field}}}\
    \
  • \ "); /* POLLS */ ips.templates.set('core.pollEditor.question', " \
    \
    \ \
    \
    \
      \
    • \

       

      \

      {{#lang}}choicesTitle{{/lang}}

      \ {{#showCounts}}\

      {{#lang}}votesTitle{{/lang}}

      \ {{/showCounts}}\

       

      \
    • \ {{{choices}}}\
    \
    \
    \

     

    \ \
    \
    \
    \ "); ips.templates.set('core.pollEditor.choice', " \
  • \
    \ {{choiceID}}\
    \
    \ \
    \
    \ \
    \
  • \ "); /* COVER PHOTOS */ ips.templates.set('core.coverPhoto.controls', " \ \ "); /* PATCHWORK */ ips.templates.set('core.patchwork.imageList', " \ {{#showThumb}}\
  • \ {{/showThumb}}\ {{^showThumb}}\
  • \ {{/showThumb}}\ \ {{#showThumb}}{{image.title}}{{/showThumb}}\
    \ \
    \ {{image.caption}}\ {{#lang}}by{{/lang}} {{image.author.name}}\
    \
    \
      \ {{#image.unread}}\
    • \ \
    • \ {{/image.unread}}\ {{#image.hasState}}\
    • \ {{#image.state.hidden}}\ \ {{/image.state.hidden}}\ {{#image.state.pending}}\ \ {{/image.state.pending}}\ {{#image.state.pinned}}\ \ {{/image.state.pinned}}\ {{#image.state.featured}}\ \ {{/image.state.featured}}\
    • \ {{/image.hasState}}\ {{#image.allowComments}}\
    • {{image.comments}}
    • \ {{/image.allowComments}}\
    \
    \ {{#image.modActions}}\ \ {{/image.modActions}}\
  • \ "); /* Editor preference */ ips.templates.set('core.editor.preferences', " \
    \
    \ {{#lang}}papt_warning{{/lang}} \
    \
    \
      \
    • \
      \ \ \
      \
    • \
    \
    \ \
    \
    \ "); /* Pagination */ ips.templates.set('core.pagination', " \ \ "); /* selective quoting */ ips.templates.set('core.selection.quote', " \ \ "); /* Content item selector */ ips.templates.set('core.contentItem.resultItem', " \
  • \
    \ {{{html}}}\
    \
  • \ "); ips.templates.set('core.contentItem.field', " \
    \ \
    • {{content}}
    \
    \ "); ips.templates.set('core.contentItem.resultWrapper', " \ \ "); ips.templates.set('core.contentItem.item', " \
  • \ × {{{html}}} \
  • \ "); /* PROMOTES */ ips.templates.set('promote.imageUpload', " \
    \
    \ {{#thumbnail}}{{/thumbnail}}\
    \
      \
    • \ \ \
    • \
    \ \
    \ "); /* TABLE ROW LOADING */ ips.templates.set('table.row.loading', " \
  • \
    \ \ \
    \
  • \ "); /* LICENSE RENEWAL */ ips.templates.set('licenseRenewal.wrapper', " \
    \
    \
    \
    \

    {{#lang}}licenseRenewalTitle{{/lang}}

    \

    {{#lang}}licenseRenewalText{{/lang}}

    \ \
    \ \
    \
    \
    \ "); /* Browser Notifications Notices */ ips.templates.set( 'core.browserNotification.prompt' , "\
    \
    \
    \ \
    \ ×\

    {{#lang}}notificationsCallout{{/lang}}

    \

    \ {{#lang}}notificationsDefaultBlurb{{/lang}}\

    \
    \ \
    \

    \ {{#lang}}notificationsAllowPrompt{{/lang}}\

    \
    \
    \
    \
    \ "); ips.templates.set( 'core.browserNotification.missingSubscription' , "\
    \
    \
    \ \
    \ ×\

    {{#lang}}notificationsCalloutPush{{/lang}}

    \

    \ {{#lang}}notificationsDefaultBlurb{{/lang}}\

    \

    \ {{#lang}}notificationsUpgradeBlurb{{/lang}}\

    \ \

    \ {{#lang}}notificationsAllowPrompt{{/lang}}\

    \
    \
    \
    \
    \ "); ips.templates.set( 'core.notifications.pending' , "\ {{#lang}}notificationsEnabling{{/lang}}\ "); ips.templates.set( 'core.notifications.success' , "\ {{#lang}}notificationsEnabled{{/lang}}\ "); ips.templates.set( 'core.notifications.fail' , "\ {{#lang}}notificationsFailed{{/lang}}\ "); ips.templates.set( 'core.notifications.notSupported' , "\ {{#lang}}notificationsNotSupported{{/lang}}\ "); ips.templates.set( 'core.notifications.checking' , "\ {{#lang}}notificationsChecking{{/lang}}\ "); /* Warning form pre-set action list */ ips.templates.set('system.warningpenalty.nomodify', "\
      \ {{#penalties}}\
    • {{.}}
    • \ {{/penalties}}\
    \ "); ips.templates.set('core.edittags.default', "\
    \  {{#lang}}loading{{/lang}}\
    \ "); ips.templates.set('core.onlineUser.linked', "\
  • \ {{{formattedName}}}\
  • ");]]>
    \ \ \
    \ {{#lang}}clubRequestApproved{{/lang}}\ "); ips.templates.set('club.request.decline', "\ \ \ \
    \ {{#lang}}clubRequestDenied{{/lang}}\ "); ips.templates.set('club.menu.dragHandle', "\  \ ");]]>
    \
    \ {{#lang}}no_message_selected{{/lang}}\
    \ "); ips.templates.set('messages.main.folderMenu', "\
  • {{count}} {{name}}
  • \ ");]]>
    \ \ \ "); ips.templates.set('core.streams.unreadBar', "\

  • \ "); ips.templates.set('core.streams.noMore', "\
  • \ {{#lang}}noMoreActivity{{/lang}}\
  • \ "); ips.templates.set('core.streams.loadMore', "\ {{#lang}}loadNewActivity{{/lang}}\ ");]]>
    \ {{/hasNotifications}}\ {{^hasNotifications}}\ \ {{/hasNotifications}}\ {{text}}\ ");]]> {{title}}\ "); ips.templates.set('vse.classes.item', " \
  • \ {{#swatch.back}}\ \ {{/swatch.back}}\ {{^swatch.back}}\ ×\ {{/swatch.back}}\ {{#swatch.fore}}\ \ {{/swatch.fore}}\ {{^swatch.fore}}\ ×\ {{/swatch.fore}}\ {{title}}\
  • \ "); ips.templates.set('vse.panels.header', " \

    {{title}}

    \ {{#desc}}\

    \ {{desc}}\

    \ {{/desc}}\
    \ "); ips.templates.set('vse.panels.wrapper', " \
    \ {{{content}}}\
    \ "); ips.templates.set('vse.panels.background', " \

    {{#lang}}vseBackground{{/lang}}

    \
    \
    \
     
    \
    \
    \ \
    \
    \ \
    \ \
    \
    \
    \
    \ "); ips.templates.set('vse.panels.font', " \

    {{#lang}}vseFont_color{{/lang}}

    \ \ "); ips.templates.set('vse.gradient.editor', " \
    \
    \ \ \ \ \
    \
    \ \
    \
    \ {{{buttons}}}\
    \ "); ips.templates.set('vse.gradient.twoButtons', "\ \ \ "); ips.templates.set('vse.gradient.threeButtons', "\ \ \ \ "); ips.templates.set('vse.gradient.stop', " \
  • \ \ \ \

    \
  • \ "); ips.templates.set('vse.colorizer.panel', " \

    \ {{#lang}}vseColorizer_desc{{/lang}}\

    \
    \
    \
    \ \ {{#lang}}vseColorizer_primary{{/lang}}\
    \
    \
    \ \ {{#lang}}vseColorizer_secondary{{/lang}}\
    \
    \
    \
    \ \ {{#lang}}vseColorizer_text{{/lang}}\
    \

    \ \
    \ \
    \ ");]]>
    3 ){ _buildMenu( buttons ); } // Set up the events we'll handle here elem .on( 'click', '[data-replace], [data-remove], [data-bubble]', _remoteAction ); }, _remoteAction = function (e) { e.preventDefault(); var link = $( e.currentTarget ); var url = link.attr('href'); ips.getAjax()( url, { dataType: 'json', showLoading: true }) .done( function (response) { if( link.is('[data-replace]') ){ _replaceButton( link, response ); } else if( link.is('[data-remove]') ){ _removeButton( link, response ); } else if( link.is('[data-bubble]') ){ _bubbleAction( link, response ); } }) .fail( function () { window.location = url; }); }, /** * Simply triggers an event that bubbles up, which can be caught by page controllers/widgets. * * @param {element} link Link element that was clicked * @param {object} response Response object from the ajax request * @returns {void} */ _bubbleAction = function (link, response) { link.trigger( 'buttonAction', response ); }, /** * Event handler for a button that replaces itself with a different button when clicked * * @param {element} link Link element that was clicked * @param {object} response Response object from the ajax request * @returns {void} */ _replaceButton = function (link, response) { ips.ui.flashMsg.show( response ); var item = link.closest('.ipsControlStrip_button, .ipsControlStrip_menuItem'); var newItem = $('#' + link.attr('data-replacewith') ); if( item.hasClass('ipsControlStrip_button') ){ item.hide(); newItem.show(); } else { if( !newItem.hasClass('ipsControlStrip_menuItem') ){ var newHTML = _getMenuItemFromButton( newItem ); item.hide().after( newHTML ); } else { item.hide(); newItem.show(); } } }, /** * Event handler for a button that removes itself after being clicked * * @param {element} link Link element that was clicked * @param {object} response Response object from the ajax request * @returns {void} */ _removeButton = function (link, response) { ips.ui.flashMsg.show( response ); var dropdown = $( elem ).find('[data-dropdown]'); // Do we have any others to remove too? if( link.attr('data-alsoremove') ){ var also = ips.utils.getIDsFromList( link.attr('data-alsoremove') ); } // Get a jquery object containing the buttons or menu items for each item to remove var toRemove = $( link ).add( also || '' ).closest('.ipsControlStrip_button, .ipsControlStrip_menuItem'); // .. and then remove them. toRemove.remove(); // See if we need to remove the menu & dropdown if( dropdown.length ){ var menu = $( dropdown.attr('id') + '_menu' ); if( !menu.find('.ipsControlStrip_menuItem').length ){ menu.remove(); dropdown.remove(); } } }, /** * Builds a dropdown menu by slicing off excess menu items, and manipulating the links to * turn them into menu items. Then an ipsMenu widget is created to control the menu. * * @param {array} buttons jQuery array of buttons in the control strip * @returns {void} */ _buildMenu = function (buttons) { var buttonsToMove = buttons.slice(2); var menu = ips.templates.render('core.controlStrip.menu', { id: elem.identify().attr('id') + '_more', content: _moveButtonsToMenu( buttonsToMove ) }); $( elem ).after( menu ); // Remove buttons buttonsToMove.remove(); // Add a menu dropdown to the strip and set up the menu elem .css({ position: 'relative' }) .find('.ipsControlStrip_button') .last() .after( ips.templates.render('core.controlStrip.dropdown', { id: elem.identify().attr('id') + '_more' })); elem .parent() .wrapInner( $('
    ').css( { position: 'relative' } ) ) // wrapInner so that the menu is positioned properly in firefox .find('[data-dropdown]') .attr('aria-haspopup', 'true') .ipsMenu( { appendTo: '#' + elem.parent().identify().attr('id') }); $( document ).trigger( 'contentChange', [ elem ] ); }, /** * Creates dropdown menu items for each of the buttons in the provided array * * @param {array} buttons jQuery array of buttons to be turned into menu items * @returns {string} Menu contents (all items concatenated into a string) */ _moveButtonsToMenu = function (buttons) { var menuContent = ''; for (var i = 0; i < buttons.length; i++){ menuContent += _getMenuItemFromButton( buttons[i] ); } return menuContent; }, /** * Builds an individual menu item from a provided button * * @param {element} button Button element to build from * @returns {string} Menu item HTML */ _getMenuItemFromButton = function (button) { var buttonLink = $( button ).find('> a'); //buttonLink.find('.ipsControlStrip_icon').after( '  ' + buttonLink.attr('title') ); $( button ).find('[data-ipsTooltip]').removeAttr('data-ipsTooltip'); return ips.templates.render('core.controlStrip.menuItem', { id: $( button ).attr('id') || '', item: $( button ).html() }); }; init(); return { }; }; }(jQuery, _));]]> 0 ){ elem.find('.ipsMatrix_empty').addClass('ipsHide'); } else { elem.find('.ipsMatrix_empty').removeClass('ipsHide'); } }, /** * Event handler for clicking an input within a cell * Simply stops propagation * * @param {event} e Event object * @returns {void} */ _clickInputInCell = function (e) { e.stopPropagation(); }, /** * Hooks into the submit event for the form, to wipe out the name on the blank row inputs * * @param {event} e Event object * @returns {void} */ _submitForm = function (e) { // Remove names from the inputs in the blank row elem.find('[data-matrixrowid]:hidden') .find('input, select, textarea') .attr( 'name', '' ) .prop( 'disabled', true ); // Are we squashing fields? if( !options.squashFields ){ return; } // Get all values from the matrix var formElements = elem.find('[data-matrixid] *').filter(':input:enabled:not([data-role="noMatrixSquash"])'); var output = ips.utils.form.serializeAsObject( formElements ); var matrixID = elem.find('[data-matrixid]').attr('data-matrixid'); var newInput = $('').attr('type', 'hidden').attr('name', matrixID + '_squashed'); // JSON encode the data Debug.log("Before encoding, matrix data is:"); Debug.log( output ); output = JSON.stringify( output ); // Add a new hidden form field elem.prepend( newInput.val( output ) ); // Disable all of the elements we squashed so that they don't get sent formElements.prop('disabled', true); }, /** * Initializes the blank row by removing the required attribute, and hiding it * * @returns {void} */ _setUpManageable = function () { elem.find('tr:last-child').find('input, select[required], textarea').removeAttr('required'); elem.find('tbody tr:not( .ipsMatrix_empty ):last-child').hide(); }; init(); return { init: init, checkRows: _checkRows }; }; }(jQuery, _));]]> /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * * ips.ui.statusToggle.js - Toggles things between enabled/disabled, online/offline etc. * * Author: Rikki Tissier */ ;( function($, _, undefined){ "use strict"; ips.createModule('ips.ui.statusToggle', function(){ /** * Respond method for statusToggles * Finds the active item, and determines the next state. Fires an ajax request to set the state, * and updates the badge shown as needed. * * @param {element} elem The element the widget is registered on * @param {object} options Options object for this widget instance * @param {event} e Event object * @returns {void} */ var respond = function (elem, options, e) { e.preventDefault(); elem = $( elem ); if( elem.attr('data-loading') ){ return; } // What's selected now? var currentBadge = elem.find('[data-state]:visible'); var currentState = currentBadge.attr('data-state'); var url = currentBadge.attr('href'); // Don't do anything if the button opens a dialog if ( currentBadge.attr('data-ipsdialog' ) ) { return; } var nextState; if( options.intermediate ){ nextState = ( currentState == 'enabled' ) ? 'intermediate' : ( currentState == 'disabled' ) ? 'enabled' : 'disabled'; } else { nextState = ( currentState == 'enabled' ) ? 'disabled' : 'enabled'; } var nextBadge = elem.find('[data-state="' + nextState + '"]'); if( !nextBadge.length ){ Debug.warn( "No badge found for " + nextState + " state"); return; } elem.attr( 'data-loading', true ); currentBadge.css({ opacity: "0.5" }); // Send ajax request to make the change ips.getAjax()( url, { showLoading: true // show our global loading indicator }) .done( function (response) { currentBadge.hide().css({ opacity: "1" }); nextBadge.show(); elem.removeAttr('data-loading'); // Trigger an event to let the page know elem.trigger( 'stateChanged', { status: nextState }); }) .fail( function (jqXHR, textStatus, errorThrown) { window.location = url; }); }; ips.ui.registerWidget( 'statusToggle', ips.ui.statusToggle, [ 'intermediate' ], { lazyLoad: true, lazyEvent: 'click' } ); return { respond: respond }; }); }(jQuery, _)); ol').length ){ ips.utils.anim.go( 'fadeOut fast', realRow.find('> ol') ); } }, /** * Opens a closed row * * @param {element} row The row to open * @returns {void} */ _openRow = function (row) { row.removeClass( options.closedClass ).addClass( options.openClass ); var realRow = row.closest('[data-role="node"]'); var rowID = realRow.find('[data-nodeid]').first().attr('data-nodeid'); realRow.attr('data-nodeid', rowID); if( _.isUndefined( rowID ) ){ Debug.warn( 'No rowID for row ' + realRow.identify().attr('id') ); return; } // Do we have results loaded or loading? Show them immediately if so if( realRow.data('_childrenLoaded') || realRow.data('_childrenLoading') ){ ips.utils.anim.go('fadeInDown fast', realRow.find('> ol') ); return; } // Not loaded or loading, so we need to do that here // First build the loading box var loading = ips.templates.render('core.trees.loadingRow'); var content = ips.templates.render('core.trees.childWrapper', { content: loading }); // Set to loading, append loading content realRow .data('_childrenLoading', true) .append( content ); // Fetch real content ips.getAjax()( options.url + '&root=' + rowID ) .done( function (response) { realRow.find('> ol').remove(); realRow.find('> .ipsTree_row').after( response ); realRow .data('_childrenLoaded', true) .removeData('_childrenLoading'); // Now animate ips.utils.anim.go( 'fadeInDown', realRow.find('> ol') ); // Let document know $( document ).trigger( 'contentChange', [ realRow ] ); // Are we sorting? if( options.sortable ){ elem.find('.ipsTree_rows > .ipsTree').nestedSortable('refresh'); elem.find('.ipsTree_rows > .ipsTree').nestedSortable('refreshPositions'); //_makeSortable( realRow.find('.ipsTree_node') ); } }) .fail( function () { window.location = options.url + '&root=' + rowID; }); }, _checkParentStatus = function () { Debug.log( 'check parent status' ); // Find each tree row and loop elem.find('.ipsTree_row:not( .ipsTree_root )').each( function () { var row = $( this ); // Ignore if the row is closed since we don't know what's inside it if( row.hasClass('ipsTree_parent') && !row.hasClass('ipsTree_open') ){ return; } var subList = row.siblings('ol'); var currentlyParent = row.is('ipsTree_parent'); var hasChildren = subList.find('> li').length > 0; Debug.log( 'sublist: '); Debug.log( subList ); row.toggleClass('ipsTree_parent', hasChildren ); if( hasChildren && !currentlyParent ){ row.addClass('ipsTree_open'); } // sortable removes the
      if it's now empty, so we need to add it back here // so that the user can carry on sorting properly if( row.hasClass('ipsTree_acceptsChildren') && !subList.length ){ var newRow = $('
        ').addClass('ipsTree ipsTree_node'); row.after( newRow ); //newRow.find('li').remove(); } }); }, /** * Makes the tree sortable * * @returns {void} */ _makeSortable = function () { var sortableOptions = { placeholder: 'sortable-placeholder', handle: '.ipsTree_dragHandle', items: '[data-role="node"]', excludeRoot: true, update: function (event, ui) { var url = options.url + '&do=reorder'; var rootID = elem.find('.ipsTree_root').attr('data-nodeid'); var data = ''; // We need to run this after a short delay to let sortable clean itself up first setTimeout( function () { _checkParentStatus(); }, 200); let failed = false; if( rootID ){ url += '&root=' + rootID; // If we have a root item (that isn't technically part of the tree) we can't // use the standard serialize method or all items have the value null. Instead // we have to build a manual param string and replace null with the parent id. var dataArray = $( this ).nestedSortable( 'toArray', { key: 'ajax_order'} ); var outputArray = []; for( var i = 0; i < dataArray.length; i++ ) { let id = dataArray[i].item_id !== undefined ? dataArray[i].item_id : dataArray[i].id; if ( [undefined, null, NaN].includes(id) ) { failed = true; break; } outputArray.push( 'ajax_order[' + id + ']=' + ( ( dataArray[i].parent_id == null ) ? rootID : dataArray[i].parent_id ) ); } data = outputArray.join('&'); } else { data = $( this ).nestedSortable( 'serialize', { key: 'ajax_order' } ); } if (failed) { window.location.reload(); } data = data + '&csrfKey=' + ips.getSetting('csrfKey'); ips.getAjax()( url, { data: data, method: 'POST' }) .fail( function () { window.location = url + "&" + data; }); }, toleranceElement: '> div', listType: 'ol', isTree: true, // Called by nestedSortable to determine whether an item can be dragged into // the current location. We check for the ipsTree_acceptsChildren class which // indicates it can be a parent item. isAllowed: function (placeholder, placeholderParent, currentItem) { // Hide tooltip $('#ipsTooltip').hide(); var parent = null; // Find nearest list if( _.isUndefined( placeholderParent ) || placeholderParent === null ){ parent = elem.find('> .ipsTree_root'); } else { parent = placeholderParent.closest('[data-role="node"]').find('> .ipsTree_row'); } if( parent.hasClass('ipsTree_acceptsChildren') || ( !parent.length && !currentItem.find('> .ipsTree_row').hasClass('ipsTree_noRoot') ) ) { console.log( currentItem ); placeholder.removeAttr('data-error'); return true; } else { console.log('no'); placeholder.attr('data-error', ips.getString('cannotDragInto') ); return false; } }, // This method is triggered by nestedSortable, and we piggy pack on it to call our _openRow // method to load closed nodes. _openRow calls the refresh() method of nestedSortable to enable // the item currently being dragged to be dropped in the newly-opened list. Phew. expand: function (event, ui) { var row = $( this ).find('.mjs-nestedSortable-hovering > .ipsTree_parent[data-nodeid]').first(); if( !row.hasClass('ipsTree_open') ){ _openRow( row ); } }, // Triggered when the dom position of the item changes. // We highlight the parent of the new position so it's clearer to users where the item is going change: function (event, ui) { // Remove the class from everywhere first $( this ).find('.ipsTree_draggingInto').removeClass('ipsTree_draggingInto'); // Find the nearest list ui.placeholder.closest('[data-role="node"]').find('> .ipsTree_row').addClass('ipsTree_draggingInto'); }, // Triggered when dragging starts // Highlight the current parent start: function (event, ui) { // Find the nearest list ui.placeholder.closest('[data-role="node"]').find('> .ipsTree_row').addClass('ipsTree_draggingInto'); }, // Triggered when dragging stops // Remove all parent highlights stop: function (event, ui) { $( this ).find('.ipsTree_draggingInto').removeClass('ipsTree_draggingInto'); } }; // Locks the parents, allowing any items to be reordered but not moved out of their current list if( options.lockParents ){ sortableOptions['disableParentChange'] = true; } // Protects the root items, preventing them from being turned into subitems, or subitems to be turned into roots if( options.protectRoots ){ sortableOptions['protectRoot'] = true; } // Create the sortable elem.find('.ipsTree_rows > .ipsTree').nestedSortable( sortableOptions ); }; init(); return { init: init }; }; }(jQuery, _));]]> =0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t * Steven Levithan (c) 2012-2017 MIT License * Inspired by Lea Verou's RegExp.create */ module.exports = function(XRegExp) { 'use strict'; var REGEX_DATA = 'xregexp'; var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', { conjunction: 'or' }); /** * Strips a leading `^` and trailing unescaped `$`, if both are present. * * @private * @param {String} pattern Pattern to process. * @returns {String} Pattern with edge anchors removed. */ function deanchor(pattern) { // Allow any number of empty noncapturing groups before/after anchors, because regexes // built/generated by XRegExp sometimes include them var leadingAnchor = /^(?:\(\?:\))*\^/; var trailingAnchor = /\$(?:\(\?:\))*$/; if ( leadingAnchor.test(pattern) && trailingAnchor.test(pattern) && // Ensure that the trailing `$` isn't escaped trailingAnchor.test(pattern.replace(/\\[\s\S]/g, '')) ) { return pattern.replace(leadingAnchor, '').replace(trailingAnchor, ''); } return pattern; } /** * Converts the provided value to an XRegExp. Native RegExp flags are not preserved. * * @private * @param {String|RegExp} value Value to convert. * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not * already a regex generated by XRegExp * @returns {RegExp} XRegExp object with XRegExp syntax applied. */ function asXRegExp(value, addFlagX) { var flags = addFlagX ? 'x' : ''; return XRegExp.isRegExp(value) ? (value[REGEX_DATA] && value[REGEX_DATA].captureNames ? // Don't recompile, to preserve capture names value : // Recompile as XRegExp XRegExp(value.source, flags) ) : // Compile string as XRegExp XRegExp(value, flags); } /** * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in * the outer pattern and provided subpatterns are automatically renumbered to work correctly. * Native flags used by provided subpatterns are ignored in favor of the `flags` argument. * * @memberOf XRegExp * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows * `({{name}})` as shorthand for `(?{{name}})`. Patterns cannot be embedded within * character classes. * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present. * @param {String} [flags] Any combination of XRegExp flags. * @returns {RegExp} Regex with interpolated subpatterns. * @example * * var time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', { * hours: XRegExp.build('{{h12}} : | {{h24}}', { * h12: /1[0-2]|0?[1-9]/, * h24: /2[0-3]|[01][0-9]/ * }, 'x'), * minutes: /^[0-5][0-9]$/ * }); * time.test('10:59'); // -> true * XRegExp.exec('10:59', time).minutes; // -> '59' */ XRegExp.build = function(pattern, subs, flags) { flags = flags || ''; // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\` // and `n`. See more details at . var addFlagX = flags.indexOf('x') > -1; var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); // Add flags within a leading mode modifier to the overall pattern's flags if (inlineFlags) { flags = XRegExp._clipDuplicates(flags + inlineFlags[1]); } var data = {}; for (var p in subs) { if (subs.hasOwnProperty(p)) { // Passing to XRegExp enables extended syntax and ensures independent validity, // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For // subpatterns provided as native regexes, it dies on octals and adds the property // used to hold extended regex instance data, for simplicity. var sub = asXRegExp(subs[p], addFlagX); data[p] = { // Deanchoring allows embedding independently useful anchored regexes. If you // really need to keep your anchors, double them (i.e., `^^...$$`). pattern: deanchor(sub.source), names: sub[REGEX_DATA].captureNames || [] }; } } // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid; // helps keep this simple. Named captures will be put back. var patternAsRegex = asXRegExp(pattern, addFlagX); // 'Caps' is short for 'captures' var numCaps = 0; var numPriorCaps; var numOuterCaps = 0; var outerCapsMap = [0]; var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || []; var output = patternAsRegex.source.replace(parts, function($0, $1, $2, $3, $4) { var subName = $1 || $2; var capName; var intro; var localCapIndex; // Named subpattern if (subName) { if (!data.hasOwnProperty(subName)) { throw new ReferenceError('Undefined property ' + $0); } // Named subpattern was wrapped in a capturing group if ($1) { capName = outerCapNames[numOuterCaps]; outerCapsMap[++numOuterCaps] = ++numCaps; // If it's a named group, preserve the name. Otherwise, use the subpattern name // as the capture name intro = '(?<' + (capName || subName) + '>'; } else { intro = '(?:'; } numPriorCaps = numCaps; return intro + data[subName].pattern.replace(subParts, function(match, paren, backref) { // Capturing group if (paren) { capName = data[subName].names[numCaps - numPriorCaps]; ++numCaps; // If the current capture has a name, preserve the name if (capName) { return '(?<' + capName + '>'; } // Backreference } else if (backref) { localCapIndex = +backref - 1; // Rewrite the backreference return data[subName].names[localCapIndex] ? // Need to preserve the backreference name in case using flag `n` '\\k<' + data[subName].names[localCapIndex] + '>' : '\\' + (+backref + numPriorCaps); } return match; }) + ')'; } // Capturing group if ($3) { capName = outerCapNames[numOuterCaps]; outerCapsMap[++numOuterCaps] = ++numCaps; // If the current capture has a name, preserve the name if (capName) { return '(?<' + capName + '>'; } // Backreference } else if ($4) { localCapIndex = +$4 - 1; // Rewrite the backreference return outerCapNames[localCapIndex] ? // Need to preserve the backreference name in case using flag `n` '\\k<' + outerCapNames[localCapIndex] + '>' : '\\' + outerCapsMap[+$4]; } return $0; }); return XRegExp(output, flags); }; }; },{}],2:[function(require,module,exports){ /*! * XRegExp.matchRecursive 3.2.0 * * Steven Levithan (c) 2009-2017 MIT License */ module.exports = function(XRegExp) { 'use strict'; /** * Returns a match detail object composed of the provided values. * * @private */ function row(name, value, start, end) { return { name: name, value: value, start: start, end: end }; } /** * Returns an array of match strings between outermost left and right delimiters, or an array of * objects with detailed match parts and position data. An error is thrown if delimiters are * unbalanced within the data. * * @memberOf XRegExp * @param {String} str String to search. * @param {String} left Left delimiter as an XRegExp pattern. * @param {String} right Right delimiter as an XRegExp pattern. * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters. * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options. * @returns {Array} Array of matches, or an empty array. * @example * * // Basic usage * var str = '(t((e))s)t()(ing)'; * XRegExp.matchRecursive(str, '\\(', '\\)', 'g'); * // -> ['t((e))s', '', 'ing'] * * // Extended information mode with valueNames * str = 'Here is
        an
        example'; * XRegExp.matchRecursive(str, '', '
    ', 'gi', { * valueNames: ['between', 'left', 'match', 'right'] * }); * // -> [ * // {name: 'between', value: 'Here is ', start: 0, end: 8}, * // {name: 'left', value: '
    ', start: 8, end: 13}, * // {name: 'match', value: '
    an
    ', start: 13, end: 27}, * // {name: 'right', value: '
    ', start: 27, end: 33}, * // {name: 'between', value: ' example', start: 33, end: 41} * // ] * * // Omitting unneeded parts with null valueNames, and using escapeChar * str = '...{1}.\\{{function(x,y){return {y:x}}}'; * XRegExp.matchRecursive(str, '{', '}', 'g', { * valueNames: ['literal', null, 'value', null], * escapeChar: '\\' * }); * // -> [ * // {name: 'literal', value: '...', start: 0, end: 3}, * // {name: 'value', value: '1', start: 4, end: 5}, * // {name: 'literal', value: '.\\{', start: 6, end: 9}, * // {name: 'value', value: 'function(x,y){return {y:x}}', start: 10, end: 37} * // ] * * // Sticky mode via flag y * str = '<1><<<2>>><3>4<5>'; * XRegExp.matchRecursive(str, '<', '>', 'gy'); * // -> ['1', '<<2>>', '3'] */ XRegExp.matchRecursive = function(str, left, right, flags, options) { flags = flags || ''; options = options || {}; var global = flags.indexOf('g') > -1; var sticky = flags.indexOf('y') > -1; // Flag `y` is controlled internally var basicFlags = flags.replace(/y/g, ''); var escapeChar = options.escapeChar; var vN = options.valueNames; var output = []; var openTokens = 0; var delimStart = 0; var delimEnd = 0; var lastOuterEnd = 0; var outerStart; var innerStart; var leftMatch; var rightMatch; var esc; left = XRegExp(left, basicFlags); right = XRegExp(right, basicFlags); if (escapeChar) { if (escapeChar.length > 1) { throw new Error('Cannot use more than one escape character'); } escapeChar = XRegExp.escape(escapeChar); // Example of concatenated `esc` regex: // `escapeChar`: '%' // `left`: '<' // `right`: '>' // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/ esc = new RegExp( '(?:' + escapeChar + '[\\S\\s]|(?:(?!' + // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`. // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax // transformation resulting from those flags was already applied to `left` and // `right` when they were passed through the XRegExp constructor above. XRegExp.union([left, right], '', {conjunction: 'or'}).source + ')[^' + escapeChar + '])+)+', // Flags `gy` not needed here flags.replace(/[^imu]+/g, '') ); } while (true) { // If using an escape character, advance to the delimiter's next starting position, // skipping any escaped characters in between if (escapeChar) { delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length; } leftMatch = XRegExp.exec(str, left, delimEnd); rightMatch = XRegExp.exec(str, right, delimEnd); // Keep the leftmost match only if (leftMatch && rightMatch) { if (leftMatch.index <= rightMatch.index) { rightMatch = null; } else { leftMatch = null; } } // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens): // LM | RM | OT | Result // 1 | 0 | 1 | loop // 1 | 0 | 0 | loop // 0 | 1 | 1 | loop // 0 | 1 | 0 | throw // 0 | 0 | 1 | throw // 0 | 0 | 0 | break // The paths above don't include the sticky mode special case. The loop ends after the // first completed match if not `global`. if (leftMatch || rightMatch) { delimStart = (leftMatch || rightMatch).index; delimEnd = delimStart + (leftMatch || rightMatch)[0].length; } else if (!openTokens) { break; } if (sticky && !openTokens && delimStart > lastOuterEnd) { break; } if (leftMatch) { if (!openTokens) { outerStart = delimStart; innerStart = delimEnd; } ++openTokens; } else if (rightMatch && openTokens) { if (!--openTokens) { if (vN) { if (vN[0] && outerStart > lastOuterEnd) { output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart)); } if (vN[1]) { output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart)); } if (vN[2]) { output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart)); } if (vN[3]) { output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd)); } } else { output.push(str.slice(innerStart, delimStart)); } lastOuterEnd = delimEnd; if (!global) { break; } } } else { throw new Error('Unbalanced delimiter found in string'); } // If the delimiter matched an empty string, avoid an infinite loop if (delimStart === delimEnd) { ++delimEnd; } } if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) { output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length)); } return output; }; }; },{}],3:[function(require,module,exports){ /*! * XRegExp Unicode Base 3.2.0 * * Steven Levithan (c) 2008-2017 MIT License */ module.exports = function(XRegExp) { 'use strict'; /** * Adds base support for Unicode matching: * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the * braces for token names that are a single letter (e.g. `\pL` or `PL`). * - Adds flag A (astral), which enables 21-bit Unicode support. * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. * * Unicode Base relies on externally provided Unicode character data. Official addons are * available to provide data for Unicode categories, scripts, blocks, and properties. * * @requires XRegExp */ // ==--------------------------== // Private stuff // ==--------------------------== // Storage for Unicode data var unicode = {}; // Reuse utils var dec = XRegExp._dec; var hex = XRegExp._hex; var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed function normalize(name) { return name.replace(/[- _]+/g, '').toLowerCase(); } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal function charCode(chr) { var esc = /^\\[xu](.+)/.exec(chr); return esc ? dec(esc[1]) : chr.charCodeAt(chr.charAt(0) === '\\' ? 1 : 0); } // Inverts a list of ordered BMP characters and ranges function invertBmp(range) { var output = ''; var lastEnd = -1; XRegExp.forEach( range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function(m) { var start = charCode(m[1]); if (start > (lastEnd + 1)) { output += '\\u' + pad4(hex(lastEnd + 1)); if (start > (lastEnd + 2)) { output += '-\\u' + pad4(hex(start - 1)); } } lastEnd = charCode(m[2] || m[1]); } ); if (lastEnd < 0xFFFF) { output += '\\u' + pad4(hex(lastEnd + 1)); if (lastEnd < 0xFFFE) { output += '-\\uFFFF'; } } return output; } // Generates an inverted BMP range on first use function cacheInvertedBmp(slug) { var prop = 'b!'; return ( unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp)) ); } // Combines and optionally negates BMP and astral data function buildAstral(slug, isNegated) { var item = unicode[slug]; var combined = ''; if (item.bmp && !item.isBmpLast) { combined = '[' + item.bmp + ']' + (item.astral ? '|' : ''); } if (item.astral) { combined += item.astral; } if (item.isBmpLast && item.bmp) { combined += (item.astral ? '|' : '') + '[' + item.bmp + ']'; } // Astral Unicode tokens always match a code point, never a code unit return isNegated ? '(?:(?!' + combined + ')(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))' : '(?:' + combined + ')'; } // Builds a complete astral pattern on first use function cacheAstral(slug, isNegated) { var prop = isNegated ? 'a!' : 'a='; return ( unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated)) ); } // ==--------------------------== // Core functionality // ==--------------------------== /* * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. */ XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, function(match, scope, flags) { var ERR_DOUBLE_NEG = 'Invalid double negation '; var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; var ERR_UNKNOWN_REF = 'Unicode token missing data '; var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; // Negated via \P{..} or \p{^..} var isNegated = match[1] === 'P' || !!match[2]; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A var isAstralMode = flags.indexOf('A') > -1; // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}` var slug = normalize(match[4] || match[3]); // Token data object var item = unicode[slug]; if (match[1] === 'P' && match[2]) { throw new SyntaxError(ERR_DOUBLE_NEG + match[0]); } if (!unicode.hasOwnProperty(slug)) { throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]); } // Switch to the negated form of the referenced Unicode token if (item.inverseOf) { slug = normalize(item.inverseOf); if (!unicode.hasOwnProperty(slug)) { throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf); } item = unicode[slug]; isNegated = !isNegated; } if (!(item.bmp || isAstralMode)) { throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]); } if (isAstralMode) { if (scope === 'class') { throw new SyntaxError(ERR_ASTRAL_IN_CLASS); } return cacheAstral(slug, isNegated); } return scope === 'class' ? (isNegated ? cacheInvertedBmp(slug) : item.bmp) : (isNegated ? '[^' : '[') + item.bmp + ']'; }, { scope: 'all', optionalFlags: 'A', leadChar: '\\' } ); /** * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. * * @memberOf XRegExp * @param {Array} data Objects with named character ranges. Each object may have properties * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be * escaped, apart from range-creating hyphens. The `astral` data can additionally use * character classes and alternation, and should use surrogate pairs to represent astral code * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is * defined as the exact inverse of another token. * @example * * // Basic use * XRegExp.addUnicodeData([{ * name: 'XDigit', * alias: 'Hexadecimal', * bmp: '0-9A-Fa-f' * }]); * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true */ XRegExp.addUnicodeData = function(data) { var ERR_NO_NAME = 'Unicode token requires name'; var ERR_NO_DATA = 'Unicode token has no character data '; var item; for (var i = 0; i < data.length; ++i) { item = data[i]; if (!item.name) { throw new Error(ERR_NO_NAME); } if (!(item.inverseOf || item.bmp || item.astral)) { throw new Error(ERR_NO_DATA + item.name); } unicode[normalize(item.name)] = item; if (item.alias) { unicode[normalize(item.alias)] = item; } } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and // flags might now produce different results XRegExp.cache.flush('patterns'); }; /** * @ignore * * Return a reference to the internal Unicode definition structure for the given Unicode * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex * constructs. * * @memberOf XRegExp * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode * Properties and Property Aliases. * @returns {Object} Reference to definition structure when the name matches a Unicode Property. * * @note * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. * * @note * This method is *not* part of the officially documented API and may change or be removed in * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode * structures set up by XRegExp. */ XRegExp._getUnicodeProperty = function(name) { var slug = normalize(name); return unicode[slug]; }; }; },{}],4:[function(require,module,exports){ /*! * XRegExp Unicode Blocks 3.2.0 * * Steven Levithan (c) 2010-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g., * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and * underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks'); } XRegExp.addUnicodeData([ { name: 'InAdlam', astral: '\uD83A[\uDD00-\uDD5F]' }, { name: 'InAegean_Numbers', astral: '\uD800[\uDD00-\uDD3F]' }, { name: 'InAhom', astral: '\uD805[\uDF00-\uDF3F]' }, { name: 'InAlchemical_Symbols', astral: '\uD83D[\uDF00-\uDF7F]' }, { name: 'InAlphabetic_Presentation_Forms', bmp: '\uFB00-\uFB4F' }, { name: 'InAnatolian_Hieroglyphs', astral: '\uD811[\uDC00-\uDE7F]' }, { name: 'InAncient_Greek_Musical_Notation', astral: '\uD834[\uDE00-\uDE4F]' }, { name: 'InAncient_Greek_Numbers', astral: '\uD800[\uDD40-\uDD8F]' }, { name: 'InAncient_Symbols', astral: '\uD800[\uDD90-\uDDCF]' }, { name: 'InArabic', bmp: '\u0600-\u06FF' }, { name: 'InArabic_Extended_A', bmp: '\u08A0-\u08FF' }, { name: 'InArabic_Mathematical_Alphabetic_Symbols', astral: '\uD83B[\uDE00-\uDEFF]' }, { name: 'InArabic_Presentation_Forms_A', bmp: '\uFB50-\uFDFF' }, { name: 'InArabic_Presentation_Forms_B', bmp: '\uFE70-\uFEFF' }, { name: 'InArabic_Supplement', bmp: '\u0750-\u077F' }, { name: 'InArmenian', bmp: '\u0530-\u058F' }, { name: 'InArrows', bmp: '\u2190-\u21FF' }, { name: 'InAvestan', astral: '\uD802[\uDF00-\uDF3F]' }, { name: 'InBalinese', bmp: '\u1B00-\u1B7F' }, { name: 'InBamum', bmp: '\uA6A0-\uA6FF' }, { name: 'InBamum_Supplement', astral: '\uD81A[\uDC00-\uDE3F]' }, { name: 'InBasic_Latin', bmp: '\0-\x7F' }, { name: 'InBassa_Vah', astral: '\uD81A[\uDED0-\uDEFF]' }, { name: 'InBatak', bmp: '\u1BC0-\u1BFF' }, { name: 'InBengali', bmp: '\u0980-\u09FF' }, { name: 'InBhaiksuki', astral: '\uD807[\uDC00-\uDC6F]' }, { name: 'InBlock_Elements', bmp: '\u2580-\u259F' }, { name: 'InBopomofo', bmp: '\u3100-\u312F' }, { name: 'InBopomofo_Extended', bmp: '\u31A0-\u31BF' }, { name: 'InBox_Drawing', bmp: '\u2500-\u257F' }, { name: 'InBrahmi', astral: '\uD804[\uDC00-\uDC7F]' }, { name: 'InBraille_Patterns', bmp: '\u2800-\u28FF' }, { name: 'InBuginese', bmp: '\u1A00-\u1A1F' }, { name: 'InBuhid', bmp: '\u1740-\u175F' }, { name: 'InByzantine_Musical_Symbols', astral: '\uD834[\uDC00-\uDCFF]' }, { name: 'InCJK_Compatibility', bmp: '\u3300-\u33FF' }, { name: 'InCJK_Compatibility_Forms', bmp: '\uFE30-\uFE4F' }, { name: 'InCJK_Compatibility_Ideographs', bmp: '\uF900-\uFAFF' }, { name: 'InCJK_Compatibility_Ideographs_Supplement', astral: '\uD87E[\uDC00-\uDE1F]' }, { name: 'InCJK_Radicals_Supplement', bmp: '\u2E80-\u2EFF' }, { name: 'InCJK_Strokes', bmp: '\u31C0-\u31EF' }, { name: 'InCJK_Symbols_and_Punctuation', bmp: '\u3000-\u303F' }, { name: 'InCJK_Unified_Ideographs', bmp: '\u4E00-\u9FFF' }, { name: 'InCJK_Unified_Ideographs_Extension_A', bmp: '\u3400-\u4DBF' }, { name: 'InCJK_Unified_Ideographs_Extension_B', astral: '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]' }, { name: 'InCJK_Unified_Ideographs_Extension_C', astral: '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]' }, { name: 'InCJK_Unified_Ideographs_Extension_D', astral: '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]' }, { name: 'InCJK_Unified_Ideographs_Extension_E', astral: '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]' }, { name: 'InCarian', astral: '\uD800[\uDEA0-\uDEDF]' }, { name: 'InCaucasian_Albanian', astral: '\uD801[\uDD30-\uDD6F]' }, { name: 'InChakma', astral: '\uD804[\uDD00-\uDD4F]' }, { name: 'InCham', bmp: '\uAA00-\uAA5F' }, { name: 'InCherokee', bmp: '\u13A0-\u13FF' }, { name: 'InCherokee_Supplement', bmp: '\uAB70-\uABBF' }, { name: 'InCombining_Diacritical_Marks', bmp: '\u0300-\u036F' }, { name: 'InCombining_Diacritical_Marks_Extended', bmp: '\u1AB0-\u1AFF' }, { name: 'InCombining_Diacritical_Marks_Supplement', bmp: '\u1DC0-\u1DFF' }, { name: 'InCombining_Diacritical_Marks_for_Symbols', bmp: '\u20D0-\u20FF' }, { name: 'InCombining_Half_Marks', bmp: '\uFE20-\uFE2F' }, { name: 'InCommon_Indic_Number_Forms', bmp: '\uA830-\uA83F' }, { name: 'InControl_Pictures', bmp: '\u2400-\u243F' }, { name: 'InCoptic', bmp: '\u2C80-\u2CFF' }, { name: 'InCoptic_Epact_Numbers', astral: '\uD800[\uDEE0-\uDEFF]' }, { name: 'InCounting_Rod_Numerals', astral: '\uD834[\uDF60-\uDF7F]' }, { name: 'InCuneiform', astral: '\uD808[\uDC00-\uDFFF]' }, { name: 'InCuneiform_Numbers_and_Punctuation', astral: '\uD809[\uDC00-\uDC7F]' }, { name: 'InCurrency_Symbols', bmp: '\u20A0-\u20CF' }, { name: 'InCypriot_Syllabary', astral: '\uD802[\uDC00-\uDC3F]' }, { name: 'InCyrillic', bmp: '\u0400-\u04FF' }, { name: 'InCyrillic_Extended_A', bmp: '\u2DE0-\u2DFF' }, { name: 'InCyrillic_Extended_B', bmp: '\uA640-\uA69F' }, { name: 'InCyrillic_Extended_C', bmp: '\u1C80-\u1C8F' }, { name: 'InCyrillic_Supplement', bmp: '\u0500-\u052F' }, { name: 'InDeseret', astral: '\uD801[\uDC00-\uDC4F]' }, { name: 'InDevanagari', bmp: '\u0900-\u097F' }, { name: 'InDevanagari_Extended', bmp: '\uA8E0-\uA8FF' }, { name: 'InDingbats', bmp: '\u2700-\u27BF' }, { name: 'InDomino_Tiles', astral: '\uD83C[\uDC30-\uDC9F]' }, { name: 'InDuployan', astral: '\uD82F[\uDC00-\uDC9F]' }, { name: 'InEarly_Dynastic_Cuneiform', astral: '\uD809[\uDC80-\uDD4F]' }, { name: 'InEgyptian_Hieroglyphs', astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]' }, { name: 'InElbasan', astral: '\uD801[\uDD00-\uDD2F]' }, { name: 'InEmoticons', astral: '\uD83D[\uDE00-\uDE4F]' }, { name: 'InEnclosed_Alphanumeric_Supplement', astral: '\uD83C[\uDD00-\uDDFF]' }, { name: 'InEnclosed_Alphanumerics', bmp: '\u2460-\u24FF' }, { name: 'InEnclosed_CJK_Letters_and_Months', bmp: '\u3200-\u32FF' }, { name: 'InEnclosed_Ideographic_Supplement', astral: '\uD83C[\uDE00-\uDEFF]' }, { name: 'InEthiopic', bmp: '\u1200-\u137F' }, { name: 'InEthiopic_Extended', bmp: '\u2D80-\u2DDF' }, { name: 'InEthiopic_Extended_A', bmp: '\uAB00-\uAB2F' }, { name: 'InEthiopic_Supplement', bmp: '\u1380-\u139F' }, { name: 'InGeneral_Punctuation', bmp: '\u2000-\u206F' }, { name: 'InGeometric_Shapes', bmp: '\u25A0-\u25FF' }, { name: 'InGeometric_Shapes_Extended', astral: '\uD83D[\uDF80-\uDFFF]' }, { name: 'InGeorgian', bmp: '\u10A0-\u10FF' }, { name: 'InGeorgian_Supplement', bmp: '\u2D00-\u2D2F' }, { name: 'InGlagolitic', bmp: '\u2C00-\u2C5F' }, { name: 'InGlagolitic_Supplement', astral: '\uD838[\uDC00-\uDC2F]' }, { name: 'InGothic', astral: '\uD800[\uDF30-\uDF4F]' }, { name: 'InGrantha', astral: '\uD804[\uDF00-\uDF7F]' }, { name: 'InGreek_Extended', bmp: '\u1F00-\u1FFF' }, { name: 'InGreek_and_Coptic', bmp: '\u0370-\u03FF' }, { name: 'InGujarati', bmp: '\u0A80-\u0AFF' }, { name: 'InGurmukhi', bmp: '\u0A00-\u0A7F' }, { name: 'InHalfwidth_and_Fullwidth_Forms', bmp: '\uFF00-\uFFEF' }, { name: 'InHangul_Compatibility_Jamo', bmp: '\u3130-\u318F' }, { name: 'InHangul_Jamo', bmp: '\u1100-\u11FF' }, { name: 'InHangul_Jamo_Extended_A', bmp: '\uA960-\uA97F' }, { name: 'InHangul_Jamo_Extended_B', bmp: '\uD7B0-\uD7FF' }, { name: 'InHangul_Syllables', bmp: '\uAC00-\uD7AF' }, { name: 'InHanunoo', bmp: '\u1720-\u173F' }, { name: 'InHatran', astral: '\uD802[\uDCE0-\uDCFF]' }, { name: 'InHebrew', bmp: '\u0590-\u05FF' }, { name: 'InHigh_Private_Use_Surrogates', bmp: '\uDB80-\uDBFF' }, { name: 'InHigh_Surrogates', bmp: '\uD800-\uDB7F' }, { name: 'InHiragana', bmp: '\u3040-\u309F' }, { name: 'InIPA_Extensions', bmp: '\u0250-\u02AF' }, { name: 'InIdeographic_Description_Characters', bmp: '\u2FF0-\u2FFF' }, { name: 'InIdeographic_Symbols_and_Punctuation', astral: '\uD81B[\uDFE0-\uDFFF]' }, { name: 'InImperial_Aramaic', astral: '\uD802[\uDC40-\uDC5F]' }, { name: 'InInscriptional_Pahlavi', astral: '\uD802[\uDF60-\uDF7F]' }, { name: 'InInscriptional_Parthian', astral: '\uD802[\uDF40-\uDF5F]' }, { name: 'InJavanese', bmp: '\uA980-\uA9DF' }, { name: 'InKaithi', astral: '\uD804[\uDC80-\uDCCF]' }, { name: 'InKana_Supplement', astral: '\uD82C[\uDC00-\uDCFF]' }, { name: 'InKanbun', bmp: '\u3190-\u319F' }, { name: 'InKangxi_Radicals', bmp: '\u2F00-\u2FDF' }, { name: 'InKannada', bmp: '\u0C80-\u0CFF' }, { name: 'InKatakana', bmp: '\u30A0-\u30FF' }, { name: 'InKatakana_Phonetic_Extensions', bmp: '\u31F0-\u31FF' }, { name: 'InKayah_Li', bmp: '\uA900-\uA92F' }, { name: 'InKharoshthi', astral: '\uD802[\uDE00-\uDE5F]' }, { name: 'InKhmer', bmp: '\u1780-\u17FF' }, { name: 'InKhmer_Symbols', bmp: '\u19E0-\u19FF' }, { name: 'InKhojki', astral: '\uD804[\uDE00-\uDE4F]' }, { name: 'InKhudawadi', astral: '\uD804[\uDEB0-\uDEFF]' }, { name: 'InLao', bmp: '\u0E80-\u0EFF' }, { name: 'InLatin_Extended_Additional', bmp: '\u1E00-\u1EFF' }, { name: 'InLatin_Extended_A', bmp: '\u0100-\u017F' }, { name: 'InLatin_Extended_B', bmp: '\u0180-\u024F' }, { name: 'InLatin_Extended_C', bmp: '\u2C60-\u2C7F' }, { name: 'InLatin_Extended_D', bmp: '\uA720-\uA7FF' }, { name: 'InLatin_Extended_E', bmp: '\uAB30-\uAB6F' }, { name: 'InLatin_1_Supplement', bmp: '\x80-\xFF' }, { name: 'InLepcha', bmp: '\u1C00-\u1C4F' }, { name: 'InLetterlike_Symbols', bmp: '\u2100-\u214F' }, { name: 'InLimbu', bmp: '\u1900-\u194F' }, { name: 'InLinear_A', astral: '\uD801[\uDE00-\uDF7F]' }, { name: 'InLinear_B_Ideograms', astral: '\uD800[\uDC80-\uDCFF]' }, { name: 'InLinear_B_Syllabary', astral: '\uD800[\uDC00-\uDC7F]' }, { name: 'InLisu', bmp: '\uA4D0-\uA4FF' }, { name: 'InLow_Surrogates', bmp: '\uDC00-\uDFFF' }, { name: 'InLycian', astral: '\uD800[\uDE80-\uDE9F]' }, { name: 'InLydian', astral: '\uD802[\uDD20-\uDD3F]' }, { name: 'InMahajani', astral: '\uD804[\uDD50-\uDD7F]' }, { name: 'InMahjong_Tiles', astral: '\uD83C[\uDC00-\uDC2F]' }, { name: 'InMalayalam', bmp: '\u0D00-\u0D7F' }, { name: 'InMandaic', bmp: '\u0840-\u085F' }, { name: 'InManichaean', astral: '\uD802[\uDEC0-\uDEFF]' }, { name: 'InMarchen', astral: '\uD807[\uDC70-\uDCBF]' }, { name: 'InMathematical_Alphanumeric_Symbols', astral: '\uD835[\uDC00-\uDFFF]' }, { name: 'InMathematical_Operators', bmp: '\u2200-\u22FF' }, { name: 'InMeetei_Mayek', bmp: '\uABC0-\uABFF' }, { name: 'InMeetei_Mayek_Extensions', bmp: '\uAAE0-\uAAFF' }, { name: 'InMende_Kikakui', astral: '\uD83A[\uDC00-\uDCDF]' }, { name: 'InMeroitic_Cursive', astral: '\uD802[\uDDA0-\uDDFF]' }, { name: 'InMeroitic_Hieroglyphs', astral: '\uD802[\uDD80-\uDD9F]' }, { name: 'InMiao', astral: '\uD81B[\uDF00-\uDF9F]' }, { name: 'InMiscellaneous_Mathematical_Symbols_A', bmp: '\u27C0-\u27EF' }, { name: 'InMiscellaneous_Mathematical_Symbols_B', bmp: '\u2980-\u29FF' }, { name: 'InMiscellaneous_Symbols', bmp: '\u2600-\u26FF' }, { name: 'InMiscellaneous_Symbols_and_Arrows', bmp: '\u2B00-\u2BFF' }, { name: 'InMiscellaneous_Symbols_and_Pictographs', astral: '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]' }, { name: 'InMiscellaneous_Technical', bmp: '\u2300-\u23FF' }, { name: 'InModi', astral: '\uD805[\uDE00-\uDE5F]' }, { name: 'InModifier_Tone_Letters', bmp: '\uA700-\uA71F' }, { name: 'InMongolian', bmp: '\u1800-\u18AF' }, { name: 'InMongolian_Supplement', astral: '\uD805[\uDE60-\uDE7F]' }, { name: 'InMro', astral: '\uD81A[\uDE40-\uDE6F]' }, { name: 'InMultani', astral: '\uD804[\uDE80-\uDEAF]' }, { name: 'InMusical_Symbols', astral: '\uD834[\uDD00-\uDDFF]' }, { name: 'InMyanmar', bmp: '\u1000-\u109F' }, { name: 'InMyanmar_Extended_A', bmp: '\uAA60-\uAA7F' }, { name: 'InMyanmar_Extended_B', bmp: '\uA9E0-\uA9FF' }, { name: 'InNKo', bmp: '\u07C0-\u07FF' }, { name: 'InNabataean', astral: '\uD802[\uDC80-\uDCAF]' }, { name: 'InNew_Tai_Lue', bmp: '\u1980-\u19DF' }, { name: 'InNewa', astral: '\uD805[\uDC00-\uDC7F]' }, { name: 'InNumber_Forms', bmp: '\u2150-\u218F' }, { name: 'InOgham', bmp: '\u1680-\u169F' }, { name: 'InOl_Chiki', bmp: '\u1C50-\u1C7F' }, { name: 'InOld_Hungarian', astral: '\uD803[\uDC80-\uDCFF]' }, { name: 'InOld_Italic', astral: '\uD800[\uDF00-\uDF2F]' }, { name: 'InOld_North_Arabian', astral: '\uD802[\uDE80-\uDE9F]' }, { name: 'InOld_Permic', astral: '\uD800[\uDF50-\uDF7F]' }, { name: 'InOld_Persian', astral: '\uD800[\uDFA0-\uDFDF]' }, { name: 'InOld_South_Arabian', astral: '\uD802[\uDE60-\uDE7F]' }, { name: 'InOld_Turkic', astral: '\uD803[\uDC00-\uDC4F]' }, { name: 'InOptical_Character_Recognition', bmp: '\u2440-\u245F' }, { name: 'InOriya', bmp: '\u0B00-\u0B7F' }, { name: 'InOrnamental_Dingbats', astral: '\uD83D[\uDE50-\uDE7F]' }, { name: 'InOsage', astral: '\uD801[\uDCB0-\uDCFF]' }, { name: 'InOsmanya', astral: '\uD801[\uDC80-\uDCAF]' }, { name: 'InPahawh_Hmong', astral: '\uD81A[\uDF00-\uDF8F]' }, { name: 'InPalmyrene', astral: '\uD802[\uDC60-\uDC7F]' }, { name: 'InPau_Cin_Hau', astral: '\uD806[\uDEC0-\uDEFF]' }, { name: 'InPhags_pa', bmp: '\uA840-\uA87F' }, { name: 'InPhaistos_Disc', astral: '\uD800[\uDDD0-\uDDFF]' }, { name: 'InPhoenician', astral: '\uD802[\uDD00-\uDD1F]' }, { name: 'InPhonetic_Extensions', bmp: '\u1D00-\u1D7F' }, { name: 'InPhonetic_Extensions_Supplement', bmp: '\u1D80-\u1DBF' }, { name: 'InPlaying_Cards', astral: '\uD83C[\uDCA0-\uDCFF]' }, { name: 'InPrivate_Use_Area', bmp: '\uE000-\uF8FF' }, { name: 'InPsalter_Pahlavi', astral: '\uD802[\uDF80-\uDFAF]' }, { name: 'InRejang', bmp: '\uA930-\uA95F' }, { name: 'InRumi_Numeral_Symbols', astral: '\uD803[\uDE60-\uDE7F]' }, { name: 'InRunic', bmp: '\u16A0-\u16FF' }, { name: 'InSamaritan', bmp: '\u0800-\u083F' }, { name: 'InSaurashtra', bmp: '\uA880-\uA8DF' }, { name: 'InSharada', astral: '\uD804[\uDD80-\uDDDF]' }, { name: 'InShavian', astral: '\uD801[\uDC50-\uDC7F]' }, { name: 'InShorthand_Format_Controls', astral: '\uD82F[\uDCA0-\uDCAF]' }, { name: 'InSiddham', astral: '\uD805[\uDD80-\uDDFF]' }, { name: 'InSinhala', bmp: '\u0D80-\u0DFF' }, { name: 'InSinhala_Archaic_Numbers', astral: '\uD804[\uDDE0-\uDDFF]' }, { name: 'InSmall_Form_Variants', bmp: '\uFE50-\uFE6F' }, { name: 'InSora_Sompeng', astral: '\uD804[\uDCD0-\uDCFF]' }, { name: 'InSpacing_Modifier_Letters', bmp: '\u02B0-\u02FF' }, { name: 'InSpecials', bmp: '\uFFF0-\uFFFF' }, { name: 'InSundanese', bmp: '\u1B80-\u1BBF' }, { name: 'InSundanese_Supplement', bmp: '\u1CC0-\u1CCF' }, { name: 'InSuperscripts_and_Subscripts', bmp: '\u2070-\u209F' }, { name: 'InSupplemental_Arrows_A', bmp: '\u27F0-\u27FF' }, { name: 'InSupplemental_Arrows_B', bmp: '\u2900-\u297F' }, { name: 'InSupplemental_Arrows_C', astral: '\uD83E[\uDC00-\uDCFF]' }, { name: 'InSupplemental_Mathematical_Operators', bmp: '\u2A00-\u2AFF' }, { name: 'InSupplemental_Punctuation', bmp: '\u2E00-\u2E7F' }, { name: 'InSupplemental_Symbols_and_Pictographs', astral: '\uD83E[\uDD00-\uDDFF]' }, { name: 'InSupplementary_Private_Use_Area_A', astral: '[\uDB80-\uDBBF][\uDC00-\uDFFF]' }, { name: 'InSupplementary_Private_Use_Area_B', astral: '[\uDBC0-\uDBFF][\uDC00-\uDFFF]' }, { name: 'InSutton_SignWriting', astral: '\uD836[\uDC00-\uDEAF]' }, { name: 'InSyloti_Nagri', bmp: '\uA800-\uA82F' }, { name: 'InSyriac', bmp: '\u0700-\u074F' }, { name: 'InTagalog', bmp: '\u1700-\u171F' }, { name: 'InTagbanwa', bmp: '\u1760-\u177F' }, { name: 'InTags', astral: '\uDB40[\uDC00-\uDC7F]' }, { name: 'InTai_Le', bmp: '\u1950-\u197F' }, { name: 'InTai_Tham', bmp: '\u1A20-\u1AAF' }, { name: 'InTai_Viet', bmp: '\uAA80-\uAADF' }, { name: 'InTai_Xuan_Jing_Symbols', astral: '\uD834[\uDF00-\uDF5F]' }, { name: 'InTakri', astral: '\uD805[\uDE80-\uDECF]' }, { name: 'InTamil', bmp: '\u0B80-\u0BFF' }, { name: 'InTangut', astral: '[\uD81C-\uD821][\uDC00-\uDFFF]' }, { name: 'InTangut_Components', astral: '\uD822[\uDC00-\uDEFF]' }, { name: 'InTelugu', bmp: '\u0C00-\u0C7F' }, { name: 'InThaana', bmp: '\u0780-\u07BF' }, { name: 'InThai', bmp: '\u0E00-\u0E7F' }, { name: 'InTibetan', bmp: '\u0F00-\u0FFF' }, { name: 'InTifinagh', bmp: '\u2D30-\u2D7F' }, { name: 'InTirhuta', astral: '\uD805[\uDC80-\uDCDF]' }, { name: 'InTransport_and_Map_Symbols', astral: '\uD83D[\uDE80-\uDEFF]' }, { name: 'InUgaritic', astral: '\uD800[\uDF80-\uDF9F]' }, { name: 'InUnified_Canadian_Aboriginal_Syllabics', bmp: '\u1400-\u167F' }, { name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended', bmp: '\u18B0-\u18FF' }, { name: 'InVai', bmp: '\uA500-\uA63F' }, { name: 'InVariation_Selectors', bmp: '\uFE00-\uFE0F' }, { name: 'InVariation_Selectors_Supplement', astral: '\uDB40[\uDD00-\uDDEF]' }, { name: 'InVedic_Extensions', bmp: '\u1CD0-\u1CFF' }, { name: 'InVertical_Forms', bmp: '\uFE10-\uFE1F' }, { name: 'InWarang_Citi', astral: '\uD806[\uDCA0-\uDCFF]' }, { name: 'InYi_Radicals', bmp: '\uA490-\uA4CF' }, { name: 'InYi_Syllables', bmp: '\uA000-\uA48F' }, { name: 'InYijing_Hexagram_Symbols', bmp: '\u4DC0-\u4DFF' } ]); }; },{}],5:[function(require,module,exports){ /*! * XRegExp Unicode Categories 3.2.0 * * Steven Levithan (c) 2010-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See * category descriptions in UAX #44 . Token * names are case insensitive, and any spaces, hyphens, and underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); } XRegExp.addUnicodeData([ { name: 'C', alias: 'Other', isBmpLast: true, bmp: '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' }, { name: 'Cc', alias: 'Control', bmp: '\0-\x1F\x7F-\x9F' }, { name: 'Cf', alias: 'Format', bmp: '\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', astral: '\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' }, { name: 'Cn', alias: 'Unassigned', bmp: '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' }, { name: 'Co', alias: 'Private_Use', bmp: '\uE000-\uF8FF', astral: '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' }, { name: 'Cs', alias: 'Surrogate', bmp: '\uD800-\uDFFF' }, { name: 'L', alias: 'Letter', bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Ll', alias: 'Lowercase_Letter', bmp: 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' }, { name: 'Lm', alias: 'Modifier_Letter', bmp: '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F', astral: '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0]' }, { name: 'Lo', alias: 'Other_Letter', bmp: '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Lt', alias: 'Titlecase_Letter', bmp: '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' }, { name: 'Lu', alias: 'Uppercase_Letter', bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' }, { name: 'M', alias: 'Mark', bmp: '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDCA-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' }, { name: 'Mc', alias: 'Spacing_Mark', bmp: '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF2\u1CF3\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BD-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', astral: '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4]|\uD81B[\uDF51-\uDF7E]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' }, { name: 'Me', alias: 'Enclosing_Mark', bmp: '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' }, { name: 'Mn', alias: 'Nonspacing_Mark', bmp: '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDCA-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' }, { name: 'N', alias: 'Number', bmp: '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', astral: '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2]|\uD807[\uDC50-\uDC6C]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83C[\uDD00-\uDD0C]' }, { name: 'Nd', alias: 'Decimal_Number', bmp: '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', astral: '\uD801[\uDCA0-\uDCA9]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9]|\uD807[\uDC50-\uDC59]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDD50-\uDD59]' }, { name: 'Nl', alias: 'Letter_Number', bmp: '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', astral: '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' }, { name: 'No', alias: 'Other_Number', bmp: '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', astral: '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C]|\uD81A[\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD83A[\uDCC7-\uDCCF]|\uD83C[\uDD00-\uDD0C]' }, { name: 'P', alias: 'Punctuation', bmp: '\x21-\x23\x25-\\x2A\x2C-\x2F\x3A\x3B\\x3F\x40\\x5B-\\x5D\x5F\\x7B\x7D\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' }, { name: 'Pc', alias: 'Connector_Punctuation', bmp: '\x5F\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' }, { name: 'Pd', alias: 'Dash_Punctuation', bmp: '\\x2D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D' }, { name: 'Pe', alias: 'Close_Punctuation', bmp: '\\x29\\x5D\x7D\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' }, { name: 'Pf', alias: 'Final_Punctuation', bmp: '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' }, { name: 'Pi', alias: 'Initial_Punctuation', bmp: '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' }, { name: 'Po', alias: 'Other_Punctuation', bmp: '\x21-\x23\x25-\x27\\x2A\x2C\\x2E\x2F\x3A\x3B\\x3F\x40\\x5C\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166D\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43\u2E44\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' }, { name: 'Ps', alias: 'Open_Punctuation', bmp: '\\x28\\x5B\\x7B\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' }, { name: 'S', alias: 'Symbol', bmp: '\\x24\\x2B\x3C-\x3E\\x5E\x60\\x7C\x7E\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20BE\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83B[\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' }, { name: 'Sc', alias: 'Currency_Symbol', bmp: '\\x24\xA2-\xA5\u058F\u060B\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BE\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6' }, { name: 'Sk', alias: 'Modifier_Symbol', bmp: '\\x5E\x60\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3', astral: '\uD83C[\uDFFB-\uDFFF]' }, { name: 'Sm', alias: 'Math_Symbol', bmp: '\\x2B\x3C-\x3E\\x7C\x7E\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', astral: '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' }, { name: 'So', alias: 'Other_Symbol', bmp: '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' }, { name: 'Z', alias: 'Separator', bmp: '\x20\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' }, { name: 'Zl', alias: 'Line_Separator', bmp: '\u2028' }, { name: 'Zp', alias: 'Paragraph_Separator', bmp: '\u2029' }, { name: 'Zs', alias: 'Space_Separator', bmp: '\x20\xA0\u1680\u2000-\u200A\u202F\u205F\u3000' } ]); }; },{}],6:[function(require,module,exports){ /*! * XRegExp Unicode Properties 3.2.0 * * Steven Levithan (c) 2012-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See * . Following are definitions of these properties from * UAX #44 : * * - Alphabetic * Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm + * Lo + Nl + Other_Alphabetic. * * - Default_Ignorable_Code_Point * For programmatic determination of default ignorable code points. New characters that should * be ignored in rendering (unless explicitly supported) will be assigned in these ranges, * permitting programs to correctly handle the default rendering of such characters when not * otherwise supported. * * - Lowercase * Characters with the Lowercase property. Generated from: Ll + Other_Lowercase. * * - Noncharacter_Code_Point * Code points permanently reserved for internal use. * * - Uppercase * Characters with the Uppercase property. Generated from: Lu + Other_Uppercase. * * - White_Space * Spaces, separator characters and other control characters which should be treated by * programming languages as "white space" for the purpose of parsing elements. * * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are * included in XRegExp's Unicode Categories and Unicode Scripts addons. * * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Properties'); } var unicodeData = [ { name: 'ASCII', bmp: '\0-\x7F' }, { name: 'Alphabetic', bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u1062\u1065-\u1068\u106E-\u1086\u108E\u109C\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C35\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1D00-\u1DBF\u1DE7-\u1DF4\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A\uAA7E-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDF00-\uDF19\uDF1D-\uDF2A]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF36\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Any', isBmpLast: true, bmp: '\0-\uFFFF', astral: '[\uD800-\uDBFF][\uDC00-\uDFFF]' }, { name: 'Default_Ignorable_Code_Point', bmp: '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8', astral: '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]' }, { name: 'Lowercase', bmp: 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B-\uA69D\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' }, { name: 'Noncharacter_Code_Point', bmp: '\uFDD0-\uFDEF\uFFFE\uFFFF', astral: '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]' }, { name: 'Uppercase', bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]' }, { name: 'White_Space', bmp: '\x09-\x0D\x20\x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' } ]; // Add non-generated data unicodeData.push({ name: 'Assigned', // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode // Categories addon is required to use this property inverseOf: 'Cn' }); XRegExp.addUnicodeData(unicodeData); }; },{}],7:[function(require,module,exports){ /*! * XRegExp Unicode Scripts 3.2.0 * * Steven Levithan (c) 2010-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive, * and any spaces, hyphens, and underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts'); } XRegExp.addUnicodeData([ { name: 'Adlam', astral: '\uD83A[\uDD00-\uDD4A\uDD50-\uDD59\uDD5E\uDD5F]' }, { name: 'Ahom', astral: '\uD805[\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF3F]' }, { name: 'Anatolian_Hieroglyphs', astral: '\uD811[\uDC00-\uDE46]' }, { name: 'Arabic', bmp: '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC', astral: '\uD803[\uDE60-\uDE7E]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]' }, { name: 'Armenian', bmp: '\u0531-\u0556\u0559-\u055F\u0561-\u0587\u058A\u058D-\u058F\uFB13-\uFB17' }, { name: 'Avestan', astral: '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]' }, { name: 'Balinese', bmp: '\u1B00-\u1B4B\u1B50-\u1B7C' }, { name: 'Bamum', bmp: '\uA6A0-\uA6F7', astral: '\uD81A[\uDC00-\uDE38]' }, { name: 'Bassa_Vah', astral: '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]' }, { name: 'Batak', bmp: '\u1BC0-\u1BF3\u1BFC-\u1BFF' }, { name: 'Bengali', bmp: '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FB' }, { name: 'Bhaiksuki', astral: '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]' }, { name: 'Bopomofo', bmp: '\u02EA\u02EB\u3105-\u312D\u31A0-\u31BA' }, { name: 'Brahmi', astral: '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]' }, { name: 'Braille', bmp: '\u2800-\u28FF' }, { name: 'Buginese', bmp: '\u1A00-\u1A1B\u1A1E\u1A1F' }, { name: 'Buhid', bmp: '\u1740-\u1753' }, { name: 'Canadian_Aboriginal', bmp: '\u1400-\u167F\u18B0-\u18F5' }, { name: 'Carian', astral: '\uD800[\uDEA0-\uDED0]' }, { name: 'Caucasian_Albanian', astral: '\uD801[\uDD30-\uDD63\uDD6F]' }, { name: 'Chakma', astral: '\uD804[\uDD00-\uDD34\uDD36-\uDD43]' }, { name: 'Cham', bmp: '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F' }, { name: 'Cherokee', bmp: '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF' }, { name: 'Common', bmp: '\0-\x40\\x5B-\x60\\x7B-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061C\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BE\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u23FE\u2400-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2E00-\u2E44\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD', astral: '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDF00-\uDF56\uDF60-\uDF71]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB\uDFCE-\uDFFF]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]|\uDB40[\uDC01\uDC20-\uDC7F]' }, { name: 'Coptic', bmp: '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF' }, { name: 'Cuneiform', astral: '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]' }, { name: 'Cypriot', astral: '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]' }, { name: 'Cyrillic', bmp: '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F' }, { name: 'Deseret', astral: '\uD801[\uDC00-\uDC4F]' }, { name: 'Devanagari', bmp: '\u0900-\u0950\u0953-\u0963\u0966-\u097F\uA8E0-\uA8FD' }, { name: 'Duployan', astral: '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]' }, { name: 'Egyptian_Hieroglyphs', astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]' }, { name: 'Elbasan', astral: '\uD801[\uDD00-\uDD27]' }, { name: 'Ethiopic', bmp: '\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E' }, { name: 'Georgian', bmp: '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u2D00-\u2D25\u2D27\u2D2D' }, { name: 'Glagolitic', bmp: '\u2C00-\u2C2E\u2C30-\u2C5E', astral: '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]' }, { name: 'Gothic', astral: '\uD800[\uDF30-\uDF4A]' }, { name: 'Grantha', astral: '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]' }, { name: 'Greek', bmp: '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65', astral: '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]' }, { name: 'Gujarati', bmp: '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9' }, { name: 'Gurmukhi', bmp: '\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75' }, { name: 'Han', bmp: '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9', astral: '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Hangul', bmp: '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' }, { name: 'Hanunoo', bmp: '\u1720-\u1734' }, { name: 'Hatran', astral: '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]' }, { name: 'Hebrew', bmp: '\u0591-\u05C7\u05D0-\u05EA\u05F0-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F' }, { name: 'Hiragana', bmp: '\u3041-\u3096\u309D-\u309F', astral: '\uD82C\uDC01|\uD83C\uDE00' }, { name: 'Imperial_Aramaic', astral: '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]' }, { name: 'Inherited', bmp: '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951\u0952\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D', astral: '\uD800[\uDDFD\uDEE0]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]' }, { name: 'Inscriptional_Pahlavi', astral: '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]' }, { name: 'Inscriptional_Parthian', astral: '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]' }, { name: 'Javanese', bmp: '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF' }, { name: 'Kaithi', astral: '\uD804[\uDC80-\uDCC1]' }, { name: 'Kannada', bmp: '\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2' }, { name: 'Katakana', bmp: '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D', astral: '\uD82C\uDC00' }, { name: 'Kayah_Li', bmp: '\uA900-\uA92D\uA92F' }, { name: 'Kharoshthi', astral: '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F-\uDE47\uDE50-\uDE58]' }, { name: 'Khmer', bmp: '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF' }, { name: 'Khojki', astral: '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]' }, { name: 'Khudawadi', astral: '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]' }, { name: 'Lao', bmp: '\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF' }, { name: 'Latin', bmp: 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A' }, { name: 'Lepcha', bmp: '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F' }, { name: 'Limbu', bmp: '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F' }, { name: 'Linear_A', astral: '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]' }, { name: 'Linear_B', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]' }, { name: 'Lisu', bmp: '\uA4D0-\uA4FF' }, { name: 'Lycian', astral: '\uD800[\uDE80-\uDE9C]' }, { name: 'Lydian', astral: '\uD802[\uDD20-\uDD39\uDD3F]' }, { name: 'Mahajani', astral: '\uD804[\uDD50-\uDD76]' }, { name: 'Malayalam', bmp: '\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F' }, { name: 'Mandaic', bmp: '\u0840-\u085B\u085E' }, { name: 'Manichaean', astral: '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]' }, { name: 'Marchen', astral: '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]' }, { name: 'Meetei_Mayek', bmp: '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9' }, { name: 'Mende_Kikakui', astral: '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]' }, { name: 'Meroitic_Cursive', astral: '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]' }, { name: 'Meroitic_Hieroglyphs', astral: '\uD802[\uDD80-\uDD9F]' }, { name: 'Miao', astral: '\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]' }, { name: 'Modi', astral: '\uD805[\uDE00-\uDE44\uDE50-\uDE59]' }, { name: 'Mongolian', bmp: '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1877\u1880-\u18AA', astral: '\uD805[\uDE60-\uDE6C]' }, { name: 'Mro', astral: '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]' }, { name: 'Multani', astral: '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]' }, { name: 'Myanmar', bmp: '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F' }, { name: 'Nabataean', astral: '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]' }, { name: 'New_Tai_Lue', bmp: '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF' }, { name: 'Newa', astral: '\uD805[\uDC00-\uDC59\uDC5B\uDC5D]' }, { name: 'Nko', bmp: '\u07C0-\u07FA' }, { name: 'Ogham', bmp: '\u1680-\u169C' }, { name: 'Ol_Chiki', bmp: '\u1C50-\u1C7F' }, { name: 'Old_Hungarian', astral: '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]' }, { name: 'Old_Italic', astral: '\uD800[\uDF00-\uDF23]' }, { name: 'Old_North_Arabian', astral: '\uD802[\uDE80-\uDE9F]' }, { name: 'Old_Permic', astral: '\uD800[\uDF50-\uDF7A]' }, { name: 'Old_Persian', astral: '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]' }, { name: 'Old_South_Arabian', astral: '\uD802[\uDE60-\uDE7F]' }, { name: 'Old_Turkic', astral: '\uD803[\uDC00-\uDC48]' }, { name: 'Oriya', bmp: '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77' }, { name: 'Osage', astral: '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]' }, { name: 'Osmanya', astral: '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]' }, { name: 'Pahawh_Hmong', astral: '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]' }, { name: 'Palmyrene', astral: '\uD802[\uDC60-\uDC7F]' }, { name: 'Pau_Cin_Hau', astral: '\uD806[\uDEC0-\uDEF8]' }, { name: 'Phags_Pa', bmp: '\uA840-\uA877' }, { name: 'Phoenician', astral: '\uD802[\uDD00-\uDD1B\uDD1F]' }, { name: 'Psalter_Pahlavi', astral: '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]' }, { name: 'Rejang', bmp: '\uA930-\uA953\uA95F' }, { name: 'Runic', bmp: '\u16A0-\u16EA\u16EE-\u16F8' }, { name: 'Samaritan', bmp: '\u0800-\u082D\u0830-\u083E' }, { name: 'Saurashtra', bmp: '\uA880-\uA8C5\uA8CE-\uA8D9' }, { name: 'Sharada', astral: '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]' }, { name: 'Shavian', astral: '\uD801[\uDC50-\uDC7F]' }, { name: 'Siddham', astral: '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]' }, { name: 'SignWriting', astral: '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]' }, { name: 'Sinhala', bmp: '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4', astral: '\uD804[\uDDE1-\uDDF4]' }, { name: 'Sora_Sompeng', astral: '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]' }, { name: 'Sundanese', bmp: '\u1B80-\u1BBF\u1CC0-\u1CC7' }, { name: 'Syloti_Nagri', bmp: '\uA800-\uA82B' }, { name: 'Syriac', bmp: '\u0700-\u070D\u070F-\u074A\u074D-\u074F' }, { name: 'Tagalog', bmp: '\u1700-\u170C\u170E-\u1714' }, { name: 'Tagbanwa', bmp: '\u1760-\u176C\u176E-\u1770\u1772\u1773' }, { name: 'Tai_Le', bmp: '\u1950-\u196D\u1970-\u1974' }, { name: 'Tai_Tham', bmp: '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD' }, { name: 'Tai_Viet', bmp: '\uAA80-\uAAC2\uAADB-\uAADF' }, { name: 'Takri', astral: '\uD805[\uDE80-\uDEB7\uDEC0-\uDEC9]' }, { name: 'Tamil', bmp: '\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BFA' }, { name: 'Tangut', astral: '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]' }, { name: 'Telugu', bmp: '\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F' }, { name: 'Thaana', bmp: '\u0780-\u07B1' }, { name: 'Thai', bmp: '\u0E01-\u0E3A\u0E40-\u0E5B' }, { name: 'Tibetan', bmp: '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA' }, { name: 'Tifinagh', bmp: '\u2D30-\u2D67\u2D6F\u2D70\u2D7F' }, { name: 'Tirhuta', astral: '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]' }, { name: 'Ugaritic', astral: '\uD800[\uDF80-\uDF9D\uDF9F]' }, { name: 'Vai', bmp: '\uA500-\uA62B' }, { name: 'Warang_Citi', astral: '\uD806[\uDCA0-\uDCF2\uDCFF]' }, { name: 'Yi', bmp: '\uA000-\uA48C\uA490-\uA4C6' } ]); }; },{}],8:[function(require,module,exports){ var XRegExp = require('./xregexp'); require('./addons/build')(XRegExp); require('./addons/matchrecursive')(XRegExp); require('./addons/unicode-base')(XRegExp); require('./addons/unicode-blocks')(XRegExp); require('./addons/unicode-categories')(XRegExp); require('./addons/unicode-properties')(XRegExp); require('./addons/unicode-scripts')(XRegExp); module.exports = XRegExp; },{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9}],9:[function(require,module,exports){ /*! * XRegExp 3.2.0 * * Steven Levithan (c) 2007-2017 MIT License */ 'use strict'; /** * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to * make your client-side grepping simpler and more powerful, while freeing you from related * cross-browser inconsistencies. */ // ==--------------------------== // Private stuff // ==--------------------------== // Property name used for extended regex instance data var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled var features = { astral: false, natives: false }; // Native methods to use and restore ('native' is an ES3 reserved keyword) var nativ = { exec: RegExp.prototype.exec, test: RegExp.prototype.test, match: String.prototype.match, replace: String.prototype.replace, split: String.prototype.split }; // Storage for fixed/extended native methods var fixed = {}; // Storage for regexes cached by `XRegExp.cache` var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken` var tokens = []; // Token scopes var defaultScope = 'default'; var classScope = 'class'; // Regexes that match native regex syntax, including octals var nativeTokens = { // Any native multicharacter token in default scope, or any single character 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, // Any native multicharacter token in character class scope, or any single character 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ }; // Any backreference or dollar-prefixed character in replacement strings var replacementToken = /\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g; // Check for correct `exec` handling of nonparticipating capturing groups var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; // Check for ES6 `flags` prop support var hasFlagsProp = /x/.flags !== undefined; // Shortcut to `Object.prototype.toString` var toString = {}.toString; function hasNativeFlag(flag) { // Can't check based on the presence of properties/getters since browsers might support such // properties even when they don't support the corresponding flag in regex construction (tested // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` // throws an error) var isSupported = true; try { // Can't use regex literals for testing even in a `try` because regex literals with // unsupported flags cause a compilation error in IE new RegExp('', flag); } catch (exception) { isSupported = false; } return isSupported; } // Check for ES6 `u` flag support var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags var registeredFlags = { g: true, i: true, m: true, u: hasNativeU, y: hasNativeY }; /** * Attaches extended data and `XRegExp.prototype` properties to a regex object. * * @private * @param {RegExp} regex Regex to augment. * @param {Array} captureNames Array with capture names, or `null`. * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A. * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A. * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal * operations, and never exposed to users. For internal-only regexes, we can improve perf by * skipping some operations like attaching `XRegExp.prototype` properties. * @returns {RegExp} Augmented regex. */ function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { var p; regex[REGEX_DATA] = { captureNames: captureNames }; if (isInternalOnly) { return regex; } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value if (regex.__proto__) { regex.__proto__ = XRegExp.prototype; } else { for (p in XRegExp.prototype) { // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` // extensions exist on `regex.prototype` anyway regex[p] = XRegExp.prototype[p]; } } regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags; return regex; } /** * Removes any duplicate characters from the provided string. * * @private * @param {String} str String to remove duplicate characters from. * @returns {String} String with any duplicate characters removed. */ function clipDuplicates(str) { return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, ''); } /** * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype` * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing * flags g and y while copying the regex. * * @private * @param {RegExp} regex Regex to copy. * @param {Object} [options] Options object with optional properties: * - `addG` {Boolean} Add flag g while copying the regex. * - `addY` {Boolean} Add flag y while copying the regex. * - `removeG` {Boolean} Remove flag g while copying the regex. * - `removeY` {Boolean} Remove flag y while copying the regex. * - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal * operations, and never exposed to users. For internal-only regexes, we can improve perf by * skipping some operations like attaching `XRegExp.prototype` properties. * - `source` {String} Overrides `.source`, for special cases. * @returns {RegExp} Copy of the provided regex, possibly with modified flags. */ function copyRegex(regex, options) { if (!XRegExp.isRegExp(regex)) { throw new TypeError('Type RegExp expected'); } var xData = regex[REGEX_DATA] || {}; var flags = getNativeFlags(regex); var flagsToAdd = ''; var flagsToRemove = ''; var xregexpSource = null; var xregexpFlags = null; options = options || {}; if (options.removeG) {flagsToRemove += 'g';} if (options.removeY) {flagsToRemove += 'y';} if (flagsToRemove) { flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), ''); } if (options.addG) {flagsToAdd += 'g';} if (options.addY) {flagsToAdd += 'y';} if (flagsToAdd) { flags = clipDuplicates(flags + flagsToAdd); } if (!options.isInternalOnly) { if (xData.source !== undefined) { xregexpSource = xData.source; } // null or undefined; don't want to add to `flags` if the previous value was null, since // that indicates we're not tracking original precompilation flags if (xData.flags != null) { // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never // removed for non-internal regexes, so don't need to handle it xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags; } } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the // translation to native regex syntax regex = augment( new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly ); return regex; } /** * Converts hexadecimal to decimal. * * @private * @param {String} hex * @returns {Number} */ function dec(hex) { return parseInt(hex, 16); } /** * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an * inline comment or whitespace with flag x. This is used directly as a token handler function * passed to `XRegExp.addToken`. * * @private * @param {String} match Match arg of `XRegExp.addToken` handler * @param {String} scope Scope arg of `XRegExp.addToken` handler * @param {String} flags Flags arg of `XRegExp.addToken` handler * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match. */ function getContextualTokenSeparator(match, scope, flags) { if ( // No need to separate tokens if at the beginning or end of a group match.input.charAt(match.index - 1) === '(' || match.input.charAt(match.index + match[0].length) === ')' || // Avoid separating tokens when the following token is a quantifier isPatternNext(match.input, match.index + match[0].length, flags, '[?*+]|{\\d+(?:,\\d*)?}') ) { return ''; } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax // error `(? :` into `(?:`. return '(?:)'; } /** * Returns native `RegExp` flags used by a regex object. * * @private * @param {RegExp} regex Regex to check. * @returns {String} Native flags in use. */ function getNativeFlags(regex) { return hasFlagsProp ? regex.flags : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation // with an empty string) allows this to continue working predictably when // `XRegExp.proptotype.toString` is overridden nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1]; } /** * Determines whether a regex has extended instance data used to track capture names. * * @private * @param {RegExp} regex Regex to check. * @returns {Boolean} Whether the regex uses named capture. */ function hasNamedCapture(regex) { return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); } /** * Converts decimal to hexadecimal. * * @private * @param {Number|String} dec * @returns {String} */ function hex(dec) { return parseInt(dec, 10).toString(16); } /** * Returns the first index at which a given value can be found in an array. * * @private * @param {Array} array Array to search. * @param {*} value Value to locate in the array. * @returns {Number} Zero-based index at which the item is found, or -1. */ function indexOf(array, value) { var len = array.length; var i; for (i = 0; i < len; ++i) { if (array[i] === value) { return i; } } return -1; } /** * Checks whether the next nonignorable token after the specified position matches the * `needlePattern` * * @private * @param {String} pattern Pattern to search within. * @param {Number} pos Index in `pattern` to search at. * @param {String} flags Flags used by the pattern. * @param {String} needlePattern Pattern to match the next token against. * @returns {Boolean} Whether the next nonignorable token matches `needlePattern` */ function isPatternNext(pattern, pos, flags, needlePattern) { var inlineCommentPattern = '\\(\\?#[^)]*\\)'; var lineCommentPattern = '#[^#\\n]*'; var patternsToIgnore = flags.indexOf('x') > -1 ? // Ignore any leading whitespace, line comments, and inline comments ['\\s', lineCommentPattern, inlineCommentPattern] : // Ignore any leading inline comments [inlineCommentPattern]; return nativ.test.call( new RegExp('^(?:' + patternsToIgnore.join('|') + ')*(?:' + needlePattern + ')'), pattern.slice(pos) ); } /** * Determines whether a value is of the specified type, by resolving its internal [[Class]]. * * @private * @param {*} value Object to check. * @param {String} type Type to check for, in TitleCase. * @returns {Boolean} Whether the object matches the type. */ function isType(value, type) { return toString.call(value) === '[object ' + type + ']'; } /** * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values. * * @private * @param {String} str * @returns {String} */ function pad4(str) { while (str.length < 4) { str = '0' + str; } return str; } /** * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads * the flag preparation logic from the `XRegExp` constructor. * * @private * @param {String} pattern Regex pattern, possibly with a leading mode modifier. * @param {String} flags Any combination of flags. * @returns {Object} Object with properties `pattern` and `flags`. */ function prepareFlags(pattern, flags) { var i; // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags if (clipDuplicates(flags) !== flags) { throw new SyntaxError('Invalid duplicate regex flag ' + flags); } // Strip and apply a leading mode modifier with any combination of flags except g or y pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function($0, $1) { if (nativ.test.call(/[gy]/, $1)) { throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0); } // Allow duplicate flags within the mode modifier flags = clipDuplicates(flags + $1); return ''; }); // Throw on unknown native or nonnative flags for (i = 0; i < flags.length; ++i) { if (!registeredFlags[flags.charAt(i)]) { throw new SyntaxError('Unknown regex flag ' + flags.charAt(i)); } } return { pattern: pattern, flags: flags }; } /** * Prepares an options object from the given value. * * @private * @param {String|Object} value Value to convert to an options object. * @returns {Object} Options object. */ function prepareOptions(value) { var options = {}; if (isType(value, 'String')) { XRegExp.forEach(value, /[^\s,]+/, function(match) { options[match] = true; }); return options; } return value; } /** * Registers a flag so it doesn't throw an 'unknown flag' error. * * @private * @param {String} flag Single-character flag to register. */ function registerFlag(flag) { if (!/^[\w$]$/.test(flag)) { throw new Error('Flag must be a single character A-Za-z0-9_$'); } registeredFlags[flag] = true; } /** * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified * position, until a match is found. * * @private * @param {String} pattern Original pattern from which an XRegExp object is being built. * @param {String} flags Flags being used to construct the regex. * @param {Number} pos Position to search for tokens within `pattern`. * @param {Number} scope Regex scope to apply: 'default' or 'class'. * @param {Object} context Context object to use for token handler functions. * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`. */ function runTokens(pattern, flags, pos, scope, context) { var i = tokens.length; var leadChar = pattern.charAt(pos); var result = null; var match; var t; // Run in reverse insertion order while (i--) { t = tokens[i]; if ( (t.leadChar && t.leadChar !== leadChar) || (t.scope !== scope && t.scope !== 'all') || (t.flag && flags.indexOf(t.flag) === -1) ) { continue; } match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); if (match) { result = { matchLength: match[0].length, output: t.handler.call(context, match, scope, flags), reparse: t.reparse }; // Finished with token tests break; } } return result; } /** * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if * the Unicode Base addon is not available, since flag A is registered by that addon. * * @private * @param {Boolean} on `true` to enable; `false` to disable. */ function setAstral(on) { features.astral = on; } /** * Enables or disables native method overrides. * * @private * @param {Boolean} on `true` to enable; `false` to disable. */ function setNatives(on) { RegExp.prototype.exec = (on ? fixed : nativ).exec; RegExp.prototype.test = (on ? fixed : nativ).test; String.prototype.match = (on ? fixed : nativ).match; String.prototype.replace = (on ? fixed : nativ).replace; String.prototype.split = (on ? fixed : nativ).split; features.natives = on; } /** * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow * the ES5 abstract operation `ToObject`. * * @private * @param {*} value Object to check and return. * @returns {*} The provided object. */ function toObject(value) { // null or undefined if (value == null) { throw new TypeError('Cannot convert null or undefined to object'); } return value; } // ==--------------------------== // Constructor // ==--------------------------== /** * Creates an extended regular expression object for matching text with a pattern. Differs from a * native regular expression in that additional syntax and flags are supported. The returned object * is in fact a native `RegExp` and works with all native methods. * * @class XRegExp * @constructor * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy. * @param {String} [flags] Any combination of flags. * Native flags: * - `g` - global * - `i` - ignore case * - `m` - multiline anchors * - `u` - unicode (ES6) * - `y` - sticky (Firefox 3+, ES6) * Additional XRegExp flags: * - `n` - explicit capture * - `s` - dot matches all (aka singleline) * - `x` - free-spacing and line comments (aka extended) * - `A` - astral (requires the Unicode Base addon) * Flags cannot be provided when constructing one `RegExp` from another. * @returns {RegExp} Extended regular expression object. * @example * * // With named capture and flag x * XRegExp('(? [0-9]{4} ) -? # year \n\ * (? [0-9]{2} ) -? # month \n\ * (? [0-9]{2} ) # day ', 'x'); * * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp) * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and * // have fresh `lastIndex` properties (set to zero). * XRegExp(/regex/); */ function XRegExp(pattern, flags) { if (XRegExp.isRegExp(pattern)) { if (flags !== undefined) { throw new TypeError('Cannot supply flags when copying a RegExp'); } return copyRegex(pattern); } // Copy the argument behavior of `RegExp` pattern = pattern === undefined ? '' : String(pattern); flags = flags === undefined ? '' : String(flags); if (XRegExp.isInstalled('astral') && flags.indexOf('A') === -1) { // This causes an error to be thrown if the Unicode Base addon is not available flags += 'A'; } if (!patternCache[pattern]) { patternCache[pattern] = {}; } if (!patternCache[pattern][flags]) { var context = { hasNamedCapture: false, captureNames: [] }; var scope = defaultScope; var output = ''; var pos = 0; var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier var applied = prepareFlags(pattern, flags); var appliedPattern = applied.pattern; var appliedFlags = applied.flags; // Use XRegExp's tokens to translate the pattern to a native regex pattern. // `appliedPattern.length` may change on each iteration if tokens use `reparse` while (pos < appliedPattern.length) { do { // Check for custom tokens at the current position result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the // pattern before running tokens again at the same position if (result && result.reparse) { appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength); } } while (result && result.reparse); if (result) { output += result.output; pos += (result.matchLength || 1); } else { // Get the native token at the current position var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0]; output += token; pos += token.length; if (token === '[' && scope === defaultScope) { scope = classScope; } else if (token === ']' && scope === classScope) { scope = defaultScope; } } } patternCache[pattern][flags] = { // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty // groups are sometimes inserted during regex transpilation in order to keep tokens // separated. However, more than one empty group in a row is never needed. pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'), // Strip all but native flags flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''), // `context.captureNames` has an item for each capturing group, even if unnamed captures: context.hasNamedCapture ? context.captureNames : null }; } var generated = patternCache[pattern][flags]; return augment( new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags ); } // Add `RegExp.prototype` to the prototype chain XRegExp.prototype = new RegExp(); // ==--------------------------== // Public properties // ==--------------------------== /** * The XRegExp version number as a string containing three dot-separated parts. For example, * '2.0.0-beta-3'. * * @static * @memberOf XRegExp * @type String */ XRegExp.version = '3.2.0'; // ==--------------------------== // Public methods // ==--------------------------== // Intentionally undocumented; used in tests and addons XRegExp._clipDuplicates = clipDuplicates; XRegExp._hasNativeFlag = hasNativeFlag; XRegExp._dec = dec; XRegExp._hex = hex; XRegExp._pad4 = pad4; /** * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to * create XRegExp addons. If more than one token can match the same string, the last added wins. * * @memberOf XRegExp * @param {RegExp} regex Regex object that matches the new token. * @param {Function} handler Function that returns a new pattern string (using native regex syntax) * to replace the matched token within all future XRegExp regexes. Has access to persistent * properties of the regex being built, through `this`. Invoked with three arguments: * - The match array, with named backreference properties. * - The regex scope where the match was found: 'default' or 'class'. * - The flags used by the regex, including any flags in a leading mode modifier. * The handler function becomes part of the XRegExp construction process, so be careful not to * construct XRegExps within the function or you will trigger infinite recursion. * @param {Object} [options] Options object with optional properties: * - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'. * - `flag` {String} Single-character flag that triggers the token. This also registers the * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used. * - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are * not required to trigger the token. This registers the flags, to prevent XRegExp from * throwing an 'unknown flag' error when any of the flags are used. * - `reparse` {Boolean} Whether the `handler` function's output should not be treated as * final, and instead be reparseable by other tokens (including the current token). Allows * token chaining or deferring. * - `leadChar` {String} Single character that occurs at the beginning of any successful match * of the token (not always applicable). This doesn't change the behavior of the token unless * you provide an erroneous value. However, providing it can increase the token's performance * since the token can be skipped at any positions where this character doesn't appear. * @example * * // Basic usage: Add \a for the ALERT control code * XRegExp.addToken( * /\\a/, * function() {return '\\x07';}, * {scope: 'all'} * ); * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true * * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers. * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of * // character classes only) * XRegExp.addToken( * /([?*+]|{\d+(?:,\d*)?})(\??)/, * function(match) {return match[1] + (match[2] ? '' : '?');}, * {flag: 'U'} * ); * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a' * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa' */ XRegExp.addToken = function(regex, handler, options) { options = options || {}; var optionalFlags = options.optionalFlags; var i; if (options.flag) { registerFlag(options.flag); } if (optionalFlags) { optionalFlags = nativ.split.call(optionalFlags, ''); for (i = 0; i < optionalFlags.length; ++i) { registerFlag(optionalFlags[i]); } } // Add to the private list of syntax tokens tokens.push({ regex: copyRegex(regex, { addG: true, addY: hasNativeY, isInternalOnly: true }), handler: handler, scope: options.scope || defaultScope, flag: options.flag, reparse: options.reparse, leadChar: options.leadChar }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags // might now produce different results XRegExp.cache.flush('patterns'); }; /** * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with * the same pattern and flag combination, the cached copy of the regex is returned. * * @memberOf XRegExp * @param {String} pattern Regex pattern string. * @param {String} [flags] Any combination of XRegExp flags. * @returns {RegExp} Cached XRegExp object. * @example * * while (match = XRegExp.cache('.', 'gs').exec(str)) { * // The regex is compiled once only * } */ XRegExp.cache = function(pattern, flags) { if (!regexCache[pattern]) { regexCache[pattern] = {}; } return regexCache[pattern][flags] || ( regexCache[pattern][flags] = XRegExp(pattern, flags) ); }; // Intentionally undocumented; used in tests XRegExp.cache.flush = function(cacheName) { if (cacheName === 'patterns') { // Flush the pattern cache used by the `XRegExp` constructor patternCache = {}; } else { // Flush the regex cache populated by `XRegExp.cache` regexCache = {}; } }; /** * Escapes any regular expression metacharacters, for use when matching literal strings. The result * can safely be used at any point within a regex that uses any flags. * * @memberOf XRegExp * @param {String} str String to escape. * @returns {String} String with regex metacharacters escaped. * @example * * XRegExp.escape('Escaped? <.>'); * // -> 'Escaped\?\ <\.>' */ XRegExp.escape = function(str) { return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); }; /** * Executes a regex search in a specified string. Returns a match array or `null`. If the provided * regex uses named capture, named backreference properties are included on the match array. * Optional `pos` and `sticky` arguments specify the search start position, and whether the match * must start at the specified position only. The `lastIndex` property of the provided regex is not * used, but is updated for compatibility. Also fixes browser bugs compared to the native * `RegExp.prototype.exec` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {Number} [pos=0] Zero-based index at which to start the search. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position * only. The string `'sticky'` is accepted as an alternative to `true`. * @returns {Array} Match array with named backreference properties, or `null`. * @example * * // Basic use, with named backreference * var match = XRegExp.exec('U+2620', XRegExp('U\\+(?[0-9A-F]{4})')); * match.hex; // -> '2620' * * // With pos and sticky, in a loop * var pos = 2, result = [], match; * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) { * result.push(match[1]); * pos = match.index + match[0].length; * } * // result -> ['2', '3', '4'] */ XRegExp.exec = function(str, regex, pos, sticky) { var cacheKey = 'g'; var addY = false; var fakeY = false; var match; var r2; addY = hasNativeY && !!(sticky || (regex.sticky && sticky !== false)); if (addY) { cacheKey += 'y'; } else if (sticky) { // Simulate sticky matching by appending an empty capture to the original regex. The // resulting regex will succeed no matter what at the current index (set with `lastIndex`), // and will not search the rest of the subject string. We'll know that the original regex // has failed if that last capture is `''` rather than `undefined` (i.e., if that last // capture participated in the match). fakeY = true; cacheKey += 'FakeY'; } regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace` r2 = regex[REGEX_DATA][cacheKey] || ( regex[REGEX_DATA][cacheKey] = copyRegex(regex, { addG: true, addY: addY, source: fakeY ? regex.source + '|()' : undefined, removeY: sticky === false, isInternalOnly: true }) ); pos = pos || 0; r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means // the original regexp failed (see above). if (fakeY && match && match.pop() === '') { match = null; } if (regex.global) { regex.lastIndex = match ? r2.lastIndex : 0; } return match; }; /** * Executes a provided function once per regex match. Searches always start at the beginning of the * string and continue until the end, regardless of the state of the regex's `global` property and * initial `lastIndex`. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {Function} callback Function to execute for each match. Invoked with four arguments: * - The match array, with named backreference properties. * - The zero-based match index. * - The string being traversed. * - The regex object being used to traverse the string. * @example * * // Extracts every other digit from a string * var evens = []; * XRegExp.forEach('1a2345', /\d/, function(match, i) { * if (i % 2) evens.push(+match[0]); * }); * // evens -> [2, 4] */ XRegExp.forEach = function(str, regex, callback) { var pos = 0; var i = -1; var match; while ((match = XRegExp.exec(str, regex, pos))) { // Because `regex` is provided to `callback`, the function could use the deprecated/ // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of // regexes, mutating the regex will not have any effect on the iteration or matched strings, // which is a nice side effect that brings extra safety. callback(match, ++i, str, regex); pos = match.index + (match[0].length || 1); } }; /** * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native * regexes are not recompiled using XRegExp syntax. * * @memberOf XRegExp * @param {RegExp} regex Regex to globalize. * @returns {RegExp} Copy of the provided regex with flag `g` added. * @example * * var globalCopy = XRegExp.globalize(/regex/); * globalCopy.global; // -> true */ XRegExp.globalize = function(regex) { return copyRegex(regex, {addG: true}); }; /** * Installs optional features according to the specified options. Can be undone using * `XRegExp.uninstall`. * * @memberOf XRegExp * @param {Object|String} options Options object or string. * @example * * // With an options object * XRegExp.install({ * // Enables support for astral code points in Unicode addons (implicitly sets flag A) * astral: true, * * // DEPRECATED: Overrides native regex methods with fixed/extended versions * natives: true * }); * * // With an options string * XRegExp.install('astral natives'); */ XRegExp.install = function(options) { options = prepareOptions(options); if (!features.astral && options.astral) { setAstral(true); } if (!features.natives && options.natives) { setNatives(true); } }; /** * Checks whether an individual optional feature is installed. * * @memberOf XRegExp * @param {String} feature Name of the feature to check. One of: * - `astral` * - `natives` * @returns {Boolean} Whether the feature is installed. * @example * * XRegExp.isInstalled('astral'); */ XRegExp.isInstalled = function(feature) { return !!(features[feature]); }; /** * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes * created in another frame, when `instanceof` and `constructor` checks would fail. * * @memberOf XRegExp * @param {*} value Object to check. * @returns {Boolean} Whether the object is a `RegExp` object. * @example * * XRegExp.isRegExp('string'); // -> false * XRegExp.isRegExp(/regex/i); // -> true * XRegExp.isRegExp(RegExp('^', 'm')); // -> true * XRegExp.isRegExp(XRegExp('(?s).')); // -> true */ XRegExp.isRegExp = function(value) { return toString.call(value) === '[object RegExp]'; //return isType(value, 'RegExp'); }; /** * Returns the first matched string, or in global mode, an array containing all matched strings. * This is essentially a more convenient re-implementation of `String.prototype.match` that gives * the result types you actually want (string instead of `exec`-style array in match-first mode, * and an empty array instead of `null` when no matches are found in match-all mode). It also lets * you override flag g and ignore `lastIndex`, and fixes browser bugs. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to * return an array of all matched strings. If not explicitly specified and `regex` uses flag g, * `scope` is 'all'. * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all * mode: Array of all matched strings, or an empty array. * @example * * // Match first * XRegExp.match('abc', /\w/); // -> 'a' * XRegExp.match('abc', /\w/g, 'one'); // -> 'a' * XRegExp.match('abc', /x/g, 'one'); // -> null * * // Match all * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c'] * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c'] * XRegExp.match('abc', /x/, 'all'); // -> [] */ XRegExp.match = function(str, regex, scope) { var global = (regex.global && scope !== 'one') || scope === 'all'; var cacheKey = ((global ? 'g' : '') + (regex.sticky ? 'y' : '')) || 'noGY'; var result; var r2; regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace` r2 = regex[REGEX_DATA][cacheKey] || ( regex[REGEX_DATA][cacheKey] = copyRegex(regex, { addG: !!global, removeG: scope === 'one', isInternalOnly: true }) ); result = nativ.match.call(toObject(str), r2); if (regex.global) { regex.lastIndex = ( (scope === 'one' && result) ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case (result.index + result[0].length) : 0 ); } return global ? (result || []) : (result && result[0]); }; /** * Retrieves the matches from searching a string using a chain of regexes that successively search * within previous matches. The provided `chain` array can contain regexes and or objects with * `regex` and `backref` properties. When a backreference is specified, the named or numbered * backreference is passed forward to the next regex or returned. * * @memberOf XRegExp * @param {String} str String to search. * @param {Array} chain Regexes that each search for matches within preceding results. * @returns {Array} Matches by the last regex in the chain, or an empty array. * @example * * // Basic usage; matches numbers within tags * XRegExp.matchChain('1 2 3 4 a 56', [ * XRegExp('(?is).*?'), * /\d+/ * ]); * // -> ['2', '4', '56'] * * // Passing forward and returning specific backreferences * html = 'XRegExp\ * Google'; * XRegExp.matchChain(html, [ * {regex: //i, backref: 1}, * {regex: XRegExp('(?i)^https?://(?[^/?#]+)'), backref: 'domain'} * ]); * // -> ['xregexp.com', 'www.google.com'] */ XRegExp.matchChain = function(str, chain) { return (function recurseChain(values, level) { var item = chain[level].regex ? chain[level] : {regex: chain[level]}; var matches = []; function addMatch(match) { if (item.backref) { // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the // `undefined`s for backreferences to nonparticipating capturing groups. In such // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw // the exception, so also check if the backreference is a number that is within the // bounds of the array. if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) { throw new ReferenceError('Backreference to undefined group: ' + item.backref); } matches.push(match[item.backref] || ''); } else { matches.push(match[0]); } } for (var i = 0; i < values.length; ++i) { XRegExp.forEach(values[i], item.regex, addMatch); } return ((level === chain.length - 1) || !matches.length) ? matches : recurseChain(matches, level + 1); }([str], 0)); }; /** * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string * or regex, and the replacement can be a string or a function to be called for each match. To * perform a global search and replace, use the optional `scope` argument or include flag g if using * a regex. Replacement strings can use `${n}` for named and numbered backreferences. Replacement * functions can use named backreferences via `arguments[0].name`. Also fixes browser bugs compared * to the native `String.prototype.replace` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp|String} search Search pattern to be replaced. * @param {String|Function} replacement Replacement string or a function invoked to create it. * Replacement strings can include special replacement syntax: * - $$ - Inserts a literal $ character. * - $&, $0 - Inserts the matched substring. * - $` - Inserts the string that precedes the matched substring (left context). * - $' - Inserts the string that follows the matched substring (right context). * - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts * backreference n/nn. * - ${n} - Where n is a name or any number of digits that reference an existent capturing * group, inserts backreference n. * Replacement functions are invoked with three or more arguments: * - The matched substring (corresponds to $& above). Named backreferences are accessible as * properties of this first argument. * - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above). * - The zero-based index of the match within the total search string. * - The total string being searched. * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not * explicitly specified and using a regex with flag g, `scope` is 'all'. * @returns {String} New string with one or all matches replaced. * @example * * // Regex search, using named backreferences in replacement string * var name = XRegExp('(?\\w+) (?\\w+)'); * XRegExp.replace('John Smith', name, '${last}, ${first}'); * // -> 'Smith, John' * * // Regex search, using named backreferences in replacement function * XRegExp.replace('John Smith', name, function(match) { * return match.last + ', ' + match.first; * }); * // -> 'Smith, John' * * // String search, with replace-all * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all'); * // -> 'XRegExp builds XRegExps' */ XRegExp.replace = function(str, search, replacement, scope) { var isRegex = XRegExp.isRegExp(search); var global = (search.global && scope !== 'one') || scope === 'all'; var cacheKey = ((global ? 'g' : '') + (search.sticky ? 'y' : '')) || 'noGY'; var s2 = search; var result; if (isRegex) { search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s // `lastIndex` isn't updated *during* replacement iterations s2 = search[REGEX_DATA][cacheKey] || ( search[REGEX_DATA][cacheKey] = copyRegex(search, { addG: !!global, removeG: scope === 'one', isInternalOnly: true }) ); } else if (global) { s2 = new RegExp(XRegExp.escape(String(search)), 'g'); } // Fixed `replace` required for named backreferences, etc. result = fixed.replace.call(toObject(str), s2, replacement); if (isRegex && search.global) { // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) search.lastIndex = 0; } return result; }; /** * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an * array of replacement details. Later replacements operate on the output of earlier replacements. * Replacement details are accepted as an array with a regex or string to search for, the * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp * replacement text syntax, which supports named backreference properties via `${name}`. * * @memberOf XRegExp * @param {String} str String to search. * @param {Array} replacements Array of replacement detail arrays. * @returns {String} New string with all replacements. * @example * * str = XRegExp.replaceEach(str, [ * [XRegExp('(?a)'), 'z${name}'], * [/b/gi, 'y'], * [/c/g, 'x', 'one'], // scope 'one' overrides /g * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings * [/f/g, function($0) { * return $0.toUpperCase(); * }] * ]); */ XRegExp.replaceEach = function(str, replacements) { var i; var r; for (i = 0; i < replacements.length; ++i) { r = replacements[i]; str = XRegExp.replace(str, r[0], r[1], r[2]); } return str; }; /** * Splits a string into an array of strings using a regex or string separator. Matches of the * separator are not included in the result array. However, if `separator` is a regex that contains * capturing groups, backreferences are spliced into the result each time `separator` is matched. * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably * cross-browser. * * @memberOf XRegExp * @param {String} str String to split. * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. * @returns {Array} Array of substrings. * @example * * // Basic use * XRegExp.split('a b c', ' '); * // -> ['a', 'b', 'c'] * * // With limit * XRegExp.split('a b c', ' ', 2); * // -> ['a', 'b'] * * // Backreferences in result array * XRegExp.split('..word1..', /([a-z]+)(\d+)/i); * // -> ['..', 'word', '1', '..'] */ XRegExp.split = function(str, separator, limit) { return fixed.split.call(toObject(str), separator, limit); }; /** * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and * `sticky` arguments specify the search start position, and whether the match must start at the * specified position only. The `lastIndex` property of the provided regex is not used, but is * updated for compatibility. Also fixes browser bugs compared to the native * `RegExp.prototype.test` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {Number} [pos=0] Zero-based index at which to start the search. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position * only. The string `'sticky'` is accepted as an alternative to `true`. * @returns {Boolean} Whether the regex matched the provided value. * @example * * // Basic use * XRegExp.test('abc', /c/); // -> true * * // With pos and sticky * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true */ XRegExp.test = function(str, regex, pos, sticky) { // Do this the easy way :-) return !!XRegExp.exec(str, regex, pos, sticky); }; /** * Uninstalls optional features according to the specified options. All optional features start out * uninstalled, so this is used to undo the actions of `XRegExp.install`. * * @memberOf XRegExp * @param {Object|String} options Options object or string. * @example * * // With an options object * XRegExp.uninstall({ * // Disables support for astral code points in Unicode addons * astral: true, * * // DEPRECATED: Restores native regex methods * natives: true * }); * * // With an options string * XRegExp.uninstall('astral natives'); */ XRegExp.uninstall = function(options) { options = prepareOptions(options); if (features.astral && options.astral) { setAstral(false); } if (features.natives && options.natives) { setNatives(false); } }; /** * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as * regex objects or strings. Metacharacters are escaped in patterns provided as strings. * Backreferences in provided regex objects are automatically renumbered to work correctly within * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the * `flags` argument. * * @memberOf XRegExp * @param {Array} patterns Regexes and strings to combine. * @param {String} [flags] Any combination of XRegExp flags. * @param {Object} [options] Options object with optional properties: * - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'. * @returns {RegExp} Union of the provided regexes and strings. * @example * * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i'); * // -> /a\+b\*c|(dogs)\1|(cats)\2/i * * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'}); * // -> /manbearpig/i */ XRegExp.union = function(patterns, flags, options) { options = options || {}; var conjunction = options.conjunction || 'or'; var numCaptures = 0; var numPriorCaptures; var captureNames; function rewrite(match, paren, backref) { var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group if (paren) { ++numCaptures; // If the current capture has a name, preserve the name if (name) { return '(?<' + name + '>'; } // Backreference } else if (backref) { // Rewrite the backreference return '\\' + (+backref + numPriorCaptures); } return match; } if (!(isType(patterns, 'Array') && patterns.length)) { throw new TypeError('Must provide a nonempty array of patterns to merge'); } var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; var output = []; var pattern; for (var i = 0; i < patterns.length; ++i) { pattern = patterns[i]; if (XRegExp.isRegExp(pattern)) { numPriorCaptures = numCaptures; captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are // independently valid; helps keep this simple. Named captures are put back output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite)); } else { output.push(XRegExp.escape(pattern)); } } var separator = conjunction === 'none' ? '' : '|'; return XRegExp(output.join(separator), flags); }; // ==--------------------------== // Fixed/extended native methods // ==--------------------------== /** * Adds named capture support (with backreferences returned as `result.name`), and fixes browser * bugs in the native `RegExp.prototype.exec`. Calling `XRegExp.install('natives')` uses this to * override the native method. Use via `XRegExp.exec` without overriding natives. * * @memberOf RegExp * @param {String} str String to search. * @returns {Array} Match array with named backreference properties, or `null`. */ fixed.exec = function(str) { var origLastIndex = this.lastIndex; var match = nativ.exec.apply(this, arguments); var name; var r2; var i; if (match) { // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 // in standards mode follows the spec. if (!correctExecNpcg && match.length > 1 && indexOf(match, '') > -1) { r2 = copyRegex(this, { removeG: true, isInternalOnly: true }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed // matching due to characters outside the match nativ.replace.call(String(str).slice(match.index), r2, function() { var len = arguments.length; var i; // Skip index 0 and the last 2 for (i = 1; i < len - 2; ++i) { if (arguments[i] === undefined) { match[i] = undefined; } } }); } // Attach named capture properties if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { // Skip index 0 for (i = 1; i < match.length; ++i) { name = this[REGEX_DATA].captureNames[i - 1]; if (name) { match[name] = match[i]; } } } // Fix browsers that increment `lastIndex` after zero-length matches if (this.global && !match[0].length && (this.lastIndex > match.index)) { this.lastIndex = match.index; } } if (!this.global) { // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) this.lastIndex = origLastIndex; } return match; }; /** * Fixes browser bugs in the native `RegExp.prototype.test`. Calling `XRegExp.install('natives')` * uses this to override the native method. * * @memberOf RegExp * @param {String} str String to search. * @returns {Boolean} Whether the regex matched the provided value. */ fixed.test = function(str) { // Do this the easy way :-) return !!fixed.exec.call(this, str); }; /** * Adds named capture support (with backreferences returned as `result.name`), and fixes browser * bugs in the native `String.prototype.match`. Calling `XRegExp.install('natives')` uses this to * override the native method. * * @memberOf String * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`. * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g, * the result of calling `regex.exec(this)`. */ fixed.match = function(regex) { var result; if (!XRegExp.isRegExp(regex)) { // Use the native `RegExp` rather than `XRegExp` regex = new RegExp(regex); } else if (regex.global) { result = nativ.match.apply(this, arguments); // Fixes IE bug regex.lastIndex = 0; return result; } return fixed.exec.call(regex, toObject(this)); }; /** * Adds support for `${n}` tokens for named and numbered backreferences in replacement text, and * provides named backreferences to replacement functions as `arguments[0].name`. Also fixes browser * bugs in replacement text syntax when performing a replacement using a nonregex search value, and * the value of a replacement regex's `lastIndex` property during replacement iterations and upon * completion. Calling `XRegExp.install('natives')` uses this to override the native method. Note * that this doesn't support SpiderMonkey's proprietary third (`flags`) argument. Use via * `XRegExp.replace` without overriding natives. * * @memberOf String * @param {RegExp|String} search Search pattern to be replaced. * @param {String|Function} replacement Replacement string or a function invoked to create it. * @returns {String} New string with one or all matches replaced. */ fixed.replace = function(search, replacement) { var isRegex = XRegExp.isRegExp(search); var origLastIndex; var captureNames; var result; if (isRegex) { if (search[REGEX_DATA]) { captureNames = search[REGEX_DATA].captureNames; } // Only needed if `search` is nonglobal origLastIndex = search.lastIndex; } else { search += ''; // Type-convert } // Don't use `typeof`; some older browsers return 'function' for regex objects if (isType(replacement, 'Function')) { // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement // functions isn't type-converted to a string result = nativ.replace.call(String(this), search, function() { var args = arguments; var i; if (captureNames) { // Change the `arguments[0]` string primitive to a `String` object that can store // properties. This really does need to use `String` as a constructor args[0] = new String(args[0]); // Store named backreferences on the first argument for (i = 0; i < captureNames.length; ++i) { if (captureNames[i]) { args[0][captureNames[i]] = args[i + 1]; } } } // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1) if (isRegex && search.global) { search.lastIndex = args[args.length - 2] + args[0].length; } // ES6 specs the context for replacement functions as `undefined` return replacement.apply(undefined, args); }); } else { // Ensure that the last value of `args` will be a string when given nonstring `this`, // while still throwing on null or undefined context result = nativ.replace.call(this == null ? this : String(this), search, function() { // Keep this function's `arguments` available through closure var args = arguments; return nativ.replace.call(String(replacement), replacementToken, function($0, $1, $2) { var n; // Named or numbered backreference with curly braces if ($1) { // XRegExp behavior for `${n}`: // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the // entire match. Any number of leading zeros may be used. // 2. Backreference to named capture `n`, if it exists and is not an integer // overridden by numbered capture. In practice, this does not overlap with // numbered capture since XRegExp does not allow named capture to use a bare // integer as the name. // 3. If the name or number does not refer to an existing capturing group, it's // an error. n = +$1; // Type-convert; drop leading zeros if (n <= args.length - 3) { return args[n] || ''; } // Groups with the same name is an error, else would need `lastIndexOf` n = captureNames ? indexOf(captureNames, $1) : -1; if (n < 0) { throw new SyntaxError('Backreference to undefined group ' + $0); } return args[n + 1] || ''; } // Else, special variable or numbered backreference without curly braces if ($2 === '$') { // $$ return '$'; } if ($2 === '&' || +$2 === 0) { // $&, $0 (not followed by 1-9), $00 return args[0]; } if ($2 === '`') { // $` (left context) return args[args.length - 1].slice(0, args[args.length - 2]); } if ($2 === "'") { // $' (right context) return args[args.length - 1].slice(args[args.length - 2] + args[0].length); } // Else, numbered backreference without curly braces $2 = +$2; // Type-convert; drop leading zero // XRegExp behavior for `$n` and `$nn`: // - Backrefs end after 1 or 2 digits. Use `${..}` for more digits. // - `$1` is an error if no capturing groups. // - `$10` is an error if less than 10 capturing groups. Use `${1}0` instead. // - `$01` is `$1` if at least one capturing group, else it's an error. // - `$0` (not followed by 1-9) and `$00` are the entire match. // Native behavior, for comparison: // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. // - `$1` is a literal `$1` if no capturing groups. // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. // - `$0` is a literal `$0`. if (!isNaN($2)) { if ($2 > args.length - 3) { throw new SyntaxError('Backreference to undefined group ' + $0); } return args[$2] || ''; } // `$` followed by an unsupported char is an error, unlike native JS throw new SyntaxError('Invalid token ' + $0); }); }); } if (isRegex) { if (search.global) { // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) search.lastIndex = 0; } else { // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) search.lastIndex = origLastIndex; } } return result; }; /** * Fixes browser bugs in the native `String.prototype.split`. Calling `XRegExp.install('natives')` * uses this to override the native method. Use via `XRegExp.split` without overriding natives. * * @memberOf String * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. * @returns {Array} Array of substrings. */ fixed.split = function(separator, limit) { if (!XRegExp.isRegExp(separator)) { // Browsers handle nonregex split correctly, so use the faster native method return nativ.split.apply(this, arguments); } var str = String(this); var output = []; var origLastIndex = separator.lastIndex; var lastLastIndex = 0; var lastLength; // Values for `limit`, per the spec: // If undefined: pow(2,32) - 1 // If 0, Infinity, or NaN: 0 // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); // If negative number: pow(2,32) - floor(abs(limit)) // If other: Type-convert, then use the above rules // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ limit = (limit === undefined ? -1 : limit) >>> 0; XRegExp.forEach(str, separator, function(match) { // This condition is not the same as `if (match[0].length)` if ((match.index + match[0].length) > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); if (match.length > 1 && match.index < str.length) { Array.prototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = match.index + lastLength; } }); if (lastLastIndex === str.length) { if (!nativ.test.call(separator, '') || lastLength) { output.push(''); } } else { output.push(str.slice(lastLastIndex)); } separator.lastIndex = origLastIndex; return output.length > limit ? output.slice(0, limit) : output; }; // ==--------------------------== // Built-in syntax/flag tokens // ==--------------------------== /* * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser * consistency and to reserve their syntax, but lets them be superseded by addons. */ XRegExp.addToken( /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function(match, scope) { // \B is allowed in default scope only if (match[1] === 'B' && scope === defaultScope) { return match[0]; } throw new SyntaxError('Invalid escape ' + match[0]); }, { scope: 'all', leadChar: '\\' } ); /* * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or * if you use the same in a character class. */ XRegExp.addToken( /\\u{([\dA-Fa-f]+)}/, function(match, scope, flags) { var code = dec(match[1]); if (code > 0x10FFFF) { throw new SyntaxError('Invalid Unicode code point ' + match[0]); } if (code <= 0xFFFF) { // Converting to \uNNNN avoids needing to escape the literal character and keep it // separate from preceding tokens return '\\u' + pad4(hex(code)); } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling if (hasNativeU && flags.indexOf('u') > -1) { return match[0]; } throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); }, { scope: 'all', leadChar: '\\' } ); /* * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency. * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because * character class endings can't be determined. */ XRegExp.addToken( /\[(\^?)\]/, function(match) { // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. // (?!) should work like \b\B, but is unreliable in some versions of Firefox return match[1] ? '[\\s\\S]' : '\\b\\B'; }, {leadChar: '['} ); /* * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in * free-spacing mode (flag x). */ XRegExp.addToken( /\(\?#[^)]*\)/, getContextualTokenSeparator, {leadChar: '('} ); /* * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only. */ XRegExp.addToken( /\s+|#[^\n]*\n?/, getContextualTokenSeparator, {flag: 'x'} ); /* * Dot, in dotall mode (aka singleline mode, flag s) only. */ XRegExp.addToken( /\./, function() { return '[\\s\\S]'; }, { flag: 's', leadChar: '.' } ); /* * Named backreference: `\k`. Backreference names can use the characters A-Z, a-z, 0-9, _, * and $ only. Also allows numbered backreferences as `\k`. */ XRegExp.addToken( /\\k<([\w$]+)>/, function(match) { // Groups with the same name is an error, else would need `lastIndexOf` var index = isNaN(match[1]) ? (indexOf(this.captureNames, match[1]) + 1) : +match[1]; var endIndex = match.index + match[0].length; if (!index || index > this.captureNames.length) { throw new SyntaxError('Backreference to undefined group ' + match[0]); } // Keep backreferences separate from subsequent literal numbers. This avoids e.g. // inadvertedly changing `(?)\k1` to `()\11`. return '\\' + index + ( endIndex === match.input.length || isNaN(match.input.charAt(endIndex)) ? '' : '(?:)' ); }, {leadChar: '\\'} ); /* * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0` * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax. */ XRegExp.addToken( /\\(\d+)/, function(match, scope) { if ( !( scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length ) && match[1] !== '0' ) { throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]); } return match[0]; }, { scope: 'all', leadChar: '\\' } ); /* * Named capturing group; match the opening delimiter only: `(?`. Capture names can use the * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style * `(?P` as an alternate syntax to avoid issues in some older versions of Opera which natively * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to * Python-style named capture as octals. */ XRegExp.addToken( /\(\?P?<([\w$]+)>/, function(match) { // Disallow bare integers as names because named backreferences are added to match arrays // and therefore numeric properties may lead to incorrect lookups if (!isNaN(match[1])) { throw new SyntaxError('Cannot use integer as capture name ' + match[0]); } if (match[1] === 'length' || match[1] === '__proto__') { throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]); } if (indexOf(this.captureNames, match[1]) > -1) { throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]); } this.captureNames.push(match[1]); this.hasNamedCapture = true; return '('; }, {leadChar: '('} ); /* * Capturing group; match the opening parenthesis only. Required for support of named capturing * groups. Also adds explicit capture mode (flag n). */ XRegExp.addToken( /\((?!\?)/, function(match, scope, flags) { if (flags.indexOf('n') > -1) { return '(?:'; } this.captureNames.push(null); return '('; }, { optionalFlags: 'n', leadChar: '(' } ); module.exports = XRegExp; },{}]},{},[8])(8) });]]>
    templates common/ips.loader.js common/ui common/utils common controllers underscore jquery mustache Debug.js app.js jquery.js jquery-migrate.js jquery.transform.js linkify.min.js linkify-jquery.min.js